From 4a87ed709b43de81c5b2eee553cfb1dc5edaa84c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 31 Jul 2022 23:26:48 -0400 Subject: [PATCH 001/212] Adds ItemTableManager class. --- soh/ItemTableManager.cpp | 53 ++++++++++++++++++++++++++++++++++++++++ soh/ItemTableManager.h | 40 ++++++++++++++++++++++++++++++ soh/soh.vcxproj | 3 ++- soh/soh.vcxproj.filters | 14 ++++++++++- 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 soh/ItemTableManager.cpp create mode 100644 soh/ItemTableManager.h diff --git a/soh/ItemTableManager.cpp b/soh/ItemTableManager.cpp new file mode 100644 index 000000000..7768f291e --- /dev/null +++ b/soh/ItemTableManager.cpp @@ -0,0 +1,53 @@ +#include "ItemTableManager.h" + +ItemTableManager::ItemTableManager() { +} + +ItemTableManager::~ItemTableManager() { + this->itemTables.clear(); +} + +bool ItemTableManager::AddItemTable(std::string tableID) { + ItemTable newItemTable; + return itemTables.emplace(tableID, newItemTable).second; +} + +bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, + int8_t drawID, + uint8_t textID, uint8_t field, bool chestAnim) { + ItemTable* itemTable = RetrieveItemTable(tableID); + if (itemTable == NULL) { + return false; + } + GetItemEntry getItemEntry = GET_ITEM(itemID, objectID, drawID, textID, field, chestAnim); + return itemTable->emplace(getItemID, getItemEntry).second; +} + +GetItemEntry ItemTableManager::RetrieveItemEntry(std::string tableID, uint8_t itemID) { + ItemTable* itemTable = RetrieveItemTable(tableID); + if (itemTable != NULL) { + auto foundItemEntry = itemTable->find(itemID); + if (foundItemEntry != itemTable->end()) { + return foundItemEntry->second; + } + } + return GET_ITEM_NONE; +} + +bool ItemTableManager::ClearItemTable(std::string tableID) { + ItemTable* itemTable = RetrieveItemTable(tableID); + if (itemTable != NULL) { + itemTable->clear(); + return true; + } + return false; +} + +ItemTable* ItemTableManager::RetrieveItemTable(std::string tableID) { + auto foundItemTable = itemTables.find(tableID); + if (foundItemTable == itemTables.end()) { + return nullptr; + } + ItemTable& itemTable = foundItemTable->second; + return &itemTable; +} diff --git a/soh/ItemTableManager.h b/soh/ItemTableManager.h new file mode 100644 index 000000000..dccbf7d2c --- /dev/null +++ b/soh/ItemTableManager.h @@ -0,0 +1,40 @@ +#pragma once +#include +#include "z64item.h" +#include "z64object.h" + +#define CHEST_ANIM_SHORT 0 +#define CHEST_ANIM_LONG 1 + +typedef struct { + /* 0x00 */ uint8_t itemId; + /* 0x01 */ uint8_t field; // various bit-packed data + /* 0x02 */ int8_t gi; // defines the draw id and chest opening animation + /* 0x03 */ uint8_t textId; + /* 0x04 */ uint16_t objectId; +} GetItemEntry; // size = 0x06 + +#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } + +#define GET_ITEM_NONE \ + { ITEM_NONE, 0, 0, 0, OBJECT_INVALID } + +typedef std::unordered_map ItemTable; + +class ItemTableManager { + public: + static ItemTableManager* Instance; + ItemTableManager(); + ~ItemTableManager(); + bool AddItemTable(std::string tableID); + bool AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, int8_t drawID, + uint8_t textID, uint8_t field, bool chestAnim); + GetItemEntry RetrieveItemEntry(std::string tableID, uint8_t itemID); + bool ClearItemTable(std::string tableID); + + private: + std::unordered_map itemTables; + + ItemTable* RetrieveItemTable(std::string tableID); +}; diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj index bc7c4d646..a1fa3cced 100644 --- a/soh/soh.vcxproj +++ b/soh/soh.vcxproj @@ -179,6 +179,7 @@ + @@ -941,9 +942,9 @@ - + diff --git a/soh/soh.vcxproj.filters b/soh/soh.vcxproj.filters index f0c05dee8..040148503 100644 --- a/soh/soh.vcxproj.filters +++ b/soh/soh.vcxproj.filters @@ -82,6 +82,12 @@ {04fc1c52-49ff-48e2-ae23-2c00867374f8} + + {01811baa-7b90-4452-8ef0-d4cdc5dbdebd} + + + {1f217bdc-2227-4079-a077-bcab7f7d1481} + @@ -2373,6 +2379,9 @@ Source Files\src + + Source Files\soh\Enhancements\item-tables + @@ -4058,6 +4067,9 @@ Source Files\src + + Header Files\soh\Enhancements\item-tables + @@ -4070,4 +4082,4 @@ - + \ No newline at end of file From bfdf814a1f63a90379b1e4a8f638479ff8503c0d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 1 Aug 2022 21:03:58 -0400 Subject: [PATCH 002/212] Implements new getItem table in game. --- soh/soh.vcxproj | 4 +- soh/soh.vcxproj.filters | 6 +- .../item-tables}/ItemTableManager.cpp | 12 +- .../item-tables}/ItemTableManager.h | 17 ++- soh/soh/OTRGlobals.cpp | 144 ++++++++++++++++++ soh/soh/OTRGlobals.h | 3 + .../actors/ovl_player_actor/z_player.c | 70 ++++----- 7 files changed, 208 insertions(+), 48 deletions(-) rename soh/{ => soh/Enhancements/item-tables}/ItemTableManager.cpp (79%) rename soh/{ => soh/Enhancements/item-tables}/ItemTableManager.h (83%) diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj index a1fa3cced..6c80d3cee 100644 --- a/soh/soh.vcxproj +++ b/soh/soh.vcxproj @@ -179,7 +179,7 @@ - + @@ -944,11 +944,11 @@ - + diff --git a/soh/soh.vcxproj.filters b/soh/soh.vcxproj.filters index 040148503..d72073adc 100644 --- a/soh/soh.vcxproj.filters +++ b/soh/soh.vcxproj.filters @@ -2379,7 +2379,7 @@ Source Files\src - + Source Files\soh\Enhancements\item-tables @@ -4067,8 +4067,8 @@ Source Files\src - - Header Files\soh\Enhancements\item-tables + + Header Files diff --git a/soh/ItemTableManager.cpp b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp similarity index 79% rename from soh/ItemTableManager.cpp rename to soh/soh/Enhancements/item-tables/ItemTableManager.cpp index 7768f291e..e583c92ed 100644 --- a/soh/ItemTableManager.cpp +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp @@ -12,9 +12,7 @@ bool ItemTableManager::AddItemTable(std::string tableID) { return itemTables.emplace(tableID, newItemTable).second; } -bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, - int8_t drawID, - uint8_t textID, uint8_t field, bool chestAnim) { +bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, int8_t drawID, uint8_t textID, uint8_t field, bool chestAnim) { ItemTable* itemTable = RetrieveItemTable(tableID); if (itemTable == NULL) { return false; @@ -23,6 +21,14 @@ bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, uint return itemTable->emplace(getItemID, getItemEntry).second; } +bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, GetItemEntry getItemEntry) { + ItemTable* itemTable = RetrieveItemTable(tableID); + if (itemTable == NULL) { + return false; + } + return itemTable->emplace(getItemID, getItemEntry).second; +} + GetItemEntry ItemTableManager::RetrieveItemEntry(std::string tableID, uint8_t itemID) { ItemTable* itemTable = RetrieveItemTable(tableID); if (itemTable != NULL) { diff --git a/soh/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h similarity index 83% rename from soh/ItemTableManager.h rename to soh/soh/Enhancements/item-tables/ItemTableManager.h index dccbf7d2c..d8affce87 100644 --- a/soh/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -1,7 +1,6 @@ #pragma once -#include -#include "z64item.h" -#include "z64object.h" + +#include #define CHEST_ANIM_SHORT 0 #define CHEST_ANIM_LONG 1 @@ -20,6 +19,12 @@ typedef struct { #define GET_ITEM_NONE \ { ITEM_NONE, 0, 0, 0, OBJECT_INVALID } +#ifdef __cplusplus + +#include +#include "z64item.h" +#include "z64object.h" + typedef std::unordered_map ItemTable; class ItemTableManager { @@ -28,8 +33,8 @@ class ItemTableManager { ItemTableManager(); ~ItemTableManager(); bool AddItemTable(std::string tableID); - bool AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, int8_t drawID, - uint8_t textID, uint8_t field, bool chestAnim); + bool AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, int8_t drawID, uint8_t textID, uint8_t field, bool chestAnim); + bool AddItemEntry(std::string tableID, uint8_t getItemID, GetItemEntry getItemEntry); GetItemEntry RetrieveItemEntry(std::string tableID, uint8_t itemID); bool ClearItemTable(std::string tableID); @@ -38,3 +43,5 @@ class ItemTableManager { ItemTable* RetrieveItemTable(std::string tableID); }; + +#endif \ No newline at end of file diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index f611909b1..67b3371f6 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -56,9 +56,11 @@ #endif #include +#include OTRGlobals* OTRGlobals::Instance; SaveManager* SaveManager::Instance; +ItemTableManager* ItemTableManager::Instance; OTRGlobals::OTRGlobals() { context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian"); @@ -94,6 +96,142 @@ extern "C" void OTRAudio_Init() ResourceMgr_CacheDirectory("audio"); } +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +extern "C" void VanillaItemTable_Init() { + GetItemEntry getItemTable[] = { + GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG), + GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT), + GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG), + GET_ITEM_NONE, + GET_ITEM_NONE, + }; + ItemTableManager::Instance->AddItemTable("Vanilla"); + for (uint8_t i = 0; i < ARRAY_SIZE(getItemTable); i++) { + ItemTableManager::Instance->AddItemEntry("Vanilla", i, getItemTable[i]); + } +} + extern "C" void OTRExtScanner() { auto lst = *OTRGlobals::Instance->context->GetResourceManager()->ListFiles("*.*").get(); @@ -113,6 +251,7 @@ extern "C" void InitOTR() { #endif OTRGlobals::Instance = new OTRGlobals(); SaveManager::Instance = new SaveManager(); + ItemTableManager::Instance = new ItemTableManager(); auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version"); if (!t->bHasLoadError) @@ -130,6 +269,7 @@ extern "C" void InitOTR() { Rando_Init(); InitItemTracker(); OTRExtScanner(); + VanillaItemTable_Init(); } #ifdef _WIN32 @@ -1514,3 +1654,7 @@ extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 a extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); } + +extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { + return ItemTableManager::Instance->RetrieveItemEntry("Vanilla", getItemID); +} diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index d03c913e1..8141ff493 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -5,6 +5,7 @@ #include "GlobalCtx2.h" #include "SaveManager.h" +#include #ifdef __cplusplus #include "Enhancements/savestates.h" @@ -28,6 +29,7 @@ private: #endif #ifndef __cplusplus +void VanillaItemTable_Init(); void OTRAudio_Init(); void InitAudio(); void Graph_StartFrame(); @@ -100,6 +102,7 @@ s16 Randomizer_GetItemModelFromId(s16 itemId); s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); +GetItemEntry ItemTable_Retrieve(int16_t getItemID); #endif #endif diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 411647644..973b1915f 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -21,13 +21,13 @@ #include "objects/object_link_child/object_link_child.h" #include "textures/icon_item_24_static/icon_item_24_static.h" -typedef struct { - /* 0x00 */ u8 itemId; - /* 0x01 */ u8 field; // various bit-packed data - /* 0x02 */ s8 gi; // defines the draw id and chest opening animation - /* 0x03 */ u8 textId; - /* 0x04 */ u16 objectId; -} GetItemEntry; // size = 0x06 +//typedef struct { +// /* 0x00 */ u8 itemId; +// /* 0x01 */ u8 field; // various bit-packed data +// /* 0x02 */ s8 gi; // defines the draw id and chest opening animation +// /* 0x03 */ u8 textId; +// /* 0x04 */ u16 objectId; +//} GetItemEntry; // size = 0x06 #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } @@ -1591,9 +1591,9 @@ s32 func_808332E4(Player* this) { } void func_808332F4(Player* this, GlobalContext* globalCtx) { - GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1]; + GetItemEntry giEntry = ItemTable_Retrieve(this->getItemId - 1); - this->unk_862 = ABS(giEntry->gi); + this->unk_862 = ABS(giEntry.gi); } static LinkAnimationHeader* func_80833338(Player* this) { @@ -4994,7 +4994,7 @@ static LinkAnimationHeader* D_80854548[] = { s32 func_8083B040(Player* this, GlobalContext* globalCtx) { s32 sp2C; s32 sp28; - GetItemEntry* giEntry; + GetItemEntry giEntry; Actor* targetActor; if ((this->unk_6AD != 0) && @@ -5031,8 +5031,8 @@ s32 func_8083B040(Player* this, GlobalContext* globalCtx) { func_80835DE4(globalCtx, this, func_8084F104, 0); if (sp2C >= 0) { - giEntry = &sGetItemTable[D_80854528[sp2C] - 1]; - func_8083AE40(this, giEntry->objectId); + giEntry = ItemTable_Retrieve(D_80854528[sp2C] - 1); + func_8083AE40(this, giEntry.objectId); } this->stateFlags1 |= PLAYER_STATE1_6 | PLAYER_STATE1_28 | PLAYER_STATE1_29; @@ -6243,7 +6243,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } if (this->getItemId < GI_MAX) { - GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1]; + GetItemEntry giEntry = ItemTable_Retrieve(this->getItemId - 1); if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; @@ -6258,24 +6258,24 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { return; } - s32 drop = giEntry->objectId; + s32 drop = giEntry.objectId; if (gSaveContext.n64ddFlag || (globalCtx->sceneNum == SCENE_BOWLING) || !(CVar_GetS32("gFastDrops", 0) && ((drop == OBJECT_GI_BOMB_1) || (drop == OBJECT_GI_NUTS) || (drop == OBJECT_GI_STICK) || (drop == OBJECT_GI_SEED) || (drop == OBJECT_GI_MAGICPOT) || (drop == OBJECT_GI_ARROW))) && - (Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) { + (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE)) { if (gSaveContext.n64ddFlag && ((interactedActor->id == ACTOR_EN_ITEM00 && (interactedActor->params != 6 && interactedActor->params != 17)) || (interactedActor->id == ACTOR_EN_KAREBABA || interactedActor->id == ACTOR_EN_DEKUBABA))) { - func_8083E4C4(globalCtx, this, giEntry); + func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; return 0; } func_808323B4(globalCtx, this); - func_8083AE40(this, giEntry->objectId); + func_8083AE40(this, giEntry.objectId); if (!(this->stateFlags2 & PLAYER_STATE2_10) || (this->currentBoots == PLAYER_BOOTS_IRON)) { func_80836898(globalCtx, this, func_8083A434); @@ -6288,29 +6288,29 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { return 1; } - func_8083E4C4(globalCtx, this, giEntry); + func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; } } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { if (this->getItemId != GI_NONE) { - GetItemEntry* giEntry = &sGetItemTable[-this->getItemId - 1]; + GetItemEntry giEntry = ItemTable_Retrieve(-this->getItemId - 1); EnBox* chest = (EnBox*)interactedActor; if (CVar_GetS32("gFastChests", 0) != 0) { - giEntry->gi = -1 * abs(giEntry->gi); + giEntry.gi = -1 * abs(giEntry.gi); } - if (giEntry->itemId != ITEM_NONE) { - if (((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) && (giEntry->field & 0x40)) || - ((Item_CheckObtainability(giEntry->itemId) != ITEM_NONE) && (giEntry->field & 0x20))) { + if (giEntry.itemId != ITEM_NONE) { + if (((Item_CheckObtainability(giEntry.itemId) == ITEM_NONE) && (giEntry.field & 0x40)) || + ((Item_CheckObtainability(giEntry.itemId) != ITEM_NONE) && (giEntry.field & 0x20))) { this->getItemId = -GI_RUPEE_BLUE; - giEntry = &sGetItemTable[GI_RUPEE_BLUE - 1]; + giEntry = ItemTable_Retrieve(GI_RUPEE_BLUE - 1); } } func_80836898(globalCtx, this, func_8083A434); this->stateFlags1 |= PLAYER_STATE1_10 | PLAYER_STATE1_11 | PLAYER_STATE1_29; - func_8083AE40(this, giEntry->objectId); + func_8083AE40(this, giEntry.objectId); this->actor.world.pos.x = chest->dyna.actor.world.pos.x - (Math_SinS(chest->dyna.actor.shape.rot.y) * 29.4343f); this->actor.world.pos.z = @@ -6318,8 +6318,8 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->currentYaw = this->actor.shape.rot.y = chest->dyna.actor.shape.rot.y; func_80832224(this); - if ((giEntry->itemId != ITEM_NONE) && (giEntry->gi >= 0) && - (Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) { + if ((giEntry.itemId != ITEM_NONE) && (giEntry.gi >= 0) && + (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE)) { func_808322D0(globalCtx, this, this->ageProperties->unk_98); func_80832F54(globalCtx, this, 0x28F); chest->unk_1F4 = 1; @@ -12667,7 +12667,7 @@ void func_8084DFAC(GlobalContext* globalCtx, Player* this) { } s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { - GetItemEntry* giEntry; + GetItemEntry giEntry; s32 temp1; s32 temp2; @@ -12676,7 +12676,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } if (this->unk_84F == 0) { - giEntry = &sGetItemTable[this->getItemId - 1]; + giEntry = ItemTable_Retrieve(this->getItemId - 1); this->unk_84F = 1; // make sure we get the BGS instead of giant's knife @@ -12685,8 +12685,8 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { gSaveContext.swordHealth = 8; } - Message_StartTextbox(globalCtx, giEntry->textId, &this->actor); - Item_Give(globalCtx, giEntry->itemId); + Message_StartTextbox(globalCtx, giEntry.textId, &this->actor); + Item_Give(globalCtx, giEntry.itemId); if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || @@ -13273,14 +13273,14 @@ void func_8084F104(Player* this, GlobalContext* globalCtx) { func_80853148(globalCtx, targetActor); } else { - GetItemEntry* giEntry = &sGetItemTable[D_80854528[this->exchangeItemId - 1] - 1]; + GetItemEntry giEntry = ItemTable_Retrieve(D_80854528[this->exchangeItemId - 1] - 1); if (this->itemActionParam >= PLAYER_AP_LETTER_ZELDA) { - if (giEntry->gi >= 0) { - this->unk_862 = giEntry->gi; + if (giEntry.gi >= 0) { + this->unk_862 = giEntry.gi; } else { - this->unk_862 = -giEntry->gi; + this->unk_862 = -giEntry.gi; } } From 41ea5c6685a4cc8b3bc92b11f285cff58dbe0ee9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 3 Aug 2022 08:15:17 -0400 Subject: [PATCH 003/212] Adds rando item table and way to differentiate tables in GetItemEntry. --- .../item-tables/ItemTableManager.h | 1 + .../Enhancements/randomizer/randomizer.cpp | 50 +++++++++++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 4 ++ .../Enhancements/randomizer/randomizerTypes.h | 2 + soh/soh/OTRGlobals.cpp | 3 +- 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index d8affce87..347c0c4a2 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -11,6 +11,7 @@ typedef struct { /* 0x02 */ int8_t gi; // defines the draw id and chest opening animation /* 0x03 */ uint8_t textId; /* 0x04 */ uint16_t objectId; + /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? } GetItemEntry; // size = 0x06 #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 09704e867..1f0349056 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -14,6 +14,7 @@ #include "3drando/rando_main.hpp" #include #include "Lib/ImGui/imgui_internal.h" +#include using json = nlohmann::json; @@ -4746,6 +4747,55 @@ void DrawRandoEditor(bool& open) { }*/ +void InitRandoItemTable() { + GetItemEntry getItemTable[] = { + GET_ITEM(RG_LIGHT_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_FOREST_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_FIRE_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_WATER_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_SHADOW_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_SPIRIT_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), + + GET_ITEM(RG_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG), + + GET_ITEM(RG_ZELDAS_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_SUNS_SONG, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_EPONAS_SONG, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_SONG_OF_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_SONG_OF_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_SARIAS_SONG, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG), + + GET_ITEM(RG_MINUET_OF_FOREST, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOLERO_OF_FIRE, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_SERENADE_OF_WATER, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_NOCTURNE_OF_SHADOW, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_REQUIEM_OF_SPIRIT, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_PRELUDE_OF_LIGHT, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG), + + GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), + + GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), + }; + ItemTableManager::Instance->AddItemTable("Randomizer"); + for (int i = 0; i < ARRAY_SIZE(getItemTable); i++) { + getItemTable[i].modIndex = MOD_RANDOMIZER; + ItemTableManager::Instance->AddItemEntry("Randomizer", getItemTable[i].itemId, getItemTable[i]); + } +} + + void InitRando() { SohImGui::AddWindow("Randomizer", "Randomizer Settings", DrawRandoEditor); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index f4101e8fd..e13303b19 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -6,6 +6,10 @@ #include "../../../include/z64item.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +typedef enum { MOD_VANILLA, MOD_RANDOMIZER } ModIndex; + class Randomizer { private: std::unordered_map itemLocations; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 551966828..d5bec1bb3 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -806,6 +806,8 @@ typedef enum { RG_PROGRESSIVE_STICK_UPGRADE, RG_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_MAGIC_METER, + RG_MAGIC_SINGLE, // Added for refactor of GetItemEntries + RG_MAGIC_DOUBLE, // Added for refactor of GetItemEntries RG_PROGRESSIVE_OCARINA, RG_PROGRESSIVE_GORONSWORD, RG_EMPTY_BOTTLE, diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 67b3371f6..1a93caa39 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -96,8 +96,6 @@ extern "C" void OTRAudio_Init() ResourceMgr_CacheDirectory("audio"); } -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - extern "C" void VanillaItemTable_Init() { GetItemEntry getItemTable[] = { GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), @@ -228,6 +226,7 @@ extern "C" void VanillaItemTable_Init() { }; ItemTableManager::Instance->AddItemTable("Vanilla"); for (uint8_t i = 0; i < ARRAY_SIZE(getItemTable); i++) { + getItemTable[i].modIndex = MOD_VANILLA; ItemTableManager::Instance->AddItemEntry("Vanilla", i, getItemTable[i]); } } From 95d439bb304e93f3fb989edc4209696a95a6c9a3 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 3 Aug 2022 23:15:52 -0400 Subject: [PATCH 004/212] Adds rough ability to differentiate between rando and vanilla items.merge stashed changes from before develop-zhora merge --- soh/include/functions.h | 2 + soh/include/z64player.h | 2 +- soh/soh.vcxproj | 1 + soh/soh.vcxproj.filters | 5 +- .../item-tables/ItemTableManager.h | 20 +- .../Enhancements/item-tables/ItemTableTypes.h | 13 ++ .../Enhancements/randomizer/randomizer.cpp | 194 +++++++++++++++--- soh/soh/Enhancements/randomizer/randomizer.h | 5 +- soh/soh/OTRGlobals.cpp | 23 ++- soh/soh/OTRGlobals.h | 3 +- soh/src/code/z_parameter.c | 142 +++++++------ soh/src/code/z_sram.c | 20 +- soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 19 +- .../actors/ovl_player_actor/z_player.c | 10 +- 14 files changed, 316 insertions(+), 143 deletions(-) create mode 100644 soh/soh/Enhancements/item-tables/ItemTableTypes.h diff --git a/soh/include/functions.h b/soh/include/functions.h index b185519f4..02b64ede5 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -10,6 +10,7 @@ extern "C" #endif #include "../../libultraship/libultraship/luslog.h" +#include #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) @@ -1045,6 +1046,7 @@ void Interface_LoadItemIcon1(GlobalContext* globalCtx, u16 button); void Interface_LoadItemIcon2(GlobalContext* globalCtx, u16 button); void func_80084BF4(GlobalContext* globalCtx, u16 flag); u8 Item_Give(GlobalContext* globalCtx, u8 item); +u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry); u8 Item_CheckObtainability(u8 item); void Inventory_DeleteItem(u16 item, u16 invSlot); s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u16 oldItem, u16 newItem); diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 3c2c7c3cd..ff6291fd8 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -626,6 +626,6 @@ typedef struct Player { /* 0x0A87 */ u8 unk_A87; /* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position /* 0x0A94 */ PendingFlag pendingFlag; -} Player; // size = 0xAA0 +} Player; // size = 0xA94 #endif diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj index 6c80d3cee..00c70dfa4 100644 --- a/soh/soh.vcxproj +++ b/soh/soh.vcxproj @@ -949,6 +949,7 @@ + diff --git a/soh/soh.vcxproj.filters b/soh/soh.vcxproj.filters index 210cb1022..b175f5ca7 100644 --- a/soh/soh.vcxproj.filters +++ b/soh/soh.vcxproj.filters @@ -4086,7 +4086,10 @@ Header Files\soh\Enhancements\randomizer - Header Files + Header Files\soh\Enhancements\item-tables + + + Header Files\soh\Enhancements\item-tables diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index 347c0c4a2..fd827c3fa 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -1,30 +1,16 @@ #pragma once - -#include +#include "ItemTableTypes.h" #define CHEST_ANIM_SHORT 0 #define CHEST_ANIM_LONG 1 -typedef struct { - /* 0x00 */ uint8_t itemId; - /* 0x01 */ uint8_t field; // various bit-packed data - /* 0x02 */ int8_t gi; // defines the draw id and chest opening animation - /* 0x03 */ uint8_t textId; - /* 0x04 */ uint16_t objectId; - /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? -} GetItemEntry; // size = 0x06 - #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } #define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, OBJECT_INVALID } - -#ifdef __cplusplus + { 0, 0, 0, 0, 0 } #include -#include "z64item.h" -#include "z64object.h" typedef std::unordered_map ItemTable; @@ -44,5 +30,3 @@ class ItemTableManager { ItemTable* RetrieveItemTable(std::string tableID); }; - -#endif \ No newline at end of file diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h new file mode 100644 index 000000000..ed71bfabe --- /dev/null +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -0,0 +1,13 @@ +#pragma once +#ifdef __cplusplus +#include +#endif + +typedef struct { + /* 0x00 */ uint8_t itemId; + /* 0x01 */ uint8_t field; // various bit-packed data + /* 0x02 */ int8_t gi; // defines the draw id and chest opening animation + /* 0x03 */ uint8_t textId; + /* 0x04 */ uint16_t objectId; + /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? +} GetItemEntry; // size = 0x06 diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 18e79badb..46023f507 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2030,8 +2030,8 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_MAGIC_BEAN_PACK: return GI_BEAN; //todo make it 10 of them - case RG_DOUBLE_DEFENSE: - return GI_DOUBLE_DEFENSE; + /*case RG_DOUBLE_DEFENSE: + return GI_DOUBLE_DEFENSE;*/ case RG_WEIRD_EGG: return GI_WEIRD_EGG; @@ -2160,9 +2160,9 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_PROGRESSIVE_MAGIC_METER: switch (gSaveContext.magicLevel) { case 0: - return GI_SINGLE_MAGIC; + return (GetItemID)RG_MAGIC_SINGLE; case 1: - return GI_DOUBLE_MAGIC; + return (GetItemID)RG_MAGIC_DOUBLE; } return GI_RUPEE_BLUE; @@ -2182,7 +2182,7 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) return GI_BOTTLE; case RG_BOTTLE_WITH_MILK: return GI_MILK_BOTTLE; - case RG_BOTTLE_WITH_RED_POTION: + /*case RG_BOTTLE_WITH_RED_POTION: return GI_BOTTLE_WITH_RED_POTION; case RG_BOTTLE_WITH_GREEN_POTION: return GI_BOTTLE_WITH_GREEN_POTION; @@ -2227,7 +2227,7 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_NOCTURNE_OF_SHADOW: return GI_NOCTURNE_OF_SHADOW; case RG_PRELUDE_OF_LIGHT: - return GI_PRELUDE_OF_LIGHT; + return GI_PRELUDE_OF_LIGHT;*/ // todo implement dungeon-specific maps/compasses case RG_DEKU_TREE_MAP: @@ -2290,7 +2290,7 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_GANONS_CASTLE_KEY_RING: return GI_RUPEE_BLUE; - case RG_KOKIRI_EMERALD: + /*case RG_KOKIRI_EMERALD: return GI_STONE_KOKIRI; case RG_GORON_RUBY: return GI_STONE_GORON; @@ -2308,7 +2308,7 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_SHADOW_MEDALLION: return GI_MEDALLION_SHADOW; case RG_LIGHT_MEDALLION: - return GI_MEDALLION_LIGHT; + return GI_MEDALLION_LIGHT;*/ case RG_RECOVERY_HEART: return GI_HEART; @@ -2387,11 +2387,60 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_HINT: return GI_RUPEE_BLUE; //todo - default: + default: { + if (IsGetItemRandoExclusive(randoGet)) { + return (GetItemID)randoGet; + } return ogItemId; + } } } +bool Randomizer::IsGetItemRandoExclusive(RandomizerGet randoGet) { + switch (randoGet) { + case RG_LIGHT_MEDALLION: + case RG_FOREST_MEDALLION: + case RG_FIRE_MEDALLION: + case RG_WATER_MEDALLION: + case RG_SHADOW_MEDALLION: + case RG_SPIRIT_MEDALLION: + case RG_KOKIRI_EMERALD: + case RG_GORON_RUBY: + case RG_ZORA_SAPPHIRE: + case RG_ZELDAS_LULLABY: + case RG_SUNS_SONG: + case RG_EPONAS_SONG: + case RG_SONG_OF_STORMS: + case RG_SONG_OF_TIME: + case RG_SARIAS_SONG: + case RG_MINUET_OF_FOREST: + case RG_BOLERO_OF_FIRE: + case RG_SERENADE_OF_WATER: + case RG_NOCTURNE_OF_SHADOW: + case RG_REQUIEM_OF_SPIRIT: + case RG_PRELUDE_OF_LIGHT: + case RG_PROGRESSIVE_MAGIC_METER: + case RG_DOUBLE_DEFENSE: + case RG_BOTTLE_WITH_RED_POTION: + case RG_BOTTLE_WITH_GREEN_POTION: + case RG_BOTTLE_WITH_BLUE_POTION: + case RG_BOTTLE_WITH_FAIRY: + case RG_BOTTLE_WITH_FISH: + case RG_BOTTLE_WITH_BLUE_FIRE: + case RG_BOTTLE_WITH_BUGS: + case RG_BOTTLE_WITH_POE: + case RG_BOTTLE_WITH_BIG_POE: + return true; + default: + return false; + } +} + +bool Randomizer::CheckContainsRandoItem(RandomizerCheck randoCheck) { + RandomizerGet randoGet = this->itemLocations[randoCheck]; + return IsGetItemRandoExclusive(randoGet); +} + std::string Randomizer::GetAdultAltarText() const { return this->adultAltarText; } @@ -4732,31 +4781,34 @@ void DrawRandoEditor(bool& open) { void InitRandoItemTable() { GetItemEntry getItemTable[] = { - GET_ITEM(RG_LIGHT_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_FOREST_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_FIRE_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_WATER_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_SHADOW_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_SPIRIT_MEDALLION, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), + // The first several entries have ItemIDs from vanilla, but not GetItemIDs or entries in sGetItemTable + GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_ZELDAS_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_SUNS_SONG, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_EPONAS_SONG, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_SONG_OF_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_SONG_OF_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_SARIAS_SONG, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_MINUET_OF_FOREST, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOLERO_OF_FIRE, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_SERENADE_OF_WATER, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_NOCTURNE_OF_SHADOW, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_REQUIEM_OF_SPIRIT, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_PRELUDE_OF_LIGHT, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG), + // Starting here, these do not have ItemIDs or GetItemIDs from vanilla, so I'm using their + // RandomizerGet enum values for both. GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), @@ -4773,14 +4825,92 @@ void InitRandoItemTable() { }; ItemTableManager::Instance->AddItemTable("Randomizer"); for (int i = 0; i < ARRAY_SIZE(getItemTable); i++) { - getItemTable[i].modIndex = MOD_RANDOMIZER; - ItemTableManager::Instance->AddItemEntry("Randomizer", getItemTable[i].itemId, getItemTable[i]); + if (i < 21) { + // We want to use vanilla Give_Item code for indices 0-20 since + // vanilla already handles that. + getItemTable[i].modIndex = MOD_VANILLA; + } else { + // Mark these as randomizer items so we use the rando exclusive + // Give_Item_Randomizer for these. + getItemTable[i].modIndex = MOD_RANDOMIZER; + } + uint8_t getItemID; + switch (getItemTable[i].itemId) { + case ITEM_MEDALLION_LIGHT: + getItemID = RG_LIGHT_MEDALLION; + break; + case ITEM_MEDALLION_FOREST: + getItemID = RG_FOREST_MEDALLION; + break; + case ITEM_MEDALLION_FIRE: + getItemID = RG_FIRE_MEDALLION; + break; + case ITEM_MEDALLION_WATER: + getItemID = RG_WATER_MEDALLION; + break; + case ITEM_MEDALLION_SHADOW: + getItemID = RG_SHADOW_MEDALLION; + break; + case ITEM_MEDALLION_SPIRIT: + getItemID = RG_SPIRIT_MEDALLION; + break; + case ITEM_KOKIRI_EMERALD: + getItemID = RG_KOKIRI_EMERALD; + break; + case ITEM_GORON_RUBY: + getItemID = RG_GORON_RUBY; + break; + case ITEM_ZORA_SAPPHIRE: + getItemID = RG_ZORA_SAPPHIRE; + break; + case ITEM_SONG_LULLABY: + getItemID = RG_ZELDAS_LULLABY; + break; + case ITEM_SONG_SUN: + getItemID = RG_SUNS_SONG; + break; + case ITEM_SONG_EPONA: + getItemID = RG_EPONAS_SONG; + break; + case ITEM_SONG_STORMS: + getItemID = RG_SONG_OF_STORMS; + break; + case ITEM_SONG_TIME: + getItemID = RG_SONG_OF_TIME; + break; + case ITEM_SONG_SARIA: + getItemID = RG_SARIAS_SONG; + break; + case ITEM_SONG_MINUET: + getItemID = RG_MINUET_OF_FOREST; + break; + case ITEM_SONG_BOLERO: + getItemID = RG_BOLERO_OF_FIRE; + break; + case ITEM_SONG_SERENADE: + getItemID = RG_SERENADE_OF_WATER; + break; + case ITEM_SONG_NOCTURNE: + getItemID = RG_NOCTURNE_OF_SHADOW; + break; + case ITEM_SONG_REQUIEM: + getItemID = RG_REQUIEM_OF_SPIRIT; + break; + case ITEM_SONG_PRELUDE: + getItemID = RG_PRELUDE_OF_LIGHT; + break; + default: + getItemID = getItemTable[i].itemId; + break; + } + ItemTableManager::Instance->AddItemEntry("Randomizer", getItemID, getItemTable[i]); } } void InitRando() { SohImGui::AddWindow("Randomizer", "Randomizer Settings", DrawRandoEditor); + InitRandoItemTable(); } extern "C" { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index e13303b19..5c0686a51 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -24,6 +24,8 @@ class Randomizer { void ParseRandomizerSettingsFile(const char* spoilerFileName); void ParseHintLocationsFile(const char* spoilerFileName); void ParseItemLocationsFile(const char* spoilerFileName, bool silent); + bool IsGetItemRandoExclusive(RandomizerGet randoGet); + public: Randomizer(); @@ -37,7 +39,7 @@ class Randomizer { void LoadHintLocations(const char* spoilerFileName); void LoadItemLocations(const char* spoilerFileName, bool silent); u8 GetRandoSettingValue(RandomizerSettingKey randoSettingKey); - RandomizerCheck GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); + RandomizerCheck GetCheckFromActor(s16 sceneNum, s16 actorId, s16 actorParams); std::string GetChildAltarText() const; std::string GetAdultAltarText() const; std::string GetGanonText() const; @@ -45,6 +47,7 @@ class Randomizer { std::string GetHintFromCheck(RandomizerCheck check); GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); + bool CheckContainsRandoItem(RandomizerCheck randoCheck); }; #ifdef __cplusplus diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index caebb1a02..c12febe55 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1648,10 +1648,20 @@ extern "C" int Randomizer_CopyHintFromCheck(RandomizerCheck check, char* buffer, } extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { + if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { + OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; + } else { + OTRGlobals::Instance->getItemModIndex = MOD_VANILLA; + } return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); } extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { + if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) { + OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; + } else { + OTRGlobals::Instance->getItemModIndex = MOD_VANILLA; + } return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); } @@ -1660,5 +1670,14 @@ extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetIte } extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - return ItemTableManager::Instance->RetrieveItemEntry("Vanilla", getItemID); -} + std::string itemTableID; + + if (OTRGlobals::Instance->getItemModIndex == MOD_VANILLA) { + itemTableID = "Vanilla"; + } else { + itemTableID = "Randomizer"; + getItemID++; // counteracts the - 1 offset used for vanilla table + } + + return ItemTableManager::Instance->RetrieveItemEntry(itemTableID, getItemID); +} \ No newline at end of file diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index ae05c5fe4..76c504877 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -5,7 +5,7 @@ #include "GlobalCtx2.h" #include "SaveManager.h" -#include +#include #ifdef __cplusplus #include "Enhancements/savestates.h" @@ -19,6 +19,7 @@ public: std::shared_ptr context; std::shared_ptr gSaveStateMgr; std::shared_ptr gRandomizer; + uint16_t getItemModIndex; OTRGlobals(); ~OTRGlobals(); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 44d529587..0936f10fd 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1578,70 +1578,6 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) { osSyncPrintf("item_get_setting=%d pt=%d z=%x\n", item, slot, gSaveContext.inventory.items[slot]); osSyncPrintf(VT_RST); - if (item == ITEM_SINGLE_MAGIC) { - gSaveContext.magicAcquired = true; - gSaveContext.unk_13F6 = 0x30; - Magic_Fill(globalCtx); - return ITEM_NONE; - } else if (item == ITEM_DOUBLE_MAGIC) { - if (!gSaveContext.magicAcquired) { - gSaveContext.magicAcquired = true; - } - gSaveContext.doubleMagic = true; - gSaveContext.unk_13F6 = 0x60; - gSaveContext.magicLevel = 0; - Magic_Fill(globalCtx); - return ITEM_NONE; - } - - if (item == ITEM_DOUBLE_DEFENSE) { - gSaveContext.doubleDefense = true; - gSaveContext.inventory.defenseHearts = 20; - gSaveContext.healthAccumulator = 0x140; - return ITEM_NONE; - } - - if (item >= ITEM_BOTTLE_WITH_RED_POTION && - item <= ITEM_BOTTLE_WITH_BIG_POE) { - temp = SLOT(ITEM_BOTTLE); - for (i = 0; i < 4; i++) { - if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) { - switch (item) { - case ITEM_BOTTLE_WITH_RED_POTION: - item = ITEM_POTION_RED; - break; - case ITEM_BOTTLE_WITH_GREEN_POTION: - item = ITEM_POTION_GREEN; - break; - case ITEM_BOTTLE_WITH_BLUE_POTION: - item = ITEM_POTION_BLUE; - break; - case ITEM_BOTTLE_WITH_FAIRY: - item = ITEM_FAIRY; - break; - case ITEM_BOTTLE_WITH_FISH: - item = ITEM_FISH; - break; - case ITEM_BOTTLE_WITH_BLUE_FIRE: - item = ITEM_BLUE_FIRE; - break; - case ITEM_BOTTLE_WITH_BUGS: - item = ITEM_BUG; - break; - case ITEM_BOTTLE_WITH_POE: - item = ITEM_POE; - break; - case ITEM_BOTTLE_WITH_BIG_POE: - item = ITEM_BIG_POE; - break; - } - - gSaveContext.inventory.items[temp + i] = item; - return ITEM_NONE; - } - } - } - if ((item >= ITEM_MEDALLION_FOREST) && (item <= ITEM_MEDALLION_LIGHT)) { gSaveContext.inventory.questItems |= gBitFlags[item - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST]; @@ -2179,6 +2115,84 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) { return temp; } +u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) { + uint16_t item = giEntry.itemId; + uint16_t temp; + uint16_t i; + uint16_t slot; + + slot = SLOT(item); + if (item == RG_MAGIC_SINGLE) { + gSaveContext.magicAcquired = true; + gSaveContext.unk_13F6 = 0x30; + Magic_Fill(globalCtx); + return RG_NONE; + } else if (item == RG_MAGIC_DOUBLE) { + if (!gSaveContext.magicAcquired) { + gSaveContext.magicAcquired = true; + } + gSaveContext.doubleMagic = true; + gSaveContext.unk_13F6 = 0x60; + gSaveContext.magicLevel = 0; + Magic_Fill(globalCtx); + return RG_NONE; + } + + if (item == RG_DOUBLE_DEFENSE) { + gSaveContext.doubleDefense = true; + gSaveContext.inventory.defenseHearts = 20; + gSaveContext.healthAccumulator = 0x140; + return RG_NONE; + } + + if (item >= RG_BOTTLE_WITH_RED_POTION && item <= RG_BOTTLE_WITH_BIG_POE) { + temp = SLOT(ITEM_BOTTLE); + for (i = 0; i < 4; i++) { + if (gSaveContext.inventory.items[temp + i] == RG_NONE) { + switch (item) { + case RG_BOTTLE_WITH_RED_POTION: + item = ITEM_POTION_RED; + break; + case RG_BOTTLE_WITH_GREEN_POTION: + item = ITEM_POTION_GREEN; + break; + case RG_BOTTLE_WITH_BLUE_POTION: + item = ITEM_POTION_BLUE; + break; + case RG_BOTTLE_WITH_FAIRY: + item = ITEM_FAIRY; + break; + case RG_BOTTLE_WITH_FISH: + item = ITEM_FISH; + break; + case RG_BOTTLE_WITH_BLUE_FIRE: + item = ITEM_BLUE_FIRE; + break; + case RG_BOTTLE_WITH_BUGS: + item = ITEM_BUG; + break; + case RG_BOTTLE_WITH_POE: + item = ITEM_POE; + break; + case RG_BOTTLE_WITH_BIG_POE: + item = ITEM_BIG_POE; + break; + } + + gSaveContext.inventory.items[temp + i] = item; + return RG_NONE; + } + } + } + + temp = gSaveContext.inventory.items[slot]; + osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp); + INV_CONTENT(item) = item; + + return temp; +} + + u8 Item_CheckObtainability(u8 item) { s16 i; s16 slot = SLOT(item); diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 080c5ea9d..8eb681cb9 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -367,43 +367,43 @@ void GiveLinkSong(GetItemID getItemId) { gSaveContext.inventory.questItems |= bitMask; } -void GiveLinkDungeonReward(GetItemID getItemId) { +void GiveLinkDungeonReward(uint16_t getItemId) { s16 item; u8 medallion = 0; switch (getItemId) { - case GI_MEDALLION_FOREST: + case RG_FOREST_MEDALLION: item = ITEM_MEDALLION_FOREST; medallion = 1; break; - case GI_MEDALLION_FIRE: + case RG_FIRE_MEDALLION: item = ITEM_MEDALLION_FIRE; medallion = 1; break; - case GI_MEDALLION_WATER: + case RG_WATER_MEDALLION: item = ITEM_MEDALLION_WATER; medallion = 1; break; - case GI_MEDALLION_SHADOW: + case RG_SHADOW_MEDALLION: item = ITEM_MEDALLION_SHADOW; medallion = 1; break; - case GI_MEDALLION_SPIRIT: + case RG_SPIRIT_MEDALLION: item = ITEM_MEDALLION_SPIRIT; medallion = 1; break; - case GI_MEDALLION_LIGHT: + case RG_LIGHT_MEDALLION: item = ITEM_MEDALLION_LIGHT; medallion = 1; break; - case GI_STONE_KOKIRI: + case RG_KOKIRI_EMERALD: item = ITEM_KOKIRI_EMERALD; break; - case GI_STONE_GORON: + case RG_GORON_RUBY: item = ITEM_GORON_RUBY; break; - case GI_STONE_ZORA: + case RG_ZORA_SAPPHIRE: item = ITEM_ZORA_SAPPHIRE; break; } diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index 533ba593a..b6c110581 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -70,6 +70,7 @@ static InitChainEntry sInitChain[] = { }; static UNK_TYPE sUnused; +int32_t sItem; void EnBox_SetupAction(EnBox* this, EnBoxActionFunc actionFunc) { this->actionFunc = actionFunc; @@ -445,40 +446,40 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) { func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos); if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f && Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) { - int32_t item = Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); + sItem = Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); // RANDOTODO treasure chest game rando if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) { if((this->dyna.actor.params & 0xF) < 2) { if(Flags_GetCollectible(globalCtx, 0x1B)) { - item = GI_RUPEE_BLUE; + sItem = GI_RUPEE_BLUE; } } if((this->dyna.actor.params & 0xF) >= 2 && (this->dyna.actor.params & 0xF) < 4) { if(Flags_GetCollectible(globalCtx, 0x1C)) { - item = GI_RUPEE_BLUE; + sItem = GI_RUPEE_BLUE; } } if((this->dyna.actor.params & 0xF) >= 4 && (this->dyna.actor.params & 0xF) < 6) { if(Flags_GetCollectible(globalCtx, 0x1D)) { - item = GI_RUPEE_BLUE; + sItem = GI_RUPEE_BLUE; } } if((this->dyna.actor.params & 0xF) >= 6 && (this->dyna.actor.params & 0xF) < 8) { if(Flags_GetCollectible(globalCtx, 0x1E)) { - item = GI_RUPEE_BLUE; + sItem = GI_RUPEE_BLUE; } } if((this->dyna.actor.params & 0xF) >= 8 && (this->dyna.actor.params & 0xF) < 10) { if(Flags_GetCollectible(globalCtx, 0x1F)) { - item = GI_RUPEE_BLUE; + sItem = GI_RUPEE_BLUE; } } } } - func_8002F554(&this->dyna.actor, globalCtx, 0 - item); + func_8002F554(&this->dyna.actor, globalCtx, 0 - sItem); } if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) { EnBox_SetupAction(this, EnBox_Open); @@ -590,9 +591,7 @@ void EnBox_Update(Actor* thisx, GlobalContext* globalCtx) { } if (((!gSaveContext.n64ddFlag && ((this->dyna.actor.params >> 5 & 0x7F) == 0x7C)) || - (gSaveContext.n64ddFlag && Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, - this->dyna.actor.id, this->dyna.actor.params, - globalCtx->sceneNum) == GI_ICE_TRAP)) && + (gSaveContext.n64ddFlag && sItem == GI_ICE_TRAP)) && this->actionFunc == EnBox_Open && this->skelanime.curFrame > 45 && this->iceSmokeTimer < 100) EnBox_SpawnIceSmoke(this, globalCtx); } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 58bc611c2..9aeaab84a 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12715,9 +12715,13 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { gSaveContext.swordHealth = 8; } - Message_StartTextbox(globalCtx, giEntry->textId, &this->actor); - Item_Give(globalCtx, giEntry->itemId); - + Message_StartTextbox(globalCtx, giEntry.textId, &this->actor); + if (giEntry.modIndex == 0) { + Item_Give(globalCtx, giEntry.itemId); + } + else { + Randomizer_Item_Give(globalCtx, giEntry); + } Player_SetPendingFlag(this, globalCtx); if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || From 63ace6a4cc043cf9fc5ae716e2748393b4cf3421 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 4 Aug 2022 22:50:55 -0400 Subject: [PATCH 005/212] Change ItemTableID to be uint16_t so we can use ModIndex for it. --- .../item-tables/ItemTableManager.cpp | 12 ++++++------ .../Enhancements/item-tables/ItemTableManager.h | 16 ++++++++-------- .../Enhancements/item-tables/ItemTableTypes.h | 8 ++++---- soh/soh/Enhancements/randomizer/randomizer.cpp | 4 ++-- soh/soh/OTRGlobals.cpp | 15 +++++---------- 5 files changed, 25 insertions(+), 30 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp index e583c92ed..9992a470a 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp @@ -7,12 +7,12 @@ ItemTableManager::~ItemTableManager() { this->itemTables.clear(); } -bool ItemTableManager::AddItemTable(std::string tableID) { +bool ItemTableManager::AddItemTable(uint16_t tableID) { ItemTable newItemTable; return itemTables.emplace(tableID, newItemTable).second; } -bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, int8_t drawID, uint8_t textID, uint8_t field, bool chestAnim) { +bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, uint16_t itemID, uint16_t objectID, int16_t drawID, uint16_t textID, uint16_t field, bool chestAnim) { ItemTable* itemTable = RetrieveItemTable(tableID); if (itemTable == NULL) { return false; @@ -21,7 +21,7 @@ bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, uint return itemTable->emplace(getItemID, getItemEntry).second; } -bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, GetItemEntry getItemEntry) { +bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry) { ItemTable* itemTable = RetrieveItemTable(tableID); if (itemTable == NULL) { return false; @@ -29,7 +29,7 @@ bool ItemTableManager::AddItemEntry(std::string tableID, uint8_t getItemID, GetI return itemTable->emplace(getItemID, getItemEntry).second; } -GetItemEntry ItemTableManager::RetrieveItemEntry(std::string tableID, uint8_t itemID) { +GetItemEntry ItemTableManager::RetrieveItemEntry(uint16_t tableID, uint16_t itemID) { ItemTable* itemTable = RetrieveItemTable(tableID); if (itemTable != NULL) { auto foundItemEntry = itemTable->find(itemID); @@ -40,7 +40,7 @@ GetItemEntry ItemTableManager::RetrieveItemEntry(std::string tableID, uint8_t it return GET_ITEM_NONE; } -bool ItemTableManager::ClearItemTable(std::string tableID) { +bool ItemTableManager::ClearItemTable(uint16_t tableID) { ItemTable* itemTable = RetrieveItemTable(tableID); if (itemTable != NULL) { itemTable->clear(); @@ -49,7 +49,7 @@ bool ItemTableManager::ClearItemTable(std::string tableID) { return false; } -ItemTable* ItemTableManager::RetrieveItemTable(std::string tableID) { +ItemTable* ItemTableManager::RetrieveItemTable(uint16_t tableID) { auto foundItemTable = itemTables.find(tableID); if (foundItemTable == itemTables.end()) { return nullptr; diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index fd827c3fa..abc41418b 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -12,21 +12,21 @@ #include -typedef std::unordered_map ItemTable; +typedef std::unordered_map ItemTable; class ItemTableManager { public: static ItemTableManager* Instance; ItemTableManager(); ~ItemTableManager(); - bool AddItemTable(std::string tableID); - bool AddItemEntry(std::string tableID, uint8_t getItemID, uint8_t itemID, uint16_t objectID, int8_t drawID, uint8_t textID, uint8_t field, bool chestAnim); - bool AddItemEntry(std::string tableID, uint8_t getItemID, GetItemEntry getItemEntry); - GetItemEntry RetrieveItemEntry(std::string tableID, uint8_t itemID); - bool ClearItemTable(std::string tableID); + bool AddItemTable(uint16_t tableID); + bool AddItemEntry(uint16_t tableID, uint16_t getItemID, uint16_t itemID, uint16_t objectID, int16_t drawID, uint16_t textID, uint16_t field, bool chestAnim); + bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry); + GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t itemID); + bool ClearItemTable(uint16_t tableID); private: - std::unordered_map itemTables; + std::unordered_map itemTables; - ItemTable* RetrieveItemTable(std::string tableID); + ItemTable* RetrieveItemTable(uint16_t tableID); }; diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index ed71bfabe..9711a76a8 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -4,10 +4,10 @@ #endif typedef struct { - /* 0x00 */ uint8_t itemId; - /* 0x01 */ uint8_t field; // various bit-packed data - /* 0x02 */ int8_t gi; // defines the draw id and chest opening animation - /* 0x03 */ uint8_t textId; + /* 0x00 */ uint16_t itemId; + /* 0x01 */ uint16_t field; // various bit-packed data + /* 0x02 */ int16_t gi; // defines the draw id and chest opening animation + /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? } GetItemEntry; // size = 0x06 diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 46023f507..9cea0c0a7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4823,7 +4823,7 @@ void InitRandoItemTable() { GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), }; - ItemTableManager::Instance->AddItemTable("Randomizer"); + ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); for (int i = 0; i < ARRAY_SIZE(getItemTable); i++) { if (i < 21) { // We want to use vanilla Give_Item code for indices 0-20 since @@ -4903,7 +4903,7 @@ void InitRandoItemTable() { getItemID = getItemTable[i].itemId; break; } - ItemTableManager::Instance->AddItemEntry("Randomizer", getItemID, getItemTable[i]); + ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, getItemID, getItemTable[i]); } } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index c12febe55..30a82ee30 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -220,10 +220,10 @@ extern "C" void VanillaItemTable_Init() { GET_ITEM_NONE, GET_ITEM_NONE, }; - ItemTableManager::Instance->AddItemTable("Vanilla"); + ItemTableManager::Instance->AddItemTable(MOD_VANILLA); for (uint8_t i = 0; i < ARRAY_SIZE(getItemTable); i++) { getItemTable[i].modIndex = MOD_VANILLA; - ItemTableManager::Instance->AddItemEntry("Vanilla", i, getItemTable[i]); + ItemTableManager::Instance->AddItemEntry(MOD_VANILLA, i, getItemTable[i]); } } @@ -1669,15 +1669,10 @@ extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetIte return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; } -extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - std::string itemTableID; - - if (OTRGlobals::Instance->getItemModIndex == MOD_VANILLA) { - itemTableID = "Vanilla"; - } else { - itemTableID = "Randomizer"; +extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { + if (OTRGlobals::Instance->getItemModIndex != MOD_VANILLA) { getItemID++; // counteracts the - 1 offset used for vanilla table } - return ItemTableManager::Instance->RetrieveItemEntry(itemTableID, getItemID); + return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); } \ No newline at end of file From 43461cec69ca4908091427d1acab318806701183 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 6 Aug 2022 12:15:27 -0400 Subject: [PATCH 006/212] Should fix switch build --- soh/soh/Enhancements/item-tables/ItemTableManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp index 9992a470a..33f66137b 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp @@ -1,4 +1,5 @@ #include "ItemTableManager.h" +#include "stddef.h" ItemTableManager::ItemTableManager() { } From 9062eaaca5959d3c22e4b80699d6f5e3eae579cd Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 6 Aug 2022 12:21:11 -0400 Subject: [PATCH 007/212] Should fix switch build pt 2 --- soh/soh/Enhancements/item-tables/ItemTableManager.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp index 33f66137b..8e64c97ca 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp @@ -1,5 +1,4 @@ #include "ItemTableManager.h" -#include "stddef.h" ItemTableManager::ItemTableManager() { } @@ -15,7 +14,7 @@ bool ItemTableManager::AddItemTable(uint16_t tableID) { bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, uint16_t itemID, uint16_t objectID, int16_t drawID, uint16_t textID, uint16_t field, bool chestAnim) { ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable == NULL) { + if (itemTable == nullptr) { return false; } GetItemEntry getItemEntry = GET_ITEM(itemID, objectID, drawID, textID, field, chestAnim); @@ -24,7 +23,7 @@ bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, uint16 bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry) { ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable == NULL) { + if (itemTable == nullptr) { return false; } return itemTable->emplace(getItemID, getItemEntry).second; @@ -32,7 +31,7 @@ bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetIte GetItemEntry ItemTableManager::RetrieveItemEntry(uint16_t tableID, uint16_t itemID) { ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable != NULL) { + if (itemTable != nullptr) { auto foundItemEntry = itemTable->find(itemID); if (foundItemEntry != itemTable->end()) { return foundItemEntry->second; @@ -43,7 +42,7 @@ GetItemEntry ItemTableManager::RetrieveItemEntry(uint16_t tableID, uint16_t item bool ItemTableManager::ClearItemTable(uint16_t tableID) { ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable != NULL) { + if (itemTable != nullptr) { itemTable->clear(); return true; } From 194c4f4e52c1e1376774a310a6862ee8ddde4c05 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 6 Aug 2022 15:54:19 -0400 Subject: [PATCH 008/212] Adds new files to CMakeLists. --- soh/CMakeLists.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index faf28ed5c..c842a4f92 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -213,8 +213,16 @@ set(Header_Files__soh__Enhancements__randomizer__3drando "soh/Enhancements/randomizer/3drando/trial.hpp" "soh/Enhancements/randomizer/3drando/utils.hpp" ) + source_group("Header Files\\soh\\Enhancements\\randomizer\\3drando" FILES ${Header_Files__soh__Enhancements__randomizer__3drando}) +set(Header_Files__soh__Enhancements__item_tables + "soh/Enhancements/item-tables/ItemTableManager.h" + "soh/Enhancements/item-tables/ItemTableTypes.h" +) + +source_group("Header Files\\soh\\Enhancements\\item-tables" FILES ${Header_Files__soh__Enhancements__item_tables}) + set(Source_Files__soh "soh/GbiWrap.cpp" "soh/OTRAudio.h" @@ -326,6 +334,13 @@ set(Source_Files__soh__Enhancements__randomizer__3drando__location_access ) source_group("Source Files\\soh\\Enhancements\\randomizer\\3drando\\location_access" FILES ${Source_Files__soh__Enhancements__randomizer__3drando__location_access}) +set(Source_Files__soh__Enhancements__item_tables + "soh/Enhancements/item-tables/ItemTableManager.cpp" +) + +source_group("Source Files\\soh\\Enhancements\\item-tables" FILES $ +{Source_Files_Files__soh__Enhancements__item_tables}) + set(Source_Files__src__boot "src/boot/assert.c" "src/boot/boot_main.c" @@ -1534,6 +1549,7 @@ set(ALL_FILES ${Header_Files__soh__Enhancements__debugger} ${Header_Files__soh__Enhancements__randomizer} ${Header_Files__soh__Enhancements__randomizer__3drando} + ${Header_Files__soh__Enhancements__item_tables} ${Source_Files__soh} ${Source_Files__soh__Enhancements} ${Source_Files__soh__Enhancements__cosmetics} @@ -1542,6 +1558,7 @@ set(ALL_FILES ${Source_Files__soh__Enhancements__randomizer__3drando} ${Source_Files__soh__Enhancements__randomizer__3drando__hint_list} ${Source_Files__soh__Enhancements__randomizer__3drando__location_access} + ${Source_Files__soh__Enhancements__item_tables} ${Source_Files__src__boot} ${Source_Files__src__buffers} ${Source_Files__src__code} From cfce0eba3dc19d84ddcb899558fafec0c28edc8d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 6 Aug 2022 22:51:15 -0400 Subject: [PATCH 009/212] Implements fixes for competing getItem calls. --- soh/include/z64player.h | 4 +- .../Enhancements/item-tables/ItemTableTypes.h | 2 +- soh/soh/OTRGlobals.cpp | 46 +++++++++++++++---- soh/soh/OTRGlobals.h | 2 + soh/src/code/z_parameter.c | 4 +- soh/src/code/z_play.c | 2 + soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 1 + .../actors/ovl_player_actor/z_player.c | 26 ++++++++--- 8 files changed, 69 insertions(+), 18 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index ff6291fd8..731760ca3 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -2,6 +2,7 @@ #define Z64PLAYER_H #include "z64actor.h" +#include "soh/Enhancements/item-tables/ItemTableTypes.h" struct Player; @@ -626,6 +627,7 @@ typedef struct Player { /* 0x0A87 */ u8 unk_A87; /* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position /* 0x0A94 */ PendingFlag pendingFlag; -} Player; // size = 0xA94 + /* 0x0AA0 */ GetItemEntry getItemEntry; +} Player; // size = 0xAA8 #endif diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 9711a76a8..185410612 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -10,4 +10,4 @@ typedef struct { /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? -} GetItemEntry; // size = 0x06 +} GetItemEntry; // size = 0x08 diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index ca485097e..ebe06ff73 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1647,6 +1647,21 @@ extern "C" int Randomizer_CopyHintFromCheck(RandomizerCheck check, char* buffer, return CopyStringToCharBuffer(hintText, buffer, maxBufferSize); } +extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { + if (OTRGlobals::Instance->getItemModIndex != MOD_VANILLA) { + getItemID++; // counteracts the - 1 offset used for vanilla table + } + + return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); +} + +extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { + if (tableID == MOD_VANILLA) { + getItemID--; // counteracts the - 1 offset used for vanilla table + } + return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID); +} + extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; @@ -1656,6 +1671,18 @@ extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 a return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); } +extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { + s16 getItemModIndex; + if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem( + OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { + getItemModIndex = MOD_RANDOMIZER; + } else { + getItemModIndex = MOD_VANILLA; + } + s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); + return ItemTable_RetrieveEntry(getItemModIndex, itemID); +} + extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) { OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; @@ -1665,6 +1692,17 @@ extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerChec return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); } +extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { + s16 getItemModIndex; + if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) { + getItemModIndex = MOD_RANDOMIZER; + } else { + getItemModIndex = MOD_VANILLA; + } + s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); + return ItemTable_RetrieveEntry(getItemModIndex, itemID); +} + extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { return gSaveContext.n64ddFlag && (actor->parent != NULL) && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; @@ -1673,11 +1711,3 @@ extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomize extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; } - -extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - if (OTRGlobals::Instance->getItemModIndex != MOD_VANILLA) { - getItemID++; // counteracts the - 1 offset used for vanilla table - } - - return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); -} \ No newline at end of file diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 0925f043f..63d31b90c 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -104,6 +104,8 @@ s16 Randomizer_GetItemModelFromId(s16 itemId); s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); +GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); +GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor); bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemEntry ItemTable_Retrieve(int16_t getItemID); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 52f062b00..f625b1e26 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2206,7 +2206,7 @@ u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) { if (item >= RG_BOTTLE_WITH_RED_POTION && item <= RG_BOTTLE_WITH_BIG_POE) { temp = SLOT(ITEM_BOTTLE); for (i = 0; i < 4; i++) { - if (gSaveContext.inventory.items[temp + i] == RG_NONE) { + if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) { switch (item) { case RG_BOTTLE_WITH_RED_POTION: item = ITEM_POTION_RED; @@ -2238,7 +2238,7 @@ u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) { } gSaveContext.inventory.items[temp + i] = item; - return RG_NONE; + return ITEM_NONE; } } } diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 5c3b97da6..19813c286 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -242,8 +242,10 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) && !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && globalCtx->sceneLoadFlag == 0) { + GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT); GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT); GiveItemWithoutActor(globalCtx, getItemId); + player->getItemEntry = getItem; player->pendingFlag.flagID = 0x1E; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index d9f96e177..0e7ae60d2 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -296,6 +296,7 @@ void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, Rando GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, ogSongId); if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { if (func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f)) { + player->getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 9aeaab84a..b4d905f4c 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -1592,7 +1592,12 @@ s32 func_808332E4(Player* this) { } void func_808332F4(Player* this, GlobalContext* globalCtx) { - GetItemEntry giEntry = ItemTable_Retrieve(this->getItemId - 1); + GetItemEntry giEntry; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(this->getItemId - 1); + } else { + giEntry = this->getItemEntry; + } this->unk_862 = ABS(giEntry.gi); } @@ -6324,7 +6329,12 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { if (this->getItemId != GI_NONE) { - GetItemEntry giEntry = ItemTable_Retrieve(-this->getItemId - 1); + GetItemEntry giEntry; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(-this->getItemId - 1); + } else { + giEntry = this->getItemEntry; + } EnBox* chest = (EnBox*)interactedActor; if (CVar_GetS32("gFastChests", 0) != 0) { giEntry.gi = -1 * abs(giEntry.gi); @@ -12701,12 +12711,16 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { s32 temp1; s32 temp2; - if (this->getItemId == GI_NONE) { + if (this->getItemId == GI_NONE && this->getItemEntry.objectId == OBJECT_INVALID) { return 1; } if (this->unk_84F == 0) { - giEntry = ItemTable_Retrieve(this->getItemId - 1); + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(this->getItemId - 1); + } else { + giEntry = this->getItemEntry; + } this->unk_84F = 1; // make sure we get the BGS instead of giant's knife @@ -12723,6 +12737,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { Randomizer_Item_Give(globalCtx, giEntry); } Player_SetPendingFlag(this, globalCtx); + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || @@ -12741,8 +12756,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } Audio_PlayFanfare(temp1); } - } - else { + } else { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x0123; From 3258fc5fb342ab1e9c245a9b140a36f6bc50bc96 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 6 Aug 2022 23:29:28 -0400 Subject: [PATCH 010/212] Correctly renders freestanding items Particle effects are probably broken, need to fix them still, I pretty much know how I would do that. --- soh/src/code/z_en_item00.c | 8 ++++++-- soh/src/overlays/actors/ovl_player_actor/z_player.c | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index b31209d83..6676b0f36 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1318,11 +1318,13 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { f32 mtxScale = 16.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); s32 randoGetItemId = Randomizer_GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + GetItemEntry randoGetItemEntry = + Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItem_Draw(globalCtx, randoGetItemEntry.gi); } else { s32 texIndex = this->actor.params - 3; @@ -1379,11 +1381,13 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { f32 mtxScale = 16.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); s32 randoGetItemId = Randomizer_GetRandomizedItemId(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); + GetItemEntry randoGetItemEntry = + Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItem_Draw(globalCtx, ABS(randoGetItemEntry.gi - 1)); } else { s32 pad; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index b4d905f4c..02c2bf11d 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -5041,7 +5041,11 @@ s32 func_8083B040(Player* this, GlobalContext* globalCtx) { func_80835DE4(globalCtx, this, func_8084F104, 0); if (sp2C >= 0) { - giEntry = ItemTable_Retrieve(D_80854528[sp2C] - 1); + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(D_80854528[sp2C] - 1); + } else { + giEntry = this->getItemEntry; + } func_8083AE40(this, giEntry.objectId); } From 75aaefaf049d478a7a5be3f36ec610ae7ec523b4 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 7 Aug 2022 11:35:37 -0400 Subject: [PATCH 011/212] Fixed Particle effects in the new getItem system. --- soh/src/code/z_en_item00.c | 86 ++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 6676b0f36..43c1c64b3 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1208,38 +1208,56 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { } } -void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, s16 getItemId) { +void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetItemEntry giEntry) { s16 color_slot; - switch (getItemId) { - case GI_MINUET_OF_FOREST: - case GI_SINGLE_MAGIC: - case GI_DOUBLE_MAGIC: - color_slot = 0; + switch (giEntry.modIndex) { + case 0: + switch (giEntry.itemId) { + case ITEM_SONG_MINUET: + color_slot = 0; + break; + case ITEM_SONG_BOLERO: + color_slot = 1; + break; + case ITEM_SONG_SERENADE: + color_slot = 2; + break; + case ITEM_SONG_REQUIEM: + color_slot = 3; + break; + case ITEM_SONG_NOCTURNE: + color_slot = 4; + break; + case ITEM_SONG_PRELUDE: + color_slot = 5; + break; + case ITEM_STICK_UPGRADE_20: + case ITEM_STICK_UPGRADE_30: + color_slot = 6; + break; + case ITEM_NUT_UPGRADE_30: + case ITEM_NUT_UPGRADE_40: + color_slot = 7; + break; + default: + return; + } break; - case GI_BOLERO_OF_FIRE: - case GI_DOUBLE_DEFENSE: - color_slot = 1; - break; - case GI_SERENADE_OF_WATER: - color_slot = 2; - break; - case GI_REQUIEM_OF_SPIRIT: - color_slot = 3; - break; - case GI_NOCTURNE_OF_SHADOW: - color_slot = 4; - break; - case GI_PRELUDE_OF_LIGHT: - color_slot = 5; - break; - case GI_STICK_UPGRADE_20: - case GI_STICK_UPGRADE_30: - color_slot = 6; - break; - case GI_NUT_UPGRADE_30: - case GI_NUT_UPGRADE_40: - color_slot = 7; + case 1: + switch (giEntry.itemId) { + case RG_MAGIC_SINGLE: + case RG_MAGIC_DOUBLE: + color_slot = 0; + break; + case RG_DOUBLE_DEFENSE: + color_slot = 1; + break; + default: + return; + } break; + default: + return; } s16* colors[9][3] = { @@ -1320,10 +1338,7 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { s32 randoGetItemId = Randomizer_GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); GetItem_Draw(globalCtx, randoGetItemEntry.gi); } else { s32 texIndex = this->actor.params - 3; @@ -1383,10 +1398,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { s32 randoGetItemId = Randomizer_GetRandomizedItemId(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); GetItem_Draw(globalCtx, ABS(randoGetItemEntry.gi - 1)); } else { s32 pad; From 9616058952e5e16c61d3750c5ba816842d4278fa Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 7 Aug 2022 12:14:07 -0400 Subject: [PATCH 012/212] Fixes item fanfares --- .../actors/ovl_player_actor/z_player.c | 65 ++++++++++++++----- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 02c2bf11d..275597ab1 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12741,25 +12741,60 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { Randomizer_Item_Give(globalCtx, giEntry); } Player_SetPendingFlag(this, globalCtx); - this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; - if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || - ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || - ((this->getItemId >= GI_RUPEE_GREEN_LOSE) && (this->getItemId <= GI_RUPEE_PURPLE_LOSE)) || - (this->getItemId == GI_HEART)) { - Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - } - else { - if ((this->getItemId == GI_HEART_CONTAINER_2) || (this->getItemId == GI_HEART_CONTAINER) || - ((this->getItemId == GI_HEART_PIECE) && - ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { - temp1 = NA_BGM_HEART_GET | 0x900; + if (this->getItemEntry.objectId != OBJECT_INVALID) { + if (giEntry.modIndex == 0) { + if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || + ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || + ((this->getItemId >= GI_RUPEE_GREEN_LOSE) && (this->getItemId <= GI_RUPEE_PURPLE_LOSE)) || + (this->getItemId == GI_HEART)) { + Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); + } else { + if ((this->getItemId == GI_HEART_CONTAINER_2) || (this->getItemId == GI_HEART_CONTAINER) || + ((this->getItemId == GI_HEART_PIECE) && + ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { + temp1 = NA_BGM_HEART_GET | 0x900; + } else { + temp1 = temp2 = + (this->getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } + Audio_PlayFanfare(temp1); + } + } else { + if (this->getItemId == RG_DOUBLE_DEFENSE || this->getItemId == RG_MAGIC_SINGLE || + this->getItemId == RG_MAGIC_DOUBLE) { + Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); + } else { + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); + } } - else { - temp1 = temp2 = (this->getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } else { + if (giEntry.modIndex == 0) { + if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) || + ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) || + (giEntry.itemId == ITEM_HEART)) { + Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); + } else { + if ((giEntry.itemId == ITEM_HEART_CONTAINER) || + ((giEntry.itemId == ITEM_HEART_PIECE) && + ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { + temp1 = NA_BGM_HEART_GET | 0x900; + } else { + temp1 = temp2 = + (giEntry.itemId == ITEM_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } + Audio_PlayFanfare(temp1); + } + } else { + if (giEntry.itemId == RG_DOUBLE_DEFENSE || giEntry.itemId == RG_MAGIC_SINGLE || + giEntry.itemId == RG_MAGIC_DOUBLE) { + Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); + } else { + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); + } } - Audio_PlayFanfare(temp1); } + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } else { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) { From 0efb0082139095a13ff0a553c584f692ab04fdcb Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 7 Aug 2022 13:17:06 -0400 Subject: [PATCH 013/212] Partially fixes Ice Traps Obtaining a freestanding Ice Trap causes link to slide forward and receiving one from an NPC plays the sound effect and damage animation but doesn't freeze link. --- soh/soh/Enhancements/randomizer/randomizer.cpp | 6 ++++-- soh/src/code/z_en_item00.c | 4 ++-- soh/src/overlays/actors/ovl_player_actor/z_player.c | 9 +++++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 7974dbdf8..ae712a00a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2329,8 +2329,8 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) // todo figure out what GI_HEART_CONTAINER_2 is return GI_HEART_CONTAINER; - case RG_ICE_TRAP: - return GI_ICE_TRAP; + // case RG_ICE_TRAP: + // return GI_ICE_TRAP; case RG_MILK: return GI_MILK; //todo logic around needing a bottle? @@ -2429,6 +2429,7 @@ bool Randomizer::IsGetItemRandoExclusive(RandomizerGet randoGet) { case RG_BOTTLE_WITH_BUGS: case RG_BOTTLE_WITH_POE: case RG_BOTTLE_WITH_BIG_POE: + case RG_ICE_TRAP: return true; default: return false; @@ -4807,6 +4808,7 @@ void InitRandoItemTable() { // Starting here, these do not have ItemIDs or GetItemIDs from vanilla, so I'm using their // RandomizerGet enum values for both. + GET_ITEM(RG_ICE_TRAP, OBJECT_INVALID, GID_RUPEE_GOLD, 0, 0, CHEST_ANIM_SHORT), GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 43c1c64b3..ba6f46c2c 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1339,7 +1339,7 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, randoGetItemEntry.gi); + GetItem_Draw(globalCtx, ABS(randoGetItemEntry.gi) - 1); } else { s32 texIndex = this->actor.params - 3; @@ -1399,7 +1399,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, ABS(randoGetItemEntry.gi - 1)); + GetItem_Draw(globalCtx, ABS(randoGetItemEntry.gi) - 1); } else { s32 pad; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 275597ab1..de938305e 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6281,7 +6281,12 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } if (this->getItemId < GI_MAX) { - GetItemEntry giEntry = ItemTable_Retrieve(this->getItemId - 1); + GetItemEntry giEntry; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(this->getItemId - 1); + } else { + giEntry = this->getItemEntry; + } if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; @@ -6289,7 +6294,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { iREG(67) = false; - if (gSaveContext.n64ddFlag && this->getItemId == GI_ICE_TRAP) { + if (gSaveContext.n64ddFlag && this->getItemId == RG_ICE_TRAP) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->actor.colChkInfo.damage = 0; func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); From 58da0a5aa2cced33215210ec29f9ff60b329fbe9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 7 Aug 2022 17:19:26 -0400 Subject: [PATCH 014/212] Some more partial ice trap fixing that wasn't pushed earlier --- soh/soh/Enhancements/item-tables/ItemTableManager.h | 3 ++- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- soh/src/overlays/actors/ovl_player_actor/z_player.c | 9 +++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index abc41418b..c80c64817 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -1,5 +1,6 @@ #pragma once #include "ItemTableTypes.h" +#include "z64item.h" #define CHEST_ANIM_SHORT 0 #define CHEST_ANIM_LONG 1 @@ -8,7 +9,7 @@ { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } #define GET_ITEM_NONE \ - { 0, 0, 0, 0, 0 } + { ITEM_NONE, 0, 0, 0, 0 } #include diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index ae712a00a..b99880962 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4808,7 +4808,7 @@ void InitRandoItemTable() { // Starting here, these do not have ItemIDs or GetItemIDs from vanilla, so I'm using their // RandomizerGet enum values for both. - GET_ITEM(RG_ICE_TRAP, OBJECT_INVALID, GID_RUPEE_GOLD, 0, 0, CHEST_ANIM_SHORT), + GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0, CHEST_ANIM_SHORT), GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index de938305e..43ed2b260 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12975,15 +12975,16 @@ void func_8084E6D4(Player* this, GlobalContext* globalCtx) { else { func_80832DBC(this); - if (this->getItemId == GI_ICE_TRAP) { + if ((this->getItemId == GI_ICE_TRAP && !gSaveContext.n64ddFlag) || + (gSaveContext.n64ddFlag && this->getItemId == RG_ICE_TRAP)) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); - if (this->getItemId != GI_ICE_TRAP) { + if ((this->getItemId != GI_ICE_TRAP && !gSaveContext.n64ddFlag) || + (gSaveContext.n64ddFlag && this->getItemId != RG_ICE_TRAP)) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0); func_8083C0E8(this, globalCtx); - } - else { + } else { this->actor.colChkInfo.damage = 0; func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); } From 7144d1a32131aa2c0e9daf21a438bc5ca1ee77ea Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Sun, 7 Aug 2022 15:26:03 -0700 Subject: [PATCH 015/212] First test of Rando-specific Navi tips First test of this experiment --- soh/src/code/z_message_PAL.c | 3 + soh/src/code/z_message_RandoNaviTips.c | 58 +++++++++++++++++++ soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 4 +- .../actors/ovl_player_actor/z_player.c | 4 ++ 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 soh/src/code/z_message_RandoNaviTips.c diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 72058206f..0d0da6051 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1750,6 +1750,9 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { break; } msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); + } else if (textId == 0x0140 && gSaveContext.n64ddFlag) { //888888888 + RandoNaviTip(globalCtx); + msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); } else { msgCtx->msgLength = font->msgLength; char* src = (uintptr_t)font->msgOffset; diff --git a/soh/src/code/z_message_RandoNaviTips.c b/soh/src/code/z_message_RandoNaviTips.c new file mode 100644 index 000000000..6f380c467 --- /dev/null +++ b/soh/src/code/z_message_RandoNaviTips.c @@ -0,0 +1,58 @@ +#include "global.h" +#include "message_data_static.h" +#include "vt.h" + +#include + +void RandoNaviTip(GlobalContext* globalCtx) { + u16 randNaviTip = rand() % 3; + MessageContext* msgCtx = &globalCtx->msgCtx; + Font* font = &msgCtx->font; + + if (randNaviTip == 0) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x08French tip about playing rando!\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x08Missing a small key in a dungeon?\x01Maybe the\x05\x43 " + "boss\x05\x40 has it!\x02"); + break; + } + } + if (randNaviTip == 1) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x08French tip about playing rando!\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x08Sometimes you can use the \x05\x41Megaton\x01Hammer \x05\x40" + "instead of bombs!\x02"); + break; + } + } + if (randNaviTip == 2) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x08French tip about playing rando!\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, + "\x08There are three\x05\x42 business scrubs\x05\x40 in\x01" + "Hyrule who sell \x05\x44mysterious items\x05\x40. Do\x01you know where they are?\x02"); + break; + } + } +} \ No newline at end of file diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index ff9e37e52..307c81f7f 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -1382,7 +1382,7 @@ void func_80A053F0(Actor* thisx, GlobalContext* globalCtx) { if (player->naviTextId == 0) { if (player->unk_664 == NULL) { - if (((gSaveContext.naviTimer >= 600) && (gSaveContext.naviTimer <= 3000)) || (nREG(89) != 0)) { + if (((gSaveContext.naviTimer >= 40) && (gSaveContext.naviTimer <= 3000)) || (nREG(89) != 0)) { player->naviTextId = ElfMessage_GetCUpText(globalCtx); if (player->naviTextId == 0x15F) { @@ -1401,7 +1401,7 @@ void func_80A053F0(Actor* thisx, GlobalContext* globalCtx) { if (thisx->textId == ElfMessage_GetCUpText(globalCtx)) { this->fairyFlags |= 0x80; - gSaveContext.naviTimer = 3001; + gSaveContext.naviTimer = 10; } this->fairyFlags |= 0x10; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index c3df51636..61f013d4c 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -15286,5 +15286,9 @@ void func_80853148(GlobalContext* globalCtx, Actor* actor) { if ((this->naviActor == this->targetActor) && ((this->targetActor->textId & 0xFF00) != 0x200)) { this->naviActor->flags |= ACTOR_FLAG_8; func_80835EA4(globalCtx, 0xB); + + if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { + Message_StartTextbox(globalCtx, 0x0140, NULL); + } } } From 6e8b45d1293ab7bfd357ceb86e7642354b76e60b Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Sun, 7 Aug 2022 15:50:53 -0700 Subject: [PATCH 016/212] Fix text colours (Navi text is always light blue) Navi text should always be \x44 --- soh/src/code/z_message_RandoNaviTips.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/soh/src/code/z_message_RandoNaviTips.c b/soh/src/code/z_message_RandoNaviTips.c index 6f380c467..edb1b7f9b 100644 --- a/soh/src/code/z_message_RandoNaviTips.c +++ b/soh/src/code/z_message_RandoNaviTips.c @@ -12,29 +12,29 @@ void RandoNaviTip(GlobalContext* globalCtx) { if (randNaviTip == 0) { switch (gSaveContext.language) { case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08French tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x08\x05\x44""French tip about playing rando!\x02"); break; case LANGUAGE_GER: - strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x08\x05\x44German tip about playing rando!\x02"); break; case LANGUAGE_ENG: default: - strcpy(font->msgBuf, "\x08Missing a small key in a dungeon?\x01Maybe the\x05\x43 " - "boss\x05\x40 has it!\x02"); + strcpy(font->msgBuf, "\x08\x05\x44Missing a small key in a dungeon?\x01Maybe the\x05\x41 " + "boss\x05\x44 has it!\x02"); break; } } if (randNaviTip == 1) { switch (gSaveContext.language) { case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08French tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x08\x05\x44""French tip about playing rando!\x02"); break; case LANGUAGE_GER: strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); break; case LANGUAGE_ENG: default: - strcpy(font->msgBuf, "\x08Sometimes you can use the \x05\x41Megaton\x01Hammer \x05\x40" + strcpy(font->msgBuf, "\x08\x05\x44Sometimes you can use the \x05\x41Megaton\x01Hammer \x05\x44" "instead of bombs!\x02"); break; } @@ -42,7 +42,7 @@ void RandoNaviTip(GlobalContext* globalCtx) { if (randNaviTip == 2) { switch (gSaveContext.language) { case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08French tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x08\x05\x44""French tip about playing rando!\x02"); break; case LANGUAGE_GER: strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); @@ -50,8 +50,8 @@ void RandoNaviTip(GlobalContext* globalCtx) { case LANGUAGE_ENG: default: strcpy(font->msgBuf, - "\x08There are three\x05\x42 business scrubs\x05\x40 in\x01" - "Hyrule who sell \x05\x44mysterious items\x05\x40. Do\x01you know where they are?\x02"); + "\x08\x05\x44There are three\x05\x42 business scrubs\x05\x44 in\x01" + "Hyrule who sell \x05\x46mysterious items\x05\x44. Do\x01you know where they are?\x02"); break; } } From 48a41bd11c4bc9bd5383dffd4cfcd3323a74a67c Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Sun, 7 Aug 2022 16:31:50 -0700 Subject: [PATCH 017/212] Comment clarity --- soh/src/code/z_message_PAL.c | 3 +- soh/src/code/z_message_RandoNaviTips.c | 28 +++++++++++++++++-- .../actors/ovl_player_actor/z_player.c | 8 +++--- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 0d0da6051..0a1204775 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1750,7 +1750,8 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { break; } msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); - } else if (textId == 0x0140 && gSaveContext.n64ddFlag) { //888888888 + // Give Navi rando-specific gameplay tips + } else if (textId == 0x0140 && gSaveContext.n64ddFlag) { RandoNaviTip(globalCtx); msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); } else { diff --git a/soh/src/code/z_message_RandoNaviTips.c b/soh/src/code/z_message_RandoNaviTips.c index edb1b7f9b..4d2bd0a92 100644 --- a/soh/src/code/z_message_RandoNaviTips.c +++ b/soh/src/code/z_message_RandoNaviTips.c @@ -4,8 +4,14 @@ #include +// Function for letting Navi give general rando tips to the player instead of her +// normal generic quest tips. + +// Only applies to Navi's overworld quest hints - does not apply to enemy information +// or contextual hints (e.g. "This hallway is twisted!" in Forest Temple) + void RandoNaviTip(GlobalContext* globalCtx) { - u16 randNaviTip = rand() % 3; + u16 randNaviTip = rand() % 4; MessageContext* msgCtx = &globalCtx->msgCtx; Font* font = &msgCtx->font; @@ -51,7 +57,25 @@ void RandoNaviTip(GlobalContext* globalCtx) { default: strcpy(font->msgBuf, "\x08\x05\x44There are three\x05\x42 business scrubs\x05\x44 in\x01" - "Hyrule who sell \x05\x46mysterious items\x05\x44. Do\x01you know where they are?\x02"); + "Hyrule who sell \x05\x49mysterious items\x05\x44. Do\x01you know where they are?\x02"); + break; + } + } + if (randNaviTip == 3) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x08\x05\x44" + "French tip about playing rando!\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, + "\x08\x05\x44Stuck on this seed? You could\x01" + "throw in the towel and check the \x01" + "\x05\x49spoiler log\x05\x44...\x02"); break; } } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 61f013d4c..7d5d61615 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -15286,9 +15286,9 @@ void func_80853148(GlobalContext* globalCtx, Actor* actor) { if ((this->naviActor == this->targetActor) && ((this->targetActor->textId & 0xFF00) != 0x200)) { this->naviActor->flags |= ACTOR_FLAG_8; func_80835EA4(globalCtx, 0xB); - - if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { - Message_StartTextbox(globalCtx, 0x0140, NULL); - } + // If rando'd and Navi wants to give you a general quest tip, give a rando tip instead + // if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { + // Message_StartTextbox(globalCtx, 0x0140, NULL); + // } } } From a5acf6da20e19903144e493f64e23e631b643036 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Sun, 7 Aug 2022 16:33:44 -0700 Subject: [PATCH 018/212] Set Navi timer back to normal --- soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 4 ++-- soh/src/overlays/actors/ovl_player_actor/z_player.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 307c81f7f..ff9e37e52 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -1382,7 +1382,7 @@ void func_80A053F0(Actor* thisx, GlobalContext* globalCtx) { if (player->naviTextId == 0) { if (player->unk_664 == NULL) { - if (((gSaveContext.naviTimer >= 40) && (gSaveContext.naviTimer <= 3000)) || (nREG(89) != 0)) { + if (((gSaveContext.naviTimer >= 600) && (gSaveContext.naviTimer <= 3000)) || (nREG(89) != 0)) { player->naviTextId = ElfMessage_GetCUpText(globalCtx); if (player->naviTextId == 0x15F) { @@ -1401,7 +1401,7 @@ void func_80A053F0(Actor* thisx, GlobalContext* globalCtx) { if (thisx->textId == ElfMessage_GetCUpText(globalCtx)) { this->fairyFlags |= 0x80; - gSaveContext.naviTimer = 10; + gSaveContext.naviTimer = 3001; } this->fairyFlags |= 0x10; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 7d5d61615..5bf9394d7 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -15287,8 +15287,8 @@ void func_80853148(GlobalContext* globalCtx, Actor* actor) { this->naviActor->flags |= ACTOR_FLAG_8; func_80835EA4(globalCtx, 0xB); // If rando'd and Navi wants to give you a general quest tip, give a rando tip instead - // if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { - // Message_StartTextbox(globalCtx, 0x0140, NULL); - // } + if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { + Message_StartTextbox(globalCtx, 0x0140, NULL); + } } } From f55623e1c684727a93207a950d0ecd9beb803729 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 9 Aug 2022 12:23:14 -0700 Subject: [PATCH 019/212] Update z_message_PAL.c --- soh/src/code/z_message_PAL.c | 96 +++++------------------------------- 1 file changed, 11 insertions(+), 85 deletions(-) diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 0a1204775..3a095b0d2 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1663,7 +1663,10 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { gSaveContext.eventInf[0] = gSaveContext.eventInf[1] = gSaveContext.eventInf[2] = gSaveContext.eventInf[3] = 0; } - if (sTextIsCredits) { + // RANDOTODO: Use this for ice trap messages + if (CustomMessage_RetrieveIfExists(globalCtx)) { + osSyncPrintf("Found custom message"); + } else if (sTextIsCredits) { Message_FindCreditsMessage(globalCtx, textId); msgCtx->msgLength = font->msgLength; char* src = (uintptr_t)font->msgOffset; @@ -1674,91 +1677,14 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { //font->msgLength, __FILE__, __LINE__); } else { Message_FindMessage(globalCtx, textId); - // if we're rando'd and talking to a gossip stone - if (gSaveContext.n64ddFlag && - textId == 0x2053 && - Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != 0 && - (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 1 || - (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 2 && - Player_GetMask(globalCtx) == PLAYER_MASK_TRUTH) || - (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 3 && - CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { + msgCtx->msgLength = font->msgLength; + char* src = (uintptr_t)font->msgOffset; + memcpy(font->msgBuf, src, font->msgLength); + } - s16 actorParams = msgCtx->talkActor->params; - - // if we're in a generic grotto - if (globalCtx->sceneNum == 62 && actorParams == 14360) { - // look for the chest in the actorlist to determine - // which grotto we're in - int numOfActorLists = sizeof(globalCtx->actorCtx.actorLists)/sizeof(globalCtx->actorCtx.actorLists[0]); - for(int i = 0; i < numOfActorLists; i++) { - if(globalCtx->actorCtx.actorLists[i].length) { - if(globalCtx->actorCtx.actorLists[i].head->id == 10) { - // set the params for the hint check to be negative chest params - actorParams = 0 - globalCtx->actorCtx.actorLists[i].head->params; - } - } - } - } - - RandomizerCheck hintCheck = Randomizer_GetCheckFromActor(globalCtx->sceneNum, msgCtx->talkActor->id, actorParams); - - // Pass the sizeof the message buffer so we don't hardcode any sizes and can rely on globals. - // If no hint can be found, this just returns 0 size and doesn't modify the buffer, so no worries. - msgCtx->msgLength = font->msgLength = Randomizer_CopyHintFromCheck(hintCheck, font->msgBuf, sizeof(font->msgBuf)); - } else if (gSaveContext.n64ddFlag && (textId == 0x7040 || textId == 0x7088)) { - // rando hints at altar - msgCtx->msgLength = font->msgLength = Randomizer_CopyAltarMessage(font->msgBuf, sizeof(font->msgBuf)); - } else if (textId == 0x00b4 && CVar_GetS32("gInjectSkulltulaCount", 0) != 0) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08\x13\x71Vous obtenez un \x05\x41Symbole de\x01Skulltula d'or\x05\x40! " - "Vous avez\x01\collect\x96 " - "\x05\x41\x19\x05\x40 symboles en tout!\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x08\x13\x71\Du erh\x93lst ein \x05\x41Goldene\x01Skulltula-Symbol\x05\x40\! " - "Du hast\x01insgesamt " - "\x05\x41\x19\x05\x40 symbol gesammelt!\x02"); - break; - case LANGUAGE_ENG: default: - strcpy(font->msgBuf, - "\x08\x13\x71You got a \x05\x41Gold Skulltula Token\x05\x40!\x01You've collected " - "\x05\x41\x19\x05\x40 tokens\x01in total!\x02"); - break; - } - msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); - } else if (gSaveContext.n64ddFlag && (textId == 0x10A2 || textId == 0x10DC || textId == 0x10DD)) { - msgCtx->msgLength = font->msgLength = CopyScrubMessage(textId, font->msgBuf, sizeof(font->msgBuf)); - } else if (gSaveContext.n64ddFlag && textId == 0x70CC) { - if (INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT) { - msgCtx->msgLength = font->msgLength = Randomizer_CopyGanonText(font->msgBuf, sizeof(font->msgBuf)); - } else { - msgCtx->msgLength = font->msgLength = Randomizer_CopyGanonHintText(font->msgBuf, sizeof(font->msgBuf)); - } - } else if (textId == 0xF8 && GET_PLAYER(globalCtx)->getItemId == GI_ICE_TRAP) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08\x06\x50\x05\x43IDIOT\x0E\x20\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x08\x06\x15 Du bist ein\x05\x43 DUMMKOPF\x05\x40!\x0E\x20\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x08\x06\x30You are a\x05\x43 FOWL\x05\x40!\x0E\x20\x02"); - break; - } - msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); - // Give Navi rando-specific gameplay tips - } else if (textId == 0x0140 && gSaveContext.n64ddFlag) { - RandoNaviTip(globalCtx); - msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); - } else { - msgCtx->msgLength = font->msgLength; - char* src = (uintptr_t)font->msgOffset; - memcpy(font->msgBuf, src, font->msgLength); - } + if (textId == 0x0140 && gSaveContext.n64ddFlag) { // 888888888 + RandoNaviTip(globalCtx); + msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); } msgCtx->textBoxProperties = font->charTexBuf[0]; From 00e2d0fe0e6e9e9e0b9ece17e8736acc0359081c Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 9 Aug 2022 12:39:59 -0700 Subject: [PATCH 020/212] Update tips --- soh/src/code/z_message_RandoNaviTips.c | 275 +++++++++++++++++++++++-- 1 file changed, 253 insertions(+), 22 deletions(-) diff --git a/soh/src/code/z_message_RandoNaviTips.c b/soh/src/code/z_message_RandoNaviTips.c index 4d2bd0a92..8ac714e55 100644 --- a/soh/src/code/z_message_RandoNaviTips.c +++ b/soh/src/code/z_message_RandoNaviTips.c @@ -5,77 +5,308 @@ #include // Function for letting Navi give general rando tips to the player instead of her -// normal generic quest tips. +// normal generic quest tips. // Only applies to Navi's overworld quest hints - does not apply to enemy information // or contextual hints (e.g. "This hallway is twisted!" in Forest Temple) void RandoNaviTip(GlobalContext* globalCtx) { - u16 randNaviTip = rand() % 4; + u16 randNaviTip = rand() % 15; // Random number between 0 and total number of Navi tips MessageContext* msgCtx = &globalCtx->msgCtx; Font* font = &msgCtx->font; if (randNaviTip == 0) { switch (gSaveContext.language) { case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08\x05\x44""French tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 0\x02"); break; case LANGUAGE_GER: - strcpy(font->msgBuf, "\x08\x05\x44German tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 0\x02"); break; case LANGUAGE_ENG: default: - strcpy(font->msgBuf, "\x08\x05\x44Missing a small key in a dungeon?\x01Maybe the\x05\x41 " - "boss\x05\x44 has it!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "Missing a small key in a dungeon?\x01" + "Maybe the\x05\x41 boss\x05\x44 has it!\x02"); break; } } if (randNaviTip == 1) { switch (gSaveContext.language) { case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08\x05\x44""French tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 1\x02"); break; case LANGUAGE_GER: - strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 1\x02"); break; case LANGUAGE_ENG: default: - strcpy(font->msgBuf, "\x08\x05\x44Sometimes you can use the \x05\x41Megaton\x01Hammer \x05\x44" - "instead of bombs!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "Sometimes you can use the \x05\x41Megaton\x01" + "Hammer \x05\x44instead of bombs!\x02"); break; } } if (randNaviTip == 2) { switch (gSaveContext.language) { case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08\x05\x44""French tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 2\x02"); break; case LANGUAGE_GER: - strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 2\x02"); break; case LANGUAGE_ENG: default: - strcpy(font->msgBuf, - "\x08\x05\x44There are three\x05\x42 business scrubs\x05\x44 in\x01" - "Hyrule who sell \x05\x49mysterious items\x05\x44. Do\x01you know where they are?\x02"); + strcpy(font->msgBuf, "\x05\x44" + "There are three\x05\x42 business scrubs\x05\x44 in\x01" + "Hyrule who sell \x05\x49mysterious items\x05\x44. Do\x01" + "you know where they are?\x02"); break; } } if (randNaviTip == 3) { switch (gSaveContext.language) { case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x08\x05\x44" - "French tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 3\x02"); break; case LANGUAGE_GER: - strcpy(font->msgBuf, "\x08German tip about playing rando!\x02"); + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 3\x02"); break; case LANGUAGE_ENG: default: - strcpy(font->msgBuf, - "\x08\x05\x44Stuck on this seed? You could\x01" - "throw in the towel and check the \x01" - "\x05\x49spoiler log\x05\x44...\x02"); + strcpy(font->msgBuf, "\x05\x44" + "Stuck on this seed? You could\x01" + "throw in the towel and check the \x01" + "\x05\x49spoiler log\x05\x44...\x02"); + break; + } + } + if (randNaviTip == 4) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 4\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 4\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "Did you know that the \x05\x46Hover\x01" + "Boots\x05\x44 can be used to cross \x01" + "quicksand?\x02"); + break; + } + } + if (randNaviTip == 5) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 5\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 5\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "You can get into the back of\x01\x05\x49" + "Impa's House\x05\x44 by jumping from the\x01" + "unfinished house with a \x05\x41" + "Cucco\x05\x44!\x02"); + break; + } + } + if (randNaviTip == 6) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 6\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 6\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "The \x05\x46Spirit Trial \x05\x44in \x05\x45Ganon's Castle\x05\x44\x01" + "has a\x05\x40 hidden chest\x05\x44 somewhere.\x01" + "Did you already know that?\x02"); + break; + } + } + if (randNaviTip == 7) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 7\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 7\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "You know the \x05\x40" + "Bombchu Bowling\x01" + "Alley\x05\x44? I heard \x05\x40only two of the\x01" + "prizes\x05\x44 are worthwhile. The rest\x01" + "is junk!\x02"); + break; + } + } + if (randNaviTip == 8) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 8\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 8\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "Have you been using \x05\x40" + "Deku Nuts \x05\x44\x01" + "enough? I've seen them blow up\x01" + "a \x05\x41" + "Bombchu\x05\x44!\x02"); + break; + } + } + if (randNaviTip == 9) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 9\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 9\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "You might end up with an \x05\x40" + "extra\x01" + "key\x05\x44 for the \x05\x43Water Temple\x05\x44 or the \x05\x41" + "Fire\x01" + "Temple\x05\x44. It's for your safety!\x02"); + break; + } + } + if (randNaviTip == 10) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 10\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 10\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "If you can't pick up a \x05\x41" + "bomb\x01" + "flower \x05\x44with your hands, you\x01" + "can still detonate it with \x01" + "an \x05\x40" + "arrow\x05\x44!\x02"); + break; + } + } + if (randNaviTip == 11) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 11\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 11\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "Even an adult can't push large\x01" + "blocks without some \x05\x40" + "extra\x01" + "strength\x05\x44!\x02"); + break; + } + } + if (randNaviTip == 12) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 12\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 12\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "I've heard that\x05\x41 Flare Dancer\x05\x44\x01" + "is weak to the \x05\x40Master Sword\x05\x44!\x01" + "Have you tried it?\x02"); + break; + } + } + if (randNaviTip == 13) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 12\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 12\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "Don't have a weapon to kill a\x01" + "\x05\x41spider\x05\x44? Try throwing a \x05\x40pot\x01" + "\x05\x44" + "at it!\x02"); + break; + } + } + if (randNaviTip == 14) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x05\x44" + "French tip about playing rando! 12\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x05\x44" + "German tip about playing rando! 12\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x05\x44" + "I hear the patch of \x05\x40soft soil\x05\x44\x01" + "in \x05\x43Zora's River\x05\x44 is the only one\x01" + "that isn't home to a \x05\x41spider\x05\x44!\x02"); break; } } From dc6018b41e748187ba6ef58f003823d9273bf4c7 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 9 Aug 2022 13:44:57 -0700 Subject: [PATCH 021/212] Update CMakeLists.txt --- soh/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 5342374f0..85fd7f080 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -485,6 +485,7 @@ set(Source_Files__src__code "src/code/z_map_exp.c" "src/code/z_map_mark.c" "src/code/z_message_PAL.c" + "src/code/z_message_RandoNaviTips.c" "src/code/z_moji.c" "src/code/z_msgevent.c" "src/code/z_olib.c" From 6a39b9e0119f79fa7b92fe3c9a717ab651c37115 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 9 Aug 2022 13:56:45 -0700 Subject: [PATCH 022/212] Comments --- soh/src/code/z_message_PAL.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 3a095b0d2..07f80fba2 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1682,7 +1682,8 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { memcpy(font->msgBuf, src, font->msgLength); } - if (textId == 0x0140 && gSaveContext.n64ddFlag) { // 888888888 + // (From z_player.c) In rando, Navi gives rando-related advice + if (textId == 0x0140 && gSaveContext.n64ddFlag) { RandoNaviTip(globalCtx); msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); } From b4c9f4aa6ee71795bfc5fa6251c85123d2949cf8 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 9 Aug 2022 16:07:58 -0700 Subject: [PATCH 023/212] Test switch to new message system Testing setting up the table and calling the messages --- soh/soh/Enhancements/randomizer/randomizer.cpp | 11 +++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 1 + soh/soh/OTRGlobals.cpp | 8 ++++++++ soh/src/code/z_message_PAL.c | 3 ++- soh/src/overlays/actors/ovl_player_actor/z_player.c | 6 +++--- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 250f4e3f1..0c6a7530a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -27,6 +27,7 @@ u8 generated; const std::string Randomizer::getItemMessageTableID = "Randomizer"; const std::string Randomizer::hintMessageTableID = "RandomizerHints"; const std::string Randomizer::scrubMessageTableID = "RandomizerScrubs"; +const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; Randomizer::Randomizer() { Sprite bowSprite = { dgFairyBowIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b, 0 }; @@ -4418,6 +4419,15 @@ void CreateScrubMessages() { } } +void CreateNaviRandoMessages() { + CustomMessageManager* customMessageManager = CustomMessageManager::Instance; + customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); + customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, 0x00, + { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, "Test Eng0", "Test Ger", "Test Fre" }); + customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, 0x01, + { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, "Test Eng1", "Test Ger", "Test Fre" }); +} + void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). @@ -4446,6 +4456,7 @@ void Randomizer::CreateCustomMessages() { }; CreateGetItemMessages(getItemMessages); CreateScrubMessages(); + CreateNaviRandoMessages(); } void InitRando() { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 1994cfdc4..eb0ef5edd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -29,6 +29,7 @@ class Randomizer { static const std::string getItemMessageTableID; static const std::string hintMessageTableID; static const std::string scrubMessageTableID; + static const std::string NaviRandoMessageTableID; static Sprite* GetSeedTexture(uint8_t index); s16 GetItemModelFromId(s16 itemId); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index b85d092fb..8630e0dcc 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1449,6 +1449,11 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); } +extern "C" CustomMessageEntry Randomizer_GetNaviMessage() { + u16 naviTextId = rand() % 2; + return CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId); +} + extern "C" CustomMessageEntry Randomizer_GetAltarMessage() { return (LINK_IS_ADULT) ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) @@ -1542,7 +1547,10 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { messageEntry = Randomizer_GetScrubMessage(textId); + } else if (textId >= 0x0140 && textId <= 0x015F) { + messageEntry = Randomizer_GetNaviMessage(); } + } if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) { if (CVar_GetS32("gInjectSkulltulaCount", 0) != 0) { diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 07f80fba2..430a7e3fa 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1682,11 +1682,12 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { memcpy(font->msgBuf, src, font->msgLength); } + /* // (From z_player.c) In rando, Navi gives rando-related advice if (textId == 0x0140 && gSaveContext.n64ddFlag) { RandoNaviTip(globalCtx); msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); - } + }*/ msgCtx->textBoxProperties = font->charTexBuf[0]; msgCtx->textBoxType = msgCtx->textBoxProperties >> 4; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 1b70d3e4f..0694deb90 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -15293,8 +15293,8 @@ void func_80853148(GlobalContext* globalCtx, Actor* actor) { this->naviActor->flags |= ACTOR_FLAG_8; func_80835EA4(globalCtx, 0xB); // If rando'd and Navi wants to give you a general quest tip, give a rando tip instead - if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { - Message_StartTextbox(globalCtx, 0x0140, NULL); - } + // if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { + // Message_StartTextbox(globalCtx, 0x0140, NULL); + // } } } From 3c4405347d4b7e52d5cf8a91d08ce8d10e39f59c Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 9 Aug 2022 18:35:39 -0700 Subject: [PATCH 024/212] Remove old stuff + add test messages --- soh/CMakeLists.txt | 1 - .../Enhancements/randomizer/randomizer.cpp | 25 ++++++++++++++++--- soh/soh/OTRGlobals.cpp | 2 +- soh/src/code/z_message_PAL.c | 7 ------ .../actors/ovl_player_actor/z_player.c | 4 --- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 85fd7f080..5342374f0 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -485,7 +485,6 @@ set(Source_Files__src__code "src/code/z_map_exp.c" "src/code/z_map_mark.c" "src/code/z_message_PAL.c" - "src/code/z_message_RandoNaviTips.c" "src/code/z_moji.c" "src/code/z_msgevent.c" "src/code/z_olib.c" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 0c6a7530a..7eea3f788 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4419,13 +4419,16 @@ void CreateScrubMessages() { } } +CustomMessageMinimal NaviMessages[]; + void CreateNaviRandoMessages() { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); - customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, 0x00, - { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, "Test Eng0", "Test Ger", "Test Fre" }); - customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, 0x01, - { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, "Test Eng1", "Test Ger", "Test Fre" }); + for (int i = 0; i <= 3; i++) { + customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, i, + { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, NaviMessages[i].english, + NaviMessages[i].german, NaviMessages[i].french }); + } } void Randomizer::CreateCustomMessages() { @@ -4471,3 +4474,17 @@ void Rando_Init(void) { } } + +CustomMessageMinimal NaviMessages[3] = { { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", + "%cGerman tip about playing rando! 0", + "%cFrench tip about playing rando! 0" }, + + { "%cSometimes you can use the %rMegaton &Hammer %cinstead of bombs!", + "%cGerman tip about playing rando! 1", + "%cFrench tip about playing rando! 1" }, + + { "%cThere are three %gbusiness scrubs %cin &Hyrule who sell %wmysterious items%c. Do &you know where they are?", + "%cGerman tip about playing rando! 2", + "%cFrench tip about playing rando! 2" } + +}; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 8630e0dcc..d79ab84d9 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1450,7 +1450,7 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { } extern "C" CustomMessageEntry Randomizer_GetNaviMessage() { - u16 naviTextId = rand() % 2; + u16 naviTextId = rand() % 3; return CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId); } diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 430a7e3fa..11c59db8b 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1682,13 +1682,6 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { memcpy(font->msgBuf, src, font->msgLength); } - /* - // (From z_player.c) In rando, Navi gives rando-related advice - if (textId == 0x0140 && gSaveContext.n64ddFlag) { - RandoNaviTip(globalCtx); - msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); - }*/ - msgCtx->textBoxProperties = font->charTexBuf[0]; msgCtx->textBoxType = msgCtx->textBoxProperties >> 4; msgCtx->textBoxPos = msgCtx->textBoxProperties & 0xF; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 0694deb90..eac49315d 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -15292,9 +15292,5 @@ void func_80853148(GlobalContext* globalCtx, Actor* actor) { if ((this->naviActor == this->targetActor) && ((this->targetActor->textId & 0xFF00) != 0x200)) { this->naviActor->flags |= ACTOR_FLAG_8; func_80835EA4(globalCtx, 0xB); - // If rando'd and Navi wants to give you a general quest tip, give a rando tip instead - // if (actor->textId >= 0x0140 && actor->textId <= 0x015F && gSaveContext.n64ddFlag) { - // Message_StartTextbox(globalCtx, 0x0140, NULL); - // } } } From 6de7ce372058b017b4a8b6d973121b274057ec59 Mon Sep 17 00:00:00 2001 From: Sarge-117 <108380086+Sarge-117@users.noreply.github.com> Date: Tue, 9 Aug 2022 18:37:42 -0700 Subject: [PATCH 025/212] Delete z_message_RandoNaviTips.c --- soh/src/code/z_message_RandoNaviTips.c | 313 ------------------------- 1 file changed, 313 deletions(-) delete mode 100644 soh/src/code/z_message_RandoNaviTips.c diff --git a/soh/src/code/z_message_RandoNaviTips.c b/soh/src/code/z_message_RandoNaviTips.c deleted file mode 100644 index 8ac714e55..000000000 --- a/soh/src/code/z_message_RandoNaviTips.c +++ /dev/null @@ -1,313 +0,0 @@ -#include "global.h" -#include "message_data_static.h" -#include "vt.h" - -#include - -// Function for letting Navi give general rando tips to the player instead of her -// normal generic quest tips. - -// Only applies to Navi's overworld quest hints - does not apply to enemy information -// or contextual hints (e.g. "This hallway is twisted!" in Forest Temple) - -void RandoNaviTip(GlobalContext* globalCtx) { - u16 randNaviTip = rand() % 15; // Random number between 0 and total number of Navi tips - MessageContext* msgCtx = &globalCtx->msgCtx; - Font* font = &msgCtx->font; - - if (randNaviTip == 0) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 0\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 0\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "Missing a small key in a dungeon?\x01" - "Maybe the\x05\x41 boss\x05\x44 has it!\x02"); - break; - } - } - if (randNaviTip == 1) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 1\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 1\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "Sometimes you can use the \x05\x41Megaton\x01" - "Hammer \x05\x44instead of bombs!\x02"); - break; - } - } - if (randNaviTip == 2) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 2\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 2\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "There are three\x05\x42 business scrubs\x05\x44 in\x01" - "Hyrule who sell \x05\x49mysterious items\x05\x44. Do\x01" - "you know where they are?\x02"); - break; - } - } - if (randNaviTip == 3) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 3\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 3\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "Stuck on this seed? You could\x01" - "throw in the towel and check the \x01" - "\x05\x49spoiler log\x05\x44...\x02"); - break; - } - } - if (randNaviTip == 4) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 4\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 4\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "Did you know that the \x05\x46Hover\x01" - "Boots\x05\x44 can be used to cross \x01" - "quicksand?\x02"); - break; - } - } - if (randNaviTip == 5) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 5\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 5\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "You can get into the back of\x01\x05\x49" - "Impa's House\x05\x44 by jumping from the\x01" - "unfinished house with a \x05\x41" - "Cucco\x05\x44!\x02"); - break; - } - } - if (randNaviTip == 6) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 6\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 6\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "The \x05\x46Spirit Trial \x05\x44in \x05\x45Ganon's Castle\x05\x44\x01" - "has a\x05\x40 hidden chest\x05\x44 somewhere.\x01" - "Did you already know that?\x02"); - break; - } - } - if (randNaviTip == 7) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 7\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 7\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "You know the \x05\x40" - "Bombchu Bowling\x01" - "Alley\x05\x44? I heard \x05\x40only two of the\x01" - "prizes\x05\x44 are worthwhile. The rest\x01" - "is junk!\x02"); - break; - } - } - if (randNaviTip == 8) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 8\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 8\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "Have you been using \x05\x40" - "Deku Nuts \x05\x44\x01" - "enough? I've seen them blow up\x01" - "a \x05\x41" - "Bombchu\x05\x44!\x02"); - break; - } - } - if (randNaviTip == 9) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 9\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 9\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "You might end up with an \x05\x40" - "extra\x01" - "key\x05\x44 for the \x05\x43Water Temple\x05\x44 or the \x05\x41" - "Fire\x01" - "Temple\x05\x44. It's for your safety!\x02"); - break; - } - } - if (randNaviTip == 10) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 10\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 10\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "If you can't pick up a \x05\x41" - "bomb\x01" - "flower \x05\x44with your hands, you\x01" - "can still detonate it with \x01" - "an \x05\x40" - "arrow\x05\x44!\x02"); - break; - } - } - if (randNaviTip == 11) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 11\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 11\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "Even an adult can't push large\x01" - "blocks without some \x05\x40" - "extra\x01" - "strength\x05\x44!\x02"); - break; - } - } - if (randNaviTip == 12) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 12\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 12\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "I've heard that\x05\x41 Flare Dancer\x05\x44\x01" - "is weak to the \x05\x40Master Sword\x05\x44!\x01" - "Have you tried it?\x02"); - break; - } - } - if (randNaviTip == 13) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 12\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 12\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "Don't have a weapon to kill a\x01" - "\x05\x41spider\x05\x44? Try throwing a \x05\x40pot\x01" - "\x05\x44" - "at it!\x02"); - break; - } - } - if (randNaviTip == 14) { - switch (gSaveContext.language) { - case LANGUAGE_FRA: - strcpy(font->msgBuf, "\x05\x44" - "French tip about playing rando! 12\x02"); - break; - case LANGUAGE_GER: - strcpy(font->msgBuf, "\x05\x44" - "German tip about playing rando! 12\x02"); - break; - case LANGUAGE_ENG: - default: - strcpy(font->msgBuf, "\x05\x44" - "I hear the patch of \x05\x40soft soil\x05\x44\x01" - "in \x05\x43Zora's River\x05\x44 is the only one\x01" - "that isn't home to a \x05\x41spider\x05\x44!\x02"); - break; - } - } -} \ No newline at end of file From e2ff5848391145714ec07f09bf70a49b840d1fd7 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 9 Aug 2022 20:13:39 -0700 Subject: [PATCH 026/212] Add remaining tips All the sample hints are now working under the new message system --- .../Enhancements/randomizer/randomizer.cpp | 70 ++++++++++++++++--- soh/soh/OTRGlobals.cpp | 2 +- 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 7eea3f788..f3460c05a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4424,7 +4424,7 @@ CustomMessageMinimal NaviMessages[]; void CreateNaviRandoMessages() { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); - for (int i = 0; i <= 3; i++) { + for (int i = 0; i <= 14; i++) { customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, i, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, NaviMessages[i].english, NaviMessages[i].german, NaviMessages[i].french }); @@ -4475,16 +4475,66 @@ void Rando_Init(void) { } -CustomMessageMinimal NaviMessages[3] = { { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", - "%cGerman tip about playing rando! 0", - "%cFrench tip about playing rando! 0" }, +CustomMessageMinimal NaviMessages[15] = { + + { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", + "%cGerman tip about playing rando! 0", + "%cFrench tip about playing rando! 0" }, - { "%cSometimes you can use the %rMegaton &Hammer %cinstead of bombs!", - "%cGerman tip about playing rando! 1", - "%cFrench tip about playing rando! 1" }, + { "%cSometimes you can use the %rMegaton&Hammer %cinstead of bombs!", + "%cGerman tip about playing rando! 1", + "%cFrench tip about playing rando! 1" }, - { "%cThere are three %gbusiness scrubs %cin &Hyrule who sell %wmysterious items%c. Do &you know where they are?", - "%cGerman tip about playing rando! 2", - "%cFrench tip about playing rando! 2" } + { "%cThere are three %gbusiness scrubs %cin &Hyrule who sell %wmysterious items%c. Do&you know where they are?", + "%cGerman tip about playing rando! 2", + "%cFrench tip about playing rando! 2" }, + + { "%cStuck on this seed? You could &throw in the towel and check the&%wspoiler log%c...", + "%cGerman tip about playing rando! 3", + "%cFrench tip about playing rando! 3" }, + + { "%cDid you know that the %yHover&Boots %ccan be used to cross&quicksand?", + "%cGerman tip about playing rando! 4", + "%cFrench tip about playing rando! 4" }, + + { "%cYou can reach the back of %wImpa's&House %cby jumping from the&unfinished house with a %rcucco%c!", + "%cGerman tip about playing rando! 5", + "%cFrench tip about playing rando! 5" }, + + { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", + "%cGerman tip about playing rando! 6", + "%cFrench tip about playing rando! 6" }, + + { "%cYou know the %wBombchu Bowling&Alley%c? I heard %wonly two of the &prizes %care worthwhile. The rest &is junk!", + "%cGerman tip about playing rando! 7", + "%cFrench tip about playing rando! 7" }, + + { "%cHave you been using %wDeku Nuts&%cenough? I've seen them blow up&a %rBombchu%c!", + "%cGerman tip about playing rando! 8", + "%cFrench tip about playing rando! 8" }, + + { "%cYou might end up with an %wextra&key %cfor the %bWater Temple %cor the&%rFire Temple%c. It's for your safety!", + "%cGerman tip about playing rando! 9", + "%cFrench tip about playing rando! 9" }, + + { "%cIf you can't pick up a %rbomb&flower %cwith your hands, you can&still detonate it with %rfire %cor&with %warrows%c!", + "%cGerman tip about playing rando! 10", + "%cFrench tip about playing rando! 10" }, + + { "%cEven an adult can't push large&blocks without some %wextra&strength%c!", + "%cGerman tip about playing rando! 11", + "%cFrench tip about playing rando! 11" }, + + { "%cI've heard that %rFlare Dancer&%cis weak to the Master Sword!&Have you tried it?", + "%cGerman tip about playing rando! 12", + "%cFrench tip about playing rando! 12" }, + + { "%cDon't have a weapon to kill a&%rspider%c? Try throwing a %wpot&%cat it!", + "%cGerman tip about playing rando! 13", + "%cFrench tip about playing rando! 13" }, + + { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", + "%cGerman tip about playing rando! 14", + "%cFrench tip about playing rando! 14" }, }; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index d79ab84d9..f45c5bc40 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1450,7 +1450,7 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { } extern "C" CustomMessageEntry Randomizer_GetNaviMessage() { - u16 naviTextId = rand() % 3; + u16 naviTextId = rand() % 15; return CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId); } From af03a80ad359081f016e08dbd74dd5a93daa00cd Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Wed, 10 Aug 2022 11:06:38 -0700 Subject: [PATCH 027/212] Create const "NaviMsgCount" So the number of messages doesn't have to be changed in 3 places when adding new entries --- soh/soh/Enhancements/randomizer/randomizer.cpp | 5 +++-- soh/soh/OTRGlobals.cpp | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f3460c05a..b89777564 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4420,11 +4420,12 @@ void CreateScrubMessages() { } CustomMessageMinimal NaviMessages[]; +extern const int NaviMsgCount = 15; void CreateNaviRandoMessages() { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); - for (int i = 0; i <= 14; i++) { + for (int i = 0; i <= (NaviMsgCount - 1); i++) { customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, i, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, NaviMessages[i].english, NaviMessages[i].german, NaviMessages[i].french }); @@ -4475,7 +4476,7 @@ void Rando_Init(void) { } -CustomMessageMinimal NaviMessages[15] = { +CustomMessageMinimal NaviMessages[NaviMsgCount] = { { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", "%cGerman tip about playing rando! 0", diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index f45c5bc40..001ee1c0d 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1449,8 +1449,10 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); } +extern const int NaviMsgCount; + extern "C" CustomMessageEntry Randomizer_GetNaviMessage() { - u16 naviTextId = rand() % 15; + u16 naviTextId = rand() % NaviMsgCount; return CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId); } @@ -1547,6 +1549,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { messageEntry = Randomizer_GetScrubMessage(textId); + // In rando, replace Navi's general overworld hints with rando-related gameplay tips } else if (textId >= 0x0140 && textId <= 0x015F) { messageEntry = Randomizer_GetNaviMessage(); } From 6e37897449b8a58751c2e16c414284c10d1fde2a Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 10 Aug 2022 20:28:44 -0400 Subject: [PATCH 028/212] Removes unused function override --- soh/CMakeLists.txt | 12 ++++++++++++ .../Enhancements/item-tables/ItemTableManager.cpp | 9 --------- soh/soh/Enhancements/item-tables/ItemTableManager.h | 1 - 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index a902880f1..043c05a46 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -341,6 +341,18 @@ set(Source_Files__soh__Enhancements__randomizer__3drando__location_access ) source_group("Source Files\\soh\\Enhancements\\randomizer\\3drando\\location_access" FILES ${Source_Files__soh__Enhancements__randomizer__3drando__location_access}) +set(Source_Files__soh__Enhancements__custom_message + "soh/Enhancements/custom-message/CustomMessageManager.cpp" +) + +source_group("Source Files\\soh\\Enhancements\\custom-message" FILES ${Source_Files__soh__Enhancements__custom_message}) + +set(Source_Files__soh__Enhancements__item_tables + "soh/Enhancements/item-tables/ItemTableManager.cpp" +) + +source_group("Source Files\\soh\\Enhancements\\item-tables" FILES ${Source_Files__soh__Enhancements__item_tables}) + set(Source_Files__src__boot "src/boot/assert.c" "src/boot/boot_main.c" diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp index 8e64c97ca..5202a81e5 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp @@ -12,15 +12,6 @@ bool ItemTableManager::AddItemTable(uint16_t tableID) { return itemTables.emplace(tableID, newItemTable).second; } -bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, uint16_t itemID, uint16_t objectID, int16_t drawID, uint16_t textID, uint16_t field, bool chestAnim) { - ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable == nullptr) { - return false; - } - GetItemEntry getItemEntry = GET_ITEM(itemID, objectID, drawID, textID, field, chestAnim); - return itemTable->emplace(getItemID, getItemEntry).second; -} - bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry) { ItemTable* itemTable = RetrieveItemTable(tableID); if (itemTable == nullptr) { diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index c80c64817..084b8cf1c 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -21,7 +21,6 @@ class ItemTableManager { ItemTableManager(); ~ItemTableManager(); bool AddItemTable(uint16_t tableID); - bool AddItemEntry(uint16_t tableID, uint16_t getItemID, uint16_t itemID, uint16_t objectID, int16_t drawID, uint16_t textID, uint16_t field, bool chestAnim); bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry); GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t itemID); bool ClearItemTable(uint16_t tableID); From dcb8e21314cd1222f51f35e406fe0f2ecf43d269 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 10 Aug 2022 20:57:47 -0400 Subject: [PATCH 029/212] Replaces ::find with ::at and adds exception handling --- .../item-tables/ItemTableManager.cpp | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp index 5202a81e5..57f6464e3 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp @@ -1,4 +1,5 @@ #include "ItemTableManager.h" +#include ItemTableManager::ItemTableManager() { } @@ -13,38 +14,29 @@ bool ItemTableManager::AddItemTable(uint16_t tableID) { } bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry) { - ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable == nullptr) { - return false; - } - return itemTable->emplace(getItemID, getItemEntry).second; + try { + ItemTable* itemTable = RetrieveItemTable(tableID); + return itemTable->emplace(getItemID, getItemEntry).second; + } catch (const std::out_of_range& oor) { return false; } } GetItemEntry ItemTableManager::RetrieveItemEntry(uint16_t tableID, uint16_t itemID) { - ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable != nullptr) { - auto foundItemEntry = itemTable->find(itemID); - if (foundItemEntry != itemTable->end()) { - return foundItemEntry->second; - } - } - return GET_ITEM_NONE; + try { + ItemTable* itemTable = RetrieveItemTable(tableID); + return itemTable->at(itemID); + } catch (std::out_of_range& oor) { return GET_ITEM_NONE; } } bool ItemTableManager::ClearItemTable(uint16_t tableID) { - ItemTable* itemTable = RetrieveItemTable(tableID); - if (itemTable != nullptr) { + try { + ItemTable* itemTable = RetrieveItemTable(tableID); itemTable->clear(); return true; - } - return false; + } catch (const std::out_of_range& oor) { return false; } } ItemTable* ItemTableManager::RetrieveItemTable(uint16_t tableID) { - auto foundItemTable = itemTables.find(tableID); - if (foundItemTable == itemTables.end()) { - return nullptr; - } - ItemTable& itemTable = foundItemTable->second; - return &itemTable; + try { + return &itemTables.at(tableID); + } catch (const std::out_of_range& oor) { throw(oor); } } From 4787f2f98b8d80927192b01be50743c036b3b95c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 10 Aug 2022 21:00:52 -0400 Subject: [PATCH 030/212] Removes some commented out code. --- .../Enhancements/randomizer/randomizer.cpp | 73 ------------------- .../actors/ovl_player_actor/z_player.c | 8 -- 2 files changed, 81 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 5d31ba443..70fd42d83 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2009,9 +2009,6 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_MAGIC_BEAN_PACK: return GI_BEAN; //todo make it 10 of them - /*case RG_DOUBLE_DEFENSE: - return GI_DOUBLE_DEFENSE;*/ - case RG_WEIRD_EGG: return GI_WEIRD_EGG; @@ -2161,52 +2158,6 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) return GI_BOTTLE; case RG_BOTTLE_WITH_MILK: return GI_MILK_BOTTLE; - /*case RG_BOTTLE_WITH_RED_POTION: - return GI_BOTTLE_WITH_RED_POTION; - case RG_BOTTLE_WITH_GREEN_POTION: - return GI_BOTTLE_WITH_GREEN_POTION; - case RG_BOTTLE_WITH_BLUE_POTION: - return GI_BOTTLE_WITH_BLUE_POTION; - case RG_BOTTLE_WITH_FAIRY: - return GI_BOTTLE_WITH_FAIRY; - case RG_BOTTLE_WITH_FISH: - return GI_BOTTLE_WITH_FISH; - case RG_BOTTLE_WITH_BLUE_FIRE: - return GI_BOTTLE_WITH_BLUE_FIRE; - case RG_BOTTLE_WITH_BUGS: - return GI_BOTTLE_WITH_BUGS; - case RG_BOTTLE_WITH_POE: - return GI_BOTTLE_WITH_POE; - case RG_RUTOS_LETTER: - return GI_LETTER_RUTO; - case RG_BOTTLE_WITH_BIG_POE: - return GI_BOTTLE_WITH_BIG_POE; - - case RG_ZELDAS_LULLABY: - return GI_ZELDAS_LULLABY; - case RG_EPONAS_SONG: - return GI_EPONAS_SONG; - case RG_SARIAS_SONG: - return GI_SARIAS_SONG; - case RG_SUNS_SONG: - return GI_SUNS_SONG; - case RG_SONG_OF_TIME: - return GI_SONG_OF_TIME; - case RG_SONG_OF_STORMS: - return GI_SONG_OF_STORMS; - - case RG_MINUET_OF_FOREST: - return GI_MINUET_OF_FOREST; - case RG_BOLERO_OF_FIRE: - return GI_BOLERO_OF_FIRE; - case RG_SERENADE_OF_WATER: - return GI_SERENADE_OF_WATER; - case RG_REQUIEM_OF_SPIRIT: - return GI_REQUIEM_OF_SPIRIT; - case RG_NOCTURNE_OF_SHADOW: - return GI_NOCTURNE_OF_SHADOW; - case RG_PRELUDE_OF_LIGHT: - return GI_PRELUDE_OF_LIGHT;*/ // todo implement dungeon-specific maps/compasses case RG_DEKU_TREE_MAP: @@ -2269,26 +2220,6 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_GANONS_CASTLE_KEY_RING: return GI_RUPEE_BLUE; - /*case RG_KOKIRI_EMERALD: - return GI_STONE_KOKIRI; - case RG_GORON_RUBY: - return GI_STONE_GORON; - case RG_ZORA_SAPPHIRE: - return GI_STONE_ZORA; - - case RG_FOREST_MEDALLION: - return GI_MEDALLION_FOREST; - case RG_FIRE_MEDALLION: - return GI_MEDALLION_FIRE; - case RG_WATER_MEDALLION: - return GI_MEDALLION_WATER; - case RG_SPIRIT_MEDALLION: - return GI_MEDALLION_SPIRIT; - case RG_SHADOW_MEDALLION: - return GI_MEDALLION_SHADOW; - case RG_LIGHT_MEDALLION: - return GI_MEDALLION_LIGHT;*/ - case RG_RECOVERY_HEART: return GI_HEART; @@ -2308,10 +2239,6 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_HEART_CONTAINER: // todo figure out what GI_HEART_CONTAINER_2 is return GI_HEART_CONTAINER; - - // case RG_ICE_TRAP: - // return GI_ICE_TRAP; - case RG_MILK: return GI_MILK; //todo logic around needing a bottle? diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 52b8dcf3f..0ccd09d79 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -22,14 +22,6 @@ #include "textures/icon_item_24_static/icon_item_24_static.h" #include -//typedef struct { -// /* 0x00 */ u8 itemId; -// /* 0x01 */ u8 field; // various bit-packed data -// /* 0x02 */ s8 gi; // defines the draw id and chest opening animation -// /* 0x03 */ u8 textId; -// /* 0x04 */ u16 objectId; -//} GetItemEntry; // size = 0x06 - #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } From cdd4628d7a027ab7b8ba71e7835a3e242dd050dc Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 00:24:34 -0400 Subject: [PATCH 031/212] Refactors rando's GetItemEntry array into two arrays. One array is for the vanilla items that don't have GetItemEntries in vanilla, the other is for rando exclusive items. They are stored in separate arrays before getting added to the table so that we can apply different modIndexes. The items in the first table have are handled by the vanilla Item_Give, and the second table needed a custom `Randomizer_Item_Give` function. --- .../Enhancements/randomizer/randomizer.cpp | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 70fd42d83..49de05c02 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4739,8 +4739,8 @@ void Randomizer::CreateCustomMessages() { } void InitRandoItemTable() { - GetItemEntry getItemTable[] = { - // The first several entries have ItemIDs from vanilla, but not GetItemIDs or entries in sGetItemTable + // These entries have ItemIDs from vanilla, but not GetItemIDs or entries in the old sGetItemTable + GetItemEntry extendedVanillaGetItemTable[] = { GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), @@ -4765,9 +4765,11 @@ void InitRandoItemTable() { GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG), + }; - // Starting here, these do not have ItemIDs or GetItemIDs from vanilla, so I'm using their - // RandomizerGet enum values for both. + // These do not have ItemIDs or GetItemIDs from vanilla, so I'm using their + // RandomizerGet enum values for both. + GetItemEntry randoGetItemTable[] = { GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0, CHEST_ANIM_SHORT), GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), @@ -4784,18 +4786,13 @@ void InitRandoItemTable() { GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), }; ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); - for (int i = 0; i < ARRAY_SIZE(getItemTable); i++) { - if (i < 21) { - // We want to use vanilla Give_Item code for indices 0-20 since - // vanilla already handles that. - getItemTable[i].modIndex = MOD_VANILLA; - } else { - // Mark these as randomizer items so we use the rando exclusive - // Give_Item_Randomizer for these. - getItemTable[i].modIndex = MOD_RANDOMIZER; - } + for (int i = 0; i < ARRAY_SIZE(extendedVanillaGetItemTable); i++) { + extendedVanillaGetItemTable[i].modIndex = MOD_VANILLA; + // These items should use their RG value as their getItemID. + // RANDOTODO: Add the getItemID as a member of the GetItemEntry + // struct, since that value will be useful in other places as well. uint8_t getItemID; - switch (getItemTable[i].itemId) { + switch (extendedVanillaGetItemTable[i].itemId) { case ITEM_MEDALLION_LIGHT: getItemID = RG_LIGHT_MEDALLION; break; @@ -4860,10 +4857,17 @@ void InitRandoItemTable() { getItemID = RG_PRELUDE_OF_LIGHT; break; default: - getItemID = getItemTable[i].itemId; + // We should never get here. If this branch of code executes, + // then you've added an item to extendedVanillaGetItemTable that + // should be in randoGetItemTable. + getItemID = RG_NONE; break; } - ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, getItemID, getItemTable[i]); + ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, getItemID, extendedVanillaGetItemTable[i]); + } + for (int i = 0; i < ARRAY_SIZE(randoGetItemTable); i++) { + randoGetItemTable[i].modIndex = MOD_RANDOMIZER; + ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); } } From cb81023255bb97b0dc21bf749cda9a6167074bf1 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 00:38:28 -0400 Subject: [PATCH 032/212] Renames, relocates, and implements ModIndex enum. --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- soh/soh/Enhancements/randomizer/randomizer.h | 2 -- .../Enhancements/randomizer/randomizerTypes.h | 5 +++++ soh/soh/OTRGlobals.cpp | 18 +++++++++--------- soh/src/code/z_en_item00.c | 4 ++-- .../actors/ovl_player_actor/z_player.c | 9 ++++----- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 49de05c02..4b508e67f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4787,7 +4787,7 @@ void InitRandoItemTable() { }; ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); for (int i = 0; i < ARRAY_SIZE(extendedVanillaGetItemTable); i++) { - extendedVanillaGetItemTable[i].modIndex = MOD_VANILLA; + extendedVanillaGetItemTable[i].modIndex = MOD_NONE; // These items should use their RG value as their getItemID. // RANDOTODO: Add the getItemID as a member of the GetItemEntry // struct, since that value will be useful in other places as well. diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 62d9249fb..38b8c11fd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -9,8 +9,6 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -typedef enum { MOD_VANILLA, MOD_RANDOMIZER } ModIndex; - class Randomizer { private: std::unordered_map itemLocations; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index d5bec1bb3..e8206dac2 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1,5 +1,10 @@ #pragma once +// This should probably go in a less rando-specific location +// but the best location will probably be in the modding engine +// which doesn't exist yet. +typedef enum { MOD_NONE, MOD_RANDOMIZER } ModIndex; + typedef struct { char tex[512]; uint16_t width; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index f5eb69876..cb29b4d5e 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -285,10 +285,10 @@ extern "C" void VanillaItemTable_Init() { GET_ITEM_NONE, GET_ITEM_NONE, }; - ItemTableManager::Instance->AddItemTable(MOD_VANILLA); + ItemTableManager::Instance->AddItemTable(MOD_NONE); for (uint8_t i = 0; i < ARRAY_SIZE(getItemTable); i++) { - getItemTable[i].modIndex = MOD_VANILLA; - ItemTableManager::Instance->AddItemEntry(MOD_VANILLA, i, getItemTable[i]); + getItemTable[i].modIndex = MOD_NONE; + ItemTableManager::Instance->AddItemEntry(MOD_NONE, i, getItemTable[i]); } } @@ -1610,7 +1610,7 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check) } extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - if (OTRGlobals::Instance->getItemModIndex != MOD_VANILLA) { + if (OTRGlobals::Instance->getItemModIndex != MOD_NONE) { getItemID++; // counteracts the - 1 offset used for vanilla table } @@ -1618,7 +1618,7 @@ extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { } extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { - if (tableID == MOD_VANILLA) { + if (tableID == MOD_NONE) { getItemID--; // counteracts the - 1 offset used for vanilla table } return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID); @@ -1628,7 +1628,7 @@ extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 a if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; } else { - OTRGlobals::Instance->getItemModIndex = MOD_VANILLA; + OTRGlobals::Instance->getItemModIndex = MOD_NONE; } return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); } @@ -1639,7 +1639,7 @@ extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { getItemModIndex = MOD_RANDOMIZER; } else { - getItemModIndex = MOD_VANILLA; + getItemModIndex = MOD_NONE; } s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); return ItemTable_RetrieveEntry(getItemModIndex, itemID); @@ -1649,7 +1649,7 @@ extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerChec if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) { OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; } else { - OTRGlobals::Instance->getItemModIndex = MOD_VANILLA; + OTRGlobals::Instance->getItemModIndex = MOD_NONE; } return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); } @@ -1659,7 +1659,7 @@ extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomi if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) { getItemModIndex = MOD_RANDOMIZER; } else { - getItemModIndex = MOD_VANILLA; + getItemModIndex = MOD_NONE; } s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); return ItemTable_RetrieveEntry(getItemModIndex, itemID); diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index ba6f46c2c..d3325a104 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1211,7 +1211,7 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetItemEntry giEntry) { s16 color_slot; switch (giEntry.modIndex) { - case 0: + case MOD_NONE: switch (giEntry.itemId) { case ITEM_SONG_MINUET: color_slot = 0; @@ -1243,7 +1243,7 @@ void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetI return; } break; - case 1: + case MOD_RANDOMIZER: switch (giEntry.itemId) { case RG_MAGIC_SINGLE: case RG_MAGIC_DOUBLE: diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 0ccd09d79..4e6ff8ed4 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12737,16 +12737,15 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } Message_StartTextbox(globalCtx, giEntry.textId, &this->actor); - if (giEntry.modIndex == 0) { + if (giEntry.modIndex == MOD_NONE) { Item_Give(globalCtx, giEntry.itemId); - } - else { + } else { Randomizer_Item_Give(globalCtx, giEntry); } Player_SetPendingFlag(this, globalCtx); if (this->getItemEntry.objectId != OBJECT_INVALID) { - if (giEntry.modIndex == 0) { + if (giEntry.modIndex == MOD_NONE) { if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || ((this->getItemId >= GI_RUPEE_GREEN_LOSE) && (this->getItemId <= GI_RUPEE_PURPLE_LOSE)) || @@ -12772,7 +12771,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } } } else { - if (giEntry.modIndex == 0) { + if (giEntry.modIndex == MOD_NONE) { if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) || ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) || (giEntry.itemId == ITEM_HEART)) { From 0431dce989118466d73050377e023e337d57c75b Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 02:01:01 -0400 Subject: [PATCH 033/212] Removes now unused ItemIDs and GetItemIDs Also makes all the necessary changes to other code that was still using them indirectly through the GI to GID map that was removed. There's quite a lot of changes here and I haven't had time to test them yet. --- soh/include/z64item.h | 51 +---- .../custom-message/CustomMessageManager.cpp | 8 +- .../custom-message/CustomMessageManager.h | 4 +- .../custom-message/CustomMessageTypes.h | 15 +- .../item-tables/ItemTableManager.h | 9 - .../Enhancements/item-tables/ItemTableTypes.h | 9 + .../Enhancements/randomizer/randomizer.cpp | 176 +---------------- soh/soh/OTRGlobals.cpp | 4 - soh/src/code/z_actor.c | 22 +-- soh/src/code/z_play.c | 8 +- soh/src/code/z_sram.c | 88 ++++----- .../overlays/actors/ovl_Demo_Im/z_demo_im.c | 2 +- .../actors/ovl_En_Ex_Item/z_en_ex_item.c | 35 ++-- soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c | 2 +- soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 2 +- soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c | 2 +- soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 10 +- .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 6 +- .../ovl_Item_Etcetera/z_item_etcetera.c | 27 ++- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 9 +- .../actors/ovl_player_actor/z_player.c | 180 +----------------- 21 files changed, 128 insertions(+), 541 deletions(-) diff --git a/soh/include/z64item.h b/soh/include/z64item.h index 9e78487db..65f6e93d9 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -244,15 +244,6 @@ typedef enum { /* 0x99 */ ITEM_STICK_UPGRADE_30, /* 0x9A */ ITEM_NUT_UPGRADE_30, /* 0x9B */ ITEM_NUT_UPGRADE_40, - /* 0x9C */ ITEM_BOTTLE_WITH_RED_POTION, - /* 0x9D */ ITEM_BOTTLE_WITH_GREEN_POTION, - /* 0x9E */ ITEM_BOTTLE_WITH_BLUE_POTION, - /* 0x9F */ ITEM_BOTTLE_WITH_FAIRY, - /* 0xA0 */ ITEM_BOTTLE_WITH_FISH, - /* 0xA1 */ ITEM_BOTTLE_WITH_BLUE_FIRE, - /* 0xA2 */ ITEM_BOTTLE_WITH_BUGS, - /* 0xA3 */ ITEM_BOTTLE_WITH_POE, - /* 0xA4 */ ITEM_BOTTLE_WITH_BIG_POE, /* 0xFC */ ITEM_LAST_USED = 0xFC, /* 0xFE */ ITEM_NONE_FE = 0xFE, /* 0xFF */ ITEM_NONE = 0xFF @@ -388,47 +379,7 @@ typedef enum { /* 0x7A */ GI_NUT_UPGRADE_40, /* 0x7B */ GI_BULLET_BAG_50, /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest - /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) - - /* 0x7E */ GI_MEDALLION_LIGHT, - /* 0x7F */ GI_MEDALLION_FOREST, - /* 0x80 */ GI_MEDALLION_FIRE, - /* 0x81 */ GI_MEDALLION_WATER, - /* 0x82 */ GI_MEDALLION_SHADOW, - /* 0x83 */ GI_MEDALLION_SPIRIT, - - /* 0x81 */ GI_STONE_KOKIRI, - /* 0x82 */ GI_STONE_GORON, - /* 0x83 */ GI_STONE_ZORA, - - /* 0x81 */ GI_ZELDAS_LULLABY, - /* 0x82 */ GI_SUNS_SONG, - /* 0x83 */ GI_EPONAS_SONG, - /* 0x81 */ GI_SONG_OF_STORMS, - /* 0x82 */ GI_SONG_OF_TIME, - /* 0x83 */ GI_SARIAS_SONG, - - /* 0x81 */ GI_MINUET_OF_FOREST, - /* 0x82 */ GI_BOLERO_OF_FIRE, - /* 0x83 */ GI_SERENADE_OF_WATER, - /* 0x81 */ GI_NOCTURNE_OF_SHADOW, - /* 0x82 */ GI_REQUIEM_OF_SPIRIT, - /* 0x83 */ GI_PRELUDE_OF_LIGHT, - - GI_SINGLE_MAGIC, - GI_DOUBLE_MAGIC, - GI_DOUBLE_DEFENSE, - - GI_BOTTLE_WITH_RED_POTION, - GI_BOTTLE_WITH_GREEN_POTION, - GI_BOTTLE_WITH_BLUE_POTION, - GI_BOTTLE_WITH_FAIRY, - GI_BOTTLE_WITH_FISH, - GI_BOTTLE_WITH_BLUE_FIRE, - GI_BOTTLE_WITH_BUGS, - GI_BOTTLE_WITH_POE, - GI_BOTTLE_WITH_BIG_POE, - + /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) /* 0x84 */ GI_MAX } GetItemID; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 8a42bef95..7c36fe209 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -1,5 +1,6 @@ #include "CustomMessageManager.h" #include +#include using namespace std::literals::string_literals; @@ -46,7 +47,7 @@ void CustomMessageManager::ReplaceColors(std::string& string) { } } -void CustomMessageManager::FormatCustomMessage(std::string& message, ItemID iid) { +void CustomMessageManager::FormatCustomMessage(std::string& message, uint16_t iid) { message.insert(0, ITEM_OBTAINED(iid)); size_t start_pos = 0; std::replace(message.begin(), message.end(), '&', NEWLINE()[0]); @@ -80,9 +81,8 @@ bool CustomMessageManager::InsertCustomMessage(std::string tableID, uint16_t tex return messageInsertResult.second; } - - -bool CustomMessageManager::CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messageEntry) { +bool CustomMessageManager::CreateGetItemMessage(std::string tableID, uint16_t giid, uint16_t iid, + CustomMessageEntry messageEntry) { FormatCustomMessage(messageEntry.english, iid); FormatCustomMessage(messageEntry.german, iid); FormatCustomMessage(messageEntry.french, iid); diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 0681073b8..76a613105 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -89,7 +89,7 @@ class CustomMessageManager { with the provided giid (getItemID) as its key. This function also inserts the icon corresponding to the provided iid (itemID) at the beginning of each page of the textbox. */ - bool CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messages); + bool CreateGetItemMessage(std::string tableID, uint16_t giid, uint16_t iid, CustomMessageEntry messages); /* Formats the provided Custom Message Entry and inserts it into the table with the provided tableID, @@ -122,7 +122,7 @@ class CustomMessageManager { & for newline, ^ for wait-for-input, and @ for the player name, as well as % for colors (i.e. %r for red and %w for white). */ - void FormatCustomMessage(std::string& message, ItemID iid); + void FormatCustomMessage(std::string& message, uint16_t iid); /* Replaces special characters and certain symbols with control codes diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index d2f30f123..cf0b60dbc 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -17,8 +17,8 @@ typedef enum { #ifdef __cplusplus typedef struct { - GetItemID giid; - ItemID iid; + u16 giid; + u16 iid; std::string english; std::string german; std::string french; @@ -27,7 +27,14 @@ typedef struct { #define GIMESSAGE(giid, iid, english, german, french) \ { giid, iid, english, german, french } -#define GIMESSAGE_UNTRANSLATED(giid, iid, message) \ - { giid, iid, message, message, message } +GetItemMessage GIMESSAGE_UNTRANSLATED(u16 giid, u16 iid, std::string message) { + GetItemMessage giMessage; + giMessage.giid = giid; + giMessage.iid = iid; + giMessage.english = message; + giMessage.german = message; + giMessage.french = message; + return giMessage; +} #endif diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index 084b8cf1c..622782265 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -2,15 +2,6 @@ #include "ItemTableTypes.h" #include "z64item.h" -#define CHEST_ANIM_SHORT 0 -#define CHEST_ANIM_LONG 1 - -#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } - -#define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, 0 } - #include typedef std::unordered_map ItemTable; diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 185410612..844f791fe 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -3,6 +3,15 @@ #include #endif +#define CHEST_ANIM_SHORT 0 +#define CHEST_ANIM_LONG 1 + +#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } + +#define GET_ITEM_NONE \ + { ITEM_NONE, 0, 0, 0, 0 } + typedef struct { /* 0x00 */ uint16_t itemId; /* 0x01 */ uint16_t field; // various bit-packed data diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4b508e67f..baae0bca5 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -849,160 +849,6 @@ std::unordered_map getItemIdToItemId = { { GI_CLAIM_CHECK, ITEM_CLAIM_CHECK } }; -std::unordered_map itemIdToModel = { { GI_NONE, GID_MAXIMUM }, - { GI_BOMBS_5, GID_BOMB }, - { GI_NUTS_5, GID_NUTS }, - { GI_BOMBCHUS_10, GID_BOMBCHU }, - { GI_BOW, GID_BOW }, - { GI_SLINGSHOT, GID_SLINGSHOT }, - { GI_BOOMERANG, GID_BOOMERANG }, - { GI_STICKS_1, GID_STICK }, - { GI_HOOKSHOT, GID_HOOKSHOT }, - { GI_LONGSHOT, GID_LONGSHOT }, - { GI_LENS, GID_LENS }, - { GI_LETTER_ZELDA, GID_LETTER_ZELDA }, - { GI_OCARINA_OOT, GID_OCARINA_TIME }, - { GI_HAMMER, GID_HAMMER }, - { GI_COJIRO, GID_COJIRO }, - { GI_LETTER_RUTO, GID_LETTER_RUTO }, - { GI_LETTER_RUTO, GID_LETTER_RUTO }, - { GI_BOTTLE, GID_BOTTLE }, - { GI_POTION_RED, GID_POTION_RED }, - { GI_POTION_GREEN, GID_POTION_GREEN }, - { GI_POTION_BLUE, GID_POTION_BLUE }, - { GI_FAIRY, GID_FAIRY }, - { GI_MILK_BOTTLE, GID_MILK }, - { GI_LETTER_RUTO, GID_LETTER_RUTO }, - { GI_BEAN, GID_BEAN }, - { GI_MASK_SKULL, GID_MASK_SKULL }, - { GI_MASK_SPOOKY, GID_MASK_SPOOKY }, - { GI_CHICKEN, GID_CHICKEN }, - { GI_MASK_KEATON, GID_MASK_KEATON }, - { GI_MASK_BUNNY, GID_MASK_BUNNY }, - { GI_MASK_TRUTH, GID_MASK_TRUTH }, - { GI_POCKET_EGG, GID_EGG }, - { GI_POCKET_CUCCO, GID_CHICKEN }, - { GI_ODD_MUSHROOM, GID_ODD_MUSHROOM }, - { GI_ODD_POTION, GID_ODD_POTION }, - { GI_SAW, GID_SAW }, - { GI_SWORD_BROKEN, GID_SWORD_BROKEN }, - { GI_PRESCRIPTION, GID_PRESCRIPTION }, - { GI_FROG, GID_FROG }, - { GI_EYEDROPS, GID_EYEDROPS }, - { GI_CLAIM_CHECK, GID_CLAIM_CHECK }, - { GI_SWORD_KOKIRI, GID_SWORD_KOKIRI }, - { GI_SWORD_KNIFE, GID_SWORD_BGS }, - { GI_SHIELD_DEKU, GID_SHIELD_DEKU }, - { GI_SHIELD_HYLIAN, GID_SHIELD_HYLIAN }, - { GI_SHIELD_MIRROR, GID_SHIELD_MIRROR }, - { GI_TUNIC_GORON, GID_TUNIC_GORON }, - { GI_TUNIC_ZORA, GID_TUNIC_ZORA }, - { GI_BOOTS_IRON, GID_BOOTS_IRON }, - { GI_BOOTS_HOVER, GID_BOOTS_HOVER }, - { GI_QUIVER_40, GID_QUIVER_40 }, - { GI_QUIVER_50, GID_QUIVER_50 }, - { GI_BOMB_BAG_20, GID_BOMB_BAG_20 }, - { GI_BOMB_BAG_30, GID_BOMB_BAG_30 }, - { GI_BOMB_BAG_40, GID_BOMB_BAG_40 }, - { GI_GAUNTLETS_SILVER, GID_GAUNTLETS_SILVER }, - { GI_GAUNTLETS_GOLD, GID_GAUNTLETS_GOLD }, - { GI_SCALE_SILVER, GID_SCALE_SILVER }, - { GI_SCALE_GOLD, GID_SCALE_GOLDEN }, - { GI_STONE_OF_AGONY, GID_STONE_OF_AGONY }, - { GI_GERUDO_CARD, GID_GERUDO_CARD }, - { GI_OCARINA_FAIRY, GID_OCARINA_FAIRY }, - { GI_SEEDS_5, GID_SEEDS }, - { GI_HEART_CONTAINER, GID_HEART_CONTAINER }, - { GI_HEART_PIECE, GID_HEART_PIECE }, - { GI_KEY_BOSS, GID_KEY_BOSS }, - { GI_COMPASS, GID_COMPASS }, - { GI_MAP, GID_DUNGEON_MAP }, - { GI_KEY_SMALL, GID_KEY_SMALL }, - { GI_MAGIC_SMALL, GID_MAGIC_SMALL }, - { GI_MAGIC_LARGE, GID_MAGIC_LARGE }, - { GI_WALLET_ADULT, GID_WALLET_ADULT }, - { GI_WALLET_GIANT, GID_WALLET_GIANT }, - { GI_WEIRD_EGG, GID_EGG }, - { GI_HEART, GID_HEART }, - { GI_ARROWS_SMALL, GID_ARROWS_SMALL }, - { GI_ARROWS_MEDIUM, GID_ARROWS_MEDIUM }, - { GI_ARROWS_LARGE, GID_ARROWS_LARGE }, - { GI_RUPEE_GREEN, GID_RUPEE_GREEN }, - { GI_RUPEE_BLUE, GID_RUPEE_BLUE }, - { GI_RUPEE_RED, GID_RUPEE_RED }, - { GI_HEART_CONTAINER_2, GI_HEART_CONTAINER_2 }, - { GI_MILK, GID_MILK }, - { GI_MASK_GORON, GID_MASK_GORON }, - { GI_MASK_ZORA, GID_MASK_ZORA }, - { GI_MASK_GERUDO, GID_MASK_GERUDO }, - { GI_BRACELET, GID_BRACELET }, - { GI_RUPEE_PURPLE, GID_RUPEE_PURPLE }, - { GI_RUPEE_GOLD, GID_RUPEE_GOLD }, - { GI_SWORD_BGS, GID_SWORD_BGS }, - { GI_ARROW_FIRE, GID_ARROW_FIRE }, - { GI_ARROW_ICE, GID_ARROW_ICE }, - { GI_ARROW_LIGHT, GID_ARROW_LIGHT }, - { GI_SKULL_TOKEN, GID_SKULL_TOKEN }, - { GI_DINS_FIRE, GID_DINS_FIRE }, - { GI_FARORES_WIND, GID_FARORES_WIND }, - { GI_NAYRUS_LOVE, GID_NAYRUS_LOVE }, - { GI_BULLET_BAG_30, GID_BULLET_BAG }, - { GI_BULLET_BAG_40, GID_BULLET_BAG }, - { GI_STICKS_5, GID_STICK }, - { GI_STICKS_10, GID_STICK }, - { GI_NUTS_5_2, GID_NUTS }, - { GI_NUTS_10, GID_NUTS }, - { GI_BOMBS_1, GID_BOMB }, - { GI_BOMBS_10, GID_BOMB }, - { GI_BOMBS_20, GID_BOMB }, - { GI_BOMBS_30, GID_BOMB }, - { GI_SEEDS_30, GID_SEEDS }, - { GI_BOMBCHUS_5, GID_BOMBCHU }, - { GI_BOMBCHUS_20, GID_BOMBCHU }, - { GI_FISH, GID_FISH }, - { GI_BUGS, GID_BUG }, - { GI_BLUE_FIRE, GID_BLUE_FIRE }, - { GI_POE, GID_POE }, - { GI_BIG_POE, GID_BIG_POE }, - { GI_DOOR_KEY, GID_KEY_SMALL }, - { GI_RUPEE_GREEN_LOSE, GID_RUPEE_GREEN }, - { GI_RUPEE_BLUE_LOSE, GID_RUPEE_BLUE }, - { GI_RUPEE_RED_LOSE, GID_RUPEE_RED }, - { GI_RUPEE_PURPLE_LOSE, GID_RUPEE_PURPLE }, - { GI_HEART_PIECE_WIN, GID_HEART_PIECE }, - { GI_STICK_UPGRADE_20, GID_STICK }, - { GI_STICK_UPGRADE_30, GID_STICK }, - { GI_NUT_UPGRADE_30, GID_NUTS }, - { GI_NUT_UPGRADE_40, GID_NUTS }, - { GI_BULLET_BAG_50, GID_BULLET_BAG_50 }, - { GI_ZELDAS_LULLABY, GID_SONG_ZELDA }, - { GI_EPONAS_SONG, GID_SONG_EPONA }, - { GI_SARIAS_SONG, GID_SONG_SARIA }, - { GI_SUNS_SONG, GID_SONG_SUN }, - { GI_SONG_OF_TIME, GID_SONG_TIME }, - { GI_SONG_OF_STORMS, GID_SONG_STORM }, - { GI_MINUET_OF_FOREST, GID_SONG_MINUET }, - { GI_BOLERO_OF_FIRE, GID_SONG_BOLERO }, - { GI_SERENADE_OF_WATER, GID_SONG_SERENADE }, - { GI_REQUIEM_OF_SPIRIT, GID_SONG_REQUIEM }, - { GI_NOCTURNE_OF_SHADOW, GID_SONG_NOCTURNE }, - { GI_PRELUDE_OF_LIGHT, GID_SONG_PRELUDE }, - { GI_DOUBLE_DEFENSE, GID_HEART_CONTAINER }, - { GI_STONE_KOKIRI, GID_KOKIRI_EMERALD }, - { GI_STONE_GORON, GID_GORON_RUBY }, - { GI_STONE_ZORA, GID_ZORA_SAPPHIRE }, - { GI_MEDALLION_FOREST, GID_MEDALLION_FOREST }, - { GI_MEDALLION_FIRE, GID_MEDALLION_FIRE }, - { GI_MEDALLION_WATER, GID_MEDALLION_WATER }, - { GI_MEDALLION_SPIRIT, GID_MEDALLION_SPIRIT }, - { GI_MEDALLION_SHADOW, GID_MEDALLION_SHADOW }, - { GI_MEDALLION_LIGHT, GID_MEDALLION_LIGHT }, - { GI_SINGLE_MAGIC, GID_MAGIC_SMALL }, - { GI_DOUBLE_MAGIC, GID_MAGIC_LARGE }, - { GI_ICE_TRAP, GID_RUPEE_GOLD }, - { GI_ICE_TRAP, GID_MAXIMUM }, - { GI_TEXT_0, GID_MAXIMUM } }; - std::unordered_map SpoilerfileGetNameToEnum = { { "No Item", RG_NONE }, { "Rien", RG_NONE }, @@ -1427,10 +1273,6 @@ s32 Randomizer::GetItemIDFromGetItemID(s32 getItemId) { return getItemIdToItemId[getItemId]; } -s16 Randomizer::GetItemModelFromId(s16 itemId) { - return itemIdToModel[itemId]; -} - std::string sanitize(std::string stringValue) { // Add backslashes. for (auto i = stringValue.begin();;) { @@ -4716,22 +4558,22 @@ void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). const std::vector getItemMessages = { - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, "You got a %rBig Poe in a Bottle%w!&Sell it to the Ghost Shop!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, "You got a %rBottle of Blue Potion%w!&Drink it to replenish your&%ghealth%w and %bmagic%w!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_FISH, ITEM_FISH, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_FISH, ITEM_FISH, "You got a %rFish in a Bottle%w!&It looks fresh and delicious!&They say Jabu-Jabu loves them!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BUGS, ITEM_BUG, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BUGS, ITEM_BUG, "You got a %rBug in a Bottle%w!&They love to burrow in&dirt holes!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_FAIRY, ITEM_FAIRY, "You got a %rFairy in a Bottle%w!&Use it wisely!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY, "You got a %rFairy in a Bottle%w!&Use it wisely!"), + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, "You got a %rBottle of Red Potion%w!&Drink it to replenish your&%ghealth%w!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, "You got a %rBottle of Green Potion%w!&Drink it to replenish your&%bmagic%w!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_POE, ITEM_POE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_POE, ITEM_POE, "You got a %rPoe in a Bottle%w!&That creepy Ghost Shop might&be interested in this..."), }; CreateGetItemMessages(getItemMessages); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index cb29b4d5e..7c1f6a66e 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1542,10 +1542,6 @@ extern "C" void* getN64WeirdFrame(s32 i) { return &weirdFrameBytes[i + sizeof(n64WeirdFrames)]; } -extern "C" s16 Randomizer_GetItemModelFromId(s16 itemId) { - return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId); -} - extern "C" s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId) { return OTRGlobals::Instance->gRandomizer->GetItemIDFromGetItemID(getItemId); } diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index d624fc42d..745524909 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -5970,7 +5970,7 @@ s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* ar return true; } -s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { +GetItemEntry GetChestGameRandoGetItem(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { // RANDOTODO update this logic when we implement keysanity // because 3drando replaces the keys not the rupees @@ -5981,27 +5981,27 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) switch(room) { case 1: if(!Flags_GetCollectible(globalCtx, 0x1B)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN); } break; case 2: if(!Flags_GetCollectible(globalCtx, 0x1C)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN); } break; case 3: if(!Flags_GetCollectible(globalCtx, 0x1D)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE); } break; case 4: if(!Flags_GetCollectible(globalCtx, 0x1E)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE); } break; case 5: if(!Flags_GetCollectible(globalCtx, 0x1F)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED); } break; } @@ -6009,17 +6009,17 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) } if(ogDrawId == GID_HEART_PIECE) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE); } - return GI_NONE; + return (GetItemEntry)GET_ITEM_NONE; } s16 GetChestGameRandoGiDrawId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { - s32 randoGetItemId = GetChestGameRandoGetItemId(room, ogDrawId, globalCtx); + GetItemEntry randoGetItem = GetChestGameRandoGetItem(room, ogDrawId, globalCtx); - if(randoGetItemId != GI_NONE) { - return Randomizer_GetItemModelFromId(randoGetItemId); + if (randoGetItem.itemId != RG_NONE) { + return ABS(randoGetItem.gi) - 1; } return ogDrawId; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index e7b96a7d9..f05ef917f 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -201,7 +201,7 @@ void GivePlayerRandoRewardSongOfTime(GlobalContext* globalCtx, RandomizerCheck c if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); + GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_SONG_OF_TIME); GiveItemWithoutActor(globalCtx, getItemId); player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; @@ -216,7 +216,7 @@ void GivePlayerRandoRewardNocturne(GlobalContext* globalCtx, RandomizerCheck che gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_NOCTURNE_OF_SHADOW); + GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW); GiveItemWithoutActor(globalCtx, getItemId); Flags_SetEventChkInf(0xAA); } @@ -228,7 +228,7 @@ void GivePlayerRandoRewardRequiem(GlobalContext* globalCtx, RandomizerCheck chec if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); + GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_SONG_OF_TIME); GiveItemWithoutActor(globalCtx, getItemId); Flags_SetEventChkInf(0xAC); } @@ -254,7 +254,7 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck check) { Player* player = GET_PLAYER(globalCtx); if (gSaveContext.entranceIndex == 0x05E0) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ZELDAS_LULLABY); + GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_ZELDAS_LULLABY); if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemId && getItemId != GI_ICE_TRAP)) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 6dc14f93c..8661495bd 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -2,6 +2,7 @@ #include "vt.h" #include +#include #define NUM_DUNGEONS 8 #define NUM_TRIALS 6 @@ -306,11 +307,11 @@ void GiveLinkDekuNutUpgrade(GetItemID giid) { } void GiveLinkMagic(GetItemID giid) { - if (giid == GI_SINGLE_MAGIC) { + if (giid == RG_MAGIC_SINGLE) { gSaveContext.magicLevel = 1; gSaveContext.magicAcquired = true; gSaveContext.doubleMagic = false; - } else if (giid == GI_DOUBLE_MAGIC) { + } else if (giid == RG_MAGIC_DOUBLE) { gSaveContext.magicLevel = 2; gSaveContext.magicAcquired = true; gSaveContext.doubleMagic = true; @@ -326,40 +327,40 @@ void GiveLinkSong(GetItemID getItemId) { uint32_t bitMask; switch (getItemId) { - case GI_ZELDAS_LULLABY: + case RG_ZELDAS_LULLABY: bitMask = 1 << QUEST_SONG_LULLABY; break; - case GI_SUNS_SONG: + case RG_SUNS_SONG: bitMask = 1 << QUEST_SONG_SUN; break; - case GI_EPONAS_SONG: + case RG_EPONAS_SONG: bitMask = 1 << QUEST_SONG_EPONA; break; - case GI_SONG_OF_STORMS: + case RG_SONG_OF_STORMS: bitMask = 1 << QUEST_SONG_STORMS; break; - case GI_SONG_OF_TIME: + case RG_SONG_OF_TIME: bitMask = 1 << QUEST_SONG_TIME; break; - case GI_SARIAS_SONG: + case RG_SARIAS_SONG: bitMask = 1 << QUEST_SONG_SARIA; break; - case GI_MINUET_OF_FOREST: + case RG_MINUET_OF_FOREST: bitMask = 1 << QUEST_SONG_MINUET; break; - case GI_BOLERO_OF_FIRE: + case RG_BOLERO_OF_FIRE: bitMask = 1 << QUEST_SONG_BOLERO; break; - case GI_SERENADE_OF_WATER: + case RG_SERENADE_OF_WATER: bitMask = 1 << QUEST_SONG_SERENADE; break; - case GI_NOCTURNE_OF_SHADOW: + case RG_NOCTURNE_OF_SHADOW: bitMask = 1 << QUEST_SONG_NOCTURNE; break; - case GI_REQUIEM_OF_SPIRIT: + case RG_REQUIEM_OF_SPIRIT: bitMask = 1 << QUEST_SONG_REQUIEM; break; - case GI_PRELUDE_OF_LIGHT: + case RG_PRELUDE_OF_LIGHT: bitMask = 1 << QUEST_SONG_PRELUDE; break; } @@ -696,30 +697,22 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { } if(Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { - s32 giid = Randomizer_GetItemIdFromKnownCheck(RC_SONG_FROM_IMPA, GI_ZELDAS_LULLABY); - - if(giid >= GI_ZELDAS_LULLABY && giid <= GI_PRELUDE_OF_LIGHT) { + s32 giid = Randomizer_GetItemIdFromKnownCheck(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY); + + if (giid >= RG_ZELDAS_LULLABY && giid <= RG_PRELUDE_OF_LIGHT) { GiveLinkSong(giid); - } else if (giid == GI_RUPEE_GREEN || - giid == GI_RUPEE_BLUE || - giid == GI_RUPEE_RED || - giid == GI_RUPEE_PURPLE || - giid == GI_RUPEE_GOLD) { + } else if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED || + giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_GOLD) { GiveLinkRupeesByGetItemId(giid); - } else if (giid == GI_BOMBCHUS_10 || - giid == GI_BOMBCHUS_5 || - giid == GI_BOMBCHUS_20) { + } else if (giid == GI_BOMBCHUS_10 || giid == GI_BOMBCHUS_5 || giid == GI_BOMBCHUS_20) { GiveLinkBombchus(giid); - } else if (giid == GI_STICKS_1 || - giid == GI_STICKS_5 || - giid == GI_STICKS_10) { + } else if (giid == GI_STICKS_1 || giid == GI_STICKS_5 || giid == GI_STICKS_10) { GiveLinkDekuSticksByGetItemId(giid); - } else if (giid == GI_NUTS_5 || - giid == GI_NUTS_10) { + } else if (giid == GI_NUTS_5 || giid == GI_NUTS_10) { GiveLinkDekuNutsByGetItemId(giid); } else if (giid == GI_BEAN) { GiveLinkBeans(); - } else if (giid >= GI_MEDALLION_LIGHT && giid <= GI_STONE_ZORA) { + } else if (giid >= RG_KOKIRI_EMERALD && giid <= RG_LIGHT_MEDALLION) { GiveLinkDungeonReward(giid); } else if (giid == GI_SWORD_KOKIRI) { GiveLinkKokiriSword(); @@ -741,27 +734,17 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { GiveLinkIronBoots(); } else if (giid == GI_BOOTS_HOVER) { GiveLinkHoverBoots(); - } else if (giid == GI_SLINGSHOT || - giid == GI_BULLET_BAG_40 || - giid == GI_BULLET_BAG_50) { + } else if (giid == GI_SLINGSHOT || giid == GI_BULLET_BAG_40 || giid == GI_BULLET_BAG_50) { GiveLinkBulletBagUpgrade(giid); - } else if (giid == GI_BOW || - giid == GI_QUIVER_40 || - giid == GI_QUIVER_50) { + } else if (giid == GI_BOW || giid == GI_QUIVER_40 || giid == GI_QUIVER_50) { GiveLinkQuiverUpgrade(giid); - } else if (giid == GI_BOMB_BAG_20 || - giid == GI_BOMB_BAG_30 || - giid == GI_BOMB_BAG_40) { + } else if (giid == GI_BOMB_BAG_20 || giid == GI_BOMB_BAG_30 || giid == GI_BOMB_BAG_40) { GiveLinkBombBagUpgrade(giid); - } else if (giid == GI_BRACELET || - giid == GI_GAUNTLETS_SILVER || - giid == GI_GAUNTLETS_GOLD) { + } else if (giid == GI_BRACELET || giid == GI_GAUNTLETS_SILVER || giid == GI_GAUNTLETS_GOLD) { GiveLinkStrengthUpgrade(giid); - } else if (giid == GI_SCALE_SILVER || - giid == GI_SCALE_GOLD) { + } else if (giid == GI_SCALE_SILVER || giid == GI_SCALE_GOLD) { GiveLinkScaleUpgrade(giid); - } else if (giid == GI_WALLET_ADULT || - giid == GI_WALLET_GIANT) { + } else if (giid == GI_WALLET_ADULT || giid == GI_WALLET_GIANT) { GiveLinkWalletUpgrade(giid); } else if (giid == GI_STONE_OF_AGONY) { GiveLinkStoneOfAgony(); @@ -771,16 +754,13 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { GiveLinkPieceOfHeart(); } else if (giid == GI_HEART_CONTAINER) { GiveLinkHeartContainer(); - } else if (giid == GI_STICK_UPGRADE_20 || - giid == GI_STICK_UPGRADE_30) { + } else if (giid == GI_STICK_UPGRADE_20 || giid == GI_STICK_UPGRADE_30) { GiveLinkDekuStickUpgrade(giid); - } else if (giid == GI_NUT_UPGRADE_30 || - giid == GI_NUT_UPGRADE_40) { + } else if (giid == GI_NUT_UPGRADE_30 || giid == GI_NUT_UPGRADE_40) { GiveLinkDekuNutUpgrade(giid); - } else if (giid == GI_SINGLE_MAGIC || - giid == GI_DOUBLE_MAGIC) { + } else if (giid == RG_MAGIC_SINGLE || giid == RG_MAGIC_DOUBLE) { GiveLinkMagic(giid); - } else if (giid == GI_DOUBLE_DEFENSE) { + } else if (giid == RG_DOUBLE_DEFENSE) { GiveLinkDoubleDefense(); } else { s32 iid = Randomizer_GetItemIDFromGetItemID(giid); diff --git a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c index cd49f7558..7526ac2ea 100644 --- a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c +++ b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c @@ -899,7 +899,7 @@ void func_80986BF8(DemoIm* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardImpa(Actor* impa, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ZELDAS_LULLABY); + GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_ZELDAS_LULLABY); if (impa->parent != NULL && impa->parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index c5d0238e7..953c4e74b 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -138,8 +138,10 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { case EXITEM_BOMB_BAG_BOWLING: this->unk_17C = func_8002EBCC; if (gSaveContext.n64ddFlag) { - this->giDrawId = Randomizer_GetItemModelFromId( - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20)); + this->giDrawId = + ABS(Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20) + .gi) - + 1; } else { this->giDrawId = GID_BOMB_BAG_30; } @@ -173,8 +175,9 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { case EXITEM_BOMBCHUS_BOWLING: this->unk_17C = func_8002EBCC; if (gSaveContext.n64ddFlag) { - this->giDrawId = Randomizer_GetItemModelFromId( - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10)); + this->giDrawId = + ABS(Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).gi) - + 1; } else { this->giDrawId = GID_BOMBCHU; } @@ -506,24 +509,19 @@ void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx) { if (this) {} func_8002ED80(&this->actor, globalCtx, 0); if (gSaveContext.n64ddFlag) { - s32 randoGetItemId; + GetItemEntry randoGetItem; switch (this->type) { case EXITEM_BOMB_BAG_BOWLING: case EXITEM_BOMB_BAG_COUNTER: - randoGetItemId = Randomizer_GetItemIdFromKnownCheck( - RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); break; case EXITEM_BOMBCHUS_BOWLING: case EXITEM_BOMBCHUS_COUNTER: - randoGetItemId = Randomizer_GetItemIdFromKnownCheck( - RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); break; } - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); } GetItem_Draw(globalCtx, this->giDrawId); @@ -533,13 +531,10 @@ void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx) { func_8002ED80(&this->actor, globalCtx, 0); if (gSaveContext.n64ddFlag) { - s32 randoGetItemId = Randomizer_GetItemIdFromKnownCheck( - RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItem = + Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + GetItem_Draw(globalCtx, ABS(randoGetItem.gi) - 1); } else { GetItem_Draw(globalCtx, GID_HEART_PIECE); } diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c index 24676a577..54977add1 100644 --- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -154,7 +154,7 @@ void GivePlayerRandoRewardSongOfStorms(EnFu* windmillGuy, GlobalContext* globalC Flags_SetTreasure(globalCtx, 0x1F); windmillGuy->actionFunc = func_80A1DBD4; } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_STORMS); + GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_SONG_OF_STORMS); func_8002F434(&windmillGuy->actor, globalCtx, getItemId, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index b0ff90eac..fe66cff68 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -357,7 +357,7 @@ void func_80AA0EFC(EnMa1* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_EPONAS_SONG); + GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_EPONAS_SONG); // Prevents flag from getting set if we weren't able to get the item (i.e. Player is holding shield // when closing the textbox). if (malon->actor.parent != NULL && malon->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && diff --git a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c index c6dd38acc..95fdd9b23 100644 --- a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c +++ b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c @@ -619,7 +619,7 @@ void func_80AF67D0(EnSa* this, GlobalContext* globalCtx) { void GivePlayerRandoRewardSaria(EnSa* saria, GlobalContext* globalCtx, RandomizerCheck check) { GetItemID getItemId = - Randomizer_GetItemIdFromKnownCheck(check, GI_SARIAS_SONG); + Randomizer_GetItemIdFromKnownCheck(check, RG_SARIAS_SONG); if (saria->actor.parent != NULL && saria->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index 0e7ae60d2..e41641b13 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -319,7 +319,7 @@ s32 EnXc_MinuetCS(EnXc* this, GlobalContext* globalCtx) { gSaveContext.eventChkInf[5] |= 1; Item_Give(globalCtx, ITEM_SONG_MINUET); } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_FOREST, 1, GI_MINUET_OF_FOREST); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_FOREST, 1, RG_MINUET_OF_FOREST); return false; } return true; @@ -355,7 +355,7 @@ s32 EnXc_BoleroCS(EnXc* this, GlobalContext* globalCtx) { gSaveContext.eventChkInf[5] |= 2; Item_Give(globalCtx, ITEM_SONG_BOLERO); } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_CRATER, 2, GI_BOLERO_OF_FIRE); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_CRATER, 2, RG_BOLERO_OF_FIRE); return false; } return true; @@ -396,7 +396,7 @@ s32 EnXc_SerenadeCS(EnXc* this, GlobalContext* globalCtx) { gSaveContext.eventChkInf[5] |= 4; // Learned Serenade of Water Flag Item_Give(globalCtx, ITEM_SONG_SERENADE); } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_ICE_CAVERN, 4, GI_SERENADE_OF_WATER); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_ICE_CAVERN, 4, RG_SERENADE_OF_WATER); return false; } osSyncPrintf("ブーツを取った!!!!!!!!!!!!!!!!!!\n"); @@ -2207,7 +2207,7 @@ void EnXc_InitTempleOfTime(EnXc* this, GlobalContext* globalCtx) { gSaveContext.cutsceneTrigger = 1; this->action = SHEIK_ACTION_30; } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, GI_PRELUDE_OF_LIGHT); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, RG_PRELUDE_OF_LIGHT); } } else if (!(gSaveContext.eventChkInf[5] & 0x20)) { func_80B3C9EC(this); @@ -2349,7 +2349,7 @@ void EnXc_Update(Actor* thisx, GlobalContext* globalCtx) { if (this->actor.params == SHEIK_TYPE_9) { if (gSaveContext.n64ddFlag && LINK_IS_ADULT) { if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && !(gSaveContext.eventChkInf[5] & 0x20)) { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, GI_PRELUDE_OF_LIGHT); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, RG_PRELUDE_OF_LIGHT); } } } diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index e32ab216f..fb83d2df6 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -99,8 +99,10 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) { } if (gSaveContext.n64ddFlag) { - GetItem_Draw(globalCtx, - Randomizer_GetItemModelFromId(Randomizer_GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum))); + GetItem_Draw(globalCtx, ABS(Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, this->actor.id, + this->actor.params, globalCtx->sceneNum) + .gi) - + 1); } else { if (flag) { func_80093D84(globalCtx->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index b0354008d..affe9fe71 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -21,6 +21,7 @@ void ItemEtcetera_SpawnSparkles(ItemEtcetera* this, GlobalContext* globalCtx); void ItemEtcetera_MoveFireArrowDown(ItemEtcetera* this, GlobalContext* globalCtx); void func_80B85B28(ItemEtcetera* this, GlobalContext* globalCtx); void ItemEtcetera_UpdateFireArrow(ItemEtcetera* this, GlobalContext* globalCtx); +GetItemEntry GetChestGameRandoGetItem(s8 room, s16 ogDrawId, GlobalContext* globalCtx); const ActorInit Item_Etcetera_InitVars = { ACTOR_ITEM_ETCETERA, @@ -229,13 +230,10 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, GlobalContext* globalCtx) { func_8002ED80(&this->actor, globalCtx, 0); if(gSaveContext.n64ddFlag && globalCtx->sceneNum == 16) { - s32 randoGetItemId = GetChestGameRandoGetItemId(this->actor.room, this->giDrawId, globalCtx); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - if (randoGetItemId != GI_NONE) { - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, globalCtx); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + if (randoGetItem.itemId != RG_NONE) { + GetItem_Draw(globalCtx, ABS(randoGetItem.gi) - 1); return; } } @@ -249,20 +247,17 @@ void ItemEtcetera_Draw(Actor* thisx, GlobalContext* globalCtx) { s32 type = this->actor.params & 0xFF; if (gSaveContext.n64ddFlag) { - s32 randoGetItemId = GI_NONE; + GetItemEntry randoGetItem = (GetItemEntry)GET_ITEM_NONE; if (type == ITEM_ETC_ARROW_FIRE) { - randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); } else if (type == ITEM_ETC_LETTER) { - randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); } - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - if (randoGetItemId != GI_NONE) { - this->giDrawId = Randomizer_GetItemModelFromId(randoGetItemId); + if (randoGetItem.itemId != RG_NONE) { + this->giDrawId = ABS(randoGetItem.gi) - 1; } } diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index f58b0927a..5e415b06c 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -215,12 +215,9 @@ void ItemOcarina_Draw(Actor* thisx, GlobalContext* globalCtx) { func_8002ED80(thisx, globalCtx, 0); if (gSaveContext.n64ddFlag) { - s32 randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + GetItem_Draw(globalCtx, ABS(randoGetItem.gi) - 1); return; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 4e6ff8ed4..bf3c5b74b 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -21,15 +21,7 @@ #include "objects/object_link_child/object_link_child.h" #include "textures/icon_item_24_static/icon_item_24_static.h" #include - -#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } - -#define CHEST_ANIM_SHORT 0 -#define CHEST_ANIM_LONG 1 - -#define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, OBJECT_INVALID } +#include typedef enum { /* 0x00 */ KNOB_ANIM_ADULT_L, @@ -490,176 +482,6 @@ static u16 D_8085361C[] = { NA_SE_VO_LI_FALL_L, }; -static GetItemEntry sGetItemTable[] = { - GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG), - GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x3C, 0x80, CHEST_ANIM_SHORT), // Ice Traps - GET_ITEM_NONE, - - GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_SINGLE_MAGIC, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_DOUBLE_MAGIC, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - - GET_ITEM_NONE, - GET_ITEM_NONE, -}; - static LinkAnimationHeader* D_80853914[PLAYER_ANIMGROUP_MAX][PLAYER_ANIMTYPE_MAX] = { /* PLAYER_ANIMGROUP_0 */ { &gPlayerAnim_003240, &gPlayerAnim_003238, &gPlayerAnim_003238, &gPlayerAnim_002BE0, &gPlayerAnim_003240, From 929f196ac8168c3b9b56d75d635aa5427bc1ce97 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 12:29:47 -0400 Subject: [PATCH 034/212] Re-implements GIMESSAGE_UNTRANSLATED as macro --- .../custom-message/CustomMessageTypes.h | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index cf0b60dbc..0c3675c3e 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -27,14 +27,17 @@ typedef struct { #define GIMESSAGE(giid, iid, english, german, french) \ { giid, iid, english, german, french } -GetItemMessage GIMESSAGE_UNTRANSLATED(u16 giid, u16 iid, std::string message) { - GetItemMessage giMessage; - giMessage.giid = giid; - giMessage.iid = iid; - giMessage.english = message; - giMessage.german = message; - giMessage.french = message; - return giMessage; -} +#define GIMESSAGE_UNTRANSLATED(giid, iid, message) \ + { giid, iid, message, message, message } + +// GetItemMessage GIMESSAGE_UNTRANSLATED(u16 giid, u16 iid, std::string message) { +// GetItemMessage giMessage; +// giMessage.giid = giid; +// giMessage.iid = iid; +// giMessage.english = message; +// giMessage.german = message; +// giMessage.french = message; +// return giMessage; +// } #endif From e9c193146cb2b4c201e66ec80f11f510482910b1 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 12:32:09 -0400 Subject: [PATCH 035/212] Removes commented out function. --- .../Enhancements/custom-message/CustomMessageTypes.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 0c3675c3e..08fae0ee4 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -30,14 +30,4 @@ typedef struct { #define GIMESSAGE_UNTRANSLATED(giid, iid, message) \ { giid, iid, message, message, message } -// GetItemMessage GIMESSAGE_UNTRANSLATED(u16 giid, u16 iid, std::string message) { -// GetItemMessage giMessage; -// giMessage.giid = giid; -// giMessage.iid = iid; -// giMessage.english = message; -// giMessage.german = message; -// giMessage.french = message; -// return giMessage; -// } - #endif From 4b7548e99867d47a750c3916268d20050cde6067 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 21:16:39 -0400 Subject: [PATCH 036/212] Throws exception if an invalid itemID is used Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943694857 --- soh/soh/Enhancements/randomizer/randomizer.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index baae0bca5..9a8cebae3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -16,6 +16,7 @@ #include #include #include +#include using json = nlohmann::json; using namespace std::literals::string_literals; @@ -4580,6 +4581,18 @@ void Randomizer::CreateCustomMessages() { CreateScrubMessages(); } +class ExtendedVanillaTableInvalidItemIdException: public std::exception { + private: + s16 itemID; + + public: + ExtendedVanillaTableInvalidItemIdException(s16 itemID): itemID(itemID) {} + std::string what() { + return itemID + " is not a valid ItemID for the extendedVanillaGetItemTable. If you are adding a new" + "item, try adding it to randoGetItemTable instead."; + } +}; + void InitRandoItemTable() { // These entries have ItemIDs from vanilla, but not GetItemIDs or entries in the old sGetItemTable GetItemEntry extendedVanillaGetItemTable[] = { @@ -4702,8 +4715,7 @@ void InitRandoItemTable() { // We should never get here. If this branch of code executes, // then you've added an item to extendedVanillaGetItemTable that // should be in randoGetItemTable. - getItemID = RG_NONE; - break; + throw ExtendedVanillaTableInvalidItemIdException(extendedVanillaGetItemTable[i].itemId); } ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, getItemID, extendedVanillaGetItemTable[i]); } From e1084c0d6da6019f2cc29c57c8927dfb2b07e405 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 21:24:03 -0400 Subject: [PATCH 037/212] Removes ARRAY_SIZE in favor of ARRAY_COUNT ARRAY_COUNT already exists in `macros.h`, I just didn't find it before. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943153833 --- soh/soh/Enhancements/randomizer/randomizer.cpp | 4 ++-- soh/soh/Enhancements/randomizer/randomizer.h | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 9a8cebae3..3e4827378 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4641,7 +4641,7 @@ void InitRandoItemTable() { GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), }; ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); - for (int i = 0; i < ARRAY_SIZE(extendedVanillaGetItemTable); i++) { + for (int i = 0; i < ARRAY_COUNT(extendedVanillaGetItemTable); i++) { extendedVanillaGetItemTable[i].modIndex = MOD_NONE; // These items should use their RG value as their getItemID. // RANDOTODO: Add the getItemID as a member of the GetItemEntry @@ -4719,7 +4719,7 @@ void InitRandoItemTable() { } ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, getItemID, extendedVanillaGetItemTable[i]); } - for (int i = 0; i < ARRAY_SIZE(randoGetItemTable); i++) { + for (int i = 0; i < ARRAY_COUNT(randoGetItemTable); i++) { randoGetItemTable[i].modIndex = MOD_RANDOMIZER; ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 38b8c11fd..fac9ba93c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -7,8 +7,6 @@ #include #include -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - class Randomizer { private: std::unordered_map itemLocations; From 2077636c920ccd59c0ff864a7cbab28682e30467 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 11 Aug 2022 21:39:30 -0400 Subject: [PATCH 038/212] Inverts CheckContainsRandoItem to CheckContainsVanillaItem. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940895135 --- .../Enhancements/randomizer/randomizer.cpp | 90 +++++++++++-------- soh/soh/Enhancements/randomizer/randomizer.h | 4 +- soh/soh/OTRGlobals.cpp | 10 +-- 3 files changed, 60 insertions(+), 44 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 3e4827378..7c7476aff 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2137,7 +2137,7 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) return GI_RUPEE_BLUE; //todo default: { - if (IsGetItemRandoExclusive(randoGet)) { + if (!IsItemVanilla(randoGet)) { return (GetItemID)randoGet; } return ogItemId; @@ -2145,50 +2145,66 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) } } -bool Randomizer::IsGetItemRandoExclusive(RandomizerGet randoGet) { +bool Randomizer::IsItemVanilla(RandomizerGet randoGet) { switch (randoGet) { - case RG_LIGHT_MEDALLION: - case RG_FOREST_MEDALLION: - case RG_FIRE_MEDALLION: - case RG_WATER_MEDALLION: - case RG_SHADOW_MEDALLION: - case RG_SPIRIT_MEDALLION: - case RG_KOKIRI_EMERALD: - case RG_GORON_RUBY: - case RG_ZORA_SAPPHIRE: - case RG_ZELDAS_LULLABY: - case RG_SUNS_SONG: - case RG_EPONAS_SONG: - case RG_SONG_OF_STORMS: - case RG_SONG_OF_TIME: - case RG_SARIAS_SONG: - case RG_MINUET_OF_FOREST: - case RG_BOLERO_OF_FIRE: - case RG_SERENADE_OF_WATER: - case RG_NOCTURNE_OF_SHADOW: - case RG_REQUIEM_OF_SPIRIT: - case RG_PRELUDE_OF_LIGHT: - case RG_PROGRESSIVE_MAGIC_METER: - case RG_DOUBLE_DEFENSE: - case RG_BOTTLE_WITH_RED_POTION: - case RG_BOTTLE_WITH_GREEN_POTION: - case RG_BOTTLE_WITH_BLUE_POTION: - case RG_BOTTLE_WITH_FAIRY: - case RG_BOTTLE_WITH_FISH: - case RG_BOTTLE_WITH_BLUE_FIRE: - case RG_BOTTLE_WITH_BUGS: - case RG_BOTTLE_WITH_POE: - case RG_BOTTLE_WITH_BIG_POE: - case RG_ICE_TRAP: + case RG_KOKIRI_SWORD: + case RG_GIANTS_KNIFE: + case RG_BIGGORON_SWORD: + case RG_DEKU_SHIELD: + case RG_HYLIAN_SHIELD: + case RG_MIRROR_SHIELD: + case RG_GORON_TUNIC: + case RG_ZORA_TUNIC: + case RG_IRON_BOOTS: + case RG_HOVER_BOOTS: + case RG_BOOMERANG: + case RG_LENS_OF_TRUTH: + case RG_MEGATON_HAMMER: + case RG_STONE_OF_AGONY: + case RG_DINS_FIRE: + case RG_FARORES_WIND: + case RG_NAYRUS_LOVE: + case RG_FIRE_ARROWS: + case RG_ICE_ARROWS: + case RG_LIGHT_ARROWS: + case RG_GERUDO_MEMBERSHIP_CARD: + case RG_MAGIC_BEAN: + case RG_WEIRD_EGG: + case RG_ZELDAS_LETTER: + case RG_POCKET_EGG: + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + case RG_GOLD_SKULLTULA_TOKEN: + case RG_PROGRESSIVE_HOOKSHOT: + case RG_PROGRESSIVE_STRENGTH: + case RG_PROGRESSIVE_BOMB_BAG: + case RG_PROGRESSIVE_BOW: + case RG_PROGRESSIVE_SLINGSHOT: + case RG_PROGRESSIVE_WALLET: + case RG_PROGRESSIVE_SCALE: + case RG_PROGRESSIVE_NUT_UPGRADE: + case RG_PROGRESSIVE_STICK_UPGRADE: + case RG_PROGRESSIVE_BOMBCHUS: + case RG_PROGRESSIVE_OCARINA: + case RG_PROGRESSIVE_GORONSWORD: + case RG_EMPTY_BOTTLE: + case RG_BOTTLE_WITH_MILK: return true; default: return false; } } -bool Randomizer::CheckContainsRandoItem(RandomizerCheck randoCheck) { +bool Randomizer::CheckContainsVanillaItem(RandomizerCheck randoCheck) { RandomizerGet randoGet = this->itemLocations[randoCheck]; - return IsGetItemRandoExclusive(randoGet); + return IsItemVanilla(randoGet); } std::string Randomizer::GetAdultAltarText() const { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index fac9ba93c..f6aa8279a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -21,7 +21,7 @@ class Randomizer { void ParseRandomizerSettingsFile(const char* spoilerFileName); void ParseHintLocationsFile(const char* spoilerFileName); void ParseItemLocationsFile(const char* spoilerFileName, bool silent); - bool IsGetItemRandoExclusive(RandomizerGet randoGet); + bool IsItemVanilla(RandomizerGet randoGet); public: @@ -48,7 +48,7 @@ class Randomizer { GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); static void CreateCustomMessages(); - bool CheckContainsRandoItem(RandomizerCheck randoCheck); + bool CheckContainsVanillaItem(RandomizerCheck randoCheck); }; #ifdef __cplusplus diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 7c1f6a66e..fefd7f613 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -286,7 +286,7 @@ extern "C" void VanillaItemTable_Init() { GET_ITEM_NONE, }; ItemTableManager::Instance->AddItemTable(MOD_NONE); - for (uint8_t i = 0; i < ARRAY_SIZE(getItemTable); i++) { + for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) { getItemTable[i].modIndex = MOD_NONE; ItemTableManager::Instance->AddItemEntry(MOD_NONE, i, getItemTable[i]); } @@ -1621,7 +1621,7 @@ extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { } extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { - if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { + if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; } else { OTRGlobals::Instance->getItemModIndex = MOD_NONE; @@ -1631,7 +1631,7 @@ extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 a extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { s16 getItemModIndex; - if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem( + if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem( OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { getItemModIndex = MOD_RANDOMIZER; } else { @@ -1642,7 +1642,7 @@ extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId } extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { - if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) { + if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; } else { OTRGlobals::Instance->getItemModIndex = MOD_NONE; @@ -1652,7 +1652,7 @@ extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerChec extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { s16 getItemModIndex; - if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) { + if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { getItemModIndex = MOD_RANDOMIZER; } else { getItemModIndex = MOD_NONE; From 69086f58c2b6bb00a273eefed4744ad456bba6ba Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 00:22:34 -0400 Subject: [PATCH 039/212] Cleanup, bugfixes, removing the `- 1`s from `z_player.c` --- .../Enhancements/randomizer/randomizer.cpp | 61 ++++++++++++++++++- .../Enhancements/randomizer/randomizerTypes.h | 3 +- soh/soh/OTRGlobals.cpp | 30 +++++---- soh/src/code/z_actor.c | 4 +- .../actors/ovl_player_actor/z_player.c | 16 ++--- 5 files changed, 86 insertions(+), 28 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 7c7476aff..e723fb871 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2196,6 +2196,65 @@ bool Randomizer::IsItemVanilla(RandomizerGet randoGet) { case RG_PROGRESSIVE_GORONSWORD: case RG_EMPTY_BOTTLE: case RG_BOTTLE_WITH_MILK: + case RG_RECOVERY_HEART: + case RG_GREEN_RUPEE: + case RG_BLUE_RUPEE: + case RG_RED_RUPEE: + case RG_PURPLE_RUPEE: + case RG_HUGE_RUPEE: + case RG_PIECE_OF_HEART: + case RG_HEART_CONTAINER: + case RG_MILK: + case RG_BOMBS_5: + case RG_BOMBS_10: + case RG_BOMBS_20: + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + case RG_BOMBCHU_DROP: + case RG_ARROWS_5: + case RG_ARROWS_10: + case RG_ARROWS_30: + case RG_DEKU_NUTS_5: + case RG_DEKU_NUTS_10: + case RG_DEKU_SEEDS_30: + case RG_DEKU_STICK_1: + case RG_RED_POTION_REFILL: + case RG_GREEN_POTION_REFILL: + case RG_BLUE_POTION_REFILL: + case RG_TREASURE_GAME_HEART: + case RG_TREASURE_GAME_GREEN_RUPEE: + case RG_BUY_DEKU_NUT_5: + case RG_BUY_ARROWS_30: + case RG_BUY_ARROWS_50: + case RG_BUY_BOMBS_525: + case RG_BUY_DEKU_NUT_10: + case RG_BUY_DEKU_STICK_1: + case RG_BUY_BOMBS_10: + case RG_BUY_FISH: + case RG_BUY_RED_POTION_30: + case RG_BUY_GREEN_POTION: + case RG_BUY_BLUE_POTION: + case RG_BUY_HYLIAN_SHIELD: + case RG_BUY_DEKU_SHIELD: + case RG_BUY_GORON_TUNIC: + case RG_BUY_ZORA_TUNIC: + case RG_BUY_HEART: + case RG_BUY_BOMBCHU_10: + case RG_BUY_BOMBCHU_20: + case RG_BUY_BOMBCHU_5: + case RG_BUY_DEKU_SEEDS_30: + case RG_SOLD_OUT: + case RG_BUY_BLUE_FIRE: + case RG_BUY_BOTTLE_BUG: + case RG_BUY_POE: + case RG_BUY_FAIRYS_SPIRIT: + case RG_BUY_ARROWS_10: + case RG_BUY_BOMBS_20: + case RG_BUY_BOMBS_30: + case RG_BUY_BOMBS_535: + case RG_BUY_RED_POTION_40: + case RG_BUY_RED_POTION_50: return true; default: return false; @@ -4641,7 +4700,7 @@ void InitRandoItemTable() { // These do not have ItemIDs or GetItemIDs from vanilla, so I'm using their // RandomizerGet enum values for both. GetItemEntry randoGetItemTable[] = { - GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0, CHEST_ANIM_SHORT), + GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0x80, CHEST_ANIM_SHORT), GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index e8206dac2..55e28845c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -954,7 +954,8 @@ typedef enum { RG_BUY_RED_POTION_40, RG_BUY_RED_POTION_50, RG_TRIFORCE, - RG_HINT + RG_HINT, + RG_MAX } RandomizerGet; typedef enum { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index fefd7f613..3d298fb71 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -288,7 +288,12 @@ extern "C" void VanillaItemTable_Init() { ItemTableManager::Instance->AddItemTable(MOD_NONE); for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) { getItemTable[i].modIndex = MOD_NONE; - ItemTableManager::Instance->AddItemEntry(MOD_NONE, i, getItemTable[i]); + // The vanilla item table array started with ITEM_BOMBS_5, + // but the GetItemID enum started with GI_NONE. Then everywhere + // that table was accessed used `GetItemID - 1`. This allows the + // "first" item of the new map to start at 1, syncing it up with + // the GetItemID values and removing the need for the `- 1` + ItemTableManager::Instance->AddItemEntry(MOD_NONE, i+1, getItemTable[i]); } } @@ -1606,25 +1611,18 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check) } extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - if (OTRGlobals::Instance->getItemModIndex != MOD_NONE) { - getItemID++; // counteracts the - 1 offset used for vanilla table - } - return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); } extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { - if (tableID == MOD_NONE) { - getItemID--; // counteracts the - 1 offset used for vanilla table - } return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID); } extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { - OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; - } else { OTRGlobals::Instance->getItemModIndex = MOD_NONE; + } else { + OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; } return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); } @@ -1633,9 +1631,9 @@ extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId s16 getItemModIndex; if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem( OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { - getItemModIndex = MOD_RANDOMIZER; - } else { getItemModIndex = MOD_NONE; + } else { + getItemModIndex = MOD_RANDOMIZER; } s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); return ItemTable_RetrieveEntry(getItemModIndex, itemID); @@ -1643,9 +1641,9 @@ extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { - OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; - } else { OTRGlobals::Instance->getItemModIndex = MOD_NONE; + } else { + OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; } return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); } @@ -1653,9 +1651,9 @@ extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerChec extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { s16 getItemModIndex; if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { - getItemModIndex = MOD_RANDOMIZER; - } else { getItemModIndex = MOD_NONE; + } else { + getItemModIndex = MOD_RANDOMIZER; } s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); return ItemTable_RetrieveEntry(getItemModIndex, itemID); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 745524909..206b17be5 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1977,8 +1977,8 @@ s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzR Player* player = GET_PLAYER(globalCtx); if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { - if ((((player->heldActor != NULL) || (actor == player->targetActor)) && (getItemId > GI_NONE) && - (getItemId < GI_MAX)) || + if ((((player->heldActor != NULL) || (actor == player->targetActor)) && + ((!gSaveContext.n64ddFlag && ((getItemId > GI_NONE) && (getItemId < GI_MAX))) || (gSaveContext.n64ddFlag && ((getItemId > RG_NONE) && (getItemId < RG_MAX))))) || (!(player->stateFlags1 & 0x20000800))) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index bf3c5b74b..a8b8dd71f 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -1410,7 +1410,7 @@ s32 func_808332E4(Player* this) { void func_808332F4(Player* this, GlobalContext* globalCtx) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { - giEntry = ItemTable_Retrieve(this->getItemId - 1); + giEntry = ItemTable_Retrieve(this->getItemId); } else { giEntry = this->getItemEntry; } @@ -4862,7 +4862,7 @@ s32 func_8083B040(Player* this, GlobalContext* globalCtx) { if (sp2C >= 0) { if (this->getItemEntry.objectId == OBJECT_INVALID) { - giEntry = ItemTable_Retrieve(D_80854528[sp2C] - 1); + giEntry = ItemTable_Retrieve(D_80854528[sp2C]); } else { giEntry = this->getItemEntry; } @@ -6100,10 +6100,10 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->getItemId = iREG(68); } - if (this->getItemId < GI_MAX) { + if (this->getItemId < GI_MAX || (gSaveContext.n64ddFlag && this->getItemId < RG_MAX)) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { - giEntry = ItemTable_Retrieve(this->getItemId - 1); + giEntry = ItemTable_Retrieve(this->getItemId); } else { giEntry = this->getItemEntry; } @@ -6160,7 +6160,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { if (this->getItemId != GI_NONE) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { - giEntry = ItemTable_Retrieve(-this->getItemId - 1); + giEntry = ItemTable_Retrieve(-this->getItemId); } else { giEntry = this->getItemEntry; } @@ -6173,7 +6173,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { if (((Item_CheckObtainability(giEntry.itemId) == ITEM_NONE) && (giEntry.field & 0x40)) || ((Item_CheckObtainability(giEntry.itemId) != ITEM_NONE) && (giEntry.field & 0x20))) { this->getItemId = -GI_RUPEE_BLUE; - giEntry = ItemTable_Retrieve(GI_RUPEE_BLUE - 1); + giEntry = ItemTable_Retrieve(GI_RUPEE_BLUE); } } @@ -12546,7 +12546,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { if (this->unk_84F == 0) { if (this->getItemEntry.objectId == OBJECT_INVALID) { - giEntry = ItemTable_Retrieve(this->getItemId - 1); + giEntry = ItemTable_Retrieve(this->getItemId); } else { giEntry = this->getItemEntry; } @@ -13192,7 +13192,7 @@ void func_8084F104(Player* this, GlobalContext* globalCtx) { func_80853148(globalCtx, targetActor); } else { - GetItemEntry giEntry = ItemTable_Retrieve(D_80854528[this->exchangeItemId - 1] - 1); + GetItemEntry giEntry = ItemTable_Retrieve(D_80854528[this->exchangeItemId - 1]); if (this->itemActionParam >= PLAYER_AP_LETTER_ZELDA) { if (giEntry.gi >= 0) { From 4cc492f383094550d89b12c9759c83130d91f1e6 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 00:28:19 -0400 Subject: [PATCH 040/212] Fixes some funky formatting that got committed earlier. --- soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c | 3 +-- soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 953c4e74b..3b96ad22f 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -176,8 +176,7 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { this->unk_17C = func_8002EBCC; if (gSaveContext.n64ddFlag) { this->giDrawId = - ABS(Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).gi) - - 1; + ABS(Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).gi) - 1; } else { this->giDrawId = GID_BOMBCHU; } diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index fb83d2df6..07fbb5a26 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -99,10 +99,8 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) { } if (gSaveContext.n64ddFlag) { - GetItem_Draw(globalCtx, ABS(Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, this->actor.id, - this->actor.params, globalCtx->sceneNum) - .gi) - - 1); + GetItem_Draw(globalCtx, ABS(Randomizer_GetRandomizedItem( + GI_HEART_CONTAINER_2, this->actor.id,this->actor.params, globalCtx->sceneNum).gi) - 1); } else { if (flag) { func_80093D84(globalCtx->state.gfxCtx); From 0c334615b65abe06a7d7e9a3ceb373c6e28e7203 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 00:38:09 -0400 Subject: [PATCH 041/212] Adds else if to added fanfare sound cases. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940112924 and https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940113492 --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index a8b8dd71f..1f1cd2f2c 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12584,13 +12584,16 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } Audio_PlayFanfare(temp1); } - } else { + } else if (giEntry.modIndex == MOD_RANDOMIZER) { if (this->getItemId == RG_DOUBLE_DEFENSE || this->getItemId == RG_MAGIC_SINGLE || this->getItemId == RG_MAGIC_DOUBLE) { Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); } else { Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } + } else { + // Just in case something weird happens with MOD_INDEX + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } } else { if (giEntry.modIndex == MOD_NONE) { @@ -12609,13 +12612,16 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } Audio_PlayFanfare(temp1); } - } else { + } else if (giEntry.modIndex == MOD_RANDOMIZER) { if (giEntry.itemId == RG_DOUBLE_DEFENSE || giEntry.itemId == RG_MAGIC_SINGLE || giEntry.itemId == RG_MAGIC_DOUBLE) { Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); } else { Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } + } else { + // Just in case something weird happens with modIndex. + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } } this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; From 11db45eef6d6c7cbd2b438de5a69665ce0544738 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 01:32:36 -0400 Subject: [PATCH 042/212] Extends GetItemEntry to include getItemId Also adapts some existing calls for both the entry and the id to only get the entry. --- .../Enhancements/item-tables/ItemTableTypes.h | 7 +- .../Enhancements/randomizer/randomizer.cpp | 152 +++-------- soh/soh/OTRGlobals.cpp | 247 +++++++++--------- soh/src/code/z_en_item00.c | 2 - soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 7 +- 5 files changed, 171 insertions(+), 244 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 844f791fe..affdf267f 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -6,11 +6,11 @@ #define CHEST_ANIM_SHORT 0 #define CHEST_ANIM_LONG 1 -#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } +#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \ + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId } #define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, 0 } + { ITEM_NONE, 0, 0, 0, 0, 0, 0 } typedef struct { /* 0x00 */ uint16_t itemId; @@ -19,4 +19,5 @@ typedef struct { /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? + /* 0x08 */ uint16_t getItemId; } GetItemEntry; // size = 0x08 diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index e723fb871..8895f90c2 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4671,131 +4671,61 @@ class ExtendedVanillaTableInvalidItemIdException: public std::exception { void InitRandoItemTable() { // These entries have ItemIDs from vanilla, but not GetItemIDs or entries in the old sGetItemTable GetItemEntry extendedVanillaGetItemTable[] = { - GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_LIGHT_MEDALLION), + GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG, + MOD_NONE, RG_FOREST_MEDALLION), + GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_FIRE_MEDALLION), + GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_WATER_MEDALLION), + GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG, + MOD_NONE, RG_SHADOW_MEDALLION), + GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG, + MOD_NONE, RG_SPIRIT_MEDALLION), - GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_KOKIRI_EMERALD), + GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_GORON_RUBY), + GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_ZORA_SAPPHIRE), - GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_ZELDAS_LULLABY), + GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SUNS_SONG), + GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_EPONAS_SONG), + GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SONG_OF_STORMS), + GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SONG_OF_TIME), + GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SARIAS_SONG), - GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_MINUET_OF_FOREST), + GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_BOLERO_OF_FIRE), + GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SERENADE_OF_WATER), + GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_NOCTURNE_OF_SHADOW), + GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_REQUIEM_OF_SPIRIT), + GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_PRELUDE_OF_LIGHT), }; // These do not have ItemIDs or GetItemIDs from vanilla, so I'm using their // RandomizerGet enum values for both. GetItemEntry randoGetItemTable[] = { - GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0x80, CHEST_ANIM_SHORT, MOD_RANDOMIZER, RG_ICE_TRAP), + GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_MAGIC_SINGLE), + GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_MAGIC_DOUBLE), + GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_DOUBLE_DEFENSE), - GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), - GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), + GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_RED_POTION), + GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_GREEN_POTION), + GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_POTION), + GET_ITEM(RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_FAIRY), + GET_ITEM(RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_FISH), + GET_ITEM(RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_FIRE), + GET_ITEM(RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BUGS), + GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_POE), + GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BIG_POE), }; ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); for (int i = 0; i < ARRAY_COUNT(extendedVanillaGetItemTable); i++) { - extendedVanillaGetItemTable[i].modIndex = MOD_NONE; - // These items should use their RG value as their getItemID. - // RANDOTODO: Add the getItemID as a member of the GetItemEntry - // struct, since that value will be useful in other places as well. - uint8_t getItemID; - switch (extendedVanillaGetItemTable[i].itemId) { - case ITEM_MEDALLION_LIGHT: - getItemID = RG_LIGHT_MEDALLION; - break; - case ITEM_MEDALLION_FOREST: - getItemID = RG_FOREST_MEDALLION; - break; - case ITEM_MEDALLION_FIRE: - getItemID = RG_FIRE_MEDALLION; - break; - case ITEM_MEDALLION_WATER: - getItemID = RG_WATER_MEDALLION; - break; - case ITEM_MEDALLION_SHADOW: - getItemID = RG_SHADOW_MEDALLION; - break; - case ITEM_MEDALLION_SPIRIT: - getItemID = RG_SPIRIT_MEDALLION; - break; - case ITEM_KOKIRI_EMERALD: - getItemID = RG_KOKIRI_EMERALD; - break; - case ITEM_GORON_RUBY: - getItemID = RG_GORON_RUBY; - break; - case ITEM_ZORA_SAPPHIRE: - getItemID = RG_ZORA_SAPPHIRE; - break; - case ITEM_SONG_LULLABY: - getItemID = RG_ZELDAS_LULLABY; - break; - case ITEM_SONG_SUN: - getItemID = RG_SUNS_SONG; - break; - case ITEM_SONG_EPONA: - getItemID = RG_EPONAS_SONG; - break; - case ITEM_SONG_STORMS: - getItemID = RG_SONG_OF_STORMS; - break; - case ITEM_SONG_TIME: - getItemID = RG_SONG_OF_TIME; - break; - case ITEM_SONG_SARIA: - getItemID = RG_SARIAS_SONG; - break; - case ITEM_SONG_MINUET: - getItemID = RG_MINUET_OF_FOREST; - break; - case ITEM_SONG_BOLERO: - getItemID = RG_BOLERO_OF_FIRE; - break; - case ITEM_SONG_SERENADE: - getItemID = RG_SERENADE_OF_WATER; - break; - case ITEM_SONG_NOCTURNE: - getItemID = RG_NOCTURNE_OF_SHADOW; - break; - case ITEM_SONG_REQUIEM: - getItemID = RG_REQUIEM_OF_SPIRIT; - break; - case ITEM_SONG_PRELUDE: - getItemID = RG_PRELUDE_OF_LIGHT; - break; - default: - // We should never get here. If this branch of code executes, - // then you've added an item to extendedVanillaGetItemTable that - // should be in randoGetItemTable. - throw ExtendedVanillaTableInvalidItemIdException(extendedVanillaGetItemTable[i].itemId); - } - ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, getItemID, extendedVanillaGetItemTable[i]); + ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, extendedVanillaGetItemTable[i].getItemId, extendedVanillaGetItemTable[i]); } for (int i = 0; i < ARRAY_COUNT(randoGetItemTable); i++) { - randoGetItemTable[i].modIndex = MOD_RANDOMIZER; ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); } } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 3d298fb71..e8d3a74c4 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -159,135 +159,134 @@ extern "C" void OTRAudio_Exit() { extern "C" void VanillaItemTable_Init() { GetItemEntry getItemTable[] = { - GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG), - GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_5), + GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5), + GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_10), + GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOW), + GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SLINGSHOT), + GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOMERANG), + GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_1), + GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HOOKSHOT), + GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LONGSHOT), + GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LENS), + GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_ZELDA), + GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_OOT), + GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HAMMER), + GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COJIRO), + GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOTTLE), + GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_RED), + GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_GREEN), + GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_BLUE), + GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FAIRY), + GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK_BOTTLE), + GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_RUTO), + GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BEAN), + GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SKULL), + GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SPOOKY), + GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CHICKEN), + GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_KEATON), + GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_BUNNY), + GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_TRUTH), + GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_EGG), + GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_CUCCO), + GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_MUSHROOM), + GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_POTION), + GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SAW), + GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BROKEN), + GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_PRESCRIPTION), + GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FROG), + GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_EYEDROPS), + GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CLAIM_CHECK), + GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KOKIRI), + GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KNIFE), + GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_DEKU), + GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_HYLIAN), + GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SHIELD_MIRROR), + GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_GORON), + GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_ZORA), + GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_IRON), + GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_HOVER), + GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_40), + GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_50), + GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_20), + GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_30), + GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_40), + GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_SILVER), + GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_GOLD), + GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_SILVER), + GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_GOLD), + GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_STONE_OF_AGONY), + GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GERUDO_CARD), + GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_FAIRY), + GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_5), + GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER), + GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE), + GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_KEY_BOSS), + GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COMPASS), + GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MAP), + GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_KEY_SMALL), + GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_SMALL), + GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_LARGE), + GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_ADULT), + GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_GIANT), + GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WEIRD_EGG), + GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART), + GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_SMALL), + GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_MEDIUM), + GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_LARGE), + GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN), + GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE), + GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED), + GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER_2), + GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK), + GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GORON), + GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_ZORA), + GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GERUDO), + GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BRACELET), + GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE), + GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GOLD), + GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BGS), + GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_FIRE), + GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_ICE), + GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_LIGHT), + GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_SKULL_TOKEN), + GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_DINS_FIRE), + GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FARORES_WIND), + GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_NAYRUS_LOVE), + GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_30), + GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_40), + GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_5), + GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_10), + GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5_2), + GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_10), + GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_1), + GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_10), + GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_20), + GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_30), + GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_30), + GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_5), + GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_20), + GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FISH), + GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BUGS), + GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BLUE_FIRE), + GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POE), + GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BIG_POE), + GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_DOOR_KEY), + GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN_LOSE), + GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE_LOSE), + GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED_LOSE), + GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE_LOSE), + GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE_WIN), + GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_20), + GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_30), + GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_30), + GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_40), + GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_50), GET_ITEM_NONE, GET_ITEM_NONE, }; ItemTableManager::Instance->AddItemTable(MOD_NONE); for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) { - getItemTable[i].modIndex = MOD_NONE; // The vanilla item table array started with ITEM_BOMBS_5, // but the GetItemID enum started with GI_NONE. Then everywhere // that table was accessed used `GetItemID - 1`. This allows the diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index d3325a104..352f2b466 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1335,7 +1335,6 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag && (this->getItemId != GI_NONE || this->actor.params == ITEM00_SMALL_KEY)) { f32 mtxScale = 16.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); - s32 randoGetItemId = Randomizer_GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); @@ -1395,7 +1394,6 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { f32 mtxScale = 16.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); - s32 randoGetItemId = Randomizer_GetRandomizedItemId(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index e41641b13..38ccd5b5c 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -293,15 +293,14 @@ void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, Rando !(gSaveContext.eventChkInf[5] & sheikType)) { gSaveContext.eventChkInf[5] |= sheikType; } else if (!(gSaveContext.eventChkInf[5] & sheikType)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, ogSongId); + player->getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { - if (func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f)) { - player->getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); + if (func_8002F434(&sheik->actor, globalCtx, player->getItemEntry.getItemId, 10000.0f, 100.0f)) { player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } } else if (check != RC_SHEIK_AT_TEMPLE) { - func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f); + func_8002F434(&sheik->actor, globalCtx, player->getItemEntry.getItemId, 10000.0f, 100.0f); } } } From 58c9f64a1689fbf3364beec0f362103b02c856a0 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 01:44:19 -0400 Subject: [PATCH 043/212] Extends GetItemEntry to include GID. This allows for using it later when drawing freestanding items. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943168136 --- soh/soh/Enhancements/item-tables/ItemTableTypes.h | 5 +++-- soh/src/code/z_en_item00.c | 4 ++-- soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c | 2 +- soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c | 4 ++-- soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index affdf267f..f5a2c1f68 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -7,7 +7,7 @@ #define CHEST_ANIM_LONG 1 #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId } + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId } #define GET_ITEM_NONE \ { ITEM_NONE, 0, 0, 0, 0, 0, 0 } @@ -20,4 +20,5 @@ typedef struct { /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? /* 0x08 */ uint16_t getItemId; -} GetItemEntry; // size = 0x08 + /* 0x10 */ uint16_t gid; // Stores the GID value unmodified for future reference. +} GetItemEntry; // size = 0x10 diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 352f2b466..b2ac1bd72 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1338,7 +1338,7 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, ABS(randoGetItemEntry.gi) - 1); + GetItem_Draw(globalCtx, randoGetItemEntry.gid); } else { s32 texIndex = this->actor.params - 3; @@ -1397,7 +1397,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, ABS(randoGetItemEntry.gi) - 1); + GetItem_Draw(globalCtx, randoGetItemEntry.gid); } else { s32 pad; diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 3b96ad22f..34f16e8df 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -533,7 +533,7 @@ void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx) { GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - GetItem_Draw(globalCtx, ABS(randoGetItem.gi) - 1); + GetItem_Draw(globalCtx, randoGetItem.gid); } else { GetItem_Draw(globalCtx, GID_HEART_PIECE); } diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index 07fbb5a26..0c6e3dedc 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -99,8 +99,8 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) { } if (gSaveContext.n64ddFlag) { - GetItem_Draw(globalCtx, ABS(Randomizer_GetRandomizedItem( - GI_HEART_CONTAINER_2, this->actor.id,this->actor.params, globalCtx->sceneNum).gi) - 1); + GetItem_Draw(globalCtx, Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, + this->actor.id,this->actor.params, globalCtx->sceneNum).gid); } else { if (flag) { func_80093D84(globalCtx->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index affe9fe71..7b8f97ae6 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -233,7 +233,7 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, GlobalContext* globalCtx) { GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, globalCtx); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); if (randoGetItem.itemId != RG_NONE) { - GetItem_Draw(globalCtx, ABS(randoGetItem.gi) - 1); + GetItem_Draw(globalCtx, randoGetItem.gid); return; } } @@ -257,7 +257,7 @@ void ItemEtcetera_Draw(Actor* thisx, GlobalContext* globalCtx) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); if (randoGetItem.itemId != RG_NONE) { - this->giDrawId = ABS(randoGetItem.gi) - 1; + this->giDrawId = randoGetItem.gid; } } From d167f4a26362b3e2aebe914c7e1fbbf4740f2296 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 11:41:10 -0400 Subject: [PATCH 044/212] Rando-specific items use new textId again. This got lost when merging develop-zhora in because I didn't have custom messages merged when I started this. --- .../Enhancements/randomizer/randomizer.cpp | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 8895f90c2..497f06bf9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4704,22 +4704,31 @@ void InitRandoItemTable() { // RandomizerGet enum values for both. GetItemEntry randoGetItemTable[] = { GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0x80, CHEST_ANIM_SHORT, MOD_RANDOMIZER, RG_ICE_TRAP), - GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_MAGIC_SINGLE), - GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_MAGIC_DOUBLE), - GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_DOUBLE_DEFENSE), + GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, + RG_MAGIC_SINGLE), + GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, + RG_MAGIC_DOUBLE), + GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, + RG_DOUBLE_DEFENSE), - GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, - MOD_RANDOMIZER, RG_BOTTLE_WITH_RED_POTION), - GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, - MOD_RANDOMIZER, RG_BOTTLE_WITH_GREEN_POTION), - GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, - MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_POTION), - GET_ITEM(RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_FAIRY), - GET_ITEM(RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_FISH), - GET_ITEM(RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_FIRE), - GET_ITEM(RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BUGS), - GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_POE), - GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BIG_POE), + GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_RED_POTION), + GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_GREEN_POTION), + GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_POTION), + GET_ITEM(RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_FAIRY), + GET_ITEM(RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_FISH), + GET_ITEM(RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_FIRE), + GET_ITEM(RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_BUGS), + GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_POE), + GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BIG_POE), }; ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); for (int i = 0; i < ARRAY_COUNT(extendedVanillaGetItemTable); i++) { From 105eac4e533b30eaab60eefa0ccba2197703fb10 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 11:49:03 -0400 Subject: [PATCH 045/212] Sets global modIndex to MOD_NONE on scene load Fixes a crash when buying items in shops due to them not triggering the rando code that normally sets these items. May have also been crashing vanilla playthroughs. --- soh/soh/z_play_otr.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/z_play_otr.cpp b/soh/soh/z_play_otr.cpp index 9921d3050..8e7b21003 100644 --- a/soh/soh/z_play_otr.cpp +++ b/soh/soh/z_play_otr.cpp @@ -60,6 +60,7 @@ void OTRGameplay_InitScene(GlobalContext* globalCtx, s32 spawn) { globalCtx->cUpElfMsgs = nullptr; globalCtx->setupPathList = nullptr; globalCtx->numSetupActors = 0; + OTRGlobals::Instance->getItemModIndex = MOD_NONE; Object_InitBank(globalCtx, &globalCtx->objectCtx); LightContext_Init(globalCtx, &globalCtx->lightCtx); TransitionActor_InitContext(&globalCtx->state, &globalCtx->transiActorCtx); From 9ed7feb30aebb53b82912184965787151a4bec5f Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 12:13:46 -0400 Subject: [PATCH 046/212] Realized I had the bgm conditions wrong. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 1f1cd2f2c..f04bf93c9 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12566,7 +12566,8 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } Player_SetPendingFlag(this, globalCtx); - if (this->getItemEntry.objectId != OBJECT_INVALID) { + if (this->getItemEntry.objectId == OBJECT_INVALID) { + // Use this if player does not have a getItemEntry if (giEntry.modIndex == MOD_NONE) { if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || @@ -12596,6 +12597,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } } else { + // Use this if we do have a getItemEntry if (giEntry.modIndex == MOD_NONE) { if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) || ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) || From 7cef38a70aecc8e9328705526cb981e487131561 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 13:05:50 -0400 Subject: [PATCH 047/212] Fixes "static drops" (i.e. sticks from withered babas) --- soh/soh/Enhancements/randomizer/randomizer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 497f06bf9..a2b94be7e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2147,6 +2147,7 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) bool Randomizer::IsItemVanilla(RandomizerGet randoGet) { switch (randoGet) { + case RG_NONE: case RG_KOKIRI_SWORD: case RG_GIANTS_KNIFE: case RG_BIGGORON_SWORD: From 76282830d3f0bdf605f3b050e51471fdbaaf87fd Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 15:30:18 -0400 Subject: [PATCH 048/212] Fixes LACS/Prelude situation... again. --- soh/include/z64player.h | 1 + soh/src/code/z_actor.c | 3 ++- soh/src/code/z_play.c | 10 +++++----- soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 16 +++++++++------- .../overlays/actors/ovl_player_actor/z_player.c | 11 ++++++++++- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 6b18399ca..dcb7ade06 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -365,6 +365,7 @@ typedef enum { FLAG_SCENE_TREASURE, FLAG_SCENE_CLEAR, FLAG_SCENE_COLLECTIBLE, + FLAG_EVENT_CHECK_INF, } FlagType; typedef struct { diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 206b17be5..5bfa6572e 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1959,7 +1959,8 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { Player* player = GET_PLAYER(globalCtx); if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { - if (((player->heldActor != NULL) && (getItemId > GI_NONE) && (getItemId < GI_MAX)) || + if (((player->heldActor != NULL) && ((getItemId > GI_NONE) && (getItemId < GI_MAX)) || + (gSaveContext.n64ddFlag && (getItemId > RG_NONE) && (getItemId < RG_MAX))) || (!(player->stateFlags1 & 0x20000800))) { if ((getItemId != GI_NONE)) { player->getItemId = getItemId; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index f05ef917f..fb35c5209 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -243,11 +243,11 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && globalCtx->sceneLoadFlag == 0) { GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT); - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT); - GiveItemWithoutActor(globalCtx, getItemId); - player->getItemEntry = getItem; - player->pendingFlag.flagID = 0x1E; - player->pendingFlag.flagType = FLAG_SCENE_TREASURE; + if (player->pendingFlag.flagType == FLAG_NONE && GiveItemWithoutActor(globalCtx, getItem.getItemId)) { + player->getItemEntry = getItem; + player->pendingFlag.flagID = 0x1E; + player->pendingFlag.flagType = FLAG_SCENE_TREASURE; + } } } diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index 38ccd5b5c..3aa000b4c 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -289,18 +289,20 @@ void func_80B3CA38(EnXc* this, GlobalContext* globalCtx) { void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, RandomizerCheck check, int sheikType, GetItemID ogSongId) { Player* player = GET_PLAYER(globalCtx); - if (sheik->actor.parent != NULL && sheik->actor.parent->id == player->actor.id && - !(gSaveContext.eventChkInf[5] & sheikType)) { - gSaveContext.eventChkInf[5] |= sheikType; - } else if (!(gSaveContext.eventChkInf[5] & sheikType)) { - player->getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); + if (!(gSaveContext.eventChkInf[5] & sheikType)) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { - if (func_8002F434(&sheik->actor, globalCtx, player->getItemEntry.getItemId, 10000.0f, 100.0f)) { + if (func_8002F434(&sheik->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f)) { + player->getItemEntry = getItemEntry; player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } } else if (check != RC_SHEIK_AT_TEMPLE) { - func_8002F434(&sheik->actor, globalCtx, player->getItemEntry.getItemId, 10000.0f, 100.0f); + if (func_8002F434(&sheik->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f)) { + player->getItemEntry = getItemEntry; + player->pendingFlag.flagID = 0x55; + player->pendingFlag.flagType = FLAG_EVENT_CHECK_INF; + } } } } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index f04bf93c9..c0f9a106c 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -1602,6 +1602,7 @@ void func_808337D4(GlobalContext* globalCtx, Player* this) { this->interactRangeActor = spawnedActor; this->heldActor = spawnedActor; this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->unk_3BC.y = spawnedActor->shape.rot.y - this->actor.shape.rot.y; this->stateFlags1 |= PLAYER_STATE1_11; } @@ -6082,6 +6083,9 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { case FLAG_SCENE_TREASURE: Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); break; + case FLAG_EVENT_CHECK_INF: + Flags_SetEventChkInf(globalCtx, this->pendingFlag.flagID); + break; case FLAG_NONE: default: break; @@ -6135,6 +6139,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { (interactedActor->id == ACTOR_EN_KAREBABA || interactedActor->id == ACTOR_EN_DEKUBABA))) { func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; return 0; } @@ -6154,6 +6159,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { @@ -6586,6 +6592,7 @@ s32 func_8083F7BC(Player* this, GlobalContext* globalCtx) { this->stateFlags1 |= PLAYER_STATE1_11; this->interactRangeActor = &wallPolyActor->actor; this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->currentYaw = this->actor.wallYaw + 0x8000; func_80832224(this); @@ -12525,6 +12532,7 @@ void func_8084DF6C(GlobalContext* globalCtx, Player* this) { this->unk_862 = 0; this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; func_8005B1A4(Gameplay_GetCamera(globalCtx, 0)); } @@ -12626,7 +12634,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } } - this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; + //this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } else { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) { @@ -12638,6 +12646,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { func_80852FFC(globalCtx, NULL, 8); } this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } } From 9940c9ed289ec59e382e59c25f4de90722fc8a2e Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 16:38:33 -0400 Subject: [PATCH 049/212] Fixes too many arguments error. Not sure why this didn't fail to build on Windows before. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index c0f9a106c..615b39894 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6084,7 +6084,7 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); break; case FLAG_EVENT_CHECK_INF: - Flags_SetEventChkInf(globalCtx, this->pendingFlag.flagID); + Flags_SetEventChkInf(this->pendingFlag.flagID); break; case FLAG_NONE: default: From 6c3fff741269c070da09d0a8ea23cde6973adfc4 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 22:56:46 -0400 Subject: [PATCH 050/212] Fixes Link's Pocket items. --- soh/src/code/z_sram.c | 139 ++++++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 67 deletions(-) diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 8661495bd..c6c5c833a 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -697,74 +697,79 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { } if(Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { - s32 giid = Randomizer_GetItemIdFromKnownCheck(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY); + GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY); + s32 giid = getItem.getItemId; - if (giid >= RG_ZELDAS_LULLABY && giid <= RG_PRELUDE_OF_LIGHT) { - GiveLinkSong(giid); - } else if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED || - giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_GOLD) { - GiveLinkRupeesByGetItemId(giid); - } else if (giid == GI_BOMBCHUS_10 || giid == GI_BOMBCHUS_5 || giid == GI_BOMBCHUS_20) { - GiveLinkBombchus(giid); - } else if (giid == GI_STICKS_1 || giid == GI_STICKS_5 || giid == GI_STICKS_10) { - GiveLinkDekuSticksByGetItemId(giid); - } else if (giid == GI_NUTS_5 || giid == GI_NUTS_10) { - GiveLinkDekuNutsByGetItemId(giid); - } else if (giid == GI_BEAN) { - GiveLinkBeans(); - } else if (giid >= RG_KOKIRI_EMERALD && giid <= RG_LIGHT_MEDALLION) { - GiveLinkDungeonReward(giid); - } else if (giid == GI_SWORD_KOKIRI) { - GiveLinkKokiriSword(); - } else if (giid == GI_SWORD_BGS) { - GiveLinkBiggoronSword(); - } else if (giid == GI_SWORD_KNIFE) { - GiveLinkGiantsKnife(); - } else if (giid == GI_SHIELD_DEKU) { - GiveLinkDekuShield(); - } else if (giid == GI_SHIELD_HYLIAN) { - GiveLinkHylianShield(); - } else if (giid == GI_SHIELD_MIRROR) { - GiveLinkMirrorShield(); - } else if (giid == GI_TUNIC_GORON) { - GiveLinkGoronTunic(); - } else if (giid == GI_TUNIC_ZORA) { - GiveLinkZoraTunic(); - } else if (giid == GI_BOOTS_IRON) { - GiveLinkIronBoots(); - } else if (giid == GI_BOOTS_HOVER) { - GiveLinkHoverBoots(); - } else if (giid == GI_SLINGSHOT || giid == GI_BULLET_BAG_40 || giid == GI_BULLET_BAG_50) { - GiveLinkBulletBagUpgrade(giid); - } else if (giid == GI_BOW || giid == GI_QUIVER_40 || giid == GI_QUIVER_50) { - GiveLinkQuiverUpgrade(giid); - } else if (giid == GI_BOMB_BAG_20 || giid == GI_BOMB_BAG_30 || giid == GI_BOMB_BAG_40) { - GiveLinkBombBagUpgrade(giid); - } else if (giid == GI_BRACELET || giid == GI_GAUNTLETS_SILVER || giid == GI_GAUNTLETS_GOLD) { - GiveLinkStrengthUpgrade(giid); - } else if (giid == GI_SCALE_SILVER || giid == GI_SCALE_GOLD) { - GiveLinkScaleUpgrade(giid); - } else if (giid == GI_WALLET_ADULT || giid == GI_WALLET_GIANT) { - GiveLinkWalletUpgrade(giid); - } else if (giid == GI_STONE_OF_AGONY) { - GiveLinkStoneOfAgony(); - } else if (giid == GI_GERUDO_CARD) { - GiveLinkGerudoCard(); - } else if (giid == GI_HEART_PIECE) { - GiveLinkPieceOfHeart(); - } else if (giid == GI_HEART_CONTAINER) { - GiveLinkHeartContainer(); - } else if (giid == GI_STICK_UPGRADE_20 || giid == GI_STICK_UPGRADE_30) { - GiveLinkDekuStickUpgrade(giid); - } else if (giid == GI_NUT_UPGRADE_30 || giid == GI_NUT_UPGRADE_40) { - GiveLinkDekuNutUpgrade(giid); - } else if (giid == RG_MAGIC_SINGLE || giid == RG_MAGIC_DOUBLE) { - GiveLinkMagic(giid); - } else if (giid == RG_DOUBLE_DEFENSE) { - GiveLinkDoubleDefense(); - } else { - s32 iid = Randomizer_GetItemIDFromGetItemID(giid); - if (iid != -1) INV_CONTENT(iid) = iid; + if (getItem.modIndex == MOD_NONE) { + if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED || + giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_GOLD) { + GiveLinkRupeesByGetItemId(giid); + } else if (giid == GI_BOMBCHUS_10 || giid == GI_BOMBCHUS_5 || giid == GI_BOMBCHUS_20) { + GiveLinkBombchus(giid); + } else if (giid == GI_STICKS_1 || giid == GI_STICKS_5 || giid == GI_STICKS_10) { + GiveLinkDekuSticksByGetItemId(giid); + } else if (giid == GI_NUTS_5 || giid == GI_NUTS_10) { + GiveLinkDekuNutsByGetItemId(giid); + } else if (giid == GI_BEAN) { + GiveLinkBeans(); + } else if (giid == GI_SWORD_KOKIRI) { + GiveLinkKokiriSword(); + } else if (giid == GI_SWORD_BGS) { + GiveLinkBiggoronSword(); + } else if (giid == GI_SWORD_KNIFE) { + GiveLinkGiantsKnife(); + } else if (giid == GI_SHIELD_DEKU) { + GiveLinkDekuShield(); + } else if (giid == GI_SHIELD_HYLIAN) { + GiveLinkHylianShield(); + } else if (giid == GI_SHIELD_MIRROR) { + GiveLinkMirrorShield(); + } else if (giid == GI_TUNIC_GORON) { + GiveLinkGoronTunic(); + } else if (giid == GI_TUNIC_ZORA) { + GiveLinkZoraTunic(); + } else if (giid == GI_BOOTS_IRON) { + GiveLinkIronBoots(); + } else if (giid == GI_BOOTS_HOVER) { + GiveLinkHoverBoots(); + } else if (giid == GI_SLINGSHOT || giid == GI_BULLET_BAG_40 || giid == GI_BULLET_BAG_50) { + GiveLinkBulletBagUpgrade(giid); + } else if (giid == GI_BOW || giid == GI_QUIVER_40 || giid == GI_QUIVER_50) { + GiveLinkQuiverUpgrade(giid); + } else if (giid == GI_BOMB_BAG_20 || giid == GI_BOMB_BAG_30 || giid == GI_BOMB_BAG_40) { + GiveLinkBombBagUpgrade(giid); + } else if (giid == GI_BRACELET || giid == GI_GAUNTLETS_SILVER || giid == GI_GAUNTLETS_GOLD) { + GiveLinkStrengthUpgrade(giid); + } else if (giid == GI_SCALE_SILVER || giid == GI_SCALE_GOLD) { + GiveLinkScaleUpgrade(giid); + } else if (giid == GI_WALLET_ADULT || giid == GI_WALLET_GIANT) { + GiveLinkWalletUpgrade(giid); + } else if (giid == GI_STONE_OF_AGONY) { + GiveLinkStoneOfAgony(); + } else if (giid == GI_GERUDO_CARD) { + GiveLinkGerudoCard(); + } else if (giid == GI_HEART_PIECE) { + GiveLinkPieceOfHeart(); + } else if (giid == GI_HEART_CONTAINER) { + GiveLinkHeartContainer(); + } else if (giid == GI_STICK_UPGRADE_20 || giid == GI_STICK_UPGRADE_30) { + GiveLinkDekuStickUpgrade(giid); + } else if (giid == GI_NUT_UPGRADE_30 || giid == GI_NUT_UPGRADE_40) { + GiveLinkDekuNutUpgrade(giid); + } else { + s32 iid = Randomizer_GetItemIDFromGetItemID(giid); + if (iid != -1) INV_CONTENT(iid) = iid; + } + } else if (getItem.modIndex == MOD_RANDOMIZER) { + if (giid == RG_MAGIC_SINGLE || giid == RG_MAGIC_DOUBLE) { + GiveLinkMagic(giid); + } else if (giid == RG_DOUBLE_DEFENSE) { + GiveLinkDoubleDefense(); + } else if (giid >= RG_KOKIRI_EMERALD && giid <= RG_LIGHT_MEDALLION) { + GiveLinkDungeonReward(giid); + } else if (giid >= RG_ZELDAS_LULLABY && giid <= RG_PRELUDE_OF_LIGHT) { + GiveLinkSong(giid); + } } // malon/talon back at ranch From 5998dcff7a302341544dbad72a0a922123aba727 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 13 Aug 2022 23:27:03 -0400 Subject: [PATCH 051/212] Simplifies sram init for rando-specific items --- soh/src/code/z_sram.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index c6c5c833a..d368e8d94 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -417,7 +417,7 @@ void GiveLinkDungeonReward(uint16_t getItemId) { } void GiveLinksPocketMedallion() { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LINKS_POCKET, RG_NONE); + RandomizerGet getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LINKS_POCKET, RG_NONE); GiveLinkDungeonReward(getItemId); } @@ -761,15 +761,7 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { if (iid != -1) INV_CONTENT(iid) = iid; } } else if (getItem.modIndex == MOD_RANDOMIZER) { - if (giid == RG_MAGIC_SINGLE || giid == RG_MAGIC_DOUBLE) { - GiveLinkMagic(giid); - } else if (giid == RG_DOUBLE_DEFENSE) { - GiveLinkDoubleDefense(); - } else if (giid >= RG_KOKIRI_EMERALD && giid <= RG_LIGHT_MEDALLION) { - GiveLinkDungeonReward(giid); - } else if (giid >= RG_ZELDAS_LULLABY && giid <= RG_PRELUDE_OF_LIGHT) { - GiveLinkSong(giid); - } + Randomizer_Item_Give(NULL, getItem); } // malon/talon back at ranch From baa17dda2729779156f2067c1f1913183bb01356 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 01:32:31 -0400 Subject: [PATCH 052/212] Fixes build error for Windows and Mac --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- soh/soh/Enhancements/randomizer/randomizer.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 26fcc992d..877ee9f31 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2307,7 +2307,7 @@ u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return this->randoSettings[randoSettingKey]; } -GetItemID Randomizer::GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { +s16 Randomizer::GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { return GetItemFromGet(this->itemLocations[randomizerCheck], ogId); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index b9d1caac7..15394fbcb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -45,7 +45,7 @@ class Randomizer { std::string GetAdultAltarText() const; std::string GetGanonText() const; std::string GetGanonHintText() const; - GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); + s16 GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); s16 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); static void CreateCustomMessages(); bool CheckContainsVanillaItem(RandomizerCheck randoCheck); From 1ab4b23011c34843c89fbd91e511af980a6aa1e3 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 11:26:00 -0400 Subject: [PATCH 053/212] Should fix some Skulltula oddities. --- soh/soh/OTRGlobals.cpp | 10 ++++++++-- soh/soh/OTRGlobals.h | 1 + soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 20 ++++++++++--------- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 4 ++-- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index f90bc4350..a9e162742 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1667,7 +1667,13 @@ extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetIte return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; } -extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(GetItemID giid, char* buffer, const int maxBufferSize) { +extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(Player* player) { + s16 giid; + if (player->getItemEntry.objectId != OBJECT_INVALID) { + giid = player->getItemEntry.getItemId; + } else { + giid = player->getItemId; + } const CustomMessageEntry getItemText = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, giid); return getItemText; } @@ -1682,7 +1688,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { messageEntry = - Randomizer_GetCustomGetItemMessage((GetItemID)GET_PLAYER(globalCtx)->getItemId, buffer, maxBufferSize); + Randomizer_GetCustomGetItemMessage(GET_PLAYER(globalCtx)); } else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS && Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != 0 && (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 1 || (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 2 && diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index f29d7dc97..d4e63eb79 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -108,6 +108,7 @@ bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, Get bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx); GetItemEntry ItemTable_Retrieve(int16_t getItemID); +GetItemEntry ItemTable_RetrieveEntry(s16 modIndex, s16 getItemId); #endif #endif diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index b6c110581..b4ee8ec93 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -70,7 +70,7 @@ static InitChainEntry sInitChain[] = { }; static UNK_TYPE sUnused; -int32_t sItem; +GetItemEntry sItem; void EnBox_SetupAction(EnBox* this, EnBoxActionFunc actionFunc) { this->actionFunc = actionFunc; @@ -446,40 +446,42 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) { func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos); if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f && Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) { - sItem = Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); + sItem = Randomizer_GetRandomizedItem(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); + GetItemEntry blueRupeeEntry = ItemTable_RetrieveEntry(MOD_NONE, GI_RUPEE_BLUE); // RANDOTODO treasure chest game rando if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) { if((this->dyna.actor.params & 0xF) < 2) { if(Flags_GetCollectible(globalCtx, 0x1B)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupeeEntry; } } if((this->dyna.actor.params & 0xF) >= 2 && (this->dyna.actor.params & 0xF) < 4) { if(Flags_GetCollectible(globalCtx, 0x1C)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupeeEntry; } } if((this->dyna.actor.params & 0xF) >= 4 && (this->dyna.actor.params & 0xF) < 6) { if(Flags_GetCollectible(globalCtx, 0x1D)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupeeEntry; } } if((this->dyna.actor.params & 0xF) >= 6 && (this->dyna.actor.params & 0xF) < 8) { if(Flags_GetCollectible(globalCtx, 0x1E)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupeeEntry; } } if((this->dyna.actor.params & 0xF) >= 8 && (this->dyna.actor.params & 0xF) < 10) { if(Flags_GetCollectible(globalCtx, 0x1F)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupeeEntry; } } } } - func_8002F554(&this->dyna.actor, globalCtx, 0 - sItem); + func_8002F554(&this->dyna.actor, globalCtx, 0 - sItem.getItemId); + player->getItemEntry = sItem; } if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) { EnBox_SetupAction(this, EnBox_Open); @@ -591,7 +593,7 @@ void EnBox_Update(Actor* thisx, GlobalContext* globalCtx) { } if (((!gSaveContext.n64ddFlag && ((this->dyna.actor.params >> 5 & 0x7F) == 0x7C)) || - (gSaveContext.n64ddFlag && sItem == GI_ICE_TRAP)) && + (gSaveContext.n64ddFlag && sItem.getItemId == RG_ICE_TRAP)) && this->actionFunc == EnBox_Open && this->skelanime.curFrame > 45 && this->iceSmokeTimer < 100) EnBox_SpawnIceSmoke(this, globalCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 75d518be7..f73107110 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -113,7 +113,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { } } player->getItemEntry = getItem; - player->getItemId = getItemId; + //player->getItemId = getItemId; } else { Item_Give(globalCtx, giveItemId); } @@ -160,7 +160,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { Randomizer_Item_Give(globalCtx, getItem); } } - player->getItemId = getItemId; + //player->getItemId = getItemId; player->getItemEntry = getItem; } else { Item_Give(globalCtx, giveItemId); From 0604dbfef8d9fe10b1ea3da109f00a7792c0b34b Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 11:43:25 -0400 Subject: [PATCH 054/212] Cleans up and updates item fanfares. --- soh/src/code/code_800EC960.c | 43 +++++----- .../actors/ovl_player_actor/z_player.c | 83 ++++++------------- 2 files changed, 51 insertions(+), 75 deletions(-) diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c index 646fcf4eb..7e346c384 100644 --- a/soh/src/code/code_800EC960.c +++ b/soh/src/code/code_800EC960.c @@ -3892,28 +3892,33 @@ void Audio_ResetSfxChannelState(void) { // Function to play "get-item" fanfares according to the type of item obtained (used in rando) // Longer fanfares for medallions/stones/songs are behind the Cvar -void Audio_PlayFanfare_Rando(ItemID getItemId) { +void Audio_PlayFanfare_Rando(GetItemEntry getItem) { s32 temp1; + s16 getItemId = getItem.getItemId; - if (((getItemId >= GI_RUPEE_GREEN) && (getItemId <= GI_RUPEE_RED)) || - ((getItemId >= GI_RUPEE_PURPLE) && (getItemId <= GI_RUPEE_GOLD)) || - ((getItemId >= GI_RUPEE_GREEN_LOSE) && (getItemId <= GI_RUPEE_PURPLE_LOSE)) || (getItemId == GI_HEART)) { - Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - } else { - if ((getItemId == GI_HEART_CONTAINER_2) || (getItemId == GI_HEART_CONTAINER) || - ((getItemId == GI_HEART_PIECE) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { - temp1 = NA_BGM_HEART_GET | 0x900; + if (getItem.modIndex == MOD_NONE) { + if (((getItemId >= GI_RUPEE_GREEN) && (getItemId <= GI_RUPEE_RED)) || + ((getItemId >= GI_RUPEE_PURPLE) && (getItemId <= GI_RUPEE_GOLD)) || + ((getItemId >= GI_RUPEE_GREEN_LOSE) && (getItemId <= GI_RUPEE_PURPLE_LOSE)) || (getItemId == GI_HEART)) { + Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } else { - temp1 = (getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; - } - // If we get a skulltula token or the "WINNER" heart, play "get small item" - if (getItemId == GI_SKULL_TOKEN || getItemId == GI_HEART_PIECE_WIN) { - temp1 = NA_BGM_SMALL_ITEM_GET | 0x900; - } - // But if the "WINNER" heart is the 4th heart piece collected, play "get heart container" - if (getItemId == GI_HEART_PIECE_WIN && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000)) { - temp1 = NA_BGM_HEART_GET | 0x900; - } + if ((getItemId == GI_HEART_CONTAINER_2) || (getItemId == GI_HEART_CONTAINER) || + ((getItemId == GI_HEART_PIECE) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { + temp1 = NA_BGM_HEART_GET | 0x900; + } else { + temp1 = (getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } + // If we get a skulltula token or the "WINNER" heart, play "get small item" + if (getItemId == GI_SKULL_TOKEN || getItemId == GI_HEART_PIECE_WIN) { + temp1 = NA_BGM_SMALL_ITEM_GET | 0x900; + } + // But if the "WINNER" heart is the 4th heart piece collected, play "get heart container" + if (getItemId == GI_HEART_PIECE_WIN && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000)) { + temp1 = NA_BGM_HEART_GET | 0x900; + } + Audio_PlayFanfare(temp1); + } + } else if (getItem.modIndex == MOD_RANDOMIZER) { // If the setting is toggled on and we get special quest items (longer fanfares): if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) { // If we get a medallion, play the "get a medallion" fanfare diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index c2c6038ee..71c79cdba 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12578,67 +12578,38 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } Player_SetPendingFlag(this, globalCtx); - if (this->getItemEntry.objectId == OBJECT_INVALID) { - // Use this if player does not have a getItemEntry - if (giEntry.modIndex == MOD_NONE) { - if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || - ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || - ((this->getItemId >= GI_RUPEE_GREEN_LOSE) && (this->getItemId <= GI_RUPEE_PURPLE_LOSE)) || - (this->getItemId == GI_HEART)) { - Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - } else { - if ((this->getItemId == GI_HEART_CONTAINER_2) || (this->getItemId == GI_HEART_CONTAINER) || - ((this->getItemId == GI_HEART_PIECE) && - ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { - temp1 = NA_BGM_HEART_GET | 0x900; - } else { - temp1 = temp2 = - (this->getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; - } - Audio_PlayFanfare(temp1); - } - } else if (giEntry.modIndex == MOD_RANDOMIZER) { - if (this->getItemId == RG_DOUBLE_DEFENSE || this->getItemId == RG_MAGIC_SINGLE || - this->getItemId == RG_MAGIC_DOUBLE) { - Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); - } else { - Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); - } + // Use this if we do have a getItemEntry + if (giEntry.modIndex == MOD_NONE) { + if (gSaveContext.n64ddFlag) { + Audio_PlayFanfare_Rando(this->getItemId); + } else if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) || + ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) || + (giEntry.itemId == ITEM_HEART)) { + Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); + } else { + if ((giEntry.itemId == ITEM_HEART_CONTAINER) || + ((giEntry.itemId == ITEM_HEART_PIECE) && + ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { + temp1 = NA_BGM_HEART_GET | 0x900; + } else { + temp1 = temp2 = + (giEntry.itemId == ITEM_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } + Audio_PlayFanfare(temp1); + } + } else if (giEntry.modIndex == MOD_RANDOMIZER) { + if (gSaveContext.n64ddFlag) { + Audio_PlayFanfare_Rando(this->getItemId); + } else if (giEntry.itemId == RG_DOUBLE_DEFENSE || giEntry.itemId == RG_MAGIC_SINGLE || + giEntry.itemId == RG_MAGIC_DOUBLE) { + Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); } else { - // Just in case something weird happens with MOD_INDEX Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } } else { - // Use this if we do have a getItemEntry - if (giEntry.modIndex == MOD_NONE) { - if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) || - ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) || - (giEntry.itemId == ITEM_HEART)) { - Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - } else { - if ((giEntry.itemId == ITEM_HEART_CONTAINER) || - ((giEntry.itemId == ITEM_HEART_PIECE) && - ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { - temp1 = NA_BGM_HEART_GET | 0x900; - } else { - temp1 = temp2 = - (giEntry.itemId == ITEM_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; - } - Audio_PlayFanfare(temp1); - } - } else if (giEntry.modIndex == MOD_RANDOMIZER) { - if (giEntry.itemId == RG_DOUBLE_DEFENSE || giEntry.itemId == RG_MAGIC_SINGLE || - giEntry.itemId == RG_MAGIC_DOUBLE) { - Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); - } else { - Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); - } - } else { - // Just in case something weird happens with modIndex. - Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); - } + // Just in case something weird happens with modIndex. + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } - //this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } else { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) { From 6d7498829dd2d4dcb6f6a3fe3f1ebf8a269b11ce Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 11:54:43 -0400 Subject: [PATCH 055/212] Wraps up a few missed type changes. --- soh/src/code/code_800EC960.c | 2 +- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 11 ++++++----- soh/src/overlays/actors/ovl_player_actor/z_player.c | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c index 7e346c384..0909ebf19 100644 --- a/soh/src/code/code_800EC960.c +++ b/soh/src/code/code_800EC960.c @@ -1246,7 +1246,7 @@ void Audio_StepFreqLerp(FreqLerp* lerp); void func_800F56A8(void); void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId); s32 Audio_SetGanonDistVol(u8 targetVol); -void Audio_PlayFanfare_Rando(ItemID getItemId); +void Audio_PlayFanfare_Rando(GetItemEntry getItem); // Function originally not called, so repurposing for DPad input void func_800EC960(u8 dpad) { diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index f73107110..61ce4330b 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -21,6 +21,7 @@ void func_80AFB950(EnSi* this, GlobalContext* globalCtx); s32 textId = 0xB4; s32 giveItemId = ITEM_SKULL_TOKEN; s32 getItemId; +GetItemEntry getItem; static ColliderCylinderInit sCylinderInit = { { @@ -98,7 +99,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; if (gSaveContext.n64ddFlag) { - GetItemEntry getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); getItemId = getItem.getItemId; if (getItem.getItemId == RG_ICE_TRAP) { player->pendingIceTrap = true; @@ -123,7 +124,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { Message_StartTextbox(globalCtx, textId, NULL); if (gSaveContext.n64ddFlag) { - Audio_PlayFanfare_Rando(getItemId); + Audio_PlayFanfare_Rando(getItem); } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); } @@ -146,7 +147,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { if (gSaveContext.n64ddFlag) { - GetItemEntry getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); getItemId = getItem.getItemId; if (getItemId == RG_ICE_TRAP) { player->pendingIceTrap = true; @@ -167,7 +168,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { } Message_StartTextbox(globalCtx, textId, NULL); if (gSaveContext.n64ddFlag) { - Audio_PlayFanfare_Rando(getItemId); + Audio_PlayFanfare_Rando(getItem); } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); } @@ -205,7 +206,7 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2); } else { - GetItemEntry getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, getItem); if (getItem.itemId != ITEM_SKULL_TOKEN) { f32 mtxScale = 1.5f; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 71c79cdba..ee13eb8bf 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12581,7 +12581,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { // Use this if we do have a getItemEntry if (giEntry.modIndex == MOD_NONE) { if (gSaveContext.n64ddFlag) { - Audio_PlayFanfare_Rando(this->getItemId); + Audio_PlayFanfare_Rando(giEntry); } else if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) || ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) || (giEntry.itemId == ITEM_HEART)) { @@ -12599,7 +12599,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { } } else if (giEntry.modIndex == MOD_RANDOMIZER) { if (gSaveContext.n64ddFlag) { - Audio_PlayFanfare_Rando(this->getItemId); + Audio_PlayFanfare_Rando(giEntry); } else if (giEntry.itemId == RG_DOUBLE_DEFENSE || giEntry.itemId == RG_MAGIC_SINGLE || giEntry.itemId == RG_MAGIC_DOUBLE) { Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); From 203785f76afe1967165a25596d88196a9c5983d8 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 12:22:24 -0400 Subject: [PATCH 056/212] Fixes Link's Pocket being a Dungeon Reward from Impa. --- soh/src/code/z_sram.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 73d281793..66aae6156 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -800,7 +800,9 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { s32 giid = getItem.getItemId; if (getItem.modIndex == MOD_NONE) { - if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED || + if(getItem.itemId >= ITEM_KOKIRI_EMERALD && getItem.itemId <= ITEM_MEDALLION_LIGHT) { + GiveLinkDungeonReward(getItem.getItemId); + } else if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED || giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_GOLD) { GiveLinkRupeesByGetItemId(giid); } else if (giid == GI_BOMBCHUS_10 || giid == GI_BOMBCHUS_5 || giid == GI_BOMBCHUS_20) { From 3bf92a348c0e9ca312f7eac1cc2ba8c5efdfd39c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 13:19:41 -0400 Subject: [PATCH 057/212] Fixes crashes with `Audio_PlayFanfare_Rando`. --- soh/src/code/code_800EC960.c | 3 +++ soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c index 0909ebf19..2898d46ef 100644 --- a/soh/src/code/code_800EC960.c +++ b/soh/src/code/code_800EC960.c @@ -3919,6 +3919,9 @@ void Audio_PlayFanfare_Rando(GetItemEntry getItem) { Audio_PlayFanfare(temp1); } } else if (getItem.modIndex == MOD_RANDOMIZER) { + if ((getItemId >= RG_BOTTLE_WITH_RED_POTION && getItemId <= RG_BOTTLE_WITH_BIG_POE) || (getItemId >= RG_DEKU_TREE_MAP && getItemId <= RG_GANONS_CASTLE_SMALL_KEY)) { + temp1 = NA_BGM_ITEM_GET | 0x900; + } // If the setting is toggled on and we get special quest items (longer fanfares): if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) { // If we get a medallion, play the "get a medallion" fanfare diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 61ce4330b..5fdce2455 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -123,7 +123,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { } Message_StartTextbox(globalCtx, textId, NULL); - if (gSaveContext.n64ddFlag) { + if (gSaveContext.n64ddFlag && getItemId != RG_ICE_TRAP) { Audio_PlayFanfare_Rando(getItem); } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); From e451d13e2be0273988f99f72556db59cc8c668f5 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 14:17:55 -0400 Subject: [PATCH 058/212] Some more changes to account for Skulltulas in new system. --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 5fdce2455..93a49ac42 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -167,7 +167,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { Item_Give(globalCtx, giveItemId); } Message_StartTextbox(globalCtx, textId, NULL); - if (gSaveContext.n64ddFlag) { + if (gSaveContext.n64ddFlag && getItemId != RG_ICE_TRAP) { Audio_PlayFanfare_Rando(getItem); } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); @@ -180,7 +180,7 @@ void func_80AFB950(EnSi* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); if (Message_GetState(&globalCtx->msgCtx) != TEXT_STATE_CLOSING && - ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != GI_ICE_TRAP)) { + ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != RG_ICE_TRAP)) { player->actor.freezeTimer = 10; } else { SET_GS_FLAGS((this->actor.params & 0x1F00) >> 8, this->actor.params & 0xFF); From 3f55409bee2a0fb7c533df53e6f4ad11d1ac190f Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 14:57:00 -0400 Subject: [PATCH 059/212] Should fix Skulltula Ice Traps. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index ee13eb8bf..04a64585a 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6118,7 +6118,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { iREG(67) = false; - if (gSaveContext.n64ddFlag && this->getItemId == RG_ICE_TRAP) { + if (gSaveContext.n64ddFlag && giEntry.getItemId == RG_ICE_TRAP) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->actor.colChkInfo.damage = 0; func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); @@ -12787,11 +12787,11 @@ void func_8084E6D4(Player* this, GlobalContext* globalCtx) { func_80832DBC(this); if ((this->getItemId == GI_ICE_TRAP && !gSaveContext.n64ddFlag) || - (gSaveContext.n64ddFlag && this->getItemId == RG_ICE_TRAP)) { + (gSaveContext.n64ddFlag && (this->getItemId == RG_ICE_TRAP || this->getItemEntry.getItemId == RG_ICE_TRAP))) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); if ((this->getItemId != GI_ICE_TRAP && !gSaveContext.n64ddFlag) || - (gSaveContext.n64ddFlag && this->getItemId != RG_ICE_TRAP)) { + (gSaveContext.n64ddFlag && (this->getItemId != RG_ICE_TRAP || this->getItemEntry.getItemId == RG_ICE_TRAP))) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0); func_8083C0E8(this, globalCtx); From 5f1c365a0c4148053470bd14aa32c89f76681c9b Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 14 Aug 2022 23:11:11 +0200 Subject: [PATCH 060/212] Eliminated copy pasta --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 58 +++++++++------------ 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 93a49ac42..898bc0c51 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -17,6 +17,7 @@ s32 func_80AFB748(EnSi* this, GlobalContext* globalCtx); void func_80AFB768(EnSi* this, GlobalContext* globalCtx); void func_80AFB89C(EnSi* this, GlobalContext* globalCtx); void func_80AFB950(EnSi* this, GlobalContext* globalCtx); +void Randomizer_GrantSkullReward(EnSi* this, GlobalContext* globalCtx); s32 textId = 0xB4; s32 giveItemId = ITEM_SKULL_TOKEN; @@ -99,22 +100,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; if (gSaveContext.n64ddFlag) { - getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); - getItemId = getItem.getItemId; - if (getItem.getItemId == RG_ICE_TRAP) { - player->pendingIceTrap = true; - textId = 0xF8; - } else { - textId = getItem.textId; - giveItemId = getItem.itemId; - if (getItem.modIndex == MOD_NONE) { - Item_Give(globalCtx, giveItemId); - } else if (getItem.modIndex == MOD_RANDOMIZER) { - Randomizer_Item_Give(globalCtx, getItem); - } - } - player->getItemEntry = getItem; - //player->getItemId = getItemId; + Randomizer_GrantSkullReward(this, globalCtx); } else { Item_Give(globalCtx, giveItemId); } @@ -139,30 +125,13 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { } void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { - Player* player = GET_PLAYER(globalCtx); - Math_SmoothStepToF(&this->actor.scale.x, 0.25f, 0.4f, 1.0f, 0.0f); Actor_SetScale(&this->actor, this->actor.scale.x); this->actor.shape.rot.y += 0x400; if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { if (gSaveContext.n64ddFlag) { - getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); - getItemId = getItem.getItemId; - if (getItemId == RG_ICE_TRAP) { - player->pendingIceTrap = true; - textId = 0xF8; - } else { - textId = getItem.textId; - giveItemId = getItem.itemId; - if (getItem.modIndex == MOD_NONE) { - Item_Give(globalCtx, giveItemId); - } else if (getItem.modIndex == MOD_RANDOMIZER) { - Randomizer_Item_Give(globalCtx, getItem); - } - } - //player->getItemId = getItemId; - player->getItemEntry = getItem; + Randomizer_GrantSkullReward(this, globalCtx); } else { Item_Give(globalCtx, giveItemId); } @@ -217,3 +186,24 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { } } + +void Randomizer_GrantSkullReward(EnSi* this, GlobalContext* globalCtx) { + Player* player = GET_PLAYER(globalCtx); + + getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + getItemId = getItem.getItemId; + if (getItemId == RG_ICE_TRAP) { + player->pendingIceTrap = true; + textId = 0xF8; + } else { + textId = getItem.textId; + giveItemId = getItem.itemId; + if (getItem.modIndex == MOD_NONE) { + Item_Give(globalCtx, giveItemId); + } else if (getItem.modIndex == MOD_RANDOMIZER) { + Randomizer_Item_Give(globalCtx, getItem); + } + } + // player->getItemId = getItemId; + player->getItemEntry = getItem; +} \ No newline at end of file From 8842d1ec0d0b1b31916aa1aa7491de4eaca2eb6a Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 14 Aug 2022 23:12:00 +0200 Subject: [PATCH 061/212] Fixed newline end of file --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 898bc0c51..d0ff158fe 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -206,4 +206,4 @@ void Randomizer_GrantSkullReward(EnSi* this, GlobalContext* globalCtx) { } // player->getItemId = getItemId; player->getItemEntry = getItem; -} \ No newline at end of file +} From d541ea3b39dda860409bb396c363c931948ce66e Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 18:25:09 -0400 Subject: [PATCH 062/212] Another Skulltula Ice Trap fix. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 04a64585a..6742533a8 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6163,7 +6163,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { - if (this->getItemId != GI_NONE) { + if (this->getItemId != GI_NONE && this->getItemEntry.objectId != OBJECT_INVALID) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { giEntry = ItemTable_Retrieve(-this->getItemId); @@ -10891,7 +10891,8 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) { Collider_ResetQuadAT(globalCtx, &this->shieldQuad.base); if (this->pendingIceTrap) { - GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); + GiveItemWithoutActor(globalCtx, RG_ICE_TRAP); + this->getItemEntry = ItemTable_RetrieveEntry(MOD_RANDOMIZER, RG_ICE_TRAP); } } @@ -12791,7 +12792,7 @@ void func_8084E6D4(Player* this, GlobalContext* globalCtx) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); if ((this->getItemId != GI_ICE_TRAP && !gSaveContext.n64ddFlag) || - (gSaveContext.n64ddFlag && (this->getItemId != RG_ICE_TRAP || this->getItemEntry.getItemId == RG_ICE_TRAP))) { + (gSaveContext.n64ddFlag && (this->getItemId != RG_ICE_TRAP || this->getItemEntry.getItemId != RG_ICE_TRAP))) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0); func_8083C0E8(this, globalCtx); From 202805531f2c0416ef65d605bb4fdd67c8ea5aed Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 18:40:48 -0400 Subject: [PATCH 063/212] Fixes issues with approaching bottleable items. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 6742533a8..c1ee456a9 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6104,7 +6104,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->getItemId = iREG(68); } - if (this->getItemId < GI_MAX || (gSaveContext.n64ddFlag && this->getItemId < RG_MAX)) { + if (this->getItemId < GI_MAX) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { giEntry = ItemTable_Retrieve(this->getItemId); From 76f25c18c0a763cc4a0c555108482247f04cc1df Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 20:15:33 -0400 Subject: [PATCH 064/212] Fixes Ruto's Letter. It was accidentally getting classified as a rando item. --- soh/soh/Enhancements/randomizer/randomizer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 877ee9f31..61e1dede6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1923,6 +1923,8 @@ s16 Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) { case RG_ZELDAS_LETTER: return GI_LETTER_ZELDA; + case RG_RUTOS_LETTER: + return GI_LETTER_RUTO; case RG_POCKET_EGG: return GI_POCKET_EGG; @@ -2192,6 +2194,7 @@ bool Randomizer::IsItemVanilla(RandomizerGet randoGet) { case RG_MAGIC_BEAN: case RG_WEIRD_EGG: case RG_ZELDAS_LETTER: + case RG_RUTOS_LETTER: case RG_POCKET_EGG: case RG_COJIRO: case RG_ODD_MUSHROOM: From 7e0e8c63af2394b7ef3bc1c3344ebf9de2454762 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 18:40:48 -0400 Subject: [PATCH 065/212] Fixes issues with approaching bottleable items. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 615b39894..b2afa9ed7 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6104,7 +6104,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->getItemId = iREG(68); } - if (this->getItemId < GI_MAX || (gSaveContext.n64ddFlag && this->getItemId < RG_MAX)) { + if (this->getItemId < GI_MAX) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { giEntry = ItemTable_Retrieve(this->getItemId); From 0e2530cd497921f5c40f693ef8706b95a2e863d9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 20:15:33 -0400 Subject: [PATCH 066/212] Fixes Ruto's Letter. It was accidentally getting classified as a rando item. --- soh/soh/Enhancements/randomizer/randomizer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a2b94be7e..80bdf1c8d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1857,6 +1857,8 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_ZELDAS_LETTER: return GI_LETTER_ZELDA; + case RG_RUTOS_LETTER: + return GI_LETTER_RUTO; case RG_POCKET_EGG: return GI_POCKET_EGG; @@ -2172,6 +2174,7 @@ bool Randomizer::IsItemVanilla(RandomizerGet randoGet) { case RG_MAGIC_BEAN: case RG_WEIRD_EGG: case RG_ZELDAS_LETTER: + case RG_RUTOS_LETTER: case RG_POCKET_EGG: case RG_COJIRO: case RG_ODD_MUSHROOM: From f4a051fb901c6cc415ddfa4fd53f97618512311f Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 21:28:54 -0400 Subject: [PATCH 067/212] Should re-fix freestanding ice traps --- .../overlays/actors/ovl_player_actor/z_player.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index b2afa9ed7..2c33afbb1 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6104,14 +6104,14 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->getItemId = iREG(68); } - if (this->getItemId < GI_MAX) { - GetItemEntry giEntry; - if (this->getItemEntry.objectId == OBJECT_INVALID) { - giEntry = ItemTable_Retrieve(this->getItemId); - } else { - giEntry = this->getItemEntry; - } - + GetItemEntry giEntry; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(this->getItemId); + } else { + giEntry = this->getItemEntry; + } + if ((giEntry.modIndex == MOD_NONE && this->getItemId < GI_MAX) || + (giEntry.modIndex == MOD_RANDOMIZER && this->getItemId < RG_MAX)) { if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; } From c7388c39d83c4d9e73aa7cc0c239a2a4b7697cf3 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 21:56:12 -0400 Subject: [PATCH 068/212] Prevents Skulltulas from affecting other nearby checks. --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index d0ff158fe..a9c3cb258 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -114,6 +114,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); } + player->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = func_80AFB950; } else { Collider_UpdateCylinder(&this->actor, &this->collider); @@ -125,6 +126,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { } void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { + Player* player = GET_PLAYER(globalCtx); Math_SmoothStepToF(&this->actor.scale.x, 0.25f, 0.4f, 1.0f, 0.0f); Actor_SetScale(&this->actor, this->actor.scale.x); this->actor.shape.rot.y += 0x400; @@ -141,6 +143,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); } + player->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = func_80AFB950; } } From a57d93599608aa50648b433c4d505b7d01180a44 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Aug 2022 22:10:40 -0400 Subject: [PATCH 069/212] Fixes a few more freestanding items that weren't covered. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 391b20aa7..2465b5a68 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6110,7 +6110,8 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } else { giEntry = this->getItemEntry; } - if ((giEntry.modIndex == MOD_NONE && this->getItemId < GI_MAX) || + if ((giEntry.modIndex == MOD_NONE && (this->getItemId < GI_MAX || + (giEntry.getItemId >= RG_KOKIRI_EMERALD && giEntry.getItemId <= RG_LIGHT_MEDALLION))) || (giEntry.modIndex == MOD_RANDOMIZER && this->getItemId < RG_MAX)) { if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; From 9c59624d646a1596c7c827a479cc692302662004 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 02:08:32 -0400 Subject: [PATCH 070/212] Makes freestanding items set player->getItemEntry. This prevents freestanding items from setting the global modIndex. This is part of a larger transition that needs to happen to switch to setting getItemEntries for all of the rando items. This prevents some things that set getItemId of GI_MAX from granting a Fire Medallion when the global modIndex is MOD_RANDOMIZER. --- soh/soh/Enhancements/item-tables/ItemTableTypes.h | 9 +++++---- soh/soh/OTRGlobals.cpp | 3 ++- soh/src/code/z_en_item00.c | 12 ++++++++---- soh/src/overlays/actors/ovl_player_actor/z_player.c | 3 +-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index f5a2c1f68..1a703f30d 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -7,10 +7,10 @@ #define CHEST_ANIM_LONG 1 #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId } + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true } #define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, 0, 0, 0 } + { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false } typedef struct { /* 0x00 */ uint16_t itemId; @@ -20,5 +20,6 @@ typedef struct { /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? /* 0x08 */ uint16_t getItemId; - /* 0x10 */ uint16_t gid; // Stores the GID value unmodified for future reference. -} GetItemEntry; // size = 0x10 + /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. + /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. +} GetItemEntry; // size = 0x0F diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index e8d3a74c4..9a189bfa3 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1610,7 +1610,8 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check) } extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); + GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); + return giEntry; } extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index b2ac1bd72..89bf5b3eb 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -335,6 +335,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { f32 yOffset = 980.0f; f32 shadowScale = 6.0f; s32 getItemId = GI_NONE; + GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE; s16 spawnParam8000 = this->actor.params & 0x8000; s32 pad1; @@ -509,8 +510,9 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { } if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { - getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - func_8002F554(&this->actor, globalCtx, getItemId); + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + func_8002F554(&this->actor, globalCtx, getItem.getItemId); + GET_PLAYER(globalCtx)->getItemEntry = getItem; } EnItem00_SetupAction(this, func_8001E5C8); @@ -702,6 +704,7 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { s16* params; Actor* dynaActor; s32 getItemId = GI_NONE; + GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE; s16 sp3A = 0; s16 i; u32* temp; @@ -881,9 +884,10 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + GET_PLAYER(globalCtx)->getItemEntry = getItem; } - func_8002F554(&this->actor, globalCtx, getItemId); + func_8002F554(&this->actor, globalCtx, getItem.getItemId); } switch (*params) { diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 2c33afbb1..a16eb7879 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6110,8 +6110,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } else { giEntry = this->getItemEntry; } - if ((giEntry.modIndex == MOD_NONE && this->getItemId < GI_MAX) || - (giEntry.modIndex == MOD_RANDOMIZER && this->getItemId < RG_MAX)) { + if (giEntry.collectable) { if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; } From 6b4f300eda39ca72a3e00e8c4287ceb0b38e8f8b Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 02:17:06 -0400 Subject: [PATCH 071/212] Makes sure we aren't using getItemEntry when not randoed. --- soh/src/code/z_en_item00.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 89bf5b3eb..5245e45c0 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -511,7 +511,8 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - func_8002F554(&this->actor, globalCtx, getItem.getItemId); + getItemId = getItem.getItemId; + func_8002F554(&this->actor, globalCtx, getItemId); GET_PLAYER(globalCtx)->getItemEntry = getItem; } @@ -886,8 +887,9 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GET_PLAYER(globalCtx)->getItemEntry = getItem; + getItemId = getItem.getItemId; } - func_8002F554(&this->actor, globalCtx, getItem.getItemId); + func_8002F554(&this->actor, globalCtx, getItemId); } switch (*params) { From 06b1074e2a9066f86f3c9ab37dad4e5535305ae3 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 15 Aug 2022 12:00:27 -0500 Subject: [PATCH 072/212] Replace Randomizer_GetRandomizedItemId with Randomizer_GetRandomizedItem and Randomizer_GetItemIdFromKnownCheck with Randomizer_GetItemFromKnownCheck --- soh/soh/OTRGlobals.cpp | 22 ++----------------- soh/soh/OTRGlobals.h | 5 +---- soh/src/code/z_play.c | 18 +++++++-------- soh/src/code/z_sram.c | 4 ++-- .../ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c | 4 ++-- .../overlays/actors/ovl_Demo_Im/z_demo_im.c | 4 ++-- .../actors/ovl_Door_Warp1/z_door_warp1.c | 4 ++-- soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c | 8 +++---- .../ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c | 8 +++---- soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 2 +- .../ovl_En_Diving_Game/z_en_diving_game.c | 14 ++++++++++-- soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c | 13 ++++++++--- .../actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c | 6 +++-- soh/src/overlays/actors/ovl_En_Du/z_en_du.c | 7 +++++- .../actors/ovl_En_Ex_Item/z_en_ex_item.c | 4 ++-- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c | 4 ++-- soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c | 4 ++-- soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c | 14 ++++++++++-- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 10 ++++----- soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 14 ++++++++++-- soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c | 14 ++++++++++-- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 2 +- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 6 ++--- soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 11 +++++++++- soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 4 ++-- soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 8 +++---- soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c | 14 ++++++++++-- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 10 ++++----- .../ovl_En_Okarina_Tag/z_en_okarina_tag.c | 4 ++-- soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c | 6 ++--- soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 19 +++++++++++----- soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c | 10 ++++----- .../ovl_En_Syateki_Man/z_en_syateki_man.c | 4 ++-- soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 7 +++++- soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c | 4 ++-- .../overlays/actors/ovl_Fishing/z_fishing.c | 21 ++++++++++-------- .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 8 +++---- .../ovl_Item_Etcetera/z_item_etcetera.c | 16 +++++++------- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 11 +++++----- 39 files changed, 206 insertions(+), 142 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 9a189bfa3..a906d04d4 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1618,15 +1618,6 @@ extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID); } -extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { - if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { - OTRGlobals::Instance->getItemModIndex = MOD_NONE; - } else { - OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; - } - return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); -} - extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { s16 getItemModIndex; if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem( @@ -1639,15 +1630,6 @@ extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId return ItemTable_RetrieveEntry(getItemModIndex, itemID); } -extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { - if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { - OTRGlobals::Instance->getItemModIndex = MOD_NONE; - } else { - OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER; - } - return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); -} - extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { s16 getItemModIndex; if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { @@ -1661,11 +1643,11 @@ extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomi extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { return gSaveContext.n64ddFlag && (actor->parent != NULL) && - Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; + Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == GI_ICE_TRAP; } extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { - return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; + return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == GI_ICE_TRAP; } extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(GetItemID giid, char* buffer, const int maxBufferSize) { diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index f29d7dc97..750dd911e 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -98,10 +98,7 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); void Randomizer_LoadHintLocations(const char* spoilerFileName); void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent); -s16 Randomizer_GetItemModelFromId(s16 itemId); -s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); -s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); -s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); +s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); // TODO: Remove me GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index fb35c5209..006fd37af 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -201,8 +201,8 @@ void GivePlayerRandoRewardSongOfTime(GlobalContext* globalCtx, RandomizerCheck c if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_SONG_OF_TIME); - GiveItemWithoutActor(globalCtx, getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); + GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } @@ -216,8 +216,8 @@ void GivePlayerRandoRewardNocturne(GlobalContext* globalCtx, RandomizerCheck che gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW); - GiveItemWithoutActor(globalCtx, getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW); + GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); Flags_SetEventChkInf(0xAA); } } @@ -228,8 +228,8 @@ void GivePlayerRandoRewardRequiem(GlobalContext* globalCtx, RandomizerCheck chec if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_SONG_OF_TIME); - GiveItemWithoutActor(globalCtx, getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); + GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); Flags_SetEventChkInf(0xAC); } } @@ -254,11 +254,11 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck check) { Player* player = GET_PLAYER(globalCtx); if (gSaveContext.entranceIndex == 0x05E0) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_ZELDAS_LULLABY); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY); - if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemId && getItemId != GI_ICE_TRAP)) && + if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemEntry.getItemId && getItemEntry.getItemId != GI_ICE_TRAP)) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { - GiveItemWithoutActor(globalCtx, getItemId); + GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); Flags_SetEventChkInf(0xC1); } } diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index d368e8d94..6e58af4d0 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -417,9 +417,9 @@ void GiveLinkDungeonReward(uint16_t getItemId) { } void GiveLinksPocketMedallion() { - RandomizerGet getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LINKS_POCKET, RG_NONE); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, RG_NONE); - GiveLinkDungeonReward(getItemId); + GiveLinkDungeonReward(getItemEntry.getItemId); } /** diff --git a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c index 0f1713ba8..c0dc480b0 100644 --- a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c +++ b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c @@ -70,14 +70,14 @@ const ActorInit Bg_Dy_Yoseizo_InitVars = { void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); - GetItemID getItemId = Randomizer_GetRandomizedItemId(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum); if (this->actor.parent == GET_PLAYER(globalCtx) && !Flags_GetTreasure(globalCtx, this->fountainType + 1) && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { Flags_SetTreasure(globalCtx, this->fountainType + 1); Actor_Kill(&this->actor); } else if (!Flags_GetTreasure(globalCtx, this->fountainType + 1)) { - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c index 7526ac2ea..dc119f16a 100644 --- a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c +++ b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c @@ -899,13 +899,13 @@ void func_80986BF8(DemoIm* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardImpa(Actor* impa, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_ZELDAS_LULLABY); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY); if (impa->parent != NULL && impa->parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { - func_8002F434(impa, globalCtx, getItemId, 75.0f, 50.0f); + func_8002F434(impa, globalCtx, getItemEntry.getItemId, 75.0f, 50.0f); } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { gSaveContext.eventChkInf[5] |= 0x200; globalCtx->sceneLoadFlag = 0x14; diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 291208752..4825c0943 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -462,13 +462,13 @@ s32 DoorWarp1_PlayerInRange(DoorWarp1* this, GlobalContext* globalCtx) { } void GivePlayerRandoReward(DoorWarp1* this, Player* player, GlobalContext* globalCtx, u8 ruto, u8 adult) { - GetItemID getItemId = Randomizer_GetRandomizedItemId(GI_NONE, this->actor.id, this->actor.params, globalCtx->sceneNum); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NONE, this->actor.id, this->actor.params, globalCtx->sceneNum); if (this->actor.parent != NULL && this->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { if (adult) { OnePointCutscene_Init(globalCtx, 0x25E8, 999, &this->actor, MAIN_CAM); diff --git a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c index b5c7d8a4a..aac0e0c30 100644 --- a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c +++ b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c @@ -127,8 +127,8 @@ void func_809B0558(EnAni* this, GlobalContext* globalCtx) { gSaveContext.itemGetInf[1] |= 0x20; } else { if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 200.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 200.0f); } else { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); } @@ -141,8 +141,8 @@ void func_809B05F0(EnAni* this, GlobalContext* globalCtx) { } if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 200.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 200.0f); } else { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); } diff --git a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c index ee9ce1329..25a58ec10 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c +++ b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c @@ -185,15 +185,13 @@ void EnBomBowlPit_GivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { switch (this->prizeIndex) { case EXITEM_BOMB_BAG_BOWLING: - this->getItemId = - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); + this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20).getItemId; break; case EXITEM_HEART_PIECE_BOWLING: - this->getItemId = - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); + this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE).getItemId; break; case EXITEM_BOMBCHUS_BOWLING: - this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); + this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).getItemId; break; } } diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index b6c110581..a3e384ec5 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -446,7 +446,7 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) { func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos); if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f && Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) { - sItem = Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); + sItem = Randomizer_GetRandomizedItem(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum).getItemId; // RANDOTODO treasure chest game rando if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { diff --git a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c index 9f43a5f54..ab724ec63 100644 --- a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c +++ b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c @@ -453,7 +453,12 @@ void func_809EEA00(EnDivingGame* this, GlobalContext* globalCtx) { if ((this->unk_292 == Message_GetState(&globalCtx->msgCtx) && Message_ShouldAdvance(globalCtx))) { Message_CloseTextbox(globalCtx); this->actor.parent = NULL; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER) : GI_SCALE_SILVER, 90.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 90.0f, 10.0f); + } this->actionFunc = func_809EEA90; } } @@ -463,7 +468,12 @@ void func_809EEA90(EnDivingGame* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = func_809EEAF8; } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER) : GI_SCALE_SILVER, 90.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 90.0f, 10.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c index a89d583ae..b2208de52 100644 --- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c +++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c @@ -371,7 +371,8 @@ void EnDns_Talk(EnDns* this, GlobalContext* globalCtx) { void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { if (this->actor.params == 0x9) { if (gSaveContext.n64ddFlag) { - func_8002F434(&this->actor, globalCtx, Randomizer_GetRandomizedItemId(GI_STICK_UPGRADE_30, this->actor.id, this->actor.params, globalCtx->sceneNum), 130.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_STICK_UPGRADE_30, this->actor.id, this->actor.params, globalCtx->sceneNum); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 130.0f, 100.0f); } else if (CUR_UPG_VALUE(UPG_STICKS) < 2) { func_8002F434(&this->actor, globalCtx, GI_STICK_UPGRADE_20, 130.0f, 100.0f); } else { @@ -379,14 +380,20 @@ void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { } } else if (this->actor.params == 0xA) { if (gSaveContext.n64ddFlag) { - func_8002F434(&this->actor, globalCtx, Randomizer_GetRandomizedItemId(GI_NUT_UPGRADE_40, this->actor.id, this->actor.params, globalCtx->sceneNum), 130.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NUT_UPGRADE_40, this->actor.id, this->actor.params, globalCtx->sceneNum); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 130.0f, 100.0f); } else if (CUR_UPG_VALUE(UPG_NUTS) < 2) { func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_30, 130.0f, 100.0f); } else { func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_40, 130.0f, 100.0f); } } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetRandomizedItemId(this->dnsItemEntry->getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum) : this->dnsItemEntry->getItemId, 130.0f, 100.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, this->dnsItemEntry->getItemId, 130.0f, 100.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(this->dnsItemEntry->getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 130.0f, 100.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c index 6d3a4accd..b6c61504d 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c @@ -139,13 +139,15 @@ void EnDntDemo_Judge(EnDntDemo* this, GlobalContext* globalCtx) { switch (Player_GetMask(globalCtx)) { case PLAYER_MASK_SKULL: if (!Flags_GetTreasure(globalCtx, 0x1F)) { - GiveItemWithoutActor(globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DEKU_THEATER_SKULL_MASK, GI_STICK_UPGRADE_30)); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_SKULL_MASK, GI_STICK_UPGRADE_30); + GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); Flags_SetTreasure(globalCtx, 0x1F); } break; case PLAYER_MASK_TRUTH: if (!Flags_GetTreasure(globalCtx, 0x1E)) { - GiveItemWithoutActor(globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DEKU_THEATER_MASK_OF_TRUTH, GI_NUT_UPGRADE_40)); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_MASK_OF_TRUTH, GI_NUT_UPGRADE_40); + GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); Flags_SetTreasure(globalCtx, 0x1E); } break; diff --git a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c index e7f9b51aa..f003e4b99 100644 --- a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c +++ b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c @@ -548,7 +548,12 @@ void func_809FEC70(EnDu* this, GlobalContext* globalCtx) { EnDu_SetupAction(this, func_809FECE4); } else { f32 xzRange = this->actor.xzDistToPlayer + 1.0f; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GC_DARUNIAS_JOY, GI_BRACELET) : GI_BRACELET, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_BRACELET, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GC_DARUNIAS_JOY, GI_BRACELET); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 34f16e8df..83b2d9587 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -406,7 +406,7 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (gSaveContext.n64ddFlag) { GET_PLAYER(globalCtx)->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + getItemId = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50).getItemId; } else { if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) { getItemId = GI_BULLET_BAG_40; @@ -426,7 +426,7 @@ void EnExItem_TargetPrizeGive(EnExItem* this, GlobalContext* globalCtx) { this->actionFunc = EnExItem_TargetPrizeFinish; } else { if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + getItemId = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50).getItemId; } else { getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; } diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c index e6a85b331..5e6976c76 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c @@ -940,7 +940,7 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { this->reward = GI_HEART_PIECE; } else { - this->reward = Randomizer_GetItemIdFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE); + this->reward = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE).getItemId; } } else { this->reward = GI_RUPEE_BLUE; @@ -951,7 +951,7 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { this->reward = GI_HEART_PIECE; } else { - this->reward = Randomizer_GetItemIdFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE); + this->reward = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE).getItemId; } } else { this->reward = GI_RUPEE_PURPLE; diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c index 54977add1..2acef3ee9 100644 --- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -154,8 +154,8 @@ void GivePlayerRandoRewardSongOfStorms(EnFu* windmillGuy, GlobalContext* globalC Flags_SetTreasure(globalCtx, 0x1F); windmillGuy->actionFunc = func_80A1DBD4; } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_SONG_OF_STORMS); - func_8002F434(&windmillGuy->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_STORMS); + func_8002F434(&windmillGuy->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c index 31fe04e90..602f1c98f 100644 --- a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c +++ b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c @@ -353,7 +353,12 @@ void func_80A2FA50(EnGb* this, GlobalContext* globalCtx) { void func_80A2FB40(EnGb* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE && Message_ShouldAdvance(globalCtx)) { - func_8002F434(&this->dyna.actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE) : GI_BOTTLE, 100.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE); + func_8002F434(&this->dyna.actor, globalCtx, getItemEntry.getItemId, 100.0f, 10.0f); + } this->actionFunc = func_80A2FBB0; } } @@ -363,7 +368,12 @@ void func_80A2FBB0(EnGb* this, GlobalContext* globalCtx) { this->dyna.actor.parent = NULL; this->actionFunc = func_80A2FC0C; } else { - func_8002F434(&this->dyna.actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE) : GI_BOTTLE, 100.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE); + func_8002F434(&this->dyna.actor, globalCtx, getItemEntry.getItemId, 100.0f, 10.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index d34fb977b..c1169ae22 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -533,14 +533,13 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { break; } } else { - getItemId = Randomizer_GetItemIdFromKnownCheck( - RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50).getItemId; } } else { if (!gSaveContext.n64ddFlag) { getItemId = GI_HEART_PIECE; } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE).getItemId; } } func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); @@ -567,14 +566,13 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { break; } } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1500_POINTS, - CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50).getItemId; } } else { if (!gSaveContext.n64ddFlag) { getItemId = GI_HEART_PIECE; } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE).getItemId; } } diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index 5310fc65e..7687b74f3 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -457,7 +457,12 @@ void EnGe2_WaitTillCardGiven(EnGe2* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnGe2_SetActionAfterTalk; } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + } } } @@ -466,7 +471,12 @@ void EnGe2_GiveCard(EnGe2* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->actor.flags &= ~ACTOR_FLAG_16; this->actionFunc = EnGe2_WaitTillCardGiven; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c index 556e7c203..c9ee52d53 100644 --- a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c +++ b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c @@ -142,7 +142,12 @@ void EnGe3_WaitTillCardGiven(EnGe3* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnGe3_Wait; } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + } } } @@ -151,7 +156,12 @@ void EnGe3_GiveCard(EnGe3* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->actor.flags &= ~ACTOR_FLAG_16; this->actionFunc = EnGe3_WaitTillCardGiven; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index e1179fe1b..04b1f9b1e 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -956,7 +956,7 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { this->unk_20C = 0; if ((this->actor.params & 0xF0) == 0x90) { if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_CLAIM_CHECK) { - getItemId = gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS) : GI_SWORD_BGS; + getItemId = gSaveContext.n64ddFlag ? Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS).getItemId : GI_SWORD_BGS; this->unk_20C = 1; } if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_EYEDROPS) { diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 22c19f5f0..02fc882d3 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -346,7 +346,7 @@ s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { if(!gSaveContext.n64ddFlag) { bombBagUpgrade = CUR_CAPACITY(UPG_BOMB_BAG) == 30 ? GI_BOMB_BAG_40 : GI_BOMB_BAG_30; } else { - bombBagUpgrade = Randomizer_GetItemIdFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40); + bombBagUpgrade = Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40).getItemId; } EnGo2_GetItem(this, globalCtx, bombBagUpgrade); Message_CloseTextbox(globalCtx); @@ -542,7 +542,7 @@ s16 EnGo2_GetStateGoronCityLink(GlobalContext* globalCtx, EnGo2* this) { } gSaveContext.infTable[16] |= 0x200; - EnGo2_GetItem(this, globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON)); + EnGo2_GetItem(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON).getItemId); this->actionFunc = EnGo2_SetupGetItem; Flags_SetTreasure(globalCtx, 0x1F); return 2; @@ -621,7 +621,7 @@ s16 EnGo2_GetStateGoronDmtBiggoron(GlobalContext* globalCtx, EnGo2* this) { return 0; } - EnGo2_GetItem(this, globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS)); + EnGo2_GetItem(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS).getItemId); Flags_SetTreasure(globalCtx, 0x1F); } else { EnGo2_GetItem(this, globalCtx, GI_SWORD_BGS); diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index af4eb8ef4..7c6d35269 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -659,7 +659,16 @@ s16 func_80A70058(GlobalContext* globalCtx, Actor* thisx) { gSaveContext.dogParams = 0; break; case 0x709F: - func_80A6F7CC(this, globalCtx, (gSaveContext.infTable[25] & 2) ? GI_RUPEE_BLUE : gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE) : GI_HEART_PIECE); + if (gSaveContext.infTable[25] & 2) { // Already brought the lost dog back + func_80A6F7CC(this, globalCtx, GI_RUPEE_BLUE); + } else { + if (!gSaveContext.n64ddFlag) { + func_80A6F7CC(this, globalCtx, GI_HEART_PIECE); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE); + func_80A6F7CC(this, globalCtx, getItemEntry.getItemId); + } + } this->actionFunc = func_80A714C4; break; } diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index cda6e476d..0babcaf42 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -464,10 +464,10 @@ void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { } else { if (gSaveContext.n64ddFlag) { if (this->isTrading) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG); + getItemId = Randomizer_GetItemFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG).getItemId; Flags_SetTreasure(globalCtx, 0x1F); } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA); + getItemId = Randomizer_GetItemFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA).getItemId; } } else { getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA; diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index fe66cff68..ae243b916 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -339,8 +339,8 @@ void func_80AA0EA0(EnMa1* this, GlobalContext* globalCtx) { this->actionFunc = func_80AA0EFC; } else { if (gSaveContext.n64ddFlag) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG); - func_8002F434(&this->actor, globalCtx, getItemId, 120.0f, 10.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 120.0f, 10.0f); } else { func_8002F434(&this->actor, globalCtx, GI_WEIRD_EGG, 120.0f, 10.0f); } @@ -357,7 +357,7 @@ void func_80AA0EFC(EnMa1* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, RG_EPONAS_SONG); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_EPONAS_SONG); // Prevents flag from getting set if we weren't able to get the item (i.e. Player is holding shield // when closing the textbox). if (malon->actor.parent != NULL && malon->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && @@ -367,7 +367,7 @@ void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, Randomiz // (confirmed via breakpoints in a vanilla save). malon->actionFunc = func_80AA0D88; } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&malon->actor, globalCtx, getItemId, 10000.0f, 100.0f); + func_8002F434(&malon->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); } // make malon sing again after giving the item. malon->unk_1E8.unk_00 = 0; diff --git a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c index f42e09522..3516b4024 100644 --- a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c +++ b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c @@ -198,14 +198,24 @@ void func_80AACFA0(EnMk* this, GlobalContext* globalCtx) { gSaveContext.itemGetInf[1] |= 1; } else { // not sure when/how/if this is getting called - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE) : GI_HEART_PIECE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + } } } void func_80AAD014(EnMk* this, GlobalContext* globalCtx) { if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { this->actionFunc = func_80AACFA0; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE) : GI_HEART_PIECE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + } } this->flags |= 1; diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c index c31f2b923..96f8b87ea 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c @@ -305,8 +305,8 @@ void func_80ABA654(EnNiwLady* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (gSaveContext.n64ddFlag) { - s32 itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); - func_8002F434(&this->actor, globalCtx, itemId, 100.0f, 50.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 100.0f, 50.0f); } else { this->getItemId = GI_BOTTLE; func_8002F434(&this->actor, globalCtx, GI_BOTTLE, 100.0f, 50.0f); @@ -395,8 +395,8 @@ void func_80ABA9B8(EnNiwLady* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (gSaveContext.n64ddFlag) { - s32 itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); - func_8002F434(&this->actor, globalCtx, itemId, 200.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 200.0f, 100.0f); } else { func_8002F434(&this->actor, globalCtx, GI_POCKET_EGG, 200.0f, 100.0f); } @@ -455,7 +455,7 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) { getItemId = !(gSaveContext.itemGetInf[2] & 0x1000) ? GI_POCKET_EGG : GI_COJIRO; if (gSaveContext.n64ddFlag && getItemId == GI_POCKET_EGG) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG).getItemId; } } func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f); diff --git a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c index cc7360c0a..0cafd58af 100644 --- a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c +++ b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c @@ -327,8 +327,8 @@ void GivePlayerRandoRewardSunSong(EnOkarinaTag* song, GlobalContext* globalCtx, !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_LETTER_ZELDA); - func_8002F434(&song->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA); + func_8002F434(&song->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c index 95fdd9b23..6d42a2c90 100644 --- a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c +++ b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c @@ -618,14 +618,12 @@ void func_80AF67D0(EnSa* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardSaria(EnSa* saria, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = - Randomizer_GetItemIdFromKnownCheck(check, RG_SARIAS_SONG); - + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SARIAS_SONG); if (saria->actor.parent != NULL && saria->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&saria->actor, globalCtx, getItemId, 10000.0f, 100.0f); + func_8002F434(&saria->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index 2d42c191e..facb0343a 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1035,8 +1035,12 @@ void EnSkj_SariaSongTalk(EnSkj* this, GlobalContext* globalCtx) { EnSkj_SetupWaitInRange(this); } else { func_80AFFE24(this); - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE) : GI_HEART_PIECE, EnSkj_GetItemXzRange(this), - EnSkj_GetItemYRange(this)); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } } } } @@ -1050,7 +1054,12 @@ void func_80AFFE44(EnSkj* this, GlobalContext* globalCtx) { this->actor.parent = NULL; EnSkj_SetupPostSariasSong(this); } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE) : GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } } } @@ -1529,7 +1538,7 @@ void EnSkj_WaitToGiveReward(EnSkj* this, GlobalContext* globalCtx) { if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) { func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 - ? Randomizer_GetItemIdFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE) + ? Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE).getItemId : sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); @@ -1544,7 +1553,7 @@ void EnSkj_GiveOcarinaGameReward(EnSkj* this, GlobalContext* globalCtx) { } else { func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 - ? Randomizer_GetItemIdFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE) + ? Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE).getItemId : sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); } diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c index b01c6b8c4..fe7e7897c 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -245,19 +245,19 @@ void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { case GI_RUPEE_GOLD: break; case GI_WALLET_ADULT: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT); + getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT).getItemId; break; case GI_STONE_OF_AGONY: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY); + getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY).getItemId; break; case GI_WALLET_GIANT: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT); + getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT).getItemId; break; case GI_BOMBCHUS_10: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10); + getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10).getItemId; break; case GI_HEART_PIECE: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE); + getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE).getItemId; break; } } else { diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 7b57bea89..9ca940d91 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -336,7 +336,7 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (!LINK_IS_ADULT) { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1E)) { - this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50); + this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50).getItemId; Flags_SetTreasure(globalCtx, 0x1E); } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x2000)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Pachinko ☆☆☆☆☆ %d\n" VT_RST, @@ -351,7 +351,7 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { } } else { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1F)) { - this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50); + this->getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50).getItemId; Flags_SetTreasure(globalCtx, 0x1F); } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x4000)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Bow ☆☆☆☆☆ %d\n" VT_RST, diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 85e47a7e7..79e910f98 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -886,7 +886,12 @@ void func_80B15F54(EnTa* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->unk_2E0 &= ~0x2; func_80B13AA0(this, func_80B15E80, func_80B16938); - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE) : GI_MILK_BOTTLE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c index d4250fca2..f6ccda23e 100644 --- a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c +++ b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c @@ -233,8 +233,8 @@ void GivePlayerRandoRewardZeldaChild(EnZl4* zelda, GlobalContext* globalCtx, Ran Flags_SetTreasure(globalCtx, 0x1E); } else if (!Flags_GetTreasure(globalCtx, 0x1E) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA) && Actor_TextboxIsClosing(&zelda->actor, globalCtx) && (globalCtx->msgCtx.textId == 0x703C || globalCtx->msgCtx.textId == 0x703D)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_LETTER_ZELDA); - func_8002F434(&zelda->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA); + func_8002F434(&zelda->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); } else if (Flags_GetTreasure(globalCtx, 0x1E) && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { gSaveContext.unk_13EE = 0x32; gSaveContext.eventChkInf[4] |= 1; diff --git a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c index 1cb3b53e9..5f622e947 100644 --- a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c +++ b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c @@ -5056,9 +5056,11 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) { HIGH_SCORE(HS_FISHING) |= 0x400; sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1; - getItemId = gSaveContext.n64ddFlag ? - Randomizer_GetItemIdFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE) : - GI_HEART_PIECE; + if (!gSaveContext.n64ddFlag) { + getItemId = GI_HEART_PIECE; + } else { + getItemId = Randomizer_GetItemFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE).getItemId; + } } } } else { @@ -5066,9 +5068,11 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) { HIGH_SCORE(HS_FISHING) |= 0x800; sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1; - getItemId = gSaveContext.n64ddFlag ? - Randomizer_GetItemIdFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD) : - GI_SCALE_GOLD; + if (!gSaveContext.n64ddFlag) { + getItemId = GI_SCALE_GOLD; + } else { + getItemId = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD).getItemId; + } } } } @@ -5142,9 +5146,8 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_SCALE_GOLD, 2000.0f, 1000.0f); } else { - func_8002F434(&this->actor, globalCtx, - Randomizer_GetItemIdFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD), 2000.0f, - 1000.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 2000.0f, 1000.0f); } } break; diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index 0c6e3dedc..897c2e9ff 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -59,11 +59,11 @@ void ItemBHeart_Update(Actor* thisx, GlobalContext* globalCtx) { Flags_SetCollectible(globalCtx, 0x1F); Actor_Kill(&this->actor); } else { - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum); - func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 40.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_HEART_CONTAINER_2, 30.0f, 40.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 40.0f); } } } diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index 7b8f97ae6..297ac112d 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -133,11 +133,11 @@ void func_80B85824(ItemEtcetera* this, GlobalContext* globalCtx) { } Actor_Kill(&this->actor); } else { - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); - func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 50.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 50.0f); } } } @@ -156,11 +156,11 @@ void func_80B858B4(ItemEtcetera* this, GlobalContext* globalCtx) { } else { if (0) {} // Necessary to match - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); - func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 50.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 50.0f); } if ((globalCtx->gameplayFrames & 0xD) == 0) { diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index 5e415b06c..5ed63f96c 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -190,11 +190,12 @@ void ItemOcarina_WaitInWater(ItemOcarina* this, GlobalContext* globalCtx) { this->actionFunc = ItemOcarina_StartSoTCutscene; this->actor.draw = NULL; } else { - func_8002F434(&this->actor, globalCtx, - gSaveContext.n64ddFlag - ? Randomizer_GetItemIdFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT) - : GI_OCARINA_OOT, - 30.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_OCARINA_OOT, 30.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 50.0f); + } if ((globalCtx->gameplayFrames & 13) == 0) { EffectSsBubble_Spawn(globalCtx, &this->actor.world.pos, 0.0f, 0.0f, 10.0f, 0.13f); From 806019d0cb5136a95d34f33fc145b2024bcfd656 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 15 Aug 2022 12:48:57 -0500 Subject: [PATCH 073/212] Move check for gRandoQuestItemFanfares into MOD_NONE block within Audio_PlayFanfare_Rando --- soh/src/code/code_800EC960.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c index 2898d46ef..9f969e02f 100644 --- a/soh/src/code/code_800EC960.c +++ b/soh/src/code/code_800EC960.c @@ -3916,27 +3916,27 @@ void Audio_PlayFanfare_Rando(GetItemEntry getItem) { if (getItemId == GI_HEART_PIECE_WIN && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000)) { temp1 = NA_BGM_HEART_GET | 0x900; } + // If the setting is toggled on and we get special quest items (longer fanfares): + if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) { + // If we get a medallion, play the "get a medallion" fanfare + if ((getItemId >= RG_FOREST_MEDALLION) && (getItemId <= RG_LIGHT_MEDALLION)) { + temp1 = NA_BGM_MEDALLION_GET | 0x900; + } + // If it's a Spiritual Stone, play the "get a spiritual stone" fanfare + if ((getItemId >= RG_KOKIRI_EMERALD) && (getItemId <= RG_ZORA_SAPPHIRE)) { + temp1 = NA_BGM_SPIRITUAL_STONE | 0x900; + } + // If the item we're getting is a song, play the "learned a song" fanfare + if ((getItemId >= RG_ZELDAS_LULLABY) && (getItemId <= RG_PRELUDE_OF_LIGHT)) { + temp1 = NA_BGM_OCA_FAIRY_GET | 0x900; + } + } Audio_PlayFanfare(temp1); } } else if (getItem.modIndex == MOD_RANDOMIZER) { if ((getItemId >= RG_BOTTLE_WITH_RED_POTION && getItemId <= RG_BOTTLE_WITH_BIG_POE) || (getItemId >= RG_DEKU_TREE_MAP && getItemId <= RG_GANONS_CASTLE_SMALL_KEY)) { temp1 = NA_BGM_ITEM_GET | 0x900; } - // If the setting is toggled on and we get special quest items (longer fanfares): - if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) { - // If we get a medallion, play the "get a medallion" fanfare - if ((getItemId >= RG_FOREST_MEDALLION) && (getItemId <= RG_LIGHT_MEDALLION)) { - temp1 = NA_BGM_MEDALLION_GET | 0x900; - } - // If it's a Spiritual Stone, play the "get a spiritual stone" fanfare - if ((getItemId >= RG_KOKIRI_EMERALD) && (getItemId <= RG_ZORA_SAPPHIRE)) { - temp1 = NA_BGM_SPIRITUAL_STONE | 0x900; - } - // If the item we're getting is a song, play the "learned a song" fanfare - if ((getItemId >= RG_ZELDAS_LULLABY) && (getItemId <= RG_PRELUDE_OF_LIGHT)) { - temp1 = NA_BGM_OCA_FAIRY_GET | 0x900; - } - } Audio_PlayFanfare(temp1); } } From 170b297a7ab4124b5c111e3a72fdf5e05016bb38 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 15 Aug 2022 14:33:29 -0500 Subject: [PATCH 074/212] Introduce some new methods and migrate most actors to them --- soh/include/functions.h | 4 +- soh/src/code/z_actor.c | 44 ++++++++++++++++--- soh/src/code/z_play.c | 11 +++-- .../ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c | 2 +- .../overlays/actors/ovl_Demo_Im/z_demo_im.c | 2 +- .../actors/ovl_Door_Warp1/z_door_warp1.c | 2 +- soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c | 16 +++---- .../ovl_En_Diving_Game/z_en_diving_game.c | 4 +- soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c | 6 +-- .../actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c | 4 +- soh/src/overlays/actors/ovl_En_Du/z_en_du.c | 2 +- soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c | 2 +- soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c | 4 +- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 27 +++++++++--- soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 4 +- soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c | 4 +- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 14 +++++- soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 3 +- soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 13 ++++-- soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 10 ++--- soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c | 4 +- .../ovl_En_Okarina_Tag/z_en_okarina_tag.c | 2 +- soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c | 2 +- soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c | 18 +++++--- .../ovl_En_Syateki_Man/z_en_syateki_man.c | 18 ++++++-- .../ovl_En_Syateki_Man/z_en_syateki_man.h | 1 + soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 2 +- soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 6 +-- soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c | 2 +- .../overlays/actors/ovl_Fishing/z_fishing.c | 15 +++++-- .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 2 +- .../ovl_Item_Etcetera/z_item_etcetera.c | 4 +- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 2 +- 33 files changed, 173 insertions(+), 83 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index 086b98939..be9e2bb1b 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -452,7 +452,9 @@ u32 Actor_TextboxIsClosing(Actor* actor, GlobalContext* globalCtx); s8 func_8002F368(GlobalContext* globalCtx); void Actor_GetScreenPos(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y); u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx); -s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId); +s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry); +s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange); +void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry); s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange); void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId); void func_8002F580(Actor* actor, GlobalContext* globalCtx); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 5bfa6572e..502e9bf18 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1955,15 +1955,16 @@ u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx) { } } -s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { +s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry) { Player* player = GET_PLAYER(globalCtx); if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { - if (((player->heldActor != NULL) && ((getItemId > GI_NONE) && (getItemId < GI_MAX)) || - (gSaveContext.n64ddFlag && (getItemId > RG_NONE) && (getItemId < RG_MAX))) || + if (((player->heldActor != NULL) && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX)) || + (gSaveContext.n64ddFlag && (getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))) || (!(player->stateFlags1 & 0x20000800))) { - if ((getItemId != GI_NONE)) { - player->getItemId = getItemId; + if ((getItemEntry.getItemId != GI_NONE)) { + player->getItemEntry = getItemEntry; + player->getItemId = getItemEntry.getItemId; player->interactRangeActor = &player->actor; player->getItemDirection = player->actor.shape.rot.y; return true; @@ -1974,6 +1975,37 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { return false; } +s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange) { + Player* player = GET_PLAYER(globalCtx); + + if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { + if ((((player->heldActor != NULL) || (actor == player->targetActor)) && + ((!gSaveContext.n64ddFlag && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) || (gSaveContext.n64ddFlag && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) || + (!(player->stateFlags1 & 0x20000800))) { + if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { + s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; + s32 absYawDiff = ABS(yawDiff); + + if ((getItemEntry.getItemId != GI_NONE) || (player->getItemDirection < absYawDiff)) { + player->getItemEntry = getItemEntry; + player->getItemId = getItemEntry.getItemId; + player->interactRangeActor = actor; + player->getItemDirection = absYawDiff; + return true; + } + } + } + } + + return false; +} + +void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry) { + GiveItemEntryFromActor(actor, globalCtx, getItemEntry, 50.0f, 10.0f); +} + +// TODO: Rename to GiveItemIdFromActor or similar +// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActor s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) { Player* player = GET_PLAYER(globalCtx); @@ -1998,6 +2030,8 @@ s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzR return false; } +// TODO: Rename to GiveItemIdFromActorWithFixedRange or similar +// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActorWithFixedRange void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) { func_8002F434(actor, globalCtx, getItemId, 50.0f, 10.0f); } diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 006fd37af..8156f06e6 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -202,7 +202,7 @@ void GivePlayerRandoRewardSongOfTime(GlobalContext* globalCtx, RandomizerCheck c if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); - GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } @@ -217,7 +217,7 @@ void GivePlayerRandoRewardNocturne(GlobalContext* globalCtx, RandomizerCheck che CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW); - GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetEventChkInf(0xAA); } } @@ -229,7 +229,7 @@ void GivePlayerRandoRewardRequiem(GlobalContext* globalCtx, RandomizerCheck chec if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); - GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetEventChkInf(0xAC); } } @@ -243,8 +243,7 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && globalCtx->sceneLoadFlag == 0) { GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT); - if (player->pendingFlag.flagType == FLAG_NONE && GiveItemWithoutActor(globalCtx, getItem.getItemId)) { - player->getItemEntry = getItem; + if (player->pendingFlag.flagType == FLAG_NONE && GiveItemEntryWithoutActor(globalCtx, getItem)) { player->pendingFlag.flagID = 0x1E; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } @@ -258,7 +257,7 @@ void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck ch if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemEntry.getItemId && getItemEntry.getItemId != GI_ICE_TRAP)) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { - GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetEventChkInf(0xC1); } } diff --git a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c index c0dc480b0..e04755a34 100644 --- a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c +++ b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c @@ -77,7 +77,7 @@ void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx Flags_SetTreasure(globalCtx, this->fountainType + 1); Actor_Kill(&this->actor); } else if (!Flags_GetTreasure(globalCtx, this->fountainType + 1)) { - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c index dc119f16a..93007f547 100644 --- a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c +++ b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c @@ -905,7 +905,7 @@ void GivePlayerRandoRewardImpa(Actor* impa, GlobalContext* globalCtx, Randomizer !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { - func_8002F434(impa, globalCtx, getItemEntry.getItemId, 75.0f, 50.0f); + GiveItemEntryFromActor(impa, globalCtx, getItemEntry, 75.0f, 50.0f); } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { gSaveContext.eventChkInf[5] |= 0x200; globalCtx->sceneLoadFlag = 0x14; diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 4825c0943..5130f1ca8 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -468,7 +468,7 @@ void GivePlayerRandoReward(DoorWarp1* this, Player* player, GlobalContext* globa !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { if (adult) { OnePointCutscene_Init(globalCtx, 0x25E8, 999, &this->actor, MAIN_CAM); diff --git a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c index aac0e0c30..5debc658e 100644 --- a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c +++ b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c @@ -126,11 +126,11 @@ void func_809B0558(EnAni* this, GlobalContext* globalCtx) { } gSaveContext.itemGetInf[1] |= 0x20; } else { - if (gSaveContext.n64ddFlag) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 200.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 200.0f); } } } @@ -140,11 +140,11 @@ void func_809B05F0(EnAni* this, GlobalContext* globalCtx) { EnAni_SetupAction(this, func_809B0558); } - if (gSaveContext.n64ddFlag) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 200.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 200.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c index ab724ec63..1f0d47d7a 100644 --- a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c +++ b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c @@ -457,7 +457,7 @@ void func_809EEA00(EnDivingGame* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 90.0f, 10.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 90.0f, 10.0f); } this->actionFunc = func_809EEA90; } @@ -472,7 +472,7 @@ void func_809EEA90(EnDivingGame* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 90.0f, 10.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 90.0f, 10.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c index b2208de52..d3a924356 100644 --- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c +++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c @@ -372,7 +372,7 @@ void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { if (this->actor.params == 0x9) { if (gSaveContext.n64ddFlag) { GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_STICK_UPGRADE_30, this->actor.id, this->actor.params, globalCtx->sceneNum); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 130.0f, 100.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f); } else if (CUR_UPG_VALUE(UPG_STICKS) < 2) { func_8002F434(&this->actor, globalCtx, GI_STICK_UPGRADE_20, 130.0f, 100.0f); } else { @@ -381,7 +381,7 @@ void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { } else if (this->actor.params == 0xA) { if (gSaveContext.n64ddFlag) { GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NUT_UPGRADE_40, this->actor.id, this->actor.params, globalCtx->sceneNum); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 130.0f, 100.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f); } else if (CUR_UPG_VALUE(UPG_NUTS) < 2) { func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_30, 130.0f, 100.0f); } else { @@ -392,7 +392,7 @@ void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, this->dnsItemEntry->getItemId, 130.0f, 100.0f); } else { GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(this->dnsItemEntry->getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 130.0f, 100.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c index b6c61504d..c50e1ec77 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c @@ -140,14 +140,14 @@ void EnDntDemo_Judge(EnDntDemo* this, GlobalContext* globalCtx) { case PLAYER_MASK_SKULL: if (!Flags_GetTreasure(globalCtx, 0x1F)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_SKULL_MASK, GI_STICK_UPGRADE_30); - GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetTreasure(globalCtx, 0x1F); } break; case PLAYER_MASK_TRUTH: if (!Flags_GetTreasure(globalCtx, 0x1E)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_MASK_OF_TRUTH, GI_NUT_UPGRADE_40); - GiveItemWithoutActor(globalCtx, getItemEntry.getItemId); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetTreasure(globalCtx, 0x1E); } break; diff --git a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c index f003e4b99..b1953bc74 100644 --- a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c +++ b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c @@ -552,7 +552,7 @@ void func_809FEC70(EnDu* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_BRACELET, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GC_DARUNIAS_JOY, GI_BRACELET); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c index 2acef3ee9..28aa94c0e 100644 --- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -155,7 +155,7 @@ void GivePlayerRandoRewardSongOfStorms(EnFu* windmillGuy, GlobalContext* globalC windmillGuy->actionFunc = func_80A1DBD4; } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_STORMS); - func_8002F434(&windmillGuy->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&windmillGuy->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c index 602f1c98f..f2b6c8638 100644 --- a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c +++ b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c @@ -357,7 +357,7 @@ void func_80A2FB40(EnGb* this, GlobalContext* globalCtx) { func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE); - func_8002F434(&this->dyna.actor, globalCtx, getItemEntry.getItemId, 100.0f, 10.0f); + GiveItemEntryFromActor(&this->dyna.actor, globalCtx, getItemEntry, 100.0f, 10.0f); } this->actionFunc = func_80A2FBB0; } @@ -372,7 +372,7 @@ void func_80A2FBB0(EnGb* this, GlobalContext* globalCtx) { func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE); - func_8002F434(&this->dyna.actor, globalCtx, getItemEntry.getItemId, 100.0f, 10.0f); + GiveItemEntryFromActor(&this->dyna.actor, globalCtx, getItemEntry, 100.0f, 10.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index c1169ae22..d765f6ac8 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -502,6 +502,7 @@ void EnGe1_SetupWait_Archery(EnGe1* this, GlobalContext* globalCtx) { } void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { + GetItemEntry getItemEntry; s32 getItemId; if (Actor_HasParent(&this->actor, globalCtx)) { @@ -533,20 +534,28 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { break; } } else { - getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemId = getItemEntry.getItemId; } } else { if (!gSaveContext.n64ddFlag) { getItemId = GI_HEART_PIECE; } else { - getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemId = getItemEntry.getItemId; } } - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { + GetItemEntry getItemEntry; s32 getItemId; if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { @@ -566,17 +575,23 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { break; } } else { - getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemId = getItemEntry.getItemId; } } else { if (!gSaveContext.n64ddFlag) { getItemId = GI_HEART_PIECE; } else { - getItemId = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemId = getItemEntry.getItemId; } } - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } void EnGe1_TalkWinPrize_Archery(EnGe1* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index 7687b74f3..9fc4ce295 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -461,7 +461,7 @@ void EnGe2_WaitTillCardGiven(EnGe2* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); } } } @@ -475,7 +475,7 @@ void EnGe2_GiveCard(EnGe2* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c index c9ee52d53..261ce49ec 100644 --- a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c +++ b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c @@ -146,7 +146,7 @@ void EnGe3_WaitTillCardGiven(EnGe3* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); } } } @@ -160,7 +160,7 @@ void EnGe3_GiveCard(EnGe3* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index 04b1f9b1e..27fc87922 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -946,6 +946,7 @@ void func_80A40B1C(EnGo* this, GlobalContext* globalCtx) { void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { f32 xzDist; f32 yDist; + GetItemEntry getItemEntry; s32 getItemId; if (Actor_HasParent(&this->actor, globalCtx)) { @@ -956,7 +957,12 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { this->unk_20C = 0; if ((this->actor.params & 0xF0) == 0x90) { if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_CLAIM_CHECK) { - getItemId = gSaveContext.n64ddFlag ? Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS).getItemId : GI_SWORD_BGS; + if (!gSaveContext.n64ddFlag) { + getItemId = GI_SWORD_BGS; + } else { + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS); + getItemId = getItemEntry.getItemId; + } this->unk_20C = 1; } if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_EYEDROPS) { @@ -973,7 +979,11 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { yDist = fabsf(this->actor.yDistToPlayer) + 1.0f; xzDist = this->actor.xzDistToPlayer + 1.0f; - func_8002F434(&this->actor, globalCtx, getItemId, xzDist, yDist); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, getItemId, xzDist, yDist); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzDist, yDist); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index 7c6d35269..a0f95d2e3 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -666,7 +666,8 @@ s16 func_80A70058(GlobalContext* globalCtx, Actor* thisx) { func_80A6F7CC(this, globalCtx, GI_HEART_PIECE); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE); - func_80A6F7CC(this, globalCtx, getItemEntry.getItemId); + this->unkGetItemId = getItemEntry.getItemId; + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); } } this->actionFunc = func_80A714C4; diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index 0babcaf42..0a937a53d 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -453,6 +453,7 @@ void EnKz_Wait(EnKz* this, GlobalContext* globalCtx) { } void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { + GetItemEntry getItemEntry; s32 getItemId; f32 xzRange; f32 yRange; @@ -464,17 +465,23 @@ void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { } else { if (gSaveContext.n64ddFlag) { if (this->isTrading) { - getItemId = Randomizer_GetItemFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG); + getItemId = getItemEntry.getItemId; Flags_SetTreasure(globalCtx, 0x1F); } else { - getItemId = Randomizer_GetItemFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA); + getItemId = getItemEntry.getItemId; } } else { getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA; } yRange = fabsf(this->actor.yDistToPlayer) + 1.0f; xzRange = this->actor.xzDistToPlayer + 1.0f; - func_8002F434(&this->actor, globalCtx, getItemId, xzRange, yRange); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, getItemId, xzRange, yRange); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzRange, yRange); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index ae243b916..88c5b0724 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -338,11 +338,11 @@ void func_80AA0EA0(EnMa1* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = func_80AA0EFC; } else { - if (gSaveContext.n64ddFlag) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 120.0f, 10.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_WEIRD_EGG, 120.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 120.0f, 10.0f); } } } @@ -367,7 +367,7 @@ void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, Randomiz // (confirmed via breakpoints in a vanilla save). malon->actionFunc = func_80AA0D88; } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&malon->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&malon->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } // make malon sing again after giving the item. malon->unk_1E8.unk_00 = 0; diff --git a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c index 3516b4024..a53aeadf9 100644 --- a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c +++ b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c @@ -202,7 +202,7 @@ void func_80AACFA0(EnMk* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); } } } @@ -214,7 +214,7 @@ void func_80AAD014(EnMk* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c index 0cafd58af..dc082ec0f 100644 --- a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c +++ b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c @@ -328,7 +328,7 @@ void GivePlayerRandoRewardSunSong(EnOkarinaTag* song, GlobalContext* globalCtx, Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA); - func_8002F434(&song->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&song->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c index 6d42a2c90..6d9c160a8 100644 --- a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c +++ b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c @@ -623,7 +623,7 @@ void GivePlayerRandoRewardSaria(EnSa* saria, GlobalContext* globalCtx, Randomize !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&saria->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&saria->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c index fe7e7897c..8705bfa6d 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -239,27 +239,29 @@ void EnSth_ParentRewardObtainedWait(EnSth* this, GlobalContext* globalCtx) { void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { u16 getItemId = sGetItemIds[this->actor.params]; + GetItemEntry getItemEntry; if (gSaveContext.n64ddFlag) { switch (getItemId) { case GI_RUPEE_GOLD: break; case GI_WALLET_ADULT: - getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT); break; case GI_STONE_OF_AGONY: - getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY); break; case GI_WALLET_GIANT: - getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT); break; case GI_BOMBCHUS_10: - getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10); break; case GI_HEART_PIECE: - getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE); break; } + getItemId = getItemEntry.getItemId; } else { switch (this->actor.params) { case 1: @@ -277,7 +279,11 @@ void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { } } - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } void EnSth_GiveReward(EnSth* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 9ca940d91..63f8662bc 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -336,7 +336,8 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (!LINK_IS_ADULT) { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1E)) { - this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50); + this->getItemId = this->getItemEntry.getItemId; Flags_SetTreasure(globalCtx, 0x1E); } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x2000)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Pachinko ☆☆☆☆☆ %d\n" VT_RST, @@ -351,7 +352,8 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { } } else { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1F)) { - this->getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50); + this->getItemId = this->getItemEntry.getItemId; Flags_SetTreasure(globalCtx, 0x1F); } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x4000)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Bow ☆☆☆☆☆ %d\n" VT_RST, @@ -371,7 +373,11 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { this->getItemId = GI_RUPEE_PURPLE; } } - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } this->actionFunc = EnSyatekiMan_GivePrize; break; case SYATEKI_RESULT_ALMOST: @@ -400,7 +406,11 @@ void EnSyatekiMan_GivePrize(EnSyatekiMan* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = EnSyatekiMan_FinishPrize; } else { - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h index d82cdf9c7..9caa7c88f 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h @@ -28,6 +28,7 @@ typedef struct EnSyatekiMan { /* 0x0220 */ Actor* tempGallery; /* 0x0224 */ EnSyatekiManOtherFunc blinkFunc; // Seems to be part of a blink system with unk_20C and unk_20E, but it's unused. /* 0x0228 */ s16 csCam; + /* */ GetItemEntry getItemEntry; } EnSyatekiMan; // size = 0x022C #endif diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 79e910f98..3b9cf80bd 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -890,7 +890,7 @@ void func_80B15F54(EnTa* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index 3aa000b4c..90e401f06 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -292,14 +292,12 @@ void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, Rando if (!(gSaveContext.eventChkInf[5] & sheikType)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { - if (func_8002F434(&sheik->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f)) { - player->getItemEntry = getItemEntry; + if (GiveItemEntryFromActor(&sheik->actor, globalCtx, getItemEntry, 10000.0f, 100.0f)) { player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } } else if (check != RC_SHEIK_AT_TEMPLE) { - if (func_8002F434(&sheik->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f)) { - player->getItemEntry = getItemEntry; + if (GiveItemEntryFromActor(&sheik->actor, globalCtx, getItemEntry, 10000.0f, 100.0f)) { player->pendingFlag.flagID = 0x55; player->pendingFlag.flagType = FLAG_EVENT_CHECK_INF; } diff --git a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c index f6ccda23e..96bf18aef 100644 --- a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c +++ b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c @@ -234,7 +234,7 @@ void GivePlayerRandoRewardZeldaChild(EnZl4* zelda, GlobalContext* globalCtx, Ran } else if (!Flags_GetTreasure(globalCtx, 0x1E) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA) && Actor_TextboxIsClosing(&zelda->actor, globalCtx) && (globalCtx->msgCtx.textId == 0x703C || globalCtx->msgCtx.textId == 0x703D)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA); - func_8002F434(&zelda->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&zelda->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } else if (Flags_GetTreasure(globalCtx, 0x1E) && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { gSaveContext.unk_13EE = 0x32; gSaveContext.eventChkInf[4] |= 1; diff --git a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c index 5f622e947..2e653aeeb 100644 --- a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c +++ b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c @@ -5002,6 +5002,7 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_NONE)) && Message_ShouldAdvance(globalCtx)) { s32 getItemId; + GetItemEntry getItemEntry; Message_CloseTextbox(globalCtx); @@ -5059,7 +5060,8 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { getItemId = GI_HEART_PIECE; } else { - getItemId = Randomizer_GetItemFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE); + getItemId = getItemEntry.getItemId; } } } @@ -5071,7 +5073,8 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { getItemId = GI_SCALE_GOLD; } else { - getItemId = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD); + getItemId = getItemEntry.getItemId; } } } @@ -5082,7 +5085,11 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { } this->actor.parent = NULL; - func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); + } this->unk_15C = 23; } break; @@ -5147,7 +5154,7 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_SCALE_GOLD, 2000.0f, 1000.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 2000.0f, 1000.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); } } break; diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index 897c2e9ff..304c3053d 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -63,7 +63,7 @@ void ItemBHeart_Update(Actor* thisx, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_HEART_CONTAINER_2, 30.0f, 40.0f); } else { GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 40.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 40.0f); } } } diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index 297ac112d..e638001cb 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -137,7 +137,7 @@ void func_80B85824(ItemEtcetera* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f); } } } @@ -160,7 +160,7 @@ void func_80B858B4(ItemEtcetera* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f); } if ((globalCtx->gameplayFrames & 0xD) == 0) { diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index 5ed63f96c..7acfa4b62 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -194,7 +194,7 @@ void ItemOcarina_WaitInWater(ItemOcarina* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_OCARINA_OOT, 30.0f, 50.0f); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 30.0f, 50.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f); } if ((globalCtx->gameplayFrames & 13) == 0) { From 4be473feded067af50a24d9aa83a2ad040d6a555 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Mon, 15 Aug 2022 14:02:48 -0700 Subject: [PATCH 075/212] Add German translations Thanks to Menzelmeister on Discord for translating to German --- .../Enhancements/randomizer/randomizer.cpp | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 770cf1dda..6c3f2db95 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4730,63 +4730,63 @@ void Rando_Init(void) { CustomMessageMinimal NaviMessages[NaviMsgCount] = { { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", - "%cGerman tip about playing rando! 0", + "%cFehlt dir ein kleiner Schlüssel in &einem Labyrinth? Vielleicht hat ihn&ja der %rEndgegner%c!", "%cFrench tip about playing rando! 0" }, { "%cSometimes you can use the %rMegaton&Hammer %cinstead of bombs!", - "%cGerman tip about playing rando! 1", + "%cManchmal kannst du den %rStahlhammer&%cstatt Bomben verwenden!", "%cFrench tip about playing rando! 1" }, { "%cThere are three %gbusiness scrubs %cin &Hyrule who sell %wmysterious items%c. Do&you know where they are?", - "%cGerman tip about playing rando! 2", + "%cEs gibt drei %gDeku-Händler %cin Hyrule&die mysteriöse Gegenstände&verkaufen. Weißt du wo Sie sind?", "%cFrench tip about playing rando! 2" }, { "%cStuck on this seed? You could &throw in the towel and check the&%wspoiler log%c...", - "%cGerman tip about playing rando! 3", + "%cHängst du bei diesem Seed fest?&Du könntest die Flinte ins Korn&werfen und ins %wSpoiler Log %cschauen...", "%cFrench tip about playing rando! 3" }, { "%cDid you know that the %yHover&Boots %ccan be used to cross&quicksand?", - "%cGerman tip about playing rando! 4", + "%cWusstest du, dass du mit den&%yGleitstiefeln %cTreibsand überqueren&kannst?", "%cFrench tip about playing rando! 4" }, { "%cYou can reach the back of %wImpa's&House %cby jumping from the&unfinished house with a %rcucco%c!", - "%cGerman tip about playing rando! 5", + "%cDu kannst den Balkon von %wImpas&Haus %cerreichen indem du von&der Baustelle aus mit einem %rHuhn&%cspringst!", "%cFrench tip about playing rando! 5" }, { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", - "%cGerman tip about playing rando! 6", + "%cDie %yGeister-Prüfung %cin %pGanons&Schloss %chat irgendwo eine&%wversteckte Kiste%c. Weißt du schon&wo?", "%cFrench tip about playing rando! 6" }, { "%cYou know the %wBombchu Bowling&Alley%c? I heard %wonly two of the &prizes %care worthwhile. The rest &is junk!", - "%cGerman tip about playing rando! 7", + "%cKennst du die %wMinenbowlingbahn%c?&Ich habe gehört dass sich nur &%wzwei der Preise%c lohnen. Der Rest&ist Krimskrams!", "%cFrench tip about playing rando! 7" }, { "%cHave you been using %wDeku Nuts&%cenough? I've seen them blow up&a %rBombchu%c!", - "%cGerman tip about playing rando! 8", + "%cBenutzt du auch genügend %wDeku&Nüsse%c? Ich habe mal gesehen dass&man damit %rKrabbelminen %cdetonieren&kann!", "%cFrench tip about playing rando! 8" }, { "%cYou might end up with an %wextra&key %cfor the %bWater Temple %cor the&%rFire Temple%c. It's for your safety!", - "%cGerman tip about playing rando! 9", + "%cVielleicht verbleibt dir im&%bWassertempel %coder %rFeuertempel %cein&%wzusätzlicher Schlüssel%c. Dies&ist zu deiner Sicherheit!", "%cFrench tip about playing rando! 9" }, { "%cIf you can't pick up a %rbomb&flower %cwith your hands, you can&still detonate it with %rfire %cor&with %warrows%c!", - "%cGerman tip about playing rando! 10", + "%cNur weil du eine %rDonnerblume&%cnicht hochheben kannst, so kannst&du sie immernoch mit %rFeuer %coder&%wPfeilen %cdetonieren!", "%cFrench tip about playing rando! 10" }, { "%cEven an adult can't push large&blocks without some %wextra&strength%c!", - "%cGerman tip about playing rando! 11", + "%cSelbst ein Erwachsener kann ohne&etwas %wzusätzliche Kraft %ckeine&großen Blöcke verschieben!", "%cFrench tip about playing rando! 11" }, { "%cI've heard that %rFlare Dancer&%cis weak to the Master Sword!&Have you tried it?", - "%cGerman tip about playing rando! 12", + "%cIch habe gehört dass der&%rFlammenderwisch %ceine Schwäche für&das Masterschwert aufweist. Hast du&es schonmal versucht einzusetzen?", "%cFrench tip about playing rando! 12" }, { "%cDon't have a weapon to kill a&%rspider%c? Try throwing a %wpot&%cat it!", - "%cGerman tip about playing rando! 13", + "%cFehlt dir die Waffe um gegen&eine %rSkulltula %czu kämpfen? Versuch&Sie mit einem %wKrug %cabzuwerfen!", "%cFrench tip about playing rando! 13" }, { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", - "%cGerman tip about playing rando! 14", + "%cIch habe gehört dass die Stelle&%wfeuchten Bodens %cim %bZora-Fluss %cals&einzige keine %rSkulltula %cbeherbergt.", "%cFrench tip about playing rando! 14" }, }; From f8b55ea78ce5e9e479a7134b0129b046e397e1ae Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 22:46:52 -0400 Subject: [PATCH 076/212] Fixes ocarina game skull kids to set player->getItemEntry --- soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index facb0343a..beb37542f 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1536,11 +1536,12 @@ void EnSkj_WonOcarinaMiniGame(EnSkj* this, GlobalContext* globalCtx) { void EnSkj_WaitToGiveReward(EnSkj* this, GlobalContext* globalCtx) { if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) { - func_8002F434(&this->actor, globalCtx, - gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 - ? Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE).getItemId - : sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], - 26.0f, 26.0f); + if (gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 26.0f, 26.0f); + } else { + func_8002F434(&this->actor, globalCtx, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); + } this->actionFunc = EnSkj_GiveOcarinaGameReward; } @@ -1551,11 +1552,12 @@ void EnSkj_GiveOcarinaGameReward(EnSkj* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnSkj_FinishOcarinaGameRound; } else { - func_8002F434(&this->actor, globalCtx, - gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 - ? Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE).getItemId - : sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], - 26.0f, 26.0f); + if (gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 26.0f, 26.0f); + } else { + func_8002F434(&this->actor, globalCtx, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); + } } } From 881529c7bf1889241fb91156347b48d79a24db94 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 23:08:31 -0400 Subject: [PATCH 077/212] Sets `z_en_box.c` to set `player->getItemEntry` --- soh/soh/OTRGlobals.h | 1 + soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 750dd911e..5be94cb40 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -105,6 +105,7 @@ bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, Get bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx); GetItemEntry ItemTable_Retrieve(int16_t getItemID); +GetItemEntry ItemTable_RetrieveEntry(s16 modIndex, s16 getItemID); #endif #endif diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index a3e384ec5..a2f57ad6a 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -70,7 +70,7 @@ static InitChainEntry sInitChain[] = { }; static UNK_TYPE sUnused; -int32_t sItem; +GetItemEntry sItem; void EnBox_SetupAction(EnBox* this, EnBoxActionFunc actionFunc) { this->actionFunc = actionFunc; @@ -446,40 +446,43 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) { func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos); if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f && Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) { - sItem = Randomizer_GetRandomizedItem(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum).getItemId; + sItem = Randomizer_GetRandomizedItem(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); + GetItemEntry blueRupee = ItemTable_RetrieveEntry(MOD_NONE, GI_RUPEE_BLUE); // RANDOTODO treasure chest game rando if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) { if((this->dyna.actor.params & 0xF) < 2) { if(Flags_GetCollectible(globalCtx, 0x1B)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 2 && (this->dyna.actor.params & 0xF) < 4) { if(Flags_GetCollectible(globalCtx, 0x1C)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 4 && (this->dyna.actor.params & 0xF) < 6) { if(Flags_GetCollectible(globalCtx, 0x1D)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 6 && (this->dyna.actor.params & 0xF) < 8) { if(Flags_GetCollectible(globalCtx, 0x1E)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 8 && (this->dyna.actor.params & 0xF) < 10) { if(Flags_GetCollectible(globalCtx, 0x1F)) { - sItem = GI_RUPEE_BLUE; + sItem = blueRupee; } } } } - - func_8002F554(&this->dyna.actor, globalCtx, 0 - sItem); + // Chests need to have a negative getItemId in order to not immediately give their item + // when approaching. + sItem.getItemId = 0 - sItem.getItemId; + GiveItemEntryFromActorWithFixedRange(&this->dyna.actor, globalCtx, sItem); } if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) { EnBox_SetupAction(this, EnBox_Open); @@ -591,7 +594,7 @@ void EnBox_Update(Actor* thisx, GlobalContext* globalCtx) { } if (((!gSaveContext.n64ddFlag && ((this->dyna.actor.params >> 5 & 0x7F) == 0x7C)) || - (gSaveContext.n64ddFlag && sItem == GI_ICE_TRAP)) && + (gSaveContext.n64ddFlag && sItem.getItemId == RG_ICE_TRAP)) && this->actionFunc == EnBox_Open && this->skelanime.curFrame > 45 && this->iceSmokeTimer < 100) EnBox_SpawnIceSmoke(this, globalCtx); } From d0d567697bc05dce4e8709a8dbfe72f755c99798 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 15 Aug 2022 22:10:31 -0500 Subject: [PATCH 078/212] Fix logical errors and migrate most of the rest of the rando checks to GiveItemEntryFromActor --- soh/soh/OTRGlobals.cpp | 4 ++-- soh/src/code/z_actor.c | 5 +++-- .../ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c | 22 ++++++++++++++----- .../ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h | 1 + .../actors/ovl_En_Ex_Item/z_en_ex_item.c | 22 ++++++++++++------- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c | 21 ++++++++++++++---- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h | 1 + soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 8 +++---- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 4 ++-- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 17 ++++++++------ soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 1 + soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 4 ++-- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 19 +++++++++------- soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c | 4 ++-- .../ovl_En_Syateki_Man/z_en_syateki_man.c | 5 +++-- .../overlays/actors/ovl_Fishing/z_fishing.c | 4 ++-- 16 files changed, 92 insertions(+), 50 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index a906d04d4..747a63421 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1643,11 +1643,11 @@ extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomi extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { return gSaveContext.n64ddFlag && (actor->parent != NULL) && - Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == GI_ICE_TRAP; + Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP; } extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { - return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == GI_ICE_TRAP; + return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP; } extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(GetItemID giid, char* buffer, const int maxBufferSize) { diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 502e9bf18..559f7ec69 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1980,8 +1980,9 @@ s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { if ((((player->heldActor != NULL) || (actor == player->targetActor)) && - ((!gSaveContext.n64ddFlag && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) || (gSaveContext.n64ddFlag && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) || - (!(player->stateFlags1 & 0x20000800))) { + ((!gSaveContext.n64ddFlag && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) || + (gSaveContext.n64ddFlag && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) || + (!(player->stateFlags1 & 0x20000800))) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; s32 absYawDiff = ABS(yawDiff); diff --git a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c index 25a58ec10..321f76810 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c +++ b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c @@ -177,6 +177,7 @@ void EnBomBowlPit_GivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) { func_8002DF54(globalCtx, NULL, 7); this->getItemId = sGetItemIds[this->prizeIndex]; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; if ((this->getItemId == GI_BOMB_BAG_30) && (CUR_CAPACITY(UPG_BOMB_BAG) == 30)) { this->getItemId = GI_BOMB_BAG_40; @@ -185,20 +186,27 @@ void EnBomBowlPit_GivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { switch (this->prizeIndex) { case EXITEM_BOMB_BAG_BOWLING: - this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); + this->getItemId = this->getItemEntry.getItemId; break; case EXITEM_HEART_PIECE_BOWLING: - this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); + this->getItemId = this->getItemEntry.getItemId; break; case EXITEM_BOMBCHUS_BOWLING: - this->getItemId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); + this->getItemId = this->getItemEntry.getItemId; break; } } player->stateFlags1 &= ~0x20000000; this->actor.parent = NULL; - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } player->stateFlags1 |= 0x20000000; this->actionFunc = EnBomBowlPit_WaitTillPrizeGiven; } @@ -207,7 +215,11 @@ void EnBomBowlPit_WaitTillPrizeGiven(EnBomBowlPit* this, GlobalContext* globalCt if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = EnBomBowlPit_Reset; } else { - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h index af5d8d3e1..fd7c03be4 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h +++ b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h @@ -33,6 +33,7 @@ typedef struct EnBomBowlPit { /* 0x01D4 */ Vec3f unk_1D4; // camera eye (maxsteps) /* 0x01E0 */ EnExItem* exItem; /* 0x01E4 */ char unk_1E4[0x3520]; + /* */ GetItemEntry getItemEntry; } EnBomBowlPit; // size = 0x3704 #endif diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 83b2d9587..b8396a573 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -399,6 +399,7 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { this->actor.world.pos.z += (tmpf3 / tmpf4) * 5.0f; } } else { + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; this->actor.draw = NULL; @@ -406,7 +407,8 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (gSaveContext.n64ddFlag) { GET_PLAYER(globalCtx)->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); - getItemId = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50).getItemId; + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + getItemId = getItemEntry.getItemId; } else { if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) { getItemId = GI_BULLET_BAG_40; @@ -414,24 +416,28 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { getItemId = GI_BULLET_BAG_50; } } - func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); + } this->actionFunc = EnExItem_TargetPrizeGive; } } void EnExItem_TargetPrizeGive(EnExItem* this, GlobalContext* globalCtx) { - s32 getItemId; - if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = EnExItem_TargetPrizeFinish; } else { - if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50).getItemId; + if (!gSaveContext.n64ddFlag) { + s32 getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; + func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); } else { - getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); } - func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c index 5e6976c76..9f945a51f 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c @@ -601,6 +601,7 @@ void EnFr_Idle(EnFr* this, GlobalContext* globalCtx) { player->actor.world.pos.z = this->actor.world.pos.z; // z = -1220.0f player->currentYaw = player->actor.world.rot.y = player->actor.shape.rot.y = this->actor.world.rot.y; this->reward = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = EnFr_Activate; } else if (EnFr_IsAboveAndWithin30DistXZ(player, this)) { player->unk_6A8 = &this->actor; @@ -836,6 +837,7 @@ s32 EnFr_IsFrogSongComplete(EnFr* this, GlobalContext* globalCtx) { void EnFr_OcarinaMistake(EnFr* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->reward = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; func_80078884(NA_SE_SY_OCARINA_ERROR); Audio_OcaSetInstrument(0); sEnFrPointers.flags = 12; @@ -927,6 +929,7 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { songIndex = this->songIndex; this->actionFunc = EnFr_Deactivate; this->reward = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; if ((songIndex >= FROG_ZL) && (songIndex <= FROG_SOT)) { if (!(gSaveContext.eventChkInf[13] & sSongIndex[songIndex])) { gSaveContext.eventChkInf[13] |= sSongIndex[songIndex]; @@ -940,7 +943,8 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { this->reward = GI_HEART_PIECE; } else { - this->reward = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE); + this->reward = this->getItemEntry.getItemId; } } else { this->reward = GI_RUPEE_BLUE; @@ -951,7 +955,8 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { this->reward = GI_HEART_PIECE; } else { - this->reward = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE); + this->reward = this->getItemEntry.getItemId; } } else { this->reward = GI_RUPEE_PURPLE; @@ -1002,7 +1007,11 @@ void EnFr_Deactivate(EnFr* this, GlobalContext* globalCtx) { this->actionFunc = EnFr_Idle; } else { this->actionFunc = EnFr_GiveReward; - func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 30.0f, 100.0f); + } } } @@ -1011,7 +1020,11 @@ void EnFr_GiveReward(EnFr* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnFr_SetIdle; } else { - func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 30.0f, 100.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h index 154aefc17..972c32e49 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h @@ -73,6 +73,7 @@ typedef struct EnFr { /* 0x03AA */ s16 xyAngleButterfly; // Butterfly Travels along random angles in the x-y plane /* 0x03AC */ Vec3f posButterfly; // Position/Coordinates of the Butterfly /* 0x03B8 */ Vec3f posButterflyLight; // Used in Lights_PointNoGlowSetInfo() + /* */ GetItemEntry getItemEntry; } EnFr; // size = 0x03C4 typedef struct { diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index d765f6ac8..1c57922b1 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -502,7 +502,7 @@ void EnGe1_SetupWait_Archery(EnGe1* this, GlobalContext* globalCtx) { } void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { - GetItemEntry getItemEntry; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; if (Actor_HasParent(&this->actor, globalCtx)) { @@ -546,7 +546,7 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { } } - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId != GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); @@ -555,7 +555,7 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { } void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { - GetItemEntry getItemEntry; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { @@ -587,7 +587,7 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { } } - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId != GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index 27fc87922..832f4ac4d 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -946,7 +946,7 @@ void func_80A40B1C(EnGo* this, GlobalContext* globalCtx) { void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { f32 xzDist; f32 yDist; - GetItemEntry getItemEntry; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; if (Actor_HasParent(&this->actor, globalCtx)) { @@ -979,7 +979,7 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { yDist = fabsf(this->actor.yDistToPlayer) + 1.0f; xzDist = this->actor.xzDistToPlayer + 1.0f; - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, xzDist, yDist); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzDist, yDist); diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 02fc882d3..a3b10dc30 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -286,6 +286,12 @@ void EnGo2_GetItem(EnGo2* this, GlobalContext* globalCtx, s32 getItemId) { fabsf(this->actor.yDistToPlayer) + 1.0f); } +void EnGo2_GetItemEntry(EnGo2* this, GlobalContext* globalCtx, GetItemEntry getItemEntry) { + this->getItemId = getItemEntry.getItemId; + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, this->actor.xzDistToPlayer + 1.0f, + fabsf(this->actor.yDistToPlayer) + 1.0f); +} + s32 EnGo2_GetDialogState(EnGo2* this, GlobalContext* globalCtx) { s16 dialogState = Message_GetState(&globalCtx->msgCtx); @@ -334,8 +340,6 @@ u16 EnGo2_GetTextIdGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { } s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { - s32 bombBagUpgrade; - switch (Message_GetState(&globalCtx->msgCtx)) { case TEXT_STATE_CLOSING: return 2; @@ -344,11 +348,10 @@ s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { if (this->actor.textId == 0x3012) { this->actionFunc = EnGo2_SetupGetItem; if(!gSaveContext.n64ddFlag) { - bombBagUpgrade = CUR_CAPACITY(UPG_BOMB_BAG) == 30 ? GI_BOMB_BAG_40 : GI_BOMB_BAG_30; + EnGo2_GetItem(this, globalCtx, CUR_CAPACITY(UPG_BOMB_BAG) == 30 ? GI_BOMB_BAG_40 : GI_BOMB_BAG_30); } else { - bombBagUpgrade = Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40).getItemId; + EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40)); } - EnGo2_GetItem(this, globalCtx, bombBagUpgrade); Message_CloseTextbox(globalCtx); gSaveContext.infTable[17] |= 0x4000; return 2; @@ -542,7 +545,7 @@ s16 EnGo2_GetStateGoronCityLink(GlobalContext* globalCtx, EnGo2* this) { } gSaveContext.infTable[16] |= 0x200; - EnGo2_GetItem(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON).getItemId); + EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON)); this->actionFunc = EnGo2_SetupGetItem; Flags_SetTreasure(globalCtx, 0x1F); return 2; @@ -621,7 +624,7 @@ s16 EnGo2_GetStateGoronDmtBiggoron(GlobalContext* globalCtx, EnGo2* this) { return 0; } - EnGo2_GetItem(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS).getItemId); + EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS)); Flags_SetTreasure(globalCtx, 0x1F); } else { EnGo2_GetItem(this, globalCtx, GI_SWORD_BGS); diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index a0f95d2e3..9f49b12b2 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -666,6 +666,7 @@ s16 func_80A70058(GlobalContext* globalCtx, Actor* thisx) { func_80A6F7CC(this, globalCtx, GI_HEART_PIECE); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE); + // The follownig line and last arguments of GiveItemEntryFromActor are copied from func_80A6F7CC this->unkGetItemId = getItemEntry.getItemId; GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); } diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index 0a937a53d..b65f4f74a 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -453,7 +453,7 @@ void EnKz_Wait(EnKz* this, GlobalContext* globalCtx) { } void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { - GetItemEntry getItemEntry; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; f32 xzRange; f32 yRange; @@ -477,7 +477,7 @@ void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { } yRange = fabsf(this->actor.yDistToPlayer) + 1.0f; xzRange = this->actor.xzDistToPlayer + 1.0f; - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, xzRange, yRange); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzRange, yRange); diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c index 96f8b87ea..8de4ff44b 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c @@ -304,12 +304,13 @@ void func_80ABA654(EnNiwLady* this, GlobalContext* globalCtx) { if (!(gSaveContext.itemGetInf[0] & 0x1000)) { this->actor.parent = NULL; - if (gSaveContext.n64ddFlag) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 100.0f, 50.0f); - } else { + if (!gSaveContext.n64ddFlag) { this->getItemId = GI_BOTTLE; func_8002F434(&this->actor, globalCtx, GI_BOTTLE, 100.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); + this->getItemId = getItemEntry.getItemId; + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 100.0f, 50.0f); } this->actionFunc = func_80ABAC00; @@ -394,11 +395,12 @@ void func_80ABA9B8(EnNiwLady* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->actor.parent = NULL; - if (gSaveContext.n64ddFlag) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 200.0f, 100.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_POCKET_EGG, 200.0f, 100.0f); + } else { + // TODO: get-item-rework Adult trade sequence + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 200.0f, 100.0f); } this->actionFunc = func_80ABAC00; @@ -455,6 +457,7 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) { getItemId = !(gSaveContext.itemGetInf[2] & 0x1000) ? GI_POCKET_EGG : GI_COJIRO; if (gSaveContext.n64ddFlag && getItemId == GI_POCKET_EGG) { + // TODO: get-item-rework Adult trade sequence getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG).getItemId; } } diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c index 8705bfa6d..bfaf4188f 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -239,7 +239,7 @@ void EnSth_ParentRewardObtainedWait(EnSth* this, GlobalContext* globalCtx) { void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { u16 getItemId = sGetItemIds[this->actor.params]; - GetItemEntry getItemEntry; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; if (gSaveContext.n64ddFlag) { switch (getItemId) { @@ -279,7 +279,7 @@ void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { } } - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 63f8662bc..a6ddb5844 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -169,6 +169,7 @@ void EnSyatekiMan_Init(Actor* thisx, GlobalContext* globalCtx) { this->blinkFunc = EnSyatekiMan_BlinkWait; this->actor.colChkInfo.cylRadius = 100; this->actionFunc = EnSyatekiMan_Start; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } void EnSyatekiMan_Destroy(Actor* thisx, GlobalContext* globalCtx) { @@ -373,7 +374,7 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { this->getItemId = GI_RUPEE_PURPLE; } } - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); @@ -406,7 +407,7 @@ void EnSyatekiMan_GivePrize(EnSyatekiMan* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = EnSyatekiMan_FinishPrize; } else { - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); diff --git a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c index 2e653aeeb..f01fcec21 100644 --- a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c +++ b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c @@ -5002,7 +5002,7 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_NONE)) && Message_ShouldAdvance(globalCtx)) { s32 getItemId; - GetItemEntry getItemEntry; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; Message_CloseTextbox(globalCtx); @@ -5085,7 +5085,7 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { } this->actor.parent = NULL; - if (!gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); From 64965ee92602dbce3f785bc011c52f4b56edf9fc Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 15 Aug 2022 22:22:47 -0500 Subject: [PATCH 079/212] Use GiveItemEntryFromActorWithFixedRange in item00 --- soh/src/code/z_en_item00.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 5245e45c0..6713a537d 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -512,8 +512,11 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); getItemId = getItem.getItemId; - func_8002F554(&this->actor, globalCtx, getItemId); - GET_PLAYER(globalCtx)->getItemEntry = getItem; + if (!gSaveContext.n64ddFlag) { + func_8002F554(&this->actor, globalCtx, getItemId); + } else { + GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem); + } } EnItem00_SetupAction(this, func_8001E5C8); @@ -884,12 +887,13 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { params = &this->actor.params; if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { - if (gSaveContext.n64ddFlag) { + if (!gSaveContext.n64ddFlag) { + func_8002F554(&this->actor, globalCtx, getItemId); + } else { getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - GET_PLAYER(globalCtx)->getItemEntry = getItem; getItemId = getItem.getItemId; + GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem); } - func_8002F554(&this->actor, globalCtx, getItemId); } switch (*params) { From 5d01a7179711fbc255d5b64bec7b089171672e9a Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 23:28:08 -0400 Subject: [PATCH 080/212] Fixes Anju to set player->getItemEntry. --- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 17 ++++++++++------- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.h | 1 + 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c index 8de4ff44b..01f170506 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c @@ -88,6 +88,7 @@ void EnNiwLady_Init(Actor* thisx, GlobalContext* globalCtx) { osSyncPrintf("\n\n"); this->actionFunc = func_80AB9F24; thisx->uncullZoneForward = 600.0f; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } void EnNiwLady_Destroy(Actor* thisx, GlobalContext* globalCtx) { @@ -308,9 +309,8 @@ void func_80ABA654(EnNiwLady* this, GlobalContext* globalCtx) { this->getItemId = GI_BOTTLE; func_8002F434(&this->actor, globalCtx, GI_BOTTLE, 100.0f, 50.0f); } else { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); - this->getItemId = getItemEntry.getItemId; - GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 100.0f, 50.0f); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 100.0f, 50.0f); } this->actionFunc = func_80ABAC00; @@ -399,8 +399,8 @@ void func_80ABA9B8(EnNiwLady* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_POCKET_EGG, 200.0f, 100.0f); } else { // TODO: get-item-rework Adult trade sequence - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); - GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 200.0f, 100.0f); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f); } this->actionFunc = func_80ABAC00; @@ -458,10 +458,13 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag && getItemId == GI_POCKET_EGG) { // TODO: get-item-rework Adult trade sequence - getItemId = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG).getItemId; + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f); } } - func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f); + if (this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h index 57ba86f2d..5fe9684f4 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h @@ -40,6 +40,7 @@ typedef struct EnNiwLady { /* 0x0284 */ s32 getItemId; /* 0x0288 */ struct_80034A14_arg1 unk_288; /* 0x02B0 */ ColliderCylinder collider; + /* 0x02FC */ GetItemEntry getItemEntry; } EnNiwLady; // size = 0x02FC #endif From f874d83432562dab085ab2a9c64925eaec8a2874 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 15 Aug 2022 22:59:42 -0500 Subject: [PATCH 081/212] Add a few missing cases --- soh/src/code/z_en_item00.c | 7 ++++++- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 9 +++++++-- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h | 1 + soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 14 +++++++++----- soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h | 1 + soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 7 ++++++- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 6713a537d..478ce891e 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -671,10 +671,15 @@ void func_8001E304(EnItem00* this, GlobalContext* globalCtx) { void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); if (this->getItemId != GI_NONE) { if (!Actor_HasParent(&this->actor, globalCtx)) { - func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f); + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 50.0f, 80.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 50.0f, 80.0f); + } this->unk_15A++; } else { this->getItemId = GI_NONE; diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index a3b10dc30..c9b97c8a9 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -288,6 +288,7 @@ void EnGo2_GetItem(EnGo2* this, GlobalContext* globalCtx, s32 getItemId) { void EnGo2_GetItemEntry(EnGo2* this, GlobalContext* globalCtx, GetItemEntry getItemEntry) { this->getItemId = getItemEntry.getItemId; + this->getItemEntry = getItemEntry; GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); } @@ -1572,6 +1573,7 @@ void EnGo2_Init(Actor* thisx, GlobalContext* globalCtx) { this->unk_216 = this->actor.shape.rot.z; this->unk_26E = 1; this->path = Path_GetByIndex(globalCtx, (this->actor.params & 0x3E0) >> 5, 0x1F); + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; switch (this->actor.params & 0x1F) { case GORON_CITY_ENTRANCE: case GORON_CITY_ISLAND: @@ -1811,8 +1813,11 @@ void EnGo2_SetupGetItem(EnGo2* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnGo2_SetGetItem; } else { - func_8002F434(&this->actor, globalCtx, this->getItemId, this->actor.xzDistToPlayer + 1.0f, - fabsf(this->actor.yDistToPlayer) + 1.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h index d31eb7678..1618005f9 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h @@ -104,6 +104,7 @@ typedef struct EnGo2 { /* 0x0598 */ char unk_598[0x02]; /* 0x059A */ s16 camId; /* 0x059C */ s16 unk_59C; + /* */ GetItemEntry getItemEntry; } EnGo2; // size = 0x05A0 #endif diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index 9f49b12b2..5c2340ce7 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -665,10 +665,10 @@ s16 func_80A70058(GlobalContext* globalCtx, Actor* thisx) { if (!gSaveContext.n64ddFlag) { func_80A6F7CC(this, globalCtx, GI_HEART_PIECE); } else { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE); // The follownig line and last arguments of GiveItemEntryFromActor are copied from func_80A6F7CC - this->unkGetItemId = getItemEntry.getItemId; - GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + this->unkGetItemId = this->getItemEntry.getItemId; + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); } } this->actionFunc = func_80A714C4; @@ -894,6 +894,7 @@ void EnHy_Init(Actor* thisx, GlobalContext* globalCtx) { Actor_Kill(&this->actor); } + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = EnHy_InitImpl; } @@ -1061,8 +1062,11 @@ void func_80A714C4(EnHy* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = func_80A71530; } else { - func_8002F434(&this->actor, globalCtx, this->unkGetItemId, this->actor.xzDistToPlayer + 1.0f, - fabsf(this->actor.yDistToPlayer) + 1.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->unkGetItemId, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h index f7e66544d..253d8df7d 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h @@ -59,6 +59,7 @@ typedef struct EnHy { /* 0x0270 */ Vec3s jointTable[16]; /* 0x02D0 */ Vec3s morphTable[16]; /* 0x0330 */ u16 unk_330; + /* */ GetItemEntry getItemEntry; } EnHy; // size = 0x0334 #endif diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 3b9cf80bd..b7b964272 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -876,7 +876,12 @@ void func_80B15E80(EnTa* this, GlobalContext* globalCtx) { } else if (this->unk_2E0 & 2) { func_8002F434(&this->actor, globalCtx, GI_MILK, 10000.0f, 50.0f); } else { - func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } this->unk_2E0 |= 1; } From 9916d3cc01f84ae069ac237ec63cdeef72972771 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 16 Aug 2022 00:32:02 -0400 Subject: [PATCH 082/212] Additional fix for Skull Kid --- soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index beb37542f..38ee1f7d0 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1039,7 +1039,7 @@ void EnSkj_SariaSongTalk(EnSkj* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); } } } @@ -1058,7 +1058,7 @@ void func_80AFFE44(EnSkj* this, GlobalContext* globalCtx) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); } else { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); } } } From 1ef08a7325f737c911b2c238b7eb84213059f959 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 16 Aug 2022 01:11:51 -0400 Subject: [PATCH 083/212] Merge get-item-rework and update new checks. --- soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c | 4 ++-- soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c | 8 ++++++-- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c | 2 +- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 12 ++++++++---- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 16 ++++++++++------ soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c | 16 ++++++++++------ soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c | 8 +++++--- soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c | 16 ++++++++++------ .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 5 +++-- .../overlays/actors/ovl_En_Toryo/z_en_toryo.c | 8 +++++--- .../overlays/actors/ovl_player_actor/z_player.c | 2 +- 11 files changed, 61 insertions(+), 36 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c index 8e30bea28..3a687f41d 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -343,8 +343,8 @@ bool EnCow_HasBeenMilked(EnCow* this, GlobalContext* globalCtx) { void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) { if (!EnCow_HasBeenMilked(this, globalCtx)) { CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); - GetItemID itemId = Randomizer_GetItemIdFromKnownCheck(cowInfo.randomizerCheck, GI_MILK); - func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 100.0f); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(cowInfo.randomizerCheck, GI_MILK); + GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 100.0f); } else { // once we've gotten the rando reward from the cow, // return them to the their default action function diff --git a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c index 97e58b30a..331677c6d 100644 --- a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c +++ b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c @@ -94,8 +94,10 @@ void EnDs_GiveOddPotion(EnDs* this, GlobalContext* globalCtx) { } else { u32 itemId = GI_ODD_POTION; if (gSaveContext.n64ddFlag) { - itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION); + GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_MUSHROOM); + return; } func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); } @@ -107,8 +109,10 @@ void EnDs_TalkAfterBrewOddPotion(EnDs* this, GlobalContext* globalCtx) { this->actionFunc = EnDs_GiveOddPotion; u32 itemId = GI_ODD_POTION; if (gSaveContext.n64ddFlag) { - itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION); + GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_MUSHROOM); + return; } func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); } diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c index c61fe5f15..565982642 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c @@ -954,7 +954,7 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { this->reward = GI_RUPEE_PURPLE; } else { - this->reward = Randomizer_GetItemIdFromKnownCheck(EnFr_RandomizerCheckFromSongIndex(songIndex), GI_RUPEE_PURPLE); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(EnFr_RandomizerCheckFromSongIndex(songIndex), GI_RUPEE_PURPLE); } } else { this->reward = GI_RUPEE_BLUE; diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index c7fcf97e0..389b1b145 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -967,17 +967,21 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { this->unk_20C = 1; } if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_EYEDROPS) { - getItemId = GI_CLAIM_CHECK; if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK); + getItemId = getItemEntry.getItemId; Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_EYEDROPS); + } else { + getItemId = GI_CLAIM_CHECK; } } if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_SWORD_BROKEN) { - getItemId = GI_PRESCRIPTION; if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SWORD_BROKEN); + getItemId = getItemEntry.getItemId; + } else { + getItemId = GI_PRESCRIPTION; } } } diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 2d71d6418..175335a0d 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -657,12 +657,14 @@ s16 EnGo2_GetStateGoronDmtBiggoron(GlobalContext* globalCtx, EnGo2* this) { if (Message_ShouldAdvance(globalCtx)) { if ((this->actor.textId == 0x3054) || (this->actor.textId == 0x3055)) { if (globalCtx->msgCtx.choiceIndex == 0) { - u32 getItemId = GI_PRESCRIPTION; if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SWORD_BROKEN); + EnGo2_GetItemEntry(this, globalCtx, getItemEntry); + } else { + u32 getItemId = GI_PRESCRIPTION; + EnGo2_GetItem(this, globalCtx, getItemId); } - EnGo2_GetItem(this, globalCtx, getItemId); this->actionFunc = EnGo2_SetupGetItem; return 2; } @@ -1895,12 +1897,14 @@ void EnGo2_BiggoronEyedrops(EnGo2* this, GlobalContext* globalCtx) { this->unk_26E = 2; this->skelAnime.playSpeed = 0.0f; this->skelAnime.curFrame = this->skelAnime.endFrame; - u32 getItemId = GI_CLAIM_CHECK; if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_EYEDROPS); + EnGo2_GetItemEntry(this, globalCtx, getItemEntry); + } else { + u32 getItemId = GI_CLAIM_CHECK; + EnGo2_GetItem(this, globalCtx, getItemId); } - EnGo2_GetItem(this, globalCtx, getItemId); this->actionFunc = EnGo2_SetupGetItem; this->goronState = 0; } diff --git a/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c b/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c index b3c008a50..743550697 100644 --- a/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c +++ b/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c @@ -177,12 +177,14 @@ void func_80A6E740(EnHs* this, GlobalContext* globalCtx) { this->actor.parent = NULL; func_80A6E3A0(this, func_80A6E630); } else { - s32 itemId = GI_ODD_MUSHROOM; if (gSaveContext.n64ddFlag) { - itemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_COJIRO); + GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f); + } else { + s32 itemId = GI_ODD_MUSHROOM; + func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); } - func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); } this->unk_2A8 |= 1; @@ -193,12 +195,14 @@ void func_80A6E7BC(EnHs* this, GlobalContext* globalCtx) { switch (globalCtx->msgCtx.choiceIndex) { case 0: func_80A6E3A0(this, func_80A6E740); - s32 itemId = GI_ODD_MUSHROOM; if (gSaveContext.n64ddFlag) { - itemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_COJIRO); + GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f); + } else { + s32 itemId = GI_ODD_MUSHROOM; + func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); } - func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); break; case 1: Message_ContinueTextbox(globalCtx, 0x10B4); diff --git a/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c b/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c index 2763be734..ff1502e4b 100644 --- a/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c +++ b/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c @@ -1230,12 +1230,14 @@ void func_80A99504(EnKo* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = func_80A99560; } else { - s32 itemId = GI_SAW; if (gSaveContext.n64ddFlag) { - itemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TRADE_ODD_POTION, GI_SAW); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TRADE_ODD_POTION, GI_SAW); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_POTION); + GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 120.0f, 10.0f); + } else { + s32 itemId = GI_SAW; + func_8002F434(&this->actor, globalCtx, itemId, 120.0f, 10.0f); } - func_8002F434(&this->actor, globalCtx, itemId, 120.0f, 10.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c index f334c98e4..db22509e6 100644 --- a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c +++ b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c @@ -99,24 +99,28 @@ void func_80AACA94(EnMk* this, GlobalContext* globalCtx) { gSaveContext.eventInf[1] &= ~1; } } else { - s32 getItemID = GI_EYEDROPS; if (gSaveContext.n64ddFlag) { - getItemID = Randomizer_GetItemIdFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_FROG); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } else { + s32 getItemID = GI_EYEDROPS; + func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f); } - func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f); } } void func_80AACB14(EnMk* this, GlobalContext* globalCtx) { if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { this->actionFunc = func_80AACA94; - s32 getItemID = GI_EYEDROPS; if (gSaveContext.n64ddFlag) { - getItemID = Randomizer_GetItemIdFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_FROG); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } else { + s32 getItemID = GI_EYEDROPS; + func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f); } - func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c index 817523fbb..eeaff6c33 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c @@ -460,11 +460,12 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { if (getItemId == GI_POCKET_EGG) { // TODO: get-item-rework Adult trade sequence - this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); - GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f); } else { this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_POCKET_CUCCO, GI_COJIRO); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_POCKET_CUCCO); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f); } } } diff --git a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c index c6ca4cad7..af994bbf3 100644 --- a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c +++ b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c @@ -314,12 +314,14 @@ void func_80B20768(EnToryo* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->unk_1E4 = 5; } else { - s32 itemId = GI_SWORD_BROKEN; if (gSaveContext.n64ddFlag) { - itemId = Randomizer_GetItemIdFromKnownCheck(RC_GV_TRADE_SAW, GI_SWORD_BROKEN); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_GV_TRADE_SAW, GI_SWORD_BROKEN); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SAW); + GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 100.0f, 10.0f); + } else { + s32 itemId = GI_SWORD_BROKEN; + func_8002F434(&this->actor, globalCtx, itemId, 100.0f, 10.0f); } - func_8002F434(&this->actor, globalCtx, itemId, 100.0f, 10.0f); } return; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 97e0f5072..15ac7d1a3 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10890,8 +10890,8 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) { Collider_ResetQuadAT(globalCtx, &this->shieldQuad.base); if (this->pendingIceTrap) { - GiveItemWithoutActor(globalCtx, RG_ICE_TRAP); this->getItemEntry = ItemTable_RetrieveEntry(MOD_RANDOMIZER, RG_ICE_TRAP); + GiveItemEntryWithoutActor(globalCtx, this->getItemEntry); } } From 3bc67ef1eb5f0d38778552593e8f98f5d35e97c5 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 16 Aug 2022 20:28:24 -0400 Subject: [PATCH 084/212] Fixes chests by allowing for negative getItemIds --- .../Enhancements/item-tables/ItemTableTypes.h | 2 +- .../overlays/actors/ovl_player_actor/z_player.c | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 1a703f30d..7e5f1a9a3 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -19,7 +19,7 @@ typedef struct { /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? - /* 0x08 */ uint16_t getItemId; + /* 0x08 */ int16_t getItemId; /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. } GetItemEntry; // size = 0x0F diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 15ac7d1a3..40ea3ff2e 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -4530,11 +4530,12 @@ void func_8083A434(GlobalContext* globalCtx, Player* this) { if (this->getItemId == GI_HEART_CONTAINER_2) { this->unk_850 = 20; } - else if (this->getItemId >= 0) { + else if (this->getItemId >= 0 || this->getItemEntry.getItemId >= 0) { this->unk_850 = 1; } else { this->getItemId = -this->getItemId; + this->getItemEntry.getItemId = -this->getItemEntry.getItemId; } } @@ -6064,7 +6065,7 @@ void func_8083E4C4(GlobalContext* globalCtx, Player* this, GetItemEntry* giEntry Item_Give(globalCtx, giEntry->itemId); } - func_80078884((this->getItemId < 0) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM); + func_80078884((this->getItemId < 0 || this->getItemEntry.getItemId < 0) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM); } // Sets a flag according to which type of flag is specified in player->pendingFlag.flagType @@ -9685,14 +9686,12 @@ void func_808473D4(GlobalContext* globalCtx, Player* this) { else if ((!(this->stateFlags1 & PLAYER_STATE1_11) || (heldActor == NULL)) && (interactRangeActor != NULL) && ((!sp1C && (this->getItemId == GI_NONE)) || - ((this->getItemId < 0) && !(this->stateFlags1 & PLAYER_STATE1_27)))) { - if (this->getItemId < 0) { + ((this->getItemId < 0 || this->getItemEntry.getItemId < 0) && !(this->stateFlags1 & PLAYER_STATE1_27)))) { + if (this->getItemId < 0 || this->getItemEntry.getItemId < 0) { doAction = DO_ACTION_OPEN; - } - else if ((interactRangeActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT) { + } else if ((interactRangeActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT) { doAction = DO_ACTION_DROP; - } - else { + } else { doAction = DO_ACTION_GRAB; } } @@ -9744,7 +9743,7 @@ void func_808473D4(GlobalContext* globalCtx, Player* this) { } } else if (!(this->stateFlags1 & PLAYER_STATE1_27) && func_8083A0D4(this) && - (this->getItemId < GI_MAX)) { + ((!gSaveContext.n64ddFlag && this->getItemId < GI_MAX) || (gSaveContext.n64ddFlag && this->getItemEntry.getItemId < RG_MAX))) { doAction = DO_ACTION_GRAB; } else if (this->stateFlags2 & PLAYER_STATE2_11) { From 269a66656ae509adb1f0c596f477cd04e4ac3582 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 16 Aug 2022 20:58:11 -0400 Subject: [PATCH 085/212] Fixes Zora's River Frog checks. --- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c index 565982642..7a93a64b8 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c @@ -955,6 +955,7 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { this->reward = GI_RUPEE_PURPLE; } else { this->getItemEntry = Randomizer_GetItemFromKnownCheck(EnFr_RandomizerCheckFromSongIndex(songIndex), GI_RUPEE_PURPLE); + this->reward = this->getItemEntry.getItemId; } } else { this->reward = GI_RUPEE_BLUE; @@ -1051,7 +1052,7 @@ void EnFr_GiveReward(EnFr* this, GlobalContext* globalCtx) { } void EnFr_SetIdle(EnFr* this, GlobalContext* globalCtx) { - if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx) || (gSaveContext.n64ddFlag && this->reward == GI_ICE_TRAP)) { + if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx) || (gSaveContext.n64ddFlag && this->reward == RG_ICE_TRAP)) { this->actionFunc = EnFr_Idle; } } From 1184a3548044d1ffa234579d895f2ac5b848d856 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 16 Aug 2022 21:22:14 -0400 Subject: [PATCH 086/212] Fixes OoT rendering and Ice Trap checks. --- soh/soh/OTRGlobals.cpp | 4 ++-- soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 0356c0e2d..0f58c4fb4 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1641,12 +1641,12 @@ extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomi return ItemTable_RetrieveEntry(getItemModIndex, itemID); } -extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { +extern "C" u32 Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { return gSaveContext.n64ddFlag && (actor->parent != NULL) && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP; } -extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { +extern "C" u32 Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP; } diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index 7acfa4b62..a8db425da 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -218,7 +218,7 @@ void ItemOcarina_Draw(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - GetItem_Draw(globalCtx, ABS(randoGetItem.gi) - 1); + GetItem_Draw(globalCtx, randoGetItem.gid); return; } From 525dcca4991db5dc4f43eaf4f547a68b74438d2d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 17 Aug 2022 01:07:28 -0400 Subject: [PATCH 087/212] Fixes some Sheik checks I had accidentally set the wrong flag for. --- soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 2 +- soh/src/overlays/actors/ovl_player_actor/z_player.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index 90e401f06..30ab5d06e 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -298,7 +298,7 @@ void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, Rando } } else if (check != RC_SHEIK_AT_TEMPLE) { if (GiveItemEntryFromActor(&sheik->actor, globalCtx, getItemEntry, 10000.0f, 100.0f)) { - player->pendingFlag.flagID = 0x55; + player->pendingFlag.flagID = (0x5 << 4) | (sheikType & 0xF) >> 1; player->pendingFlag.flagType = FLAG_EVENT_CHECK_INF; } } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 40ea3ff2e..a9d3e8200 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6087,6 +6087,9 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { case FLAG_COW_MILKED: gSaveContext.cowsMilked[this->pendingFlag.flagID] = 1; break; + case FLAG_EVENT_CHECK_INF: + Flags_SetEventChkInf(this->pendingFlag.flagID); + break; case FLAG_NONE: default: break; From 5605542452528a06ad59e490ca263558b3d921f7 Mon Sep 17 00:00:00 2001 From: briaguya Date: Wed, 17 Aug 2022 09:03:27 -0400 Subject: [PATCH 088/212] start playing with imgui filters --- .../Enhancements/randomizer/randomizer.cpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index ca86793cc..281dc98e4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4463,16 +4463,20 @@ void DrawRandoEditor(bool& open) { if (ImGui::BeginTabItem("Locations")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + + static ImGuiTextFilter locationSearch; + locationSearch.Draw(); + if (ImGui::BeginTable("tableRandoLocations", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Exclude Locations", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn(" ", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Included Locations", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Excluded Locations", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); ImGui::TableHeadersRow(); ImGui::PopItemFlag(); ImGui::TableNextRow(); - // COLUMN 1 - EXCLUDE LOCATIONS + // COLUMN 1 - INCLUDED LOCATIONS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; SohImGui::EnhancementCheckbox("Deku Theater Mask of Truth", "gRandomizeExcludeDekuTheaterMaskOfTruth"); @@ -4487,10 +4491,16 @@ void DrawRandoEditor(bool& open) { PaddedSeparator(); SohImGui::EnhancementCheckbox("50 Skulltula Reward", "gRandomizeExcludeKak50SkullReward"); - // COLUMN 2 - EXCLUDE LOCATIONS + // COLUMN 2 - EXCLUDED LOCATIONS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - + + const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; + for (int i = 0; i < IM_ARRAYSIZE(lines); i++) { + if (locationSearch.PassFilter(lines[i])) { + ImGui::BulletText("%s", lines[i]); + } + } ImGui::EndTable(); } From 55f71457d80f070cb86afcbff32ad47853c4e7ba Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 17 Aug 2022 16:45:19 +0200 Subject: [PATCH 089/212] initial proof of concept --- .../custom-message/CustomMessageTypes.h | 6 +++- .../Enhancements/randomizer/randomizer.cpp | 31 +++++++++++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 1 + soh/soh/OTRGlobals.cpp | 7 +++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 1859e83a5..ab557dfba 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -11,7 +11,11 @@ typedef enum { TEXT_ALTAR_CHILD = 0x7040, TEXT_ALTAR_ADULT = 0x7088, TEXT_GANONDORF = 0x70CC, - TEXT_GANONDORF_NOHINT = 0x70CD + TEXT_GANONDORF_NOHINT = 0x70CD, + TEXT_BLUE_RUPEE = 0xCC, + TEXT_RED_RUPEE = 0xF0, + TEXT_PURPLE_RUPEE = 0xF1, + TEXT_HUGE_RUPEE = 0xF2 } TextIDs; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index ca86793cc..b58eabe55 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -27,6 +27,7 @@ u8 generated; const std::string Randomizer::getItemMessageTableID = "Randomizer"; const std::string Randomizer::hintMessageTableID = "RandomizerHints"; const std::string Randomizer::scrubMessageTableID = "RandomizerScrubs"; +const std::string Randomizer::rupeeMessageTableID = "RandomizerRupees"; Randomizer::Randomizer() { Sprite bowSprite = { dgFairyBowIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b, 0 }; @@ -4620,6 +4621,35 @@ void CreateScrubMessages() { } } +void CreateRupeeMessages() { + CustomMessageManager* customMessageManager = CustomMessageManager::Instance; + customMessageManager->AddCustomMessageTable(Randomizer::rupeeMessageTableID); + const std::vector rupees = { TEXT_BLUE_RUPEE, TEXT_RED_RUPEE, TEXT_PURPLE_RUPEE, TEXT_HUGE_RUPEE }; + std::string rupeeText = " "; + for (u8 rupee : rupees) { + switch (rupee) { + case TEXT_BLUE_RUPEE: + rupeeText = "\x05\x03 5 BitCoin\x05\x00 "; + break; + case TEXT_RED_RUPEE: + rupeeText = "\x05\x01 20 Moneys\x05\x00 "; + break; + case TEXT_PURPLE_RUPEE: + rupeeText = "\x05\x05 50 Gummybears\x05\x00 "; + break; + case TEXT_HUGE_RUPEE: + rupeeText = "\x05\x06 200 Cornflakes\x05\x00 "; + break; + } + customMessageManager->CreateMessage(Randomizer::rupeeMessageTableID, rupee, + { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, + "You found" + rupeeText + "!", + "You found" + rupeeText + "!", + "You found" + rupeeText + "!" + }); + } +} + void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). @@ -4695,6 +4725,7 @@ void Randomizer::CreateCustomMessages() { }; CreateGetItemMessages(getItemMessages); CreateScrubMessages(); + CreateRupeeMessages(); } void InitRando() { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 1994cfdc4..88c4f0296 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -29,6 +29,7 @@ class Randomizer { static const std::string getItemMessageTableID; static const std::string hintMessageTableID; static const std::string scrubMessageTableID; + static const std::string rupeeMessageTableID; static Sprite* GetSeedTexture(uint8_t index); s16 GetItemModelFromId(s16 itemId); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 3611c97de..663f7ada0 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1447,6 +1447,10 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); } +extern "C" CustomMessageEntry Randomizer_GetRupeeMessage(u16 rupeeTextId) { + return CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); +} + extern "C" CustomMessageEntry Randomizer_GetAltarMessage() { return (LINK_IS_ADULT) ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) @@ -1540,6 +1544,9 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { messageEntry = Randomizer_GetScrubMessage(textId); + } else if (textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE || + textId == TEXT_HUGE_RUPEE) { + messageEntry = Randomizer_GetRupeeMessage(textId); } } if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) { From 11cc0407108b679fe3ffe9e3cfb6e517f932a231 Mon Sep 17 00:00:00 2001 From: briaguya Date: Wed, 17 Aug 2022 10:45:33 -0400 Subject: [PATCH 090/212] add rcs to itemlocations in 3drando --- .../randomizer/3drando/item_location.cpp | 1471 +++++++++-------- .../randomizer/3drando/item_location.hpp | 50 +- .../Enhancements/randomizer/randomizerTypes.h | 1 + 3 files changed, 763 insertions(+), 759 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp index 213b62f0a..08d191740 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp @@ -7,787 +7,788 @@ #include "debug.hpp" #include "keys.hpp" #include +#include "../randomizerTypes.h" //Location definitions static std::array locationTable; void LocationTable_Init() { - locationTable[NONE] = ItemLocation::Base (0xFF, 0xFF, "Invalid Location", NONE, NONE, {}, SpoilerCollectionCheck::None()); + locationTable[NONE] = ItemLocation::Base (RC_UNKNOWN_CHECK, 0xFF, 0xFF, "Invalid Location", NONE, NONE, {}, SpoilerCollectionCheck::None()); //Kokiri Forest scene flag name hint key (hint_list.cpp) vanilla item categories collection check (if needed) collection check group - locationTable[KF_KOKIRI_SWORD_CHEST] = ItemLocation::Chest (0x55, 0x00, "KF Kokiri Sword Chest", KF_KOKIRI_SWORD_CHEST, KOKIRI_SWORD, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_TOP_LEFT_CHEST] = ItemLocation::Chest (0x28, 0x00, "KF Mido Top Left Chest", KF_MIDOS_TOP_LEFT_CHEST, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_TOP_RIGHT_CHEST] = ItemLocation::Chest (0x28, 0x01, "KF Mido Top Right Chest", KF_MIDOS_TOP_RIGHT_CHEST, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_BOTTOM_LEFT_CHEST] = ItemLocation::Chest (0x28, 0x02, "KF Mido Bottom Left Chest", KF_MIDOS_BOTTOM_LEFT_CHEST, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_BOTTOM_RIGHT_CHEST] = ItemLocation::Chest (0x28, 0x03, "KF Mido Bottom Right Chest", KF_MIDOS_BOTTOM_RIGHT_CHEST, RECOVERY_HEART, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_STORMS_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x0C, "KF Storms Grotto Chest", KF_STORMS_GROTTO_CHEST, RED_RUPEE, {Category::cKokiriForest, Category::cForest, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_KOKIRI_SWORD_CHEST] = ItemLocation::Chest (RC_KF_KOKIRI_SWORD_CHEST, 0x55, 0x00, "KF Kokiri Sword Chest", KF_KOKIRI_SWORD_CHEST, KOKIRI_SWORD, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_MIDOS_TOP_LEFT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_TOP_LEFT_CHEST, 0x28, 0x00, "KF Mido Top Left Chest", KF_MIDOS_TOP_LEFT_CHEST, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_MIDOS_TOP_RIGHT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_TOP_RIGHT_CHEST, 0x28, 0x01, "KF Mido Top Right Chest", KF_MIDOS_TOP_RIGHT_CHEST, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_MIDOS_BOTTOM_LEFT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_BOTTOM_LEFT_CHEST, 0x28, 0x02, "KF Mido Bottom Left Chest", KF_MIDOS_BOTTOM_LEFT_CHEST, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_MIDOS_BOTTOM_RIGHT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, 0x28, 0x03, "KF Mido Bottom Right Chest", KF_MIDOS_BOTTOM_RIGHT_CHEST, RECOVERY_HEART, {Category::cKokiriForest, Category::cForest,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_STORMS_GROTTO_CHEST] = ItemLocation::Chest (RC_KF_STORMS_GROTTO_CHEST, 0x3E, 0x0C, "KF Storms Grotto Chest", KF_STORMS_GROTTO_CHEST, RED_RUPEE, {Category::cKokiriForest, Category::cForest, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); //Lost Woods - locationTable[LW_NEAR_SHORTCUTS_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x14, "LW Near Shortcuts Grotto Chest", LW_NEAR_SHORTCUTS_GROTTO_CHEST, BLUE_RUPEE, {Category::cLostWoods, Category::cForest, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_SKULL_KID] = ItemLocation::Base (0x5B, 0x3E, "LW Skull Kid", LW_SKULL_KID, PIECE_OF_HEART, {Category::cLostWoods, Category::cForest,}, SpoilerCollectionCheck::ItemGetInf(30), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TRADE_COJIRO] = ItemLocation::Base (0x5B, 0x1F, "LW Trade Cojiro", LW_TRADE_COJIRO, ODD_MUSHROOM, {Category::cLostWoods, Category::cForest, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(37), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TRADE_ODD_POTION] = ItemLocation::Base (0x5B, 0x21, "LW Trade Odd Potion", LW_TRADE_ODD_POTION, ODD_POTION, {Category::cLostWoods, Category::cForest, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(57), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_OCARINA_MEMORY_GAME] = ItemLocation::Base (0x5B, 0x76, "LW Ocarina Memory Game", LW_OCARINA_MEMORY_GAME, PIECE_OF_HEART, {Category::cLostWoods, Category::cForest, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(31), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TARGET_IN_WOODS] = ItemLocation::Base (0x5B, 0x60, "LW Target in Woods", LW_TARGET_IN_WOODS, PROGRESSIVE_SLINGSHOT, {Category::cLostWoods, Category::cForest,}, SpoilerCollectionCheck::ItemGetInf(21), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = ItemLocation::Base (0x5B, 0x30, "LW Deku Scrub Near Deku Theater Right",LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, BUY_DEKU_NUT_5, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x01), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = ItemLocation::Base (0x5B, 0x31, "LW Deku Scrub Near Deku Theater Left", LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, BUY_DEKU_STICK_1, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x02), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_BRIDGE] = ItemLocation::Base (0x5B, 0x77, "LW Deku Scrub Near Bridge", LW_DEKU_SCRUB_NEAR_BRIDGE, PROGRESSIVE_STICK_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cDekuScrubUpgrades}, SpoilerCollectionCheck::Scrub(0x5B, 0x0A), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xF5, 0x33, "LW Deku Scrub Grotto Rear", LW_DEKU_SCRUB_GROTTO_REAR, BUY_DEKU_SEEDS_30, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1F, 0x04), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xF5, 0x79, "LW Deku Scrub Grotto Front", LW_DEKU_SCRUB_GROTTO_FRONT, PROGRESSIVE_NUT_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cDekuScrubUpgrades, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1F, 0x0B), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[DEKU_THEATER_SKULL_MASK] = ItemLocation::Base (0x3E, 0x77, "Deku Theater Skull Mask", DEKU_THEATER_SKULL_MASK, PROGRESSIVE_STICK_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cGrotto}, SpoilerCollectionCheck::ItemGetInf(22), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[DEKU_THEATER_MASK_OF_TRUTH] = ItemLocation::Base (0x3E, 0x7A, "Deku Theater Mask of Truth", DEKU_THEATER_MASK_OF_TRUTH, PROGRESSIVE_NUT_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cNeedSpiritualStones, Category::cGrotto}, SpoilerCollectionCheck::ItemGetInf(23), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_NEAR_SHORTCUTS_GROTTO_CHEST] = ItemLocation::Chest (RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, 0x3E, 0x14, "LW Near Shortcuts Grotto Chest", LW_NEAR_SHORTCUTS_GROTTO_CHEST, BLUE_RUPEE, {Category::cLostWoods, Category::cForest, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_SKULL_KID] = ItemLocation::Base (RC_LW_SKULL_KID, 0x5B, 0x3E, "LW Skull Kid", LW_SKULL_KID, PIECE_OF_HEART, {Category::cLostWoods, Category::cForest,}, SpoilerCollectionCheck::ItemGetInf(30), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_TRADE_COJIRO] = ItemLocation::Base (RC_LW_TRADE_COJIRO, 0x5B, 0x1F, "LW Trade Cojiro", LW_TRADE_COJIRO, ODD_MUSHROOM, {Category::cLostWoods, Category::cForest, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(37), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_TRADE_ODD_POTION] = ItemLocation::Base (RC_LW_TRADE_ODD_POTION, 0x5B, 0x21, "LW Trade Odd Potion", LW_TRADE_ODD_POTION, ODD_POTION, {Category::cLostWoods, Category::cForest, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(57), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_OCARINA_MEMORY_GAME] = ItemLocation::Base (RC_LW_OCARINA_MEMORY_GAME, 0x5B, 0x76, "LW Ocarina Memory Game", LW_OCARINA_MEMORY_GAME, PIECE_OF_HEART, {Category::cLostWoods, Category::cForest, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(31), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_TARGET_IN_WOODS] = ItemLocation::Base (RC_LW_TARGET_IN_WOODS, 0x5B, 0x60, "LW Target in Woods", LW_TARGET_IN_WOODS, PROGRESSIVE_SLINGSHOT, {Category::cLostWoods, Category::cForest,}, SpoilerCollectionCheck::ItemGetInf(21), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, 0x5B, 0x30, "LW Deku Scrub Near Deku Theater Right",LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, BUY_DEKU_NUT_5, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x01), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, 0x5B, 0x31, "LW Deku Scrub Near Deku Theater Left", LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, BUY_DEKU_STICK_1, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x02), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_NEAR_BRIDGE] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_BRIDGE, 0x5B, 0x77, "LW Deku Scrub Near Bridge", LW_DEKU_SCRUB_NEAR_BRIDGE, PROGRESSIVE_STICK_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cDekuScrubUpgrades}, SpoilerCollectionCheck::Scrub(0x5B, 0x0A), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_LW_DEKU_SCRUB_GROTTO_REAR, 0xF5, 0x33, "LW Deku Scrub Grotto Rear", LW_DEKU_SCRUB_GROTTO_REAR, BUY_DEKU_SEEDS_30, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1F, 0x04), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_LW_DEKU_SCRUB_GROTTO_FRONT, 0xF5, 0x79, "LW Deku Scrub Grotto Front", LW_DEKU_SCRUB_GROTTO_FRONT, PROGRESSIVE_NUT_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cDekuScrubUpgrades, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1F, 0x0B), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[DEKU_THEATER_SKULL_MASK] = ItemLocation::Base (RC_DEKU_THEATER_SKULL_MASK, 0x3E, 0x77, "Deku Theater Skull Mask", DEKU_THEATER_SKULL_MASK, PROGRESSIVE_STICK_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cGrotto}, SpoilerCollectionCheck::ItemGetInf(22), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[DEKU_THEATER_MASK_OF_TRUTH] = ItemLocation::Base (RC_DEKU_THEATER_MASK_OF_TRUTH, 0x3E, 0x7A, "Deku Theater Mask of Truth", DEKU_THEATER_MASK_OF_TRUTH, PROGRESSIVE_NUT_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cNeedSpiritualStones, Category::cGrotto}, SpoilerCollectionCheck::ItemGetInf(23), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); //Sacred Forest Meadow - locationTable[SFM_WOLFOS_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x11, "SFM Wolfos Grotto Chest", SFM_WOLFOS_GROTTO_CHEST, PURPLE_RUPEE, {Category::cSacredForestMeadow, Category::cForest, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SFM_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xEE, 0x39, "SFM Deku Scrub Grotto Rear", SFM_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x08), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SFM_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xEE, 0x3A, "SFM Deku Scrub Grotto Front", SFM_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x09), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[SFM_WOLFOS_GROTTO_CHEST] = ItemLocation::Chest (RC_SFM_WOLFOS_GROTTO_CHEST, 0x3E, 0x11, "SFM Wolfos Grotto Chest", SFM_WOLFOS_GROTTO_CHEST, PURPLE_RUPEE, {Category::cSacredForestMeadow, Category::cForest, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[SFM_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_SFM_DEKU_SCRUB_GROTTO_REAR, 0xEE, 0x39, "SFM Deku Scrub Grotto Rear", SFM_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x08), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[SFM_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, 0xEE, 0x3A, "SFM Deku Scrub Grotto Front", SFM_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x09), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); //Hyrule Field - locationTable[HF_SOUTHEAST_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x02, "HF Southeast Grotto Chest", HF_SOUTHEAST_GROTTO_CHEST, RED_RUPEE, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_OPEN_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x03, "HF Open Grotto Chest", HF_OPEN_GROTTO_CHEST, BLUE_RUPEE, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_NEAR_MARKET_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x00, "HF Near Market Grotto Chest", HF_NEAR_MARKET_GROTTO_CHEST, BLUE_RUPEE, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_OCARINA_OF_TIME_ITEM] = ItemLocation::Base (0x51, 0x0C, "HF Ocarina of Time Item", HF_OCARINA_OF_TIME_ITEM, PROGRESSIVE_OCARINA, {Category::cHyruleField, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0x43), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_TEKTITE_GROTTO_FREESTANDING_POH] = ItemLocation::Collectable(0x3E, 0x01, "HF Tektite Grotto Freestanding PoH", HF_TEKTITE_GROTTO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_DEKU_SCRUB_GROTTO] = ItemLocation::GrottoScrub(0xE6, 0x3E, "HF Deku Scrub Grotto", HF_DEKU_SCRUB_GROTTO, PIECE_OF_HEART, {Category::cHyruleField, Category::cDekuScrub, Category::cDekuScrubUpgrades, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x10, 0x03), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_SOUTHEAST_GROTTO_CHEST] = ItemLocation::Chest (RC_HF_SOUTHEAST_GROTTO_CHEST, 0x3E, 0x02, "HF Southeast Grotto Chest", HF_SOUTHEAST_GROTTO_CHEST, RED_RUPEE, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_OPEN_GROTTO_CHEST] = ItemLocation::Chest (RC_HF_OPEN_GROTTO_CHEST, 0x3E, 0x03, "HF Open Grotto Chest", HF_OPEN_GROTTO_CHEST, BLUE_RUPEE, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_NEAR_MARKET_GROTTO_CHEST] = ItemLocation::Chest (RC_HF_NEAR_MARKET_GROTTO_CHEST, 0x3E, 0x00, "HF Near Market Grotto Chest", HF_NEAR_MARKET_GROTTO_CHEST, BLUE_RUPEE, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_OCARINA_OF_TIME_ITEM] = ItemLocation::Base (RC_HF_OCARINA_OF_TIME_ITEM, 0x51, 0x0C, "HF Ocarina of Time Item", HF_OCARINA_OF_TIME_ITEM, PROGRESSIVE_OCARINA, {Category::cHyruleField, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0x43), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_TEKTITE_GROTTO_FREESTANDING_POH] = ItemLocation::Collectable(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, 0x3E, 0x01, "HF Tektite Grotto Freestanding PoH", HF_TEKTITE_GROTTO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_DEKU_SCRUB_GROTTO] = ItemLocation::GrottoScrub(RC_HF_DEKU_SCRUB_GROTTO, 0xE6, 0x3E, "HF Deku Scrub Grotto", HF_DEKU_SCRUB_GROTTO, PIECE_OF_HEART, {Category::cHyruleField, Category::cDekuScrub, Category::cDekuScrubUpgrades, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x10, 0x03), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); //Lake Hylia - locationTable[LH_CHILD_FISHING] = ItemLocation::Base (0x49, 0x3E, "LH Child Fishing", LH_CHILD_FISHING, PIECE_OF_HEART, {Category::cLakeHylia, Category::cMinigame,}, SpoilerCollectionCheck::Fishing(0x02), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_ADULT_FISHING] = ItemLocation::Base (0x49, 0x38, "LH Adult Fishing", LH_ADULT_FISHING, PROGRESSIVE_SCALE, {Category::cLakeHylia, Category::cMinigame,}, SpoilerCollectionCheck::Fishing(0x03), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_LAB_DIVE] = ItemLocation::Base (0x38, 0x3E, "LH Lab Dive", LH_LAB_DIVE, PIECE_OF_HEART, {Category::cLakeHylia,}, SpoilerCollectionCheck::ItemGetInf(24), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_TRADE_FROG] = ItemLocation::Base (0x38, 0x25, "LH Lab Trade Eyeball Frog", LH_TRADE_FROG, EYEDROPS, {Category::cLakeHylia, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(61), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_UNDERWATER_ITEM] = ItemLocation::Base (0x57, 0x15, "LH Underwater Item", LH_UNDERWATER_ITEM, RUTOS_LETTER, {Category::cLakeHylia,}, SpoilerCollectionCheck::EventChkInf(0x31), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_SUN] = ItemLocation::Base (0x57, 0x58, "LH Sun", LH_SUN, FIRE_ARROWS, {Category::cLakeHylia,}, SpoilerCollectionCheck::Chest(0x57, 0x00), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_FREESTANDING_POH] = ItemLocation::Collectable(0x57, 0x1E, "LH Freestanding PoH", LH_FREESTANDING_POH, PIECE_OF_HEART, {Category::cLakeHylia,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xEF, 0x30, "LH Deku Scrub Grotto Left", LH_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x01), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xEF, 0x37, "LH Deku Scrub Grotto Right", LH_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x06), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xEF, 0x33, "LH Deku Scrub Grotto Center", LH_DEKU_SCRUB_GROTTO_CENTER, BUY_DEKU_SEEDS_30, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x04), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_CHILD_FISHING] = ItemLocation::Base (RC_LH_CHILD_FISHING, 0x49, 0x3E, "LH Child Fishing", LH_CHILD_FISHING, PIECE_OF_HEART, {Category::cLakeHylia, Category::cMinigame,}, SpoilerCollectionCheck::Fishing(0x02), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_ADULT_FISHING] = ItemLocation::Base (RC_LH_ADULT_FISHING, 0x49, 0x38, "LH Adult Fishing", LH_ADULT_FISHING, PROGRESSIVE_SCALE, {Category::cLakeHylia, Category::cMinigame,}, SpoilerCollectionCheck::Fishing(0x03), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_LAB_DIVE] = ItemLocation::Base (RC_LH_LAB_DIVE, 0x38, 0x3E, "LH Lab Dive", LH_LAB_DIVE, PIECE_OF_HEART, {Category::cLakeHylia,}, SpoilerCollectionCheck::ItemGetInf(24), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_TRADE_FROG] = ItemLocation::Base (RC_LH_TRADE_FROG, 0x38, 0x25, "LH Lab Trade Eyeball Frog", LH_TRADE_FROG, EYEDROPS, {Category::cLakeHylia, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(61), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_UNDERWATER_ITEM] = ItemLocation::Base (RC_LH_UNDERWATER_ITEM, 0x57, 0x15, "LH Underwater Item", LH_UNDERWATER_ITEM, RUTOS_LETTER, {Category::cLakeHylia,}, SpoilerCollectionCheck::EventChkInf(0x31), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_SUN] = ItemLocation::Base (RC_LH_SUN, 0x57, 0x58, "LH Sun", LH_SUN, FIRE_ARROWS, {Category::cLakeHylia,}, SpoilerCollectionCheck::Chest(0x57, 0x00), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_FREESTANDING_POH] = ItemLocation::Collectable(RC_LH_FREESTANDING_POH, 0x57, 0x1E, "LH Freestanding PoH", LH_FREESTANDING_POH, PIECE_OF_HEART, {Category::cLakeHylia,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_LEFT, 0xEF, 0x30, "LH Deku Scrub Grotto Left", LH_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x01), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, 0xEF, 0x37, "LH Deku Scrub Grotto Right", LH_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x06), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_CENTER, 0xEF, 0x33, "LH Deku Scrub Grotto Center", LH_DEKU_SCRUB_GROTTO_CENTER, BUY_DEKU_SEEDS_30, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x04), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); //Gerudo Valley - locationTable[GV_CHEST] = ItemLocation::Chest (0x5A, 0x00, "GV Chest", GV_CHEST, PURPLE_RUPEE, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_TRADE_SAW] = ItemLocation::Base (0x5A, 0x22, "GV Trade Saw", GV_TRADE_SAW, BROKEN_SWORD, {Category::cGerudoValley, Category::cGerudo, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(58), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_WATERFALL_FREESTANDING_POH] = ItemLocation::Collectable(0x5A, 0x01, "GV Waterfall Freestanding PoH", GV_WATERFALL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_CRATE_FREESTANDING_POH] = ItemLocation::Collectable(0x5A, 0x02, "GV Crate Freestanding PoH", GV_CRATE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xF0, 0x39, "GV Deku Scrub Grotto Rear", GV_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xF0, 0x3A, "GV Deku Scrub Grotto Front", GV_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_CHEST] = ItemLocation::Chest (RC_GV_CHEST, 0x5A, 0x00, "GV Chest", GV_CHEST, PURPLE_RUPEE, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_TRADE_SAW] = ItemLocation::Base (RC_GV_TRADE_SAW, 0x5A, 0x22, "GV Trade Saw", GV_TRADE_SAW, BROKEN_SWORD, {Category::cGerudoValley, Category::cGerudo, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(58), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_WATERFALL_FREESTANDING_POH] = ItemLocation::Collectable(RC_GV_WATERFALL_FREESTANDING_POH, 0x5A, 0x01, "GV Waterfall Freestanding PoH", GV_WATERFALL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_CRATE_FREESTANDING_POH] = ItemLocation::Collectable(RC_GV_CRATE_FREESTANDING_POH, 0x5A, 0x02, "GV Crate Freestanding PoH", GV_CRATE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_GV_DEKU_SCRUB_GROTTO_REAR, 0xF0, 0x39, "GV Deku Scrub Grotto Rear", GV_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_GV_DEKU_SCRUB_GROTTO_FRONT, 0xF0, 0x3A, "GV Deku Scrub Grotto Front", GV_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); //Gerudo Fortress - locationTable[GF_CHEST] = ItemLocation::Chest (0x5D, 0x00, "GF Chest", GF_CHEST, PIECE_OF_HEART, {Category::cGerudoFortress, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_HBA_1000_POINTS] = ItemLocation::Base (0x5D, 0x3E, "GF HBA 1000 Points", GF_HBA_1000_POINTS, PIECE_OF_HEART, {Category::cGerudoFortress, Category::cGerudo, Category::cMinigame}, SpoilerCollectionCheck::InfTable(0x19, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_HBA_1500_POINTS] = ItemLocation::Base (0x5D, 0x30, "GF HBA 1500 Points", GF_HBA_1500_POINTS, PROGRESSIVE_BOW, {Category::cGerudoFortress, Category::cGerudo, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(7), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_GERUDO_MEMBERSHIP_CARD] = ItemLocation::Base (0x0C, 0x3A, "GF Gerudo Membership Card", GF_GERUDO_MEMBERSHIP_CARD, GERUDO_MEMBERSHIP_CARD, {Category::cGerudoFortress, Category::cGerudo,}, SpoilerCollectionCheck::GerudoToken(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_NORTH_F1_CARPENTER] = ItemLocation::Collectable(0x0C, 0x0C, "GF North F1 Carpenter", GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_NORTH_F2_CARPENTER] = ItemLocation::Collectable(0x0C, 0x0A, "GF North F2 Carpenter", GF_NORTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_SOUTH_F1_CARPENTER] = ItemLocation::Collectable(0x0C, 0x0E, "GF South F1 Carpenter", GF_SOUTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_SOUTH_F2_CARPENTER] = ItemLocation::Collectable(0x0C, 0x0F, "GF South F2 Carpenter", GF_SOUTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_CHEST] = ItemLocation::Chest (RC_GF_CHEST, 0x5D, 0x00, "GF Chest", GF_CHEST, PIECE_OF_HEART, {Category::cGerudoFortress, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_HBA_1000_POINTS] = ItemLocation::Base (RC_GF_HBA_1000_POINTS, 0x5D, 0x3E, "GF HBA 1000 Points", GF_HBA_1000_POINTS, PIECE_OF_HEART, {Category::cGerudoFortress, Category::cGerudo, Category::cMinigame}, SpoilerCollectionCheck::InfTable(0x19, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_HBA_1500_POINTS] = ItemLocation::Base (RC_GF_HBA_1500_POINTS, 0x5D, 0x30, "GF HBA 1500 Points", GF_HBA_1500_POINTS, PROGRESSIVE_BOW, {Category::cGerudoFortress, Category::cGerudo, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(7), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_GERUDO_MEMBERSHIP_CARD] = ItemLocation::Base (RC_GF_GERUDO_MEMBERSHIP_CARD, 0x0C, 0x3A, "GF Gerudo Membership Card", GF_GERUDO_MEMBERSHIP_CARD, GERUDO_MEMBERSHIP_CARD, {Category::cGerudoFortress, Category::cGerudo,}, SpoilerCollectionCheck::GerudoToken(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_NORTH_F1_CARPENTER] = ItemLocation::Collectable(RC_GF_NORTH_F1_CARPENTER, 0x0C, 0x0C, "GF North F1 Carpenter", GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_NORTH_F2_CARPENTER] = ItemLocation::Collectable(RC_GF_NORTH_F2_CARPENTER, 0x0C, 0x0A, "GF North F2 Carpenter", GF_NORTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_SOUTH_F1_CARPENTER] = ItemLocation::Collectable(RC_GF_SOUTH_F1_CARPENTER, 0x0C, 0x0E, "GF South F1 Carpenter", GF_SOUTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_SOUTH_F2_CARPENTER] = ItemLocation::Collectable(RC_GF_SOUTH_F2_CARPENTER, 0x0C, 0x0F, "GF South F2 Carpenter", GF_SOUTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cGerudoFortress, Category::cGerudo, Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); //Haunted Wasteland - locationTable[WASTELAND_CHEST] = ItemLocation::Chest (0x5E, 0x00, "Wasteland Chest", WASTELAND_CHEST, PURPLE_RUPEE, {Category::cHauntedWasteland,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[WASTELAND_BOMBCHU_SALESMAN] = ItemLocation::Base (0x5E, 0x03, "Wasteland Carpet Salesman", WASTELAND_BOMBCHU_SALESMAN, BOMBCHU_10, {Category::cHauntedWasteland, Category::cMerchant,}, SpoilerCollectionCheck::EventChkInf(0x34), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[WASTELAND_CHEST] = ItemLocation::Chest (RC_WASTELAND_CHEST, 0x5E, 0x00, "Wasteland Chest", WASTELAND_CHEST, PURPLE_RUPEE, {Category::cHauntedWasteland,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[WASTELAND_BOMBCHU_SALESMAN] = ItemLocation::Base (RC_WASTELAND_BOMBCHU_SALESMAN, 0x5E, 0x03, "Wasteland Carpet Salesman", WASTELAND_BOMBCHU_SALESMAN, BOMBCHU_10, {Category::cHauntedWasteland, Category::cMerchant,}, SpoilerCollectionCheck::EventChkInf(0x34), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); //Desert Colossus - locationTable[COLOSSUS_FREESTANDING_POH] = ItemLocation::Collectable(0x5C, 0x0D, "Colossus Freestanding PoH", COLOSSUS_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDesertColossus,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xFD, 0x39, "Colossus Deku Scrub Grotto Rear", COLOSSUS_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xFD, 0x3A, "Colossus Deku Scrub Grotto Front", COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[COLOSSUS_FREESTANDING_POH] = ItemLocation::Collectable(RC_COLOSSUS_FREESTANDING_POH, 0x5C, 0x0D, "Colossus Freestanding PoH", COLOSSUS_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDesertColossus,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, 0xFD, 0x39, "Colossus Deku Scrub Grotto Rear", COLOSSUS_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, 0xFD, 0x3A, "Colossus Deku Scrub Grotto Front", COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); //Market - locationTable[MARKET_TREASURE_CHEST_GAME_REWARD] = ItemLocation::Chest (0x10, 0x0A, "MK Treasure Chest Game Reward", MARKET_TREASURE_CHEST_GAME_REWARD, TREASURE_GAME_HEART, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(19), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = ItemLocation::Base (0x4B, 0x33, "MK Bombchu Bowling First Prize", MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, PROGRESSIVE_BOMB_BAG, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(25), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = ItemLocation::Base (0x4B, 0x3E, "MK Bombchu Bowling Second Prize", MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, PIECE_OF_HEART, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(26), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_BOMBCHUS] = ItemLocation::Base (0x4B, 0xFF, "MK Bombchu Bowling Bombchus", NONE, BOMBCHU_DROP, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_LOST_DOG] = ItemLocation::Base (0x35, 0x3E, "MK Lost Dog", MARKET_LOST_DOG, PIECE_OF_HEART, {Category::cInnerMarket, Category::cMarket,}, SpoilerCollectionCheck::InfTable(0x19, 0x09), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (0x42, 0x60, "MK Shooting Gallery", MARKET_SHOOTING_GALLERY_REWARD, PROGRESSIVE_SLINGSHOT, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_10_BIG_POES] = ItemLocation::Base (0x4D, 0x0F, "MK 10 Big Poes", MARKET_10_BIG_POES, EMPTY_BOTTLE, {Category::cInnerMarket, Category::cMarket,}, SpoilerCollectionCheck::BigPoePoints(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_1] = ItemLocation::Chest (0x10, 0x01, "MK Chest Game First Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_1, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_2] = ItemLocation::Chest (0x10, 0x03, "MK Chest Game Second Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_2, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_3] = ItemLocation::Chest (0x10, 0x05, "MK Chest Game Third Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_3, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_4] = ItemLocation::Chest (0x10, 0x07, "MK Chest Game Fourth Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_4, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_5] = ItemLocation::Chest (0x10, 0x09, "MK Chest Game Fifth Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_5, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_TREASURE_CHEST_GAME_REWARD] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_REWARD, 0x10, 0x0A, "MK Treasure Chest Game Reward", MARKET_TREASURE_CHEST_GAME_REWARD, TREASURE_GAME_HEART, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(19), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, 0x4B, 0x33, "MK Bombchu Bowling First Prize", MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, PROGRESSIVE_BOMB_BAG, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(25), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, 0x4B, 0x3E, "MK Bombchu Bowling Second Prize", MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, PIECE_OF_HEART, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(26), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_BOWLING_BOMBCHUS] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, 0x4B, 0xFF, "MK Bombchu Bowling Bombchus", NONE, BOMBCHU_DROP, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_LOST_DOG] = ItemLocation::Base (RC_MARKET_LOST_DOG, 0x35, 0x3E, "MK Lost Dog", MARKET_LOST_DOG, PIECE_OF_HEART, {Category::cInnerMarket, Category::cMarket,}, SpoilerCollectionCheck::InfTable(0x19, 0x09), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_MARKET_SHOOTING_GALLERY_REWARD, 0x42, 0x60, "MK Shooting Gallery", MARKET_SHOOTING_GALLERY_REWARD, PROGRESSIVE_SLINGSHOT, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_10_BIG_POES] = ItemLocation::Base (RC_MARKET_10_BIG_POES, 0x4D, 0x0F, "MK 10 Big Poes", MARKET_10_BIG_POES, EMPTY_BOTTLE, {Category::cInnerMarket, Category::cMarket,}, SpoilerCollectionCheck::BigPoePoints(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_1] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, 0x10, 0x01, "MK Chest Game First Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_1, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_2] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, 0x10, 0x03, "MK Chest Game Second Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_2, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_3] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, 0x10, 0x05, "MK Chest Game Third Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_3, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_4] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, 0x10, 0x07, "MK Chest Game Fourth Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_4, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_5] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, 0x10, 0x09, "MK Chest Game Fifth Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_5, TREASURE_GAME_SMALL_KEY, {Category::cInnerMarket, Category::cMarket, Category::cMinigame, Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); //Hyrule Castle - locationTable[HC_MALON_EGG] = ItemLocation::Base (0x5F, 0x47, "HC Malon Egg", HC_MALON_EGG, WEIRD_EGG, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x12), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[HC_ZELDAS_LETTER] = ItemLocation::Base (0x4A, 0x0B, "HC Zeldas Letter", HC_ZELDAS_LETTER, ZELDAS_LETTER, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[HC_MALON_EGG] = ItemLocation::Base (RC_HC_MALON_EGG, 0x5F, 0x47, "HC Malon Egg", HC_MALON_EGG, WEIRD_EGG, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x12), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[HC_ZELDAS_LETTER] = ItemLocation::Base (RC_HC_ZELDAS_LETTER, 0x4A, 0x0B, "HC Zeldas Letter", HC_ZELDAS_LETTER, ZELDAS_LETTER, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); //Kakariko - locationTable[KAK_REDEAD_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x0A, "Kak Redead Grotto Chest", KAK_REDEAD_GROTTO_CHEST, HUGE_RUPEE, {Category::cKakarikoVillage, Category::cKakariko, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_OPEN_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x08, "Kak Open Grotto Chest", KAK_OPEN_GROTTO_CHEST, RED_RUPEE, {Category::cKakarikoVillage, Category::cKakariko, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_10_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (0x50, 0x45, "Kak 10 Gold Skulltula Reward", KAK_10_GOLD_SKULLTULA_REWARD, PROGRESSIVE_WALLET, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_20_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (0x50, 0x39, "Kak 20 Gold Skulltula Reward", KAK_20_GOLD_SKULLTULA_REWARD, STONE_OF_AGONY, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDB), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_30_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (0x50, 0x46, "Kak 30 Gold Skulltula Reward", KAK_30_GOLD_SKULLTULA_REWARD, PROGRESSIVE_WALLET, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDC), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_40_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (0x50, 0x03, "Kak 40 Gold Skulltula Reward", KAK_40_GOLD_SKULLTULA_REWARD, BOMBCHU_10, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDD), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_50_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (0x50, 0x3E, "Kak 50 Gold Skulltula Reward", KAK_50_GOLD_SKULLTULA_REWARD, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDE), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_MAN_ON_ROOF] = ItemLocation::Base (0x52, 0x3E, "Kak Man on Roof", KAK_MAN_ON_ROOF, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheck::ItemGetInf(29), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (0x42, 0x30, "Kak Shooting Gallery Reward", KAK_SHOOTING_GALLERY_REWARD, PROGRESSIVE_BOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_TRADE_ODD_MUSHROOM] = ItemLocation::Base (0x4E, 0x20, "Kak Trade Odd Mushroom", KAK_TRADE_ODD_MUSHROOM, ODD_POTION, {Category::cKakarikoVillage, Category::cKakariko, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(56), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_ANJU_AS_ADULT] = ItemLocation::Base (0x52, 0x1D, "Kak Anju as Adult", KAK_ANJU_AS_ADULT, CLAIM_CHECK, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheck::ItemGetInf(36), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_ANJU_AS_CHILD] = ItemLocation::Base (0x52, 0x0F, "Kak Anju as Child", KAK_ANJU_AS_CHILD, EMPTY_BOTTLE, {Category::cKakarikoVillage, Category::cKakariko, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_TRADE_POCKET_CUCCO] = ItemLocation::Base (0x52, 0x0E, "Kak Trade Pocket Cucco", KAK_TRADE_POCKET_CUCCO, COJIRO, {Category::cKakarikoVillage, Category::cKakariko, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(38), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_IMPAS_HOUSE_FREESTANDING_POH] = ItemLocation::Collectable(0x37, 0x01, "Kak Impas House Freestanding PoH", KAK_IMPAS_HOUSE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_WINDMILL_FREESTANDING_POH] = ItemLocation::Collectable(0x48, 0x01, "Kak Windmill Freestanding PoH", KAK_WINDMILL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_REDEAD_GROTTO_CHEST] = ItemLocation::Chest (RC_KAK_REDEAD_GROTTO_CHEST, 0x3E, 0x0A, "Kak Redead Grotto Chest", KAK_REDEAD_GROTTO_CHEST, HUGE_RUPEE, {Category::cKakarikoVillage, Category::cKakariko, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_OPEN_GROTTO_CHEST] = ItemLocation::Chest (RC_KAK_OPEN_GROTTO_CHEST, 0x3E, 0x08, "Kak Open Grotto Chest", KAK_OPEN_GROTTO_CHEST, RED_RUPEE, {Category::cKakarikoVillage, Category::cKakariko, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_10_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_10_GOLD_SKULLTULA_REWARD, 0x50, 0x45, "Kak 10 Gold Skulltula Reward", KAK_10_GOLD_SKULLTULA_REWARD, PROGRESSIVE_WALLET, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_20_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_20_GOLD_SKULLTULA_REWARD, 0x50, 0x39, "Kak 20 Gold Skulltula Reward", KAK_20_GOLD_SKULLTULA_REWARD, STONE_OF_AGONY, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDB), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_30_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_30_GOLD_SKULLTULA_REWARD, 0x50, 0x46, "Kak 30 Gold Skulltula Reward", KAK_30_GOLD_SKULLTULA_REWARD, PROGRESSIVE_WALLET, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDC), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_40_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_40_GOLD_SKULLTULA_REWARD, 0x50, 0x03, "Kak 40 Gold Skulltula Reward", KAK_40_GOLD_SKULLTULA_REWARD, BOMBCHU_10, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDD), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_50_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_50_GOLD_SKULLTULA_REWARD, 0x50, 0x3E, "Kak 50 Gold Skulltula Reward", KAK_50_GOLD_SKULLTULA_REWARD, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko, Category::cSkulltulaHouse}, SpoilerCollectionCheck::EventChkInf(0xDE), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_MAN_ON_ROOF] = ItemLocation::Base (RC_KAK_MAN_ON_ROOF, 0x52, 0x3E, "Kak Man on Roof", KAK_MAN_ON_ROOF, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheck::ItemGetInf(29), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_KAK_SHOOTING_GALLERY_REWARD, 0x42, 0x30, "Kak Shooting Gallery Reward", KAK_SHOOTING_GALLERY_REWARD, PROGRESSIVE_BOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_TRADE_ODD_MUSHROOM] = ItemLocation::Base (RC_KAK_TRADE_ODD_MUSHROOM, 0x4E, 0x20, "Kak Trade Odd Mushroom", KAK_TRADE_ODD_MUSHROOM, ODD_POTION, {Category::cKakarikoVillage, Category::cKakariko, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(56), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_ANJU_AS_ADULT] = ItemLocation::Base (RC_KAK_ANJU_AS_ADULT, 0x52, 0x1D, "Kak Anju as Adult", KAK_ANJU_AS_ADULT, CLAIM_CHECK, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheck::ItemGetInf(36), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_ANJU_AS_CHILD] = ItemLocation::Base (RC_KAK_ANJU_AS_CHILD, 0x52, 0x0F, "Kak Anju as Child", KAK_ANJU_AS_CHILD, EMPTY_BOTTLE, {Category::cKakarikoVillage, Category::cKakariko, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_TRADE_POCKET_CUCCO] = ItemLocation::Base (RC_KAK_TRADE_POCKET_CUCCO, 0x52, 0x0E, "Kak Trade Pocket Cucco", KAK_TRADE_POCKET_CUCCO, COJIRO, {Category::cKakarikoVillage, Category::cKakariko, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(38), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_IMPAS_HOUSE_FREESTANDING_POH] = ItemLocation::Collectable(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, 0x37, 0x01, "Kak Impas House Freestanding PoH", KAK_IMPAS_HOUSE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_WINDMILL_FREESTANDING_POH] = ItemLocation::Collectable(RC_KAK_WINDMILL_FREESTANDING_POH, 0x48, 0x01, "Kak Windmill Freestanding PoH", KAK_WINDMILL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cKakarikoVillage, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); //Graveyard - locationTable[GRAVEYARD_SHIELD_GRAVE_CHEST] = ItemLocation::Chest (0x40, 0x00, "GY Shield Grave Chest", GRAVEYARD_SHIELD_GRAVE_CHEST, HYLIAN_SHIELD, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = ItemLocation::Chest (0x3F, 0x00, "GY Heart Piece Grave Chest", GRAVEYARD_HEART_PIECE_GRAVE_CHEST, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_COMPOSERS_GRAVE_CHEST] = ItemLocation::Chest (0x41, 0x00, "GY Composers Grave Chest", GRAVEYARD_COMPOSERS_GRAVE_CHEST, BOMBS_5, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_HOOKSHOT_CHEST] = ItemLocation::Chest (0x48, 0x00, "GY Hookshot Chest", GRAVEYARD_HOOKSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = ItemLocation::Collectable(0x48, 0x07, "GY Dampe Race Freestanding PoH", GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko, Category::cMinigame}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_FREESTANDING_POH] = ItemLocation::Collectable(0x53, 0x04, "GY Freestanding PoH", GRAVEYARD_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = ItemLocation::Collectable(0x53, 0x08, "GY Dampe Gravedigging Tour", GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheck::ItemGetInf(20), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_SHIELD_GRAVE_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_SHIELD_GRAVE_CHEST, 0x40, 0x00, "GY Shield Grave Chest", GRAVEYARD_SHIELD_GRAVE_CHEST, HYLIAN_SHIELD, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, 0x3F, 0x00, "GY Heart Piece Grave Chest", GRAVEYARD_HEART_PIECE_GRAVE_CHEST, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_COMPOSERS_GRAVE_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, 0x41, 0x00, "GY Composers Grave Chest", GRAVEYARD_COMPOSERS_GRAVE_CHEST, BOMBS_5, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_HOOKSHOT_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_HOOKSHOT_CHEST, 0x48, 0x00, "GY Hookshot Chest", GRAVEYARD_HOOKSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = ItemLocation::Collectable(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, 0x48, 0x07, "GY Dampe Race Freestanding PoH", GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko, Category::cMinigame}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_FREESTANDING_POH] = ItemLocation::Collectable(RC_GRAVEYARD_FREESTANDING_POH, 0x53, 0x04, "GY Freestanding PoH", GRAVEYARD_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = ItemLocation::Collectable(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, 0x53, 0x08, "GY Dampe Gravedigging Tour", GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheck::ItemGetInf(20), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); //Death Mountain - locationTable[DMT_CHEST] = ItemLocation::Chest (0x60, 0x01, "DMT Chest", DMT_CHEST, PURPLE_RUPEE, {Category::cDeathMountainTrail, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_STORMS_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x17, "DMT Storms Grotto Chest", DMT_STORMS_GROTTO_CHEST, HUGE_RUPEE, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_TRADE_BROKEN_SWORD] = ItemLocation::Base (0x60, 0x23, "DMT Trade Broken Sword", DMT_TRADE_BROKEN_SWORD, PRESCRIPTION, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cAdultTrade}, SpoilerCollectionCheck::Biggoron(0x4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_TRADE_EYEDROPS] = ItemLocation::Base (0x60, 0x26, "DMT Trade Eyedrops", DMT_TRADE_EYEDROPS, CLAIM_CHECK, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cAdultTrade}, SpoilerCollectionCheck::Biggoron(0x2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_TRADE_CLAIM_CHECK] = ItemLocation::Base (0x60, 0x57, "DMT Trade Claim Check", DMT_TRADE_CLAIM_CHECK, BIGGORON_SWORD, {Category::cDeathMountainTrail, Category::cDeathMountain}, SpoilerCollectionCheck::Biggoron(0x1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_FREESTANDING_POH] = ItemLocation::Collectable(0x60, 0x1E, "DMT Freestanding PoH", DMT_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainTrail, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_CHEST] = ItemLocation::Chest (RC_DMT_CHEST, 0x60, 0x01, "DMT Chest", DMT_CHEST, PURPLE_RUPEE, {Category::cDeathMountainTrail, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_STORMS_GROTTO_CHEST] = ItemLocation::Chest (RC_DMT_STORMS_GROTTO_CHEST, 0x3E, 0x17, "DMT Storms Grotto Chest", DMT_STORMS_GROTTO_CHEST, HUGE_RUPEE, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_TRADE_BROKEN_SWORD] = ItemLocation::Base (RC_DMT_TRADE_BROKEN_SWORD, 0x60, 0x23, "DMT Trade Broken Sword", DMT_TRADE_BROKEN_SWORD, PRESCRIPTION, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cAdultTrade}, SpoilerCollectionCheck::Biggoron(0x4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_TRADE_EYEDROPS] = ItemLocation::Base (RC_DMT_TRADE_EYEDROPS, 0x60, 0x26, "DMT Trade Eyedrops", DMT_TRADE_EYEDROPS, CLAIM_CHECK, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cAdultTrade}, SpoilerCollectionCheck::Biggoron(0x2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_TRADE_CLAIM_CHECK] = ItemLocation::Base (RC_DMT_TRADE_CLAIM_CHECK, 0x60, 0x57, "DMT Trade Claim Check", DMT_TRADE_CLAIM_CHECK, BIGGORON_SWORD, {Category::cDeathMountainTrail, Category::cDeathMountain}, SpoilerCollectionCheck::Biggoron(0x1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_FREESTANDING_POH] = ItemLocation::Collectable(RC_DMT_FREESTANDING_POH, 0x60, 0x1E, "DMT Freestanding PoH", DMT_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainTrail, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); //Goron City - locationTable[GC_MAZE_LEFT_CHEST] = ItemLocation::Chest (0x62, 0x00, "GC Maze Left Chest", GC_MAZE_LEFT_CHEST, HUGE_RUPEE, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_MAZE_RIGHT_CHEST] = ItemLocation::Chest (0x62, 0x01, "GC Maze Right Chest", GC_MAZE_RIGHT_CHEST, PURPLE_RUPEE, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_MAZE_CENTER_CHEST] = ItemLocation::Chest (0x62, 0x02, "GC Maze Center Chest", GC_MAZE_CENTER_CHEST, PURPLE_RUPEE, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_ROLLING_GORON_AS_CHILD] = ItemLocation::Base (0x62, 0x34, "GC Rolling Goron as Child", GC_ROLLING_GORON_AS_CHILD, PROGRESSIVE_BOMB_BAG, {Category::cGoronCity,}, SpoilerCollectionCheck::InfTable(0x11, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_ROLLING_GORON_AS_ADULT] = ItemLocation::Base (0x62, 0x2C, "GC Rolling Goron as Adult", GC_ROLLING_GORON_AS_ADULT, GORON_TUNIC, {Category::cGoronCity,}, SpoilerCollectionCheck::InfTable(0x10, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DARUNIAS_JOY] = ItemLocation::Base (0x62, 0x54, "GC Darunias Joy", GC_DARUNIAS_JOY, PROGRESSIVE_STRENGTH, {Category::cGoronCity,}, SpoilerCollectionCheck::EventChkInf(0x36), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_POT_FREESTANDING_POH] = ItemLocation::Collectable(0x62, 0x1F, "GC Pot Freestanding PoH", GC_POT_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xFB, 0x30, "GC Deku Scrub Grotto Left", GC_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xFB, 0x37, "GC Deku Scrub Grotto Right", GC_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xFB, 0x33, "GC Deku Scrub Grotto Center", GC_DEKU_SCRUB_GROTTO_CENTER, BUY_ARROWS_30, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x04), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_MEDIGORON] = ItemLocation::Base (0x62, 0x51, "GC Medigoron", GC_MEDIGORON, GIANTS_KNIFE, {Category::cGoronCity, Category::cMerchant,}, SpoilerCollectionCheck::EventChkInf(0x35), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_MAZE_LEFT_CHEST] = ItemLocation::Chest (RC_GC_MAZE_LEFT_CHEST, 0x62, 0x00, "GC Maze Left Chest", GC_MAZE_LEFT_CHEST, HUGE_RUPEE, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_MAZE_RIGHT_CHEST] = ItemLocation::Chest (RC_GC_MAZE_RIGHT_CHEST, 0x62, 0x01, "GC Maze Right Chest", GC_MAZE_RIGHT_CHEST, PURPLE_RUPEE, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_MAZE_CENTER_CHEST] = ItemLocation::Chest (RC_GC_MAZE_CENTER_CHEST, 0x62, 0x02, "GC Maze Center Chest", GC_MAZE_CENTER_CHEST, PURPLE_RUPEE, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_ROLLING_GORON_AS_CHILD] = ItemLocation::Base (RC_GC_ROLLING_GORON_AS_CHILD, 0x62, 0x34, "GC Rolling Goron as Child", GC_ROLLING_GORON_AS_CHILD, PROGRESSIVE_BOMB_BAG, {Category::cGoronCity,}, SpoilerCollectionCheck::InfTable(0x11, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_ROLLING_GORON_AS_ADULT] = ItemLocation::Base (RC_GC_ROLLING_GORON_AS_ADULT, 0x62, 0x2C, "GC Rolling Goron as Adult", GC_ROLLING_GORON_AS_ADULT, GORON_TUNIC, {Category::cGoronCity,}, SpoilerCollectionCheck::InfTable(0x10, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_DARUNIAS_JOY] = ItemLocation::Base (RC_GC_DARUNIAS_JOY, 0x62, 0x54, "GC Darunias Joy", GC_DARUNIAS_JOY, PROGRESSIVE_STRENGTH, {Category::cGoronCity,}, SpoilerCollectionCheck::EventChkInf(0x36), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_POT_FREESTANDING_POH] = ItemLocation::Collectable(RC_GC_POT_FREESTANDING_POH, 0x62, 0x1F, "GC Pot Freestanding PoH", GC_POT_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_LEFT, 0xFB, 0x30, "GC Deku Scrub Grotto Left", GC_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, 0xFB, 0x37, "GC Deku Scrub Grotto Right", GC_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_CENTER, 0xFB, 0x33, "GC Deku Scrub Grotto Center", GC_DEKU_SCRUB_GROTTO_CENTER, BUY_ARROWS_30, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x04), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_MEDIGORON] = ItemLocation::Base (RC_GC_MEDIGORON, 0x62, 0x51, "GC Medigoron", GC_MEDIGORON, GIANTS_KNIFE, {Category::cGoronCity, Category::cMerchant,}, SpoilerCollectionCheck::EventChkInf(0x35), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); //Death Mountain Crater - locationTable[DMC_UPPER_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x1A, "DMC Upper Grotto Chest", DMC_UPPER_GROTTO_CHEST, BOMBS_20, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_WALL_FREESTANDING_POH] = ItemLocation::Collectable(0x61, 0x02, "DMC Wall Freestanding PoH", DMC_WALL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainCrater, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_VOLCANO_FREESTANDING_POH] = ItemLocation::Collectable(0x61, 0x08, "DMC Volcano Freestanding PoH", DMC_VOLCANO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainCrater, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB] = ItemLocation::Base (0x61, 0x37, "DMC Deku Scrub", DMC_DEKU_SCRUB, BUY_BOMBS_535, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x61, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xF9, 0x30, "DMC Deku Scrub Grotto Left", DMC_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xF9, 0x37, "DMC Deku Scrub Grotto Right", DMC_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xF9, 0x33, "DMC Deku Scrub Grotto Center", DMC_DEKU_SCRUB_GROTTO_CENTER, BUY_ARROWS_30, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x04), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_UPPER_GROTTO_CHEST] = ItemLocation::Chest (RC_DMC_UPPER_GROTTO_CHEST, 0x3E, 0x1A, "DMC Upper Grotto Chest", DMC_UPPER_GROTTO_CHEST, BOMBS_20, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_WALL_FREESTANDING_POH] = ItemLocation::Collectable(RC_DMC_WALL_FREESTANDING_POH, 0x61, 0x02, "DMC Wall Freestanding PoH", DMC_WALL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainCrater, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_VOLCANO_FREESTANDING_POH] = ItemLocation::Collectable(RC_DMC_VOLCANO_FREESTANDING_POH, 0x61, 0x08, "DMC Volcano Freestanding PoH", DMC_VOLCANO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainCrater, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_DEKU_SCRUB] = ItemLocation::Base (RC_DMC_DEKU_SCRUB, 0x61, 0x37, "DMC Deku Scrub", DMC_DEKU_SCRUB, BUY_BOMBS_535, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x61, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, 0xF9, 0x30, "DMC Deku Scrub Grotto Left", DMC_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, 0xF9, 0x37, "DMC Deku Scrub Grotto Right", DMC_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, 0xF9, 0x33, "DMC Deku Scrub Grotto Center", DMC_DEKU_SCRUB_GROTTO_CENTER, BUY_ARROWS_30, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x04), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); //Zoras River - locationTable[ZR_OPEN_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x09, "ZR Open Grotto Chest", ZR_OPEN_GROTTO_CHEST, RED_RUPEE, {Category::cZorasRiver, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_MAGIC_BEAN_SALESMAN] = ItemLocation::Base (0x54, 0x16, "ZR Magic Bean Salesman", ZR_MAGIC_BEAN_SALESMAN, MAGIC_BEAN, {Category::cZorasRiver,}, SpoilerCollectionCheck::MagicBeans(0x54, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_ZELDAS_LULLABY] = ItemLocation::Base (0x54, 0x3E, "ZR Frogs Zelda's Lullaby", ZR_FROGS_ZELDAS_LULLABY, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_EPONAS_SONG] = ItemLocation::Base (0x54, 0x3E, "ZR Frogs Epona's Song", ZR_FROGS_EPONAS_SONG, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_SARIAS_SONG] = ItemLocation::Base (0x54, 0x3E, "ZR Frogs Saria's Song", ZR_FROGS_SARIAS_SONG, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_SUNS_SONG] = ItemLocation::Base (0x54, 0x3E, "ZR Frogs Sun's Song", ZR_FROGS_SUNS_SONG, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_SONG_OF_TIME] = ItemLocation::Base (0x54, 0x3E, "ZR Frogs Song of Time", ZR_FROGS_SONG_OF_TIME, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_IN_THE_RAIN] = ItemLocation::Base (0x54, 0x3E, "ZR Frogs in the Rain", ZR_FROGS_IN_THE_RAIN, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_OCARINA_GAME] = ItemLocation::Base (0x54, 0x76, "ZR Frogs Ocarina Game", ZR_FROGS_OCARINA_GAME, PIECE_OF_HEART, {Category::cZorasRiver, Category::cMinigame,}, SpoilerCollectionCheck::EventChkInf(0xD0), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = ItemLocation::Collectable(0x54, 0x04, "ZR Near Open Grotto Freestanding PoH", ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_NEAR_DOMAIN_FREESTANDING_POH] = ItemLocation::Collectable(0x54, 0x0B, "ZR Near Domain Freestanding PoH", ZR_NEAR_DOMAIN_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xEB, 0x39, "ZR Deku Scrub Grotto Rear", ZR_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x08), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xEB, 0x3A, "ZR Deku Scrub Grotto Front", ZR_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x09), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_OPEN_GROTTO_CHEST] = ItemLocation::Chest (RC_ZR_OPEN_GROTTO_CHEST, 0x3E, 0x09, "ZR Open Grotto Chest", ZR_OPEN_GROTTO_CHEST, RED_RUPEE, {Category::cZorasRiver, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_MAGIC_BEAN_SALESMAN] = ItemLocation::Base (RC_ZR_MAGIC_BEAN_SALESMAN, 0x54, 0x16, "ZR Magic Bean Salesman", ZR_MAGIC_BEAN_SALESMAN, MAGIC_BEAN, {Category::cZorasRiver,}, SpoilerCollectionCheck::MagicBeans(0x54, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_FROGS_ZELDAS_LULLABY] = ItemLocation::Base (RC_ZR_FROGS_ZELDAS_LULLABY, 0x54, 0x3E, "ZR Frogs Zelda's Lullaby", ZR_FROGS_ZELDAS_LULLABY, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_FROGS_EPONAS_SONG] = ItemLocation::Base (RC_ZR_FROGS_EPONAS_SONG, 0x54, 0x3E, "ZR Frogs Epona's Song", ZR_FROGS_EPONAS_SONG, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_FROGS_SARIAS_SONG] = ItemLocation::Base (RC_ZR_FROGS_SARIAS_SONG, 0x54, 0x3E, "ZR Frogs Saria's Song", ZR_FROGS_SARIAS_SONG, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_FROGS_SUNS_SONG] = ItemLocation::Base (RC_ZR_FROGS_SUNS_SONG, 0x54, 0x3E, "ZR Frogs Sun's Song", ZR_FROGS_SUNS_SONG, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_FROGS_SONG_OF_TIME] = ItemLocation::Base (RC_ZR_FROGS_SONG_OF_TIME, 0x54, 0x3E, "ZR Frogs Song of Time", ZR_FROGS_SONG_OF_TIME, PURPLE_RUPEE, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_FROGS_IN_THE_RAIN] = ItemLocation::Base (RC_ZR_FROGS_IN_THE_RAIN, 0x54, 0x3E, "ZR Frogs in the Rain", ZR_FROGS_IN_THE_RAIN, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_FROGS_OCARINA_GAME] = ItemLocation::Base (RC_ZR_FROGS_OCARINA_GAME, 0x54, 0x76, "ZR Frogs Ocarina Game", ZR_FROGS_OCARINA_GAME, PIECE_OF_HEART, {Category::cZorasRiver, Category::cMinigame,}, SpoilerCollectionCheck::EventChkInf(0xD0), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, 0x54, 0x04, "ZR Near Open Grotto Freestanding PoH", ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_NEAR_DOMAIN_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, 0x54, 0x0B, "ZR Near Domain Freestanding PoH", ZR_NEAR_DOMAIN_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_ZR_DEKU_SCRUB_GROTTO_REAR, 0xEB, 0x39, "ZR Deku Scrub Grotto Rear", ZR_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x08), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, 0xEB, 0x3A, "ZR Deku Scrub Grotto Front", ZR_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x09), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); //Zoras Domain - locationTable[ZD_CHEST] = ItemLocation::Chest (0x58, 0x00, "ZD Chest", ZD_CHEST, PIECE_OF_HEART, {Category::cZorasDomain,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_DIVING_MINIGAME] = ItemLocation::Base (0x58, 0x37, "ZD Diving Minigame", ZD_DIVING_MINIGAME, PROGRESSIVE_SCALE, {Category::cZorasDomain, Category::cMinigame,}, SpoilerCollectionCheck::EventChkInf(0x38), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_KING_ZORA_THAWED] = ItemLocation::Base (0x58, 0x2D, "ZD King Zora Thawed", ZD_KING_ZORA_THAWED, ZORA_TUNIC, {Category::cZorasDomain,}, SpoilerCollectionCheck::InfTable(0x13, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_TRADE_PRESCRIPTION] = ItemLocation::Base (0x58, 0x24, "ZD Trade Prescription", ZD_TRADE_PRESCRIPTION, EYEBALL_FROG, {Category::cZorasDomain, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(60), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_CHEST] = ItemLocation::Chest (RC_ZD_CHEST, 0x58, 0x00, "ZD Chest", ZD_CHEST, PIECE_OF_HEART, {Category::cZorasDomain,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_DIVING_MINIGAME] = ItemLocation::Base (RC_ZD_DIVING_MINIGAME, 0x58, 0x37, "ZD Diving Minigame", ZD_DIVING_MINIGAME, PROGRESSIVE_SCALE, {Category::cZorasDomain, Category::cMinigame,}, SpoilerCollectionCheck::EventChkInf(0x38), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_KING_ZORA_THAWED] = ItemLocation::Base (RC_ZD_KING_ZORA_THAWED, 0x58, 0x2D, "ZD King Zora Thawed", ZD_KING_ZORA_THAWED, ZORA_TUNIC, {Category::cZorasDomain,}, SpoilerCollectionCheck::InfTable(0x13, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_TRADE_PRESCRIPTION] = ItemLocation::Base (RC_ZD_TRADE_PRESCRIPTION, 0x58, 0x24, "ZD Trade Prescription", ZD_TRADE_PRESCRIPTION, EYEBALL_FROG, {Category::cZorasDomain, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(60), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); //Zoras Fountain - locationTable[ZF_ICEBERG_FREESTANDING_POH] = ItemLocation::Collectable(0x59, 0x01, "ZF Iceberg Freestanding PoH", ZF_ICEBERG_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasFountain,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_BOTTOM_FREESTANDING_POH] = ItemLocation::Collectable(0x59, 0x14, "ZF Bottom Freestanding PoH", ZF_BOTTOM_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasFountain,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZF_ICEBERG_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZF_ICEBERC_FREESTANDING_POH, 0x59, 0x01, "ZF Iceberg Freestanding PoH", ZF_ICEBERG_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasFountain,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZF_BOTTOM_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZF_BOTTOM_FREESTANDING_POH, 0x59, 0x14, "ZF Bottom Freestanding PoH", ZF_BOTTOM_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasFountain,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); //Lon Lon Ranch - locationTable[LLR_TALONS_CHICKENS] = ItemLocation::Base (0x4C, 0x14, "LLR Talons Chickens", LLR_TALONS_CHICKENS, BOTTLE_WITH_MILK, {Category::cLonLonRanch, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(10), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_FREESTANDING_POH] = ItemLocation::Collectable(0x4C, 0x01, "LLR Freestanding PoH", LLR_FREESTANDING_POH, PIECE_OF_HEART, {Category::cLonLonRanch,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xFC, 0x30, "LLR Deku Scrub Grotto Left", LLR_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x01), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xFC, 0x37, "LLR Deku Scrub Grotto Right", LLR_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x06), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xFC, 0x33, "LLR Deku Scrub Grotto Center", LLR_DEKU_SCRUB_GROTTO_CENTER, BUY_DEKU_SEEDS_30, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x04), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_TALONS_CHICKENS] = ItemLocation::Base (RC_LLR_TALONS_CHICKENS, 0x4C, 0x14, "LLR Talons Chickens", LLR_TALONS_CHICKENS, BOTTLE_WITH_MILK, {Category::cLonLonRanch, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(10), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_FREESTANDING_POH] = ItemLocation::Collectable(RC_LLR_FREESTANDING_POH, 0x4C, 0x01, "LLR Freestanding PoH", LLR_FREESTANDING_POH, PIECE_OF_HEART, {Category::cLonLonRanch,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, 0xFC, 0x30, "LLR Deku Scrub Grotto Left", LLR_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x01), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, 0xFC, 0x37, "LLR Deku Scrub Grotto Right", LLR_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x06), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, 0xFC, 0x33, "LLR Deku Scrub Grotto Center", LLR_DEKU_SCRUB_GROTTO_CENTER, BUY_DEKU_SEEDS_30, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x04), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); /*------------------- --- DUNGEONS --- -------------------*/ //Deku Tree Vanilla - locationTable[DEKU_TREE_MAP_CHEST] = ItemLocation::Chest (0x00, 0x03, "Deku Tree Map Chest", DEKU_TREE_MAP_CHEST, DEKU_TREE_MAP, {Category::cDekuTree, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_COMPASS_CHEST] = ItemLocation::Chest (0x00, 0x02, "Deku Tree Compass Chest", DEKU_TREE_COMPASS_CHEST, DEKU_TREE_COMPASS, {Category::cDekuTree, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = ItemLocation::Chest (0x00, 0x06, "Deku Tree Compass Room Side Chest", DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_BASEMENT_CHEST] = ItemLocation::Chest (0x00, 0x04, "Deku Tree Basement Chest", DEKU_TREE_BASEMENT_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_SLINGSHOT_CHEST] = ItemLocation::Chest (0x00, 0x01, "Deku Tree Slingshot Chest", DEKU_TREE_SLINGSHOT_CHEST, PROGRESSIVE_SLINGSHOT, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = ItemLocation::Chest (0x00, 0x05, "Deku Tree Slingshot Room Side Chest", DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MAP_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MAP_CHEST, 0x00, 0x03, "Deku Tree Map Chest", DEKU_TREE_MAP_CHEST, DEKU_TREE_MAP, {Category::cDekuTree, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_COMPASS_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_COMPASS_CHEST, 0x00, 0x02, "Deku Tree Compass Chest", DEKU_TREE_COMPASS_CHEST, DEKU_TREE_COMPASS, {Category::cDekuTree, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, 0x00, 0x06, "Deku Tree Compass Room Side Chest", DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_BASEMENT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_BASEMENT_CHEST, 0x00, 0x04, "Deku Tree Basement Chest", DEKU_TREE_BASEMENT_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_SLINGSHOT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_SLINGSHOT_CHEST, 0x00, 0x01, "Deku Tree Slingshot Chest", DEKU_TREE_SLINGSHOT_CHEST, PROGRESSIVE_SLINGSHOT, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, 0x00, 0x05, "Deku Tree Slingshot Room Side Chest", DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); //Deku Tree MQ - locationTable[DEKU_TREE_MQ_MAP_CHEST] = ItemLocation::Chest (0x00, 0x03, "Deku Tree MQ Map Chest", DEKU_TREE_MQ_MAP_CHEST, DEKU_TREE_MAP, {Category::cDekuTree, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x00, 0x01, "Deku Tree MQ Compass Chest", DEKU_TREE_MQ_COMPASS_CHEST, DEKU_TREE_COMPASS, {Category::cDekuTree, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_SLINGSHOT_CHEST] = ItemLocation::Chest (0x00, 0x06, "Deku Tree MQ Slingshot Chest", DEKU_TREE_MQ_SLINGSHOT_CHEST, PROGRESSIVE_SLINGSHOT, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = ItemLocation::Chest (0x00, 0x02, "Deku Tree MQ Slingshot Room Back Chest", DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, DEKU_SHIELD, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_BASEMENT_CHEST] = ItemLocation::Chest (0x00, 0x04, "Deku Tree MQ Basement Chest", DEKU_TREE_MQ_BASEMENT_CHEST, DEKU_SHIELD, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = ItemLocation::Chest (0x00, 0x05, "Deku Tree MQ Before Spinning Log Chest", DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = ItemLocation::Chest (0x00, 0x00, "Deku Tree MQ After Spinning Log Chest", DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, PURPLE_RUPEE, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_DEKU_SCRUB] = ItemLocation::Base (0x00, 0x34, "Deku Tree MQ Deku Scrub", DEKU_TREE_MQ_DEKU_SCRUB, BUY_DEKU_SHIELD, {Category::cDekuTree, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x00, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_MAP_CHEST, 0x00, 0x03, "Deku Tree MQ Map Chest", DEKU_TREE_MQ_MAP_CHEST, DEKU_TREE_MAP, {Category::cDekuTree, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_COMPASS_CHEST, 0x00, 0x01, "Deku Tree MQ Compass Chest", DEKU_TREE_MQ_COMPASS_CHEST, DEKU_TREE_COMPASS, {Category::cDekuTree, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_SLINGSHOT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, 0x00, 0x06, "Deku Tree MQ Slingshot Chest", DEKU_TREE_MQ_SLINGSHOT_CHEST, PROGRESSIVE_SLINGSHOT, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, 0x00, 0x02, "Deku Tree MQ Slingshot Room Back Chest", DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, DEKU_SHIELD, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_BASEMENT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_BASEMENT_CHEST, 0x00, 0x04, "Deku Tree MQ Basement Chest", DEKU_TREE_MQ_BASEMENT_CHEST, DEKU_SHIELD, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, 0x00, 0x05, "Deku Tree MQ Before Spinning Log Chest", DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, 0x00, 0x00, "Deku Tree MQ After Spinning Log Chest", DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, PURPLE_RUPEE, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_DEKU_SCRUB] = ItemLocation::Base (RC_DEKU_TREE_MQ_DEKU_SCRUB, 0x00, 0x34, "Deku Tree MQ Deku Scrub", DEKU_TREE_MQ_DEKU_SCRUB, BUY_DEKU_SHIELD, {Category::cDekuTree, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x00, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); //Dodongos Cavern Shared - locationTable[DODONGOS_CAVERN_BOSS_ROOM_CHEST] = ItemLocation::Chest (0x12, 0x00, "Dodongos Cavern Boss Room Chest", DODONGOS_CAVERN_BOSS_ROOM_CHEST, BOMBS_5, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_BOSS_ROOM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, 0x12, 0x00, "Dodongos Cavern Boss Room Chest", DODONGOS_CAVERN_BOSS_ROOM_CHEST, BOMBS_5, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); //Dodongos Cavern Vanilla - locationTable[DODONGOS_CAVERN_MAP_CHEST] = ItemLocation::Chest (0x01, 0x08, "Dodongos Cavern Map Chest", DODONGOS_CAVERN_MAP_CHEST, DODONGOS_CAVERN_MAP, {Category::cDodongosCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (0x01, 0x05, "Dodongos Cavern Compass Chest", DODONGOS_CAVERN_COMPASS_CHEST, DODONGOS_CAVERN_COMPASS, {Category::cDodongosCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = ItemLocation::Chest (0x01, 0x06, "Dodongos Cavern Bomb Flower Platform Chest", DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RED_RUPEE, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_BOMB_BAG_CHEST] = ItemLocation::Chest (0x01, 0x04, "Dodongos Cavern Bomb Bag Chest", DODONGOS_CAVERN_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = ItemLocation::Chest (0x01, 0x0A, "Dodongos Cavern End Of Bridge Chest", DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, DEKU_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = ItemLocation::Base (0x01, 0x30, "Dodongos Cavern Deku Scrub Near Bomb Bag Left", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, BUY_DEKU_NUT_5, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = ItemLocation::Base (0x01, 0x31, "Dodongos Cavern Deku Scrub Side Room Near Dodongos", DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, BUY_DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = ItemLocation::Base (0x01, 0x33, "Dodongos Cavern Deku Scrub Near Bomb Bag Right", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, BUY_DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = ItemLocation::Base (0x01, 0x34, "Dodongos Cavern Deku Scrub Lobby", DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, BUY_DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MAP_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MAP_CHEST, 0x01, 0x08, "Dodongos Cavern Map Chest", DODONGOS_CAVERN_MAP_CHEST, DODONGOS_CAVERN_MAP, {Category::cDodongosCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_COMPASS_CHEST, 0x01, 0x05, "Dodongos Cavern Compass Chest", DODONGOS_CAVERN_COMPASS_CHEST, DODONGOS_CAVERN_COMPASS, {Category::cDodongosCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, 0x01, 0x06, "Dodongos Cavern Bomb Flower Platform Chest", DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RED_RUPEE, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_BOMB_BAG_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, 0x01, 0x04, "Dodongos Cavern Bomb Bag Chest", DODONGOS_CAVERN_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, 0x01, 0x0A, "Dodongos Cavern End Of Bridge Chest", DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, DEKU_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, 0x01, 0x30, "Dodongos Cavern Deku Scrub Near Bomb Bag Left", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, BUY_DEKU_NUT_5, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, 0x01, 0x31, "Dodongos Cavern Deku Scrub Side Room Near Dodongos", DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, BUY_DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, 0x01, 0x33, "Dodongos Cavern Deku Scrub Near Bomb Bag Right", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, BUY_DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, 0x01, 0x34, "Dodongos Cavern Deku Scrub Lobby", DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, BUY_DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); //Dodongos Cavern MQ - locationTable[DODONGOS_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (0x01, 0x00, "Dodongos Cavern MQ Map Chest", DODONGOS_CAVERN_MQ_MAP_CHEST, DODONGOS_CAVERN_MAP, {Category::cDodongosCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = ItemLocation::Chest (0x01, 0x04, "Dodongos Cavern MQ Bomb Bag Chest", DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x01, 0x05, "Dodongos Cavern MQ Compass Chest", DODONGOS_CAVERN_MQ_COMPASS_CHEST, DODONGOS_CAVERN_COMPASS, {Category::cDodongosCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = ItemLocation::Chest (0x01, 0x02, "Dodongos Cavern MQ Larvae Room Chest", DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, DEKU_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = ItemLocation::Chest (0x01, 0x03, "Dodongos Cavern MQ Torch Puzzle Room Chest", DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, BLUE_RUPEE, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = ItemLocation::Chest (0x01, 0x01, "Dodongos Cavern MQ Under Grave Chest", DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, HYLIAN_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = ItemLocation::Base (0x01, 0x31, "Dodongos Cavern Deku Scrub Lobby Rear", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, BUY_DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = ItemLocation::Base (0x01, 0x33, "Dodongos Cavern Deku Scrub Lobby Front", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, BUY_DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = ItemLocation::Base (0x01, 0x34, "Dodongos Cavern Deku Scrub Staircase", DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, BUY_DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::Base (0x01, 0x39, "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos",DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, BUY_RED_POTION_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_MAP_CHEST, 0x01, 0x00, "Dodongos Cavern MQ Map Chest", DODONGOS_CAVERN_MQ_MAP_CHEST, DODONGOS_CAVERN_MAP, {Category::cDodongosCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, 0x01, 0x04, "Dodongos Cavern MQ Bomb Bag Chest", DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, 0x01, 0x05, "Dodongos Cavern MQ Compass Chest", DODONGOS_CAVERN_MQ_COMPASS_CHEST, DODONGOS_CAVERN_COMPASS, {Category::cDodongosCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, 0x01, 0x02, "Dodongos Cavern MQ Larvae Room Chest", DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, DEKU_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, 0x01, 0x03, "Dodongos Cavern MQ Torch Puzzle Room Chest", DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, BLUE_RUPEE, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, 0x01, 0x01, "Dodongos Cavern MQ Under Grave Chest", DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, HYLIAN_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, 0x01, 0x31, "Dodongos Cavern Deku Scrub Lobby Rear", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, BUY_DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, 0x01, 0x33, "Dodongos Cavern Deku Scrub Lobby Front", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, BUY_DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, 0x01, 0x34, "Dodongos Cavern Deku Scrub Staircase", DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, BUY_DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, 0x01, 0x39, "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos",DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, BUY_RED_POTION_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); //Jabu Jabus Belly Vanilla - locationTable[JABU_JABUS_BELLY_MAP_CHEST] = ItemLocation::Chest (0x02, 0x02, "Jabu Jabus Belly Map Chest", JABU_JABUS_BELLY_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cJabuJabusBelly, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_COMPASS_CHEST] = ItemLocation::Chest (0x02, 0x04, "Jabu Jabus Belly Compass Chest", JABU_JABUS_BELLY_COMPASS_CHEST, JABU_JABUS_BELLY_COMPASS, {Category::cJabuJabusBelly, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_BOOMERANG_CHEST] = ItemLocation::Chest (0x02, 0x01, "Jabu Jabus Belly Boomerang Chest", JABU_JABUS_BELLY_BOOMERANG_CHEST, BOOMERANG, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_DEKU_SCRUB] = ItemLocation::Base (0x02, 0x30, "Jabu Jabus Belly Deku Scrub", JABU_JABUS_BELLY_DEKU_SCRUB, BUY_DEKU_NUT_5, {Category::cJabuJabusBelly, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x02, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MAP_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MAP_CHEST, 0x02, 0x02, "Jabu Jabus Belly Map Chest", JABU_JABUS_BELLY_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cJabuJabusBelly, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_COMPASS_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_COMPASS_CHEST, 0x02, 0x04, "Jabu Jabus Belly Compass Chest", JABU_JABUS_BELLY_COMPASS_CHEST, JABU_JABUS_BELLY_COMPASS, {Category::cJabuJabusBelly, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_BOOMERANG_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, 0x02, 0x01, "Jabu Jabus Belly Boomerang Chest", JABU_JABUS_BELLY_BOOMERANG_CHEST, BOOMERANG, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_DEKU_SCRUB] = ItemLocation::Base (RC_JABU_JABUS_BELLY_DEKU_SCRUB, 0x02, 0x30, "Jabu Jabus Belly Deku Scrub", JABU_JABUS_BELLY_DEKU_SCRUB, BUY_DEKU_NUT_5, {Category::cJabuJabusBelly, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x02, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); //Jabu Jabus Belly MQ - locationTable[JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = ItemLocation::Chest (0x02, 0x05, "Jabu Jabus Belly MQ First Room Side Chest", JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_MAP_CHEST] = ItemLocation::Chest (0x02, 0x03, "Jabu Jabus Belly MQ Map Chest", JABU_JABUS_BELLY_MQ_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cJabuJabusBelly, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = ItemLocation::Chest (0x02, 0x02, "Jabu Jabus Belly MQ Second Room Lower Chest", JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x02, 0x00, "Jabu Jabus Belly MQ Compass Chest", JABU_JABUS_BELLY_MQ_COMPASS_CHEST, JABU_JABUS_BELLY_COMPASS, {Category::cJabuJabusBelly, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = ItemLocation::Chest (0x02, 0x07, "Jabu Jabus Belly MQ Second Room Upper Chest", JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RECOVERY_HEART, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = ItemLocation::Chest (0x02, 0x08, "Jabu Jabus Belly MQ Basement Near Switches Chest", JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = ItemLocation::Chest (0x02, 0x04, "Jabu Jabus Belly MQ Basement Near Vines Chest", JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, BOMBCHU_10, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = ItemLocation::Chest (0x02, 0x0A, "Jabu Jabus Belly MQ Near Boss Chest", JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, DEKU_SHIELD, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = ItemLocation::Chest (0x02, 0x09, "Jabu Jabus Belly MQ Falling Like Like Room Chest", JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, DEKU_STICK_1, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = ItemLocation::Chest (0x02, 0x01, "Jabu Jabus Belly MQ Boomerang Room Small Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = ItemLocation::Chest (0x02, 0x06, "Jabu Jabus Belly MQ Boomerang Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, BOOMERANG, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, 0x02, 0x05, "Jabu Jabus Belly MQ First Room Side Chest", JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_MAP_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, 0x02, 0x03, "Jabu Jabus Belly MQ Map Chest", JABU_JABUS_BELLY_MQ_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cJabuJabusBelly, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, 0x02, 0x02, "Jabu Jabus Belly MQ Second Room Lower Chest", JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, 0x02, 0x00, "Jabu Jabus Belly MQ Compass Chest", JABU_JABUS_BELLY_MQ_COMPASS_CHEST, JABU_JABUS_BELLY_COMPASS, {Category::cJabuJabusBelly, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, 0x02, 0x07, "Jabu Jabus Belly MQ Second Room Upper Chest", JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RECOVERY_HEART, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, 0x02, 0x08, "Jabu Jabus Belly MQ Basement Near Switches Chest", JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, 0x02, 0x04, "Jabu Jabus Belly MQ Basement Near Vines Chest", JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, BOMBCHU_10, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, 0x02, 0x0A, "Jabu Jabus Belly MQ Near Boss Chest", JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, DEKU_SHIELD, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, 0x02, 0x09, "Jabu Jabus Belly MQ Falling Like Like Room Chest", JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, DEKU_STICK_1, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, 0x02, 0x01, "Jabu Jabus Belly MQ Boomerang Room Small Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, 0x02, 0x06, "Jabu Jabus Belly MQ Boomerang Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, BOOMERANG, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); //COW //Forest Temple Vanilla - locationTable[FOREST_TEMPLE_FIRST_ROOM_CHEST] = ItemLocation::Chest (0x03, 0x03, "Forest Temple First Room Chest", FOREST_TEMPLE_FIRST_ROOM_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_FIRST_STALFOS_CHEST] = ItemLocation::Chest (0x03, 0x00, "Forest Temple First Stalfos Chest", FOREST_TEMPLE_FIRST_STALFOS_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = ItemLocation::Chest (0x03, 0x05, "Forest Temple Raised Island Courtyard Chest", FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RECOVERY_HEART, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MAP_CHEST] = ItemLocation::Chest (0x03, 0x01, "Forest Temple Map Chest", FOREST_TEMPLE_MAP_CHEST, FOREST_TEMPLE_MAP, {Category::cForestTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_WELL_CHEST] = ItemLocation::Chest (0x03, 0x09, "Forest Temple Well Chest", FOREST_TEMPLE_WELL_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = ItemLocation::Chest (0x03, 0x07, "Forest Temple Falling Ceiling Room Chest", FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, ARROWS_10, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_EYE_SWITCH_CHEST] = ItemLocation::Chest (0x03, 0x04, "Forest Temple Eye Switch Chest", FOREST_TEMPLE_EYE_SWITCH_CHEST, ARROWS_30, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x03, 0x0E, "Forest Temple Boss Key Chest", FOREST_TEMPLE_BOSS_KEY_CHEST, FOREST_TEMPLE_BOSS_KEY, {Category::cForestTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_FLOORMASTER_CHEST] = ItemLocation::Chest (0x03, 0x02, "Forest Temple Floormaster Chest", FOREST_TEMPLE_FLOORMASTER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BOW_CHEST] = ItemLocation::Chest (0x03, 0x0C, "Forest Temple Bow Chest", FOREST_TEMPLE_BOW_CHEST, PROGRESSIVE_BOW, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_RED_POE_CHEST] = ItemLocation::Chest (0x03, 0x0D, "Forest Temple Red Poe Chest", FOREST_TEMPLE_RED_POE_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BLUE_POE_CHEST] = ItemLocation::Chest (0x03, 0x0F, "Forest Temple Blue Poe Chest", FOREST_TEMPLE_BLUE_POE_CHEST, FOREST_TEMPLE_COMPASS, {Category::cForestTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BASEMENT_CHEST] = ItemLocation::Chest (0x03, 0x0B, "Forest Temple Basement Chest", FOREST_TEMPLE_BASEMENT_CHEST, ARROWS_5, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_FIRST_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, 0x03, 0x03, "Forest Temple First Room Chest", FOREST_TEMPLE_FIRST_ROOM_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_FIRST_STALFOS_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, 0x03, 0x00, "Forest Temple First Stalfos Chest", FOREST_TEMPLE_FIRST_STALFOS_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, 0x03, 0x05, "Forest Temple Raised Island Courtyard Chest", FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RECOVERY_HEART, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MAP_CHEST, 0x03, 0x01, "Forest Temple Map Chest", FOREST_TEMPLE_MAP_CHEST, FOREST_TEMPLE_MAP, {Category::cForestTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_WELL_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_WELL_CHEST, 0x03, 0x09, "Forest Temple Well Chest", FOREST_TEMPLE_WELL_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, 0x03, 0x07, "Forest Temple Falling Ceiling Room Chest", FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, ARROWS_10, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, 0x03, 0x04, "Forest Temple Eye Switch Chest", FOREST_TEMPLE_EYE_SWITCH_CHEST, ARROWS_30, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BOSS_KEY_CHEST, 0x03, 0x0E, "Forest Temple Boss Key Chest", FOREST_TEMPLE_BOSS_KEY_CHEST, FOREST_TEMPLE_BOSS_KEY, {Category::cForestTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_FLOORMASTER_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FLOORMASTER_CHEST, 0x03, 0x02, "Forest Temple Floormaster Chest", FOREST_TEMPLE_FLOORMASTER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_BOW_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BOW_CHEST, 0x03, 0x0C, "Forest Temple Bow Chest", FOREST_TEMPLE_BOW_CHEST, PROGRESSIVE_BOW, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_RED_POE_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_RED_POE_CHEST, 0x03, 0x0D, "Forest Temple Red Poe Chest", FOREST_TEMPLE_RED_POE_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_BLUE_POE_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BLUE_POE_CHEST, 0x03, 0x0F, "Forest Temple Blue Poe Chest", FOREST_TEMPLE_BLUE_POE_CHEST, FOREST_TEMPLE_COMPASS, {Category::cForestTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_BASEMENT_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BASEMENT_CHEST, 0x03, 0x0B, "Forest Temple Basement Chest", FOREST_TEMPLE_BASEMENT_CHEST, ARROWS_5, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); //Forest Temple MQ - locationTable[FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = ItemLocation::Chest (0x03, 0x03, "Forest Temple MQ First Room Chest", FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_WOLFOS_CHEST] = ItemLocation::Chest (0x03, 0x00, "Forest Temple MQ Wolfos Chest", FOREST_TEMPLE_MQ_WOLFOS_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_BOW_CHEST] = ItemLocation::Chest (0x03, 0x0C, "Forest Temple MQ Bow Chest", FOREST_TEMPLE_MQ_BOW_CHEST, PROGRESSIVE_BOW, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = ItemLocation::Chest (0x03, 0x01, "Forest Temple MQ Raised Island Courtyard Lower Chest", FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = ItemLocation::Chest (0x03, 0x05, "Forest Temple MQ Raised Island Courtyard Upper Chest", FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_WELL_CHEST] = ItemLocation::Chest (0x03, 0x09, "Forest Temple MQ Well Chest", FOREST_TEMPLE_MQ_WELL_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (0x03, 0x0D, "Forest Temple MQ Map Chest", FOREST_TEMPLE_MQ_MAP_CHEST, FOREST_TEMPLE_MAP, {Category::cForestTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x03, 0x0F, "Forest Temple MQ Compass Chest", FOREST_TEMPLE_MQ_COMPASS_CHEST, FOREST_TEMPLE_COMPASS, {Category::cForestTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = ItemLocation::Chest (0x03, 0x06, "Forest Temple MQ Falling Ceiling Room Chest", FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, ARROWS_5, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_BASEMENT_CHEST] = ItemLocation::Chest (0x03, 0x0B, "Forest Temple MQ Basement Chest", FOREST_TEMPLE_MQ_BASEMENT_CHEST, ARROWS_5, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_REDEAD_CHEST] = ItemLocation::Chest (0x03, 0x02, "Forest Temple MQ Redead Chest", FOREST_TEMPLE_MQ_REDEAD_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (0x03, 0x0E, "Forest Temple MQ Boss Key Chest", FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, FOREST_TEMPLE_BOSS_KEY, {Category::cForestTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, 0x03, 0x03, "Forest Temple MQ First Room Chest", FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_WOLFOS_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, 0x03, 0x00, "Forest Temple MQ Wolfos Chest", FOREST_TEMPLE_MQ_WOLFOS_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_BOW_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_BOW_CHEST, 0x03, 0x0C, "Forest Temple MQ Bow Chest", FOREST_TEMPLE_MQ_BOW_CHEST, PROGRESSIVE_BOW, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, 0x03, 0x01, "Forest Temple MQ Raised Island Courtyard Lower Chest", FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, 0x03, 0x05, "Forest Temple MQ Raised Island Courtyard Upper Chest", FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_WELL_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_WELL_CHEST, 0x03, 0x09, "Forest Temple MQ Well Chest", FOREST_TEMPLE_MQ_WELL_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_MAP_CHEST, 0x03, 0x0D, "Forest Temple MQ Map Chest", FOREST_TEMPLE_MQ_MAP_CHEST, FOREST_TEMPLE_MAP, {Category::cForestTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, 0x03, 0x0F, "Forest Temple MQ Compass Chest", FOREST_TEMPLE_MQ_COMPASS_CHEST, FOREST_TEMPLE_COMPASS, {Category::cForestTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, 0x03, 0x06, "Forest Temple MQ Falling Ceiling Room Chest", FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, ARROWS_5, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_BASEMENT_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, 0x03, 0x0B, "Forest Temple MQ Basement Chest", FOREST_TEMPLE_MQ_BASEMENT_CHEST, ARROWS_5, {Category::cForestTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_REDEAD_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, 0x03, 0x02, "Forest Temple MQ Redead Chest", FOREST_TEMPLE_MQ_REDEAD_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, 0x03, 0x0E, "Forest Temple MQ Boss Key Chest", FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, FOREST_TEMPLE_BOSS_KEY, {Category::cForestTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); //Fire Temple Vanilla - locationTable[FIRE_TEMPLE_NEAR_BOSS_CHEST] = ItemLocation::Chest (0x04, 0x01, "Fire Temple Near Boss Chest", FIRE_TEMPLE_NEAR_BOSS_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_FLARE_DANCER_CHEST] = ItemLocation::Chest (0x04, 0x00, "Fire Temple Flare Dancer Chest", FIRE_TEMPLE_FLARE_DANCER_CHEST, BOMBS_10, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x04, 0x0C, "Fire Temple Boss Key Chest", FIRE_TEMPLE_BOSS_KEY_CHEST, FIRE_TEMPLE_BOSS_KEY, {Category::cFireTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = ItemLocation::Chest (0x04, 0x02, "Fire Temple Big Lava Room Blocked Door Chest", FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = ItemLocation::Chest (0x04, 0x04, "Fire Temple Big Lava Room Lower Open Door Chest", FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = ItemLocation::Chest (0x04, 0x03, "Fire Temple Boulder Maze Lower Chest", FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = ItemLocation::Chest (0x04, 0x06, "Fire Temple Boulder Maze Upper Chest", FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = ItemLocation::Chest (0x04, 0x08, "Fire Temple Boulder Maze Side Room Chest", FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = ItemLocation::Chest (0x04, 0x0B, "Fire Temple Boulder Maze Shortcut Chest", FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_SCARECROW_CHEST] = ItemLocation::Chest (0x04, 0x0D, "Fire Temple Scarecrow Chest", FIRE_TEMPLE_SCARECROW_CHEST, HUGE_RUPEE, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MAP_CHEST] = ItemLocation::Chest (0x04, 0x0A, "Fire Temple Map Chest", FIRE_TEMPLE_MAP_CHEST, FIRE_TEMPLE_MAP, {Category::cFireTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (0x04, 0x07, "Fire Temple Compass Chest", FIRE_TEMPLE_COMPASS_CHEST, FIRE_TEMPLE_COMPASS, {Category::cFireTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_HIGHEST_GORON_CHEST] = ItemLocation::Chest (0x04, 0x09, "Fire Temple Highest Goron Chest", FIRE_TEMPLE_HIGHEST_GORON_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = ItemLocation::Chest (0x04, 0x05, "Fire Temple Megaton Hammer Chest", FIRE_TEMPLE_MEGATON_HAMMER_CHEST, MEGATON_HAMMER, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_NEAR_BOSS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, 0x04, 0x01, "Fire Temple Near Boss Chest", FIRE_TEMPLE_NEAR_BOSS_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_FLARE_DANCER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, 0x04, 0x00, "Fire Temple Flare Dancer Chest", FIRE_TEMPLE_FLARE_DANCER_CHEST, BOMBS_10, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOSS_KEY_CHEST, 0x04, 0x0C, "Fire Temple Boss Key Chest", FIRE_TEMPLE_BOSS_KEY_CHEST, FIRE_TEMPLE_BOSS_KEY, {Category::cFireTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, 0x04, 0x02, "Fire Temple Big Lava Room Blocked Door Chest", FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, 0x04, 0x04, "Fire Temple Big Lava Room Lower Open Door Chest", FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, 0x04, 0x03, "Fire Temple Boulder Maze Lower Chest", FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, 0x04, 0x06, "Fire Temple Boulder Maze Upper Chest", FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, 0x04, 0x08, "Fire Temple Boulder Maze Side Room Chest", FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, 0x04, 0x0B, "Fire Temple Boulder Maze Shortcut Chest", FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_SCARECROW_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_SCARECROW_CHEST, 0x04, 0x0D, "Fire Temple Scarecrow Chest", FIRE_TEMPLE_SCARECROW_CHEST, HUGE_RUPEE, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MAP_CHEST, 0x04, 0x0A, "Fire Temple Map Chest", FIRE_TEMPLE_MAP_CHEST, FIRE_TEMPLE_MAP, {Category::cFireTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_COMPASS_CHEST, 0x04, 0x07, "Fire Temple Compass Chest", FIRE_TEMPLE_COMPASS_CHEST, FIRE_TEMPLE_COMPASS, {Category::cFireTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_HIGHEST_GORON_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, 0x04, 0x09, "Fire Temple Highest Goron Chest", FIRE_TEMPLE_HIGHEST_GORON_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, 0x04, 0x05, "Fire Temple Megaton Hammer Chest", FIRE_TEMPLE_MEGATON_HAMMER_CHEST, MEGATON_HAMMER, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); //Fire Temple MQ - locationTable[FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = ItemLocation::Chest (0x04, 0x07, "Fire Temple MQ Near Boss Chest", FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = ItemLocation::Chest (0x04, 0x00, "Fire Temple MQ Megaton Hammer Chest", FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, MEGATON_HAMMER, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x04, 0x0B, "Fire Temple MQ Compass Chest", FIRE_TEMPLE_MQ_COMPASS_CHEST, FIRE_TEMPLE_COMPASS, {Category::cFireTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = ItemLocation::Chest (0x04, 0x03, "Fire Temple MQ Lizalfos Maze Lower Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, BOMBS_10, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = ItemLocation::Chest (0x04, 0x06, "Fire Temple MQ Lizalfos Maze Upper Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, BOMBS_10, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = ItemLocation::Chest (0x04, 0x05, "Fire Temple MQ Chest on Fire", FIRE_TEMPLE_MQ_CHEST_ON_FIRE, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = ItemLocation::Chest (0x04, 0x02, "Fire Temple MQ Map Room Side Chest", FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, HYLIAN_SHIELD, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (0x04, 0x0C, "Fire Temple MQ Map Chest", FIRE_TEMPLE_MQ_MAP_CHEST, FIRE_TEMPLE_MAP, {Category::cFireTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (0x04, 0x04, "Fire Temple MQ Boss Key Chest", FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, FIRE_TEMPLE_BOSS_KEY, {Category::cFireTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = ItemLocation::Chest (0x04, 0x01, "Fire Temple MQ Big Lava Room Blocked Door Chest", FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = ItemLocation::Chest (0x04, 0x08, "Fire Temple MQ Lizalfos Maze Side Room Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(0x04, 0x1C, "Fire Temple MQ Freestanding Key", FIRE_TEMPLE_MQ_FREESTANDING_KEY, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, 0x04, 0x07, "Fire Temple MQ Near Boss Chest", FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, 0x04, 0x00, "Fire Temple MQ Megaton Hammer Chest", FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, MEGATON_HAMMER, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, 0x04, 0x0B, "Fire Temple MQ Compass Chest", FIRE_TEMPLE_MQ_COMPASS_CHEST, FIRE_TEMPLE_COMPASS, {Category::cFireTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, 0x04, 0x03, "Fire Temple MQ Lizalfos Maze Lower Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, BOMBS_10, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, 0x04, 0x06, "Fire Temple MQ Lizalfos Maze Upper Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, BOMBS_10, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, 0x04, 0x05, "Fire Temple MQ Chest on Fire", FIRE_TEMPLE_MQ_CHEST_ON_FIRE, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, 0x04, 0x02, "Fire Temple MQ Map Room Side Chest", FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, HYLIAN_SHIELD, {Category::cFireTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_MAP_CHEST, 0x04, 0x0C, "Fire Temple MQ Map Chest", FIRE_TEMPLE_MQ_MAP_CHEST, FIRE_TEMPLE_MAP, {Category::cFireTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, 0x04, 0x04, "Fire Temple MQ Boss Key Chest", FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, FIRE_TEMPLE_BOSS_KEY, {Category::cFireTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, 0x04, 0x01, "Fire Temple MQ Big Lava Room Blocked Door Chest", FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, 0x04, 0x08, "Fire Temple MQ Lizalfos Maze Side Room Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, 0x04, 0x1C, "Fire Temple MQ Freestanding Key", FIRE_TEMPLE_MQ_FREESTANDING_KEY, FIRE_TEMPLE_SMALL_KEY, {Category::cFireTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); //Water Temple Vanilla - locationTable[WATER_TEMPLE_MAP_CHEST] = ItemLocation::Chest (0x05, 0x02, "Water Temple Map Chest", WATER_TEMPLE_MAP_CHEST, WATER_TEMPLE_MAP, {Category::cWaterTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (0x05, 0x09, "Water Temple Compass Chest", WATER_TEMPLE_COMPASS_CHEST, WATER_TEMPLE_COMPASS, {Category::cWaterTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_TORCHES_CHEST] = ItemLocation::Chest (0x05, 0x01, "Water Temple Torches Chest", WATER_TEMPLE_TORCHES_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_DRAGON_CHEST] = ItemLocation::Chest (0x05, 0x0A, "Water Temple Dragon Chest", WATER_TEMPLE_DRAGON_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = ItemLocation::Chest (0x05, 0x08, "Water Temple Central Bow Target Chest", WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = ItemLocation::Chest (0x05, 0x06, "Water Temple Central Pillar Chest", WATER_TEMPLE_CENTRAL_PILLAR_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_CRACKED_WALL_CHEST] = ItemLocation::Chest (0x05, 0x00, "Water Temple Cracked Wall Chest", WATER_TEMPLE_CRACKED_WALL_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x05, 0x05, "Water Temple Boss Key Chest", WATER_TEMPLE_BOSS_KEY_CHEST, WATER_TEMPLE_BOSS_KEY, {Category::cWaterTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_LONGSHOT_CHEST] = ItemLocation::Chest (0x05, 0x07, "Water Temple Longshot Chest", WATER_TEMPLE_LONGSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {Category::cWaterTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_RIVER_CHEST] = ItemLocation::Chest (0x05, 0x03, "Water Temple River Chest", WATER_TEMPLE_RIVER_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MAP_CHEST, 0x05, 0x02, "Water Temple Map Chest", WATER_TEMPLE_MAP_CHEST, WATER_TEMPLE_MAP, {Category::cWaterTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_COMPASS_CHEST, 0x05, 0x09, "Water Temple Compass Chest", WATER_TEMPLE_COMPASS_CHEST, WATER_TEMPLE_COMPASS, {Category::cWaterTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_TORCHES_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_TORCHES_CHEST, 0x05, 0x01, "Water Temple Torches Chest", WATER_TEMPLE_TORCHES_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_DRAGON_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_DRAGON_CHEST, 0x05, 0x0A, "Water Temple Dragon Chest", WATER_TEMPLE_DRAGON_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, 0x05, 0x08, "Water Temple Central Bow Target Chest", WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, 0x05, 0x06, "Water Temple Central Pillar Chest", WATER_TEMPLE_CENTRAL_PILLAR_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_CRACKED_WALL_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_CRACKED_WALL_CHEST, 0x05, 0x00, "Water Temple Cracked Wall Chest", WATER_TEMPLE_CRACKED_WALL_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_BOSS_KEY_CHEST, 0x05, 0x05, "Water Temple Boss Key Chest", WATER_TEMPLE_BOSS_KEY_CHEST, WATER_TEMPLE_BOSS_KEY, {Category::cWaterTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_LONGSHOT_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_LONGSHOT_CHEST, 0x05, 0x07, "Water Temple Longshot Chest", WATER_TEMPLE_LONGSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {Category::cWaterTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_RIVER_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_RIVER_CHEST, 0x05, 0x03, "Water Temple River Chest", WATER_TEMPLE_RIVER_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); //Water Temple MQ - locationTable[WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = ItemLocation::Chest (0x05, 0x06, "Water Temple MQ Central Pillar Chest", WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (0x05, 0x05, "Water Temple MQ Boss Key Chest", WATER_TEMPLE_MQ_BOSS_KEY_CHEST, WATER_TEMPLE_BOSS_KEY, {Category::cWaterTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_LONGSHOT_CHEST] = ItemLocation::Chest (0x05, 0x00, "Water Temple MQ Longshot Chest", WATER_TEMPLE_MQ_LONGSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {Category::cWaterTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x05, 0x01, "Water Temple MQ Compass Chest", WATER_TEMPLE_MQ_COMPASS_CHEST, WATER_TEMPLE_COMPASS, {Category::cWaterTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (0x05, 0x02, "Water Temple MQ Map Chest", WATER_TEMPLE_MQ_MAP_CHEST, WATER_TEMPLE_MAP, {Category::cWaterTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(0x05, 0x01, "Water Temple MQ Freestanding Key", WATER_TEMPLE_MQ_FREESTANDING_KEY, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, 0x05, 0x06, "Water Temple MQ Central Pillar Chest", WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, 0x05, 0x05, "Water Temple MQ Boss Key Chest", WATER_TEMPLE_MQ_BOSS_KEY_CHEST, WATER_TEMPLE_BOSS_KEY, {Category::cWaterTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_LONGSHOT_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, 0x05, 0x00, "Water Temple MQ Longshot Chest", WATER_TEMPLE_MQ_LONGSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {Category::cWaterTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_COMPASS_CHEST, 0x05, 0x01, "Water Temple MQ Compass Chest", WATER_TEMPLE_MQ_COMPASS_CHEST, WATER_TEMPLE_COMPASS, {Category::cWaterTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_MAP_CHEST, 0x05, 0x02, "Water Temple MQ Map Chest", WATER_TEMPLE_MQ_MAP_CHEST, WATER_TEMPLE_MAP, {Category::cWaterTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, 0x05, 0x01, "Water Temple MQ Freestanding Key", WATER_TEMPLE_MQ_FREESTANDING_KEY, WATER_TEMPLE_SMALL_KEY, {Category::cWaterTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); //Spirit Temple Shared - locationTable[SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = ItemLocation::Chest (0x5C, 0x0B, "Spirit Temple Silver Gauntlets Chest", SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {Category::cSpiritTemple, Category::cDesertColossus}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = ItemLocation::Chest (0x5C, 0x09, "Spirit Temple Mirror Shield Chest", SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, MIRROR_SHIELD, {Category::cSpiritTemple, Category::cDesertColossus}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, 0x5C, 0x0B, "Spirit Temple Silver Gauntlets Chest", SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {Category::cSpiritTemple, Category::cDesertColossus}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, 0x5C, 0x09, "Spirit Temple Mirror Shield Chest", SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, MIRROR_SHIELD, {Category::cSpiritTemple, Category::cDesertColossus}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); //Spirit Temple Vanilla - locationTable[SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = ItemLocation::Chest (0x06, 0x08, "Spirit Temple Child Bridge Chest", SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, DEKU_SHIELD, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = ItemLocation::Chest (0x06, 0x00, "Spirit Temple Child Early Torches Chest", SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (0x06, 0x04, "Spirit Temple Compass Chest", SPIRIT_TEMPLE_COMPASS_CHEST, SPIRIT_TEMPLE_COMPASS, {Category::cSpiritTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = ItemLocation::Chest (0x06, 0x07, "Spirit Temple Early Adult Right Chest", SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = ItemLocation::Chest (0x06, 0x0D, "Spirit Temple First Mirror Left Chest", SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, ICE_TRAP, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = ItemLocation::Chest (0x06, 0x0E, "Spirit Temple First Mirror Right Chest", SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MAP_CHEST] = ItemLocation::Chest (0x06, 0x03, "Spirit Temple Map Chest", SPIRIT_TEMPLE_MAP_CHEST, SPIRIT_TEMPLE_MAP, {Category::cSpiritTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = ItemLocation::Chest (0x06, 0x06, "Spirit Temple Child Climb North Chest", SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = ItemLocation::Chest (0x06, 0x0C, "Spirit Temple Child Climb East Chest", SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, DEKU_SHIELD, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = ItemLocation::Chest (0x06, 0x01, "Spirit Temple Sun Block Room Chest", SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = ItemLocation::Chest (0x06, 0x02, "Spirit Temple Statue Room Hand Chest", SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = ItemLocation::Chest (0x06, 0x0F, "Spirit Temple Statue Room Northeast Chest", SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, BLUE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = ItemLocation::Chest (0x06, 0x05, "Spirit Temple Near Four Armos Chest", SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = ItemLocation::Chest (0x06, 0x14, "Spirit Temple Hallway Right Invisible Chest", SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = ItemLocation::Chest (0x06, 0x15, "Spirit Temple Hallway Left Invisible Chest", SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x06, 0x0A, "Spirit Temple Boss Key Chest", SPIRIT_TEMPLE_BOSS_KEY_CHEST, SPIRIT_TEMPLE_BOSS_KEY, {Category::cSpiritTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_TOPMOST_CHEST] = ItemLocation::Chest (0x06, 0x12, "Spirit Temple Topmost Chest", SPIRIT_TEMPLE_TOPMOST_CHEST, BOMBS_20, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, 0x06, 0x08, "Spirit Temple Child Bridge Chest", SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, DEKU_SHIELD, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, 0x06, 0x00, "Spirit Temple Child Early Torches Chest", SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_COMPASS_CHEST, 0x06, 0x04, "Spirit Temple Compass Chest", SPIRIT_TEMPLE_COMPASS_CHEST, SPIRIT_TEMPLE_COMPASS, {Category::cSpiritTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, 0x06, 0x07, "Spirit Temple Early Adult Right Chest", SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, 0x06, 0x0D, "Spirit Temple First Mirror Left Chest", SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, ICE_TRAP, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, 0x06, 0x0E, "Spirit Temple First Mirror Right Chest", SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MAP_CHEST, 0x06, 0x03, "Spirit Temple Map Chest", SPIRIT_TEMPLE_MAP_CHEST, SPIRIT_TEMPLE_MAP, {Category::cSpiritTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, 0x06, 0x06, "Spirit Temple Child Climb North Chest", SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, 0x06, 0x0C, "Spirit Temple Child Climb East Chest", SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, DEKU_SHIELD, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, 0x06, 0x01, "Spirit Temple Sun Block Room Chest", SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, 0x06, 0x02, "Spirit Temple Statue Room Hand Chest", SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, 0x06, 0x0F, "Spirit Temple Statue Room Northeast Chest", SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, BLUE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, 0x06, 0x05, "Spirit Temple Near Four Armos Chest", SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, 0x06, 0x14, "Spirit Temple Hallway Right Invisible Chest", SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, 0x06, 0x15, "Spirit Temple Hallway Left Invisible Chest", SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, 0x06, 0x0A, "Spirit Temple Boss Key Chest", SPIRIT_TEMPLE_BOSS_KEY_CHEST, SPIRIT_TEMPLE_BOSS_KEY, {Category::cSpiritTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_TOPMOST_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_TOPMOST_CHEST, 0x06, 0x12, "Spirit Temple Topmost Chest", SPIRIT_TEMPLE_TOPMOST_CHEST, BOMBS_20, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); //Spirit Temple MQ - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = ItemLocation::Chest (0x06, 0x1A, "Spirit Temple MQ Entrance Front Left Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = ItemLocation::Chest (0x06, 0x1F, "Spirit Temple MQ Entrance Back Right Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = ItemLocation::Chest (0x06, 0x1B, "Spirit Temple MQ Entrance Front Right Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = ItemLocation::Chest (0x06, 0x1E, "Spirit Temple MQ Entrance Back Left Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = ItemLocation::Chest (0x06, 0x1D, "Spirit Temple MQ Child Hammer Switch Chest", SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (0x06, 0x00, "Spirit Temple MQ Map Chest", SPIRIT_TEMPLE_MQ_MAP_CHEST, SPIRIT_TEMPLE_MAP, {Category::cSpiritTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = ItemLocation::Chest (0x06, 0x08, "Spirit Temple MQ Map Room Enemy Chest", SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = ItemLocation::Chest (0x06, 0x06, "Spirit Temple MQ Child Climb North Chest", SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = ItemLocation::Chest (0x06, 0x0C, "Spirit Temple MQ Child Climb South Chest", SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x06, 0x03, "Spirit Temple MQ Compass Chest", SPIRIT_TEMPLE_MQ_COMPASS_CHEST, SPIRIT_TEMPLE_COMPASS, {Category::cSpiritTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = ItemLocation::Chest (0x06, 0x0F, "Spirit Temple MQ Statue Room Lullaby Chest", SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, BLUE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = ItemLocation::Chest (0x06, 0x02, "Spirit Temple MQ Statue Room Invisible Chest", SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = ItemLocation::Chest (0x06, 0x1C, "Spirit Temple MQ Silver Block Hallway Chest", SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = ItemLocation::Chest (0x06, 0x01, "Spirit Temple MQ Sun Block Room Chest", SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = ItemLocation::Chest (0x06, 0x07, "Spirit Temple MQ Symphony Room Chest", SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, PURPLE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = ItemLocation::Chest (0x06, 0x04, "Spirit Temple MQ Leever Room Chest", SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, PURPLE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = ItemLocation::Chest (0x06, 0x19, "Spirit Temple MQ Beamos Room Chest", SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = ItemLocation::Chest (0x06, 0x18, "Spirit Temple MQ Chest Switch Chest", SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, ICE_TRAP, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (0x06, 0x05, "Spirit Temple MQ Boss Key Chest", SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, SPIRIT_TEMPLE_BOSS_KEY, {Category::cSpiritTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = ItemLocation::Chest (0x06, 0x12, "Spirit Temple MQ Mirror Puzzle Invisible Chest", SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, 0x06, 0x1A, "Spirit Temple MQ Entrance Front Left Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, 0x06, 0x1F, "Spirit Temple MQ Entrance Back Right Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, 0x06, 0x1B, "Spirit Temple MQ Entrance Front Right Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, 0x06, 0x1E, "Spirit Temple MQ Entrance Back Left Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, 0x06, 0x1D, "Spirit Temple MQ Child Hammer Switch Chest", SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, 0x06, 0x00, "Spirit Temple MQ Map Chest", SPIRIT_TEMPLE_MQ_MAP_CHEST, SPIRIT_TEMPLE_MAP, {Category::cSpiritTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, 0x06, 0x08, "Spirit Temple MQ Map Room Enemy Chest", SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, 0x06, 0x06, "Spirit Temple MQ Child Climb North Chest", SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, BOMBCHU_10, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, 0x06, 0x0C, "Spirit Temple MQ Child Climb South Chest", SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, 0x06, 0x03, "Spirit Temple MQ Compass Chest", SPIRIT_TEMPLE_MQ_COMPASS_CHEST, SPIRIT_TEMPLE_COMPASS, {Category::cSpiritTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, 0x06, 0x0F, "Spirit Temple MQ Statue Room Lullaby Chest", SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, BLUE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, 0x06, 0x02, "Spirit Temple MQ Statue Room Invisible Chest", SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, 0x06, 0x1C, "Spirit Temple MQ Silver Block Hallway Chest", SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, 0x06, 0x01, "Spirit Temple MQ Sun Block Room Chest", SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, 0x06, 0x07, "Spirit Temple MQ Symphony Room Chest", SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, PURPLE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, 0x06, 0x04, "Spirit Temple MQ Leever Room Chest", SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, PURPLE_RUPEE, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, 0x06, 0x19, "Spirit Temple MQ Beamos Room Chest", SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RECOVERY_HEART, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, 0x06, 0x18, "Spirit Temple MQ Chest Switch Chest", SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, ICE_TRAP, {Category::cSpiritTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, 0x06, 0x05, "Spirit Temple MQ Boss Key Chest", SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, SPIRIT_TEMPLE_BOSS_KEY, {Category::cSpiritTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, 0x06, 0x12, "Spirit Temple MQ Mirror Puzzle Invisible Chest", SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cSpiritTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); //Shadow Temple Vanilla - locationTable[SHADOW_TEMPLE_MAP_CHEST] = ItemLocation::Chest (0x07, 0x01, "Shadow Temple Map Chest", SHADOW_TEMPLE_MAP_CHEST, SHADOW_TEMPLE_MAP, {Category::cShadowTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = ItemLocation::Chest (0x07, 0x07, "Shadow Temple Hover Boots Chest", SHADOW_TEMPLE_HOVER_BOOTS_CHEST, HOVER_BOOTS, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (0x07, 0x03, "Shadow Temple Compass Chest", SHADOW_TEMPLE_COMPASS_CHEST, SHADOW_TEMPLE_COMPASS, {Category::cShadowTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = ItemLocation::Chest (0x07, 0x02, "Shadow Temple Early Silver Rupee Chest", SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = ItemLocation::Chest (0x07, 0x0C, "Shadow Temple Invisible Blades Visible Chest", SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = ItemLocation::Chest (0x07, 0x16, "Shadow Temple Invisible Blades Invisible Chest", SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, ARROWS_30, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = ItemLocation::Chest (0x07, 0x05, "Shadow Temple Falling Spikes Lower Chest", SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = ItemLocation::Chest (0x07, 0x06, "Shadow Temple Falling Spikes Upper Chest", SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = ItemLocation::Chest (0x07, 0x04, "Shadow Temple Falling Spikes Switch Chest", SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = ItemLocation::Chest (0x07, 0x09, "Shadow Temple Invisible Spikes Chest", SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_WIND_HINT_CHEST] = ItemLocation::Chest (0x07, 0x15, "Shadow Temple Wind Hint Chest", SHADOW_TEMPLE_WIND_HINT_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = ItemLocation::Chest (0x07, 0x08, "Shadow Temple After Wind Enemy Chest", SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = ItemLocation::Chest (0x07, 0x14, "Shadow Temple After Wind Hidden Chest", SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = ItemLocation::Chest (0x07, 0x0A, "Shadow Temple Spike Walls Left Chest", SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x07, 0x0B, "Shadow Temple Boss Key Chest", SHADOW_TEMPLE_BOSS_KEY_CHEST, SHADOW_TEMPLE_BOSS_KEY, {Category::cShadowTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = ItemLocation::Chest (0x07, 0x0D, "Shadow Temple Invisible Floormaster Chest", SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FREESTANDING_KEY] = ItemLocation::Collectable(0x07, 0x01, "Shadow Temple Freestanding Key", SHADOW_TEMPLE_FREESTANDING_KEY, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MAP_CHEST, 0x07, 0x01, "Shadow Temple Map Chest", SHADOW_TEMPLE_MAP_CHEST, SHADOW_TEMPLE_MAP, {Category::cShadowTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, 0x07, 0x07, "Shadow Temple Hover Boots Chest", SHADOW_TEMPLE_HOVER_BOOTS_CHEST, HOVER_BOOTS, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_COMPASS_CHEST, 0x07, 0x03, "Shadow Temple Compass Chest", SHADOW_TEMPLE_COMPASS_CHEST, SHADOW_TEMPLE_COMPASS, {Category::cShadowTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, 0x07, 0x02, "Shadow Temple Early Silver Rupee Chest", SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, 0x07, 0x0C, "Shadow Temple Invisible Blades Visible Chest", SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, 0x07, 0x16, "Shadow Temple Invisible Blades Invisible Chest", SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, ARROWS_30, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, 0x07, 0x05, "Shadow Temple Falling Spikes Lower Chest", SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, 0x07, 0x06, "Shadow Temple Falling Spikes Upper Chest", SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, 0x07, 0x04, "Shadow Temple Falling Spikes Switch Chest", SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, 0x07, 0x09, "Shadow Temple Invisible Spikes Chest", SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_WIND_HINT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_WIND_HINT_CHEST, 0x07, 0x15, "Shadow Temple Wind Hint Chest", SHADOW_TEMPLE_WIND_HINT_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, 0x07, 0x08, "Shadow Temple After Wind Enemy Chest", SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, 0x07, 0x14, "Shadow Temple After Wind Hidden Chest", SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, 0x07, 0x0A, "Shadow Temple Spike Walls Left Chest", SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, 0x07, 0x0B, "Shadow Temple Boss Key Chest", SHADOW_TEMPLE_BOSS_KEY_CHEST, SHADOW_TEMPLE_BOSS_KEY, {Category::cShadowTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, 0x07, 0x0D, "Shadow Temple Invisible Floormaster Chest", SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_FREESTANDING_KEY] = ItemLocation::Collectable(RC_SHADOW_TEMPLE_FREESTANDING_KEY, 0x07, 0x01, "Shadow Temple Freestanding Key", SHADOW_TEMPLE_FREESTANDING_KEY, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); //Shadow Temple MQ - locationTable[SHADOW_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x07, 0x01, "Shadow Temple MQ Compass Chest", SHADOW_TEMPLE_MQ_COMPASS_CHEST, SHADOW_TEMPLE_COMPASS, {Category::cShadowTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = ItemLocation::Chest (0x07, 0x07, "Shadow Temple MQ Hover Boots Chest", SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, HOVER_BOOTS, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = ItemLocation::Chest (0x07, 0x03, "Shadow Temple MQ Early Gibdos Chest", SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (0x07, 0x02, "Shadow Temple MQ Map Chest", SHADOW_TEMPLE_MQ_MAP_CHEST, SHADOW_TEMPLE_MAP, {Category::cShadowTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = ItemLocation::Chest (0x07, 0x0F, "Shadow Temple MQ Beamos Silver Rupees Chest", SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, ARROWS_5, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = ItemLocation::Chest (0x07, 0x04, "Shadow Temple MQ Falling Spikes Switch Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = ItemLocation::Chest (0x07, 0x05, "Shadow Temple MQ Falling Spikes Lower Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = ItemLocation::Chest (0x07, 0x06, "Shadow Temple MQ Falling Spikes Upper Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, ARROWS_5, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = ItemLocation::Chest (0x07, 0x09, "Shadow Temple MQ Invisible Spikes Chest", SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (0x07, 0x0B, "Shadow Temple MQ Boss Key Chest", SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, SHADOW_TEMPLE_BOSS_KEY, {Category::cShadowTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = ItemLocation::Chest (0x07, 0x0A, "Shadow Temple MQ Spike Walls Left Chest", SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = ItemLocation::Chest (0x07, 0x10, "Shadow Temple MQ Stalfos Room Chest", SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RED_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = ItemLocation::Chest (0x07, 0x16, "Shadow Temple MQ Invisible Blades Invisible Chest", SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = ItemLocation::Chest (0x07, 0x0C, "Shadow Temple MQ Invisible Blades Visible Chest", SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = ItemLocation::Chest (0x07, 0x0D, "Shadow Temple MQ Bomb Flower Chest", SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = ItemLocation::Chest (0x07, 0x15, "Shadow Temple MQ Wind Hint Chest", SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = ItemLocation::Chest (0x07, 0x14, "Shadow Temple MQ After Wind Hidden Chest", SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, ARROWS_5, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = ItemLocation::Chest (0x07, 0x08, "Shadow Temple MQ After Wind Enemy Chest", SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = ItemLocation::Chest (0x07, 0x0E, "Shadow Temple MQ Near Ship Invisible Chest", SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(0x07, 0x06, "Shadow Temple MQ Freestanding Key", SHADOW_TEMPLE_MQ_FREESTANDING_KEY, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, 0x07, 0x01, "Shadow Temple MQ Compass Chest", SHADOW_TEMPLE_MQ_COMPASS_CHEST, SHADOW_TEMPLE_COMPASS, {Category::cShadowTemple, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, 0x07, 0x07, "Shadow Temple MQ Hover Boots Chest", SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, HOVER_BOOTS, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, 0x07, 0x03, "Shadow Temple MQ Early Gibdos Chest", SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_MAP_CHEST, 0x07, 0x02, "Shadow Temple MQ Map Chest", SHADOW_TEMPLE_MQ_MAP_CHEST, SHADOW_TEMPLE_MAP, {Category::cShadowTemple, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, 0x07, 0x0F, "Shadow Temple MQ Beamos Silver Rupees Chest", SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, ARROWS_5, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, 0x07, 0x04, "Shadow Temple MQ Falling Spikes Switch Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, 0x07, 0x05, "Shadow Temple MQ Falling Spikes Lower Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, 0x07, 0x06, "Shadow Temple MQ Falling Spikes Upper Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, ARROWS_5, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, 0x07, 0x09, "Shadow Temple MQ Invisible Spikes Chest", SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, 0x07, 0x0B, "Shadow Temple MQ Boss Key Chest", SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, SHADOW_TEMPLE_BOSS_KEY, {Category::cShadowTemple, Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, 0x07, 0x0A, "Shadow Temple MQ Spike Walls Left Chest", SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, 0x07, 0x10, "Shadow Temple MQ Stalfos Room Chest", SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RED_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, 0x07, 0x16, "Shadow Temple MQ Invisible Blades Invisible Chest", SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, 0x07, 0x0C, "Shadow Temple MQ Invisible Blades Visible Chest", SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, 0x07, 0x0D, "Shadow Temple MQ Bomb Flower Chest", SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, ARROWS_10, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, 0x07, 0x15, "Shadow Temple MQ Wind Hint Chest", SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, 0x07, 0x14, "Shadow Temple MQ After Wind Hidden Chest", SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, ARROWS_5, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, 0x07, 0x08, "Shadow Temple MQ After Wind Enemy Chest", SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, BLUE_RUPEE, {Category::cShadowTemple,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, 0x07, 0x0E, "Shadow Temple MQ Near Ship Invisible Chest", SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, 0x07, 0x06, "Shadow Temple MQ Freestanding Key", SHADOW_TEMPLE_MQ_FREESTANDING_KEY, SHADOW_TEMPLE_SMALL_KEY, {Category::cShadowTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); //Bottom of the Well Vanilla - locationTable[BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = ItemLocation::Chest (0x08, 0x08, "Bottom of the Well Front Left Fake Wall Chest", BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = ItemLocation::Chest (0x08, 0x02, "Bottom of the Well Front Center Bombable Chest", BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, BOMBCHU_10, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = ItemLocation::Chest (0x08, 0x05, "Bottom of the Well Right Bottom Fake Wall Chest", BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_COMPASS_CHEST] = ItemLocation::Chest (0x08, 0x01, "Bottom of the Well Compass Chest", BOTTOM_OF_THE_WELL_COMPASS_CHEST, BOTTOM_OF_THE_WELL_COMPASS, {Category::cBottomOfTheWell, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = ItemLocation::Chest (0x08, 0x0E, "Bottom of the Well Center Skulltula Chest", BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, DEKU_NUTS_5, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = ItemLocation::Chest (0x08, 0x04, "Bottom of the Well Back Left Bombable Chest", BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, DEKU_NUTS_10, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (0x08, 0x03, "Bottom of the Well Lens of Truth Chest", BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cBottomOfTheWell, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = ItemLocation::Chest (0x08, 0x14, "Bottom of the Well Invisible Chest", BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, HUGE_RUPEE, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = ItemLocation::Chest (0x08, 0x10, "Bottom of the Well Underwater Front Chest", BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, BOMBS_10, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = ItemLocation::Chest (0x08, 0x09, "Bottom of the Well Underwater Left Chest", BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RECOVERY_HEART, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MAP_CHEST] = ItemLocation::Chest (0x08, 0x07, "Bottom of the Well Map Chest", BOTTOM_OF_THE_WELL_MAP_CHEST, BOTTOM_OF_THE_WELL_MAP, {Category::cBottomOfTheWell, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = ItemLocation::Chest (0x08, 0x0A, "Bottom of the Well Fire Keese Chest", BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, DEKU_SHIELD, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = ItemLocation::Chest (0x08, 0x0C, "Bottom of the Well Like Like Chest", BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, HYLIAN_SHIELD, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = ItemLocation::Collectable(0x08, 0x01, "Bottom of the Well Freestanding Key", BOTTOM_OF_THE_WELL_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, 0x08, 0x08, "Bottom of the Well Front Left Fake Wall Chest", BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, 0x08, 0x02, "Bottom of the Well Front Center Bombable Chest", BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, BOMBCHU_10, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, 0x08, 0x05, "Bottom of the Well Right Bottom Fake Wall Chest", BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_COMPASS_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, 0x08, 0x01, "Bottom of the Well Compass Chest", BOTTOM_OF_THE_WELL_COMPASS_CHEST, BOTTOM_OF_THE_WELL_COMPASS, {Category::cBottomOfTheWell, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, 0x08, 0x0E, "Bottom of the Well Center Skulltula Chest", BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, DEKU_NUTS_5, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, 0x08, 0x04, "Bottom of the Well Back Left Bombable Chest", BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, DEKU_NUTS_10, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, 0x08, 0x03, "Bottom of the Well Lens of Truth Chest", BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cBottomOfTheWell, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, 0x08, 0x14, "Bottom of the Well Invisible Chest", BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, HUGE_RUPEE, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, 0x08, 0x10, "Bottom of the Well Underwater Front Chest", BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, BOMBS_10, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, 0x08, 0x09, "Bottom of the Well Underwater Left Chest", BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RECOVERY_HEART, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MAP_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MAP_CHEST, 0x08, 0x07, "Bottom of the Well Map Chest", BOTTOM_OF_THE_WELL_MAP_CHEST, BOTTOM_OF_THE_WELL_MAP, {Category::cBottomOfTheWell, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, 0x08, 0x0A, "Bottom of the Well Fire Keese Chest", BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, DEKU_SHIELD, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, 0x08, 0x0C, "Bottom of the Well Like Like Chest", BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, HYLIAN_SHIELD, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = ItemLocation::Collectable(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, 0x08, 0x01, "Bottom of the Well Freestanding Key", BOTTOM_OF_THE_WELL_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); //Bottom of the Well MQBottomOfTheWell] - locationTable[BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = ItemLocation::Chest (0x08, 0x03, "Bottom of the Well MQ Map Chest", BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, BOTTOM_OF_THE_WELL_MAP, {Category::cBottomOfTheWell, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (0x08, 0x01, "Bottom of the Well MQ Lens of Truth Chest", BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cBottomOfTheWell, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x08, 0x02, "Bottom of the Well MQ Compass Chest", BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, BOTTOM_OF_THE_WELL_COMPASS, {Category::cBottomOfTheWell, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = ItemLocation::Collectable(0x08, 0x02, "Bottom of the Well MQ Dead Hand Freestanding Key", BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = ItemLocation::Collectable(0x08, 0x01, "Bottom of the Well MQ East Inner Room Freestanding Key",BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, 0x08, 0x03, "Bottom of the Well MQ Map Chest", BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, BOTTOM_OF_THE_WELL_MAP, {Category::cBottomOfTheWell, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, 0x08, 0x01, "Bottom of the Well MQ Lens of Truth Chest", BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cBottomOfTheWell, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, 0x08, 0x02, "Bottom of the Well MQ Compass Chest", BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, BOTTOM_OF_THE_WELL_COMPASS, {Category::cBottomOfTheWell, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = ItemLocation::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, 0x08, 0x02, "Bottom of the Well MQ Dead Hand Freestanding Key", BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = ItemLocation::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, 0x08, 0x01, "Bottom of the Well MQ East Inner Room Freestanding Key",BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); //Ice Cavern Vanilla - locationTable[ICE_CAVERN_MAP_CHEST] = ItemLocation::Chest (0x09, 0x00, "Ice Cavern Map Chest", ICE_CAVERN_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (0x09, 0x01, "Ice Cavern Compass Chest", ICE_CAVERN_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_IRON_BOOTS_CHEST] = ItemLocation::Chest (0x09, 0x02, "Ice Cavern Iron Boots Chest", ICE_CAVERN_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_FREESTANDING_POH] = ItemLocation::Collectable(0x09, 0x01, "Ice Cavern Freestanding PoH", ICE_CAVERN_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MAP_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MAP_CHEST, 0x09, 0x00, "Ice Cavern Map Chest", ICE_CAVERN_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_COMPASS_CHEST, 0x09, 0x01, "Ice Cavern Compass Chest", ICE_CAVERN_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_IRON_BOOTS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_IRON_BOOTS_CHEST, 0x09, 0x02, "Ice Cavern Iron Boots Chest", ICE_CAVERN_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_FREESTANDING_POH] = ItemLocation::Collectable(RC_ICE_CAVERN_FREESTANDING_POH, 0x09, 0x01, "Ice Cavern Freestanding PoH", ICE_CAVERN_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); //Ice Cavern MQIceCavern] - locationTable[ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = ItemLocation::Chest (0x09, 0x02, "Ice Cavern MQ Iron Boots Chest", ICE_CAVERN_MQ_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x09, 0x00, "Ice Cavern MQ Compass Chest", ICE_CAVERN_MQ_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (0x09, 0x01, "Ice Cavern MQ Map Chest", ICE_CAVERN_MQ_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_FREESTANDING_POH] = ItemLocation::Collectable(0x09, 0x01, "Ice Cavern MQ Freestanding PoH", ICE_CAVERN_MQ_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, 0x09, 0x02, "Ice Cavern MQ Iron Boots Chest", ICE_CAVERN_MQ_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MQ_COMPASS_CHEST, 0x09, 0x00, "Ice Cavern MQ Compass Chest", ICE_CAVERN_MQ_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MQ_MAP_CHEST, 0x09, 0x01, "Ice Cavern MQ Map Chest", ICE_CAVERN_MQ_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_FREESTANDING_POH] = ItemLocation::Collectable(RC_ICE_CAVERN_MQ_FREESTANDING_POH, 0x09, 0x01, "Ice Cavern MQ Freestanding PoH", ICE_CAVERN_MQ_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); //Gerudo Training Ground Vanilla - locationTable[GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST] = ItemLocation::Chest (0x0B, 0x13, "Gerudo Training Grounds Lobby Left Chest", GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST] = ItemLocation::Chest (0x0B, 0x07, "Gerudo Training Grounds Lobby Right Chest", GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_STALFOS_CHEST] = ItemLocation::Chest (0x0B, 0x00, "Gerudo Training Grounds Stalfos Chest", GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST] = ItemLocation::Chest (0x0B, 0x01, "Gerudo Training Grounds Beamos Chest", GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (0x0B, 0x0B, "Gerudo Training Grounds Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST] = ItemLocation::Chest (0x0B, 0x06, "Gerudo Training Grounds Maze Path First Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST, PURPLE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (0x0B, 0x0A, "Gerudo Training Grounds Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (0x0B, 0x09, "Gerudo Training Grounds Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST, ARROWS_30, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST] = ItemLocation::Chest (0x0B, 0x0C, "Gerudo Training Grounds Maze Path Final Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST, ICE_ARROWS, {Category::cGerudoTrainingGrounds, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST] = ItemLocation::Chest (0x0B, 0x05, "Gerudo Training Grounds Maze Right Central Chest", GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST, BOMBCHU_5, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST] = ItemLocation::Chest (0x0B, 0x08, "Gerudo Training Grounds Maze Right Side Chest", GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST, ARROWS_30, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (0x0B, 0x0D, "Gerudo Training Grounds Underwater Silver Rupee Chest", GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST] = ItemLocation::Chest (0x0B, 0x12, "Gerudo Training Grounds Hammer Room Clear Chest", GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST] = ItemLocation::Chest (0x0B, 0x10, "Gerudo Training Grounds Hammer Room Switch Chest", GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST] = ItemLocation::Chest (0x0B, 0x03, "Gerudo Training Grounds Eye Statue Chest", GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST] = ItemLocation::Chest (0x0B, 0x04, "Gerudo Training Grounds Near Scarecrow Chest", GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (0x0B, 0x11, "Gerudo Training Grounds Before Heavy Block Chest", GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, ARROWS_30, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST] = ItemLocation::Chest (0x0B, 0x0F, "Gerudo Training Grounds Heavy Block First Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, HUGE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST] = ItemLocation::Chest (0x0B, 0x0E, "Gerudo Training Grounds Heavy Block Second Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST] = ItemLocation::Chest (0x0B, 0x14, "Gerudo Training Grounds Heavy Block Third Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST] = ItemLocation::Chest (0x0B, 0x02, "Gerudo Training Grounds Heavy Block Fourth Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, ICE_TRAP, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY] = ItemLocation::Collectable(0x0B, 0x01, "Gerudo Training Grounds Freestanding Key", GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, 0x0B, 0x13, "Gerudo Training Grounds Lobby Left Chest", GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, 0x0B, 0x07, "Gerudo Training Grounds Lobby Right Chest", GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_STALFOS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, 0x0B, 0x00, "Gerudo Training Grounds Stalfos Chest", GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, 0x0B, 0x01, "Gerudo Training Grounds Beamos Chest", GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, 0x0B, 0x0B, "Gerudo Training Grounds Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, 0x0B, 0x06, "Gerudo Training Grounds Maze Path First Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST, PURPLE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, 0x0B, 0x0A, "Gerudo Training Grounds Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, 0x0B, 0x09, "Gerudo Training Grounds Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST, ARROWS_30, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, 0x0B, 0x0C, "Gerudo Training Grounds Maze Path Final Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST, ICE_ARROWS, {Category::cGerudoTrainingGrounds, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, 0x0B, 0x05, "Gerudo Training Grounds Maze Right Central Chest", GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST, BOMBCHU_5, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, 0x0B, 0x08, "Gerudo Training Grounds Maze Right Side Chest", GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST, ARROWS_30, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds Underwater Silver Rupee Chest", GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, 0x0B, 0x12, "Gerudo Training Grounds Hammer Room Clear Chest", GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, 0x0B, 0x10, "Gerudo Training Grounds Hammer Room Switch Chest", GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, 0x0B, 0x03, "Gerudo Training Grounds Eye Statue Chest", GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, 0x0B, 0x04, "Gerudo Training Grounds Near Scarecrow Chest", GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, 0x0B, 0x11, "Gerudo Training Grounds Before Heavy Block Chest", GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, ARROWS_30, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, 0x0B, 0x0F, "Gerudo Training Grounds Heavy Block First Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, HUGE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, 0x0B, 0x0E, "Gerudo Training Grounds Heavy Block Second Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, 0x0B, 0x14, "Gerudo Training Grounds Heavy Block Third Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, 0x0B, 0x02, "Gerudo Training Grounds Heavy Block Fourth Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, ICE_TRAP, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY] = ItemLocation::Collectable(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, 0x0B, 0x01, "Gerudo Training Grounds Freestanding Key", GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); //Gerudo Training Grounds MQ - locationTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST] = ItemLocation::Chest (0x0B, 0x07, "Gerudo Training Grounds MQ Lobby Right Chest", GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST, BOMBCHU_5, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST] = ItemLocation::Chest (0x0B, 0x13, "Gerudo Training Grounds MQ Lobby Left Chest", GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x0B, 0x00, "Gerudo Training Grounds MQ First Iron Knuckle Chest", GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (0x0B, 0x11, "Gerudo Training Grounds MQ Before Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST] = ItemLocation::Chest (0x0B, 0x03, "Gerudo Training Grounds MQ Eye Statue Chest", GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, BOMBCHU_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST] = ItemLocation::Chest (0x0B, 0x0E, "Gerudo Training Grounds MQ Flame Circle Chest", GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x0B, 0x12, "Gerudo Training Grounds MQ Second Iron Knuckle Chest", GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST] = ItemLocation::Chest (0x0B, 0x01, "Gerudo Training Grounds MQ Dinolfos Chest", GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST] = ItemLocation::Chest (0x0B, 0x04, "Gerudo Training Grounds MQ Ice Arrows Chest", GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST, ICE_ARROWS, {Category::cGerudoTrainingGrounds, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST] = ItemLocation::Chest (0x0B, 0x05, "Gerudo Training Grounds MQ Maze Right Central Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST] = ItemLocation::Chest (0x0B, 0x06, "Gerudo Training Grounds MQ Maze Path First Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST, GREEN_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST] = ItemLocation::Chest (0x0B, 0x08, "Gerudo Training Grounds MQ Maze Right Side Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (0x0B, 0x09, "Gerudo Training Grounds MQ Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (0x0B, 0x0A, "Gerudo Training Grounds MQ Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (0x0B, 0x0B, "Gerudo Training Grounds MQ Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, PURPLE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (0x0B, 0x0D, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest",GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (0x0B, 0x02, "Gerudo Training Grounds MQ Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, PURPLE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, 0x0B, 0x07, "Gerudo Training Grounds MQ Lobby Right Chest", GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST, BOMBCHU_5, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, 0x0B, 0x13, "Gerudo Training Grounds MQ Lobby Left Chest", GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, 0x0B, 0x00, "Gerudo Training Grounds MQ First Iron Knuckle Chest", GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, 0x0B, 0x11, "Gerudo Training Grounds MQ Before Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, 0x0B, 0x03, "Gerudo Training Grounds MQ Eye Statue Chest", GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, BOMBCHU_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, 0x0B, 0x0E, "Gerudo Training Grounds MQ Flame Circle Chest", GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, 0x0B, 0x12, "Gerudo Training Grounds MQ Second Iron Knuckle Chest", GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, ARROWS_10, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, 0x0B, 0x01, "Gerudo Training Grounds MQ Dinolfos Chest", GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, 0x0B, 0x04, "Gerudo Training Grounds MQ Ice Arrows Chest", GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST, ICE_ARROWS, {Category::cGerudoTrainingGrounds, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, 0x0B, 0x05, "Gerudo Training Grounds MQ Maze Right Central Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, 0x0B, 0x06, "Gerudo Training Grounds MQ Maze Path First Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST, GREEN_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, 0x0B, 0x08, "Gerudo Training Grounds MQ Maze Right Side Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, 0x0B, 0x09, "Gerudo Training Grounds MQ Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, 0x0B, 0x0A, "Gerudo Training Grounds MQ Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, 0x0B, 0x0B, "Gerudo Training Grounds MQ Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, PURPLE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest",GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cGerudoTrainingGrounds, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, 0x0B, 0x02, "Gerudo Training Grounds MQ Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, PURPLE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); //Ganons Castle Shared - locationTable[GANONS_TOWER_BOSS_KEY_CHEST] = ItemLocation::Chest (0x0A, 0x0B, "Ganon's Tower Boss Key Chest", GANONS_TOWER_BOSS_KEY_CHEST, GANONS_CASTLE_BOSS_KEY, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_TOWER_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_GANONS_TOWER_BOSS_KEY_CHEST, 0x0A, 0x0B, "Ganon's Tower Boss Key Chest", GANONS_TOWER_BOSS_KEY_CHEST, GANONS_CASTLE_BOSS_KEY, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); //Ganons Castle Vanilla - locationTable[GANONS_CASTLE_FOREST_TRIAL_CHEST] = ItemLocation::Chest (0x0D, 0x09, "Ganon's Castle Forest Trial Chest", GANONS_CASTLE_FOREST_TRIAL_CHEST, BLUE_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = ItemLocation::Chest (0x0D, 0x07, "Ganon's Castle Water Trial Left Chest", GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = ItemLocation::Chest (0x0D, 0x06, "Ganon's Castle Water Trial Right Chest", GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = ItemLocation::Chest (0x0D, 0x08, "Ganon's Castle Shadow Trial Front Chest", GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, BLUE_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = ItemLocation::Chest (0x0D, 0x05, "Ganon's Castle Shadow Trial Golden Gauntlets Chest", GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = ItemLocation::Chest (0x0D, 0x12, "Ganon's Castle Spirit Trial Crystal Switch Chest", GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, BOMBCHU_20, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = ItemLocation::Chest (0x0D, 0x14, "Ganon's Castle Spirit Trial Invisible Chest", GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = ItemLocation::Chest (0x0D, 0x0C, "Ganon's Castle Light Trial First Left Chest", GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, BLUE_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = ItemLocation::Chest (0x0D, 0x0B, "Ganon's Castle Light Trial Second Left Chest", GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = ItemLocation::Chest (0x0D, 0x0D, "Ganon's Castle Light Trial Third Left Chest", GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = ItemLocation::Chest (0x0D, 0x0E, "Ganon's Castle Light Trial First Right Chest", GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = ItemLocation::Chest (0x0D, 0x0A, "Ganon's Castle Light Trial Second Right Chest", GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, ARROWS_30, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = ItemLocation::Chest (0x0D, 0x0F, "Ganon's Castle Light Trial Third Right Chest", GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = ItemLocation::Chest (0x0D, 0x10, "Ganon's Castle Light Trial Invisible Enemies Chest", GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = ItemLocation::Chest (0x0D, 0x11, "Ganon's Castle Light Trial Lullaby Chest", GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (0x0D, 0x37, "Ganon's Castle Deku Scrub Center-Left", GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, BUY_BOMBS_535, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (0x0D, 0x33, "Ganon's Castle Deku Scrub Center-Right", GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, BUY_ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_RIGHT] = ItemLocation::Base (0x0D, 0x39, "Ganon's Castle Deku Scrub Right", GANONS_CASTLE_DEKU_SCRUB_RIGHT, BUY_RED_POTION_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_LEFT] = ItemLocation::Base (0x0D, 0x3A, "Ganon's Castle Deku Scrub Left", GANONS_CASTLE_DEKU_SCRUB_LEFT, BUY_GREEN_POTION, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_FOREST_TRIAL_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, 0x0D, 0x09, "Ganon's Castle Forest Trial Chest", GANONS_CASTLE_FOREST_TRIAL_CHEST, BLUE_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, 0x0D, 0x07, "Ganon's Castle Water Trial Left Chest", GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, 0x0D, 0x06, "Ganon's Castle Water Trial Right Chest", GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, 0x0D, 0x08, "Ganon's Castle Shadow Trial Front Chest", GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, BLUE_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, 0x0D, 0x05, "Ganon's Castle Shadow Trial Golden Gauntlets Chest", GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, 0x0D, 0x12, "Ganon's Castle Spirit Trial Crystal Switch Chest", GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, BOMBCHU_20, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, 0x0D, 0x14, "Ganon's Castle Spirit Trial Invisible Chest", GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, 0x0D, 0x0C, "Ganon's Castle Light Trial First Left Chest", GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, BLUE_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, 0x0D, 0x0B, "Ganon's Castle Light Trial Second Left Chest", GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, 0x0D, 0x0D, "Ganon's Castle Light Trial Third Left Chest", GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, 0x0D, 0x0E, "Ganon's Castle Light Trial First Right Chest", GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, 0x0D, 0x0A, "Ganon's Castle Light Trial Second Right Chest", GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, ARROWS_30, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, 0x0D, 0x0F, "Ganon's Castle Light Trial Third Right Chest", GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, 0x0D, 0x10, "Ganon's Castle Light Trial Invisible Enemies Chest", GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, 0x0D, 0x11, "Ganon's Castle Light Trial Lullaby Chest", GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, 0x0D, 0x37, "Ganon's Castle Deku Scrub Center-Left", GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, BUY_BOMBS_535, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, 0x0D, 0x33, "Ganon's Castle Deku Scrub Center-Right", GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, BUY_ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, 0x0D, 0x39, "Ganon's Castle Deku Scrub Right", GANONS_CASTLE_DEKU_SCRUB_RIGHT, BUY_RED_POTION_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, 0x0D, 0x3A, "Ganon's Castle Deku Scrub Left", GANONS_CASTLE_DEKU_SCRUB_LEFT, BUY_GREEN_POTION, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); //Ganons Castle MQ - locationTable[GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = ItemLocation::Chest (0x0D, 0x01, "Ganon's Castle MQ Water Trial Chest", GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RED_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = ItemLocation::Chest (0x0D, 0x02, "Ganon's Castle MQ Forest Trial Eye Switch Chest", GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = ItemLocation::Chest (0x0D, 0x03, "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest",GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, BOMBS_5, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = ItemLocation::Chest (0x0D, 0x04, "Ganon's Castle MQ Light Trial Lullaby Chest", GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = ItemLocation::Chest (0x0D, 0x00, "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = ItemLocation::Chest (0x0D, 0x05, "Ganon's Castle MQ Shadow Trial Eye Switch Chest", GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = ItemLocation::Chest (0x0D, 0x06, "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = ItemLocation::Chest (0x0D, 0x07, "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = ItemLocation::Chest (0x0D, 0x08, "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = ItemLocation::Chest (0x0D, 0x09, "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = ItemLocation::Chest (0x0D, 0x0A, "Ganon's Castle MQ Spirit Trial First Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, BOMBCHU_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = ItemLocation::Chest (0x0D, 0x14, "Ganon's Castle MQ Spirit Trial Invisible Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = ItemLocation::Collectable(0x0D, 0x01, "Ganon's Castle MQ Forest Trial Freestanding Key", GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = ItemLocation::Base (0x0D, 0x30, "Ganon's Castle MQ Deku Scrub Right", GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, BUY_DEKU_NUT_5, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (0x0D, 0x37, "Ganon's Castle MQ Deku Scrub Center-Left", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, BUY_BOMBS_535, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = ItemLocation::Base (0x0D, 0x33, "Ganon's Castle MQ Deku Scrub Center", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, BUY_ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (0x0D, 0x39, "Ganon's Castle MQ Deku Scrub Center-Right", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, BUY_RED_POTION_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = ItemLocation::Base (0x0D, 0x3A, "Ganon's Castle MQ Deku Scrub Left", GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, BUY_GREEN_POTION, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, 0x0D, 0x01, "Ganon's Castle MQ Water Trial Chest", GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RED_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, 0x0D, 0x02, "Ganon's Castle MQ Forest Trial Eye Switch Chest", GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, 0x0D, 0x03, "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest",GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, BOMBS_5, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, 0x0D, 0x04, "Ganon's Castle MQ Light Trial Lullaby Chest", GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, 0x0D, 0x00, "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, 0x0D, 0x05, "Ganon's Castle MQ Shadow Trial Eye Switch Chest", GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, 0x0D, 0x06, "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, 0x0D, 0x07, "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, 0x0D, 0x08, "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, 0x0D, 0x09, "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RECOVERY_HEART, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, 0x0D, 0x0A, "Ganon's Castle MQ Spirit Trial First Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, BOMBCHU_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, 0x0D, 0x14, "Ganon's Castle MQ Spirit Trial Invisible Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = ItemLocation::Collectable(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, 0x0D, 0x01, "Ganon's Castle MQ Forest Trial Freestanding Key", GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, 0x0D, 0x30, "Ganon's Castle MQ Deku Scrub Right", GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, BUY_DEKU_NUT_5, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, 0x0D, 0x37, "Ganon's Castle MQ Deku Scrub Center-Left", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, BUY_BOMBS_535, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, 0x0D, 0x33, "Ganon's Castle MQ Deku Scrub Center", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, BUY_ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, 0x0D, 0x39, "Ganon's Castle MQ Deku Scrub Center-Right", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, BUY_RED_POTION_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, 0x0D, 0x3A, "Ganon's Castle MQ Deku Scrub Left", GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, BUY_GREEN_POTION, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); /*------------------------------- --- GOLD SKULLTULA TOKENS --- -------------------------------*/ //Dungeons - locationTable[DEKU_TREE_GS_BASEMENT_BACK_ROOM] = ItemLocation::GSToken(0x00, 0x01, "Deku Tree GS Basement Back Room", DEKU_TREE_GS_BASEMENT_BACK_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_GS_BASEMENT_GATE] = ItemLocation::GSToken(0x00, 0x02, "Deku Tree GS Basement Gate", DEKU_TREE_GS_BASEMENT_GATE, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_GS_BASEMENT_VINES] = ItemLocation::GSToken(0x00, 0x04, "Deku Tree GS Basement Vines", DEKU_TREE_GS_BASEMENT_VINES, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_GS_COMPASS_ROOM] = ItemLocation::GSToken(0x00, 0x08, "Deku Tree GS Compass Room", DEKU_TREE_GS_COMPASS_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_GS_BASEMENT_BACK_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, 0x00, 0x01, "Deku Tree GS Basement Back Room", DEKU_TREE_GS_BASEMENT_BACK_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_GS_BASEMENT_GATE] = ItemLocation::GSToken(RC_DEKU_TREE_GS_BASEMENT_GATE, 0x00, 0x02, "Deku Tree GS Basement Gate", DEKU_TREE_GS_BASEMENT_GATE, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_GS_BASEMENT_VINES] = ItemLocation::GSToken(RC_DEKU_TREE_GS_BASEMENT_VINES, 0x00, 0x04, "Deku Tree GS Basement Vines", DEKU_TREE_GS_BASEMENT_VINES, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_GS_COMPASS_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_GS_COMPASS_ROOM, 0x00, 0x08, "Deku Tree GS Compass Room", DEKU_TREE_GS_COMPASS_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_GS_LOBBY] = ItemLocation::GSToken(0x00, 0x02, "Deku Tree MQ GS Lobby", DEKU_TREE_MQ_GS_LOBBY, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_GS_COMPASS_ROOM] = ItemLocation::GSToken(0x00, 0x08, "Deku Tree MQ GS Compass Room", DEKU_TREE_MQ_GS_COMPASS_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = ItemLocation::GSToken(0x00, 0x04, "Deku Tree MQ GS Basement Graves Room", DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = ItemLocation::GSToken(0x00, 0x01, "Deku Tree MQ GS Basement Back Room", DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_GS_LOBBY] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_LOBBY, 0x00, 0x02, "Deku Tree MQ GS Lobby", DEKU_TREE_MQ_GS_LOBBY, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_GS_COMPASS_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, 0x00, 0x08, "Deku Tree MQ GS Compass Room", DEKU_TREE_MQ_GS_COMPASS_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, 0x00, 0x04, "Deku Tree MQ GS Basement Graves Room", DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, 0x00, 0x01, "Deku Tree MQ GS Basement Back Room", DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {Category::cDekuTree, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = ItemLocation::GSToken(0x01, 0x01, "Dodongos Cavern GS Vines Above Stairs", DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_SCARECROW] = ItemLocation::GSToken(0x01, 0x02, "Dodongos Cavern GS Scarecrow", DODONGOS_CAVERN_GS_SCARECROW, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = ItemLocation::GSToken(0x01, 0x04, "Dodongos Cavern GS Alcove Above Stairs", DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_BACK_ROOM] = ItemLocation::GSToken(0x01, 0x08, "Dodongos Cavern GS Back Room", DODONGOS_CAVERN_GS_BACK_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::GSToken(0x01, 0x10, "Dodongos Cavern GS Side Room Near Lower Lizalfos", DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, 0x01, 0x01, "Dodongos Cavern GS Vines Above Stairs", DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_GS_SCARECROW] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_SCARECROW, 0x01, 0x02, "Dodongos Cavern GS Scarecrow", DODONGOS_CAVERN_GS_SCARECROW, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, 0x01, 0x04, "Dodongos Cavern GS Alcove Above Stairs", DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_GS_BACK_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_BACK_ROOM, 0x01, 0x08, "Dodongos Cavern GS Back Room", DODONGOS_CAVERN_GS_BACK_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, 0x01, 0x10, "Dodongos Cavern GS Side Room Near Lower Lizalfos", DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = ItemLocation::GSToken(0x01, 0x02, "Dodongos Cavern MQ GS Scrub Room", DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = ItemLocation::GSToken(0x01, 0x08, "Dodongos Cavern MQ GS Song of Time Block Room", DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = ItemLocation::GSToken(0x01, 0x04, "Dodongos Cavern MQ GS Lizalfos Room", DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = ItemLocation::GSToken(0x01, 0x10, "Dodongos Cavern MQ GS Larvae Room", DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_BACK_AREA] = ItemLocation::GSToken(0x01, 0x01, "Dodongos Cavern MQ GS Back Room", DODONGOS_CAVERN_MQ_GS_BACK_AREA, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, 0x01, 0x02, "Dodongos Cavern MQ GS Scrub Room", DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, 0x01, 0x08, "Dodongos Cavern MQ GS Song of Time Block Room", DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, 0x01, 0x04, "Dodongos Cavern MQ GS Lizalfos Room", DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, 0x01, 0x10, "Dodongos Cavern MQ GS Larvae Room", DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_GS_BACK_AREA] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, 0x01, 0x01, "Dodongos Cavern MQ GS Back Room", DODONGOS_CAVERN_MQ_GS_BACK_AREA, {Category::cDodongosCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = ItemLocation::GSToken(0x02, 0x01, "Jabu Jabus Belly GS Lobby Basement Lower", JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = ItemLocation::GSToken(0x02, 0x02, "Jabu Jabus Belly GS Lobby Basement Upper", JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_GS_NEAR_BOSS] = ItemLocation::GSToken(0x02, 0x04, "Jabu Jabus Belly GS Near Boss", JABU_JABUS_BELLY_GS_NEAR_BOSS, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = ItemLocation::GSToken(0x02, 0x08, "Jabu Jabus Belly GS Water Switch Room", JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, 0x02, 0x01, "Jabu Jabus Belly GS Lobby Basement Lower", JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, 0x02, 0x02, "Jabu Jabus Belly GS Lobby Basement Upper", JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_GS_NEAR_BOSS] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, 0x02, 0x04, "Jabu Jabus Belly GS Near Boss", JABU_JABUS_BELLY_GS_NEAR_BOSS, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, 0x02, 0x08, "Jabu Jabus Belly GS Water Switch Room", JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = ItemLocation::GSToken(0x02, 0x04, "Jabu Jabus Belly MQ GS Tail Parasan Room", JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = ItemLocation::GSToken(0x02, 0x08, "Jabu Jabus Belly MQ GS Invisible Enemies Room", JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = ItemLocation::GSToken(0x02, 0x01, "Jabu Jabus Belly MQ GS Boomerang Chest Room", JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = ItemLocation::GSToken(0x02, 0x02, "Jabu Jabus Belly MQ GS Near Boss", JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, 0x02, 0x04, "Jabu Jabus Belly MQ GS Tail Parasan Room", JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, 0x02, 0x08, "Jabu Jabus Belly MQ GS Invisible Enemies Room", JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, 0x02, 0x01, "Jabu Jabus Belly MQ GS Boomerang Chest Room", JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, 0x02, 0x02, "Jabu Jabus Belly MQ GS Near Boss", JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {Category::cJabuJabusBelly, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = ItemLocation::GSToken(0x03, 0x01, "Forest Temple GS Raised Island Courtyard", FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_FIRST_ROOM] = ItemLocation::GSToken(0x03, 0x02, "Forest Temple GS First Room", FOREST_TEMPLE_GS_FIRST_ROOM, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = ItemLocation::GSToken(0x03, 0x04, "Forest Temple GS Level Island Courtyard", FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_LOBBY] = ItemLocation::GSToken(0x03, 0x08, "Forest Temple GS Lobby", FOREST_TEMPLE_GS_LOBBY, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_BASEMENT] = ItemLocation::GSToken(0x03, 0x10, "Forest Temple GS Basement", FOREST_TEMPLE_GS_BASEMENT, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, 0x03, 0x01, "Forest Temple GS Raised Island Courtyard", FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_GS_FIRST_ROOM] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_FIRST_ROOM, 0x03, 0x02, "Forest Temple GS First Room", FOREST_TEMPLE_GS_FIRST_ROOM, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, 0x03, 0x04, "Forest Temple GS Level Island Courtyard", FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_GS_LOBBY] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_LOBBY, 0x03, 0x08, "Forest Temple GS Lobby", FOREST_TEMPLE_GS_LOBBY, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_GS_BASEMENT] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_BASEMENT, 0x03, 0x10, "Forest Temple GS Basement", FOREST_TEMPLE_GS_BASEMENT, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = ItemLocation::GSToken(0x03, 0x02, "Forest Temple MQ GS First Hallway", FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = ItemLocation::GSToken(0x03, 0x10, "Forest Temple MQ GS Block Push Room", FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = ItemLocation::GSToken(0x03, 0x01, "Forest Temple MQ GS Raised Island Courtyard", FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = ItemLocation::GSToken(0x03, 0x04, "Forest Temple MQ GS Level Island Courtyard", FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_WELL] = ItemLocation::GSToken(0x03, 0x08, "Forest Temple MQ GS Well", FOREST_TEMPLE_MQ_GS_WELL, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, 0x03, 0x02, "Forest Temple MQ GS First Hallway", FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, 0x03, 0x10, "Forest Temple MQ GS Block Push Room", FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, 0x03, 0x01, "Forest Temple MQ GS Raised Island Courtyard", FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, 0x03, 0x04, "Forest Temple MQ GS Level Island Courtyard", FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FOREST_TEMPLE_MQ_GS_WELL] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_WELL, 0x03, 0x08, "Forest Temple MQ GS Well", FOREST_TEMPLE_MQ_GS_WELL, {Category::cForestTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = ItemLocation::GSToken(0x04, 0x01, "Fire Temple GS Song of Time Room", FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = ItemLocation::GSToken(0x04, 0x02, "Fire Temple GS Boss Key Loop", FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_BOULDER_MAZE] = ItemLocation::GSToken(0x04, 0x04, "Fire Temple GS Boulder Maze", FIRE_TEMPLE_GS_BOULDER_MAZE, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_SCARECROW_TOP] = ItemLocation::GSToken(0x04, 0x08, "Fire Temple GS Scarecrow Top", FIRE_TEMPLE_GS_SCARECROW_TOP, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_SCARECROW_CLIMB] = ItemLocation::GSToken(0x04, 0x10, "Fire Temple GS Scarecrow Climb", FIRE_TEMPLE_GS_SCARECROW_CLIMB, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, 0x04, 0x01, "Fire Temple GS Song of Time Room", FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, 0x04, 0x02, "Fire Temple GS Boss Key Loop", FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_GS_BOULDER_MAZE] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, 0x04, 0x04, "Fire Temple GS Boulder Maze", FIRE_TEMPLE_GS_BOULDER_MAZE, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_GS_SCARECROW_TOP] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, 0x04, 0x08, "Fire Temple GS Scarecrow Top", FIRE_TEMPLE_GS_SCARECROW_TOP, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_GS_SCARECROW_CLIMB] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, 0x04, 0x10, "Fire Temple GS Scarecrow Climb", FIRE_TEMPLE_GS_SCARECROW_CLIMB, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = ItemLocation::GSToken(0x04, 0x02, "Fire Temple MQ GS Above Fire Wall Maze", FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = ItemLocation::GSToken(0x04, 0x08, "Fire Temple MQ GS Fire Wall Maze Center", FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = ItemLocation::GSToken(0x04, 0x01, "Fire Temple MQ GS Big Lava Room Open Door", FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = ItemLocation::GSToken(0x04, 0x10, "Fire Temple MQ GS Fire Wall Maze Side Room", FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = ItemLocation::GSToken(0x04, 0x04, "Fire Temple MQ GS Skull on Fire", FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, 0x04, 0x02, "Fire Temple MQ GS Above Fire Wall Maze", FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, 0x04, 0x08, "Fire Temple MQ GS Fire Wall Maze Center", FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, 0x04, 0x01, "Fire Temple MQ GS Big Lava Room Open Door", FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, 0x04, 0x10, "Fire Temple MQ GS Fire Wall Maze Side Room", FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, 0x04, 0x04, "Fire Temple MQ GS Skull on Fire", FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {Category::cFireTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[WATER_TEMPLE_GS_BEHIND_GATE] = ItemLocation::GSToken(0x05, 0x01, "Water Temple GS Behind Gate", WATER_TEMPLE_GS_BEHIND_GATE, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = ItemLocation::GSToken(0x05, 0x02, "Water Temple GS Falling Platform Room", WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_CENTRAL_PILLAR] = ItemLocation::GSToken(0x05, 0x04, "Water Temple GS Central Pillar", WATER_TEMPLE_GS_CENTRAL_PILLAR, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = ItemLocation::GSToken(0x05, 0x08, "Water Temple GS Near Boss Key Chest", WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_RIVER] = ItemLocation::GSToken(0x05, 0x10, "Water Temple GS River", WATER_TEMPLE_GS_RIVER, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_GS_BEHIND_GATE] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_BEHIND_GATE, 0x05, 0x01, "Water Temple GS Behind Gate", WATER_TEMPLE_GS_BEHIND_GATE, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, 0x05, 0x02, "Water Temple GS Falling Platform Room", WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_GS_CENTRAL_PILLAR] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, 0x05, 0x04, "Water Temple GS Central Pillar", WATER_TEMPLE_GS_CENTRAL_PILLAR, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, 0x05, 0x08, "Water Temple GS Near Boss Key Chest", WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_GS_RIVER] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_RIVER, 0x05, 0x10, "Water Temple GS River", WATER_TEMPLE_GS_RIVER, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = ItemLocation::GSToken(0x05, 0x04, "Water Temple MQ GS Before Upper Water Switch", WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = ItemLocation::GSToken(0x05, 0x08, "Water Temple MQ GS Freestanding Key Area", WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = ItemLocation::GSToken(0x05, 0x01, "Water Temple MQ GS Lizalfos Hallway", WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_RIVER] = ItemLocation::GSToken(0x05, 0x02, "Water Temple MQ GS River", WATER_TEMPLE_MQ_GS_RIVER, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = ItemLocation::GSToken(0x05, 0x10, "Water Temple MQ GS Triple Wall Torch", WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, 0x05, 0x04, "Water Temple MQ GS Before Upper Water Switch", WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, 0x05, 0x08, "Water Temple MQ GS Freestanding Key Area", WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, 0x05, 0x01, "Water Temple MQ GS Lizalfos Hallway", WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_GS_RIVER] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_RIVER, 0x05, 0x02, "Water Temple MQ GS River", WATER_TEMPLE_MQ_GS_RIVER, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, 0x05, 0x10, "Water Temple MQ GS Triple Wall Torch", WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {Category::cWaterTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = ItemLocation::GSToken(0x06, 0x01, "Spirit Temple GS Hall After Sun Block Room", SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_BOULDER_ROOM] = ItemLocation::GSToken(0x06, 0x02, "Spirit Temple GS Boulder Room", SPIRIT_TEMPLE_GS_BOULDER_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_LOBBY] = ItemLocation::GSToken(0x06, 0x04, "Spirit Temple GS Lobby", SPIRIT_TEMPLE_GS_LOBBY, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = ItemLocation::GSToken(0x06, 0x08, "Spirit Temple GS Sun on Floor Room", SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_METAL_FENCE] = ItemLocation::GSToken(0x06, 0x10, "Spirit Temple GS Metal Fence", SPIRIT_TEMPLE_GS_METAL_FENCE, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, 0x06, 0x01, "Spirit Temple GS Hall After Sun Block Room", SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_GS_BOULDER_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, 0x06, 0x02, "Spirit Temple GS Boulder Room", SPIRIT_TEMPLE_GS_BOULDER_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_GS_LOBBY] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_LOBBY, 0x06, 0x04, "Spirit Temple GS Lobby", SPIRIT_TEMPLE_GS_LOBBY, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, 0x06, 0x08, "Spirit Temple GS Sun on Floor Room", SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_GS_METAL_FENCE] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, 0x06, 0x10, "Spirit Temple GS Metal Fence", SPIRIT_TEMPLE_GS_METAL_FENCE, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = ItemLocation::GSToken(0x06, 0x08, "Spirit Temple MQ GS Symphony Room", SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = ItemLocation::GSToken(0x06, 0x02, "Spirit Temple MQ GS Leever Room", SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = ItemLocation::GSToken(0x06, 0x04, "Spirit Temple MQ GS Nine Thrones Room West", SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = ItemLocation::GSToken(0x06, 0x10, "Spirit Temple MQ GS Nine Thrones Room North", SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = ItemLocation::GSToken(0x06, 0x01, "Spirit Temple MQ GS Sun Block Room", SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, 0x06, 0x08, "Spirit Temple MQ GS Symphony Room", SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, 0x06, 0x02, "Spirit Temple MQ GS Leever Room", SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, 0x06, 0x04, "Spirit Temple MQ GS Nine Thrones Room West", SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, 0x06, 0x10, "Spirit Temple MQ GS Nine Thrones Room North", SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, 0x06, 0x01, "Spirit Temple MQ GS Sun Block Room", SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {Category::cSpiritTemple, Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = ItemLocation::GSToken(0x07, 0x01, "Shadow Temple GS Single Giant Pot", SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = ItemLocation::GSToken(0x07, 0x02, "Shadow Temple GS Falling Spikes Room", SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = ItemLocation::GSToken(0x07, 0x04, "Shadow Temple GS Triple Giant Pot", SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = ItemLocation::GSToken(0x07, 0x08, "Shadow Temple GS Like Like Room", SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_NEAR_SHIP] = ItemLocation::GSToken(0x07, 0x10, "Shadow Temple GS Near Ship", SHADOW_TEMPLE_GS_NEAR_SHIP, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, 0x07, 0x01, "Shadow Temple GS Single Giant Pot", SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, 0x07, 0x02, "Shadow Temple GS Falling Spikes Room", SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, 0x07, 0x04, "Shadow Temple GS Triple Giant Pot", SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, 0x07, 0x08, "Shadow Temple GS Like Like Room", SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_GS_NEAR_SHIP] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, 0x07, 0x10, "Shadow Temple GS Near Ship", SHADOW_TEMPLE_GS_NEAR_SHIP, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = ItemLocation::GSToken(0x07, 0x02, "Shadow Temple MQ GS Falling Spikes Room", SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = ItemLocation::GSToken(0x07, 0x01, "Shadow Temple MQ GS Wind Hint Room", SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = ItemLocation::GSToken(0x07, 0x08, "Shadow Temple MQ GS After Wind", SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = ItemLocation::GSToken(0x07, 0x10, "Shadow Temple MQ GS After Ship", SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = ItemLocation::GSToken(0x07, 0x04, "Shadow Temple MQ GS Near Boss", SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, 0x07, 0x02, "Shadow Temple MQ GS Falling Spikes Room", SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, 0x07, 0x01, "Shadow Temple MQ GS Wind Hint Room", SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, 0x07, 0x08, "Shadow Temple MQ GS After Wind", SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, 0x07, 0x10, "Shadow Temple MQ GS After Ship", SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, 0x07, 0x04, "Shadow Temple MQ GS Near Boss", SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {Category::cShadowTemple, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = ItemLocation::GSToken(0x08, 0x01, "Bottom of the Well GS Like Like Cage", BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = ItemLocation::GSToken(0x08, 0x02, "Bottom of the Well GS East Inner Room", BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = ItemLocation::GSToken(0x08, 0x04, "Bottom of the Well GS West Inner Room", BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, 0x08, 0x01, "Bottom of the Well GS Like Like Cage", BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, 0x08, 0x02, "Bottom of the Well GS East Inner Room", BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, 0x08, 0x04, "Bottom of the Well GS West Inner Room", BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = ItemLocation::GSToken(0x08, 0x01, "Bottom of the Well MQ GS Basement", BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = ItemLocation::GSToken(0x08, 0x04, "Bottom of the Well MQ GS Coffin Room", BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = ItemLocation::GSToken(0x08, 0x02, "Bottom of the Well MQ GS West Inner Room", BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, 0x08, 0x01, "Bottom of the Well MQ GS Basement", BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, 0x08, 0x04, "Bottom of the Well MQ GS Coffin Room", BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, 0x08, 0x02, "Bottom of the Well MQ GS West Inner Room", BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {Category::cBottomOfTheWell, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = ItemLocation::GSToken(0x09, 0x01, "Ice Cavern GS Push Block Room", ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = ItemLocation::GSToken(0x09, 0x02, "Ice Cavern GS Spinning Scythe Room", ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_GS_HEART_PIECE_ROOM] = ItemLocation::GSToken(0x09, 0x04, "Ice Cavern GS Heart Piece Room", ICE_CAVERN_GS_HEART_PIECE_ROOM, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = ItemLocation::GSToken(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, 0x09, 0x01, "Ice Cavern GS Push Block Room", ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = ItemLocation::GSToken(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, 0x09, 0x02, "Ice Cavern GS Spinning Scythe Room", ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_GS_HEART_PIECE_ROOM] = ItemLocation::GSToken(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, 0x09, 0x04, "Ice Cavern GS Heart Piece Room", ICE_CAVERN_GS_HEART_PIECE_ROOM, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_GS_SCARECROW] = ItemLocation::GSToken(0x09, 0x01, "Ice Cavern MQ GS Scarecrow", ICE_CAVERN_MQ_GS_SCARECROW, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_GS_ICE_BLOCK] = ItemLocation::GSToken(0x09, 0x04, "Ice Cavern MQ GS Ice Block", ICE_CAVERN_MQ_GS_ICE_BLOCK, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_GS_RED_ICE] = ItemLocation::GSToken(0x09, 0x02, "Ice Cavern MQ GS Red Ice", ICE_CAVERN_MQ_GS_RED_ICE, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_GS_SCARECROW] = ItemLocation::GSToken(RC_ICE_CAVERN_MQ_GS_SCARECROW, 0x09, 0x01, "Ice Cavern MQ GS Scarecrow", ICE_CAVERN_MQ_GS_SCARECROW, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_GS_ICE_BLOCK] = ItemLocation::GSToken(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, 0x09, 0x04, "Ice Cavern MQ GS Ice Block", ICE_CAVERN_MQ_GS_ICE_BLOCK, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_GS_RED_ICE] = ItemLocation::GSToken(RC_ICE_CAVERN_MQ_GS_RED_ICE, 0x09, 0x02, "Ice Cavern MQ GS Red Ice", ICE_CAVERN_MQ_GS_RED_ICE, {Category::cIceCavern, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); //Overworld - locationTable[KF_GS_BEAN_PATCH] = ItemLocation::GSToken(0x0C, 0x01, "KF GS Bean Patch", KF_GS_BEAN_PATCH, {Category::cKokiriForest, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_GS_KNOW_IT_ALL_HOUSE] = ItemLocation::GSToken(0x0C, 0x02, "KF GS Know It All House", KF_GS_KNOW_IT_ALL_HOUSE, {Category::cKokiriForest, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_GS_HOUSE_OF_TWINS] = ItemLocation::GSToken(0x0C, 0x04, "KF GS House of Twins", KF_GS_HOUSE_OF_TWINS, {Category::cKokiriForest, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_KF_GS_BEAN_PATCH, 0x0C, 0x01, "KF GS Bean Patch", KF_GS_BEAN_PATCH, {Category::cKokiriForest, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_GS_KNOW_IT_ALL_HOUSE] = ItemLocation::GSToken(RC_KF_GS_KNOW_IT_ALL_HOUSE, 0x0C, 0x02, "KF GS Know It All House", KF_GS_KNOW_IT_ALL_HOUSE, {Category::cKokiriForest, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_GS_HOUSE_OF_TWINS] = ItemLocation::GSToken(RC_KF_GS_HOUSE_OF_TWINS, 0x0C, 0x04, "KF GS House of Twins", KF_GS_HOUSE_OF_TWINS, {Category::cKokiriForest, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[LW_GS_BEAN_PATCH_NEAR_BRIDGE] = ItemLocation::GSToken(0x0D, 0x01, "LW GS Bean Patch Near Bridge", LW_GS_BEAN_PATCH_NEAR_BRIDGE, {Category::cLostWoods, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_GS_BEAN_PATCH_NEAR_THEATER] = ItemLocation::GSToken(0x0D, 0x02, "LW GS Bean Patch Near Theater", LW_GS_BEAN_PATCH_NEAR_THEATER, {Category::cLostWoods, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_GS_ABOVE_THEATER] = ItemLocation::GSToken(0x0D, 0x04, "LW GS Above Theater", LW_GS_ABOVE_THEATER, {Category::cLostWoods, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SFM_GS] = ItemLocation::GSToken(0x0D, 0x08, "SFM GS", SFM_GS, {Category::cSacredForestMeadow, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_GS_BEAN_PATCH_NEAR_BRIDGE] = ItemLocation::GSToken(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, 0x0D, 0x01, "LW GS Bean Patch Near Bridge", LW_GS_BEAN_PATCH_NEAR_BRIDGE, {Category::cLostWoods, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_GS_BEAN_PATCH_NEAR_THEATER] = ItemLocation::GSToken(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, 0x0D, 0x02, "LW GS Bean Patch Near Theater", LW_GS_BEAN_PATCH_NEAR_THEATER, {Category::cLostWoods, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_GS_ABOVE_THEATER] = ItemLocation::GSToken(RC_LW_GS_ABOVE_THEATER, 0x0D, 0x04, "LW GS Above Theater", LW_GS_ABOVE_THEATER, {Category::cLostWoods, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[SFM_GS] = ItemLocation::GSToken(RC_SFM_GS, 0x0D, 0x08, "SFM GS", SFM_GS, {Category::cSacredForestMeadow, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[HF_GS_COW_GROTTO] = ItemLocation::GSToken(0x0A, 0x01, "HF GS Cow Grotto", HF_GS_COW_GROTTO, {Category::cHyruleField, Category::cSkulltula, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_GS_NEAR_KAK_GROTTO] = ItemLocation::GSToken(0x0A, 0x02, "HF GS Near Kak Grotto", HF_GS_NEAR_KAK_GROTTO, {Category::cHyruleField, Category::cSkulltula, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_GS_COW_GROTTO] = ItemLocation::GSToken(RC_HF_GS_COW_GROTTO, 0x0A, 0x01, "HF GS Cow Grotto", HF_GS_COW_GROTTO, {Category::cHyruleField, Category::cSkulltula, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[HF_GS_NEAR_KAK_GROTTO] = ItemLocation::GSToken(RC_HF_GS_NEAR_KAK_GROTTO, 0x0A, 0x02, "HF GS Near Kak Grotto", HF_GS_NEAR_KAK_GROTTO, {Category::cHyruleField, Category::cSkulltula, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[LH_GS_BEAN_PATCH] = ItemLocation::GSToken(0x12, 0x01, "LH GS Bean Patch", LH_GS_BEAN_PATCH, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_SMALL_ISLAND] = ItemLocation::GSToken(0x12, 0x02, "LH GS Small Island", LH_GS_SMALL_ISLAND, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_LAB_WALL] = ItemLocation::GSToken(0x12, 0x04, "LH GS Lab Wall", LH_GS_LAB_WALL, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_LAB_CRATE] = ItemLocation::GSToken(0x12, 0x08, "LH GS Lab Crate", LH_GS_LAB_CRATE, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_TREE] = ItemLocation::GSToken(0x12, 0x10, "LH GS Tree", LH_GS_TREE, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_LH_GS_BEAN_PATCH, 0x12, 0x01, "LH GS Bean Patch", LH_GS_BEAN_PATCH, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_GS_SMALL_ISLAND] = ItemLocation::GSToken(RC_LH_GS_SMALL_ISLAND, 0x12, 0x02, "LH GS Small Island", LH_GS_SMALL_ISLAND, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_GS_LAB_WALL] = ItemLocation::GSToken(RC_LH_GS_LAB_WALL, 0x12, 0x04, "LH GS Lab Wall", LH_GS_LAB_WALL, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_GS_LAB_CRATE] = ItemLocation::GSToken(RC_LH_GS_LAB_CRATE, 0x12, 0x08, "LH GS Lab Crate", LH_GS_LAB_CRATE, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_GS_TREE] = ItemLocation::GSToken(RC_LH_GS_TREE, 0x12, 0x10, "LH GS Tree", LH_GS_TREE, {Category::cLakeHylia, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[GV_GS_BEAN_PATCH] = ItemLocation::GSToken(0x13, 0x01, "GV GS Bean Patch", GV_GS_BEAN_PATCH, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_GS_SMALL_BRIDGE] = ItemLocation::GSToken(0x13, 0x02, "GV GS Small Bridge", GV_GS_SMALL_BRIDGE, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_GS_PILLAR] = ItemLocation::GSToken(0x13, 0x04, "GV GS Pillar", GV_GS_PILLAR, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_GS_BEHIND_TENT] = ItemLocation::GSToken(0x13, 0x08, "GV GS Behind Tent", GV_GS_BEHIND_TENT, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_GV_GS_BEAN_PATCH, 0x13, 0x01, "GV GS Bean Patch", GV_GS_BEAN_PATCH, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_GS_SMALL_BRIDGE] = ItemLocation::GSToken(RC_GV_GS_SMALL_BRIDGE, 0x13, 0x02, "GV GS Small Bridge", GV_GS_SMALL_BRIDGE, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_GS_PILLAR] = ItemLocation::GSToken(RC_GV_GS_PILLAR, 0x13, 0x04, "GV GS Pillar", GV_GS_PILLAR, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_GS_BEHIND_TENT] = ItemLocation::GSToken(RC_GV_GS_BEHIND_TENT, 0x13, 0x08, "GV GS Behind Tent", GV_GS_BEHIND_TENT, {Category::cGerudoValley, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_GS_ARCHERY_RANGE] = ItemLocation::GSToken(0x14, 0x01, "GF GS Archery Range", GF_GS_ARCHERY_RANGE, {Category::cGerudoFortress, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_GS_TOP_FLOOR] = ItemLocation::GSToken(0x14, 0x02, "GF GS Top Floor", GF_GS_TOP_FLOOR, {Category::cGerudoFortress, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_GS_ARCHERY_RANGE] = ItemLocation::GSToken(RC_GF_GS_ARCHERY_RANGE, 0x14, 0x01, "GF GS Archery Range", GF_GS_ARCHERY_RANGE, {Category::cGerudoFortress, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_GS_TOP_FLOOR] = ItemLocation::GSToken(RC_GF_GS_TOP_FLOOR, 0x14, 0x02, "GF GS Top Floor", GF_GS_TOP_FLOOR, {Category::cGerudoFortress, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[WASTELAND_GS] = ItemLocation::GSToken(0x15, 0x02, "Wasteland GS", WASTELAND_GS, {Category::cHauntedWasteland, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_GS_BEAN_PATCH] = ItemLocation::GSToken(0x15, 0x01, "Colossus GS Bean Patch", COLOSSUS_GS_BEAN_PATCH, {Category::cDesertColossus, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_GS_HILL] = ItemLocation::GSToken(0x15, 0x04, "Colossus GS Hill", COLOSSUS_GS_HILL, {Category::cDesertColossus, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_GS_TREE] = ItemLocation::GSToken(0x15, 0x08, "Colossus GS Tree", COLOSSUS_GS_TREE, {Category::cDesertColossus, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[WASTELAND_GS] = ItemLocation::GSToken(RC_WASTELAND_GS, 0x15, 0x02, "Wasteland GS", WASTELAND_GS, {Category::cHauntedWasteland, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[COLOSSUS_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_COLOSSUS_GS_BEAN_PATCH, 0x15, 0x01, "Colossus GS Bean Patch", COLOSSUS_GS_BEAN_PATCH, {Category::cDesertColossus, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[COLOSSUS_GS_HILL] = ItemLocation::GSToken(RC_COLOSSUS_GS_HILL, 0x15, 0x04, "Colossus GS Hill", COLOSSUS_GS_HILL, {Category::cDesertColossus, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[COLOSSUS_GS_TREE] = ItemLocation::GSToken(RC_COLOSSUS_GS_TREE, 0x15, 0x08, "Colossus GS Tree", COLOSSUS_GS_TREE, {Category::cDesertColossus, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[OGC_GS] = ItemLocation::GSToken(0x0E, 0x01, "OGC GS", OGC_GS, {Category::cOutsideGanonsCastle, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[HC_GS_STORMS_GROTTO] = ItemLocation::GSToken(0x0E, 0x02, "HC GS Storms Grotto", HC_GS_STORMS_GROTTO, {Category::cHyruleCastle, Category::cSkulltula, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[HC_GS_TREE] = ItemLocation::GSToken(0x0E, 0x04, "HC GS Tree", HC_GS_TREE, {Category::cHyruleCastle, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_GS_GUARD_HOUSE] = ItemLocation::GSToken(0x0E, 0x08, "Market GS Guard House", MARKET_GS_GUARD_HOUSE, {Category::cInnerMarket, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[OGC_GS] = ItemLocation::GSToken(RC_OGC_GS, 0x0E, 0x01, "OGC GS", OGC_GS, {Category::cOutsideGanonsCastle, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[HC_GS_STORMS_GROTTO] = ItemLocation::GSToken(RC_HC_GS_STORMS_GROTTO, 0x0E, 0x02, "HC GS Storms Grotto", HC_GS_STORMS_GROTTO, {Category::cHyruleCastle, Category::cSkulltula, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[HC_GS_TREE] = ItemLocation::GSToken(RC_HC_GS_TREE, 0x0E, 0x04, "HC GS Tree", HC_GS_TREE, {Category::cHyruleCastle, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_GS_GUARD_HOUSE] = ItemLocation::GSToken(RC_MARKET_GS_GUARD_HOUSE, 0x0E, 0x08, "Market GS Guard House", MARKET_GS_GUARD_HOUSE, {Category::cInnerMarket, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[KAK_GS_HOUSE_UNDER_CONSTRUCTION] = ItemLocation::GSToken(0x10, 0x08, "Kak GS House Under Construction", KAK_GS_HOUSE_UNDER_CONSTRUCTION, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_SKULLTULA_HOUSE] = ItemLocation::GSToken(0x10, 0x10, "Kak GS Skulltula House", KAK_GS_SKULLTULA_HOUSE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_GUARDS_HOUSE] = ItemLocation::GSToken(0x10, 0x02, "Kak GS Guards House", KAK_GS_GUARDS_HOUSE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_TREE] = ItemLocation::GSToken(0x10, 0x20, "Kak GS Tree", KAK_GS_TREE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_WATCHTOWER] = ItemLocation::GSToken(0x10, 0x04, "Kak GS Watchtower", KAK_GS_WATCHTOWER, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_ABOVE_IMPAS_HOUSE] = ItemLocation::GSToken(0x10, 0x40, "Kak GS Above Impas House", KAK_GS_ABOVE_IMPAS_HOUSE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_GS_HOUSE_UNDER_CONSTRUCTION] = ItemLocation::GSToken(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, 0x10, 0x08, "Kak GS House Under Construction", KAK_GS_HOUSE_UNDER_CONSTRUCTION, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_GS_SKULLTULA_HOUSE] = ItemLocation::GSToken(RC_KAK_GS_SKULLTULA_HOUSE, 0x10, 0x10, "Kak GS Skulltula House", KAK_GS_SKULLTULA_HOUSE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_GS_GUARDS_HOUSE] = ItemLocation::GSToken(RC_KAK_GS_GUARDS_HOUSE, 0x10, 0x02, "Kak GS Guards House", KAK_GS_GUARDS_HOUSE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_GS_TREE] = ItemLocation::GSToken(RC_KAK_GS_TREE, 0x10, 0x20, "Kak GS Tree", KAK_GS_TREE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_GS_WATCHTOWER] = ItemLocation::GSToken(RC_KAK_GS_WATCHTOWER, 0x10, 0x04, "Kak GS Watchtower", KAK_GS_WATCHTOWER, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_GS_ABOVE_IMPAS_HOUSE] = ItemLocation::GSToken(RC_KAK_GS_ABOVE_IMPAS_HOUSE, 0x10, 0x40, "Kak GS Above Impas House", KAK_GS_ABOVE_IMPAS_HOUSE, {Category::cKakarikoVillage, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_GS_WALL] = ItemLocation::GSToken(0x10, 0x80, "Graveyard GS Wall", GRAVEYARD_GS_WALL, {Category::cGraveyard, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_GS_BEAN_PATCH] = ItemLocation::GSToken(0x10, 0x01, "Graveyard GS Bean Patch", GRAVEYARD_GS_BEAN_PATCH, {Category::cGraveyard, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_GS_WALL] = ItemLocation::GSToken(RC_GRAVEYARD_GS_WALL, 0x10, 0x80, "Graveyard GS Wall", GRAVEYARD_GS_WALL, {Category::cGraveyard, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_GRAVEYARD_GS_BEAN_PATCH, 0x10, 0x01, "Graveyard GS Bean Patch", GRAVEYARD_GS_BEAN_PATCH, {Category::cGraveyard, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[DMC_GS_BEAN_PATCH] = ItemLocation::GSToken(0x0F, 0x01, "DMC GS Bean Patch", DMC_GS_BEAN_PATCH, {Category::cDeathMountainCrater, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_GS_CRATE] = ItemLocation::GSToken(0x0F, 0x80, "DMC GS Crate", DMC_GS_CRATE, {Category::cDeathMountainCrater, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_DMC_GS_BEAN_PATCH, 0x0F, 0x01, "DMC GS Bean Patch", DMC_GS_BEAN_PATCH, {Category::cDeathMountainCrater, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_GS_CRATE] = ItemLocation::GSToken(RC_DMC_GS_CRATE, 0x0F, 0x80, "DMC GS Crate", DMC_GS_CRATE, {Category::cDeathMountainCrater, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_GS_BEAN_PATCH] = ItemLocation::GSToken(0x0F, 0x02, "DMT GS Bean Patch", DMT_GS_BEAN_PATCH, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_GS_NEAR_KAK] = ItemLocation::GSToken(0x0F, 0x04, "DMT GS Near Kak", DMT_GS_NEAR_KAK, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_GS_ABOVE_DODONGOS_CAVERN] = ItemLocation::GSToken(0x0F, 0x08, "DMT GS Above Dodongos Cavern", DMT_GS_ABOVE_DODONGOS_CAVERN, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_GS_FALLING_ROCKS_PATH] = ItemLocation::GSToken(0x0F, 0x10, "DMT GS Falling Rocks Path", DMT_GS_FALLING_ROCKS_PATH, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_DMT_GS_BEAN_PATCH, 0x0F, 0x02, "DMT GS Bean Patch", DMT_GS_BEAN_PATCH, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_GS_NEAR_KAK] = ItemLocation::GSToken(RC_DMT_GS_NEAR_KAK, 0x0F, 0x04, "DMT GS Near Kak", DMT_GS_NEAR_KAK, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_GS_ABOVE_DODONGOS_CAVERN] = ItemLocation::GSToken(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, 0x0F, 0x08, "DMT GS Above Dodongos Cavern", DMT_GS_ABOVE_DODONGOS_CAVERN, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMT_GS_FALLING_ROCKS_PATH] = ItemLocation::GSToken(RC_DMT_GS_FALLING_ROCKS_PATH, 0x0F, 0x10, "DMT GS Falling Rocks Path", DMT_GS_FALLING_ROCKS_PATH, {Category::cDeathMountainTrail, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[GC_GS_CENTER_PLATFORM] = ItemLocation::GSToken(0x0F, 0x20, "GC GS Center Platform", GC_GS_CENTER_PLATFORM, {Category::cGoronCity, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_GS_BOULDER_MAZE] = ItemLocation::GSToken(0x0F, 0x40, "GC GS Boulder Maze", GC_GS_BOULDER_MAZE, {Category::cGoronCity, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_GS_CENTER_PLATFORM] = ItemLocation::GSToken(RC_GC_GS_CENTER_PLATFORM, 0x0F, 0x20, "GC GS Center Platform", GC_GS_CENTER_PLATFORM, {Category::cGoronCity, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_GS_BOULDER_MAZE] = ItemLocation::GSToken(RC_GC_GS_BOULDER_MAZE, 0x0F, 0x40, "GC GS Boulder Maze", GC_GS_BOULDER_MAZE, {Category::cGoronCity, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[ZR_GS_LADDER] = ItemLocation::GSToken(0x11, 0x01, "ZR GS Ladder", ZR_GS_LADDER, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_GS_TREE] = ItemLocation::GSToken(0x11, 0x02, "ZR GS Tree", ZR_GS_TREE, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_GS_ABOVE_BRIDGE] = ItemLocation::GSToken(0x11, 0x08, "ZR GS Above Bridge", ZR_GS_ABOVE_BRIDGE, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_GS_NEAR_RAISED_GROTTOS] = ItemLocation::GSToken(0x11, 0x10, "ZR GS Near Raised Grottos", ZR_GS_NEAR_RAISED_GROTTOS, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_GS_LADDER] = ItemLocation::GSToken(RC_ZR_GS_LADDER, 0x11, 0x01, "ZR GS Ladder", ZR_GS_LADDER, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_GS_TREE] = ItemLocation::GSToken(RC_ZR_GS_TREE, 0x11, 0x02, "ZR GS Tree", ZR_GS_TREE, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_GS_ABOVE_BRIDGE] = ItemLocation::GSToken(RC_ZR_GS_ABOVE_BRIDGE, 0x11, 0x08, "ZR GS Above Bridge", ZR_GS_ABOVE_BRIDGE, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_GS_NEAR_RAISED_GROTTOS] = ItemLocation::GSToken(RC_ZR_GS_NEAR_RAISED_GROTTOS, 0x11, 0x10, "ZR GS Near Raised Grottos", ZR_GS_NEAR_RAISED_GROTTOS, {Category::cZorasRiver, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZD_GS_FROZEN_WATERFALL] = ItemLocation::GSToken(0x11, 0x40, "ZD GS Frozen Waterfall", ZD_GS_FROZEN_WATERFALL, {Category::cZorasDomain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_GS_ABOVE_THE_LOG] = ItemLocation::GSToken(0x11, 0x04, "ZF GS Above The Log", ZF_GS_ABOVE_THE_LOG, {Category::cZorasFountain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_GS_HIDDEN_CAVE] = ItemLocation::GSToken(0x11, 0x20, "ZF GS Hidden Cave", ZF_GS_HIDDEN_CAVE, {Category::cZorasFountain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_GS_TREE] = ItemLocation::GSToken(0x11, 0x80, "ZF GS Tree", ZF_GS_TREE, {Category::cZorasFountain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_GS_FROZEN_WATERFALL] = ItemLocation::GSToken(RC_ZD_GS_FROZEN_WATERFALL, 0x11, 0x40, "ZD GS Frozen Waterfall", ZD_GS_FROZEN_WATERFALL, {Category::cZorasDomain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZF_GS_ABOVE_THE_LOG] = ItemLocation::GSToken(RC_ZF_GS_ABOVE_THE_LOG, 0x11, 0x04, "ZF GS Above The Log", ZF_GS_ABOVE_THE_LOG, {Category::cZorasFountain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZF_GS_HIDDEN_CAVE] = ItemLocation::GSToken(RC_ZF_GS_HIDDEN_CAVE, 0x11, 0x20, "ZF GS Hidden Cave", ZF_GS_HIDDEN_CAVE, {Category::cZorasFountain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZF_GS_TREE] = ItemLocation::GSToken(RC_ZF_GS_TREE, 0x11, 0x80, "ZF GS Tree", ZF_GS_TREE, {Category::cZorasFountain, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[LLR_GS_BACK_WALL] = ItemLocation::GSToken(0x0B, 0x01, "LLR GS Back Wall", LLR_GS_BACK_WALL, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_GS_RAIN_SHED] = ItemLocation::GSToken(0x0B, 0x02, "LLR GS Rain Shed", LLR_GS_RAIN_SHED, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_GS_HOUSE_WINDOW] = ItemLocation::GSToken(0x0B, 0x04, "LLR GS House Window", LLR_GS_HOUSE_WINDOW, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_GS_TREE] = ItemLocation::GSToken(0x0B, 0x08, "LLR GS Tree", LLR_GS_TREE, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_GS_BACK_WALL] = ItemLocation::GSToken(RC_LLR_GS_BACK_WALL, 0x0B, 0x01, "LLR GS Back Wall", LLR_GS_BACK_WALL, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_GS_RAIN_SHED] = ItemLocation::GSToken(RC_LLR_GS_RAIN_SHED, 0x0B, 0x02, "LLR GS Rain Shed", LLR_GS_RAIN_SHED, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_GS_HOUSE_WINDOW] = ItemLocation::GSToken(RC_LLR_GS_HOUSE_WINDOW, 0x0B, 0x04, "LLR GS House Window", LLR_GS_HOUSE_WINDOW, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_GS_TREE] = ItemLocation::GSToken(RC_LLR_GS_TREE, 0x0B, 0x08, "LLR GS Tree", LLR_GS_TREE, {Category::cLonLonRanch, Category::cSkulltula,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); /*------------------------------- --- BOSSES --- -------------------------------*/ - locationTable[LINKS_POCKET] = ItemLocation::Reward (0xFF, 0xFF, "Link's Pocket", LINKS_POCKET, LIGHT_MEDALLION, {}, SpoilerCollectionCheck::AlwaysCollected(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[QUEEN_GOHMA] = ItemLocation::Reward (0xFF, DUNGEON_DEKU_TREE, "Queen Gohma", QUEEN_GOHMA, KOKIRI_EMERALD, {}, SpoilerCollectionCheck::EventChkInf(0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[KING_DODONGO] = ItemLocation::Reward (0xFF, DUNGEON_DODONGOS_CAVERN, "King Dodongo", KING_DODONGO, GORON_RUBY, {}, SpoilerCollectionCheck::EventChkInf(0x25), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[BARINADE] = ItemLocation::Reward (0xFF, DUNGEON_JABUJABUS_BELLY, "Barinade", BARINADE, ZORA_SAPPHIRE, {}, SpoilerCollectionCheck::EventChkInf(0x37), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[PHANTOM_GANON] = ItemLocation::Reward (0xFF, DUNGEON_FOREST_TEMPLE, "Phantom Ganon", PHANTOM_GANON, FOREST_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x48), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[VOLVAGIA] = ItemLocation::Reward (0xFF, DUNGEON_FIRE_TEMPLE, "Volvagia", VOLVAGIA, FIRE_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x49), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[MORPHA] = ItemLocation::Reward (0xFF, DUNGEON_WATER_TEMPLE, "Morpha", MORPHA, WATER_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x4A), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[TWINROVA] = ItemLocation::Reward (0xFF, DUNGEON_SPIRIT_TEMPLE, "Twinrova", TWINROVA, SPIRIT_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x47), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[BONGO_BONGO] = ItemLocation::Reward (0xFF, DUNGEON_SHADOW_TEMPLE, "Bongo Bongo", BONGO_BONGO, SHADOW_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x46), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[GANON] = ItemLocation::Reward (0xFF, 0xF0, "Ganon", NONE, TRIFORCE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[LINKS_POCKET] = ItemLocation::Reward (RC_LINKS_POCKET, 0xFF, 0xFF, "Link's Pocket", LINKS_POCKET, LIGHT_MEDALLION, {}, SpoilerCollectionCheck::AlwaysCollected(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[QUEEN_GOHMA] = ItemLocation::Reward (RC_QUEEN_GOHMA, 0xFF, DUNGEON_DEKU_TREE, "Queen Gohma", QUEEN_GOHMA, KOKIRI_EMERALD, {}, SpoilerCollectionCheck::EventChkInf(0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[KING_DODONGO] = ItemLocation::Reward (RC_KING_DODONGO, 0xFF, DUNGEON_DODONGOS_CAVERN, "King Dodongo", KING_DODONGO, GORON_RUBY, {}, SpoilerCollectionCheck::EventChkInf(0x25), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[BARINADE] = ItemLocation::Reward (RC_BARINADE, 0xFF, DUNGEON_JABUJABUS_BELLY, "Barinade", BARINADE, ZORA_SAPPHIRE, {}, SpoilerCollectionCheck::EventChkInf(0x37), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[PHANTOM_GANON] = ItemLocation::Reward (RC_PHANTOM_GANON, 0xFF, DUNGEON_FOREST_TEMPLE, "Phantom Ganon", PHANTOM_GANON, FOREST_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x48), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[VOLVAGIA] = ItemLocation::Reward (RC_VOLVAGIA, 0xFF, DUNGEON_FIRE_TEMPLE, "Volvagia", VOLVAGIA, FIRE_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x49), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[MORPHA] = ItemLocation::Reward (RC_MORPHA, 0xFF, DUNGEON_WATER_TEMPLE, "Morpha", MORPHA, WATER_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x4A), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[TWINROVA] = ItemLocation::Reward (RC_TWINROVA, 0xFF, DUNGEON_SPIRIT_TEMPLE, "Twinrova", TWINROVA, SPIRIT_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x47), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[BONGO_BONGO] = ItemLocation::Reward (RC_BONGO_BONGO, 0xFF, DUNGEON_SHADOW_TEMPLE, "Bongo Bongo", BONGO_BONGO, SHADOW_MEDALLION, {}, SpoilerCollectionCheck::EventChkInf(0x46), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[GANON] = ItemLocation::Reward (RC_GANON, 0xFF, 0xF0, "Ganon", NONE, TRIFORCE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); /*------------------------------- ---HEART CONTAINERS --- -------------------------------*/ - locationTable[DEKU_TREE_QUEEN_GOHMA_HEART] = ItemLocation::Base (0x11, 0x4F, "Deku Tree Queen Gohma Heart Container", DEKU_TREE_QUEEN_GOHMA_HEART, HEART_CONTAINER, {Category::cDekuTree, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x11, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DODONGOS_CAVERN_KING_DODONGO_HEART] = ItemLocation::Base (0x12, 0x4F, "Dodongos Cavern King Dodongo Heart Container", DODONGOS_CAVERN_KING_DODONGO_HEART, HEART_CONTAINER, {Category::cDodongosCavern, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x12, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[JABU_JABUS_BELLY_BARINADE_HEART] = ItemLocation::Base (0x13, 0x4F, "Jabu Jabus Belly Barinade Heart Container", JABU_JABUS_BELLY_BARINADE_HEART, HEART_CONTAINER, {Category::cJabuJabusBelly, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x13, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[FOREST_TEMPLE_PHANTOM_GANON_HEART] = ItemLocation::Base (0x14, 0x4F, "Forest Temple Phantom Ganon Heart Container", FOREST_TEMPLE_PHANTOM_GANON_HEART, HEART_CONTAINER, {Category::cForestTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x14, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FIRE_TEMPLE_VOLVAGIA_HEART] = ItemLocation::Base (0x15, 0x4F, "Fire Temple Volvagia Heart Container", FIRE_TEMPLE_VOLVAGIA_HEART, HEART_CONTAINER, {Category::cFireTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x15, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[WATER_TEMPLE_MORPHA_HEART] = ItemLocation::Base (0x16, 0x4F, "Water Temple Morpha Heart Container", WATER_TEMPLE_MORPHA_HEART, HEART_CONTAINER, {Category::cWaterTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x16, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[SPIRIT_TEMPLE_TWINROVA_HEART] = ItemLocation::Base (0x17, 0x4F, "Spirit Temple Twinrova Heart Container", SPIRIT_TEMPLE_TWINROVA_HEART, HEART_CONTAINER, {Category::cSpiritTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x17, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SHADOW_TEMPLE_BONGO_BONGO_HEART] = ItemLocation::Base (0x18, 0x4F, "Shadow Temple Bongo Bongo Heart Container", SHADOW_TEMPLE_BONGO_BONGO_HEART, HEART_CONTAINER, {Category::cShadowTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x18, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[DEKU_TREE_QUEEN_GOHMA_HEART] = ItemLocation::Base (RC_DEKU_TREE_QUEEN_GOHMA_HEART, 0x11, 0x4F, "Deku Tree Queen Gohma Heart Container", DEKU_TREE_QUEEN_GOHMA_HEART, HEART_CONTAINER, {Category::cDekuTree, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x11, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DODONGOS_CAVERN_KING_DODONGO_HEART] = ItemLocation::Base (RC_DODONGOS_CAVERN_KING_DODONGO_HEART, 0x12, 0x4F, "Dodongos Cavern King Dodongo Heart Container", DODONGOS_CAVERN_KING_DODONGO_HEART, HEART_CONTAINER, {Category::cDodongosCavern, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x12, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[JABU_JABUS_BELLY_BARINADE_HEART] = ItemLocation::Base (RC_JABU_JABUS_BELLY_BARINADE_HEART, 0x13, 0x4F, "Jabu Jabus Belly Barinade Heart Container", JABU_JABUS_BELLY_BARINADE_HEART, HEART_CONTAINER, {Category::cJabuJabusBelly, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x13, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[FOREST_TEMPLE_PHANTOM_GANON_HEART] = ItemLocation::Base (RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, 0x14, 0x4F, "Forest Temple Phantom Ganon Heart Container", FOREST_TEMPLE_PHANTOM_GANON_HEART, HEART_CONTAINER, {Category::cForestTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x14, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[FIRE_TEMPLE_VOLVAGIA_HEART] = ItemLocation::Base (RC_FIRE_TEMPLE_VOLVAGIA_HEART, 0x15, 0x4F, "Fire Temple Volvagia Heart Container", FIRE_TEMPLE_VOLVAGIA_HEART, HEART_CONTAINER, {Category::cFireTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x15, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[WATER_TEMPLE_MORPHA_HEART] = ItemLocation::Base (RC_WATER_TEMPLE_MORPHA_HEART, 0x16, 0x4F, "Water Temple Morpha Heart Container", WATER_TEMPLE_MORPHA_HEART, HEART_CONTAINER, {Category::cWaterTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x16, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[SPIRIT_TEMPLE_TWINROVA_HEART] = ItemLocation::Base (RC_SPIRIT_TEMPLE_TWINROVA_HEART, 0x17, 0x4F, "Spirit Temple Twinrova Heart Container", SPIRIT_TEMPLE_TWINROVA_HEART, HEART_CONTAINER, {Category::cSpiritTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x17, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[SHADOW_TEMPLE_BONGO_BONGO_HEART] = ItemLocation::Base (RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, 0x18, 0x4F, "Shadow Temple Bongo Bongo Heart Container", SHADOW_TEMPLE_BONGO_BONGO_HEART, HEART_CONTAINER, {Category::cShadowTemple, Category::cBossHeart, Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x18, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); /*------------------------------- --- CUTSCENES --- -------------------------------*/ - locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(0xFF, 0x01, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::EventChkInf(0xC4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(0xFF, 0x02, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {Category::cLostWoods, Category::cForest}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x10, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {Category::cZorasFountain, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(16), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[HC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x11, "HC Great Fairy Reward", HC_GREAT_FAIRY_REWARD, DINS_FIRE, {Category::cHyruleCastle, Category::cMarket, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[COLOSSUS_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x12, "Colossus Great Fairy Reward", COLOSSUS_GREAT_FAIRY_REWARD, NAYRUS_LOVE, {Category::cDesertColossus, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[DMT_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x13, "DMT Great Fairy Reward", DMT_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x00), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x14, "DMC Great Fairy Reward", DMC_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[OGC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x15, "OGC Great Fairy Reward", OGC_GREAT_FAIRY_REWARD, DOUBLE_DEFENSE, {Category::cOutsideGanonsCastle, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(RC_TOT_LIGHT_ARROWS_CUTSCENE, 0xFF, 0x01, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::EventChkInf(0xC4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(RC_LW_GIFT_FROM_SARIA, 0xFF, 0x02, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {Category::cLostWoods, Category::cForest}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_ZF_GREAT_FAIRY_REWARD, 0xFF, 0x10, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {Category::cZorasFountain, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(16), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[HC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_HC_GREAT_FAIRY_REWARD, 0xFF, 0x11, "HC Great Fairy Reward", HC_GREAT_FAIRY_REWARD, DINS_FIRE, {Category::cHyruleCastle, Category::cMarket, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[COLOSSUS_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_COLOSSUS_GREAT_FAIRY_REWARD, 0xFF, 0x12, "Colossus Great Fairy Reward", COLOSSUS_GREAT_FAIRY_REWARD, NAYRUS_LOVE, {Category::cDesertColossus, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[DMT_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_DMT_GREAT_FAIRY_REWARD, 0xFF, 0x13, "DMT Great Fairy Reward", DMT_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x00), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[DMC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_DMC_GREAT_FAIRY_REWARD, 0xFF, 0x14, "DMC Great Fairy Reward", DMC_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[OGC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_OGC_GREAT_FAIRY_REWARD, 0xFF, 0x15, "OGC Great Fairy Reward", OGC_GREAT_FAIRY_REWARD, DOUBLE_DEFENSE, {Category::cOutsideGanonsCastle, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[SHEIK_IN_FOREST] = ItemLocation::Delayed(0xFF, 0x20, "Sheik in Forest", SHEIK_IN_FOREST, MINUET_OF_FOREST, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SHEIK_IN_CRATER] = ItemLocation::Delayed(0xFF, 0x21, "Sheik in Crater", SHEIK_IN_CRATER, BOLERO_OF_FIRE, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[SHEIK_IN_ICE_CAVERN] = ItemLocation::Delayed(0xFF, 0x22, "Sheik in Ice Cavern", SHEIK_IN_ICE_CAVERN, SERENADE_OF_WATER, {Category::cIceCavern, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[SHEIK_AT_COLOSSUS] = ItemLocation::Delayed(0xFF, 0x23, "Sheik at Colossus", SHEIK_AT_COLOSSUS, REQUIEM_OF_SPIRIT, {Category::cDesertColossus, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[SHEIK_IN_KAKARIKO] = ItemLocation::Delayed(0xFF, 0x24, "Sheik in Kakariko", SHEIK_IN_KAKARIKO, NOCTURNE_OF_SHADOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[SHEIK_AT_TEMPLE] = ItemLocation::Delayed(0xFF, 0x25, "Sheik at Temple", SHEIK_AT_TEMPLE, PRELUDE_OF_LIGHT, {Category::cTempleOfTime, Category::cMarket, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x55), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[SONG_FROM_IMPA] = ItemLocation::Delayed(0xFF, 0x26, "Song from Impa", SONG_FROM_IMPA, ZELDAS_LULLABY, {Category::cHyruleCastle, Category::cMarket, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[SONG_FROM_MALON] = ItemLocation::Delayed(0xFF, 0x27, "Song from Malon", SONG_FROM_MALON, EPONAS_SONG, {Category::cLonLonRanch, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x58), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[SONG_FROM_SARIA] = ItemLocation::Delayed(0xFF, 0x28, "Song from Saria", SONG_FROM_SARIA, SARIAS_SONG, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x57), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SONG_FROM_COMPOSERS_GRAVE] = ItemLocation::Delayed(0xFF, 0x29, "Song from Composers Grave", SONG_FROM_COMPOSERS_GRAVE, SUNS_SONG, {Category::cGraveyard, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5A), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[SONG_FROM_OCARINA_OF_TIME] = ItemLocation::Delayed(0xFF, 0x2A, "Song from Ocarina of Time", SONG_FROM_OCARINA_OF_TIME, SONG_OF_TIME, {Category::cHyruleField, Category::cSong, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0xA9), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[SONG_FROM_WINDMILL] = ItemLocation::Delayed(0xFF, 0x2B, "Song from Windmill", SONG_FROM_WINDMILL, SONG_OF_STORMS, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[SHEIK_IN_FOREST] = ItemLocation::Delayed(RC_SHEIK_IN_FOREST, 0xFF, 0x20, "Sheik in Forest", SHEIK_IN_FOREST, MINUET_OF_FOREST, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[SHEIK_IN_CRATER] = ItemLocation::Delayed(RC_SHEIK_IN_CRATER, 0xFF, 0x21, "Sheik in Crater", SHEIK_IN_CRATER, BOLERO_OF_FIRE, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[SHEIK_IN_ICE_CAVERN] = ItemLocation::Delayed(RC_SHEIK_IN_ICE_CAVERN, 0xFF, 0x22, "Sheik in Ice Cavern", SHEIK_IN_ICE_CAVERN, SERENADE_OF_WATER, {Category::cIceCavern, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[SHEIK_AT_COLOSSUS] = ItemLocation::Delayed(RC_SHEIK_AT_COLOSSUS, 0xFF, 0x23, "Sheik at Colossus", SHEIK_AT_COLOSSUS, REQUIEM_OF_SPIRIT, {Category::cDesertColossus, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[SHEIK_IN_KAKARIKO] = ItemLocation::Delayed(RC_SHEIK_IN_KAKARIKO, 0xFF, 0x24, "Sheik in Kakariko", SHEIK_IN_KAKARIKO, NOCTURNE_OF_SHADOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[SHEIK_AT_TEMPLE] = ItemLocation::Delayed(RC_SHEIK_AT_TEMPLE, 0xFF, 0x25, "Sheik at Temple", SHEIK_AT_TEMPLE, PRELUDE_OF_LIGHT, {Category::cTempleOfTime, Category::cMarket, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x55), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[SONG_FROM_IMPA] = ItemLocation::Delayed(RC_SONG_FROM_IMPA, 0xFF, 0x26, "Song from Impa", SONG_FROM_IMPA, ZELDAS_LULLABY, {Category::cHyruleCastle, Category::cMarket, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[SONG_FROM_MALON] = ItemLocation::Delayed(RC_SONG_FROM_MALON, 0xFF, 0x27, "Song from Malon", SONG_FROM_MALON, EPONAS_SONG, {Category::cLonLonRanch, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x58), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[SONG_FROM_SARIA] = ItemLocation::Delayed(RC_SONG_FROM_SARIA, 0xFF, 0x28, "Song from Saria", SONG_FROM_SARIA, SARIAS_SONG, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x57), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[SONG_FROM_COMPOSERS_GRAVE] = ItemLocation::Delayed(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, 0xFF, 0x29, "Song from Composers Grave", SONG_FROM_COMPOSERS_GRAVE, SUNS_SONG, {Category::cGraveyard, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5A), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[SONG_FROM_OCARINA_OF_TIME] = ItemLocation::Delayed(RC_SONG_FROM_OCARINA_OF_TIME, 0xFF, 0x2A, "Song from Ocarina of Time", SONG_FROM_OCARINA_OF_TIME, SONG_OF_TIME, {Category::cHyruleField, Category::cSong, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0xA9), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[SONG_FROM_WINDMILL] = ItemLocation::Delayed(RC_SONG_FROM_WINDMILL, 0xFF, 0x2B, "Song from Windmill", SONG_FROM_WINDMILL, SONG_OF_STORMS, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); /*------------------------------- --- COWS --- -------------------------------*/ - locationTable[KF_LINKS_HOUSE_COW] = ItemLocation::Base (0x34, 0x15, "KF Links House Cow", KF_LINKS_HOUSE_COW, MILK, {Category::cForest, Category::cCow, Category::cMinigame}, SpoilerCollectionCheck::Cow(0x34, 0x15), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[HF_COW_GROTTO_COW] = ItemLocation::Base (0x3E, 0x16, "HF Cow Grotto Cow", HF_COW_GROTTO_COW, MILK, {Category::cHyruleField, Category::cCow, Category::cGrotto}, SpoilerCollectionCheck::Cow(0x3E, 0x16), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[LLR_STABLES_LEFT_COW] = ItemLocation::Base (0x36, 0x16, "LLR Stables Left Cow", LLR_STABLES_LEFT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x36, 0x16), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_STABLES_RIGHT_COW] = ItemLocation::Base (0x36, 0x15, "LLR Stables Right Cow", LLR_STABLES_RIGHT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x36, 0x15), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_TOWER_LEFT_COW] = ItemLocation::Base (0x4C, 0x15, "LLR Tower Left Cow", LLR_TOWER_LEFT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x4C, 0x16), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_TOWER_RIGHT_COW] = ItemLocation::Base (0x4C, 0x16, "LLR Tower Right Cow", LLR_TOWER_RIGHT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x4C, 0x15), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[KAK_IMPAS_HOUSE_COW] = ItemLocation::Base (0x37, 0x15, "Kak Impas House Cow", KAK_IMPAS_HOUSE_COW, MILK, {Category::cKakarikoVillage, Category::cKakariko, Category::cCow}, SpoilerCollectionCheck::Cow(0x37, 0x15), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[DMT_COW_GROTTO_COW] = ItemLocation::Base (0x3E, 0x15, "DMT Cow Grotto Cow", DMT_COW_GROTTO_COW, MILK, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cCow, Category::cGrotto}, SpoilerCollectionCheck::Cow(0x3E, 0x15), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[GV_COW] = ItemLocation::Base (0x5A, 0x15, "GV Cow", GV_COW, MILK, {Category::cGerudoValley, Category::cGerudo, Category::cCow}, SpoilerCollectionCheck::Cow(0x5A, 0x15), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[JABU_JABUS_BELLY_MQ_COW] = ItemLocation::Base (0x02, 0x15, "Jabu Jabus Belly MQ Cow", JABU_JABUS_BELLY_MQ_COW, MILK, {Category::cJabuJabusBelly, Category::cCow}, SpoilerCollectionCheck::Cow(0x02, 0x15), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[KF_LINKS_HOUSE_COW] = ItemLocation::Base (RC_KF_LINKS_HOUSE_COW, 0x34, 0x15, "KF Links House Cow", KF_LINKS_HOUSE_COW, MILK, {Category::cForest, Category::cCow, Category::cMinigame}, SpoilerCollectionCheck::Cow(0x34, 0x15), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[HF_COW_GROTTO_COW] = ItemLocation::Base (RC_HF_COW_GROTTO_COW, 0x3E, 0x16, "HF Cow Grotto Cow", HF_COW_GROTTO_COW, MILK, {Category::cHyruleField, Category::cCow, Category::cGrotto}, SpoilerCollectionCheck::Cow(0x3E, 0x16), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[LLR_STABLES_LEFT_COW] = ItemLocation::Base (RC_LLR_STABLES_LEFT_COW, 0x36, 0x16, "LLR Stables Left Cow", LLR_STABLES_LEFT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x36, 0x16), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_STABLES_RIGHT_COW] = ItemLocation::Base (RC_LLR_STABLES_RIGHT_COW, 0x36, 0x15, "LLR Stables Right Cow", LLR_STABLES_RIGHT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x36, 0x15), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_TOWER_LEFT_COW] = ItemLocation::Base (RC_LLR_TOWER_LEFT_COW, 0x4C, 0x15, "LLR Tower Left Cow", LLR_TOWER_LEFT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x4C, 0x16), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_TOWER_RIGHT_COW] = ItemLocation::Base (RC_LLR_TOWER_RIGHT_COW, 0x4C, 0x16, "LLR Tower Right Cow", LLR_TOWER_RIGHT_COW, MILK, {Category::cLonLonRanch, Category::cCow}, SpoilerCollectionCheck::Cow(0x4C, 0x15), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[KAK_IMPAS_HOUSE_COW] = ItemLocation::Base (RC_KAK_IMPAS_HOUSE_COW, 0x37, 0x15, "Kak Impas House Cow", KAK_IMPAS_HOUSE_COW, MILK, {Category::cKakarikoVillage, Category::cKakariko, Category::cCow}, SpoilerCollectionCheck::Cow(0x37, 0x15), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[DMT_COW_GROTTO_COW] = ItemLocation::Base (RC_DMT_COW_GROTTO_COW, 0x3E, 0x15, "DMT Cow Grotto Cow", DMT_COW_GROTTO_COW, MILK, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cCow, Category::cGrotto}, SpoilerCollectionCheck::Cow(0x3E, 0x15), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[GV_COW] = ItemLocation::Base (RC_GV_COW, 0x5A, 0x15, "GV Cow", GV_COW, MILK, {Category::cGerudoValley, Category::cGerudo, Category::cCow}, SpoilerCollectionCheck::Cow(0x5A, 0x15), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[JABU_JABUS_BELLY_MQ_COW] = ItemLocation::Base (RC_JABU_JABUS_BELLY_MQ_COW, 0x02, 0x15, "Jabu Jabus Belly MQ Cow", JABU_JABUS_BELLY_MQ_COW, MILK, {Category::cJabuJabusBelly, Category::cCow}, SpoilerCollectionCheck::Cow(0x02, 0x15), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); /*------------------------------- --- SHOPS --- @@ -796,126 +797,126 @@ void LocationTable_Init() { 7 5 1 3 -------------------------------*/ - locationTable[KF_SHOP_ITEM_1] = ItemLocation::Base(0x2D, 0x30, "KF Shop Item 1", KF_SHOP_ITEM_1, BUY_DEKU_SHIELD, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 0), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_2] = ItemLocation::Base(0x2D, 0x31, "KF Shop Item 2", KF_SHOP_ITEM_2, BUY_DEKU_NUT_5, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 1), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_3] = ItemLocation::Base(0x2D, 0x32, "KF Shop Item 3", KF_SHOP_ITEM_3, BUY_DEKU_NUT_10, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 2), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_4] = ItemLocation::Base(0x2D, 0x33, "KF Shop Item 4", KF_SHOP_ITEM_4, BUY_DEKU_STICK_1, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 3), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_5] = ItemLocation::Base(0x2D, 0x34, "KF Shop Item 5", KF_SHOP_ITEM_5, BUY_DEKU_SEEDS_30, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 4), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_6] = ItemLocation::Base(0x2D, 0x35, "KF Shop Item 6", KF_SHOP_ITEM_6, BUY_ARROWS_10, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 5), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_7] = ItemLocation::Base(0x2D, 0x36, "KF Shop Item 7", KF_SHOP_ITEM_7, BUY_ARROWS_30, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 6), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_8] = ItemLocation::Base(0x2D, 0x37, "KF Shop Item 8", KF_SHOP_ITEM_8, BUY_HEART, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 7), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_1] = ItemLocation::Base(RC_KF_SHOP_ITEM_1, 0x2D, 0x30, "KF Shop Item 1", KF_SHOP_ITEM_1, BUY_DEKU_SHIELD, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 0), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_2] = ItemLocation::Base(RC_KF_SHOP_ITEM_2, 0x2D, 0x31, "KF Shop Item 2", KF_SHOP_ITEM_2, BUY_DEKU_NUT_5, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 1), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_3] = ItemLocation::Base(RC_KF_SHOP_ITEM_3, 0x2D, 0x32, "KF Shop Item 3", KF_SHOP_ITEM_3, BUY_DEKU_NUT_10, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 2), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_4] = ItemLocation::Base(RC_KF_SHOP_ITEM_4, 0x2D, 0x33, "KF Shop Item 4", KF_SHOP_ITEM_4, BUY_DEKU_STICK_1, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 3), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_5] = ItemLocation::Base(RC_KF_SHOP_ITEM_5, 0x2D, 0x34, "KF Shop Item 5", KF_SHOP_ITEM_5, BUY_DEKU_SEEDS_30, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 4), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_6] = ItemLocation::Base(RC_KF_SHOP_ITEM_6, 0x2D, 0x35, "KF Shop Item 6", KF_SHOP_ITEM_6, BUY_ARROWS_10, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 5), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_7] = ItemLocation::Base(RC_KF_SHOP_ITEM_7, 0x2D, 0x36, "KF Shop Item 7", KF_SHOP_ITEM_7, BUY_ARROWS_30, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 6), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_SHOP_ITEM_8] = ItemLocation::Base(RC_KF_SHOP_ITEM_8, 0x2D, 0x37, "KF Shop Item 8", KF_SHOP_ITEM_8, BUY_HEART, {Category::cKokiriForest, Category::cForest, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2D, 7), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KAK_POTION_SHOP_ITEM_1] = ItemLocation::Base(0x30, 0x30, "Kak Potion Shop Item 1", KAK_POTION_SHOP_ITEM_1, BUY_DEKU_NUT_5, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 0), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_2] = ItemLocation::Base(0x30, 0x31, "Kak Potion Shop Item 2", KAK_POTION_SHOP_ITEM_2, BUY_FISH, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_3] = ItemLocation::Base(0x30, 0x32, "Kak Potion Shop Item 3", KAK_POTION_SHOP_ITEM_3, BUY_RED_POTION_30, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_4] = ItemLocation::Base(0x30, 0x33, "Kak Potion Shop Item 4", KAK_POTION_SHOP_ITEM_4, BUY_GREEN_POTION, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_5] = ItemLocation::Base(0x30, 0x34, "Kak Potion Shop Item 5", KAK_POTION_SHOP_ITEM_5, BUY_BLUE_FIRE, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_6] = ItemLocation::Base(0x30, 0x35, "Kak Potion Shop Item 6", KAK_POTION_SHOP_ITEM_6, BUY_BOTTLE_BUG, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_7] = ItemLocation::Base(0x30, 0x36, "Kak Potion Shop Item 7", KAK_POTION_SHOP_ITEM_7, BUY_POE, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_8] = ItemLocation::Base(0x30, 0x37, "Kak Potion Shop Item 8", KAK_POTION_SHOP_ITEM_8, BUY_FAIRYS_SPIRIT, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_1] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_1, 0x30, 0x30, "Kak Potion Shop Item 1", KAK_POTION_SHOP_ITEM_1, BUY_DEKU_NUT_5, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 0), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_2] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_2, 0x30, 0x31, "Kak Potion Shop Item 2", KAK_POTION_SHOP_ITEM_2, BUY_FISH, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_3] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_3, 0x30, 0x32, "Kak Potion Shop Item 3", KAK_POTION_SHOP_ITEM_3, BUY_RED_POTION_30, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_4] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_4, 0x30, 0x33, "Kak Potion Shop Item 4", KAK_POTION_SHOP_ITEM_4, BUY_GREEN_POTION, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_5] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_5, 0x30, 0x34, "Kak Potion Shop Item 5", KAK_POTION_SHOP_ITEM_5, BUY_BLUE_FIRE, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_6] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_6, 0x30, 0x35, "Kak Potion Shop Item 6", KAK_POTION_SHOP_ITEM_6, BUY_BOTTLE_BUG, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_7] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_7, 0x30, 0x36, "Kak Potion Shop Item 7", KAK_POTION_SHOP_ITEM_7, BUY_POE, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_POTION_SHOP_ITEM_8] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_8, 0x30, 0x37, "Kak Potion Shop Item 8", KAK_POTION_SHOP_ITEM_8, BUY_FAIRYS_SPIRIT, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x30, 7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_1] = ItemLocation::Base(0x32, 0x30, "MK Bombchu Shop Item 1", MARKET_BOMBCHU_SHOP_ITEM_1, BUY_BOMBCHU_5, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_2] = ItemLocation::Base(0x32, 0x31, "MK Bombchu Shop Item 2", MARKET_BOMBCHU_SHOP_ITEM_2, BUY_BOMBCHU_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_3] = ItemLocation::Base(0x32, 0x32, "MK Bombchu Shop Item 3", MARKET_BOMBCHU_SHOP_ITEM_3, BUY_BOMBCHU_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_4] = ItemLocation::Base(0x32, 0x33, "MK Bombchu Shop Item 4", MARKET_BOMBCHU_SHOP_ITEM_4, BUY_BOMBCHU_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_5] = ItemLocation::Base(0x32, 0x34, "MK Bombchu Shop Item 5", MARKET_BOMBCHU_SHOP_ITEM_5, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_6] = ItemLocation::Base(0x32, 0x35, "MK Bombchu Shop Item 6", MARKET_BOMBCHU_SHOP_ITEM_6, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_7] = ItemLocation::Base(0x32, 0x36, "MK Bombchu Shop Item 7", MARKET_BOMBCHU_SHOP_ITEM_7, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_8] = ItemLocation::Base(0x32, 0x37, "MK Bombchu Shop Item 8", MARKET_BOMBCHU_SHOP_ITEM_8, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_1] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_1, 0x32, 0x30, "MK Bombchu Shop Item 1", MARKET_BOMBCHU_SHOP_ITEM_1, BUY_BOMBCHU_5, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_2] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_2, 0x32, 0x31, "MK Bombchu Shop Item 2", MARKET_BOMBCHU_SHOP_ITEM_2, BUY_BOMBCHU_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_3] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_3, 0x32, 0x32, "MK Bombchu Shop Item 3", MARKET_BOMBCHU_SHOP_ITEM_3, BUY_BOMBCHU_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_4] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_4, 0x32, 0x33, "MK Bombchu Shop Item 4", MARKET_BOMBCHU_SHOP_ITEM_4, BUY_BOMBCHU_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_5] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_5, 0x32, 0x34, "MK Bombchu Shop Item 5", MARKET_BOMBCHU_SHOP_ITEM_5, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_6] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_6, 0x32, 0x35, "MK Bombchu Shop Item 6", MARKET_BOMBCHU_SHOP_ITEM_6, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_7] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_7, 0x32, 0x36, "MK Bombchu Shop Item 7", MARKET_BOMBCHU_SHOP_ITEM_7, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_SHOP_ITEM_8] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_8, 0x32, 0x37, "MK Bombchu Shop Item 8", MARKET_BOMBCHU_SHOP_ITEM_8, BUY_BOMBCHU_20, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x32, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_1] = ItemLocation::Base(0x31, 0x30, "MK Potion Shop Item 1", MARKET_POTION_SHOP_ITEM_1, BUY_GREEN_POTION, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_2] = ItemLocation::Base(0x31, 0x31, "MK Potion Shop Item 2", MARKET_POTION_SHOP_ITEM_2, BUY_BLUE_FIRE, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_3] = ItemLocation::Base(0x31, 0x32, "MK Potion Shop Item 3", MARKET_POTION_SHOP_ITEM_3, BUY_RED_POTION_30, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_4] = ItemLocation::Base(0x31, 0x33, "MK Potion Shop Item 4", MARKET_POTION_SHOP_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_5] = ItemLocation::Base(0x31, 0x34, "MK Potion Shop Item 5", MARKET_POTION_SHOP_ITEM_5, BUY_DEKU_NUT_5, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_6] = ItemLocation::Base(0x31, 0x35, "MK Potion Shop Item 6", MARKET_POTION_SHOP_ITEM_6, BUY_BOTTLE_BUG, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_7] = ItemLocation::Base(0x31, 0x36, "MK Potion Shop Item 7", MARKET_POTION_SHOP_ITEM_7, BUY_POE, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_8] = ItemLocation::Base(0x31, 0x37, "MK Potion Shop Item 8", MARKET_POTION_SHOP_ITEM_8, BUY_FISH, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_1] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_1, 0x31, 0x30, "MK Potion Shop Item 1", MARKET_POTION_SHOP_ITEM_1, BUY_GREEN_POTION, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_2] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_2, 0x31, 0x31, "MK Potion Shop Item 2", MARKET_POTION_SHOP_ITEM_2, BUY_BLUE_FIRE, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_3] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_3, 0x31, 0x32, "MK Potion Shop Item 3", MARKET_POTION_SHOP_ITEM_3, BUY_RED_POTION_30, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_4] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_4, 0x31, 0x33, "MK Potion Shop Item 4", MARKET_POTION_SHOP_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_5] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_5, 0x31, 0x34, "MK Potion Shop Item 5", MARKET_POTION_SHOP_ITEM_5, BUY_DEKU_NUT_5, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_6] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_6, 0x31, 0x35, "MK Potion Shop Item 6", MARKET_POTION_SHOP_ITEM_6, BUY_BOTTLE_BUG, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_7] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_7, 0x31, 0x36, "MK Potion Shop Item 7", MARKET_POTION_SHOP_ITEM_7, BUY_POE, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_POTION_SHOP_ITEM_8] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_8, 0x31, 0x37, "MK Potion Shop Item 8", MARKET_POTION_SHOP_ITEM_8, BUY_FISH, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x31, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_1] = ItemLocation::Base(0x2C, 0x30, "MK Bazaar Item 1", MARKET_BAZAAR_ITEM_1, BUY_HYLIAN_SHIELD, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_2] = ItemLocation::Base(0x2C, 0x31, "MK Bazaar Item 2", MARKET_BAZAAR_ITEM_2, BUY_BOMBS_535, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_3] = ItemLocation::Base(0x2C, 0x32, "MK Bazaar Item 3", MARKET_BAZAAR_ITEM_3, BUY_DEKU_NUT_5, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_4] = ItemLocation::Base(0x2C, 0x33, "MK Bazaar Item 4", MARKET_BAZAAR_ITEM_4, BUY_HEART, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_5] = ItemLocation::Base(0x2C, 0x34, "MK Bazaar Item 5", MARKET_BAZAAR_ITEM_5, BUY_ARROWS_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_6] = ItemLocation::Base(0x2C, 0x35, "MK Bazaar Item 6", MARKET_BAZAAR_ITEM_6, BUY_ARROWS_50, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_7] = ItemLocation::Base(0x2C, 0x36, "MK Bazaar Item 7", MARKET_BAZAAR_ITEM_7, BUY_DEKU_STICK_1, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_8] = ItemLocation::Base(0x2C, 0x37, "MK Bazaar Item 8", MARKET_BAZAAR_ITEM_8, BUY_ARROWS_30, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_1] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_1, 0x2C, 0x30, "MK Bazaar Item 1", MARKET_BAZAAR_ITEM_1, BUY_HYLIAN_SHIELD, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_2] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_2, 0x2C, 0x31, "MK Bazaar Item 2", MARKET_BAZAAR_ITEM_2, BUY_BOMBS_535, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_3] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_3, 0x2C, 0x32, "MK Bazaar Item 3", MARKET_BAZAAR_ITEM_3, BUY_DEKU_NUT_5, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_4] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_4, 0x2C, 0x33, "MK Bazaar Item 4", MARKET_BAZAAR_ITEM_4, BUY_HEART, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_5] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_5, 0x2C, 0x34, "MK Bazaar Item 5", MARKET_BAZAAR_ITEM_5, BUY_ARROWS_10, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_6] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_6, 0x2C, 0x35, "MK Bazaar Item 6", MARKET_BAZAAR_ITEM_6, BUY_ARROWS_50, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_7] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_7, 0x2C, 0x36, "MK Bazaar Item 7", MARKET_BAZAAR_ITEM_7, BUY_DEKU_STICK_1, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BAZAAR_ITEM_8] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_8, 0x2C, 0x37, "MK Bazaar Item 8", MARKET_BAZAAR_ITEM_8, BUY_ARROWS_30, {Category::cInnerMarket, Category::cMarket, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2C, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[KAK_BAZAAR_ITEM_1] = ItemLocation::Base(0x2C, 0x38, "Kak Bazaar Item 1", KAK_BAZAAR_ITEM_1, BUY_HYLIAN_SHIELD, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 0), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_2] = ItemLocation::Base(0x2C, 0x39, "Kak Bazaar Item 2", KAK_BAZAAR_ITEM_2, BUY_BOMBS_535, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_3] = ItemLocation::Base(0x2C, 0x3A, "Kak Bazaar Item 3", KAK_BAZAAR_ITEM_3, BUY_DEKU_NUT_5, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_4] = ItemLocation::Base(0x2C, 0x3B, "Kak Bazaar Item 4", KAK_BAZAAR_ITEM_4, BUY_HEART, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_5] = ItemLocation::Base(0x2C, 0x3C, "Kak Bazaar Item 5", KAK_BAZAAR_ITEM_5, BUY_ARROWS_10, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_6] = ItemLocation::Base(0x2C, 0x3D, "Kak Bazaar Item 6", KAK_BAZAAR_ITEM_6, BUY_ARROWS_50, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_7] = ItemLocation::Base(0x2C, 0x3E, "Kak Bazaar Item 7", KAK_BAZAAR_ITEM_7, BUY_DEKU_STICK_1, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_8] = ItemLocation::Base(0x2C, 0x3F, "Kak Bazaar Item 8", KAK_BAZAAR_ITEM_8, BUY_ARROWS_30, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_1] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_1, 0x2C, 0x38, "Kak Bazaar Item 1", KAK_BAZAAR_ITEM_1, BUY_HYLIAN_SHIELD, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 0), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_2] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_2, 0x2C, 0x39, "Kak Bazaar Item 2", KAK_BAZAAR_ITEM_2, BUY_BOMBS_535, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_3] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_3, 0x2C, 0x3A, "Kak Bazaar Item 3", KAK_BAZAAR_ITEM_3, BUY_DEKU_NUT_5, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_4] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_4, 0x2C, 0x3B, "Kak Bazaar Item 4", KAK_BAZAAR_ITEM_4, BUY_HEART, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_5] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_5, 0x2C, 0x3C, "Kak Bazaar Item 5", KAK_BAZAAR_ITEM_5, BUY_ARROWS_10, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_6] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_6, 0x2C, 0x3D, "Kak Bazaar Item 6", KAK_BAZAAR_ITEM_6, BUY_ARROWS_50, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_7] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_7, 0x2C, 0x3E, "Kak Bazaar Item 7", KAK_BAZAAR_ITEM_7, BUY_DEKU_STICK_1, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_BAZAAR_ITEM_8] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_8, 0x2C, 0x3F, "Kak Bazaar Item 8", KAK_BAZAAR_ITEM_8, BUY_ARROWS_30, {Category::cKakarikoVillage, Category::cKakariko, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x33, 7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[ZD_SHOP_ITEM_1] = ItemLocation::Base(0x2F, 0x30, "ZD Shop Item 1", ZD_SHOP_ITEM_1, BUY_ZORA_TUNIC, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 0), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_2] = ItemLocation::Base(0x2F, 0x31, "ZD Shop Item 2", ZD_SHOP_ITEM_2, BUY_ARROWS_10, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 1), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_3] = ItemLocation::Base(0x2F, 0x32, "ZD Shop Item 3", ZD_SHOP_ITEM_3, BUY_HEART, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 2), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_4] = ItemLocation::Base(0x2F, 0x33, "ZD Shop Item 4", ZD_SHOP_ITEM_4, BUY_ARROWS_30, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 3), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_5] = ItemLocation::Base(0x2F, 0x34, "ZD Shop Item 5", ZD_SHOP_ITEM_5, BUY_DEKU_NUT_5, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 4), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_6] = ItemLocation::Base(0x2F, 0x35, "ZD Shop Item 6", ZD_SHOP_ITEM_6, BUY_ARROWS_50, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 5), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_7] = ItemLocation::Base(0x2F, 0x36, "ZD Shop Item 7", ZD_SHOP_ITEM_7, BUY_FISH, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 6), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_8] = ItemLocation::Base(0x2F, 0x37, "ZD Shop Item 8", ZD_SHOP_ITEM_8, BUY_RED_POTION_50, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 7), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_1] = ItemLocation::Base(RC_ZD_SHOP_ITEM_1, 0x2F, 0x30, "ZD Shop Item 1", ZD_SHOP_ITEM_1, BUY_ZORA_TUNIC, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 0), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_2] = ItemLocation::Base(RC_ZD_SHOP_ITEM_2, 0x2F, 0x31, "ZD Shop Item 2", ZD_SHOP_ITEM_2, BUY_ARROWS_10, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 1), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_3] = ItemLocation::Base(RC_ZD_SHOP_ITEM_3, 0x2F, 0x32, "ZD Shop Item 3", ZD_SHOP_ITEM_3, BUY_HEART, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 2), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_4] = ItemLocation::Base(RC_ZD_SHOP_ITEM_4, 0x2F, 0x33, "ZD Shop Item 4", ZD_SHOP_ITEM_4, BUY_ARROWS_30, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 3), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_5] = ItemLocation::Base(RC_ZD_SHOP_ITEM_5, 0x2F, 0x34, "ZD Shop Item 5", ZD_SHOP_ITEM_5, BUY_DEKU_NUT_5, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 4), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_6] = ItemLocation::Base(RC_ZD_SHOP_ITEM_6, 0x2F, 0x35, "ZD Shop Item 6", ZD_SHOP_ITEM_6, BUY_ARROWS_50, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 5), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_7] = ItemLocation::Base(RC_ZD_SHOP_ITEM_7, 0x2F, 0x36, "ZD Shop Item 7", ZD_SHOP_ITEM_7, BUY_FISH, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 6), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[ZD_SHOP_ITEM_8] = ItemLocation::Base(RC_ZD_SHOP_ITEM_8, 0x2F, 0x37, "ZD Shop Item 8", ZD_SHOP_ITEM_8, BUY_RED_POTION_50, {Category::cZorasDomain, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2F, 7), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[GC_SHOP_ITEM_1] = ItemLocation::Base(0x2E, 0x30, "GC Shop Item 1", GC_SHOP_ITEM_1, BUY_BOMBS_525, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 0), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_2] = ItemLocation::Base(0x2E, 0x31, "GC Shop Item 2", GC_SHOP_ITEM_2, BUY_BOMBS_10, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 1), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_3] = ItemLocation::Base(0x2E, 0x32, "GC Shop Item 3", GC_SHOP_ITEM_3, BUY_BOMBS_20, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 2), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_4] = ItemLocation::Base(0x2E, 0x33, "GC Shop Item 4", GC_SHOP_ITEM_4, BUY_BOMBS_30, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 3), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_5] = ItemLocation::Base(0x2E, 0x34, "GC Shop Item 5", GC_SHOP_ITEM_5, BUY_GORON_TUNIC, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 4), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_6] = ItemLocation::Base(0x2E, 0x35, "GC Shop Item 6", GC_SHOP_ITEM_6, BUY_HEART, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 5), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_7] = ItemLocation::Base(0x2E, 0x36, "GC Shop Item 7", GC_SHOP_ITEM_7, BUY_RED_POTION_40, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 6), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_8] = ItemLocation::Base(0x2E, 0x37, "GC Shop Item 8", GC_SHOP_ITEM_8, BUY_HEART, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 7), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_1] = ItemLocation::Base(RC_GC_SHOP_ITEM_1, 0x2E, 0x30, "GC Shop Item 1", GC_SHOP_ITEM_1, BUY_BOMBS_525, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 0), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_2] = ItemLocation::Base(RC_GC_SHOP_ITEM_2, 0x2E, 0x31, "GC Shop Item 2", GC_SHOP_ITEM_2, BUY_BOMBS_10, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 1), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_3] = ItemLocation::Base(RC_GC_SHOP_ITEM_3, 0x2E, 0x32, "GC Shop Item 3", GC_SHOP_ITEM_3, BUY_BOMBS_20, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 2), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_4] = ItemLocation::Base(RC_GC_SHOP_ITEM_4, 0x2E, 0x33, "GC Shop Item 4", GC_SHOP_ITEM_4, BUY_BOMBS_30, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 3), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_5] = ItemLocation::Base(RC_GC_SHOP_ITEM_5, 0x2E, 0x34, "GC Shop Item 5", GC_SHOP_ITEM_5, BUY_GORON_TUNIC, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 4), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_6] = ItemLocation::Base(RC_GC_SHOP_ITEM_6, 0x2E, 0x35, "GC Shop Item 6", GC_SHOP_ITEM_6, BUY_HEART, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 5), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_7] = ItemLocation::Base(RC_GC_SHOP_ITEM_7, 0x2E, 0x36, "GC Shop Item 7", GC_SHOP_ITEM_7, BUY_RED_POTION_40, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 6), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_SHOP_ITEM_8] = ItemLocation::Base(RC_GC_SHOP_ITEM_8, 0x2E, 0x37, "GC Shop Item 8", GC_SHOP_ITEM_8, BUY_HEART, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 7), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); /*------------------------------- --- GOSSIP STONES --- -------------------------------*/ // These are not actual locations, but are filler spots used for hint reachability. - OoT Randomizer // flag + 0x400 = message ID - locationTable[DMC_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x05, "DMC Gossip Stone", {}); - locationTable[DMT_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x04, "DMT Gossip Stone", {}); - locationTable[COLOSSUS_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x1A, "Colossus Gossip Stone", {}); - locationTable[DODONGOS_CAVERN_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x14, "Dodongo's Cavern Gossip Stone", {}); - locationTable[GV_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x11, "GV Gossip Stone", {}); - locationTable[GC_MAZE_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x15, "GC Maze Gossip Stone", {}); - locationTable[GC_MEDIGORON_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x19, "GC Medigoron Gossip Stone", {}); - locationTable[GRAVEYARD_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x0A, "GY Gossip Stone", {}); - locationTable[HC_MALON_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x12, "HC Malon Gossip Stone", {}); - locationTable[HC_ROCK_WALL_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x0B, "HC Rock Wall Gossip Stone", {}); - locationTable[HC_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x13, "HC Storms Grotto Gossip Stone", {}); - locationTable[KF_DEKU_TREE_GOSSIP_STONE_LEFT] = ItemLocation::HintStone(0x00, 0x1F, "KF Deku Tree Left Gossip Stone", {}); - locationTable[KF_DEKU_TREE_GOSSIP_STONE_RIGHT] = ItemLocation::HintStone(0x00, 0x20, "KF Deku Tree Right Gossip Stone", {}); - locationTable[KF_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x1E, "KF Gossip Stone", {}); - locationTable[LH_LAB_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x03, "LH Lab Gossip Stone", {}); - locationTable[LH_GOSSIP_STONE_SOUTHEAST] = ItemLocation::HintStone(0x00, 0x0F, "LH Southeast Gossip Stone", {}); - locationTable[LH_GOSSIP_STONE_SOUTHWEST] = ItemLocation::HintStone(0x00, 0x08, "LH Southwest Gossip Stone", {}); - locationTable[LW_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x1D, "LW Gossip Stone", {}); - locationTable[SFM_MAZE_GOSSIP_STONE_LOWER] = ItemLocation::HintStone(0x00, 0x16, "SFM Maze Lower Gossip Stone", {}); - locationTable[SFM_MAZE_GOSSIP_STONE_UPPER] = ItemLocation::HintStone(0x00, 0x17, "SFM Maze Upper Gossip Stone", {}); - locationTable[SFM_SARIA_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x1C, "SFM Saria Gossip Stone", {}); - locationTable[TOT_GOSSIP_STONE_LEFT] = ItemLocation::HintStone(0x00, 0x06, "ToT Left Gossip Stone", {}); - locationTable[TOT_GOSSIP_STONE_RIGHT] = ItemLocation::HintStone(0x00, 0x07, "ToT Left Center Gossip Stone", {}); - locationTable[TOT_GOSSIP_STONE_RIGHT_CENTER] = ItemLocation::HintStone(0x00, 0x10, "ToT Right Center Gossip Stone", {}); - locationTable[TOT_GOSSIP_STONE_LEFT_CENTER] = ItemLocation::HintStone(0x00, 0x0E, "ToT Right Gossip Stone", {}); - locationTable[ZD_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x09, "ZD Gossip Stone", {}); - locationTable[ZF_FAIRY_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x01, "Fairy Gossip Stone", {}); - locationTable[ZF_JABU_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x02, "Jabu Gossip Stone", {}); - locationTable[ZR_NEAR_GROTTOS_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x0D, "ZR Near Grottos Gossip Stone", {}); - locationTable[ZR_NEAR_DOMAIN_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x0C, "ZR Near Domain Gossip Stone", {}); - locationTable[HF_COW_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x1B, "HF Cow Grotto Gossip Stone", {}); + locationTable[DMC_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMC_GOSSIP_STONE, 0x00, 0x05, "DMC Gossip Stone", {}); + locationTable[DMT_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMT_GOSSIP_STONE, 0x00, 0x04, "DMT Gossip Stone", {}); + locationTable[COLOSSUS_GOSSIP_STONE] = ItemLocation::HintStone(RC_COLOSSUS_GOSSIP_STONE, 0x00, 0x1A, "Colossus Gossip Stone", {}); + locationTable[DODONGOS_CAVERN_GOSSIP_STONE] = ItemLocation::HintStone(RC_DODONGOS_CAVERN_GOSSIP_STONE, 0x00, 0x14, "Dodongo's Cavern Gossip Stone", {}); + locationTable[GV_GOSSIP_STONE] = ItemLocation::HintStone(RC_GV_GOSSIP_STONE, 0x00, 0x11, "GV Gossip Stone", {}); + locationTable[GC_MAZE_GOSSIP_STONE] = ItemLocation::HintStone(RC_GC_MAZE_GOSSIP_STONE, 0x00, 0x15, "GC Maze Gossip Stone", {}); + locationTable[GC_MEDIGORON_GOSSIP_STONE] = ItemLocation::HintStone(RC_GC_MEDIGORON_GOSSIP_STONE, 0x00, 0x19, "GC Medigoron Gossip Stone", {}); + locationTable[GRAVEYARD_GOSSIP_STONE] = ItemLocation::HintStone(RC_GY_GOSSIP_STONE, 0x00, 0x0A, "GY Gossip Stone", {}); + locationTable[HC_MALON_GOSSIP_STONE] = ItemLocation::HintStone(RC_HC_MALON_GOSSIP_STONE, 0x00, 0x12, "HC Malon Gossip Stone", {}); + locationTable[HC_ROCK_WALL_GOSSIP_STONE] = ItemLocation::HintStone(RC_HC_ROCK_WALL_GOSSIP_STONE, 0x00, 0x0B, "HC Rock Wall Gossip Stone", {}); + locationTable[HC_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HC_STORMS_GROTTO_GOSSIP_STONE, 0x00, 0x13, "HC Storms Grotto Gossip Stone", {}); + locationTable[KF_DEKU_TREE_GOSSIP_STONE_LEFT] = ItemLocation::HintStone(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, 0x00, 0x1F, "KF Deku Tree Left Gossip Stone", {}); + locationTable[KF_DEKU_TREE_GOSSIP_STONE_RIGHT] = ItemLocation::HintStone(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, 0x00, 0x20, "KF Deku Tree Right Gossip Stone", {}); + locationTable[KF_GOSSIP_STONE] = ItemLocation::HintStone(RC_KF_GOSSIP_STONE, 0x00, 0x1E, "KF Gossip Stone", {}); + locationTable[LH_LAB_GOSSIP_STONE] = ItemLocation::HintStone(RC_LH_LAB_GOSSIP_STONE, 0x00, 0x03, "LH Lab Gossip Stone", {}); + locationTable[LH_GOSSIP_STONE_SOUTHEAST] = ItemLocation::HintStone(RC_LH_SOUTHEAST_GOSSIP_STONE, 0x00, 0x0F, "LH Southeast Gossip Stone", {}); + locationTable[LH_GOSSIP_STONE_SOUTHWEST] = ItemLocation::HintStone(RC_LH_SOUTHWEST_GOSSIP_STONE, 0x00, 0x08, "LH Southwest Gossip Stone", {}); + locationTable[LW_GOSSIP_STONE] = ItemLocation::HintStone(RC_LW_GOSSIP_STONE, 0x00, 0x1D, "LW Gossip Stone", {}); + locationTable[SFM_MAZE_GOSSIP_STONE_LOWER] = ItemLocation::HintStone(RC_SFM_MAZE_LOWER_GOSSIP_STONE, 0x00, 0x16, "SFM Maze Lower Gossip Stone", {}); + locationTable[SFM_MAZE_GOSSIP_STONE_UPPER] = ItemLocation::HintStone(RC_SFM_MAZE_UPPER_GOSSIP_STONE, 0x00, 0x17, "SFM Maze Upper Gossip Stone", {}); + locationTable[SFM_SARIA_GOSSIP_STONE] = ItemLocation::HintStone(RC_SFM_SARIA_GOSSIP_STONE, 0x00, 0x1C, "SFM Saria Gossip Stone", {}); + locationTable[TOT_GOSSIP_STONE_LEFT] = ItemLocation::HintStone(RC_TOT_LEFT_GOSSIP_STONE, 0x00, 0x06, "ToT Left Gossip Stone", {}); + locationTable[TOT_GOSSIP_STONE_RIGHT] = ItemLocation::HintStone(RC_TOT_RIGHT_GOSSIP_STONE, 0x00, 0x07, "ToT Left Center Gossip Stone", {}); + locationTable[TOT_GOSSIP_STONE_RIGHT_CENTER] = ItemLocation::HintStone(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, 0x00, 0x10, "ToT Right Center Gossip Stone", {}); + locationTable[TOT_GOSSIP_STONE_LEFT_CENTER] = ItemLocation::HintStone(RC_TOT_LEFT_CENTER_GOSSIP_STONE, 0x00, 0x0E, "ToT Right Gossip Stone", {}); + locationTable[ZD_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZD_GOSSIP_STONE, 0x00, 0x09, "ZD Gossip Stone", {}); + locationTable[ZF_FAIRY_GOSSIP_STONE] = ItemLocation::HintStone(RC_FAIRY_GOSSIP_STONE, 0x00, 0x01, "Fairy Gossip Stone", {}); + locationTable[ZF_JABU_GOSSIP_STONE] = ItemLocation::HintStone(RC_JABU_GOSSIP_STONE, 0x00, 0x02, "Jabu Gossip Stone", {}); + locationTable[ZR_NEAR_GROTTOS_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, 0x00, 0x0D, "ZR Near Grottos Gossip Stone", {}); + locationTable[ZR_NEAR_DOMAIN_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, 0x00, 0x0C, "ZR Near Domain Gossip Stone", {}); + locationTable[HF_COW_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_COW_GROTTO_GOSSIP_STONE, 0x00, 0x1B, "HF Cow Grotto Gossip Stone", {}); - locationTable[HF_NEAR_MARKET_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x30, "HF Near Market Gossip Stone", {}); - locationTable[HF_SOUTHEAST_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x32, "HF Southeast Gossip Stone", {}); - locationTable[HF_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x33, "HF Open Grotto Gossip Stone", {}); - locationTable[KAK_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x38, "Kak Open Grotto Gossip Stone", {}); - locationTable[ZR_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x39, "ZR Open Grotto Gossip Stone", {}); - locationTable[KF_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x3C, "KF Storms Gossip Stone", {}); - locationTable[LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x34, "LW Near Shortcuts Gossip Stone", {}); - locationTable[DMT_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x37, "DMT Storms Grotto Gossip Stone", {}); - locationTable[DMC_UPPER_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x3A, "DMC Upper Grotto Gossip Stone", {}); + locationTable[HF_NEAR_MARKET_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_NEAR_MARKET_GOSSIP_STONE, 0x00, 0x30, "HF Near Market Gossip Stone", {}); + locationTable[HF_SOUTHEAST_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_SOUTHEAST_GOSSIP_STONE, 0x00, 0x32, "HF Southeast Gossip Stone", {}); + locationTable[HF_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_OPEN_GROTTO_GOSSIP_STONE, 0x00, 0x33, "HF Open Grotto Gossip Stone", {}); + locationTable[KAK_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, 0x00, 0x38, "Kak Open Grotto Gossip Stone", {}); + locationTable[ZR_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, 0x00, 0x39, "ZR Open Grotto Gossip Stone", {}); + locationTable[KF_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_KF_STORMS_GOSSIP_STONE, 0x00, 0x3C, "KF Storms Gossip Stone", {}); + locationTable[LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, 0x00, 0x34, "LW Near Shortcuts Gossip Stone", {}); + locationTable[DMT_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, 0x00, 0x37, "DMT Storms Grotto Gossip Stone", {}); + locationTable[DMC_UPPER_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, 0x00, 0x3A, "DMC Upper Grotto Gossip Stone", {}); - locationTable[GANONDORF_HINT] = ItemLocation::OtherHint(0x00, 0x00, "Ganondorf Hint", {}); + locationTable[GANONDORF_HINT] = ItemLocation::OtherHint(RC_GANONDORF_HINT, 0x00, 0x00, "Ganondorf Hint", {}); } std::vector KF_ShopLocations = { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp b/soh/soh/Enhancements/randomizer/3drando/item_location.hpp index 2f6bdc52d..a76e028aa 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.hpp @@ -9,6 +9,7 @@ #include #include "spoiler_log.hpp" #include "item_list.hpp" +#include "../randomizerTypes.h" enum ItemOverride_Type { OVR_BASE_ITEM = 0, @@ -154,8 +155,8 @@ public: class ItemLocation { public: ItemLocation() = default; - ItemLocation(uint8_t scene_, ItemLocationType type_, uint8_t flag_, std::string name_, uint32_t hintKey_, uint32_t vanillaItem_, std::vector categories_, uint16_t price_ = 0, SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup_ = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) - : scene(scene_), type(type_), flag(flag_), name(std::move(name_)), hintKey(hintKey_), vanillaItem(vanillaItem_), categories(std::move(categories_)), price(price_), collectionCheck(collectionCheck_), collectionCheckGroup(collectionCheckGroup_) {} + ItemLocation(RandomizerCheck rc_, uint8_t scene_, ItemLocationType type_, uint8_t flag_, std::string name_, uint32_t hintKey_, uint32_t vanillaItem_, std::vector categories_, uint16_t price_ = 0, SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup_ = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) + : rc(rc_), scene(scene_), type(type_), flag(flag_), name(std::move(name_)), hintKey(hintKey_), vanillaItem(vanillaItem_), categories(std::move(categories_)), price(price_), collectionCheck(collectionCheck_), collectionCheckGroup(collectionCheckGroup_) {} ItemOverride_Key Key() const { ItemOverride_Key key; @@ -368,48 +369,48 @@ public: } } - static auto Base(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::Base, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; + static auto Base(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::Base, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; } - static auto Chest(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene, flag), collectionCheckGroup}; + static auto Chest(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene, flag), collectionCheckGroup}; } - static auto Chest(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; + static auto Chest(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; } - static auto Collectable(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene, flag), collectionCheckGroup}; + static auto Collectable(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene, flag), collectionCheckGroup}; } - static auto Collectable(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; + static auto Collectable(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; } - static auto GSToken(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::GSToken, flag, std::move(name), hintKey, GOLD_SKULLTULA_TOKEN, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA, scene, flag), collectionCheckGroup}; + static auto GSToken(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::GSToken, flag, std::move(name), hintKey, GOLD_SKULLTULA_TOKEN, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA, scene, flag), collectionCheckGroup}; } - static auto GrottoScrub(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::GrottoScrub, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; + static auto GrottoScrub(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::GrottoScrub, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; } - static auto Delayed(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::Delayed, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; + static auto Delayed(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::Delayed, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; } - static auto Reward(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{scene, ItemLocationType::TempleReward, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; + static auto Reward(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{rc, scene, ItemLocationType::TempleReward, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; } - static auto OtherHint(uint8_t scene, uint8_t flag, std::string&& name, std::vector&& categories) { - return ItemLocation{scene, ItemLocationType::OtherHint, flag, std::move(name), NONE, NONE, std::move(categories)}; + static auto OtherHint(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, std::vector&& categories) { + return ItemLocation{rc, scene, ItemLocationType::OtherHint, flag, std::move(name), NONE, NONE, std::move(categories)}; } - static auto HintStone(uint8_t scene, uint8_t flag, std::string&& name, std::vector&& categories) { - return ItemLocation{scene, ItemLocationType::HintStone, flag, std::move(name), NONE, NONE, std::move(categories)}; + static auto HintStone(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, std::vector&& categories) { + return ItemLocation{rc, scene, ItemLocationType::HintStone, flag, std::move(name), NONE, NONE, std::move(categories)}; } void ResetVariables() { @@ -425,6 +426,7 @@ public: } private: + RandomizerCheck rc; uint8_t scene; ItemLocationType type; uint8_t flag; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index b09b9dab2..9b6fc90f5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -753,6 +753,7 @@ typedef enum { RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RC_ZR_OPEN_GROTTO_GOSSIP_STONE, + RC_GANONDORF_HINT, RC_MAX } RandomizerCheck; From ae8c7cb509f82a9e02bd52f666e74ff1cdf1222f Mon Sep 17 00:00:00 2001 From: briaguya Date: Wed, 17 Aug 2022 11:08:11 -0400 Subject: [PATCH 091/212] add excluded locations set --- soh/soh/Enhancements/randomizer/3drando/menu.cpp | 4 ++-- soh/soh/Enhancements/randomizer/3drando/menu.hpp | 3 ++- soh/soh/Enhancements/randomizer/3drando/playthrough.cpp | 4 ++-- soh/soh/Enhancements/randomizer/3drando/playthrough.hpp | 2 +- soh/soh/Enhancements/randomizer/3drando/rando_main.cpp | 4 ++-- soh/soh/Enhancements/randomizer/3drando/rando_main.hpp | 2 +- soh/soh/Enhancements/randomizer/3drando/settings.cpp | 2 +- soh/soh/Enhancements/randomizer/3drando/settings.hpp | 2 +- soh/soh/Enhancements/randomizer/randomizer.cpp | 4 +++- 9 files changed, 15 insertions(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.cpp b/soh/soh/Enhancements/randomizer/3drando/menu.cpp index f7699b754..4f0d7b7d5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.cpp @@ -516,12 +516,12 @@ void PrintOptionDescription() { printf("\x1b[22;0H%s", description.data()); } -std::string GenerateRandomizer(std::unordered_map cvarSettings) { +std::string GenerateRandomizer(std::unordered_map cvarSettings, std::set excludedLocations) { // if a blank seed was entered, make a random one srand(time(NULL)); Settings::seed = std::to_string(rand()); - int ret = Playthrough::Playthrough_Init(std::hash{}(Settings::seed), cvarSettings); + int ret = Playthrough::Playthrough_Init(std::hash{}(Settings::seed), cvarSettings, excludedLocations); if (ret < 0) { if (ret == -1) { // Failed to generate after 5 tries printf("\n\nFailed to generate after 5 tries.\nPress B to go back to the menu.\nA different seed might be " diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.hpp b/soh/soh/Enhancements/randomizer/3drando/menu.hpp index 737c1d3cf..6be641f03 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.hpp @@ -2,6 +2,7 @@ #include #include +#include #include "soh/Enhancements/randomizer/randomizerTypes.h" #define MAIN_MENU 0 @@ -45,7 +46,7 @@ void PrintResetToDefaultsMenu(); void PrintGenerateMenu(); void ClearDescription(); void PrintOptionDescription(); -std::string GenerateRandomizer(std::unordered_map cvarSettings); +std::string GenerateRandomizer(std::unordered_map cvarSetting, std::set excludedLocations); std::string GetInput(const char* hintText); extern void MenuInit(); diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index cfcbdfa91..ee1a86424 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -10,7 +10,7 @@ namespace Playthrough { -int Playthrough_Init(uint32_t seed, std::unordered_map cvarSettings) { +int Playthrough_Init(uint32_t seed, std::unordered_map cvarSettings, std::set excludedLocations) { // initialize the RNG with just the seed incase any settings need to be // resolved to something random Random_Init(seed); @@ -21,7 +21,7 @@ int Playthrough_Init(uint32_t seed, std::unordered_map cvarSettings); +int Playthrough_Init(uint32_t seed, std::unordered_map cvarSettings, std::set excludedLocations); int Playthrough_Repeat(int count = 1); } diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index 5fb1b34c5..56e84dd1e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -13,7 +13,7 @@ #define TICKS_PER_SEC 268123480.0 -void RandoMain::GenerateRando(std::unordered_map cvarSettings) { +void RandoMain::GenerateRando(std::unordered_map cvarSettings, std::set excludedLocations) { HintTable_Init(); ItemTable_Init(); LocationTable_Init(); @@ -21,7 +21,7 @@ void RandoMain::GenerateRando(std::unordered_map cvarS // std::string settingsFileName = "./randomizer/latest_settings.json"; // CVar_SetString("gLoadedPreset", settingsFileName.c_str()); - std::string fileName = Ship::GlobalCtx2::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings).c_str()); + std::string fileName = Ship::GlobalCtx2::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings, excludedLocations).c_str()); CVar_SetString("gSpoilerLog", fileName.c_str()); CVar_Save(); diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp index 523620d1e..b70762cf7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp @@ -1,5 +1,5 @@ #pragma once namespace RandoMain { -void GenerateRando(std::unordered_map cvarSettings); +void GenerateRando(std::unordered_map cvarSettings, std::set excludedLocations); } diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 71aa70b32..1d3572724 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2483,7 +2483,7 @@ namespace Settings { } //Function to set flags depending on settings - void UpdateSettings(std::unordered_map cvarSettings) { + void UpdateSettings(std::unordered_map cvarSettings, std::set excludedLocations) { // RANDTODO: Switch this back once all logic options are implemented // Logic.SetSelectedIndex(cvarSettings[RSK_LOGIC_RULES]); diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.hpp b/soh/soh/Enhancements/randomizer/3drando/settings.hpp index 06ec9da1c..2daf1fa7f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.hpp @@ -850,7 +850,7 @@ class Menu { }; namespace Settings { -void UpdateSettings(std::unordered_map cvarSettings); +void UpdateSettings(std::unordered_map cvarSettings, std::set excludedLocations); SettingsContext FillContext(); void InitSettings(); void SetDefaultSettings(); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 281dc98e4..0de33baf4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3587,7 +3587,9 @@ void GenerateRandomizerImgui() { cvarSettings[RSK_SKULLS_SUNS_SONG] = CVar_GetS32("gRandomizeGsExpectSunsSong", 0); - RandoMain::GenerateRando(cvarSettings); + std::set excludedLocations = { RC_UNKNOWN_CHECK }; + + RandoMain::GenerateRando(cvarSettings, excludedLocations); CVar_SetS32("gRandoGenerating", 0); CVar_Save(); From f4c1332159fd7ee46bab17eddd639e7a635e5d4e Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Wed, 17 Aug 2022 17:27:33 +0200 Subject: [PATCH 092/212] Fix Wii U stick input --- libultraship/libultraship/WiiUController.cpp | 8 ++++++++ libultraship/libultraship/WiiUGamepad.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/libultraship/libultraship/WiiUController.cpp b/libultraship/libultraship/WiiUController.cpp index cfaa9dbd7..19835a548 100644 --- a/libultraship/libultraship/WiiUController.cpp +++ b/libultraship/libultraship/WiiUController.cpp @@ -406,6 +406,14 @@ namespace Ship { x *= scale; y *= scale; } + + if (isRightStick) { + getRightStickX(virtualSlot) = x; + getRightStickY(virtualSlot) = y; + } else { + getLeftStickX(virtualSlot) = x; + getLeftStickY(virtualSlot) = y; + } } void WiiUController::CreateDefaultBinding(int32_t virtualSlot) { diff --git a/libultraship/libultraship/WiiUGamepad.cpp b/libultraship/libultraship/WiiUGamepad.cpp index 79d41b35f..64ef9e90f 100644 --- a/libultraship/libultraship/WiiUGamepad.cpp +++ b/libultraship/libultraship/WiiUGamepad.cpp @@ -279,6 +279,14 @@ namespace Ship { x *= scale; y *= scale; } + + if (isRightStick) { + getRightStickX(virtualSlot) = x; + getRightStickY(virtualSlot) = y; + } else { + getLeftStickX(virtualSlot) = x; + getLeftStickY(virtualSlot) = y; + } } void WiiUGamepad::CreateDefaultBinding(int32_t virtualSlot) { From 914af77234468a34c3372ba895a5d240db71a590 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 17 Aug 2022 12:23:39 -0400 Subject: [PATCH 093/212] Fixes fanfare getItemId overlap --- soh/src/code/code_800EC960.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c index 9f969e02f..01761d541 100644 --- a/soh/src/code/code_800EC960.c +++ b/soh/src/code/code_800EC960.c @@ -3895,46 +3895,47 @@ void Audio_ResetSfxChannelState(void) { void Audio_PlayFanfare_Rando(GetItemEntry getItem) { s32 temp1; s16 getItemId = getItem.getItemId; + s16 itemId = getItem.itemId; if (getItem.modIndex == MOD_NONE) { - if (((getItemId >= GI_RUPEE_GREEN) && (getItemId <= GI_RUPEE_RED)) || - ((getItemId >= GI_RUPEE_PURPLE) && (getItemId <= GI_RUPEE_GOLD)) || - ((getItemId >= GI_RUPEE_GREEN_LOSE) && (getItemId <= GI_RUPEE_PURPLE_LOSE)) || (getItemId == GI_HEART)) { + if (((itemId >= ITEM_RUPEE_GREEN) && (itemId <= ITEM_RUPEE_GOLD)) || (itemId == ITEM_HEART)) { Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } else { - if ((getItemId == GI_HEART_CONTAINER_2) || (getItemId == GI_HEART_CONTAINER) || - ((getItemId == GI_HEART_PIECE) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { + if (itemId == ITEM_HEART_CONTAINER || + ((itemId == ITEM_HEART_PIECE_2) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { temp1 = NA_BGM_HEART_GET | 0x900; } else { - temp1 = (getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + temp1 = (itemId == ITEM_HEART_PIECE_2) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; } // If we get a skulltula token or the "WINNER" heart, play "get small item" - if (getItemId == GI_SKULL_TOKEN || getItemId == GI_HEART_PIECE_WIN) { + // Also make sure "WINNER" heart is not the 4th heart piece. + if (itemId == ITEM_SKULL_TOKEN || (getItemId == GI_HEART_PIECE_WIN && itemId == ITEM_HEART_PIECE_2 && + (gSaveContext.inventory.questItems & 0xF0000000) != 0x40000000)) { temp1 = NA_BGM_SMALL_ITEM_GET | 0x900; } - // But if the "WINNER" heart is the 4th heart piece collected, play "get heart container" - if (getItemId == GI_HEART_PIECE_WIN && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000)) { - temp1 = NA_BGM_HEART_GET | 0x900; - } // If the setting is toggled on and we get special quest items (longer fanfares): if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) { // If we get a medallion, play the "get a medallion" fanfare - if ((getItemId >= RG_FOREST_MEDALLION) && (getItemId <= RG_LIGHT_MEDALLION)) { + if ((itemId >= ITEM_MEDALLION_FOREST) && (itemId <= ITEM_MEDALLION_LIGHT)) { temp1 = NA_BGM_MEDALLION_GET | 0x900; } // If it's a Spiritual Stone, play the "get a spiritual stone" fanfare - if ((getItemId >= RG_KOKIRI_EMERALD) && (getItemId <= RG_ZORA_SAPPHIRE)) { + if ((itemId >= ITEM_KOKIRI_EMERALD) && (itemId <= ITEM_ZORA_SAPPHIRE)) { temp1 = NA_BGM_SPIRITUAL_STONE | 0x900; } // If the item we're getting is a song, play the "learned a song" fanfare - if ((getItemId >= RG_ZELDAS_LULLABY) && (getItemId <= RG_PRELUDE_OF_LIGHT)) { + if ((itemId >= ITEM_SONG_MINUET) && (itemId <= ITEM_SONG_STORMS)) { temp1 = NA_BGM_OCA_FAIRY_GET | 0x900; } } Audio_PlayFanfare(temp1); } } else if (getItem.modIndex == MOD_RANDOMIZER) { - if ((getItemId >= RG_BOTTLE_WITH_RED_POTION && getItemId <= RG_BOTTLE_WITH_BIG_POE) || (getItemId >= RG_DEKU_TREE_MAP && getItemId <= RG_GANONS_CASTLE_SMALL_KEY)) { + if ((itemId >= RG_BOTTLE_WITH_RED_POTION && itemId <= RG_BOTTLE_WITH_BIG_POE) || + (itemId >= RG_DEKU_TREE_MAP && itemId <= RG_GANONS_CASTLE_SMALL_KEY)) { + temp1 = NA_BGM_ITEM_GET | 0x900; + } else { + // Just in case nothing else matches. temp1 = NA_BGM_ITEM_GET | 0x900; } Audio_PlayFanfare(temp1); From 3fb582a02b61eae3e1614f129256cb75c1577d42 Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Wed, 17 Aug 2022 20:00:20 +0200 Subject: [PATCH 094/212] ADD: BAGUETTE --- .../Enhancements/randomizer/randomizer.cpp | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 6c3f2db95..61ee8192a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4731,62 +4731,62 @@ CustomMessageMinimal NaviMessages[NaviMsgCount] = { { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", "%cFehlt dir ein kleiner Schlüssel in &einem Labyrinth? Vielleicht hat ihn&ja der %rEndgegner%c!", - "%cFrench tip about playing rando! 0" }, + "%cIl te manque une %wPetite Clé %cdans&un donjon? C'est peut-être le %rboss&%cqui l'a!" }, { "%cSometimes you can use the %rMegaton&Hammer %cinstead of bombs!", "%cManchmal kannst du den %rStahlhammer&%cstatt Bomben verwenden!", - "%cFrench tip about playing rando! 1" }, + "%cParfois, tu peux utiliser la %rMasse&des Titans %cau lieu de tes bombes!" }, { "%cThere are three %gbusiness scrubs %cin &Hyrule who sell %wmysterious items%c. Do&you know where they are?", "%cEs gibt drei %gDeku-Händler %cin Hyrule&die mysteriöse Gegenstände&verkaufen. Weißt du wo Sie sind?", - "%cFrench tip about playing rando! 2" }, + "%cIl y a trois %gPestes Marchandes%c en&Hyrule qui vendent des %wobjets&mystérieux%c. Tu sais où elles sont?" }, { "%cStuck on this seed? You could &throw in the towel and check the&%wspoiler log%c...", "%cHängst du bei diesem Seed fest?&Du könntest die Flinte ins Korn&werfen und ins %wSpoiler Log %cschauen...", - "%cFrench tip about playing rando! 3" }, + "%cSi tu es coincé sur cette seed,&tu peux toujours jeter l'éponge&et regader le %wSpoiler log%c..." }, - { "%cDid you know that the %yHover&Boots %ccan be used to cross&quicksand?", - "%cWusstest du, dass du mit den&%yGleitstiefeln %cTreibsand überqueren&kannst?", - "%cFrench tip about playing rando! 4" }, + { "%cDid you know that the %yHover&Boots %ccan be used to cross&%wquicksand?", + "%cWusstest du, dass du mit den&%yGleitstiefeln %cTreibsand %wüberqueren&kannst%c?", + "%cEst-ce que tu savais que les %rBottes&des airs %cpouvaient être utilisées&pour traverser les %wsables mouvants%c?" }, { "%cYou can reach the back of %wImpa's&House %cby jumping from the&unfinished house with a %rcucco%c!", "%cDu kannst den Balkon von %wImpas&Haus %cerreichen indem du von&der Baustelle aus mit einem %rHuhn&%cspringst!", - "%cFrench tip about playing rando! 5" }, + "%cTu peux atteindre l'arrière de la&%wMaison d'Impa %cen sautant depuis la&maison en construction avec une&%rcocotte%c!" }, { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", "%cDie %yGeister-Prüfung %cin %pGanons&Schloss %chat irgendwo eine&%wversteckte Kiste%c. Weißt du schon&wo?", - "%cFrench tip about playing rando! 6" }, + "%cL'%yÉpreuve de l'Esprit%c dans le %pChâteau&de Ganon %ca un coffre caché quelque&part.&Je suppose que tu&le savais déjà?" }, { "%cYou know the %wBombchu Bowling&Alley%c? I heard %wonly two of the &prizes %care worthwhile. The rest &is junk!", "%cKennst du die %wMinenbowlingbahn%c?&Ich habe gehört dass sich nur &%wzwei der Preise%c lohnen. Der Rest&ist Krimskrams!", - "%cFrench tip about playing rando! 7" }, + "%cEst-ce que tu savais qu'au %wBowling&Teigneux%c, il n'y a que les %wdeux&premiers prix %cqui sont intéréssant?" }, { "%cHave you been using %wDeku Nuts&%cenough? I've seen them blow up&a %rBombchu%c!", "%cBenutzt du auch genügend %wDeku&Nüsse%c? Ich habe mal gesehen dass&man damit %rKrabbelminen %cdetonieren&kann!", - "%cFrench tip about playing rando! 8" }, + "%cTu es sûr d'utiliser tes %wNoix Mojo &%ccorrectement? J'en ai déjà vu&exploser des %rChoux-Péteurs%c!" }, { "%cYou might end up with an %wextra&key %cfor the %bWater Temple %cor the&%rFire Temple%c. It's for your safety!", "%cVielleicht verbleibt dir im&%bWassertempel %coder %rFeuertempel %cein&%wzusätzlicher Schlüssel%c. Dies&ist zu deiner Sicherheit!", - "%cFrench tip about playing rando! 9" }, + "%cIl se peut que tu aies une %wPetite&Clé %cen trop dans le %bTemple de l'Eau&%cou le %rTemple du Feu%c. C'est pour ta&propre sécurité!" }, { "%cIf you can't pick up a %rbomb&flower %cwith your hands, you can&still detonate it with %rfire %cor&with %warrows%c!", "%cNur weil du eine %rDonnerblume&%cnicht hochheben kannst, so kannst&du sie immernoch mit %rFeuer %coder&%wPfeilen %cdetonieren!", - "%cFrench tip about playing rando! 10" }, + "%cSi tu ne peux pas ramasser&un %rChoux-Péteur %cavec tes mains, tu&peux toujours le faire exploser&avec du %rFeu %cou avec des %wflèches%c!" }, { "%cEven an adult can't push large&blocks without some %wextra&strength%c!", "%cSelbst ein Erwachsener kann ohne&etwas %wzusätzliche Kraft %ckeine&großen Blöcke verschieben!", - "%cFrench tip about playing rando! 11" }, + "%cMême un adulte ne peut pas pousser&de grands blocs sans un petit %wgain&de force%c!" }, { "%cI've heard that %rFlare Dancer&%cis weak to the Master Sword!&Have you tried it?", "%cIch habe gehört dass der&%rFlammenderwisch %ceine Schwäche für&das Masterschwert aufweist. Hast du&es schonmal versucht einzusetzen?", - "%cFrench tip about playing rando! 12" }, + "%cJ'ai entendu dire que les %rDanse-&Flammes %csont faîble face à l'%wÉpée de&Légende%c! Est-ce que tu as essayé?" }, { "%cDon't have a weapon to kill a&%rspider%c? Try throwing a %wpot&%cat it!", "%cFehlt dir die Waffe um gegen&eine %rSkulltula %czu kämpfen? Versuch&Sie mit einem %wKrug %cabzuwerfen!", - "%cFrench tip about playing rando! 13" }, + "%cSi tu n'as pas d'arme pour tuer&une %raraignée%c, pourquoi n'essayerais&-tu pas de lui jetter une %wjarre&%cà la figure?" }, { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", "%cIch habe gehört dass die Stelle&%wfeuchten Bodens %cim %bZora-Fluss %cals&einzige keine %rSkulltula %cbeherbergt.", - "%cFrench tip about playing rando! 14" }, + "%cJ'ai entendu dire que la %wterre meuble&%cqui se trouve à la %bRivière Zora %cest&la seule qui ne contienne pas&d'%raraignée%c." }, }; From 907871915dbcde54984079420982c02b70f4ddd4 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Wed, 17 Aug 2022 11:07:03 -0700 Subject: [PATCH 095/212] fix question mark --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 61ee8192a..2cbe57cf6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4745,7 +4745,7 @@ CustomMessageMinimal NaviMessages[NaviMsgCount] = { "%cHängst du bei diesem Seed fest?&Du könntest die Flinte ins Korn&werfen und ins %wSpoiler Log %cschauen...", "%cSi tu es coincé sur cette seed,&tu peux toujours jeter l'éponge&et regader le %wSpoiler log%c..." }, - { "%cDid you know that the %yHover&Boots %ccan be used to cross&%wquicksand?", + { "%cDid you know that the %yHover&Boots %ccan be used to cross&%wquicksand%c?", "%cWusstest du, dass du mit den&%yGleitstiefeln %cTreibsand %wüberqueren&kannst%c?", "%cEst-ce que tu savais que les %rBottes&des airs %cpouvaient être utilisées&pour traverser les %wsables mouvants%c?" }, From 2c144c3aa61cb71f3ce3c0e4e4daa4883f3e640c Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Wed, 17 Aug 2022 11:10:37 -0700 Subject: [PATCH 096/212] Fix typo, fix Master Sword text --- soh/soh/Enhancements/randomizer/randomizer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 2cbe57cf6..97940829a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4777,9 +4777,9 @@ CustomMessageMinimal NaviMessages[NaviMsgCount] = { "%cSelbst ein Erwachsener kann ohne&etwas %wzusätzliche Kraft %ckeine&großen Blöcke verschieben!", "%cMême un adulte ne peut pas pousser&de grands blocs sans un petit %wgain&de force%c!" }, - { "%cI've heard that %rFlare Dancer&%cis weak to the Master Sword!&Have you tried it?", - "%cIch habe gehört dass der&%rFlammenderwisch %ceine Schwäche für&das Masterschwert aufweist. Hast du&es schonmal versucht einzusetzen?", - "%cJ'ai entendu dire que les %rDanse-&Flammes %csont faîble face à l'%wÉpée de&Légende%c! Est-ce que tu as essayé?" }, + { "%cI've heard that %rFlare Dancer&%cis weak to the %wMaster Sword%c!&Have you tried it?", + "%cIch habe gehört dass der&%rFlammenderwisch %ceine Schwäche für&das %wMasterschwert %caufweist. Hast du&es schonmal versucht einzusetzen?", + "%cJ'ai entendu dire que les %rDanse-&Flammes %csont faîbles face à l'%wÉpée de&Légende%c! Est-ce que tu as essayé?" }, { "%cDon't have a weapon to kill a&%rspider%c? Try throwing a %wpot&%cat it!", "%cFehlt dir die Waffe um gegen&eine %rSkulltula %czu kämpfen? Versuch&Sie mit einem %wKrug %cabzuwerfen!", From 584f9d16f065518a161ad074085a5114bbecd56a Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Wed, 17 Aug 2022 11:26:07 -0700 Subject: [PATCH 097/212] Fix line break --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 3a7a6dc58..b18e2df99 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4753,7 +4753,7 @@ CustomMessageMinimal NaviMessages[NaviMsgCount] = { { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", "%cDie %yGeister-Prüfung %cin %pGanons&Schloss %chat irgendwo eine&%wversteckte Kiste%c. Weißt du schon&wo?", - "%cL'%yÉpreuve de l'Esprit%c dans le %pChâteau&de Ganon %ca un coffre caché quelque&part.&Je suppose que tu&le savais déjà?" }, + "%cL'%yÉpreuve de l'Esprit%c dans le %pChâteau&de Ganon %ca un coffre caché quelque&part. Je suppose que tu le savais&déjà?" }, { "%cYou know the %wBombchu Bowling&Alley%c? I heard %wonly two of the &prizes %care worthwhile. The rest &is junk!", "%cKennst du die %wMinenbowlingbahn%c?&Ich habe gehört dass sich nur &%wzwei der Preise%c lohnen. Der Rest&ist Krimskrams!", From d56e712d078ac0396e6dfcecaed71d96374bc76e Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Wed, 17 Aug 2022 11:27:17 -0700 Subject: [PATCH 098/212] spacing --- soh/soh/OTRGlobals.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 1040a3fa9..2ea662316 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1551,7 +1551,6 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } else if (textId >= 0x0140 && textId <= 0x015F) { messageEntry = Randomizer_GetNaviMessage(); } - } if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) { if (CVar_GetS32("gInjectSkulltulaCount", 0) != 0) { From f9766fa4a6f28a469ac71adb3d1bc771061e83f8 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 17 Aug 2022 22:30:21 +0200 Subject: [PATCH 099/212] Initial language support and setup for randomizing --- .../Enhancements/randomizer/randomizer.cpp | 14 +++++----- soh/soh/OTRGlobals.cpp | 27 +++++++++++++++++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index b58eabe55..2e0280b4f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4629,23 +4629,23 @@ void CreateRupeeMessages() { for (u8 rupee : rupees) { switch (rupee) { case TEXT_BLUE_RUPEE: - rupeeText = "\x05\x03 5 BitCoin\x05\x00 "; + rupeeText = "\x05\x03 5 %RUPEE%\x05\x00"; break; case TEXT_RED_RUPEE: - rupeeText = "\x05\x01 20 Moneys\x05\x00 "; + rupeeText = "\x05\x01 20 %RUPEE%\x05\x00"; break; case TEXT_PURPLE_RUPEE: - rupeeText = "\x05\x05 50 Gummybears\x05\x00 "; + rupeeText = "\x05\x05 50 %RUPEE%\x05\x00"; break; case TEXT_HUGE_RUPEE: - rupeeText = "\x05\x06 200 Cornflakes\x05\x00 "; + rupeeText = "\x05\x06 200 %RUPEE%\x05\x00"; break; } customMessageManager->CreateMessage(Randomizer::rupeeMessageTableID, rupee, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, - "You found" + rupeeText + "!", - "You found" + rupeeText + "!", - "You found" + rupeeText + "!" + "You found" + rupeeText + " !", + "Du fandest" + rupeeText + " !", + "Tu as trouvé" + rupeeText + " !" }); } } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 663f7ada0..92db032d1 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1447,8 +1447,32 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); } +extern "C" std::string Randomizer_InsertRupeeName(std::string message, int language) { + std::string replaceWith; + switch (language) { + case LANGUAGE_ENG: + replaceWith = "Bananas"; + break; + case LANGUAGE_GER: + replaceWith = "Sauerkraut"; + break; + case LANGUAGE_FRA: + replaceWith = "Baguettes"; + break; + } + std::string replaceString = "%RUPEE%"; + size_t pos = message.find(replaceString); + size_t len = replaceString.length(); + message.replace(pos, len, replaceWith); + return message; +} + extern "C" CustomMessageEntry Randomizer_GetRupeeMessage(u16 rupeeTextId) { - return CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); + CustomMessageEntry messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); + messageEntry.english = Randomizer_InsertRupeeName(messageEntry.english, LANGUAGE_ENG); + messageEntry.german = Randomizer_InsertRupeeName(messageEntry.german, LANGUAGE_GER); + messageEntry.french = Randomizer_InsertRupeeName(messageEntry.french, LANGUAGE_FRA); + return messageEntry; } extern "C" CustomMessageEntry Randomizer_GetAltarMessage() { @@ -1576,7 +1600,6 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { case LANGUAGE_GER: return msgCtx->msgLength = font->msgLength = CopyStringToCharBuffer(messageEntry.german, buffer, maxBufferSize); - case LANGUAGE_ENG: default: return msgCtx->msgLength = font->msgLength = From c1cec5a44a2750911fcd7ebb571561831df5f7f3 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 17 Aug 2022 23:30:51 +0200 Subject: [PATCH 100/212] First fully working implementation --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- soh/soh/OTRGlobals.cpp | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 2e0280b4f..9a4eb155b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4645,7 +4645,7 @@ void CreateRupeeMessages() { { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, "You found" + rupeeText + " !", "Du fandest" + rupeeText + " !", - "Tu as trouvé" + rupeeText + " !" + "Vous obtenez" + rupeeText + " !" }); } } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 92db032d1..1c6e22fa2 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1449,15 +1449,25 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { extern "C" std::string Randomizer_InsertRupeeName(std::string message, int language) { std::string replaceWith; - switch (language) { + const char* englishRupeeNames[20] = { + "Rupees", "BitCoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Pokémon", "Emeralds", "Bucks", + "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", "DogeCoins", "Mushrooms", "Experience", "Friends" + }; + const char* germanRupeeNames[1] = { "Rupees" }; + const char* frenchRupeeNames[1] = { "Rupees" }; + int randomIndex; + switch (language) { case LANGUAGE_ENG: - replaceWith = "Bananas"; + randomIndex = gSaveContext.naviTimer % (sizeof(englishRupeeNames) / sizeof(englishRupeeNames[0])); + replaceWith = englishRupeeNames[randomIndex]; break; case LANGUAGE_GER: - replaceWith = "Sauerkraut"; + randomIndex = gSaveContext.naviTimer % (sizeof(germanRupeeNames) / sizeof(germanRupeeNames[0])); + replaceWith = germanRupeeNames[randomIndex]; break; case LANGUAGE_FRA: - replaceWith = "Baguettes"; + randomIndex = gSaveContext.naviTimer % (sizeof(frenchRupeeNames) / sizeof(frenchRupeeNames[0])); + replaceWith = frenchRupeeNames[randomIndex]; break; } std::string replaceString = "%RUPEE%"; From e25fcc645b39a4c34c6917862cdb94b789af64e6 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 17 Aug 2022 23:57:31 +0200 Subject: [PATCH 101/212] More names, fixed translations --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- soh/soh/OTRGlobals.cpp | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 9a4eb155b..4acf48cd6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4644,7 +4644,7 @@ void CreateRupeeMessages() { customMessageManager->CreateMessage(Randomizer::rupeeMessageTableID, rupee, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, "You found" + rupeeText + " !", - "Du fandest" + rupeeText + " !", + "Du hast" + rupeeText + " gefunden!", "Vous obtenez" + rupeeText + " !" }); } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 1c6e22fa2..4829da8a4 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1449,12 +1449,13 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { extern "C" std::string Randomizer_InsertRupeeName(std::string message, int language) { std::string replaceWith; - const char* englishRupeeNames[20] = { - "Rupees", "BitCoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Pokémon", "Emeralds", "Bucks", - "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", "DogeCoins", "Mushrooms", "Experience", "Friends" + const char* englishRupeeNames[30] = { + "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", "Emeralds", "Bucks", + "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", "Dogecoin", "Mushrooms", "Experience", "Friends", + "Coins", "Rings", "Gil", "Pokédollars", "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys" }; - const char* germanRupeeNames[1] = { "Rupees" }; - const char* frenchRupeeNames[1] = { "Rupees" }; + const char* germanRupeeNames[1] = { "Rubine" }; + const char* frenchRupeeNames[1] = { "Rubis" }; int randomIndex; switch (language) { case LANGUAGE_ENG: From 589f2be0f1d7109c1d0bb6fd7ccc993bc7f6c751 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 18 Aug 2022 00:09:54 +0200 Subject: [PATCH 102/212] More names --- soh/soh/OTRGlobals.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 4829da8a4..e1bb32052 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1449,10 +1449,11 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { extern "C" std::string Randomizer_InsertRupeeName(std::string message, int language) { std::string replaceWith; - const char* englishRupeeNames[30] = { + const char* englishRupeeNames[34] = { "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", "Dogecoin", "Mushrooms", "Experience", "Friends", - "Coins", "Rings", "Gil", "Pokédollars", "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys" + "Coins", "Rings", "Gil", "Pokédollars", "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", + "Smackaroos", "Zorkmids", "Zenny", "Bones" }; const char* germanRupeeNames[1] = { "Rubine" }; const char* frenchRupeeNames[1] = { "Rubis" }; From cca32b7a431b6c2ef0fa32d566da6cfb85051ae5 Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Thu, 18 Aug 2022 00:35:54 +0200 Subject: [PATCH 103/212] ADD: Baguette money --- soh/soh/OTRGlobals.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index e1bb32052..baa55ccc2 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1456,7 +1456,10 @@ extern "C" std::string Randomizer_InsertRupeeName(std::string message, int langu "Smackaroos", "Zorkmids", "Zenny", "Bones" }; const char* germanRupeeNames[1] = { "Rubine" }; - const char* frenchRupeeNames[1] = { "Rubis" }; + const char* frenchRupeeNames[1] = { "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", + "Diamants", "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", "Pokédollars", + "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", "Champignons", "Blés", "Halos", + "Munnies", "Orens", "Florens", "Crédits", "Galds", "Bling", "Orbes", "Baguettes", "Croissants" }; int randomIndex; switch (language) { case LANGUAGE_ENG: From a1cc0da6d3f021443eb2095f63a2a31f4e13df59 Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Thu, 18 Aug 2022 00:39:15 +0200 Subject: [PATCH 104/212] TWEAK: Forgot the array size --- soh/soh/OTRGlobals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index baa55ccc2..f4eff9b8b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1456,7 +1456,7 @@ extern "C" std::string Randomizer_InsertRupeeName(std::string message, int langu "Smackaroos", "Zorkmids", "Zenny", "Bones" }; const char* germanRupeeNames[1] = { "Rubine" }; - const char* frenchRupeeNames[1] = { "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", + const char* frenchRupeeNames[36] = { "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", "Diamants", "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", "Pokédollars", "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", "Champignons", "Blés", "Halos", "Munnies", "Orens", "Florens", "Crédits", "Galds", "Bling", "Orbes", "Baguettes", "Croissants" }; From 7ee281182aba7571e8ee6978d84888a09a4d52f4 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 17 Aug 2022 21:43:52 -0400 Subject: [PATCH 105/212] Replaces Zora's Sapphire with JabuJabu's Dungeon Reward. Repalces the model for Zora's Sapphire with the Dungeon Reward for JabuJabu's Belly when you find it in the miniboss room. --- soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index 95bdf6e50..5e2921729 100644 --- a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -141,6 +141,9 @@ f32 DemoEffect_InterpolateCsFrames(GlobalContext* globalCtx, s32 csActionId) { */ void DemoEffect_InitJewel(GlobalContext* globalCtx, DemoEffect* this) { this->initDrawFunc = DemoEffect_DrawJewel; + if (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) { + this->initDrawFunc = DemoEffect_DrawGetItem; + } if (!LINK_IS_ADULT) { this->initUpdateFunc = DemoEffect_UpdateJewelChild; } else { @@ -152,7 +155,7 @@ void DemoEffect_InitJewel(GlobalContext* globalCtx, DemoEffect* this) { Actor_SetScale(&this->actor, 0.10f); } this->csActionId = 1; - this->actor.shape.rot.x = 16384; + this->actor.shape.rot.x = (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) ? 0 : 16384; DemoEffect_InitJewelColor(this); this->jewel.alpha = 0; this->jewelCsRotation.x = this->jewelCsRotation.y = this->jewelCsRotation.z = 0; @@ -2083,6 +2086,10 @@ void DemoEffect_DrawGetItem(Actor* thisx, GlobalContext* globalCtx) { this->getItem.isLoaded = 1; return; } + if (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) { + GetItemID getItemID = Randomizer_GetItemIdFromKnownCheck(RC_BARINADE, RG_ZORA_SAPPHIRE); + this->getItem.drawId = Randomizer_GetItemModelFromId(getItemID); + } func_8002EBCC(thisx, globalCtx, 0); func_8002ED80(thisx, globalCtx, 0); GetItem_Draw(globalCtx, this->getItem.drawId); From bb6135fd2bea1452dd2718a80951cd8ec4e10db2 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Wed, 17 Aug 2022 22:07:51 -0700 Subject: [PATCH 106/212] Spacing --- soh/soh/Enhancements/randomizer/randomizer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index b18e2df99..b8e9e614f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4786,5 +4786,4 @@ CustomMessageMinimal NaviMessages[NaviMsgCount] = { { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", "%cIch habe gehört dass die Stelle&%wfeuchten Bodens %cim %bZora-Fluss %cals&einzige keine %rSkulltula %cbeherbergt.", "%cJ'ai entendu dire que la %wterre meuble&%cqui se trouve à la %bRivière Zora %cest&la seule qui ne contienne pas&d'%raraignée%c." }, - }; From a2243634cd273bd0e56f8a541766a427a1da8942 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 18 Aug 2022 11:54:02 +0200 Subject: [PATCH 107/212] Rand(), option to disable, attempted fix special chars --- libultraship/libultraship/ImGuiImpl.cpp | 4 ++++ soh/soh/OTRGlobals.cpp | 26 +++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index ac7ab9d73..7f9b3765c 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1912,6 +1912,10 @@ namespace SohImGui { "(medallions/stones/songs). Note that these fanfares\n" "are longer than usual." ); + PaddedEnhancementCheckbox("Disable Random Rupee Names", "gRandoDisableRandomRupeeNames", true, false); + Tooltip( + "Disables the random rupee names in the textbox when obtaining rupees." + ); ImGui::EndMenu(); } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index f4eff9b8b..8a6fdd44c 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1455,23 +1455,27 @@ extern "C" std::string Randomizer_InsertRupeeName(std::string message, int langu "Coins", "Rings", "Gil", "Pokédollars", "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", "Smackaroos", "Zorkmids", "Zenny", "Bones" }; - const char* germanRupeeNames[1] = { "Rubine" }; - const char* frenchRupeeNames[36] = { "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", - "Diamants", "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", "Pokédollars", - "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", "Champignons", "Blés", "Halos", - "Munnies", "Orens", "Florens", "Crédits", "Galds", "Bling", "Orbes", "Baguettes", "Croissants" }; + const char* germanRupeeNames[1] = { + "Rubine" + }; + const char* frenchRupeeNames[36] = { + "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", + "Diamants", "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", "Pokédollars", + "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", "Champignons", "Blés", "Halos", + "Munnies", "Orens", "Florens", "Crédits", "Galds", "Bling", "Orbes", "Baguettes", "Croissants" + }; int randomIndex; switch (language) { case LANGUAGE_ENG: - randomIndex = gSaveContext.naviTimer % (sizeof(englishRupeeNames) / sizeof(englishRupeeNames[0])); + randomIndex = rand() % (sizeof(englishRupeeNames) / sizeof(englishRupeeNames[0])); replaceWith = englishRupeeNames[randomIndex]; break; case LANGUAGE_GER: - randomIndex = gSaveContext.naviTimer % (sizeof(germanRupeeNames) / sizeof(germanRupeeNames[0])); + randomIndex = rand() % (sizeof(germanRupeeNames) / sizeof(germanRupeeNames[0])); replaceWith = germanRupeeNames[randomIndex]; break; case LANGUAGE_FRA: - randomIndex = gSaveContext.naviTimer % (sizeof(frenchRupeeNames) / sizeof(frenchRupeeNames[0])); + randomIndex = rand() % (sizeof(frenchRupeeNames) / sizeof(frenchRupeeNames[0])); replaceWith = frenchRupeeNames[randomIndex]; break; } @@ -1479,6 +1483,7 @@ extern "C" std::string Randomizer_InsertRupeeName(std::string message, int langu size_t pos = message.find(replaceString); size_t len = replaceString.length(); message.replace(pos, len, replaceWith); + CustomMessageManager::Instance->FormatCustomMessage(message); return message; } @@ -1583,8 +1588,9 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { messageEntry = Randomizer_GetScrubMessage(textId); - } else if (textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE || - textId == TEXT_HUGE_RUPEE) { + } else if (!CVar_GetS32("gRandoDisableRandomRupeeNames", 0) && + (textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE || + textId == TEXT_HUGE_RUPEE)) { messageEntry = Randomizer_GetRupeeMessage(textId); } } From 289a6e5a82c65895d8f9442bbd4807d34103b340 Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 06:15:02 -0400 Subject: [PATCH 108/212] start on RC object stuff --- soh/CMakeLists.txt | 2 + .../Enhancements/randomizer/randomizer.cpp | 829 ++---------------- .../Enhancements/randomizer/randomizerTypes.h | 2 + .../randomizer/randomizer_check_objects.cpp | 757 ++++++++++++++++ .../randomizer/randomizer_check_objects.h | 43 + 5 files changed, 866 insertions(+), 767 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp create mode 100644 soh/soh/Enhancements/randomizer/randomizer_check_objects.h diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 93586ce55..fec894735 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -180,6 +180,7 @@ set(Header_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer.h" "soh/Enhancements/randomizer/randomizer_item_tracker.h" "soh/Enhancements/randomizer/adult_trade_shuffle.h" + "soh/Enhancements/randomizer/randomizer_check_objects.h" ) source_group("Header Files\\soh\\Enhancements\\randomizer" FILES ${Header_Files__soh__Enhancements__randomizer}) @@ -278,6 +279,7 @@ set(Source_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer.cpp" "soh/Enhancements/randomizer/randomizer_item_tracker.cpp" "soh/Enhancements/randomizer/adult_trade_shuffle.c" + "soh/Enhancements/randomizer/randomizer_check_objects.cpp" ) source_group("Source Files\\soh\\Enhancements\\randomizer" FILES ${Source_Files__soh__Enhancements__randomizer}) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 0de33baf4..6f18e878e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -16,11 +16,14 @@ #include "Lib/ImGui/imgui_internal.h" #include #include +#include "randomizer_check_objects.h" using json = nlohmann::json; using namespace std::literals::string_literals; std::unordered_map gSeedTextures; +std::unordered_map SpoilerfileCheckNameToEnum; +std::set excludedLocations; u8 generated; @@ -58,6 +61,10 @@ Randomizer::Randomizer() { Sprite ootOcarinaSprite = { dgOcarinaofTimeIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b, 9 }; gSeedTextures[9] = ootOcarinaSprite; + + for (auto it : RandomizerCheckObjects::GetAllRCObjects()) { + SpoilerfileCheckNameToEnum[it.second.rcSpoilerName] = it.first; + } } Sprite* Randomizer::GetSeedTexture(uint8_t index) { @@ -69,749 +76,6 @@ Randomizer::~Randomizer() { this->itemLocations.clear(); } -std::unordered_map SpoilerfileCheckNameToEnum = { - { "Invalid Location", RC_UNKNOWN_CHECK }, - { "KF Kokiri Sword Chest", RC_KF_KOKIRI_SWORD_CHEST }, - { "KF Mido Top Left Chest", RC_KF_MIDOS_TOP_LEFT_CHEST }, - { "KF Mido Top Right Chest", RC_KF_MIDOS_TOP_RIGHT_CHEST }, - { "KF Mido Bottom Left Chest", RC_KF_MIDOS_BOTTOM_LEFT_CHEST }, - { "KF Mido Bottom Right Chest", RC_KF_MIDOS_BOTTOM_RIGHT_CHEST }, - { "KF Storms Grotto Chest", RC_KF_STORMS_GROTTO_CHEST }, - { "LW Near Shortcuts Grotto Chest", RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST }, - { "LW Skull Kid", RC_LW_SKULL_KID }, - { "LW Trade Cojiro", RC_LW_TRADE_COJIRO }, - { "LW Trade Odd Potion", RC_LW_TRADE_ODD_POTION }, - { "LW Ocarina Memory Game", RC_LW_OCARINA_MEMORY_GAME }, - { "LW Target in Woods", RC_LW_TARGET_IN_WOODS }, - { "LW Deku Scrub Near Deku Theater Right", RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT }, - { "LW Deku Scrub Near Deku Theater Left", RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT }, - { "LW Deku Scrub Near Bridge", RC_LW_DEKU_SCRUB_NEAR_BRIDGE }, - { "LW Deku Scrub Grotto Rear", RC_LW_DEKU_SCRUB_GROTTO_REAR }, - { "LW Deku Scrub Grotto Front", RC_LW_DEKU_SCRUB_GROTTO_FRONT }, - { "Deku Theater Skull Mask", RC_DEKU_THEATER_SKULL_MASK }, - { "Deku Theater Mask of Truth", RC_DEKU_THEATER_MASK_OF_TRUTH }, - { "SFM Wolfos Grotto Chest", RC_SFM_WOLFOS_GROTTO_CHEST }, - { "SFM Deku Scrub Grotto Rear", RC_SFM_DEKU_SCRUB_GROTTO_REAR }, - { "SFM Deku Scrub Grotto Front", RC_SFM_DEKU_SCRUB_GROTTO_FRONT }, - { "HF Southeast Grotto Chest", RC_HF_SOUTHEAST_GROTTO_CHEST }, - { "HF Open Grotto Chest", RC_HF_OPEN_GROTTO_CHEST }, - { "HF Near Market Grotto Chest", RC_HF_NEAR_MARKET_GROTTO_CHEST }, - { "HF Ocarina of Time Item", RC_HF_OCARINA_OF_TIME_ITEM }, - { "HF Tektite Grotto Freestanding PoH", RC_HF_TEKTITE_GROTTO_FREESTANDING_POH }, - { "HF Deku Scrub Grotto", RC_HF_DEKU_SCRUB_GROTTO }, - { "LH Child Fishing", RC_LH_CHILD_FISHING }, - { "LH Adult Fishing", RC_LH_ADULT_FISHING }, - { "LH Lab Dive", RC_LH_LAB_DIVE }, - { "LH Lab Trade Eyeball Frog", RC_LH_TRADE_FROG }, - { "LH Underwater Item", RC_LH_UNDERWATER_ITEM }, - { "LH Sun", RC_LH_SUN }, - { "LH Freestanding PoH", RC_LH_FREESTANDING_POH }, - { "LH Deku Scrub Grotto Left", RC_LH_DEKU_SCRUB_GROTTO_LEFT }, - { "LH Deku Scrub Grotto Right", RC_LH_DEKU_SCRUB_GROTTO_RIGHT }, - { "LH Deku Scrub Grotto Center", RC_LH_DEKU_SCRUB_GROTTO_CENTER }, - { "GV Chest", RC_GV_CHEST }, - { "GV Trade Saw", RC_GV_TRADE_SAW }, - { "GV Waterfall Freestanding PoH", RC_GV_WATERFALL_FREESTANDING_POH }, - { "GV Crate Freestanding PoH", RC_GV_CRATE_FREESTANDING_POH }, - { "GV Deku Scrub Grotto Rear", RC_GV_DEKU_SCRUB_GROTTO_REAR }, - { "GV Deku Scrub Grotto Front", RC_GV_DEKU_SCRUB_GROTTO_FRONT }, - { "GF Chest", RC_GF_CHEST }, - { "GF HBA 1000 Points", RC_GF_HBA_1000_POINTS }, - { "GF HBA 1500 Points", RC_GF_HBA_1500_POINTS }, - { "GF Gerudo Membership Card", RC_GF_GERUDO_MEMBERSHIP_CARD }, - { "GF North F1 Carpenter", RC_GF_NORTH_F1_CARPENTER }, - { "GF North F2 Carpenter", RC_GF_NORTH_F2_CARPENTER }, - { "GF South F1 Carpenter", RC_GF_SOUTH_F1_CARPENTER }, - { "GF South F2 Carpenter", RC_GF_SOUTH_F2_CARPENTER }, - { "Wasteland Chest", RC_WASTELAND_CHEST }, - { "Wasteland Carpet Salesman", RC_WASTELAND_BOMBCHU_SALESMAN }, - { "Colossus Freestanding PoH", RC_COLOSSUS_FREESTANDING_POH }, - { "Colossus Deku Scrub Grotto Rear", RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR }, - { "Colossus Deku Scrub Grotto Front", RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT }, - { "MK Treasure Chest Game Reward", RC_MARKET_TREASURE_CHEST_GAME_REWARD }, - { "MK Bombchu Bowling First Prize", RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE }, - { "MK Bombchu Bowling Second Prize", RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE }, - { "MK Bombchu Bowling Bombchus", RC_UNKNOWN_CHECK }, - { "MK Lost Dog", RC_MARKET_LOST_DOG }, - { "MK Shooting Gallery", RC_MARKET_SHOOTING_GALLERY_REWARD }, - { "MK 10 Big Poes", RC_MARKET_10_BIG_POES }, - { "MK Chest Game First Room Chest", RC_MARKET_TREASURE_CHEST_GAME_ITEM_1 }, - { "MK Chest Game Second Room Chest", RC_MARKET_TREASURE_CHEST_GAME_ITEM_2 }, - { "MK Chest Game Third Room Chest", RC_MARKET_TREASURE_CHEST_GAME_ITEM_3 }, - { "MK Chest Game Fourth Room Chest", RC_MARKET_TREASURE_CHEST_GAME_ITEM_4 }, - { "MK Chest Game Fifth Room Chest", RC_MARKET_TREASURE_CHEST_GAME_ITEM_5 }, - { "HC Malon Egg", RC_HC_MALON_EGG }, - { "HC Zeldas Letter", RC_HC_ZELDAS_LETTER }, - { "Kak Redead Grotto Chest", RC_KAK_REDEAD_GROTTO_CHEST }, - { "Kak Open Grotto Chest", RC_KAK_OPEN_GROTTO_CHEST }, - { "Kak 10 Gold Skulltula Reward", RC_KAK_10_GOLD_SKULLTULA_REWARD }, - { "Kak 20 Gold Skulltula Reward", RC_KAK_20_GOLD_SKULLTULA_REWARD }, - { "Kak 30 Gold Skulltula Reward", RC_KAK_30_GOLD_SKULLTULA_REWARD }, - { "Kak 40 Gold Skulltula Reward", RC_KAK_40_GOLD_SKULLTULA_REWARD }, - { "Kak 50 Gold Skulltula Reward", RC_KAK_50_GOLD_SKULLTULA_REWARD }, - { "Kak Man on Roof", RC_KAK_MAN_ON_ROOF }, - { "Kak Shooting Gallery Reward", RC_KAK_SHOOTING_GALLERY_REWARD }, - { "Kak Trade Odd Mushroom", RC_KAK_TRADE_ODD_MUSHROOM }, - { "Kak Anju as Adult", RC_KAK_ANJU_AS_ADULT }, - { "Kak Anju as Child", RC_KAK_ANJU_AS_CHILD }, - { "Kak Trade Pocket Cucco", RC_KAK_TRADE_POCKET_CUCCO }, - { "Kak Impas House Freestanding PoH", RC_KAK_IMPAS_HOUSE_FREESTANDING_POH }, - { "Kak Windmill Freestanding PoH", RC_KAK_WINDMILL_FREESTANDING_POH }, - { "GY Shield Grave Chest", RC_GRAVEYARD_SHIELD_GRAVE_CHEST }, - { "GY Heart Piece Grave Chest", RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST }, - { "GY Composers Grave Chest", RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST }, - { "GY Hookshot Chest", RC_GRAVEYARD_HOOKSHOT_CHEST }, - { "GY Dampe Race Freestanding PoH", RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH }, - { "GY Freestanding PoH", RC_GRAVEYARD_FREESTANDING_POH }, - { "GY Dampe Gravedigging Tour", RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR }, - { "DMT Chest", RC_DMT_CHEST }, - { "DMT Storms Grotto Chest", RC_DMT_STORMS_GROTTO_CHEST }, - { "DMT Trade Broken Sword", RC_DMT_TRADE_BROKEN_SWORD }, - { "DMT Trade Eyedrops", RC_DMT_TRADE_EYEDROPS }, - { "DMT Trade Claim Check", RC_DMT_TRADE_CLAIM_CHECK }, - { "DMT Freestanding PoH", RC_DMT_FREESTANDING_POH }, - { "GC Maze Left Chest", RC_GC_MAZE_LEFT_CHEST }, - { "GC Maze Right Chest", RC_GC_MAZE_RIGHT_CHEST }, - { "GC Maze Center Chest", RC_GC_MAZE_CENTER_CHEST }, - { "GC Rolling Goron as Child", RC_GC_ROLLING_GORON_AS_CHILD }, - { "GC Rolling Goron as Adult", RC_GC_ROLLING_GORON_AS_ADULT }, - { "GC Darunias Joy", RC_GC_DARUNIAS_JOY }, - { "GC Pot Freestanding PoH", RC_GC_POT_FREESTANDING_POH }, - { "GC Deku Scrub Grotto Left", RC_GC_DEKU_SCRUB_GROTTO_LEFT }, - { "GC Deku Scrub Grotto Right", RC_GC_DEKU_SCRUB_GROTTO_RIGHT }, - { "GC Deku Scrub Grotto Center", RC_GC_DEKU_SCRUB_GROTTO_CENTER }, - { "GC Medigoron", RC_GC_MEDIGORON }, - { "DMC Upper Grotto Chest", RC_DMC_UPPER_GROTTO_CHEST }, - { "DMC Wall Freestanding PoH", RC_DMC_WALL_FREESTANDING_POH }, - { "DMC Volcano Freestanding PoH", RC_DMC_VOLCANO_FREESTANDING_POH }, - { "DMC Deku Scrub", RC_DMC_DEKU_SCRUB }, - { "DMC Deku Scrub Grotto Left", RC_DMC_DEKU_SCRUB_GROTTO_LEFT }, - { "DMC Deku Scrub Grotto Right", RC_DMC_DEKU_SCRUB_GROTTO_RIGHT }, - { "DMC Deku Scrub Grotto Center", RC_DMC_DEKU_SCRUB_GROTTO_CENTER }, - { "ZR Open Grotto Chest", RC_ZR_OPEN_GROTTO_CHEST }, - { "ZR Magic Bean Salesman", RC_ZR_MAGIC_BEAN_SALESMAN }, - { "ZR Frogs Zelda's Lullaby", RC_ZR_FROGS_ZELDAS_LULLABY }, - { "ZR Frogs Epona's Song", RC_ZR_FROGS_EPONAS_SONG }, - { "ZR Frogs Saria's Song", RC_ZR_FROGS_SARIAS_SONG }, - { "ZR Frogs Sun's Song", RC_ZR_FROGS_SUNS_SONG }, - { "ZR Frogs Song of Time", RC_ZR_FROGS_SONG_OF_TIME }, - { "ZR Frogs in the Rain", RC_ZR_FROGS_IN_THE_RAIN }, - { "ZR Frogs Ocarina Game", RC_ZR_FROGS_OCARINA_GAME }, - { "ZR Near Open Grotto Freestanding PoH", RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH }, - { "ZR Near Domain Freestanding PoH", RC_ZR_NEAR_DOMAIN_FREESTANDING_POH }, - { "ZR Deku Scrub Grotto Rear", RC_ZR_DEKU_SCRUB_GROTTO_REAR }, - { "ZR Deku Scrub Grotto Front", RC_ZR_DEKU_SCRUB_GROTTO_FRONT }, - { "ZD Chest", RC_ZD_CHEST }, - { "ZD Diving Minigame", RC_ZD_DIVING_MINIGAME }, - { "ZD King Zora Thawed", RC_ZD_KING_ZORA_THAWED }, - { "ZD Trade Prescription", RC_ZD_TRADE_PRESCRIPTION }, - { "ZF Iceberg Freestanding PoH", RC_ZF_ICEBERC_FREESTANDING_POH }, - { "ZF Bottom Freestanding PoH", RC_ZF_BOTTOM_FREESTANDING_POH }, - { "LLR Talons Chickens", RC_LLR_TALONS_CHICKENS }, - { "LLR Freestanding PoH", RC_LLR_FREESTANDING_POH }, - { "LLR Deku Scrub Grotto Left", RC_LLR_DEKU_SCRUB_GROTTO_LEFT }, - { "LLR Deku Scrub Grotto Right", RC_LLR_DEKU_SCRUB_GROTTO_RIGHT }, - { "LLR Deku Scrub Grotto Center", RC_LLR_DEKU_SCRUB_GROTTO_CENTER }, - { "Deku Tree Map Chest", RC_DEKU_TREE_MAP_CHEST }, - { "Deku Tree Compass Chest", RC_DEKU_TREE_COMPASS_CHEST }, - { "Deku Tree Compass Room Side Chest", RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST }, - { "Deku Tree Basement Chest", RC_DEKU_TREE_BASEMENT_CHEST }, - { "Deku Tree Slingshot Chest", RC_DEKU_TREE_SLINGSHOT_CHEST }, - { "Deku Tree Slingshot Room Side Chest", RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST }, - { "Deku Tree MQ Map Chest", RC_DEKU_TREE_MQ_MAP_CHEST }, - { "Deku Tree MQ Compass Chest", RC_DEKU_TREE_MQ_COMPASS_CHEST }, - { "Deku Tree MQ Slingshot Chest", RC_DEKU_TREE_MQ_SLINGSHOT_CHEST }, - { "Deku Tree MQ Slingshot Room Back Chest", RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST }, - { "Deku Tree MQ Basement Chest", RC_DEKU_TREE_MQ_BASEMENT_CHEST }, - { "Deku Tree MQ Before Spinning Log Chest", RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST }, - { "Deku Tree MQ After Spinning Log Chest", RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST }, - { "Deku Tree MQ Deku Scrub", RC_DEKU_TREE_MQ_DEKU_SCRUB }, - { "Dodongos Cavern Boss Room Chest", RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST }, - { "Dodongos Cavern Map Chest", RC_DODONGOS_CAVERN_MAP_CHEST }, - { "Dodongos Cavern Compass Chest", RC_DODONGOS_CAVERN_COMPASS_CHEST }, - { "Dodongos Cavern Bomb Flower Platform Chest", RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST }, - { "Dodongos Cavern Bomb Bag Chest", RC_DODONGOS_CAVERN_BOMB_BAG_CHEST }, - { "Dodongos Cavern End Of Bridge Chest", RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST }, - { "Dodongos Cavern Deku Scrub Near Bomb Bag Left", RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT }, - { "Dodongos Cavern Deku Scrub Side Room Near Dodongos", RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS }, - { "Dodongos Cavern Deku Scrub Near Bomb Bag Right", RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT }, - { "Dodongos Cavern Deku Scrub Lobby", RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY }, - { "Dodongos Cavern MQ Map Chest", RC_DODONGOS_CAVERN_MQ_MAP_CHEST }, - { "Dodongos Cavern MQ Bomb Bag Chest", RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST }, - { "Dodongos Cavern MQ Compass Chest", RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST }, - { "Dodongos Cavern MQ Larvae Room Chest", RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST }, - { "Dodongos Cavern MQ Torch Puzzle Room Chest", RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST }, - { "Dodongos Cavern MQ Under Grave Chest", RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST }, - { "Dodongos Cavern Deku Scrub Lobby Rear", RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR }, - { "Dodongos Cavern Deku Scrub Lobby Front", RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT }, - { "Dodongos Cavern Deku Scrub Staircase", RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE }, - { "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos", - RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS }, - { "Jabu Jabus Belly Map Chest", RC_JABU_JABUS_BELLY_MAP_CHEST }, - { "Jabu Jabus Belly Compass Chest", RC_JABU_JABUS_BELLY_COMPASS_CHEST }, - { "Jabu Jabus Belly Boomerang Chest", RC_JABU_JABUS_BELLY_BOOMERANG_CHEST }, - { "Jabu Jabus Belly Deku Scrub", RC_JABU_JABUS_BELLY_DEKU_SCRUB }, - { "Jabu Jabus Belly MQ First Room Side Chest", RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST }, - { "Jabu Jabus Belly MQ Map Chest", RC_JABU_JABUS_BELLY_MQ_MAP_CHEST }, - { "Jabu Jabus Belly MQ Second Room Lower Chest", RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST }, - { "Jabu Jabus Belly MQ Compass Chest", RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST }, - { "Jabu Jabus Belly MQ Second Room Upper Chest", RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST }, - { "Jabu Jabus Belly MQ Basement Near Switches Chest", RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST }, - { "Jabu Jabus Belly MQ Basement Near Vines Chest", RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST }, - { "Jabu Jabus Belly MQ Near Boss Chest", RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST }, - { "Jabu Jabus Belly MQ Falling Like Like Room Chest", RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST }, - { "Jabu Jabus Belly MQ Boomerang Room Small Chest", RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST }, - { "Jabu Jabus Belly MQ Boomerang Chest", RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST }, - { "Forest Temple First Room Chest", RC_FOREST_TEMPLE_FIRST_ROOM_CHEST }, - { "Forest Temple First Stalfos Chest", RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST }, - { "Forest Temple Raised Island Courtyard Chest", RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST }, - { "Forest Temple Map Chest", RC_FOREST_TEMPLE_MAP_CHEST }, - { "Forest Temple Well Chest", RC_FOREST_TEMPLE_WELL_CHEST }, - { "Forest Temple Falling Ceiling Room Chest", RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST }, - { "Forest Temple Eye Switch Chest", RC_FOREST_TEMPLE_EYE_SWITCH_CHEST }, - { "Forest Temple Boss Key Chest", RC_FOREST_TEMPLE_BOSS_KEY_CHEST }, - { "Forest Temple Floormaster Chest", RC_FOREST_TEMPLE_FLOORMASTER_CHEST }, - { "Forest Temple Bow Chest", RC_FOREST_TEMPLE_BOW_CHEST }, - { "Forest Temple Red Poe Chest", RC_FOREST_TEMPLE_RED_POE_CHEST }, - { "Forest Temple Blue Poe Chest", RC_FOREST_TEMPLE_BLUE_POE_CHEST }, - { "Forest Temple Basement Chest", RC_FOREST_TEMPLE_BASEMENT_CHEST }, - { "Forest Temple MQ First Room Chest", RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST }, - { "Forest Temple MQ Wolfos Chest", RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST }, - { "Forest Temple MQ Bow Chest", RC_FOREST_TEMPLE_MQ_BOW_CHEST }, - { "Forest Temple MQ Raised Island Courtyard Lower Chest", RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST }, - { "Forest Temple MQ Raised Island Courtyard Upper Chest", RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST }, - { "Forest Temple MQ Well Chest", RC_FOREST_TEMPLE_MQ_WELL_CHEST }, - { "Forest Temple MQ Map Chest", RC_FOREST_TEMPLE_MQ_MAP_CHEST }, - { "Forest Temple MQ Compass Chest", RC_FOREST_TEMPLE_MQ_COMPASS_CHEST }, - { "Forest Temple MQ Falling Ceiling Room Chest", RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST }, - { "Forest Temple MQ Basement Chest", RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST }, - { "Forest Temple MQ Redead Chest", RC_FOREST_TEMPLE_MQ_REDEAD_CHEST }, - { "Forest Temple MQ Boss Key Chest", RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST }, - { "Fire Temple Near Boss Chest", RC_FIRE_TEMPLE_NEAR_BOSS_CHEST }, - { "Fire Temple Flare Dancer Chest", RC_FIRE_TEMPLE_FLARE_DANCER_CHEST }, - { "Fire Temple Boss Key Chest", RC_FIRE_TEMPLE_BOSS_KEY_CHEST }, - { "Fire Temple Big Lava Room Blocked Door Chest", RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST }, - { "Fire Temple Big Lava Room Lower Open Door Chest", RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST }, - { "Fire Temple Boulder Maze Lower Chest", RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST }, - { "Fire Temple Boulder Maze Upper Chest", RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST }, - { "Fire Temple Boulder Maze Side Room Chest", RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST }, - { "Fire Temple Boulder Maze Shortcut Chest", RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST }, - { "Fire Temple Scarecrow Chest", RC_FIRE_TEMPLE_SCARECROW_CHEST }, - { "Fire Temple Map Chest", RC_FIRE_TEMPLE_MAP_CHEST }, - { "Fire Temple Compass Chest", RC_FIRE_TEMPLE_COMPASS_CHEST }, - { "Fire Temple Highest Goron Chest", RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST }, - { "Fire Temple Megaton Hammer Chest", RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST }, - { "Fire Temple MQ Near Boss Chest", RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST }, - { "Fire Temple MQ Megaton Hammer Chest", RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST }, - { "Fire Temple MQ Compass Chest", RC_FIRE_TEMPLE_MQ_COMPASS_CHEST }, - { "Fire Temple MQ Lizalfos Maze Lower Chest", RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST }, - { "Fire Temple MQ Lizalfos Maze Upper Chest", RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST }, - { "Fire Temple MQ Chest on Fire", RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE }, - { "Fire Temple MQ Map Room Side Chest", RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST }, - { "Fire Temple MQ Map Chest", RC_FIRE_TEMPLE_MQ_MAP_CHEST }, - { "Fire Temple MQ Boss Key Chest", RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST }, - { "Fire Temple MQ Big Lava Room Blocked Door Chest", RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST }, - { "Fire Temple MQ Lizalfos Maze Side Room Chest", RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST }, - { "Fire Temple MQ Freestanding Key", RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY }, - { "Water Temple Map Chest", RC_WATER_TEMPLE_MAP_CHEST }, - { "Water Temple Compass Chest", RC_WATER_TEMPLE_COMPASS_CHEST }, - { "Water Temple Torches Chest", RC_WATER_TEMPLE_TORCHES_CHEST }, - { "Water Temple Dragon Chest", RC_WATER_TEMPLE_DRAGON_CHEST }, - { "Water Temple Central Bow Target Chest", RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST }, - { "Water Temple Central Pillar Chest", RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST }, - { "Water Temple Cracked Wall Chest", RC_WATER_TEMPLE_CRACKED_WALL_CHEST }, - { "Water Temple Boss Key Chest", RC_WATER_TEMPLE_BOSS_KEY_CHEST }, - { "Water Temple Longshot Chest", RC_WATER_TEMPLE_LONGSHOT_CHEST }, - { "Water Temple River Chest", RC_WATER_TEMPLE_RIVER_CHEST }, - { "Water Temple MQ Central Pillar Chest", RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST }, - { "Water Temple MQ Boss Key Chest", RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST }, - { "Water Temple MQ Longshot Chest", RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST }, - { "Water Temple MQ Compass Chest", RC_WATER_TEMPLE_MQ_COMPASS_CHEST }, - { "Water Temple MQ Map Chest", RC_WATER_TEMPLE_MQ_MAP_CHEST }, - { "Water Temple MQ Freestanding Key", RC_WATER_TEMPLE_MQ_FREESTANDING_KEY }, - { "Spirit Temple Silver Gauntlets Chest", RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST }, - { "Spirit Temple Mirror Shield Chest", RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST }, - { "Spirit Temple Child Bridge Chest", RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST }, - { "Spirit Temple Child Early Torches Chest", RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST }, - { "Spirit Temple Compass Chest", RC_SPIRIT_TEMPLE_COMPASS_CHEST }, - { "Spirit Temple Early Adult Right Chest", RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST }, - { "Spirit Temple First Mirror Left Chest", RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST }, - { "Spirit Temple First Mirror Right Chest", RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST }, - { "Spirit Temple Map Chest", RC_SPIRIT_TEMPLE_MAP_CHEST }, - { "Spirit Temple Child Climb North Chest", RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST }, - { "Spirit Temple Child Climb East Chest", RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST }, - { "Spirit Temple Sun Block Room Chest", RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST }, - { "Spirit Temple Statue Room Hand Chest", RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST }, - { "Spirit Temple Statue Room Northeast Chest", RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST }, - { "Spirit Temple Near Four Armos Chest", RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST }, - { "Spirit Temple Hallway Right Invisible Chest", RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST }, - { "Spirit Temple Hallway Left Invisible Chest", RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST }, - { "Spirit Temple Boss Key Chest", RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST }, - { "Spirit Temple Topmost Chest", RC_SPIRIT_TEMPLE_TOPMOST_CHEST }, - { "Spirit Temple MQ Entrance Front Left Chest", RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST }, - { "Spirit Temple MQ Entrance Back Right Chest", RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST }, - { "Spirit Temple MQ Entrance Front Right Chest", RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST }, - { "Spirit Temple MQ Entrance Back Left Chest", RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST }, - { "Spirit Temple MQ Child Hammer Switch Chest", RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST }, - { "Spirit Temple MQ Map Chest", RC_SPIRIT_TEMPLE_MQ_MAP_CHEST }, - { "Spirit Temple MQ Map Room Enemy Chest", RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST }, - { "Spirit Temple MQ Child Climb North Chest", RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST }, - { "Spirit Temple MQ Child Climb South Chest", RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST }, - { "Spirit Temple MQ Compass Chest", RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST }, - { "Spirit Temple MQ Statue Room Lullaby Chest", RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST }, - { "Spirit Temple MQ Statue Room Invisible Chest", RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST }, - { "Spirit Temple MQ Silver Block Hallway Chest", RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST }, - { "Spirit Temple MQ Sun Block Room Chest", RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST }, - { "Spirit Temple MQ Symphony Room Chest", RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST }, - { "Spirit Temple MQ Leever Room Chest", RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST }, - { "Spirit Temple MQ Beamos Room Chest", RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST }, - { "Spirit Temple MQ Chest Switch Chest", RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST }, - { "Spirit Temple MQ Boss Key Chest", RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST }, - { "Spirit Temple MQ Mirror Puzzle Invisible Chest", RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST }, - { "Shadow Temple Map Chest", RC_SHADOW_TEMPLE_MAP_CHEST }, - { "Shadow Temple Hover Boots Chest", RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST }, - { "Shadow Temple Compass Chest", RC_SHADOW_TEMPLE_COMPASS_CHEST }, - { "Shadow Temple Early Silver Rupee Chest", RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST }, - { "Shadow Temple Invisible Blades Visible Chest", RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST }, - { "Shadow Temple Invisible Blades Invisible Chest", RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST }, - { "Shadow Temple Falling Spikes Lower Chest", RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST }, - { "Shadow Temple Falling Spikes Upper Chest", RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST }, - { "Shadow Temple Falling Spikes Switch Chest", RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST }, - { "Shadow Temple Invisible Spikes Chest", RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST }, - { "Shadow Temple Wind Hint Chest", RC_SHADOW_TEMPLE_WIND_HINT_CHEST }, - { "Shadow Temple After Wind Enemy Chest", RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST }, - { "Shadow Temple After Wind Hidden Chest", RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST }, - { "Shadow Temple Spike Walls Left Chest", RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST }, - { "Shadow Temple Boss Key Chest", RC_SHADOW_TEMPLE_BOSS_KEY_CHEST }, - { "Shadow Temple Invisible Floormaster Chest", RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST }, - { "Shadow Temple Freestanding Key", RC_SHADOW_TEMPLE_FREESTANDING_KEY }, - { "Shadow Temple MQ Compass Chest", RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST }, - { "Shadow Temple MQ Hover Boots Chest", RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST }, - { "Shadow Temple MQ Early Gibdos Chest", RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST }, - { "Shadow Temple MQ Map Chest", RC_SHADOW_TEMPLE_MQ_MAP_CHEST }, - { "Shadow Temple MQ Beamos Silver Rupees Chest", RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST }, - { "Shadow Temple MQ Falling Spikes Switch Chest", RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST }, - { "Shadow Temple MQ Falling Spikes Lower Chest", RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST }, - { "Shadow Temple MQ Falling Spikes Upper Chest", RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST }, - { "Shadow Temple MQ Invisible Spikes Chest", RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST }, - { "Shadow Temple MQ Boss Key Chest", RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST }, - { "Shadow Temple MQ Spike Walls Left Chest", RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST }, - { "Shadow Temple MQ Stalfos Room Chest", RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST }, - { "Shadow Temple MQ Invisible Blades Invisible Chest", RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST }, - { "Shadow Temple MQ Invisible Blades Visible Chest", RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST }, - { "Shadow Temple MQ Bomb Flower Chest", RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST }, - { "Shadow Temple MQ Wind Hint Chest", RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST }, - { "Shadow Temple MQ After Wind Hidden Chest", RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST }, - { "Shadow Temple MQ After Wind Enemy Chest", RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST }, - { "Shadow Temple MQ Near Ship Invisible Chest", RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST }, - { "Shadow Temple MQ Freestanding Key", RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY }, - { "Bottom of the Well Front Left Fake Wall Chest", RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST }, - { "Bottom of the Well Front Center Bombable Chest", RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST }, - { "Bottom of the Well Right Bottom Fake Wall Chest", RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST }, - { "Bottom of the Well Compass Chest", RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST }, - { "Bottom of the Well Center Skulltula Chest", RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST }, - { "Bottom of the Well Back Left Bombable Chest", RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST }, - { "Bottom of the Well Lens of Truth Chest", RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST }, - { "Bottom of the Well Invisible Chest", RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST }, - { "Bottom of the Well Underwater Front Chest", RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST }, - { "Bottom of the Well Underwater Left Chest", RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST }, - { "Bottom of the Well Map Chest", RC_BOTTOM_OF_THE_WELL_MAP_CHEST }, - { "Bottom of the Well Fire Keese Chest", RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST }, - { "Bottom of the Well Like Like Chest", RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST }, - { "Bottom of the Well Freestanding Key", RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY }, - { "Bottom of the Well MQ Map Chest", RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST }, - { "Bottom of the Well MQ Lens of Truth Chest", RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST }, - { "Bottom of the Well MQ Compass Chest", RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST }, - { "Bottom of the Well MQ Dead Hand Freestanding Key", RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY }, - { "Bottom of the Well MQ East Inner Room Freestanding Key", - RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY }, - { "Ice Cavern Map Chest", RC_ICE_CAVERN_MAP_CHEST }, - { "Ice Cavern Compass Chest", RC_ICE_CAVERN_COMPASS_CHEST }, - { "Ice Cavern Iron Boots Chest", RC_ICE_CAVERN_IRON_BOOTS_CHEST }, - { "Ice Cavern Freestanding PoH", RC_ICE_CAVERN_FREESTANDING_POH }, - { "Ice Cavern MQ Iron Boots Chest", RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST }, - { "Ice Cavern MQ Compass Chest", RC_ICE_CAVERN_MQ_COMPASS_CHEST }, - { "Ice Cavern MQ Map Chest", RC_ICE_CAVERN_MQ_MAP_CHEST }, - { "Ice Cavern MQ Freestanding PoH", RC_ICE_CAVERN_MQ_FREESTANDING_POH }, - { "Gerudo Training Grounds Lobby Left Chest", RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST }, - { "Gerudo Training Grounds Lobby Right Chest", RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST }, - { "Gerudo Training Grounds Stalfos Chest", RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST }, - { "Gerudo Training Grounds Beamos Chest", RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST }, - { "Gerudo Training Grounds Hidden Ceiling Chest", RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST }, - { "Gerudo Training Grounds Maze Path First Chest", RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST }, - { "Gerudo Training Grounds Maze Path Second Chest", RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST }, - { "Gerudo Training Grounds Maze Path Third Chest", RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST }, - { "Gerudo Training Grounds Maze Path Final Chest", RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST }, - { "Gerudo Training Grounds Maze Right Central Chest", RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST }, - { "Gerudo Training Grounds Maze Right Side Chest", RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST }, - { "Gerudo Training Grounds Underwater Silver Rupee Chest", - RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST }, - { "Gerudo Training Grounds Hammer Room Clear Chest", RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST }, - { "Gerudo Training Grounds Hammer Room Switch Chest", RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST }, - { "Gerudo Training Grounds Eye Statue Chest", RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST }, - { "Gerudo Training Grounds Near Scarecrow Chest", RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST }, - { "Gerudo Training Grounds Before Heavy Block Chest", RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST }, - { "Gerudo Training Grounds Heavy Block First Chest", RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST }, - { "Gerudo Training Grounds Heavy Block Second Chest", RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST }, - { "Gerudo Training Grounds Heavy Block Third Chest", RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST }, - { "Gerudo Training Grounds Heavy Block Fourth Chest", RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST }, - { "Gerudo Training Grounds Freestanding Key", RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY }, - { "Gerudo Training Grounds MQ Lobby Right Chest", RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST }, - { "Gerudo Training Grounds MQ Lobby Left Chest", RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST }, - { "Gerudo Training Grounds MQ First Iron Knuckle Chest", RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST }, - { "Gerudo Training Grounds MQ Before Heavy Block Chest", RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST }, - { "Gerudo Training Grounds MQ Eye Statue Chest", RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST }, - { "Gerudo Training Grounds MQ Flame Circle Chest", RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST }, - { "Gerudo Training Grounds MQ Second Iron Knuckle Chest", RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST }, - { "Gerudo Training Grounds MQ Dinolfos Chest", RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST }, - { "Gerudo Training Grounds MQ Ice Arrows Chest", RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST }, - { "Gerudo Training Grounds MQ Maze Right Central Chest", RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST }, - { "Gerudo Training Grounds MQ Maze Path First Chest", RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST }, - { "Gerudo Training Grounds MQ Maze Right Side Chest", RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST }, - { "Gerudo Training Grounds MQ Maze Path Third Chest", RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST }, - { "Gerudo Training Grounds MQ Maze Path Second Chest", RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST }, - { "Gerudo Training Grounds MQ Hidden Ceiling Chest", RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST }, - { "Gerudo Training Grounds MQ Underwater Silver Rupee Chest", - RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST }, - { "Gerudo Training Grounds MQ Heavy Block Chest", RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST }, - { "Ganon's Tower Boss Key Chest", RC_GANONS_TOWER_BOSS_KEY_CHEST }, - { "Ganon's Castle Forest Trial Chest", RC_GANONS_CASTLE_FOREST_TRIAL_CHEST }, - { "Ganon's Castle Water Trial Left Chest", RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST }, - { "Ganon's Castle Water Trial Right Chest", RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST }, - { "Ganon's Castle Shadow Trial Front Chest", RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST }, - { "Ganon's Castle Shadow Trial Golden Gauntlets Chest", RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST }, - { "Ganon's Castle Spirit Trial Crystal Switch Chest", RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST }, - { "Ganon's Castle Spirit Trial Invisible Chest", RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST }, - { "Ganon's Castle Light Trial First Left Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST }, - { "Ganon's Castle Light Trial Second Left Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST }, - { "Ganon's Castle Light Trial Third Left Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST }, - { "Ganon's Castle Light Trial First Right Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST }, - { "Ganon's Castle Light Trial Second Right Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST }, - { "Ganon's Castle Light Trial Third Right Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST }, - { "Ganon's Castle Light Trial Invisible Enemies Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST }, - { "Ganon's Castle Light Trial Lullaby Chest", RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST }, - { "Ganon's Castle Deku Scrub Center-Left", RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT }, - { "Ganon's Castle Deku Scrub Center-Right", RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT }, - { "Ganon's Castle Deku Scrub Right", RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT }, - { "Ganon's Castle Deku Scrub Left", RC_GANONS_CASTLE_DEKU_SCRUB_LEFT }, - { "Ganon's Castle MQ Water Trial Chest", RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST }, - { "Ganon's Castle MQ Forest Trial Eye Switch Chest", RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST }, - { "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest", - RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST }, - { "Ganon's Castle MQ Light Trial Lullaby Chest", RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST }, - { "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST }, - { "Ganon's Castle MQ Shadow Trial Eye Switch Chest", RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST }, - { "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST }, - { "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST }, - { "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST }, - { "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST }, - { "Ganon's Castle MQ Spirit Trial First Chest", RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST }, - { "Ganon's Castle MQ Spirit Trial Invisible Chest", RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST }, - { "Ganon's Castle MQ Forest Trial Freestanding Key", RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY }, - { "Ganon's Castle MQ Deku Scrub Right", RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT }, - { "Ganon's Castle MQ Deku Scrub Center-Left", RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT }, - { "Ganon's Castle MQ Deku Scrub Center", RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER }, - { "Ganon's Castle MQ Deku Scrub Center-Right", RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT }, - { "Ganon's Castle MQ Deku Scrub Left", RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT }, - { "Deku Tree GS Basement Back Room", RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM }, - { "Deku Tree GS Basement Gate", RC_DEKU_TREE_GS_BASEMENT_GATE }, - { "Deku Tree GS Basement Vines", RC_DEKU_TREE_GS_BASEMENT_VINES }, - { "Deku Tree GS Compass Room", RC_DEKU_TREE_GS_COMPASS_ROOM }, - { "Deku Tree MQ GS Lobby", RC_DEKU_TREE_MQ_GS_LOBBY }, - { "Deku Tree MQ GS Compass Room", RC_DEKU_TREE_MQ_GS_COMPASS_ROOM }, - { "Deku Tree MQ GS Basement Graves Room", RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM }, - { "Deku Tree MQ GS Basement Back Room", RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM }, - { "Dodongos Cavern GS Vines Above Stairs", RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS }, - { "Dodongos Cavern GS Scarecrow", RC_DODONGOS_CAVERN_GS_SCARECROW }, - { "Dodongos Cavern GS Alcove Above Stairs", RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS }, - { "Dodongos Cavern GS Back Room", RC_DODONGOS_CAVERN_GS_BACK_ROOM }, - { "Dodongos Cavern GS Side Room Near Lower Lizalfos", RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS }, - { "Dodongos Cavern MQ GS Scrub Room", RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM }, - { "Dodongos Cavern MQ GS Song of Time Block Room", RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM }, - { "Dodongos Cavern MQ GS Lizalfos Room", RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM }, - { "Dodongos Cavern MQ GS Larvae Room", RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM }, - { "Dodongos Cavern MQ GS Back Room", RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA }, - { "Jabu Jabus Belly GS Lobby Basement Lower", RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER }, - { "Jabu Jabus Belly GS Lobby Basement Upper", RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER }, - { "Jabu Jabus Belly GS Near Boss", RC_JABU_JABUS_BELLY_GS_NEAR_BOSS }, - { "Jabu Jabus Belly GS Water Switch Room", RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM }, - { "Jabu Jabus Belly MQ GS Tail Parasan Room", RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM }, - { "Jabu Jabus Belly MQ GS Invisible Enemies Room", RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM }, - { "Jabu Jabus Belly MQ GS Boomerang Chest Room", RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM }, - { "Jabu Jabus Belly MQ GS Near Boss", RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS }, - { "Forest Temple GS Raised Island Courtyard", RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD }, - { "Forest Temple GS First Room", RC_FOREST_TEMPLE_GS_FIRST_ROOM }, - { "Forest Temple GS Level Island Courtyard", RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD }, - { "Forest Temple GS Lobby", RC_FOREST_TEMPLE_GS_LOBBY }, - { "Forest Temple GS Basement", RC_FOREST_TEMPLE_GS_BASEMENT }, - { "Forest Temple MQ GS First Hallway", RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY }, - { "Forest Temple MQ GS Block Push Room", RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM }, - { "Forest Temple MQ GS Raised Island Courtyard", RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD }, - { "Forest Temple MQ GS Level Island Courtyard", RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD }, - { "Forest Temple MQ GS Well", RC_FOREST_TEMPLE_MQ_GS_WELL }, - { "Fire Temple GS Song of Time Room", RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM }, - { "Fire Temple GS Boss Key Loop", RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP }, - { "Fire Temple GS Boulder Maze", RC_FIRE_TEMPLE_GS_BOULDER_MAZE }, - { "Fire Temple GS Scarecrow Top", RC_FIRE_TEMPLE_GS_SCARECROW_TOP }, - { "Fire Temple GS Scarecrow Climb", RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB }, - { "Fire Temple MQ GS Above Fire Wall Maze", RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE }, - { "Fire Temple MQ GS Fire Wall Maze Center", RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER }, - { "Fire Temple MQ GS Big Lava Room Open Door", RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR }, - { "Fire Temple MQ GS Fire Wall Maze Side Room", RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM }, - { "Fire Temple MQ GS Skull on Fire", RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE }, - { "Water Temple GS Behind Gate", RC_WATER_TEMPLE_GS_BEHIND_GATE }, - { "Water Temple GS Falling Platform Room", RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM }, - { "Water Temple GS Central Pillar", RC_WATER_TEMPLE_GS_CENTRAL_PILLAR }, - { "Water Temple GS Near Boss Key Chest", RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST }, - { "Water Temple GS River", RC_WATER_TEMPLE_GS_RIVER }, - { "Water Temple MQ GS Before Upper Water Switch", RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH }, - { "Water Temple MQ GS Freestanding Key Area", RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA }, - { "Water Temple MQ GS Lizalfos Hallway", RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY }, - { "Water Temple MQ GS River", RC_WATER_TEMPLE_MQ_GS_RIVER }, - { "Water Temple MQ GS Triple Wall Torch", RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH }, - { "Spirit Temple GS Hall After Sun Block Room", RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM }, - { "Spirit Temple GS Boulder Room", RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM }, - { "Spirit Temple GS Lobby", RC_SPIRIT_TEMPLE_GS_LOBBY }, - { "Spirit Temple GS Sun on Floor Room", RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM }, - { "Spirit Temple GS Metal Fence", RC_SPIRIT_TEMPLE_GS_METAL_FENCE }, - { "Spirit Temple MQ GS Symphony Room", RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM }, - { "Spirit Temple MQ GS Leever Room", RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM }, - { "Spirit Temple MQ GS Nine Thrones Room West", RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST }, - { "Spirit Temple MQ GS Nine Thrones Room North", RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH }, - { "Spirit Temple MQ GS Sun Block Room", RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM }, - { "Shadow Temple GS Single Giant Pot", RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT }, - { "Shadow Temple GS Falling Spikes Room", RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM }, - { "Shadow Temple GS Triple Giant Pot", RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT }, - { "Shadow Temple GS Like Like Room", RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM }, - { "Shadow Temple GS Near Ship", RC_SHADOW_TEMPLE_GS_NEAR_SHIP }, - { "Shadow Temple MQ GS Falling Spikes Room", RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM }, - { "Shadow Temple MQ GS Wind Hint Room", RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM }, - { "Shadow Temple MQ GS After Wind", RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND }, - { "Shadow Temple MQ GS After Ship", RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP }, - { "Shadow Temple MQ GS Near Boss", RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS }, - { "Bottom of the Well GS Like Like Cage", RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE }, - { "Bottom of the Well GS East Inner Room", RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM }, - { "Bottom of the Well GS West Inner Room", RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM }, - { "Bottom of the Well MQ GS Basement", RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT }, - { "Bottom of the Well MQ GS Coffin Room", RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM }, - { "Bottom of the Well MQ GS West Inner Room", RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM }, - { "Ice Cavern GS Push Block Room", RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM }, - { "Ice Cavern GS Spinning Scythe Room", RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM }, - { "Ice Cavern GS Heart Piece Room", RC_ICE_CAVERN_GS_HEART_PIECE_ROOM }, - { "Ice Cavern MQ GS Scarecrow", RC_ICE_CAVERN_MQ_GS_SCARECROW }, - { "Ice Cavern MQ GS Ice Block", RC_ICE_CAVERN_MQ_GS_ICE_BLOCK }, - { "Ice Cavern MQ GS Red Ice", RC_ICE_CAVERN_MQ_GS_RED_ICE }, - { "KF GS Bean Patch", RC_KF_GS_BEAN_PATCH }, - { "KF GS Know It All House", RC_KF_GS_KNOW_IT_ALL_HOUSE }, - { "KF GS House of Twins", RC_KF_GS_HOUSE_OF_TWINS }, - { "LW GS Bean Patch Near Bridge", RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE }, - { "LW GS Bean Patch Near Theater", RC_LW_GS_BEAN_PATCH_NEAR_THEATER }, - { "LW GS Above Theater", RC_LW_GS_ABOVE_THEATER }, - { "SFM GS", RC_SFM_GS }, - { "HF GS Cow Grotto", RC_HF_GS_COW_GROTTO }, - { "HF GS Near Kak Grotto", RC_HF_GS_NEAR_KAK_GROTTO }, - { "LH GS Bean Patch", RC_LH_GS_BEAN_PATCH }, - { "LH GS Small Island", RC_LH_GS_SMALL_ISLAND }, - { "LH GS Lab Wall", RC_LH_GS_LAB_WALL }, - { "LH GS Lab Crate", RC_LH_GS_LAB_CRATE }, - { "LH GS Tree", RC_LH_GS_TREE }, - { "GV GS Bean Patch", RC_GV_GS_BEAN_PATCH }, - { "GV GS Small Bridge", RC_GV_GS_SMALL_BRIDGE }, - { "GV GS Pillar", RC_GV_GS_PILLAR }, - { "GV GS Behind Tent", RC_GV_GS_BEHIND_TENT }, - { "GF GS Archery Range", RC_GF_GS_ARCHERY_RANGE }, - { "GF GS Top Floor", RC_GF_GS_TOP_FLOOR }, - { "Wasteland GS", RC_WASTELAND_GS }, - { "Colossus GS Bean Patch", RC_COLOSSUS_GS_BEAN_PATCH }, - { "Colossus GS Hill", RC_COLOSSUS_GS_HILL }, - { "Colossus GS Tree", RC_COLOSSUS_GS_TREE }, - { "OGC GS", RC_OGC_GS }, - { "HC GS Storms Grotto", RC_HC_GS_STORMS_GROTTO }, - { "HC GS Tree", RC_HC_GS_TREE }, - { "Market GS Guard House", RC_MARKET_GS_GUARD_HOUSE }, - { "Kak GS House Under Construction", RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION }, - { "Kak GS Skulltula House", RC_KAK_GS_SKULLTULA_HOUSE }, - { "Kak GS Guards House", RC_KAK_GS_GUARDS_HOUSE }, - { "Kak GS Tree", RC_KAK_GS_TREE }, - { "Kak GS Watchtower", RC_KAK_GS_WATCHTOWER }, - { "Kak GS Above Impas House", RC_KAK_GS_ABOVE_IMPAS_HOUSE }, - { "Graveyard GS Wall", RC_GRAVEYARD_GS_WALL }, - { "Graveyard GS Bean Patch", RC_GRAVEYARD_GS_BEAN_PATCH }, - { "DMC GS Bean Patch", RC_DMC_GS_BEAN_PATCH }, - { "DMC GS Crate", RC_DMC_GS_CRATE }, - { "DMT GS Bean Patch", RC_DMT_GS_BEAN_PATCH }, - { "DMT GS Near Kak", RC_DMT_GS_NEAR_KAK }, - { "DMT GS Above Dodongos Cavern", RC_DMT_GS_ABOVE_DODONGOS_CAVERN }, - { "DMT GS Falling Rocks Path", RC_DMT_GS_FALLING_ROCKS_PATH }, - { "GC GS Center Platform", RC_GC_GS_CENTER_PLATFORM }, - { "GC GS Boulder Maze", RC_GC_GS_BOULDER_MAZE }, - { "ZR GS Ladder", RC_ZR_GS_LADDER }, - { "ZR GS Tree", RC_ZR_GS_TREE }, - { "ZR GS Above Bridge", RC_ZR_GS_ABOVE_BRIDGE }, - { "ZR GS Near Raised Grottos", RC_ZR_GS_NEAR_RAISED_GROTTOS }, - { "ZD GS Frozen Waterfall", RC_ZD_GS_FROZEN_WATERFALL }, - { "ZF GS Above The Log", RC_ZF_GS_ABOVE_THE_LOG }, - { "ZF GS Hidden Cave", RC_ZF_GS_HIDDEN_CAVE }, - { "ZF GS Tree", RC_ZF_GS_TREE }, - { "LLR GS Back Wall", RC_LLR_GS_BACK_WALL }, - { "LLR GS Rain Shed", RC_LLR_GS_RAIN_SHED }, - { "LLR GS House Window", RC_LLR_GS_HOUSE_WINDOW }, - { "LLR GS Tree", RC_LLR_GS_TREE }, - { "Link's Pocket", RC_LINKS_POCKET }, - { "Queen Gohma", RC_QUEEN_GOHMA }, - { "King Dodongo", RC_KING_DODONGO }, - { "Barinade", RC_BARINADE }, - { "Phantom Ganon", RC_PHANTOM_GANON }, - { "Volvagia", RC_VOLVAGIA }, - { "Morpha", RC_MORPHA }, - { "Twinrova", RC_TWINROVA }, - { "Bongo Bongo", RC_BONGO_BONGO }, - { "Ganon", RC_UNKNOWN_CHECK }, - { "Deku Tree Queen Gohma Heart Container", RC_DEKU_TREE_QUEEN_GOHMA_HEART }, - { "Dodongos Cavern King Dodongo Heart Container", RC_DODONGOS_CAVERN_KING_DODONGO_HEART }, - { "Jabu Jabus Belly Barinade Heart Container", RC_JABU_JABUS_BELLY_BARINADE_HEART }, - { "Forest Temple Phantom Ganon Heart Container", RC_FOREST_TEMPLE_PHANTOM_GANON_HEART }, - { "Fire Temple Volvagia Heart Container", RC_FIRE_TEMPLE_VOLVAGIA_HEART }, - { "Water Temple Morpha Heart Container", RC_WATER_TEMPLE_MORPHA_HEART }, - { "Spirit Temple Twinrova Heart Container", RC_SPIRIT_TEMPLE_TWINROVA_HEART }, - { "Shadow Temple Bongo Bongo Heart Container", RC_SHADOW_TEMPLE_BONGO_BONGO_HEART }, - { "ToT Light Arrow Cutscene", RC_TOT_LIGHT_ARROWS_CUTSCENE }, - { "LW Gift From Saria", RC_LW_GIFT_FROM_SARIA }, - { "ZF Great Fairy Reward", RC_ZF_GREAT_FAIRY_REWARD }, - { "HC Great Fairy Reward", RC_HC_GREAT_FAIRY_REWARD }, - { "Colossus Great Fairy Reward", RC_COLOSSUS_GREAT_FAIRY_REWARD }, - { "DMT Great Fairy Reward", RC_DMT_GREAT_FAIRY_REWARD }, - { "DMC Great Fairy Reward", RC_DMC_GREAT_FAIRY_REWARD }, - { "OGC Great Fairy Reward", RC_OGC_GREAT_FAIRY_REWARD }, - { "Sheik in Forest", RC_SHEIK_IN_FOREST }, - { "Sheik in Crater", RC_SHEIK_IN_CRATER }, - { "Sheik in Ice Cavern", RC_SHEIK_IN_ICE_CAVERN }, - { "Sheik at Colossus", RC_SHEIK_AT_COLOSSUS }, - { "Sheik in Kakariko", RC_SHEIK_IN_KAKARIKO }, - { "Sheik at Temple", RC_SHEIK_AT_TEMPLE }, - { "Song from Impa", RC_SONG_FROM_IMPA }, - { "Song from Malon", RC_SONG_FROM_MALON }, - { "Song from Saria", RC_SONG_FROM_SARIA }, - { "Song from Composers Grave", RC_SONG_FROM_ROYAL_FAMILYS_TOMB }, - { "Song from Ocarina of Time", RC_SONG_FROM_OCARINA_OF_TIME }, - { "Song from Windmill", RC_SONG_FROM_WINDMILL }, - { "KF Links House Cow", RC_KF_LINKS_HOUSE_COW }, - { "HF Cow Grotto Cow", RC_HF_COW_GROTTO_COW }, - { "LLR Stables Left Cow", RC_LLR_STABLES_LEFT_COW }, - { "LLR Stables Right Cow", RC_LLR_STABLES_RIGHT_COW }, - { "LLR Tower Left Cow", RC_LLR_TOWER_LEFT_COW }, - { "LLR Tower Right Cow", RC_LLR_TOWER_RIGHT_COW }, - { "Kak Impas House Cow", RC_KAK_IMPAS_HOUSE_COW }, - { "DMT Cow Grotto Cow", RC_DMT_COW_GROTTO_COW }, - { "GV Cow", RC_GV_COW }, - { "Jabu Jabus Belly MQ Cow", RC_JABU_JABUS_BELLY_MQ_COW }, - { "KF Shop Item 1", RC_KF_SHOP_ITEM_1 }, - { "KF Shop Item 2", RC_KF_SHOP_ITEM_2 }, - { "KF Shop Item 3", RC_KF_SHOP_ITEM_3 }, - { "KF Shop Item 4", RC_KF_SHOP_ITEM_4 }, - { "KF Shop Item 5", RC_KF_SHOP_ITEM_5 }, - { "KF Shop Item 6", RC_KF_SHOP_ITEM_6 }, - { "KF Shop Item 7", RC_KF_SHOP_ITEM_7 }, - { "KF Shop Item 8", RC_KF_SHOP_ITEM_8 }, - { "Kak Potion Shop Item 1", RC_KAK_POTION_SHOP_ITEM_1 }, - { "Kak Potion Shop Item 2", RC_KAK_POTION_SHOP_ITEM_2 }, - { "Kak Potion Shop Item 3", RC_KAK_POTION_SHOP_ITEM_3 }, - { "Kak Potion Shop Item 4", RC_KAK_POTION_SHOP_ITEM_4 }, - { "Kak Potion Shop Item 5", RC_KAK_POTION_SHOP_ITEM_5 }, - { "Kak Potion Shop Item 6", RC_KAK_POTION_SHOP_ITEM_6 }, - { "Kak Potion Shop Item 7", RC_KAK_POTION_SHOP_ITEM_7 }, - { "Kak Potion Shop Item 8", RC_KAK_POTION_SHOP_ITEM_8 }, - { "MK Bombchu Shop Item 1", RC_MARKET_BOMBCHU_SHOP_ITEM_1 }, - { "MK Bombchu Shop Item 2", RC_MARKET_BOMBCHU_SHOP_ITEM_2 }, - { "MK Bombchu Shop Item 3", RC_MARKET_BOMBCHU_SHOP_ITEM_3 }, - { "MK Bombchu Shop Item 4", RC_MARKET_BOMBCHU_SHOP_ITEM_4 }, - { "MK Bombchu Shop Item 5", RC_MARKET_BOMBCHU_SHOP_ITEM_5 }, - { "MK Bombchu Shop Item 6", RC_MARKET_BOMBCHU_SHOP_ITEM_6 }, - { "MK Bombchu Shop Item 7", RC_MARKET_BOMBCHU_SHOP_ITEM_7 }, - { "MK Bombchu Shop Item 8", RC_MARKET_BOMBCHU_SHOP_ITEM_8 }, - { "MK Potion Shop Item 1", RC_MARKET_POTION_SHOP_ITEM_1 }, - { "MK Potion Shop Item 2", RC_MARKET_POTION_SHOP_ITEM_2 }, - { "MK Potion Shop Item 3", RC_MARKET_POTION_SHOP_ITEM_3 }, - { "MK Potion Shop Item 4", RC_MARKET_POTION_SHOP_ITEM_4 }, - { "MK Potion Shop Item 5", RC_MARKET_POTION_SHOP_ITEM_5 }, - { "MK Potion Shop Item 6", RC_MARKET_POTION_SHOP_ITEM_6 }, - { "MK Potion Shop Item 7", RC_MARKET_POTION_SHOP_ITEM_7 }, - { "MK Potion Shop Item 8", RC_MARKET_POTION_SHOP_ITEM_8 }, - { "MK Bazaar Item 1", RC_MARKET_BAZAAR_ITEM_1 }, - { "MK Bazaar Item 2", RC_MARKET_BAZAAR_ITEM_2 }, - { "MK Bazaar Item 3", RC_MARKET_BAZAAR_ITEM_3 }, - { "MK Bazaar Item 4", RC_MARKET_BAZAAR_ITEM_4 }, - { "MK Bazaar Item 5", RC_MARKET_BAZAAR_ITEM_5 }, - { "MK Bazaar Item 6", RC_MARKET_BAZAAR_ITEM_6 }, - { "MK Bazaar Item 7", RC_MARKET_BAZAAR_ITEM_7 }, - { "MK Bazaar Item 8", RC_MARKET_BAZAAR_ITEM_8 }, - { "Kak Bazaar Item 1", RC_KAK_BAZAAR_ITEM_1 }, - { "Kak Bazaar Item 2", RC_KAK_BAZAAR_ITEM_2 }, - { "Kak Bazaar Item 3", RC_KAK_BAZAAR_ITEM_3 }, - { "Kak Bazaar Item 4", RC_KAK_BAZAAR_ITEM_4 }, - { "Kak Bazaar Item 5", RC_KAK_BAZAAR_ITEM_5 }, - { "Kak Bazaar Item 6", RC_KAK_BAZAAR_ITEM_6 }, - { "Kak Bazaar Item 7", RC_KAK_BAZAAR_ITEM_7 }, - { "Kak Bazaar Item 8", RC_KAK_BAZAAR_ITEM_8 }, - { "ZD Shop Item 1", RC_ZD_SHOP_ITEM_1 }, - { "ZD Shop Item 2", RC_ZD_SHOP_ITEM_2 }, - { "ZD Shop Item 3", RC_ZD_SHOP_ITEM_3 }, - { "ZD Shop Item 4", RC_ZD_SHOP_ITEM_4 }, - { "ZD Shop Item 5", RC_ZD_SHOP_ITEM_5 }, - { "ZD Shop Item 6", RC_ZD_SHOP_ITEM_6 }, - { "ZD Shop Item 7", RC_ZD_SHOP_ITEM_7 }, - { "ZD Shop Item 8", RC_ZD_SHOP_ITEM_8 }, - { "GC Shop Item 1", RC_GC_SHOP_ITEM_1 }, - { "GC Shop Item 2", RC_GC_SHOP_ITEM_2 }, - { "GC Shop Item 3", RC_GC_SHOP_ITEM_3 }, - { "GC Shop Item 4", RC_GC_SHOP_ITEM_4 }, - { "GC Shop Item 5", RC_GC_SHOP_ITEM_5 }, - { "GC Shop Item 6", RC_GC_SHOP_ITEM_6 }, - { "GC Shop Item 7", RC_GC_SHOP_ITEM_7 }, - { "GC Shop Item 8", RC_GC_SHOP_ITEM_8 }, - { "Colossus Gossip Stone", RC_COLOSSUS_GOSSIP_STONE }, - { "DMC Gossip Stone", RC_DMC_GOSSIP_STONE }, - { "DMC Upper Grotto Gossip Stone", RC_DMC_UPPER_GROTTO_GOSSIP_STONE }, - { "DMT Gossip Stone", RC_DMT_GOSSIP_STONE }, - { "DMT Storms Grotto Gossip Stone", RC_DMT_STORMS_GROTTO_GOSSIP_STONE }, - { "Dodongo's Cavern Gossip Stone", RC_DODONGOS_CAVERN_GOSSIP_STONE }, - { "Fairy Gossip Stone", RC_FAIRY_GOSSIP_STONE }, - { "GC Maze Gossip Stone", RC_GC_MAZE_GOSSIP_STONE }, - { "GC Medigoron Gossip Stone", RC_GC_MEDIGORON_GOSSIP_STONE }, - { "GV Gossip Stone", RC_GV_GOSSIP_STONE }, - { "GY Gossip Stone", RC_GY_GOSSIP_STONE }, - { "HC Malon Gossip Stone", RC_HC_MALON_GOSSIP_STONE }, - { "HC Rock Wall Gossip Stone", RC_HC_ROCK_WALL_GOSSIP_STONE }, - { "HC Storms Grotto Gossip Stone", RC_HC_STORMS_GROTTO_GOSSIP_STONE }, - { "HF Cow Grotto Gossip Stone", RC_HF_COW_GROTTO_GOSSIP_STONE }, - { "HF Near Market Gossip Stone", RC_HF_NEAR_MARKET_GOSSIP_STONE }, - { "HF Open Grotto Gossip Stone", RC_HF_OPEN_GROTTO_GOSSIP_STONE }, - { "HF Southeast Gossip Stone", RC_HF_SOUTHEAST_GOSSIP_STONE }, - { "Jabu Gossip Stone", RC_JABU_GOSSIP_STONE }, - { "KF Deku Tree Left Gossip Stone", RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE }, - { "KF Deku Tree Right Gossip Stone", RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE }, - { "KF Gossip Stone", RC_KF_GOSSIP_STONE }, - { "KF Storms Gossip Stone", RC_KF_STORMS_GOSSIP_STONE }, - { "Kak Open Grotto Gossip Stone", RC_KAK_OPEN_GROTTO_GOSSIP_STONE }, - { "LH Lab Gossip Stone", RC_LH_LAB_GOSSIP_STONE }, - { "LH Southeast Gossip Stone", RC_LH_SOUTHEAST_GOSSIP_STONE }, - { "LH Southwest Gossip Stone", RC_LH_SOUTHWEST_GOSSIP_STONE }, - { "LW Gossip Stone", RC_LW_GOSSIP_STONE }, - { "LW Near Shortcuts Gossip Stone", RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE }, - { "SFM Maze Lower Gossip Stone", RC_SFM_MAZE_LOWER_GOSSIP_STONE }, - { "SFM Maze Upper Gossip Stone", RC_SFM_MAZE_UPPER_GOSSIP_STONE }, - { "SFM Saria Gossip Stone", RC_SFM_SARIA_GOSSIP_STONE }, - { "ToT Left Center Gossip Stone", RC_TOT_LEFT_CENTER_GOSSIP_STONE }, - { "ToT Left Gossip Stone", RC_TOT_LEFT_GOSSIP_STONE }, - { "ToT Right Center Gossip Stone", RC_TOT_RIGHT_CENTER_GOSSIP_STONE }, - { "ToT Right Gossip Stone", RC_TOT_RIGHT_GOSSIP_STONE }, - { "ZD Gossip Stone", RC_ZD_GOSSIP_STONE }, - { "ZR Near Domain Gossip Stone", RC_ZR_NEAR_DOMAIN_GOSSIP_STONE }, - { "ZR Near Grottos Gossip Stone", RC_ZR_NEAR_GROTTOS_GOSSIP_STONE }, - { "ZR Open Grotto Gossip Stone", RC_ZR_OPEN_GROTTO_GOSSIP_STONE } -}; - std::unordered_map getItemIdToItemId = { { GI_BOW, ITEM_BOW }, { GI_ARROW_FIRE, ITEM_ARROW_FIRE }, @@ -4471,42 +3735,73 @@ void DrawRandoEditor(bool& open) { if (ImGui::BeginTable("tableRandoLocations", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Included Locations", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Excluded Locations", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Randomized", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Vanilla", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); ImGui::TableHeadersRow(); ImGui::PopItemFlag(); ImGui::TableNextRow(); - // COLUMN 1 - INCLUDED LOCATIONS + // COLUMN 1 - RANDOMIZED LOCATIONS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - SohImGui::EnhancementCheckbox("Deku Theater Mask of Truth", "gRandomizeExcludeDekuTheaterMaskOfTruth"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox("10 Skulltula Reward", "gRandomizeExcludeKak10SkullReward"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox("20 Skulltula Reward", "gRandomizeExcludeKak20SkullReward"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox("30 Skulltula Reward", "gRandomizeExcludeKak30SkullReward"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox("40 Skulltula Reward", "gRandomizeExcludeKak40SkullReward"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox("50 Skulltula Reward", "gRandomizeExcludeKak50SkullReward"); - - // COLUMN 2 - EXCLUDED LOCATIONS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - - const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; - for (int i = 0; i < IM_ARRAYSIZE(lines); i++) { - if (locationSearch.PassFilter(lines[i])) { - ImGui::BulletText("%s", lines[i]); + + ImGui::BeginChild("ChildRandomizedLocations"); + for (auto it : SpoilerfileCheckNameToEnum) { + if (!excludedLocations.count(it.second) && locationSearch.PassFilter(it.first.c_str())) { + if (ImGui::ArrowButton(std::to_string(it.second).c_str(), ImGuiDir_Right)) { + excludedLocations.insert(it.second); + } + ImGui::SameLine(); + ImGui::Text("%s", it.first.c_str()); } - } + + /* Checkbox UI + + if (locationSearch.PassFilter(it.first.c_str())) { + // we need the part from ## on to make each button unique in imgui + std::string buttonKey = "->##" + std::to_string(it.second); + // if (ImGui::SmallButton(buttonKey.c_str())) { + // excludedLocations.insert(it.second); + // } + auto elfound = excludedLocations.find(it.second); + bool varTheImguiCheckboxNeeds = elfound == excludedLocations.end(); + if (ImGui::Checkbox(it.first.c_str(), &varTheImguiCheckboxNeeds)) { + if (elfound != excludedLocations.end()) { + excludedLocations.erase(elfound); + } else { + excludedLocations.insert(it.second); + } + } + // ImGui::SameLine(); + // ImGui::Text("%s", it.first.c_str()); + } + + */ + } + ImGui::EndChild(); + + // COLUMN 2 - VANILLA LOCATIONS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + + ImGui::BeginChild("ChildVanillaLocations"); + for (auto it : SpoilerfileCheckNameToEnum) { + auto elfound = excludedLocations.find(it.second); + if (elfound != excludedLocations.end() && locationSearch.PassFilter(it.first.c_str())) { + if (ImGui::ArrowButton(std::to_string(it.second).c_str(), ImGuiDir_Left)) { + excludedLocations.erase(elfound); + } + ImGui::SameLine(); + ImGui::Text("%s", it.first.c_str()); + } + } + ImGui::EndChild(); ImGui::EndTable(); } ImGui::PopStyleVar(1); + PaddedSeparator(); ImGui::EndTabItem(); } diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 9b6fc90f5..58faeaa7b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1,5 +1,7 @@ #pragma once +#include + typedef struct { char tex[512]; uint16_t width; diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp new file mode 100644 index 000000000..3567c0fb6 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -0,0 +1,757 @@ +#include "randomizer_check_objects.h" +#include + +/* +typedef struct { + RandomizerCheck rc; + RandomizerCheckVanillaOrMQ vOrMQ; + RandomizerCheckType rcType; + RandomizerCheckArea rcArea; + std::string rcShortName; + std::string rcSpoilerName; +} RandomizerCheckObject; +*/ +std::unordered_map rcObjects = { + { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Invalid Location", "Invalid Location"}}, + { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, + { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Top Left Chest", "KF Mido Top Left Chest"}}, + { RC_KF_MIDOS_TOP_RIGHT_CHEST, {RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Top Right Chest", "KF Mido Top Right Chest"}}, + { RC_KF_MIDOS_BOTTOM_LEFT_CHEST, {RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Bottom Left Chest", "KF Mido Bottom Left Chest"}}, + { RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, {RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Bottom Right Chest", "KF Mido Bottom Right Chest"}}, + { RC_KF_STORMS_GROTTO_CHEST, {RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Storms Grotto Chest", "KF Storms Grotto Chest"}}, + { RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"}}, + { RC_LW_SKULL_KID, {RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Skull Kid", "LW Skull Kid"}}, + { RC_LW_TRADE_COJIRO, {RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Trade Cojiro", "LW Trade Cojiro"}}, + { RC_LW_TRADE_ODD_POTION, {RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Trade Odd Potion", "LW Trade Odd Potion"}}, + { RC_LW_OCARINA_MEMORY_GAME, {RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Ocarina Memory Game", "LW Ocarina Memory Game"}}, + { RC_LW_TARGET_IN_WOODS, {RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Target in Woods", "LW Target in Woods"}}, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"}}, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"}}, + { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, {RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"}}, + { RC_LW_DEKU_SCRUB_GROTTO_REAR, {RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"}}, + { RC_LW_DEKU_SCRUB_GROTTO_FRONT, {RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"}}, + { RC_DEKU_THEATER_SKULL_MASK, {RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Theater Skull Mask", "Deku Theater Skull Mask"}}, + { RC_DEKU_THEATER_MASK_OF_TRUTH, {RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"}}, + { RC_SFM_WOLFOS_GROTTO_CHEST, {RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"}}, + { RC_SFM_DEKU_SCRUB_GROTTO_REAR, {RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"}}, + { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, {RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"}}, + { RC_HF_SOUTHEAST_GROTTO_CHEST, {RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Southeast Grotto Chest", "HF Southeast Grotto Chest"}}, + { RC_HF_OPEN_GROTTO_CHEST, {RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Open Grotto Chest", "HF Open Grotto Chest"}}, + { RC_HF_NEAR_MARKET_GROTTO_CHEST, {RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Near Market Grotto Chest", "HF Near Market Grotto Chest"}}, + { RC_HF_OCARINA_OF_TIME_ITEM, {RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Ocarina of Time Item", "HF Ocarina of Time Item"}}, + { RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, {RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"}}, + { RC_HF_DEKU_SCRUB_GROTTO, {RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Deku Scrub Grotto", "HF Deku Scrub Grotto"}}, + { RC_LH_CHILD_FISHING, {RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Child Fishing", "LH Child Fishing"}}, + { RC_LH_ADULT_FISHING, {RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Adult Fishing", "LH Adult Fishing"}}, + { RC_LH_LAB_DIVE, {RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Lab Dive", "LH Lab Dive"}}, + { RC_LH_TRADE_FROG, {RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"}}, + { RC_LH_UNDERWATER_ITEM, {RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Underwater Item", "LH Underwater Item"}}, + { RC_LH_SUN, {RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Sun", "LH Sun"}}, + { RC_LH_FREESTANDING_POH, {RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Freestanding PoH", "LH Freestanding PoH"}}, + { RC_LH_DEKU_SCRUB_GROTTO_LEFT, {RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"}}, + { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, {RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"}}, + { RC_LH_DEKU_SCRUB_GROTTO_CENTER, {RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"}}, + { RC_GV_CHEST, {RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Chest", "GV Chest"}}, + { RC_GV_TRADE_SAW, {RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Trade Saw", "GV Trade Saw"}}, + { RC_GV_WATERFALL_FREESTANDING_POH, {RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"}}, + { RC_GV_CRATE_FREESTANDING_POH, {RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Crate Freestanding PoH", "GV Crate Freestanding PoH"}}, + { RC_GV_DEKU_SCRUB_GROTTO_REAR, {RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"}}, + { RC_GV_DEKU_SCRUB_GROTTO_FRONT, {RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"}}, + { RC_GF_CHEST, {RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF Chest", "GF Chest"}}, + { RC_GF_HBA_1000_POINTS, {RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF HBA 1000 Points", "GF HBA 1000 Points"}}, + { RC_GF_HBA_1500_POINTS, {RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF HBA 1500 Points", "GF HBA 1500 Points"}}, + { RC_GF_GERUDO_MEMBERSHIP_CARD, {RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF Gerudo Membership Card", "GF Gerudo Membership Card"}}, + { RC_GF_NORTH_F1_CARPENTER, {RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF North F1 Carpenter", "GF North F1 Carpenter"}}, + { RC_GF_NORTH_F2_CARPENTER, {RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF North F2 Carpenter", "GF North F2 Carpenter"}}, + { RC_GF_SOUTH_F1_CARPENTER, {RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF South F1 Carpenter", "GF South F1 Carpenter"}}, + { RC_GF_SOUTH_F2_CARPENTER, {RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF South F2 Carpenter", "GF South F2 Carpenter"}}, + { RC_WASTELAND_CHEST, {RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Wasteland Chest", "Wasteland Chest"}}, + { RC_WASTELAND_BOMBCHU_SALESMAN, {RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Wasteland Carpet Salesman", "Wasteland Carpet Salesman"}}, + { RC_COLOSSUS_FREESTANDING_POH, {RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Freestanding PoH", "Colossus Freestanding PoH"}}, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"}}, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"}}, + { RC_MARKET_TREASURE_CHEST_GAME_REWARD, {RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Treasure Chest Game Reward", "MK Treasure Chest Game Reward"}}, + { RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"}}, + { RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"}}, + { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Bowling Bombchus", "MK Bombchu Bowling Bombchus"}}, + { RC_MARKET_LOST_DOG, {RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Lost Dog", "MK Lost Dog"}}, + { RC_MARKET_SHOOTING_GALLERY_REWARD, {RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Shooting Gallery", "MK Shooting Gallery"}}, + { RC_MARKET_10_BIG_POES, {RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK 10 Big Poes", "MK 10 Big Poes"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game First Room Chest", "MK Chest Game First Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Second Room Chest", "MK Chest Game Second Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Third Room Chest", "MK Chest Game Third Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"}}, + { RC_HC_MALON_EGG, {RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Malon Egg", "HC Malon Egg"}}, + { RC_HC_ZELDAS_LETTER, {RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Zeldas Letter", "HC Zeldas Letter"}}, + { RC_KAK_REDEAD_GROTTO_CHEST, {RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Redead Grotto Chest", "Kak Redead Grotto Chest"}}, + { RC_KAK_OPEN_GROTTO_CHEST, {RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Open Grotto Chest", "Kak Open Grotto Chest"}}, + { RC_KAK_10_GOLD_SKULLTULA_REWARD, {RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"}}, + { RC_KAK_20_GOLD_SKULLTULA_REWARD, {RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"}}, + { RC_KAK_30_GOLD_SKULLTULA_REWARD, {RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"}}, + { RC_KAK_40_GOLD_SKULLTULA_REWARD, {RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"}}, + { RC_KAK_50_GOLD_SKULLTULA_REWARD, {RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"}}, + { RC_KAK_MAN_ON_ROOF, {RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Man on Roof", "Kak Man on Roof"}}, + { RC_KAK_SHOOTING_GALLERY_REWARD, {RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Shooting Gallery Reward", "Kak Shooting Gallery Reward"}}, + { RC_KAK_TRADE_ODD_MUSHROOM, {RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Trade Odd Mushroom", "Kak Trade Odd Mushroom"}}, + { RC_KAK_ANJU_AS_ADULT, {RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Anju as Adult", "Kak Anju as Adult"}}, + { RC_KAK_ANJU_AS_CHILD, {RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Anju as Child", "Kak Anju as Child"}}, + { RC_KAK_TRADE_POCKET_CUCCO, {RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Trade Pocket Cucco", "Kak Trade Pocket Cucco"}}, + { RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, {RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"}}, + { RC_KAK_WINDMILL_FREESTANDING_POH, {RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"}}, + { RC_GRAVEYARD_SHIELD_GRAVE_CHEST, {RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Shield Grave Chest", "GY Shield Grave Chest"}}, + { RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Heart Piece Grave Chest", "GY Heart Piece Grave Chest"}}, + { RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, {RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Composers Grave Chest", "GY Composers Grave Chest"}}, + { RC_GRAVEYARD_HOOKSHOT_CHEST, {RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Hookshot Chest", "GY Hookshot Chest"}}, + { RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"}}, + { RC_GRAVEYARD_FREESTANDING_POH, {RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Freestanding PoH", "GY Freestanding PoH"}}, + { RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"}}, + { RC_DMT_CHEST, {RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Chest", "DMT Chest"}}, + { RC_DMT_STORMS_GROTTO_CHEST, {RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Storms Grotto Chest", "DMT Storms Grotto Chest"}}, + { RC_DMT_TRADE_BROKEN_SWORD, {RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Trade Broken Sword", "DMT Trade Broken Sword"}}, + { RC_DMT_TRADE_EYEDROPS, {RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Trade Eyedrops", "DMT Trade Eyedrops"}}, + { RC_DMT_TRADE_CLAIM_CHECK, {RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Trade Claim Check", "DMT Trade Claim Check"}}, + { RC_DMT_FREESTANDING_POH, {RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Freestanding PoH", "DMT Freestanding PoH"}}, + { RC_GC_MAZE_LEFT_CHEST, {RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Left Chest", "GC Maze Left Chest"}}, + { RC_GC_MAZE_RIGHT_CHEST, {RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Right Chest", "GC Maze Right Chest"}}, + { RC_GC_MAZE_CENTER_CHEST, {RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Center Chest", "GC Maze Center Chest"}}, + { RC_GC_ROLLING_GORON_AS_CHILD, {RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Rolling Goron as Child", "GC Rolling Goron as Child"}}, + { RC_GC_ROLLING_GORON_AS_ADULT, {RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Rolling Goron as Adult", "GC Rolling Goron as Adult"}}, + { RC_GC_DARUNIAS_JOY, {RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Darunias Joy", "GC Darunias Joy"}}, + { RC_GC_POT_FREESTANDING_POH, {RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Pot Freestanding PoH", "GC Pot Freestanding PoH"}}, + { RC_GC_DEKU_SCRUB_GROTTO_LEFT, {RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"}}, + { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, {RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"}}, + { RC_GC_DEKU_SCRUB_GROTTO_CENTER, {RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"}}, + { RC_GC_MEDIGORON, {RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Medigoron", "GC Medigoron"}}, + { RC_DMC_UPPER_GROTTO_CHEST, {RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Upper Grotto Chest", "DMC Upper Grotto Chest"}}, + { RC_DMC_WALL_FREESTANDING_POH, {RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Wall Freestanding PoH", "DMC Wall Freestanding PoH"}}, + { RC_DMC_VOLCANO_FREESTANDING_POH, {RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"}}, + { RC_DMC_DEKU_SCRUB, {RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub", "DMC Deku Scrub"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, {RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, {RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, {RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"}}, + { RC_ZR_OPEN_GROTTO_CHEST, {RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Open Grotto Chest", "ZR Open Grotto Chest"}}, + { RC_ZR_MAGIC_BEAN_SALESMAN, {RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Magic Bean Salesman", "ZR Magic Bean Salesman"}}, + { RC_ZR_FROGS_ZELDAS_LULLABY, {RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"}}, + { RC_ZR_FROGS_EPONAS_SONG, {RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Epona's Song", "ZR Frogs Epona's Song"}}, + { RC_ZR_FROGS_SARIAS_SONG, {RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Saria's Song", "ZR Frogs Saria's Song"}}, + { RC_ZR_FROGS_SUNS_SONG, {RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Sun's Song", "ZR Frogs Sun's Song"}}, + { RC_ZR_FROGS_SONG_OF_TIME, {RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Song of Time", "ZR Frogs Song of Time"}}, + { RC_ZR_FROGS_IN_THE_RAIN, {RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs in the Rain", "ZR Frogs in the Rain"}}, + { RC_ZR_FROGS_OCARINA_GAME, {RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Ocarina Game", "ZR Frogs Ocarina Game"}}, + { RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"}}, + { RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, {RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"}}, + { RC_ZR_DEKU_SCRUB_GROTTO_REAR, {RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"}}, + { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, {RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"}}, + { RC_ZD_CHEST, {RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Chest", "ZD Chest"}}, + { RC_ZD_DIVING_MINIGAME, {RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Diving Minigame", "ZD Diving Minigame"}}, + { RC_ZD_KING_ZORA_THAWED, {RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD King Zora Thawed", "ZD King Zora Thawed"}}, + { RC_ZD_TRADE_PRESCRIPTION, {RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Trade Prescription", "ZD Trade Prescription"}}, + { RC_ZF_ICEBERC_FREESTANDING_POH, {RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"}}, + { RC_ZF_BOTTOM_FREESTANDING_POH, {RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"}}, + { RC_LLR_TALONS_CHICKENS, {RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Talons Chickens", "LLR Talons Chickens"}}, + { RC_LLR_FREESTANDING_POH, {RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Freestanding PoH", "LLR Freestanding PoH"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, {RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, {RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, {RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"}}, + { RC_DEKU_TREE_MAP_CHEST, {RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Map Chest", "Deku Tree Map Chest"}}, + { RC_DEKU_TREE_COMPASS_CHEST, {RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Compass Chest", "Deku Tree Compass Chest"}}, + { RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Compass Room Side Chest", "Deku Tree Compass Room Side Chest"}}, + { RC_DEKU_TREE_BASEMENT_CHEST, {RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Basement Chest", "Deku Tree Basement Chest"}}, + { RC_DEKU_TREE_SLINGSHOT_CHEST, {RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Slingshot Chest", "Deku Tree Slingshot Chest"}}, + { RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"}}, + { RC_DEKU_TREE_MQ_MAP_CHEST, {RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Map Chest", "Deku Tree MQ Map Chest"}}, + { RC_DEKU_TREE_MQ_COMPASS_CHEST, {RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Compass Chest", "Deku Tree MQ Compass Chest"}}, + { RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"}}, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"}}, + { RC_DEKU_TREE_MQ_BASEMENT_CHEST, {RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Basement Chest", "Deku Tree MQ Basement Chest"}}, + { RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"}}, + { RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"}}, + { RC_DEKU_TREE_MQ_DEKU_SCRUB, {RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Deku Scrub", "Deku Tree MQ Deku Scrub"}}, + { RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, {RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Boss Room Chest", "Dodongos Cavern Boss Room Chest"}}, + { RC_DODONGOS_CAVERN_MAP_CHEST, {RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Map Chest", "Dodongos Cavern Map Chest"}}, + { RC_DODONGOS_CAVERN_COMPASS_CHEST, {RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Compass Chest", "Dodongos Cavern Compass Chest"}}, + { RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"}}, + { RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"}}, + { RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"}}, + { RC_DODONGOS_CAVERN_MQ_MAP_CHEST, {RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Map Chest", "Dodongos Cavern MQ Map Chest"}}, + { RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"}}, + { RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, {RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"}}, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"}}, + { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"}}, + { RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"}}, + { RC_JABU_JABUS_BELLY_MAP_CHEST, {RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Map Chest", "Jabu Jabus Belly Map Chest"}}, + { RC_JABU_JABUS_BELLY_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Compass Chest", "Jabu Jabus Belly Compass Chest"}}, + { RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"}}, + { RC_JABU_JABUS_BELLY_DEKU_SCRUB, {RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Deku Scrub", "Jabu Jabus Belly Deku Scrub"}}, + { RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, {RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"}}, + { RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple First Room Chest", "Forest Temple First Room Chest"}}, + { RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, {RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple First Stalfos Chest", "Forest Temple First Stalfos Chest"}}, + { RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"}}, + { RC_FOREST_TEMPLE_MAP_CHEST, {RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Map Chest", "Forest Temple Map Chest"}}, + { RC_FOREST_TEMPLE_WELL_CHEST, {RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Well Chest", "Forest Temple Well Chest"}}, + { RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"}}, + { RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, {RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Eye Switch Chest", "Forest Temple Eye Switch Chest"}}, + { RC_FOREST_TEMPLE_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Boss Key Chest", "Forest Temple Boss Key Chest"}}, + { RC_FOREST_TEMPLE_FLOORMASTER_CHEST, {RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Floormaster Chest", "Forest Temple Floormaster Chest"}}, + { RC_FOREST_TEMPLE_BOW_CHEST, {RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Bow Chest", "Forest Temple Bow Chest"}}, + { RC_FOREST_TEMPLE_RED_POE_CHEST, {RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Red Poe Chest", "Forest Temple Red Poe Chest"}}, + { RC_FOREST_TEMPLE_BLUE_POE_CHEST, {RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Blue Poe Chest", "Forest Temple Blue Poe Chest"}}, + { RC_FOREST_TEMPLE_BASEMENT_CHEST, {RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Basement Chest", "Forest Temple Basement Chest"}}, + { RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ First Room Chest", "Forest Temple MQ First Room Chest"}}, + { RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, {RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"}}, + { RC_FOREST_TEMPLE_MQ_BOW_CHEST, {RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Bow Chest", "Forest Temple MQ Bow Chest"}}, + { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"}}, + { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"}}, + { RC_FOREST_TEMPLE_MQ_WELL_CHEST, {RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Well Chest", "Forest Temple MQ Well Chest"}}, + { RC_FOREST_TEMPLE_MQ_MAP_CHEST, {RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Map Chest", "Forest Temple MQ Map Chest"}}, + { RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, {RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Compass Chest", "Forest Temple MQ Compass Chest"}}, + { RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"}}, + { RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, {RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Basement Chest", "Forest Temple MQ Basement Chest"}}, + { RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, {RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Redead Chest", "Forest Temple MQ Redead Chest"}}, + { RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"}}, + { RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Near Boss Chest", "Fire Temple Near Boss Chest"}}, + { RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, {RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Flare Dancer Chest", "Fire Temple Flare Dancer Chest"}}, + { RC_FIRE_TEMPLE_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boss Key Chest", "Fire Temple Boss Key Chest"}}, + { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"}}, + { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"}}, + { RC_FIRE_TEMPLE_SCARECROW_CHEST, {RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Scarecrow Chest", "Fire Temple Scarecrow Chest"}}, + { RC_FIRE_TEMPLE_MAP_CHEST, {RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Map Chest", "Fire Temple Map Chest"}}, + { RC_FIRE_TEMPLE_COMPASS_CHEST, {RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Compass Chest", "Fire Temple Compass Chest"}}, + { RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, {RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Highest Goron Chest", "Fire Temple Highest Goron Chest"}}, + { RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"}}, + { RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"}}, + { RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"}}, + { RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, {RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Compass Chest", "Fire Temple MQ Compass Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"}}, + { RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Chest on Fire", "Fire Temple MQ Chest on Fire"}}, + { RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"}}, + { RC_FIRE_TEMPLE_MQ_MAP_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Map Chest", "Fire Temple MQ Map Chest"}}, + { RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"}}, + { RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"}}, + { RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, {RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Freestanding Key", "Fire Temple MQ Freestanding Key"}}, + { RC_WATER_TEMPLE_MAP_CHEST, {RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Map Chest", "Water Temple Map Chest"}}, + { RC_WATER_TEMPLE_COMPASS_CHEST, {RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Compass Chest", "Water Temple Compass Chest"}}, + { RC_WATER_TEMPLE_TORCHES_CHEST, {RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Torches Chest", "Water Temple Torches Chest"}}, + { RC_WATER_TEMPLE_DRAGON_CHEST, {RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Dragon Chest", "Water Temple Dragon Chest"}}, + { RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Central Bow Target Chest", "Water Temple Central Bow Target Chest"}}, + { RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Central Pillar Chest", "Water Temple Central Pillar Chest"}}, + { RC_WATER_TEMPLE_CRACKED_WALL_CHEST, {RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Cracked Wall Chest", "Water Temple Cracked Wall Chest"}}, + { RC_WATER_TEMPLE_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Boss Key Chest", "Water Temple Boss Key Chest"}}, + { RC_WATER_TEMPLE_LONGSHOT_CHEST, {RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Longshot Chest", "Water Temple Longshot Chest"}}, + { RC_WATER_TEMPLE_RIVER_CHEST, {RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple River Chest", "Water Temple River Chest"}}, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"}}, + { RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"}}, + { RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, {RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Longshot Chest", "Water Temple MQ Longshot Chest"}}, + { RC_WATER_TEMPLE_MQ_COMPASS_CHEST, {RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Compass Chest", "Water Temple MQ Compass Chest"}}, + { RC_WATER_TEMPLE_MQ_MAP_CHEST, {RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Map Chest", "Water Temple MQ Map Chest"}}, + { RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, {RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Freestanding Key", "Water Temple MQ Freestanding Key"}}, + { RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"}}, + { RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Bridge Chest", "Spirit Temple Child Bridge Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"}}, + { RC_SPIRIT_TEMPLE_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Compass Chest", "Spirit Temple Compass Chest"}}, + { RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"}}, + { RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"}}, + { RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"}}, + { RC_SPIRIT_TEMPLE_MAP_CHEST, {RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Map Chest", "Spirit Temple Map Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Climb North Chest", "Spirit Temple Child Climb North Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Climb East Chest", "Spirit Temple Child Climb East Chest"}}, + { RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"}}, + { RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"}}, + { RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"}}, + { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"}}, + { RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Boss Key Chest", "Spirit Temple Boss Key Chest"}}, + { RC_SPIRIT_TEMPLE_TOPMOST_CHEST, {RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Topmost Chest", "Spirit Temple Topmost Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Map Chest", "Spirit Temple MQ Map Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Compass Chest", "Spirit Temple MQ Compass Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MAP_CHEST, {RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Map Chest", "Shadow Temple Map Chest"}}, + { RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Hover Boots Chest", "Shadow Temple Hover Boots Chest"}}, + { RC_SHADOW_TEMPLE_COMPASS_CHEST, {RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Compass Chest", "Shadow Temple Compass Chest"}}, + { RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"}}, + { RC_SHADOW_TEMPLE_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Wind Hint Chest", "Shadow Temple Wind Hint Chest"}}, + { RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"}}, + { RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"}}, + { RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"}}, + { RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Boss Key Chest", "Shadow Temple Boss Key Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"}}, + { RC_SHADOW_TEMPLE_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Freestanding Key", "Shadow Temple Freestanding Key"}}, + { RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, {RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Compass Chest", "Shadow Temple MQ Compass Chest"}}, + { RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"}}, + { RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"}}, + { RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Map Chest", "Shadow Temple MQ Map Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"}}, + { RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"}}, + { RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"}}, + { RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"}}, + { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"}}, + { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"}}, + { RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"}}, + { RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"}}, + { RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Compass Chest", "Bottom of the Well Compass Chest"}}, + { RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"}}, + { RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"}}, + { RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"}}, + { RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Invisible Chest", "Bottom of the Well Invisible Chest"}}, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Underwater Front Chest", "Bottom of the Well Underwater Front Chest"}}, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Underwater Left Chest", "Bottom of the Well Underwater Left Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Map Chest", "Bottom of the Well Map Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Fire Keese Chest", "Bottom of the Well Fire Keese Chest"}}, + { RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Like Like Chest", "Bottom of the Well Like Like Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Freestanding Key", "Bottom of the Well Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Map Chest", "Bottom of the Well MQ Map Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Compass Chest", "Bottom of the Well MQ Compass Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"}}, + { RC_ICE_CAVERN_MAP_CHEST, {RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Map Chest", "Ice Cavern Map Chest"}}, + { RC_ICE_CAVERN_COMPASS_CHEST, {RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Compass Chest", "Ice Cavern Compass Chest"}}, + { RC_ICE_CAVERN_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Iron Boots Chest", "Ice Cavern Iron Boots Chest"}}, + { RC_ICE_CAVERN_FREESTANDING_POH, {RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Freestanding PoH", "Ice Cavern Freestanding PoH"}}, + { RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"}}, + { RC_ICE_CAVERN_MQ_COMPASS_CHEST, {RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Compass Chest", "Ice Cavern MQ Compass Chest"}}, + { RC_ICE_CAVERN_MQ_MAP_CHEST, {RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Map Chest", "Ice Cavern MQ Map Chest"}}, + { RC_ICE_CAVERN_MQ_FREESTANDING_POH, {RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"}}, + { RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"}}, + { RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"}}, + { RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, {RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Beamos Chest", "Gerudo Training Grounds Beamos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"}}, + { RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"}}, + { RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"}}, + { RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, {RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"}}, + { RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"}}, + { RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, {RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Freestanding Key", "Gerudo Training Grounds Freestanding Key"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"}}, + { RC_GANONS_TOWER_BOSS_KEY_CHEST, {RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Tower Boss Key Chest", "Ganon's Tower Boss Key Chest"}}, + { RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Forest Trial Chest", "Ganon's Castle Forest Trial Chest"}}, + { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"}}, + { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"}}, + { RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"}}, + { RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"}}, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"}}, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Right", "Ganon's Castle Deku Scrub Right"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Left", "Ganon's Castle Deku Scrub Left"}}, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"}}, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"}}, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"}}, + { RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Basement Back Room", "Deku Tree GS Basement Back Room"}}, + { RC_DEKU_TREE_GS_BASEMENT_GATE, {RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Basement Gate", "Deku Tree GS Basement Gate"}}, + { RC_DEKU_TREE_GS_BASEMENT_VINES, {RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Basement Vines", "Deku Tree GS Basement Vines"}}, + { RC_DEKU_TREE_GS_COMPASS_ROOM, {RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Compass Room", "Deku Tree GS Compass Room"}}, + { RC_DEKU_TREE_MQ_GS_LOBBY, {RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Lobby", "Deku Tree MQ GS Lobby"}}, + { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Compass Room", "Deku Tree MQ GS Compass Room"}}, + { RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"}}, + { RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"}}, + { RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"}}, + { RC_DODONGOS_CAVERN_GS_SCARECROW, {RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Scarecrow", "Dodongos Cavern GS Scarecrow"}}, + { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"}}, + { RC_DODONGOS_CAVERN_GS_BACK_ROOM, {RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Back Room", "Dodongos Cavern GS Back Room"}}, + { RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"}}, + { RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, {RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"}}, + { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"}}, + { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"}}, + { RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Near Boss", "Jabu Jabus Belly GS Near Boss"}}, + { RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"}}, + { RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"}}, + { RC_FOREST_TEMPLE_GS_FIRST_ROOM, {RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS First Room", "Forest Temple GS First Room"}}, + { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"}}, + { RC_FOREST_TEMPLE_GS_LOBBY, {RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Lobby", "Forest Temple GS Lobby"}}, + { RC_FOREST_TEMPLE_GS_BASEMENT, {RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Basement", "Forest Temple GS Basement"}}, + { RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS First Hallway", "Forest Temple MQ GS First Hallway"}}, + { RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"}}, + { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"}}, + { RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"}}, + { RC_FOREST_TEMPLE_MQ_GS_WELL, {RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Well", "Forest Temple MQ GS Well"}}, + { RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Song of Time Room", "Fire Temple GS Song of Time Room"}}, + { RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Boss Key Loop", "Fire Temple GS Boss Key Loop"}}, + { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, {RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Boulder Maze", "Fire Temple GS Boulder Maze"}}, + { RC_FIRE_TEMPLE_GS_SCARECROW_TOP, {RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Scarecrow Top", "Fire Temple GS Scarecrow Top"}}, + { RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, {RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"}}, + { RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"}}, + { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"}}, + { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"}}, + { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"}}, + { RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"}}, + { RC_WATER_TEMPLE_GS_BEHIND_GATE, {RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Behind Gate", "Water Temple GS Behind Gate"}}, + { RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Falling Platform Room", "Water Temple GS Falling Platform Room"}}, + { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, {RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Central Pillar", "Water Temple GS Central Pillar"}}, + { RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"}}, + { RC_WATER_TEMPLE_GS_RIVER, {RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS River", "Water Temple GS River"}}, + { RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"}}, + { RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"}}, + { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"}}, + { RC_WATER_TEMPLE_MQ_GS_RIVER, {RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS River", "Water Temple MQ GS River"}}, + { RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"}}, + { RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"}}, + { RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Boulder Room", "Spirit Temple GS Boulder Room"}}, + { RC_SPIRIT_TEMPLE_GS_LOBBY, {RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Lobby", "Spirit Temple GS Lobby"}}, + { RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"}}, + { RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Metal Fence", "Spirit Temple GS Metal Fence"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"}}, + { RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"}}, + { RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"}}, + { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"}}, + { RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Like Like Room", "Shadow Temple GS Like Like Room"}}, + { RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Near Ship", "Shadow Temple GS Near Ship"}}, + { RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"}}, + { RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"}}, + { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS After Wind", "Shadow Temple MQ GS After Wind"}}, + { RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS After Ship", "Shadow Temple MQ GS After Ship"}}, + { RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"}}, + { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well GS Like Like Cage", "Bottom of the Well GS Like Like Cage"}}, + { RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well GS East Inner Room", "Bottom of the Well GS East Inner Room"}}, + { RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well GS West Inner Room", "Bottom of the Well GS West Inner Room"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ GS Basement", "Bottom of the Well MQ GS Basement"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"}}, + { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern GS Push Block Room", "Ice Cavern GS Push Block Room"}}, + { RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"}}, + { RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"}}, + { RC_ICE_CAVERN_MQ_GS_SCARECROW, {RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"}}, + { RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, {RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"}}, + { RC_ICE_CAVERN_MQ_GS_RED_ICE, {RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"}}, + { RC_KF_GS_BEAN_PATCH, {RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF GS Bean Patch", "KF GS Bean Patch"}}, + { RC_KF_GS_KNOW_IT_ALL_HOUSE, {RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF GS Know It All House", "KF GS Know It All House"}}, + { RC_KF_GS_HOUSE_OF_TWINS, {RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF GS House of Twins", "KF GS House of Twins"}}, + { RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, {RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"}}, + { RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"}}, + { RC_LW_GS_ABOVE_THEATER, {RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW GS Above Theater", "LW GS Above Theater"}}, + { RC_SFM_GS, {RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM GS", "SFM GS"}}, + { RC_HF_GS_COW_GROTTO, {RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF GS Cow Grotto", "HF GS Cow Grotto"}}, + { RC_HF_GS_NEAR_KAK_GROTTO, {RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF GS Near Kak Grotto", "HF GS Near Kak Grotto"}}, + { RC_LH_GS_BEAN_PATCH, {RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Bean Patch", "LH GS Bean Patch"}}, + { RC_LH_GS_SMALL_ISLAND, {RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Small Island", "LH GS Small Island"}}, + { RC_LH_GS_LAB_WALL, {RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Lab Wall", "LH GS Lab Wall"}}, + { RC_LH_GS_LAB_CRATE, {RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Lab Crate", "LH GS Lab Crate"}}, + { RC_LH_GS_TREE, {RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Tree", "LH GS Tree"}}, + { RC_GV_GS_BEAN_PATCH, {RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Bean Patch", "GV GS Bean Patch"}}, + { RC_GV_GS_SMALL_BRIDGE, {RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Small Bridge", "GV GS Small Bridge"}}, + { RC_GV_GS_PILLAR, {RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Pillar", "GV GS Pillar"}}, + { RC_GV_GS_BEHIND_TENT, {RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Behind Tent", "GV GS Behind Tent"}}, + { RC_GF_GS_ARCHERY_RANGE, {RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF GS Archery Range", "GF GS Archery Range"}}, + { RC_GF_GS_TOP_FLOOR, {RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF GS Top Floor", "GF GS Top Floor"}}, + { RC_WASTELAND_GS, {RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Wasteland GS", "Wasteland GS"}}, + { RC_COLOSSUS_GS_BEAN_PATCH, {RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus GS Bean Patch", "Colossus GS Bean Patch"}}, + { RC_COLOSSUS_GS_HILL, {RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus GS Hill", "Colossus GS Hill"}}, + { RC_COLOSSUS_GS_TREE, {RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus GS Tree", "Colossus GS Tree"}}, + { RC_OGC_GS, {RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "OGC GS", "OGC GS"}}, + { RC_HC_GS_STORMS_GROTTO, {RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC GS Storms Grotto", "HC GS Storms Grotto"}}, + { RC_HC_GS_TREE, {RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC GS Tree", "HC GS Tree"}}, + { RC_MARKET_GS_GUARD_HOUSE, {RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Market GS Guard House", "Market GS Guard House"}}, + { RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, {RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS House Under Construction", "Kak GS House Under Construction"}}, + { RC_KAK_GS_SKULLTULA_HOUSE, {RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Skulltula House", "Kak GS Skulltula House"}}, + { RC_KAK_GS_GUARDS_HOUSE, {RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Guards House", "Kak GS Guards House"}}, + { RC_KAK_GS_TREE, {RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Tree", "Kak GS Tree"}}, + { RC_KAK_GS_WATCHTOWER, {RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Watchtower", "Kak GS Watchtower"}}, + { RC_KAK_GS_ABOVE_IMPAS_HOUSE, {RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Above Impas House", "Kak GS Above Impas House"}}, + { RC_GRAVEYARD_GS_WALL, {RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Graveyard GS Wall", "Graveyard GS Wall"}}, + { RC_GRAVEYARD_GS_BEAN_PATCH, {RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Graveyard GS Bean Patch", "Graveyard GS Bean Patch"}}, + { RC_DMC_GS_BEAN_PATCH, {RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC GS Bean Patch", "DMC GS Bean Patch"}}, + { RC_DMC_GS_CRATE, {RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC GS Crate", "DMC GS Crate"}}, + { RC_DMT_GS_BEAN_PATCH, {RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Bean Patch", "DMT GS Bean Patch"}}, + { RC_DMT_GS_NEAR_KAK, {RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Near Kak", "DMT GS Near Kak"}}, + { RC_DMT_GS_ABOVE_DODONGOS_CAVERN, {RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"}}, + { RC_DMT_GS_FALLING_ROCKS_PATH, {RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Falling Rocks Path", "DMT GS Falling Rocks Path"}}, + { RC_GC_GS_CENTER_PLATFORM, {RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC GS Center Platform", "GC GS Center Platform"}}, + { RC_GC_GS_BOULDER_MAZE, {RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC GS Boulder Maze", "GC GS Boulder Maze"}}, + { RC_ZR_GS_LADDER, {RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Ladder", "ZR GS Ladder"}}, + { RC_ZR_GS_TREE, {RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Tree", "ZR GS Tree"}}, + { RC_ZR_GS_ABOVE_BRIDGE, {RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Above Bridge", "ZR GS Above Bridge"}}, + { RC_ZR_GS_NEAR_RAISED_GROTTOS, {RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Near Raised Grottos", "ZR GS Near Raised Grottos"}}, + { RC_ZD_GS_FROZEN_WATERFALL, {RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD GS Frozen Waterfall", "ZD GS Frozen Waterfall"}}, + { RC_ZF_GS_ABOVE_THE_LOG, {RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF GS Above The Log", "ZF GS Above The Log"}}, + { RC_ZF_GS_HIDDEN_CAVE, {RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF GS Hidden Cave", "ZF GS Hidden Cave"}}, + { RC_ZF_GS_TREE, {RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF GS Tree", "ZF GS Tree"}}, + { RC_LLR_GS_BACK_WALL, {RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS Back Wall", "LLR GS Back Wall"}}, + { RC_LLR_GS_RAIN_SHED, {RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS Rain Shed", "LLR GS Rain Shed"}}, + { RC_LLR_GS_HOUSE_WINDOW, {RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS House Window", "LLR GS House Window"}}, + { RC_LLR_GS_TREE, {RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS Tree", "LLR GS Tree"}}, + { RC_LINKS_POCKET, {RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Link's Pocket", "Link's Pocket"}}, + { RC_QUEEN_GOHMA, {RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Queen Gohma", "Queen Gohma"}}, + { RC_KING_DODONGO, {RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "King Dodongo", "King Dodongo"}}, + { RC_BARINADE, {RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Barinade", "Barinade"}}, + { RC_PHANTOM_GANON, {RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Phantom Ganon", "Phantom Ganon"}}, + { RC_VOLVAGIA, {RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Volvagia", "Volvagia"}}, + { RC_MORPHA, {RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Morpha", "Morpha"}}, + { RC_TWINROVA, {RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Twinrova", "Twinrova"}}, + { RC_BONGO_BONGO, {RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bongo Bongo", "Bongo Bongo"}}, + { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon", "Ganon"}}, + { RC_DEKU_TREE_QUEEN_GOHMA_HEART, {RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"}}, + { RC_DODONGOS_CAVERN_KING_DODONGO_HEART, {RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"}}, + { RC_JABU_JABUS_BELLY_BARINADE_HEART, {RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"}}, + { RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, {RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"}}, + { RC_FIRE_TEMPLE_VOLVAGIA_HEART, {RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Volvagia Heart Container", "Fire Temple Volvagia Heart Container"}}, + { RC_WATER_TEMPLE_MORPHA_HEART, {RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Morpha Heart Container", "Water Temple Morpha Heart Container"}}, + { RC_SPIRIT_TEMPLE_TWINROVA_HEART, {RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"}}, + { RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, {RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"}}, + { RC_TOT_LIGHT_ARROWS_CUTSCENE, {RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"}}, + { RC_LW_GIFT_FROM_SARIA, {RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Gift From Saria", "LW Gift From Saria"}}, + { RC_ZF_GREAT_FAIRY_REWARD, {RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF Great Fairy Reward", "ZF Great Fairy Reward"}}, + { RC_HC_GREAT_FAIRY_REWARD, {RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Great Fairy Reward", "HC Great Fairy Reward"}}, + { RC_COLOSSUS_GREAT_FAIRY_REWARD, {RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Great Fairy Reward", "Colossus Great Fairy Reward"}}, + { RC_DMT_GREAT_FAIRY_REWARD, {RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Great Fairy Reward", "DMT Great Fairy Reward"}}, + { RC_DMC_GREAT_FAIRY_REWARD, {RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Great Fairy Reward", "DMC Great Fairy Reward"}}, + { RC_OGC_GREAT_FAIRY_REWARD, {RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "OGC Great Fairy Reward", "OGC Great Fairy Reward"}}, + { RC_SHEIK_IN_FOREST, {RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Forest", "Sheik in Forest"}}, + { RC_SHEIK_IN_CRATER, {RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Crater", "Sheik in Crater"}}, + { RC_SHEIK_IN_ICE_CAVERN, {RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Ice Cavern", "Sheik in Ice Cavern"}}, + { RC_SHEIK_AT_COLOSSUS, {RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik at Colossus", "Sheik at Colossus"}}, + { RC_SHEIK_IN_KAKARIKO, {RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Kakariko", "Sheik in Kakariko"}}, + { RC_SHEIK_AT_TEMPLE, {RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik at Temple", "Sheik at Temple"}}, + { RC_SONG_FROM_IMPA, {RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Impa", "Song from Impa"}}, + { RC_SONG_FROM_MALON, {RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Malon", "Song from Malon"}}, + { RC_SONG_FROM_SARIA, {RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Saria", "Song from Saria"}}, + { RC_SONG_FROM_ROYAL_FAMILYS_TOMB, {RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Composers Grave", "Song from Composers Grave"}}, + { RC_SONG_FROM_OCARINA_OF_TIME, {RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Ocarina of Time", "Song from Ocarina of Time"}}, + { RC_SONG_FROM_WINDMILL, {RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Windmill", "Song from Windmill"}}, + { RC_KF_LINKS_HOUSE_COW, {RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Links House Cow", "KF Links House Cow"}}, + { RC_HF_COW_GROTTO_COW, {RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Cow Grotto Cow", "HF Cow Grotto Cow"}}, + { RC_LLR_STABLES_LEFT_COW, {RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Stables Left Cow", "LLR Stables Left Cow"}}, + { RC_LLR_STABLES_RIGHT_COW, {RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Stables Right Cow", "LLR Stables Right Cow"}}, + { RC_LLR_TOWER_LEFT_COW, {RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Tower Left Cow", "LLR Tower Left Cow"}}, + { RC_LLR_TOWER_RIGHT_COW, {RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Tower Right Cow", "LLR Tower Right Cow"}}, + { RC_KAK_IMPAS_HOUSE_COW, {RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Impas House Cow", "Kak Impas House Cow"}}, + { RC_DMT_COW_GROTTO_COW, {RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Cow Grotto Cow", "DMT Cow Grotto Cow"}}, + { RC_GV_COW, {RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Cow", "GV Cow"}}, + { RC_JABU_JABUS_BELLY_MQ_COW, {RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Cow", "Jabu Jabus Belly MQ Cow"}}, + { RC_KF_SHOP_ITEM_1, {RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 1", "KF Shop Item 1"}}, + { RC_KF_SHOP_ITEM_2, {RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 2", "KF Shop Item 2"}}, + { RC_KF_SHOP_ITEM_3, {RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 3", "KF Shop Item 3"}}, + { RC_KF_SHOP_ITEM_4, {RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 4", "KF Shop Item 4"}}, + { RC_KF_SHOP_ITEM_5, {RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 5", "KF Shop Item 5"}}, + { RC_KF_SHOP_ITEM_6, {RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 6", "KF Shop Item 6"}}, + { RC_KF_SHOP_ITEM_7, {RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 7", "KF Shop Item 7"}}, + { RC_KF_SHOP_ITEM_8, {RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 8", "KF Shop Item 8"}}, + { RC_KAK_POTION_SHOP_ITEM_1, {RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 1", "Kak Potion Shop Item 1"}}, + { RC_KAK_POTION_SHOP_ITEM_2, {RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 2", "Kak Potion Shop Item 2"}}, + { RC_KAK_POTION_SHOP_ITEM_3, {RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 3", "Kak Potion Shop Item 3"}}, + { RC_KAK_POTION_SHOP_ITEM_4, {RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 4", "Kak Potion Shop Item 4"}}, + { RC_KAK_POTION_SHOP_ITEM_5, {RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 5", "Kak Potion Shop Item 5"}}, + { RC_KAK_POTION_SHOP_ITEM_6, {RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 6", "Kak Potion Shop Item 6"}}, + { RC_KAK_POTION_SHOP_ITEM_7, {RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 7", "Kak Potion Shop Item 7"}}, + { RC_KAK_POTION_SHOP_ITEM_8, {RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 8", "Kak Potion Shop Item 8"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_1, {RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 1", "MK Bombchu Shop Item 1"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_2, {RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 2", "MK Bombchu Shop Item 2"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_3, {RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 3", "MK Bombchu Shop Item 3"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_4, {RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 4", "MK Bombchu Shop Item 4"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_5, {RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 5", "MK Bombchu Shop Item 5"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_6, {RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 6", "MK Bombchu Shop Item 6"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_7, {RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 7", "MK Bombchu Shop Item 7"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_8, {RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 8", "MK Bombchu Shop Item 8"}}, + { RC_MARKET_POTION_SHOP_ITEM_1, {RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 1", "MK Potion Shop Item 1"}}, + { RC_MARKET_POTION_SHOP_ITEM_2, {RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 2", "MK Potion Shop Item 2"}}, + { RC_MARKET_POTION_SHOP_ITEM_3, {RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 3", "MK Potion Shop Item 3"}}, + { RC_MARKET_POTION_SHOP_ITEM_4, {RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 4", "MK Potion Shop Item 4"}}, + { RC_MARKET_POTION_SHOP_ITEM_5, {RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 5", "MK Potion Shop Item 5"}}, + { RC_MARKET_POTION_SHOP_ITEM_6, {RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 6", "MK Potion Shop Item 6"}}, + { RC_MARKET_POTION_SHOP_ITEM_7, {RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 7", "MK Potion Shop Item 7"}}, + { RC_MARKET_POTION_SHOP_ITEM_8, {RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 8", "MK Potion Shop Item 8"}}, + { RC_MARKET_BAZAAR_ITEM_1, {RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 1", "MK Bazaar Item 1"}}, + { RC_MARKET_BAZAAR_ITEM_2, {RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 2", "MK Bazaar Item 2"}}, + { RC_MARKET_BAZAAR_ITEM_3, {RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 3", "MK Bazaar Item 3"}}, + { RC_MARKET_BAZAAR_ITEM_4, {RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 4", "MK Bazaar Item 4"}}, + { RC_MARKET_BAZAAR_ITEM_5, {RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 5", "MK Bazaar Item 5"}}, + { RC_MARKET_BAZAAR_ITEM_6, {RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 6", "MK Bazaar Item 6"}}, + { RC_MARKET_BAZAAR_ITEM_7, {RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 7", "MK Bazaar Item 7"}}, + { RC_MARKET_BAZAAR_ITEM_8, {RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 8", "MK Bazaar Item 8"}}, + { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 1", "Kak Bazaar Item 1"}}, + { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 2", "Kak Bazaar Item 2"}}, + { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 3", "Kak Bazaar Item 3"}}, + { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 4", "Kak Bazaar Item 4"}}, + { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 5", "Kak Bazaar Item 5"}}, + { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 6", "Kak Bazaar Item 6"}}, + { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 7", "Kak Bazaar Item 7"}}, + { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 8", "Kak Bazaar Item 8"}}, + { RC_ZD_SHOP_ITEM_1, {RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 1", "ZD Shop Item 1"}}, + { RC_ZD_SHOP_ITEM_2, {RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 2", "ZD Shop Item 2"}}, + { RC_ZD_SHOP_ITEM_3, {RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 3", "ZD Shop Item 3"}}, + { RC_ZD_SHOP_ITEM_4, {RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 4", "ZD Shop Item 4"}}, + { RC_ZD_SHOP_ITEM_5, {RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 5", "ZD Shop Item 5"}}, + { RC_ZD_SHOP_ITEM_6, {RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 6", "ZD Shop Item 6"}}, + { RC_ZD_SHOP_ITEM_7, {RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 7", "ZD Shop Item 7"}}, + { RC_ZD_SHOP_ITEM_8, {RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 8", "ZD Shop Item 8"}}, + { RC_GC_SHOP_ITEM_1, {RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 1", "GC Shop Item 1"}}, + { RC_GC_SHOP_ITEM_2, {RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 2", "GC Shop Item 2"}}, + { RC_GC_SHOP_ITEM_3, {RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 3", "GC Shop Item 3"}}, + { RC_GC_SHOP_ITEM_4, {RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 4", "GC Shop Item 4"}}, + { RC_GC_SHOP_ITEM_5, {RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 5", "GC Shop Item 5"}}, + { RC_GC_SHOP_ITEM_6, {RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 6", "GC Shop Item 6"}}, + { RC_GC_SHOP_ITEM_7, {RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 7", "GC Shop Item 7"}}, + { RC_GC_SHOP_ITEM_8, {RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 8", "GC Shop Item 8"}}, + { RC_COLOSSUS_GOSSIP_STONE, {RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Gossip Stone", "Colossus Gossip Stone"}}, + { RC_DMC_GOSSIP_STONE, {RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Gossip Stone", "DMC Gossip Stone"}}, + { RC_DMC_UPPER_GROTTO_GOSSIP_STONE, {RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"}}, + { RC_DMT_GOSSIP_STONE, {RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Gossip Stone", "DMT Gossip Stone"}}, + { RC_DMT_STORMS_GROTTO_GOSSIP_STONE, {RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"}}, + { RC_DODONGOS_CAVERN_GOSSIP_STONE, {RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongo's Cavern Gossip Stone", "Dodongo's Cavern Gossip Stone"}}, + { RC_FAIRY_GOSSIP_STONE, {RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fairy Gossip Stone", "Fairy Gossip Stone"}}, + { RC_GC_MAZE_GOSSIP_STONE, {RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Gossip Stone", "GC Maze Gossip Stone"}}, + { RC_GC_MEDIGORON_GOSSIP_STONE, {RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Medigoron Gossip Stone", "GC Medigoron Gossip Stone"}}, + { RC_GV_GOSSIP_STONE, {RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Gossip Stone", "GV Gossip Stone"}}, + { RC_GY_GOSSIP_STONE, {RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Gossip Stone", "GY Gossip Stone"}}, + { RC_HC_MALON_GOSSIP_STONE, {RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Malon Gossip Stone", "HC Malon Gossip Stone"}}, + { RC_HC_ROCK_WALL_GOSSIP_STONE, {RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"}}, + { RC_HC_STORMS_GROTTO_GOSSIP_STONE, {RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"}}, + { RC_HF_COW_GROTTO_GOSSIP_STONE, {RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"}}, + { RC_HF_NEAR_MARKET_GOSSIP_STONE, {RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Near Market Gossip Stone", "HF Near Market Gossip Stone"}}, + { RC_HF_OPEN_GROTTO_GOSSIP_STONE, {RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"}}, + { RC_HF_SOUTHEAST_GOSSIP_STONE, {RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Southeast Gossip Stone", "HF Southeast Gossip Stone"}}, + { RC_JABU_GOSSIP_STONE, {RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Gossip Stone", "Jabu Gossip Stone"}}, + { RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, {RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"}}, + { RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, {RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"}}, + { RC_KF_GOSSIP_STONE, {RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Gossip Stone", "KF Gossip Stone"}}, + { RC_KF_STORMS_GOSSIP_STONE, {RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Storms Gossip Stone", "KF Storms Gossip Stone"}}, + { RC_KAK_OPEN_GROTTO_GOSSIP_STONE, {RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"}}, + { RC_LH_LAB_GOSSIP_STONE, {RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Lab Gossip Stone", "LH Lab Gossip Stone"}}, + { RC_LH_SOUTHEAST_GOSSIP_STONE, {RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Southeast Gossip Stone", "LH Southeast Gossip Stone"}}, + { RC_LH_SOUTHWEST_GOSSIP_STONE, {RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Southwest Gossip Stone", "LH Southwest Gossip Stone"}}, + { RC_LW_GOSSIP_STONE, {RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Gossip Stone", "LW Gossip Stone"}}, + { RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"}}, + { RC_SFM_MAZE_LOWER_GOSSIP_STONE, {RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"}}, + { RC_SFM_MAZE_UPPER_GOSSIP_STONE, {RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"}}, + { RC_SFM_SARIA_GOSSIP_STONE, {RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Saria Gossip Stone", "SFM Saria Gossip Stone"}}, + { RC_TOT_LEFT_CENTER_GOSSIP_STONE, {RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"}}, + { RC_TOT_LEFT_GOSSIP_STONE, {RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Left Gossip Stone", "ToT Left Gossip Stone"}}, + { RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"}}, + { RC_TOT_RIGHT_GOSSIP_STONE, {RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Right Gossip Stone", "ToT Right Gossip Stone"}}, + { RC_ZD_GOSSIP_STONE, {RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Gossip Stone", "ZD Gossip Stone"}}, + { RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, {RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"}}, + { RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, {RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"}}, + { RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"}}, +}; + +std::unordered_map RandomizerCheckObjects::GetAllRCObjects() { + return rcObjects; +} + +RandomizerCheckObject RandomizerCheckObjects::GetRCObject(RandomizerCheck check) { + return rcObjects[check]; +} diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h new file mode 100644 index 000000000..c07d64f05 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -0,0 +1,43 @@ +#pragma once +#include "randomizerTypes.h" +#include +#include + +// Check types based on main settings +typedef enum { + RCTYPE_STANDARD, // Base set of rando checks + RCTYPE_SKULL_TOKEN, // Gold Skulltulas + RCTYPE_COW, // Cows + RCTYPE_ADULT_TRADE, // Adult trade quest checks + RCTYPE_FROG_SONG, // Frog song purple rupee checks + RCTYPE_MAP_COMPASS, // Maps/Compasses + RCTYPE_SMALL_KEY, // Small Keys + RCTYPE_GF_KEY, // Gerudo Fortress Keys + RCTYPE_BOSS_KEY, // Boss Keys + RCTYPE_GANON_BOSS_KEY +} RandomizerCheckType; + +typedef enum { + RCVORMQ_VANILLA, + RCVORMQ_MQ, + RCVORMQ_BOTH +} RandomizerCheckVanillaOrMQ; + +typedef enum { + RCAREA_KOKIRI_FOREST, +} RandomizerCheckArea; + +typedef struct { + RandomizerCheck rc; + RandomizerCheckVanillaOrMQ vOrMQ; + RandomizerCheckType rcType; + RandomizerCheckArea rcArea; + std::string rcShortName; + std::string rcSpoilerName; +} RandomizerCheckObject; + +namespace RandomizerCheckObjects { + std::unordered_map GetAllRCObjects(); + RandomizerCheckObject GetRCObject(RandomizerCheck check); + +} \ No newline at end of file From a7d4aa80428d80ad27036400073a0b1d27ff3775 Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 07:37:24 -0400 Subject: [PATCH 109/212] add areas to rcos --- .../randomizer/randomizer_check_objects.cpp | 1464 ++++++++--------- .../randomizer/randomizer_check_objects.h | 37 +- 2 files changed, 767 insertions(+), 734 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 3567c0fb6..f61ac4a24 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -13,739 +13,737 @@ typedef struct { */ std::unordered_map rcObjects = { { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Invalid Location", "Invalid Location"}}, - { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, - { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Top Left Chest", "KF Mido Top Left Chest"}}, - { RC_KF_MIDOS_TOP_RIGHT_CHEST, {RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Top Right Chest", "KF Mido Top Right Chest"}}, - { RC_KF_MIDOS_BOTTOM_LEFT_CHEST, {RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Bottom Left Chest", "KF Mido Bottom Left Chest"}}, - { RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, {RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Mido Bottom Right Chest", "KF Mido Bottom Right Chest"}}, - { RC_KF_STORMS_GROTTO_CHEST, {RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Storms Grotto Chest", "KF Storms Grotto Chest"}}, - { RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"}}, - { RC_LW_SKULL_KID, {RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Skull Kid", "LW Skull Kid"}}, - { RC_LW_TRADE_COJIRO, {RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Trade Cojiro", "LW Trade Cojiro"}}, - { RC_LW_TRADE_ODD_POTION, {RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Trade Odd Potion", "LW Trade Odd Potion"}}, - { RC_LW_OCARINA_MEMORY_GAME, {RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Ocarina Memory Game", "LW Ocarina Memory Game"}}, - { RC_LW_TARGET_IN_WOODS, {RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Target in Woods", "LW Target in Woods"}}, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"}}, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"}}, - { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, {RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"}}, - { RC_LW_DEKU_SCRUB_GROTTO_REAR, {RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"}}, - { RC_LW_DEKU_SCRUB_GROTTO_FRONT, {RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"}}, - { RC_DEKU_THEATER_SKULL_MASK, {RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Theater Skull Mask", "Deku Theater Skull Mask"}}, - { RC_DEKU_THEATER_MASK_OF_TRUTH, {RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"}}, - { RC_SFM_WOLFOS_GROTTO_CHEST, {RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"}}, - { RC_SFM_DEKU_SCRUB_GROTTO_REAR, {RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"}}, - { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, {RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"}}, - { RC_HF_SOUTHEAST_GROTTO_CHEST, {RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Southeast Grotto Chest", "HF Southeast Grotto Chest"}}, - { RC_HF_OPEN_GROTTO_CHEST, {RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Open Grotto Chest", "HF Open Grotto Chest"}}, - { RC_HF_NEAR_MARKET_GROTTO_CHEST, {RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Near Market Grotto Chest", "HF Near Market Grotto Chest"}}, - { RC_HF_OCARINA_OF_TIME_ITEM, {RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Ocarina of Time Item", "HF Ocarina of Time Item"}}, - { RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, {RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"}}, - { RC_HF_DEKU_SCRUB_GROTTO, {RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Deku Scrub Grotto", "HF Deku Scrub Grotto"}}, - { RC_LH_CHILD_FISHING, {RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Child Fishing", "LH Child Fishing"}}, - { RC_LH_ADULT_FISHING, {RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Adult Fishing", "LH Adult Fishing"}}, - { RC_LH_LAB_DIVE, {RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Lab Dive", "LH Lab Dive"}}, - { RC_LH_TRADE_FROG, {RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"}}, - { RC_LH_UNDERWATER_ITEM, {RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Underwater Item", "LH Underwater Item"}}, - { RC_LH_SUN, {RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Sun", "LH Sun"}}, - { RC_LH_FREESTANDING_POH, {RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Freestanding PoH", "LH Freestanding PoH"}}, - { RC_LH_DEKU_SCRUB_GROTTO_LEFT, {RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"}}, - { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, {RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"}}, - { RC_LH_DEKU_SCRUB_GROTTO_CENTER, {RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"}}, - { RC_GV_CHEST, {RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Chest", "GV Chest"}}, - { RC_GV_TRADE_SAW, {RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Trade Saw", "GV Trade Saw"}}, - { RC_GV_WATERFALL_FREESTANDING_POH, {RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"}}, - { RC_GV_CRATE_FREESTANDING_POH, {RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Crate Freestanding PoH", "GV Crate Freestanding PoH"}}, - { RC_GV_DEKU_SCRUB_GROTTO_REAR, {RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"}}, - { RC_GV_DEKU_SCRUB_GROTTO_FRONT, {RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"}}, - { RC_GF_CHEST, {RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF Chest", "GF Chest"}}, - { RC_GF_HBA_1000_POINTS, {RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF HBA 1000 Points", "GF HBA 1000 Points"}}, - { RC_GF_HBA_1500_POINTS, {RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF HBA 1500 Points", "GF HBA 1500 Points"}}, - { RC_GF_GERUDO_MEMBERSHIP_CARD, {RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF Gerudo Membership Card", "GF Gerudo Membership Card"}}, - { RC_GF_NORTH_F1_CARPENTER, {RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF North F1 Carpenter", "GF North F1 Carpenter"}}, - { RC_GF_NORTH_F2_CARPENTER, {RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF North F2 Carpenter", "GF North F2 Carpenter"}}, - { RC_GF_SOUTH_F1_CARPENTER, {RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF South F1 Carpenter", "GF South F1 Carpenter"}}, - { RC_GF_SOUTH_F2_CARPENTER, {RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF South F2 Carpenter", "GF South F2 Carpenter"}}, - { RC_WASTELAND_CHEST, {RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Wasteland Chest", "Wasteland Chest"}}, - { RC_WASTELAND_BOMBCHU_SALESMAN, {RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Wasteland Carpet Salesman", "Wasteland Carpet Salesman"}}, - { RC_COLOSSUS_FREESTANDING_POH, {RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Freestanding PoH", "Colossus Freestanding PoH"}}, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"}}, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"}}, - { RC_MARKET_TREASURE_CHEST_GAME_REWARD, {RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Treasure Chest Game Reward", "MK Treasure Chest Game Reward"}}, - { RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"}}, - { RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"}}, - { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Bowling Bombchus", "MK Bombchu Bowling Bombchus"}}, - { RC_MARKET_LOST_DOG, {RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Lost Dog", "MK Lost Dog"}}, - { RC_MARKET_SHOOTING_GALLERY_REWARD, {RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Shooting Gallery", "MK Shooting Gallery"}}, - { RC_MARKET_10_BIG_POES, {RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK 10 Big Poes", "MK 10 Big Poes"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game First Room Chest", "MK Chest Game First Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Second Room Chest", "MK Chest Game Second Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Third Room Chest", "MK Chest Game Third Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"}}, - { RC_HC_MALON_EGG, {RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Malon Egg", "HC Malon Egg"}}, - { RC_HC_ZELDAS_LETTER, {RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Zeldas Letter", "HC Zeldas Letter"}}, - { RC_KAK_REDEAD_GROTTO_CHEST, {RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Redead Grotto Chest", "Kak Redead Grotto Chest"}}, - { RC_KAK_OPEN_GROTTO_CHEST, {RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Open Grotto Chest", "Kak Open Grotto Chest"}}, - { RC_KAK_10_GOLD_SKULLTULA_REWARD, {RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"}}, - { RC_KAK_20_GOLD_SKULLTULA_REWARD, {RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"}}, - { RC_KAK_30_GOLD_SKULLTULA_REWARD, {RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"}}, - { RC_KAK_40_GOLD_SKULLTULA_REWARD, {RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"}}, - { RC_KAK_50_GOLD_SKULLTULA_REWARD, {RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak 50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"}}, - { RC_KAK_MAN_ON_ROOF, {RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Man on Roof", "Kak Man on Roof"}}, - { RC_KAK_SHOOTING_GALLERY_REWARD, {RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Shooting Gallery Reward", "Kak Shooting Gallery Reward"}}, - { RC_KAK_TRADE_ODD_MUSHROOM, {RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Trade Odd Mushroom", "Kak Trade Odd Mushroom"}}, - { RC_KAK_ANJU_AS_ADULT, {RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Anju as Adult", "Kak Anju as Adult"}}, - { RC_KAK_ANJU_AS_CHILD, {RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Anju as Child", "Kak Anju as Child"}}, - { RC_KAK_TRADE_POCKET_CUCCO, {RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Trade Pocket Cucco", "Kak Trade Pocket Cucco"}}, - { RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, {RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"}}, - { RC_KAK_WINDMILL_FREESTANDING_POH, {RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"}}, - { RC_GRAVEYARD_SHIELD_GRAVE_CHEST, {RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Shield Grave Chest", "GY Shield Grave Chest"}}, - { RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Heart Piece Grave Chest", "GY Heart Piece Grave Chest"}}, - { RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, {RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Composers Grave Chest", "GY Composers Grave Chest"}}, - { RC_GRAVEYARD_HOOKSHOT_CHEST, {RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Hookshot Chest", "GY Hookshot Chest"}}, - { RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"}}, - { RC_GRAVEYARD_FREESTANDING_POH, {RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Freestanding PoH", "GY Freestanding PoH"}}, - { RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"}}, - { RC_DMT_CHEST, {RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Chest", "DMT Chest"}}, - { RC_DMT_STORMS_GROTTO_CHEST, {RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Storms Grotto Chest", "DMT Storms Grotto Chest"}}, - { RC_DMT_TRADE_BROKEN_SWORD, {RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Trade Broken Sword", "DMT Trade Broken Sword"}}, - { RC_DMT_TRADE_EYEDROPS, {RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Trade Eyedrops", "DMT Trade Eyedrops"}}, - { RC_DMT_TRADE_CLAIM_CHECK, {RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Trade Claim Check", "DMT Trade Claim Check"}}, - { RC_DMT_FREESTANDING_POH, {RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Freestanding PoH", "DMT Freestanding PoH"}}, - { RC_GC_MAZE_LEFT_CHEST, {RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Left Chest", "GC Maze Left Chest"}}, - { RC_GC_MAZE_RIGHT_CHEST, {RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Right Chest", "GC Maze Right Chest"}}, - { RC_GC_MAZE_CENTER_CHEST, {RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Center Chest", "GC Maze Center Chest"}}, - { RC_GC_ROLLING_GORON_AS_CHILD, {RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Rolling Goron as Child", "GC Rolling Goron as Child"}}, - { RC_GC_ROLLING_GORON_AS_ADULT, {RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Rolling Goron as Adult", "GC Rolling Goron as Adult"}}, - { RC_GC_DARUNIAS_JOY, {RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Darunias Joy", "GC Darunias Joy"}}, - { RC_GC_POT_FREESTANDING_POH, {RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Pot Freestanding PoH", "GC Pot Freestanding PoH"}}, - { RC_GC_DEKU_SCRUB_GROTTO_LEFT, {RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"}}, - { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, {RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"}}, - { RC_GC_DEKU_SCRUB_GROTTO_CENTER, {RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"}}, - { RC_GC_MEDIGORON, {RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Medigoron", "GC Medigoron"}}, - { RC_DMC_UPPER_GROTTO_CHEST, {RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Upper Grotto Chest", "DMC Upper Grotto Chest"}}, - { RC_DMC_WALL_FREESTANDING_POH, {RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Wall Freestanding PoH", "DMC Wall Freestanding PoH"}}, - { RC_DMC_VOLCANO_FREESTANDING_POH, {RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"}}, - { RC_DMC_DEKU_SCRUB, {RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub", "DMC Deku Scrub"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, {RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, {RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, {RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"}}, - { RC_ZR_OPEN_GROTTO_CHEST, {RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Open Grotto Chest", "ZR Open Grotto Chest"}}, - { RC_ZR_MAGIC_BEAN_SALESMAN, {RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Magic Bean Salesman", "ZR Magic Bean Salesman"}}, - { RC_ZR_FROGS_ZELDAS_LULLABY, {RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"}}, - { RC_ZR_FROGS_EPONAS_SONG, {RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Epona's Song", "ZR Frogs Epona's Song"}}, - { RC_ZR_FROGS_SARIAS_SONG, {RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Saria's Song", "ZR Frogs Saria's Song"}}, - { RC_ZR_FROGS_SUNS_SONG, {RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Sun's Song", "ZR Frogs Sun's Song"}}, - { RC_ZR_FROGS_SONG_OF_TIME, {RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Song of Time", "ZR Frogs Song of Time"}}, - { RC_ZR_FROGS_IN_THE_RAIN, {RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs in the Rain", "ZR Frogs in the Rain"}}, - { RC_ZR_FROGS_OCARINA_GAME, {RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Frogs Ocarina Game", "ZR Frogs Ocarina Game"}}, - { RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"}}, - { RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, {RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"}}, - { RC_ZR_DEKU_SCRUB_GROTTO_REAR, {RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"}}, - { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, {RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"}}, - { RC_ZD_CHEST, {RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Chest", "ZD Chest"}}, - { RC_ZD_DIVING_MINIGAME, {RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Diving Minigame", "ZD Diving Minigame"}}, - { RC_ZD_KING_ZORA_THAWED, {RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD King Zora Thawed", "ZD King Zora Thawed"}}, - { RC_ZD_TRADE_PRESCRIPTION, {RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Trade Prescription", "ZD Trade Prescription"}}, - { RC_ZF_ICEBERC_FREESTANDING_POH, {RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"}}, - { RC_ZF_BOTTOM_FREESTANDING_POH, {RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"}}, - { RC_LLR_TALONS_CHICKENS, {RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Talons Chickens", "LLR Talons Chickens"}}, - { RC_LLR_FREESTANDING_POH, {RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Freestanding PoH", "LLR Freestanding PoH"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, {RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, {RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, {RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"}}, - { RC_DEKU_TREE_MAP_CHEST, {RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Map Chest", "Deku Tree Map Chest"}}, - { RC_DEKU_TREE_COMPASS_CHEST, {RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Compass Chest", "Deku Tree Compass Chest"}}, - { RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Compass Room Side Chest", "Deku Tree Compass Room Side Chest"}}, - { RC_DEKU_TREE_BASEMENT_CHEST, {RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Basement Chest", "Deku Tree Basement Chest"}}, - { RC_DEKU_TREE_SLINGSHOT_CHEST, {RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Slingshot Chest", "Deku Tree Slingshot Chest"}}, - { RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"}}, - { RC_DEKU_TREE_MQ_MAP_CHEST, {RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Map Chest", "Deku Tree MQ Map Chest"}}, - { RC_DEKU_TREE_MQ_COMPASS_CHEST, {RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Compass Chest", "Deku Tree MQ Compass Chest"}}, - { RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"}}, - { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"}}, - { RC_DEKU_TREE_MQ_BASEMENT_CHEST, {RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Basement Chest", "Deku Tree MQ Basement Chest"}}, - { RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"}}, - { RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"}}, - { RC_DEKU_TREE_MQ_DEKU_SCRUB, {RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ Deku Scrub", "Deku Tree MQ Deku Scrub"}}, - { RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, {RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Boss Room Chest", "Dodongos Cavern Boss Room Chest"}}, - { RC_DODONGOS_CAVERN_MAP_CHEST, {RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Map Chest", "Dodongos Cavern Map Chest"}}, - { RC_DODONGOS_CAVERN_COMPASS_CHEST, {RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Compass Chest", "Dodongos Cavern Compass Chest"}}, - { RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"}}, - { RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"}}, - { RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"}}, - { RC_DODONGOS_CAVERN_MQ_MAP_CHEST, {RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Map Chest", "Dodongos Cavern MQ Map Chest"}}, - { RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"}}, - { RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, {RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"}}, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"}}, - { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"}}, - { RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"}}, - { RC_JABU_JABUS_BELLY_MAP_CHEST, {RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Map Chest", "Jabu Jabus Belly Map Chest"}}, - { RC_JABU_JABUS_BELLY_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Compass Chest", "Jabu Jabus Belly Compass Chest"}}, - { RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"}}, - { RC_JABU_JABUS_BELLY_DEKU_SCRUB, {RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Deku Scrub", "Jabu Jabus Belly Deku Scrub"}}, - { RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, {RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"}}, - { RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple First Room Chest", "Forest Temple First Room Chest"}}, - { RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, {RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple First Stalfos Chest", "Forest Temple First Stalfos Chest"}}, - { RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"}}, - { RC_FOREST_TEMPLE_MAP_CHEST, {RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Map Chest", "Forest Temple Map Chest"}}, - { RC_FOREST_TEMPLE_WELL_CHEST, {RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Well Chest", "Forest Temple Well Chest"}}, - { RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"}}, - { RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, {RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Eye Switch Chest", "Forest Temple Eye Switch Chest"}}, - { RC_FOREST_TEMPLE_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Boss Key Chest", "Forest Temple Boss Key Chest"}}, - { RC_FOREST_TEMPLE_FLOORMASTER_CHEST, {RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Floormaster Chest", "Forest Temple Floormaster Chest"}}, - { RC_FOREST_TEMPLE_BOW_CHEST, {RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Bow Chest", "Forest Temple Bow Chest"}}, - { RC_FOREST_TEMPLE_RED_POE_CHEST, {RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Red Poe Chest", "Forest Temple Red Poe Chest"}}, - { RC_FOREST_TEMPLE_BLUE_POE_CHEST, {RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Blue Poe Chest", "Forest Temple Blue Poe Chest"}}, - { RC_FOREST_TEMPLE_BASEMENT_CHEST, {RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Basement Chest", "Forest Temple Basement Chest"}}, - { RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ First Room Chest", "Forest Temple MQ First Room Chest"}}, - { RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, {RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"}}, - { RC_FOREST_TEMPLE_MQ_BOW_CHEST, {RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Bow Chest", "Forest Temple MQ Bow Chest"}}, - { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"}}, - { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"}}, - { RC_FOREST_TEMPLE_MQ_WELL_CHEST, {RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Well Chest", "Forest Temple MQ Well Chest"}}, - { RC_FOREST_TEMPLE_MQ_MAP_CHEST, {RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Map Chest", "Forest Temple MQ Map Chest"}}, - { RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, {RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Compass Chest", "Forest Temple MQ Compass Chest"}}, - { RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"}}, - { RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, {RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Basement Chest", "Forest Temple MQ Basement Chest"}}, - { RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, {RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Redead Chest", "Forest Temple MQ Redead Chest"}}, - { RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"}}, - { RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Near Boss Chest", "Fire Temple Near Boss Chest"}}, - { RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, {RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Flare Dancer Chest", "Fire Temple Flare Dancer Chest"}}, - { RC_FIRE_TEMPLE_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boss Key Chest", "Fire Temple Boss Key Chest"}}, - { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"}}, - { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"}}, - { RC_FIRE_TEMPLE_SCARECROW_CHEST, {RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Scarecrow Chest", "Fire Temple Scarecrow Chest"}}, - { RC_FIRE_TEMPLE_MAP_CHEST, {RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Map Chest", "Fire Temple Map Chest"}}, - { RC_FIRE_TEMPLE_COMPASS_CHEST, {RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Compass Chest", "Fire Temple Compass Chest"}}, - { RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, {RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Highest Goron Chest", "Fire Temple Highest Goron Chest"}}, - { RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"}}, - { RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"}}, - { RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"}}, - { RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, {RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Compass Chest", "Fire Temple MQ Compass Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"}}, - { RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Chest on Fire", "Fire Temple MQ Chest on Fire"}}, - { RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"}}, - { RC_FIRE_TEMPLE_MQ_MAP_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Map Chest", "Fire Temple MQ Map Chest"}}, - { RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"}}, - { RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"}}, - { RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, {RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ Freestanding Key", "Fire Temple MQ Freestanding Key"}}, - { RC_WATER_TEMPLE_MAP_CHEST, {RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Map Chest", "Water Temple Map Chest"}}, - { RC_WATER_TEMPLE_COMPASS_CHEST, {RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Compass Chest", "Water Temple Compass Chest"}}, - { RC_WATER_TEMPLE_TORCHES_CHEST, {RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Torches Chest", "Water Temple Torches Chest"}}, - { RC_WATER_TEMPLE_DRAGON_CHEST, {RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Dragon Chest", "Water Temple Dragon Chest"}}, - { RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Central Bow Target Chest", "Water Temple Central Bow Target Chest"}}, - { RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Central Pillar Chest", "Water Temple Central Pillar Chest"}}, - { RC_WATER_TEMPLE_CRACKED_WALL_CHEST, {RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Cracked Wall Chest", "Water Temple Cracked Wall Chest"}}, - { RC_WATER_TEMPLE_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Boss Key Chest", "Water Temple Boss Key Chest"}}, - { RC_WATER_TEMPLE_LONGSHOT_CHEST, {RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Longshot Chest", "Water Temple Longshot Chest"}}, - { RC_WATER_TEMPLE_RIVER_CHEST, {RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple River Chest", "Water Temple River Chest"}}, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"}}, - { RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"}}, - { RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, {RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Longshot Chest", "Water Temple MQ Longshot Chest"}}, - { RC_WATER_TEMPLE_MQ_COMPASS_CHEST, {RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Compass Chest", "Water Temple MQ Compass Chest"}}, - { RC_WATER_TEMPLE_MQ_MAP_CHEST, {RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Map Chest", "Water Temple MQ Map Chest"}}, - { RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, {RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ Freestanding Key", "Water Temple MQ Freestanding Key"}}, - { RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"}}, - { RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Bridge Chest", "Spirit Temple Child Bridge Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"}}, - { RC_SPIRIT_TEMPLE_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Compass Chest", "Spirit Temple Compass Chest"}}, - { RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"}}, - { RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"}}, - { RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"}}, - { RC_SPIRIT_TEMPLE_MAP_CHEST, {RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Map Chest", "Spirit Temple Map Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Climb North Chest", "Spirit Temple Child Climb North Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Child Climb East Chest", "Spirit Temple Child Climb East Chest"}}, - { RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"}}, - { RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"}}, - { RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"}}, - { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"}}, - { RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Boss Key Chest", "Spirit Temple Boss Key Chest"}}, - { RC_SPIRIT_TEMPLE_TOPMOST_CHEST, {RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Topmost Chest", "Spirit Temple Topmost Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Map Chest", "Spirit Temple MQ Map Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Compass Chest", "Spirit Temple MQ Compass Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MAP_CHEST, {RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Map Chest", "Shadow Temple Map Chest"}}, - { RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Hover Boots Chest", "Shadow Temple Hover Boots Chest"}}, - { RC_SHADOW_TEMPLE_COMPASS_CHEST, {RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Compass Chest", "Shadow Temple Compass Chest"}}, - { RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"}}, - { RC_SHADOW_TEMPLE_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Wind Hint Chest", "Shadow Temple Wind Hint Chest"}}, - { RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"}}, - { RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"}}, - { RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"}}, - { RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Boss Key Chest", "Shadow Temple Boss Key Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"}}, - { RC_SHADOW_TEMPLE_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Freestanding Key", "Shadow Temple Freestanding Key"}}, - { RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, {RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Compass Chest", "Shadow Temple MQ Compass Chest"}}, - { RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"}}, - { RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"}}, - { RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Map Chest", "Shadow Temple MQ Map Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"}}, - { RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"}}, - { RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"}}, - { RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"}}, - { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"}}, - { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"}}, - { RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"}}, - { RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"}}, - { RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Compass Chest", "Bottom of the Well Compass Chest"}}, - { RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"}}, - { RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"}}, - { RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"}}, - { RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Invisible Chest", "Bottom of the Well Invisible Chest"}}, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Underwater Front Chest", "Bottom of the Well Underwater Front Chest"}}, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Underwater Left Chest", "Bottom of the Well Underwater Left Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Map Chest", "Bottom of the Well Map Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Fire Keese Chest", "Bottom of the Well Fire Keese Chest"}}, - { RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Like Like Chest", "Bottom of the Well Like Like Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well Freestanding Key", "Bottom of the Well Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Map Chest", "Bottom of the Well MQ Map Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Compass Chest", "Bottom of the Well MQ Compass Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"}}, - { RC_ICE_CAVERN_MAP_CHEST, {RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Map Chest", "Ice Cavern Map Chest"}}, - { RC_ICE_CAVERN_COMPASS_CHEST, {RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Compass Chest", "Ice Cavern Compass Chest"}}, - { RC_ICE_CAVERN_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Iron Boots Chest", "Ice Cavern Iron Boots Chest"}}, - { RC_ICE_CAVERN_FREESTANDING_POH, {RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern Freestanding PoH", "Ice Cavern Freestanding PoH"}}, - { RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"}}, - { RC_ICE_CAVERN_MQ_COMPASS_CHEST, {RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Compass Chest", "Ice Cavern MQ Compass Chest"}}, - { RC_ICE_CAVERN_MQ_MAP_CHEST, {RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Map Chest", "Ice Cavern MQ Map Chest"}}, - { RC_ICE_CAVERN_MQ_FREESTANDING_POH, {RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"}}, - { RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"}}, - { RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"}}, - { RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, {RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Beamos Chest", "Gerudo Training Grounds Beamos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"}}, - { RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"}}, - { RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"}}, - { RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, {RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"}}, - { RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"}}, - { RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, {RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds Freestanding Key", "Gerudo Training Grounds Freestanding Key"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Gerudo Training Grounds MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"}}, - { RC_GANONS_TOWER_BOSS_KEY_CHEST, {RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Tower Boss Key Chest", "Ganon's Tower Boss Key Chest"}}, - { RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Forest Trial Chest", "Ganon's Castle Forest Trial Chest"}}, - { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"}}, - { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"}}, - { RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"}}, - { RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"}}, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"}}, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Right", "Ganon's Castle Deku Scrub Right"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle Deku Scrub Left", "Ganon's Castle Deku Scrub Left"}}, - { RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"}}, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"}}, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon's Castle MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"}}, - { RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Basement Back Room", "Deku Tree GS Basement Back Room"}}, - { RC_DEKU_TREE_GS_BASEMENT_GATE, {RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Basement Gate", "Deku Tree GS Basement Gate"}}, - { RC_DEKU_TREE_GS_BASEMENT_VINES, {RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Basement Vines", "Deku Tree GS Basement Vines"}}, - { RC_DEKU_TREE_GS_COMPASS_ROOM, {RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree GS Compass Room", "Deku Tree GS Compass Room"}}, - { RC_DEKU_TREE_MQ_GS_LOBBY, {RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Lobby", "Deku Tree MQ GS Lobby"}}, - { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Compass Room", "Deku Tree MQ GS Compass Room"}}, - { RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"}}, - { RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"}}, - { RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"}}, - { RC_DODONGOS_CAVERN_GS_SCARECROW, {RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Scarecrow", "Dodongos Cavern GS Scarecrow"}}, - { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"}}, - { RC_DODONGOS_CAVERN_GS_BACK_ROOM, {RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Back Room", "Dodongos Cavern GS Back Room"}}, - { RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"}}, - { RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, {RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"}}, - { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"}}, - { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"}}, - { RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Near Boss", "Jabu Jabus Belly GS Near Boss"}}, - { RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"}}, - { RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"}}, - { RC_FOREST_TEMPLE_GS_FIRST_ROOM, {RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS First Room", "Forest Temple GS First Room"}}, - { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"}}, - { RC_FOREST_TEMPLE_GS_LOBBY, {RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Lobby", "Forest Temple GS Lobby"}}, - { RC_FOREST_TEMPLE_GS_BASEMENT, {RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple GS Basement", "Forest Temple GS Basement"}}, - { RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS First Hallway", "Forest Temple MQ GS First Hallway"}}, - { RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"}}, - { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"}}, - { RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"}}, - { RC_FOREST_TEMPLE_MQ_GS_WELL, {RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple MQ GS Well", "Forest Temple MQ GS Well"}}, - { RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Song of Time Room", "Fire Temple GS Song of Time Room"}}, - { RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Boss Key Loop", "Fire Temple GS Boss Key Loop"}}, - { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, {RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Boulder Maze", "Fire Temple GS Boulder Maze"}}, - { RC_FIRE_TEMPLE_GS_SCARECROW_TOP, {RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Scarecrow Top", "Fire Temple GS Scarecrow Top"}}, - { RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, {RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"}}, - { RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"}}, - { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"}}, - { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"}}, - { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"}}, - { RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"}}, - { RC_WATER_TEMPLE_GS_BEHIND_GATE, {RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Behind Gate", "Water Temple GS Behind Gate"}}, - { RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Falling Platform Room", "Water Temple GS Falling Platform Room"}}, - { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, {RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Central Pillar", "Water Temple GS Central Pillar"}}, - { RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"}}, - { RC_WATER_TEMPLE_GS_RIVER, {RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple GS River", "Water Temple GS River"}}, - { RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"}}, - { RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"}}, - { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"}}, - { RC_WATER_TEMPLE_MQ_GS_RIVER, {RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS River", "Water Temple MQ GS River"}}, - { RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"}}, - { RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"}}, - { RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Boulder Room", "Spirit Temple GS Boulder Room"}}, - { RC_SPIRIT_TEMPLE_GS_LOBBY, {RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Lobby", "Spirit Temple GS Lobby"}}, - { RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"}}, - { RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple GS Metal Fence", "Spirit Temple GS Metal Fence"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"}}, - { RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"}}, - { RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"}}, - { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"}}, - { RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Like Like Room", "Shadow Temple GS Like Like Room"}}, - { RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple GS Near Ship", "Shadow Temple GS Near Ship"}}, - { RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"}}, - { RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"}}, - { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS After Wind", "Shadow Temple MQ GS After Wind"}}, - { RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS After Ship", "Shadow Temple MQ GS After Ship"}}, - { RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"}}, - { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well GS Like Like Cage", "Bottom of the Well GS Like Like Cage"}}, - { RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well GS East Inner Room", "Bottom of the Well GS East Inner Room"}}, - { RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well GS West Inner Room", "Bottom of the Well GS West Inner Room"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ GS Basement", "Bottom of the Well MQ GS Basement"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bottom of the Well MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"}}, - { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern GS Push Block Room", "Ice Cavern GS Push Block Room"}}, - { RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"}}, - { RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"}}, - { RC_ICE_CAVERN_MQ_GS_SCARECROW, {RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"}}, - { RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, {RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"}}, - { RC_ICE_CAVERN_MQ_GS_RED_ICE, {RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ice Cavern MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"}}, - { RC_KF_GS_BEAN_PATCH, {RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF GS Bean Patch", "KF GS Bean Patch"}}, - { RC_KF_GS_KNOW_IT_ALL_HOUSE, {RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF GS Know It All House", "KF GS Know It All House"}}, - { RC_KF_GS_HOUSE_OF_TWINS, {RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF GS House of Twins", "KF GS House of Twins"}}, - { RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, {RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"}}, - { RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"}}, - { RC_LW_GS_ABOVE_THEATER, {RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW GS Above Theater", "LW GS Above Theater"}}, - { RC_SFM_GS, {RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM GS", "SFM GS"}}, - { RC_HF_GS_COW_GROTTO, {RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF GS Cow Grotto", "HF GS Cow Grotto"}}, - { RC_HF_GS_NEAR_KAK_GROTTO, {RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF GS Near Kak Grotto", "HF GS Near Kak Grotto"}}, - { RC_LH_GS_BEAN_PATCH, {RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Bean Patch", "LH GS Bean Patch"}}, - { RC_LH_GS_SMALL_ISLAND, {RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Small Island", "LH GS Small Island"}}, - { RC_LH_GS_LAB_WALL, {RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Lab Wall", "LH GS Lab Wall"}}, - { RC_LH_GS_LAB_CRATE, {RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Lab Crate", "LH GS Lab Crate"}}, - { RC_LH_GS_TREE, {RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH GS Tree", "LH GS Tree"}}, - { RC_GV_GS_BEAN_PATCH, {RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Bean Patch", "GV GS Bean Patch"}}, - { RC_GV_GS_SMALL_BRIDGE, {RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Small Bridge", "GV GS Small Bridge"}}, - { RC_GV_GS_PILLAR, {RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Pillar", "GV GS Pillar"}}, - { RC_GV_GS_BEHIND_TENT, {RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV GS Behind Tent", "GV GS Behind Tent"}}, - { RC_GF_GS_ARCHERY_RANGE, {RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF GS Archery Range", "GF GS Archery Range"}}, - { RC_GF_GS_TOP_FLOOR, {RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GF GS Top Floor", "GF GS Top Floor"}}, - { RC_WASTELAND_GS, {RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Wasteland GS", "Wasteland GS"}}, - { RC_COLOSSUS_GS_BEAN_PATCH, {RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus GS Bean Patch", "Colossus GS Bean Patch"}}, - { RC_COLOSSUS_GS_HILL, {RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus GS Hill", "Colossus GS Hill"}}, - { RC_COLOSSUS_GS_TREE, {RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus GS Tree", "Colossus GS Tree"}}, - { RC_OGC_GS, {RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "OGC GS", "OGC GS"}}, - { RC_HC_GS_STORMS_GROTTO, {RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC GS Storms Grotto", "HC GS Storms Grotto"}}, - { RC_HC_GS_TREE, {RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC GS Tree", "HC GS Tree"}}, - { RC_MARKET_GS_GUARD_HOUSE, {RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Market GS Guard House", "Market GS Guard House"}}, - { RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, {RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS House Under Construction", "Kak GS House Under Construction"}}, - { RC_KAK_GS_SKULLTULA_HOUSE, {RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Skulltula House", "Kak GS Skulltula House"}}, - { RC_KAK_GS_GUARDS_HOUSE, {RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Guards House", "Kak GS Guards House"}}, - { RC_KAK_GS_TREE, {RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Tree", "Kak GS Tree"}}, - { RC_KAK_GS_WATCHTOWER, {RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Watchtower", "Kak GS Watchtower"}}, - { RC_KAK_GS_ABOVE_IMPAS_HOUSE, {RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak GS Above Impas House", "Kak GS Above Impas House"}}, - { RC_GRAVEYARD_GS_WALL, {RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Graveyard GS Wall", "Graveyard GS Wall"}}, - { RC_GRAVEYARD_GS_BEAN_PATCH, {RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Graveyard GS Bean Patch", "Graveyard GS Bean Patch"}}, - { RC_DMC_GS_BEAN_PATCH, {RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC GS Bean Patch", "DMC GS Bean Patch"}}, - { RC_DMC_GS_CRATE, {RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC GS Crate", "DMC GS Crate"}}, - { RC_DMT_GS_BEAN_PATCH, {RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Bean Patch", "DMT GS Bean Patch"}}, - { RC_DMT_GS_NEAR_KAK, {RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Near Kak", "DMT GS Near Kak"}}, - { RC_DMT_GS_ABOVE_DODONGOS_CAVERN, {RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"}}, - { RC_DMT_GS_FALLING_ROCKS_PATH, {RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT GS Falling Rocks Path", "DMT GS Falling Rocks Path"}}, - { RC_GC_GS_CENTER_PLATFORM, {RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC GS Center Platform", "GC GS Center Platform"}}, - { RC_GC_GS_BOULDER_MAZE, {RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC GS Boulder Maze", "GC GS Boulder Maze"}}, - { RC_ZR_GS_LADDER, {RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Ladder", "ZR GS Ladder"}}, - { RC_ZR_GS_TREE, {RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Tree", "ZR GS Tree"}}, - { RC_ZR_GS_ABOVE_BRIDGE, {RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Above Bridge", "ZR GS Above Bridge"}}, - { RC_ZR_GS_NEAR_RAISED_GROTTOS, {RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR GS Near Raised Grottos", "ZR GS Near Raised Grottos"}}, - { RC_ZD_GS_FROZEN_WATERFALL, {RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD GS Frozen Waterfall", "ZD GS Frozen Waterfall"}}, - { RC_ZF_GS_ABOVE_THE_LOG, {RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF GS Above The Log", "ZF GS Above The Log"}}, - { RC_ZF_GS_HIDDEN_CAVE, {RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF GS Hidden Cave", "ZF GS Hidden Cave"}}, - { RC_ZF_GS_TREE, {RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF GS Tree", "ZF GS Tree"}}, - { RC_LLR_GS_BACK_WALL, {RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS Back Wall", "LLR GS Back Wall"}}, - { RC_LLR_GS_RAIN_SHED, {RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS Rain Shed", "LLR GS Rain Shed"}}, - { RC_LLR_GS_HOUSE_WINDOW, {RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS House Window", "LLR GS House Window"}}, - { RC_LLR_GS_TREE, {RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR GS Tree", "LLR GS Tree"}}, - { RC_LINKS_POCKET, {RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Link's Pocket", "Link's Pocket"}}, - { RC_QUEEN_GOHMA, {RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Queen Gohma", "Queen Gohma"}}, - { RC_KING_DODONGO, {RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "King Dodongo", "King Dodongo"}}, - { RC_BARINADE, {RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Barinade", "Barinade"}}, - { RC_PHANTOM_GANON, {RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Phantom Ganon", "Phantom Ganon"}}, - { RC_VOLVAGIA, {RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Volvagia", "Volvagia"}}, - { RC_MORPHA, {RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Morpha", "Morpha"}}, - { RC_TWINROVA, {RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Twinrova", "Twinrova"}}, - { RC_BONGO_BONGO, {RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Bongo Bongo", "Bongo Bongo"}}, - { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Ganon", "Ganon"}}, - { RC_DEKU_TREE_QUEEN_GOHMA_HEART, {RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Deku Tree Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"}}, - { RC_DODONGOS_CAVERN_KING_DODONGO_HEART, {RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongos Cavern King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"}}, - { RC_JABU_JABUS_BELLY_BARINADE_HEART, {RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"}}, - { RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, {RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Forest Temple Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"}}, - { RC_FIRE_TEMPLE_VOLVAGIA_HEART, {RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fire Temple Volvagia Heart Container", "Fire Temple Volvagia Heart Container"}}, - { RC_WATER_TEMPLE_MORPHA_HEART, {RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Water Temple Morpha Heart Container", "Water Temple Morpha Heart Container"}}, - { RC_SPIRIT_TEMPLE_TWINROVA_HEART, {RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Spirit Temple Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"}}, - { RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, {RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Shadow Temple Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"}}, - { RC_TOT_LIGHT_ARROWS_CUTSCENE, {RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"}}, - { RC_LW_GIFT_FROM_SARIA, {RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Gift From Saria", "LW Gift From Saria"}}, - { RC_ZF_GREAT_FAIRY_REWARD, {RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZF Great Fairy Reward", "ZF Great Fairy Reward"}}, - { RC_HC_GREAT_FAIRY_REWARD, {RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Great Fairy Reward", "HC Great Fairy Reward"}}, - { RC_COLOSSUS_GREAT_FAIRY_REWARD, {RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Great Fairy Reward", "Colossus Great Fairy Reward"}}, - { RC_DMT_GREAT_FAIRY_REWARD, {RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Great Fairy Reward", "DMT Great Fairy Reward"}}, - { RC_DMC_GREAT_FAIRY_REWARD, {RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Great Fairy Reward", "DMC Great Fairy Reward"}}, - { RC_OGC_GREAT_FAIRY_REWARD, {RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "OGC Great Fairy Reward", "OGC Great Fairy Reward"}}, - { RC_SHEIK_IN_FOREST, {RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Forest", "Sheik in Forest"}}, - { RC_SHEIK_IN_CRATER, {RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Crater", "Sheik in Crater"}}, - { RC_SHEIK_IN_ICE_CAVERN, {RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Ice Cavern", "Sheik in Ice Cavern"}}, - { RC_SHEIK_AT_COLOSSUS, {RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik at Colossus", "Sheik at Colossus"}}, - { RC_SHEIK_IN_KAKARIKO, {RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik in Kakariko", "Sheik in Kakariko"}}, - { RC_SHEIK_AT_TEMPLE, {RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Sheik at Temple", "Sheik at Temple"}}, - { RC_SONG_FROM_IMPA, {RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Impa", "Song from Impa"}}, - { RC_SONG_FROM_MALON, {RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Malon", "Song from Malon"}}, - { RC_SONG_FROM_SARIA, {RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Saria", "Song from Saria"}}, - { RC_SONG_FROM_ROYAL_FAMILYS_TOMB, {RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Composers Grave", "Song from Composers Grave"}}, - { RC_SONG_FROM_OCARINA_OF_TIME, {RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Ocarina of Time", "Song from Ocarina of Time"}}, - { RC_SONG_FROM_WINDMILL, {RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Song from Windmill", "Song from Windmill"}}, - { RC_KF_LINKS_HOUSE_COW, {RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Links House Cow", "KF Links House Cow"}}, - { RC_HF_COW_GROTTO_COW, {RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Cow Grotto Cow", "HF Cow Grotto Cow"}}, - { RC_LLR_STABLES_LEFT_COW, {RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Stables Left Cow", "LLR Stables Left Cow"}}, - { RC_LLR_STABLES_RIGHT_COW, {RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Stables Right Cow", "LLR Stables Right Cow"}}, - { RC_LLR_TOWER_LEFT_COW, {RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Tower Left Cow", "LLR Tower Left Cow"}}, - { RC_LLR_TOWER_RIGHT_COW, {RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LLR Tower Right Cow", "LLR Tower Right Cow"}}, - { RC_KAK_IMPAS_HOUSE_COW, {RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Impas House Cow", "Kak Impas House Cow"}}, - { RC_DMT_COW_GROTTO_COW, {RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Cow Grotto Cow", "DMT Cow Grotto Cow"}}, - { RC_GV_COW, {RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Cow", "GV Cow"}}, - { RC_JABU_JABUS_BELLY_MQ_COW, {RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Jabus Belly MQ Cow", "Jabu Jabus Belly MQ Cow"}}, - { RC_KF_SHOP_ITEM_1, {RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 1", "KF Shop Item 1"}}, - { RC_KF_SHOP_ITEM_2, {RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 2", "KF Shop Item 2"}}, - { RC_KF_SHOP_ITEM_3, {RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 3", "KF Shop Item 3"}}, - { RC_KF_SHOP_ITEM_4, {RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 4", "KF Shop Item 4"}}, - { RC_KF_SHOP_ITEM_5, {RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 5", "KF Shop Item 5"}}, - { RC_KF_SHOP_ITEM_6, {RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 6", "KF Shop Item 6"}}, - { RC_KF_SHOP_ITEM_7, {RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 7", "KF Shop Item 7"}}, - { RC_KF_SHOP_ITEM_8, {RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Shop Item 8", "KF Shop Item 8"}}, - { RC_KAK_POTION_SHOP_ITEM_1, {RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 1", "Kak Potion Shop Item 1"}}, - { RC_KAK_POTION_SHOP_ITEM_2, {RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 2", "Kak Potion Shop Item 2"}}, - { RC_KAK_POTION_SHOP_ITEM_3, {RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 3", "Kak Potion Shop Item 3"}}, - { RC_KAK_POTION_SHOP_ITEM_4, {RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 4", "Kak Potion Shop Item 4"}}, - { RC_KAK_POTION_SHOP_ITEM_5, {RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 5", "Kak Potion Shop Item 5"}}, - { RC_KAK_POTION_SHOP_ITEM_6, {RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 6", "Kak Potion Shop Item 6"}}, - { RC_KAK_POTION_SHOP_ITEM_7, {RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 7", "Kak Potion Shop Item 7"}}, - { RC_KAK_POTION_SHOP_ITEM_8, {RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Potion Shop Item 8", "Kak Potion Shop Item 8"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_1, {RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 1", "MK Bombchu Shop Item 1"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_2, {RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 2", "MK Bombchu Shop Item 2"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_3, {RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 3", "MK Bombchu Shop Item 3"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_4, {RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 4", "MK Bombchu Shop Item 4"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_5, {RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 5", "MK Bombchu Shop Item 5"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_6, {RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 6", "MK Bombchu Shop Item 6"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_7, {RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 7", "MK Bombchu Shop Item 7"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_8, {RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bombchu Shop Item 8", "MK Bombchu Shop Item 8"}}, - { RC_MARKET_POTION_SHOP_ITEM_1, {RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 1", "MK Potion Shop Item 1"}}, - { RC_MARKET_POTION_SHOP_ITEM_2, {RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 2", "MK Potion Shop Item 2"}}, - { RC_MARKET_POTION_SHOP_ITEM_3, {RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 3", "MK Potion Shop Item 3"}}, - { RC_MARKET_POTION_SHOP_ITEM_4, {RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 4", "MK Potion Shop Item 4"}}, - { RC_MARKET_POTION_SHOP_ITEM_5, {RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 5", "MK Potion Shop Item 5"}}, - { RC_MARKET_POTION_SHOP_ITEM_6, {RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 6", "MK Potion Shop Item 6"}}, - { RC_MARKET_POTION_SHOP_ITEM_7, {RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 7", "MK Potion Shop Item 7"}}, - { RC_MARKET_POTION_SHOP_ITEM_8, {RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Potion Shop Item 8", "MK Potion Shop Item 8"}}, - { RC_MARKET_BAZAAR_ITEM_1, {RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 1", "MK Bazaar Item 1"}}, - { RC_MARKET_BAZAAR_ITEM_2, {RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 2", "MK Bazaar Item 2"}}, - { RC_MARKET_BAZAAR_ITEM_3, {RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 3", "MK Bazaar Item 3"}}, - { RC_MARKET_BAZAAR_ITEM_4, {RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 4", "MK Bazaar Item 4"}}, - { RC_MARKET_BAZAAR_ITEM_5, {RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 5", "MK Bazaar Item 5"}}, - { RC_MARKET_BAZAAR_ITEM_6, {RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 6", "MK Bazaar Item 6"}}, - { RC_MARKET_BAZAAR_ITEM_7, {RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 7", "MK Bazaar Item 7"}}, - { RC_MARKET_BAZAAR_ITEM_8, {RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "MK Bazaar Item 8", "MK Bazaar Item 8"}}, - { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 1", "Kak Bazaar Item 1"}}, - { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 2", "Kak Bazaar Item 2"}}, - { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 3", "Kak Bazaar Item 3"}}, - { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 4", "Kak Bazaar Item 4"}}, - { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 5", "Kak Bazaar Item 5"}}, - { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 6", "Kak Bazaar Item 6"}}, - { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 7", "Kak Bazaar Item 7"}}, - { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Bazaar Item 8", "Kak Bazaar Item 8"}}, - { RC_ZD_SHOP_ITEM_1, {RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 1", "ZD Shop Item 1"}}, - { RC_ZD_SHOP_ITEM_2, {RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 2", "ZD Shop Item 2"}}, - { RC_ZD_SHOP_ITEM_3, {RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 3", "ZD Shop Item 3"}}, - { RC_ZD_SHOP_ITEM_4, {RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 4", "ZD Shop Item 4"}}, - { RC_ZD_SHOP_ITEM_5, {RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 5", "ZD Shop Item 5"}}, - { RC_ZD_SHOP_ITEM_6, {RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 6", "ZD Shop Item 6"}}, - { RC_ZD_SHOP_ITEM_7, {RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 7", "ZD Shop Item 7"}}, - { RC_ZD_SHOP_ITEM_8, {RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Shop Item 8", "ZD Shop Item 8"}}, - { RC_GC_SHOP_ITEM_1, {RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 1", "GC Shop Item 1"}}, - { RC_GC_SHOP_ITEM_2, {RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 2", "GC Shop Item 2"}}, - { RC_GC_SHOP_ITEM_3, {RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 3", "GC Shop Item 3"}}, - { RC_GC_SHOP_ITEM_4, {RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 4", "GC Shop Item 4"}}, - { RC_GC_SHOP_ITEM_5, {RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 5", "GC Shop Item 5"}}, - { RC_GC_SHOP_ITEM_6, {RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 6", "GC Shop Item 6"}}, - { RC_GC_SHOP_ITEM_7, {RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 7", "GC Shop Item 7"}}, - { RC_GC_SHOP_ITEM_8, {RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Shop Item 8", "GC Shop Item 8"}}, - { RC_COLOSSUS_GOSSIP_STONE, {RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Colossus Gossip Stone", "Colossus Gossip Stone"}}, - { RC_DMC_GOSSIP_STONE, {RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Gossip Stone", "DMC Gossip Stone"}}, - { RC_DMC_UPPER_GROTTO_GOSSIP_STONE, {RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMC Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"}}, - { RC_DMT_GOSSIP_STONE, {RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Gossip Stone", "DMT Gossip Stone"}}, - { RC_DMT_STORMS_GROTTO_GOSSIP_STONE, {RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "DMT Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"}}, - { RC_DODONGOS_CAVERN_GOSSIP_STONE, {RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Dodongo's Cavern Gossip Stone", "Dodongo's Cavern Gossip Stone"}}, - { RC_FAIRY_GOSSIP_STONE, {RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Fairy Gossip Stone", "Fairy Gossip Stone"}}, - { RC_GC_MAZE_GOSSIP_STONE, {RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Maze Gossip Stone", "GC Maze Gossip Stone"}}, - { RC_GC_MEDIGORON_GOSSIP_STONE, {RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GC Medigoron Gossip Stone", "GC Medigoron Gossip Stone"}}, - { RC_GV_GOSSIP_STONE, {RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GV Gossip Stone", "GV Gossip Stone"}}, - { RC_GY_GOSSIP_STONE, {RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "GY Gossip Stone", "GY Gossip Stone"}}, - { RC_HC_MALON_GOSSIP_STONE, {RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Malon Gossip Stone", "HC Malon Gossip Stone"}}, - { RC_HC_ROCK_WALL_GOSSIP_STONE, {RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"}}, - { RC_HC_STORMS_GROTTO_GOSSIP_STONE, {RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HC Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"}}, - { RC_HF_COW_GROTTO_GOSSIP_STONE, {RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"}}, - { RC_HF_NEAR_MARKET_GOSSIP_STONE, {RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Near Market Gossip Stone", "HF Near Market Gossip Stone"}}, - { RC_HF_OPEN_GROTTO_GOSSIP_STONE, {RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"}}, - { RC_HF_SOUTHEAST_GOSSIP_STONE, {RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "HF Southeast Gossip Stone", "HF Southeast Gossip Stone"}}, - { RC_JABU_GOSSIP_STONE, {RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Jabu Gossip Stone", "Jabu Gossip Stone"}}, - { RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, {RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"}}, - { RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, {RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"}}, - { RC_KF_GOSSIP_STONE, {RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Gossip Stone", "KF Gossip Stone"}}, - { RC_KF_STORMS_GOSSIP_STONE, {RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "KF Storms Gossip Stone", "KF Storms Gossip Stone"}}, - { RC_KAK_OPEN_GROTTO_GOSSIP_STONE, {RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kak Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"}}, - { RC_LH_LAB_GOSSIP_STONE, {RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Lab Gossip Stone", "LH Lab Gossip Stone"}}, - { RC_LH_SOUTHEAST_GOSSIP_STONE, {RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Southeast Gossip Stone", "LH Southeast Gossip Stone"}}, - { RC_LH_SOUTHWEST_GOSSIP_STONE, {RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LH Southwest Gossip Stone", "LH Southwest Gossip Stone"}}, - { RC_LW_GOSSIP_STONE, {RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Gossip Stone", "LW Gossip Stone"}}, - { RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "LW Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"}}, - { RC_SFM_MAZE_LOWER_GOSSIP_STONE, {RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"}}, - { RC_SFM_MAZE_UPPER_GOSSIP_STONE, {RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"}}, - { RC_SFM_SARIA_GOSSIP_STONE, {RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "SFM Saria Gossip Stone", "SFM Saria Gossip Stone"}}, - { RC_TOT_LEFT_CENTER_GOSSIP_STONE, {RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"}}, - { RC_TOT_LEFT_GOSSIP_STONE, {RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Left Gossip Stone", "ToT Left Gossip Stone"}}, - { RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"}}, - { RC_TOT_RIGHT_GOSSIP_STONE, {RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ToT Right Gossip Stone", "ToT Right Gossip Stone"}}, - { RC_ZD_GOSSIP_STONE, {RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZD Gossip Stone", "ZD Gossip Stone"}}, - { RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, {RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"}}, - { RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, {RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"}}, - { RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "ZR Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"}}, + { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, + { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"}}, + { RC_KF_MIDOS_TOP_RIGHT_CHEST, {RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Right Chest", "KF Mido Top Right Chest"}}, + { RC_KF_MIDOS_BOTTOM_LEFT_CHEST, {RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"}}, + { RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, {RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"}}, + { RC_KF_STORMS_GROTTO_CHEST, {RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Storms Grotto Chest", "KF Storms Grotto Chest"}}, + { RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"}}, + { RC_LW_SKULL_KID, {RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Skull Kid", "LW Skull Kid"}}, + { RC_LW_TRADE_COJIRO, {RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Cojiro", "LW Trade Cojiro"}}, + { RC_LW_TRADE_ODD_POTION, {RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Odd Potion", "LW Trade Odd Potion"}}, + { RC_LW_OCARINA_MEMORY_GAME, {RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Ocarina Memory Game", "LW Ocarina Memory Game"}}, + { RC_LW_TARGET_IN_WOODS, {RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Target in Woods", "LW Target in Woods"}}, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"}}, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"}}, + { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, {RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"}}, + { RC_LW_DEKU_SCRUB_GROTTO_REAR, {RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"}}, + { RC_LW_DEKU_SCRUB_GROTTO_FRONT, {RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"}}, + { RC_DEKU_THEATER_SKULL_MASK, {RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Skull Mask", "Deku Theater Skull Mask"}}, + { RC_DEKU_THEATER_MASK_OF_TRUTH, {RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"}}, + { RC_SFM_WOLFOS_GROTTO_CHEST, {RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"}}, + { RC_SFM_DEKU_SCRUB_GROTTO_REAR, {RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"}}, + { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, {RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"}}, + { RC_HF_SOUTHEAST_GROTTO_CHEST, {RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Southeast Grotto Chest", "HF Southeast Grotto Chest"}}, + { RC_HF_OPEN_GROTTO_CHEST, {RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Open Grotto Chest", "HF Open Grotto Chest"}}, + { RC_HF_NEAR_MARKET_GROTTO_CHEST, {RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Near Market Grotto Chest", "HF Near Market Grotto Chest"}}, + { RC_HF_OCARINA_OF_TIME_ITEM, {RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Ocarina of Time Item", "HF Ocarina of Time Item"}}, + { RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, {RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"}}, + { RC_HF_DEKU_SCRUB_GROTTO, {RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Deku Scrub Grotto", "HF Deku Scrub Grotto"}}, + { RC_LH_CHILD_FISHING, {RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Child Fishing", "LH Child Fishing"}}, + { RC_LH_ADULT_FISHING, {RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Adult Fishing", "LH Adult Fishing"}}, + { RC_LH_LAB_DIVE, {RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Dive", "LH Lab Dive"}}, + { RC_LH_TRADE_FROG, {RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"}}, + { RC_LH_UNDERWATER_ITEM, {RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Underwater Item", "LH Underwater Item"}}, + { RC_LH_SUN, {RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Sun", "LH Sun"}}, + { RC_LH_FREESTANDING_POH, {RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Freestanding PoH", "LH Freestanding PoH"}}, + { RC_LH_DEKU_SCRUB_GROTTO_LEFT, {RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"}}, + { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, {RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"}}, + { RC_LH_DEKU_SCRUB_GROTTO_CENTER, {RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"}}, + { RC_GV_CHEST, {RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Chest", "GV Chest"}}, + { RC_GV_TRADE_SAW, {RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Trade Saw", "GV Trade Saw"}}, + { RC_GV_WATERFALL_FREESTANDING_POH, {RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"}}, + { RC_GV_CRATE_FREESTANDING_POH, {RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Crate Freestanding PoH", "GV Crate Freestanding PoH"}}, + { RC_GV_DEKU_SCRUB_GROTTO_REAR, {RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"}}, + { RC_GV_DEKU_SCRUB_GROTTO_FRONT, {RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"}}, + { RC_GF_CHEST, {RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "Chest", "GF Chest"}}, + { RC_GF_HBA_1000_POINTS, {RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1000 Points", "GF HBA 1000 Points"}}, + { RC_GF_HBA_1500_POINTS, {RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1500 Points", "GF HBA 1500 Points"}}, + { RC_GF_GERUDO_MEMBERSHIP_CARD, {RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF Gerudo Membership Card", "GF Gerudo Membership Card"}}, + { RC_GF_NORTH_F1_CARPENTER, {RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F1 Carpenter", "GF North F1 Carpenter"}}, + { RC_GF_NORTH_F2_CARPENTER, {RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F2 Carpenter", "GF North F2 Carpenter"}}, + { RC_GF_SOUTH_F1_CARPENTER, {RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F1 Carpenter", "GF South F1 Carpenter"}}, + { RC_GF_SOUTH_F2_CARPENTER, {RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F2 Carpenter", "GF South F2 Carpenter"}}, + { RC_WASTELAND_CHEST, {RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Chest", "Wasteland Chest"}}, + { RC_WASTELAND_BOMBCHU_SALESMAN, {RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Carpet Salesman", "Wasteland Carpet Salesman"}}, + { RC_COLOSSUS_FREESTANDING_POH, {RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Freestanding PoH", "Colossus Freestanding PoH"}}, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"}}, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"}}, + { RC_MARKET_TREASURE_CHEST_GAME_REWARD, {RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"}}, + { RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"}}, + { RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"}}, + { RC_MARKET_LOST_DOG, {RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Lost Dog", "MK Lost Dog"}}, + { RC_MARKET_SHOOTING_GALLERY_REWARD, {RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Shooting Gallery", "MK Shooting Gallery"}}, + { RC_MARKET_10_BIG_POES, {RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "10 Big Poes", "MK 10 Big Poes"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game First Room Chest", "MK Chest Game First Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"}}, + { RC_HC_MALON_EGG, {RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Malon Egg", "HC Malon Egg"}}, + { RC_HC_ZELDAS_LETTER, {RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Zeldas Letter", "HC Zeldas Letter"}}, + { RC_KAK_REDEAD_GROTTO_CHEST, {RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Redead Grotto Chest", "Kak Redead Grotto Chest"}}, + { RC_KAK_OPEN_GROTTO_CHEST, {RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Chest", "Kak Open Grotto Chest"}}, + { RC_KAK_10_GOLD_SKULLTULA_REWARD, {RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"}}, + { RC_KAK_20_GOLD_SKULLTULA_REWARD, {RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"}}, + { RC_KAK_30_GOLD_SKULLTULA_REWARD, {RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"}}, + { RC_KAK_40_GOLD_SKULLTULA_REWARD, {RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"}}, + { RC_KAK_50_GOLD_SKULLTULA_REWARD, {RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"}}, + { RC_KAK_MAN_ON_ROOF, {RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Man on Roof", "Kak Man on Roof"}}, + { RC_KAK_SHOOTING_GALLERY_REWARD, {RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"}}, + { RC_KAK_TRADE_ODD_MUSHROOM, {RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"}}, + { RC_KAK_ANJU_AS_ADULT, {RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Adult", "Kak Anju as Adult"}}, + { RC_KAK_ANJU_AS_CHILD, {RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Child", "Kak Anju as Child"}}, + { RC_KAK_TRADE_POCKET_CUCCO, {RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"}}, + { RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, {RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"}}, + { RC_KAK_WINDMILL_FREESTANDING_POH, {RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"}}, + { RC_GRAVEYARD_SHIELD_GRAVE_CHEST, {RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Shield Grave Chest", "GY Shield Grave Chest"}}, + { RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"}}, + { RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, {RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Composers Grave Chest", "GY Composers Grave Chest"}}, + { RC_GRAVEYARD_HOOKSHOT_CHEST, {RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Hookshot Chest", "GY Hookshot Chest"}}, + { RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"}}, + { RC_GRAVEYARD_FREESTANDING_POH, {RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Freestanding PoH", "GY Freestanding PoH"}}, + { RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"}}, + { RC_DMT_CHEST, {RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Chest", "DMT Chest"}}, + { RC_DMT_STORMS_GROTTO_CHEST, {RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Chest", "DMT Storms Grotto Chest"}}, + { RC_DMT_TRADE_BROKEN_SWORD, {RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Broken Sword", "DMT Trade Broken Sword"}}, + { RC_DMT_TRADE_EYEDROPS, {RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Eyedrops", "DMT Trade Eyedrops"}}, + { RC_DMT_TRADE_CLAIM_CHECK, {RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Claim Check", "DMT Trade Claim Check"}}, + { RC_DMT_FREESTANDING_POH, {RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Freestanding PoH", "DMT Freestanding PoH"}}, + { RC_GC_MAZE_LEFT_CHEST, {RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Left Chest", "GC Maze Left Chest"}}, + { RC_GC_MAZE_RIGHT_CHEST, {RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Right Chest", "GC Maze Right Chest"}}, + { RC_GC_MAZE_CENTER_CHEST, {RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Center Chest", "GC Maze Center Chest"}}, + { RC_GC_ROLLING_GORON_AS_CHILD, {RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Child", "GC Rolling Goron as Child"}}, + { RC_GC_ROLLING_GORON_AS_ADULT, {RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Adult", "GC Rolling Goron as Adult"}}, + { RC_GC_DARUNIAS_JOY, {RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Darunias Joy", "GC Darunias Joy"}}, + { RC_GC_POT_FREESTANDING_POH, {RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Pot Freestanding PoH", "GC Pot Freestanding PoH"}}, + { RC_GC_DEKU_SCRUB_GROTTO_LEFT, {RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"}}, + { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, {RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"}}, + { RC_GC_DEKU_SCRUB_GROTTO_CENTER, {RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"}}, + { RC_GC_MEDIGORON, {RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Medigoron", "GC Medigoron"}}, + { RC_DMC_UPPER_GROTTO_CHEST, {RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Chest", "DMC Upper Grotto Chest"}}, + { RC_DMC_WALL_FREESTANDING_POH, {RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"}}, + { RC_DMC_VOLCANO_FREESTANDING_POH, {RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"}}, + { RC_DMC_DEKU_SCRUB, {RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub", "DMC Deku Scrub"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, {RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, {RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, {RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"}}, + { RC_ZR_OPEN_GROTTO_CHEST, {RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Open Grotto Chest", "ZR Open Grotto Chest"}}, + { RC_ZR_MAGIC_BEAN_SALESMAN, {RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Magic Bean Salesman", "ZR Magic Bean Salesman"}}, + { RC_ZR_FROGS_ZELDAS_LULLABY, {RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"}}, + { RC_ZR_FROGS_EPONAS_SONG, {RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Epona's Song", "ZR Frogs Epona's Song"}}, + { RC_ZR_FROGS_SARIAS_SONG, {RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Saria's Song", "ZR Frogs Saria's Song"}}, + { RC_ZR_FROGS_SUNS_SONG, {RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Sun's Song", "ZR Frogs Sun's Song"}}, + { RC_ZR_FROGS_SONG_OF_TIME, {RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Song of Time", "ZR Frogs Song of Time"}}, + { RC_ZR_FROGS_IN_THE_RAIN, {RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs in the Rain", "ZR Frogs in the Rain"}}, + { RC_ZR_FROGS_OCARINA_GAME, {RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"}}, + { RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"}}, + { RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, {RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"}}, + { RC_ZR_DEKU_SCRUB_GROTTO_REAR, {RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"}}, + { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, {RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"}}, + { RC_ZD_CHEST, {RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Chest", "ZD Chest"}}, + { RC_ZD_DIVING_MINIGAME, {RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Diving Minigame", "ZD Diving Minigame"}}, + { RC_ZD_KING_ZORA_THAWED, {RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "King Zora Thawed", "ZD King Zora Thawed"}}, + { RC_ZD_TRADE_PRESCRIPTION, {RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Trade Prescription", "ZD Trade Prescription"}}, + { RC_ZF_ICEBERC_FREESTANDING_POH, {RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"}}, + { RC_ZF_BOTTOM_FREESTANDING_POH, {RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"}}, + { RC_LLR_TALONS_CHICKENS, {RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Talons Chickens", "LLR Talons Chickens"}}, + { RC_LLR_FREESTANDING_POH, {RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Freestanding PoH", "LLR Freestanding PoH"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, {RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, {RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, {RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"}}, + { RC_DEKU_TREE_MAP_CHEST, {RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Map Chest", "Deku Tree Map Chest"}}, + { RC_DEKU_TREE_COMPASS_CHEST, {RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Chest", "Deku Tree Compass Chest"}}, + { RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"}}, + { RC_DEKU_TREE_BASEMENT_CHEST, {RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Basement Chest", "Deku Tree Basement Chest"}}, + { RC_DEKU_TREE_SLINGSHOT_CHEST, {RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Chest", "Deku Tree Slingshot Chest"}}, + { RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"}}, + { RC_DEKU_TREE_MQ_MAP_CHEST, {RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Map Chest", "Deku Tree MQ Map Chest"}}, + { RC_DEKU_TREE_MQ_COMPASS_CHEST, {RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Compass Chest", "Deku Tree MQ Compass Chest"}}, + { RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"}}, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"}}, + { RC_DEKU_TREE_MQ_BASEMENT_CHEST, {RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Basement Chest", "Deku Tree MQ Basement Chest"}}, + { RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"}}, + { RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"}}, + { RC_DEKU_TREE_MQ_DEKU_SCRUB, {RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"}}, + { RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, {RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"}}, + { RC_DODONGOS_CAVERN_MAP_CHEST, {RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Map Chest", "Dodongos Cavern Map Chest"}}, + { RC_DODONGOS_CAVERN_COMPASS_CHEST, {RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Compass Chest", "Dodongos Cavern Compass Chest"}}, + { RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"}}, + { RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"}}, + { RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"}}, + { RC_DODONGOS_CAVERN_MQ_MAP_CHEST, {RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"}}, + { RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"}}, + { RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, {RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"}}, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"}}, + { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"}}, + { RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"}}, + { RC_JABU_JABUS_BELLY_MAP_CHEST, {RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Map Chest", "Jabu Jabus Belly Map Chest"}}, + { RC_JABU_JABUS_BELLY_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Compass Chest", "Jabu Jabus Belly Compass Chest"}}, + { RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"}}, + { RC_JABU_JABUS_BELLY_DEKU_SCRUB, {RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"}}, + { RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, {RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"}}, + { RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Room Chest", "Forest Temple First Room Chest"}}, + { RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, {RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Stalfos Chest", "Forest Temple First Stalfos Chest"}}, + { RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"}}, + { RC_FOREST_TEMPLE_MAP_CHEST, {RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Map Chest", "Forest Temple Map Chest"}}, + { RC_FOREST_TEMPLE_WELL_CHEST, {RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Well Chest", "Forest Temple Well Chest"}}, + { RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"}}, + { RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, {RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Eye Switch Chest", "Forest Temple Eye Switch Chest"}}, + { RC_FOREST_TEMPLE_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Boss Key Chest", "Forest Temple Boss Key Chest"}}, + { RC_FOREST_TEMPLE_FLOORMASTER_CHEST, {RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Floormaster Chest", "Forest Temple Floormaster Chest"}}, + { RC_FOREST_TEMPLE_BOW_CHEST, {RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Bow Chest", "Forest Temple Bow Chest"}}, + { RC_FOREST_TEMPLE_RED_POE_CHEST, {RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Red Poe Chest", "Forest Temple Red Poe Chest"}}, + { RC_FOREST_TEMPLE_BLUE_POE_CHEST, {RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Blue Poe Chest", "Forest Temple Blue Poe Chest"}}, + { RC_FOREST_TEMPLE_BASEMENT_CHEST, {RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Basement Chest", "Forest Temple Basement Chest"}}, + { RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ First Room Chest", "Forest Temple MQ First Room Chest"}}, + { RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, {RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"}}, + { RC_FOREST_TEMPLE_MQ_BOW_CHEST, {RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Bow Chest", "Forest Temple MQ Bow Chest"}}, + { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"}}, + { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"}}, + { RC_FOREST_TEMPLE_MQ_WELL_CHEST, {RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Well Chest", "Forest Temple MQ Well Chest"}}, + { RC_FOREST_TEMPLE_MQ_MAP_CHEST, {RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Map Chest", "Forest Temple MQ Map Chest"}}, + { RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, {RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Compass Chest", "Forest Temple MQ Compass Chest"}}, + { RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"}}, + { RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, {RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Basement Chest", "Forest Temple MQ Basement Chest"}}, + { RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, {RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Redead Chest", "Forest Temple MQ Redead Chest"}}, + { RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"}}, + { RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Near Boss Chest", "Fire Temple Near Boss Chest"}}, + { RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, {RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"}}, + { RC_FIRE_TEMPLE_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boss Key Chest", "Fire Temple Boss Key Chest"}}, + { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"}}, + { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"}}, + { RC_FIRE_TEMPLE_SCARECROW_CHEST, {RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Scarecrow Chest", "Fire Temple Scarecrow Chest"}}, + { RC_FIRE_TEMPLE_MAP_CHEST, {RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Map Chest", "Fire Temple Map Chest"}}, + { RC_FIRE_TEMPLE_COMPASS_CHEST, {RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Compass Chest", "Fire Temple Compass Chest"}}, + { RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, {RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Highest Goron Chest", "Fire Temple Highest Goron Chest"}}, + { RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"}}, + { RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"}}, + { RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"}}, + { RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, {RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Compass Chest", "Fire Temple MQ Compass Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"}}, + { RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"}}, + { RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"}}, + { RC_FIRE_TEMPLE_MQ_MAP_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Chest", "Fire Temple MQ Map Chest"}}, + { RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"}}, + { RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"}}, + { RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, {RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"}}, + { RC_WATER_TEMPLE_MAP_CHEST, {RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Map Chest", "Water Temple Map Chest"}}, + { RC_WATER_TEMPLE_COMPASS_CHEST, {RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Compass Chest", "Water Temple Compass Chest"}}, + { RC_WATER_TEMPLE_TORCHES_CHEST, {RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Torches Chest", "Water Temple Torches Chest"}}, + { RC_WATER_TEMPLE_DRAGON_CHEST, {RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Dragon Chest", "Water Temple Dragon Chest"}}, + { RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"}}, + { RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Pillar Chest", "Water Temple Central Pillar Chest"}}, + { RC_WATER_TEMPLE_CRACKED_WALL_CHEST, {RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"}}, + { RC_WATER_TEMPLE_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Boss Key Chest", "Water Temple Boss Key Chest"}}, + { RC_WATER_TEMPLE_LONGSHOT_CHEST, {RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Longshot Chest", "Water Temple Longshot Chest"}}, + { RC_WATER_TEMPLE_RIVER_CHEST, {RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "River Chest", "Water Temple River Chest"}}, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"}}, + { RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"}}, + { RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, {RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"}}, + { RC_WATER_TEMPLE_MQ_COMPASS_CHEST, {RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Compass Chest", "Water Temple MQ Compass Chest"}}, + { RC_WATER_TEMPLE_MQ_MAP_CHEST, {RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Map Chest", "Water Temple MQ Map Chest"}}, + { RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, {RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"}}, + { RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"}}, + { RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"}}, + { RC_SPIRIT_TEMPLE_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Compass Chest", "Spirit Temple Compass Chest"}}, + { RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"}}, + { RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"}}, + { RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"}}, + { RC_SPIRIT_TEMPLE_MAP_CHEST, {RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Map Chest", "Spirit Temple Map Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"}}, + { RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"}}, + { RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"}}, + { RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"}}, + { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"}}, + { RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Boss Key Chest", "Spirit Temple Boss Key Chest"}}, + { RC_SPIRIT_TEMPLE_TOPMOST_CHEST, {RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Topmost Chest", "Spirit Temple Topmost Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Chest", "Spirit Temple MQ Map Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MAP_CHEST, {RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Map Chest", "Shadow Temple Map Chest"}}, + { RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"}}, + { RC_SHADOW_TEMPLE_COMPASS_CHEST, {RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Compass Chest", "Shadow Temple Compass Chest"}}, + { RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"}}, + { RC_SHADOW_TEMPLE_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"}}, + { RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"}}, + { RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"}}, + { RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"}}, + { RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Boss Key Chest", "Shadow Temple Boss Key Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"}}, + { RC_SHADOW_TEMPLE_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Freestanding Key", "Shadow Temple Freestanding Key"}}, + { RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, {RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"}}, + { RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"}}, + { RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"}}, + { RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Map Chest", "Shadow Temple MQ Map Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"}}, + { RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"}}, + { RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"}}, + { RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"}}, + { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"}}, + { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"}}, + { RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"}}, + { RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"}}, + { RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Compass Chest", "Bottom of the Well Compass Chest"}}, + { RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"}}, + { RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"}}, + { RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"}}, + { RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Invisible Chest", "Bottom of the Well Invisible Chest"}}, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"}}, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Map Chest", "Bottom of the Well Map Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"}}, + { RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Like Like Chest", "Bottom of the Well Like Like Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Freestanding Key", "Bottom of the Well Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Map Chest", "Bottom of the Well MQ Map Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"}}, + { RC_ICE_CAVERN_MAP_CHEST, {RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Map Chest", "Ice Cavern Map Chest"}}, + { RC_ICE_CAVERN_COMPASS_CHEST, {RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Compass Chest", "Ice Cavern Compass Chest"}}, + { RC_ICE_CAVERN_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"}}, + { RC_ICE_CAVERN_FREESTANDING_POH, {RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Freestanding PoH", "Ice Cavern Freestanding PoH"}}, + { RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"}}, + { RC_ICE_CAVERN_MQ_COMPASS_CHEST, {RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"}}, + { RC_ICE_CAVERN_MQ_MAP_CHEST, {RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Map Chest", "Ice Cavern MQ Map Chest"}}, + { RC_ICE_CAVERN_MQ_FREESTANDING_POH, {RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"}}, + { RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"}}, + { RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"}}, + { RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, {RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"}}, + { RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"}}, + { RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"}}, + { RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, {RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"}}, + { RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"}}, + { RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, {RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"}}, + { RC_GANONS_TOWER_BOSS_KEY_CHEST, {RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Boss Key Chest", "Ganon's Tower Boss Key Chest"}}, + { RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"}}, + { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"}}, + { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"}}, + { RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"}}, + { RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"}}, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"}}, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"}}, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"}}, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"}}, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"}}, + { RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Back Room", "Deku Tree GS Basement Back Room"}}, + { RC_DEKU_TREE_GS_BASEMENT_GATE, {RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Gate", "Deku Tree GS Basement Gate"}}, + { RC_DEKU_TREE_GS_BASEMENT_VINES, {RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Vines", "Deku Tree GS Basement Vines"}}, + { RC_DEKU_TREE_GS_COMPASS_ROOM, {RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Compass Room", "Deku Tree GS Compass Room"}}, + { RC_DEKU_TREE_MQ_GS_LOBBY, {RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Lobby", "Deku Tree MQ GS Lobby"}}, + { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"}}, + { RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"}}, + { RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"}}, + { RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"}}, + { RC_DODONGOS_CAVERN_GS_SCARECROW, {RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"}}, + { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"}}, + { RC_DODONGOS_CAVERN_GS_BACK_ROOM, {RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Back Room", "Dodongos Cavern GS Back Room"}}, + { RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"}}, + { RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, {RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"}}, + { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"}}, + { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"}}, + { RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"}}, + { RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"}}, + { RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"}}, + { RC_FOREST_TEMPLE_GS_FIRST_ROOM, {RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS First Room", "Forest Temple GS First Room"}}, + { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"}}, + { RC_FOREST_TEMPLE_GS_LOBBY, {RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Lobby", "Forest Temple GS Lobby"}}, + { RC_FOREST_TEMPLE_GS_BASEMENT, {RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Basement", "Forest Temple GS Basement"}}, + { RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"}}, + { RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"}}, + { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"}}, + { RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"}}, + { RC_FOREST_TEMPLE_MQ_GS_WELL, {RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Well", "Forest Temple MQ GS Well"}}, + { RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Song of Time Room", "Fire Temple GS Song of Time Room"}}, + { RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"}}, + { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, {RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boulder Maze", "Fire Temple GS Boulder Maze"}}, + { RC_FIRE_TEMPLE_GS_SCARECROW_TOP, {RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"}}, + { RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, {RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"}}, + { RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"}}, + { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"}}, + { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"}}, + { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"}}, + { RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"}}, + { RC_WATER_TEMPLE_GS_BEHIND_GATE, {RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Behind Gate", "Water Temple GS Behind Gate"}}, + { RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"}}, + { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, {RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Central Pillar", "Water Temple GS Central Pillar"}}, + { RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"}}, + { RC_WATER_TEMPLE_GS_RIVER, {RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS River", "Water Temple GS River"}}, + { RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"}}, + { RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"}}, + { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"}}, + { RC_WATER_TEMPLE_MQ_GS_RIVER, {RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS River", "Water Temple MQ GS River"}}, + { RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"}}, + { RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"}}, + { RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Boulder Room", "Spirit Temple GS Boulder Room"}}, + { RC_SPIRIT_TEMPLE_GS_LOBBY, {RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Lobby", "Spirit Temple GS Lobby"}}, + { RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"}}, + { RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Metal Fence", "Spirit Temple GS Metal Fence"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"}}, + { RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"}}, + { RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"}}, + { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"}}, + { RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Like Like Room", "Shadow Temple GS Like Like Room"}}, + { RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Near Ship", "Shadow Temple GS Near Ship"}}, + { RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"}}, + { RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"}}, + { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"}}, + { RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"}}, + { RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"}}, + { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"}}, + { RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS East Inner Room", "Bottom of the Well GS East Inner Room"}}, + { RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS West Inner Room", "Bottom of the Well GS West Inner Room"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Basement", "Bottom of the Well MQ GS Basement"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"}}, + { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Push Block Room", "Ice Cavern GS Push Block Room"}}, + { RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"}}, + { RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"}}, + { RC_ICE_CAVERN_MQ_GS_SCARECROW, {RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"}}, + { RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, {RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"}}, + { RC_ICE_CAVERN_MQ_GS_RED_ICE, {RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"}}, + { RC_KF_GS_BEAN_PATCH, {RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Bean Patch", "KF GS Bean Patch"}}, + { RC_KF_GS_KNOW_IT_ALL_HOUSE, {RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Know It All House", "KF GS Know It All House"}}, + { RC_KF_GS_HOUSE_OF_TWINS, {RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS House of Twins", "KF GS House of Twins"}}, + { RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, {RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"}}, + { RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"}}, + { RC_LW_GS_ABOVE_THEATER, {RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Above Theater", "LW GS Above Theater"}}, + { RC_SFM_GS, {RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, "GS", "SFM GS"}}, + { RC_HF_GS_COW_GROTTO, {RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Cow Grotto", "HF GS Cow Grotto"}}, + { RC_HF_GS_NEAR_KAK_GROTTO, {RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Near Kak Grotto", "HF GS Near Kak Grotto"}}, + { RC_LH_GS_BEAN_PATCH, {RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Bean Patch", "LH GS Bean Patch"}}, + { RC_LH_GS_SMALL_ISLAND, {RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Small Island", "LH GS Small Island"}}, + { RC_LH_GS_LAB_WALL, {RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Wall", "LH GS Lab Wall"}}, + { RC_LH_GS_LAB_CRATE, {RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Crate", "LH GS Lab Crate"}}, + { RC_LH_GS_TREE, {RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Tree", "LH GS Tree"}}, + { RC_GV_GS_BEAN_PATCH, {RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Bean Patch", "GV GS Bean Patch"}}, + { RC_GV_GS_SMALL_BRIDGE, {RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Small Bridge", "GV GS Small Bridge"}}, + { RC_GV_GS_PILLAR, {RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Pillar", "GV GS Pillar"}}, + { RC_GV_GS_BEHIND_TENT, {RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Behind Tent", "GV GS Behind Tent"}}, + { RC_GF_GS_ARCHERY_RANGE, {RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Archery Range", "GF GS Archery Range"}}, + { RC_GF_GS_TOP_FLOOR, {RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Top Floor", "GF GS Top Floor"}}, + { RC_WASTELAND_GS, {RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, "GS", "Wasteland GS"}}, + { RC_COLOSSUS_GS_BEAN_PATCH, {RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Bean Patch", "Colossus GS Bean Patch"}}, + { RC_COLOSSUS_GS_HILL, {RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Hill", "Colossus GS Hill"}}, + { RC_COLOSSUS_GS_TREE, {RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Tree", "Colossus GS Tree"}}, + { RC_OGC_GS, {RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "OGC GS", "OGC GS"}}, + { RC_HC_GS_STORMS_GROTTO, {RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Storms Grotto", "HC GS Storms Grotto"}}, + { RC_HC_GS_TREE, {RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Tree", "HC GS Tree"}}, + { RC_MARKET_GS_GUARD_HOUSE, {RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "Market GS Guard House", "Market GS Guard House"}}, + { RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, {RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS House Under Construction", "Kak GS House Under Construction"}}, + { RC_KAK_GS_SKULLTULA_HOUSE, {RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Skulltula House", "Kak GS Skulltula House"}}, + { RC_KAK_GS_GUARDS_HOUSE, {RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Guards House", "Kak GS Guards House"}}, + { RC_KAK_GS_TREE, {RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Tree", "Kak GS Tree"}}, + { RC_KAK_GS_WATCHTOWER, {RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Watchtower", "Kak GS Watchtower"}}, + { RC_KAK_GS_ABOVE_IMPAS_HOUSE, {RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Above Impas House", "Kak GS Above Impas House"}}, + { RC_GRAVEYARD_GS_WALL, {RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Wall", "Graveyard GS Wall"}}, + { RC_GRAVEYARD_GS_BEAN_PATCH, {RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Bean Patch", "Graveyard GS Bean Patch"}}, + { RC_DMC_GS_BEAN_PATCH, {RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Bean Patch", "DMC GS Bean Patch"}}, + { RC_DMC_GS_CRATE, {RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Crate", "DMC GS Crate"}}, + { RC_DMT_GS_BEAN_PATCH, {RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Bean Patch", "DMT GS Bean Patch"}}, + { RC_DMT_GS_NEAR_KAK, {RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Near Kak", "DMT GS Near Kak"}}, + { RC_DMT_GS_ABOVE_DODONGOS_CAVERN, {RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"}}, + { RC_DMT_GS_FALLING_ROCKS_PATH, {RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"}}, + { RC_GC_GS_CENTER_PLATFORM, {RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Center Platform", "GC GS Center Platform"}}, + { RC_GC_GS_BOULDER_MAZE, {RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Boulder Maze", "GC GS Boulder Maze"}}, + { RC_ZR_GS_LADDER, {RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Ladder", "ZR GS Ladder"}}, + { RC_ZR_GS_TREE, {RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Tree", "ZR GS Tree"}}, + { RC_ZR_GS_ABOVE_BRIDGE, {RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Above Bridge", "ZR GS Above Bridge"}}, + { RC_ZR_GS_NEAR_RAISED_GROTTOS, {RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"}}, + { RC_ZD_GS_FROZEN_WATERFALL, {RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"}}, + { RC_ZF_GS_ABOVE_THE_LOG, {RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Above The Log", "ZF GS Above The Log"}}, + { RC_ZF_GS_HIDDEN_CAVE, {RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Hidden Cave", "ZF GS Hidden Cave"}}, + { RC_ZF_GS_TREE, {RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Tree", "ZF GS Tree"}}, + { RC_LLR_GS_BACK_WALL, {RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Back Wall", "LLR GS Back Wall"}}, + { RC_LLR_GS_RAIN_SHED, {RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Rain Shed", "LLR GS Rain Shed"}}, + { RC_LLR_GS_HOUSE_WINDOW, {RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS House Window", "LLR GS House Window"}}, + { RC_LLR_GS_TREE, {RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Tree", "LLR GS Tree"}}, + { RC_LINKS_POCKET, {RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_LINKS_POCKET, RCAREA_KOKIRI_FOREST, "Link's Pocket", "Link's Pocket"}}, + { RC_QUEEN_GOHMA, {RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma", "Queen Gohma"}}, + { RC_KING_DODONGO, {RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo", "King Dodongo"}}, + { RC_BARINADE, {RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade", "Barinade"}}, + { RC_PHANTOM_GANON, {RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon", "Phantom Ganon"}}, + { RC_VOLVAGIA, {RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia", "Volvagia"}}, + { RC_MORPHA, {RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha", "Morpha"}}, + { RC_TWINROVA, {RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova", "Twinrova"}}, + { RC_BONGO_BONGO, {RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo", "Bongo Bongo"}}, + { RC_DEKU_TREE_QUEEN_GOHMA_HEART, {RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"}}, + { RC_DODONGOS_CAVERN_KING_DODONGO_HEART, {RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"}}, + { RC_JABU_JABUS_BELLY_BARINADE_HEART, {RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"}}, + { RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, {RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"}}, + { RC_FIRE_TEMPLE_VOLVAGIA_HEART, {RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"}}, + { RC_WATER_TEMPLE_MORPHA_HEART, {RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha Heart Container", "Water Temple Morpha Heart Container"}}, + { RC_SPIRIT_TEMPLE_TWINROVA_HEART, {RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"}}, + { RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, {RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"}}, + { RC_TOT_LIGHT_ARROWS_CUTSCENE, {RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"}}, + { RC_LW_GIFT_FROM_SARIA, {RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Gift From Saria", "LW Gift From Saria"}}, + { RC_ZF_GREAT_FAIRY_REWARD, {RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Great Fairy Reward", "ZF Great Fairy Reward"}}, + { RC_HC_GREAT_FAIRY_REWARD, {RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Great Fairy Reward", "HC Great Fairy Reward"}}, + { RC_COLOSSUS_GREAT_FAIRY_REWARD, {RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Great Fairy Reward", "Colossus Great Fairy Reward"}}, + { RC_DMT_GREAT_FAIRY_REWARD, {RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Great Fairy Reward", "DMT Great Fairy Reward"}}, + { RC_DMC_GREAT_FAIRY_REWARD, {RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Great Fairy Reward", "DMC Great Fairy Reward"}}, + { RC_OGC_GREAT_FAIRY_REWARD, {RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "OGC Great Fairy Reward", "OGC Great Fairy Reward"}}, + { RC_SHEIK_IN_FOREST, {RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Sheik in Forest", "Sheik in Forest"}}, + { RC_SHEIK_IN_CRATER, {RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Sheik in Crater", "Sheik in Crater"}}, + { RC_SHEIK_IN_ICE_CAVERN, {RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Sheik in Ice Cavern", "Sheik in Ice Cavern"}}, + { RC_SHEIK_AT_COLOSSUS, {RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Sheik at Colossus", "Sheik at Colossus"}}, + { RC_SHEIK_IN_KAKARIKO, {RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Sheik in Kakariko", "Sheik in Kakariko"}}, + { RC_SHEIK_AT_TEMPLE, {RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Sheik at Temple", "Sheik at Temple"}}, + { RC_SONG_FROM_IMPA, {RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Song from Impa", "Song from Impa"}}, + { RC_SONG_FROM_MALON, {RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Song from Malon", "Song from Malon"}}, + { RC_SONG_FROM_SARIA, {RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Song from Saria", "Song from Saria"}}, + { RC_SONG_FROM_ROYAL_FAMILYS_TOMB, {RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Song from Composers Grave", "Song from Composers Grave"}}, + { RC_SONG_FROM_OCARINA_OF_TIME, {RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Song from Ocarina of Time", "Song from Ocarina of Time"}}, + { RC_SONG_FROM_WINDMILL, {RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Song from Windmill", "Song from Windmill"}}, + { RC_KF_LINKS_HOUSE_COW, {RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, "Links House Cow", "KF Links House Cow"}}, + { RC_HF_COW_GROTTO_COW, {RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, "Cow Grotto Cow", "HF Cow Grotto Cow"}}, + { RC_LLR_STABLES_LEFT_COW, {RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Left Cow", "LLR Stables Left Cow"}}, + { RC_LLR_STABLES_RIGHT_COW, {RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Right Cow", "LLR Stables Right Cow"}}, + { RC_LLR_TOWER_LEFT_COW, {RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Left Cow", "LLR Tower Left Cow"}}, + { RC_LLR_TOWER_RIGHT_COW, {RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Right Cow", "LLR Tower Right Cow"}}, + { RC_KAK_IMPAS_HOUSE_COW, {RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, "Impas House Cow", "Kak Impas House Cow"}}, + { RC_DMT_COW_GROTTO_COW, {RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, "Cow Grotto Cow", "DMT Cow Grotto Cow"}}, + { RC_GV_COW, {RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, "Cow", "GV Cow"}}, + { RC_JABU_JABUS_BELLY_MQ_COW, {RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, "MQ Cow", "Jabu Jabus Belly MQ Cow"}}, + { RC_KF_SHOP_ITEM_1, {RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 1", "KF Shop Item 1"}}, + { RC_KF_SHOP_ITEM_2, {RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 2", "KF Shop Item 2"}}, + { RC_KF_SHOP_ITEM_3, {RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 3", "KF Shop Item 3"}}, + { RC_KF_SHOP_ITEM_4, {RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 4", "KF Shop Item 4"}}, + { RC_KF_SHOP_ITEM_5, {RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 5", "KF Shop Item 5"}}, + { RC_KF_SHOP_ITEM_6, {RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 6", "KF Shop Item 6"}}, + { RC_KF_SHOP_ITEM_7, {RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 7", "KF Shop Item 7"}}, + { RC_KF_SHOP_ITEM_8, {RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 8", "KF Shop Item 8"}}, + { RC_KAK_POTION_SHOP_ITEM_1, {RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 1", "Kak Potion Shop Item 1"}}, + { RC_KAK_POTION_SHOP_ITEM_2, {RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 2", "Kak Potion Shop Item 2"}}, + { RC_KAK_POTION_SHOP_ITEM_3, {RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 3", "Kak Potion Shop Item 3"}}, + { RC_KAK_POTION_SHOP_ITEM_4, {RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 4", "Kak Potion Shop Item 4"}}, + { RC_KAK_POTION_SHOP_ITEM_5, {RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 5", "Kak Potion Shop Item 5"}}, + { RC_KAK_POTION_SHOP_ITEM_6, {RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 6", "Kak Potion Shop Item 6"}}, + { RC_KAK_POTION_SHOP_ITEM_7, {RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 7", "Kak Potion Shop Item 7"}}, + { RC_KAK_POTION_SHOP_ITEM_8, {RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 8", "Kak Potion Shop Item 8"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_1, {RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_2, {RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_3, {RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_4, {RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_5, {RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_6, {RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_7, {RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_8, {RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"}}, + { RC_MARKET_POTION_SHOP_ITEM_1, {RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 1", "MK Potion Shop Item 1"}}, + { RC_MARKET_POTION_SHOP_ITEM_2, {RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 2", "MK Potion Shop Item 2"}}, + { RC_MARKET_POTION_SHOP_ITEM_3, {RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 3", "MK Potion Shop Item 3"}}, + { RC_MARKET_POTION_SHOP_ITEM_4, {RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 4", "MK Potion Shop Item 4"}}, + { RC_MARKET_POTION_SHOP_ITEM_5, {RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 5", "MK Potion Shop Item 5"}}, + { RC_MARKET_POTION_SHOP_ITEM_6, {RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 6", "MK Potion Shop Item 6"}}, + { RC_MARKET_POTION_SHOP_ITEM_7, {RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 7", "MK Potion Shop Item 7"}}, + { RC_MARKET_POTION_SHOP_ITEM_8, {RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 8", "MK Potion Shop Item 8"}}, + { RC_MARKET_BAZAAR_ITEM_1, {RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "MK Bazaar Item 1"}}, + { RC_MARKET_BAZAAR_ITEM_2, {RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "MK Bazaar Item 2"}}, + { RC_MARKET_BAZAAR_ITEM_3, {RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "MK Bazaar Item 3"}}, + { RC_MARKET_BAZAAR_ITEM_4, {RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "MK Bazaar Item 4"}}, + { RC_MARKET_BAZAAR_ITEM_5, {RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "MK Bazaar Item 5"}}, + { RC_MARKET_BAZAAR_ITEM_6, {RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "MK Bazaar Item 6"}}, + { RC_MARKET_BAZAAR_ITEM_7, {RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "MK Bazaar Item 7"}}, + { RC_MARKET_BAZAAR_ITEM_8, {RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "MK Bazaar Item 8"}}, + { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "Kak Bazaar Item 1"}}, + { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "Kak Bazaar Item 2"}}, + { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "Kak Bazaar Item 3"}}, + { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "Kak Bazaar Item 4"}}, + { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "Kak Bazaar Item 5"}}, + { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "Kak Bazaar Item 6"}}, + { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "Kak Bazaar Item 7"}}, + { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "Kak Bazaar Item 8"}}, + { RC_ZD_SHOP_ITEM_1, {RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 1", "ZD Shop Item 1"}}, + { RC_ZD_SHOP_ITEM_2, {RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 2", "ZD Shop Item 2"}}, + { RC_ZD_SHOP_ITEM_3, {RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 3", "ZD Shop Item 3"}}, + { RC_ZD_SHOP_ITEM_4, {RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 4", "ZD Shop Item 4"}}, + { RC_ZD_SHOP_ITEM_5, {RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 5", "ZD Shop Item 5"}}, + { RC_ZD_SHOP_ITEM_6, {RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 6", "ZD Shop Item 6"}}, + { RC_ZD_SHOP_ITEM_7, {RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 7", "ZD Shop Item 7"}}, + { RC_ZD_SHOP_ITEM_8, {RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 8", "ZD Shop Item 8"}}, + { RC_GC_SHOP_ITEM_1, {RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 1", "GC Shop Item 1"}}, + { RC_GC_SHOP_ITEM_2, {RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 2", "GC Shop Item 2"}}, + { RC_GC_SHOP_ITEM_3, {RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 3", "GC Shop Item 3"}}, + { RC_GC_SHOP_ITEM_4, {RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 4", "GC Shop Item 4"}}, + { RC_GC_SHOP_ITEM_5, {RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 5", "GC Shop Item 5"}}, + { RC_GC_SHOP_ITEM_6, {RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 6", "GC Shop Item 6"}}, + { RC_GC_SHOP_ITEM_7, {RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 7", "GC Shop Item 7"}}, + { RC_GC_SHOP_ITEM_8, {RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 8", "GC Shop Item 8"}}, + { RC_COLOSSUS_GOSSIP_STONE, {RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, "Gossip Stone", "Colossus Gossip Stone"}}, + { RC_DMC_GOSSIP_STONE, {RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Gossip Stone", "DMC Gossip Stone"}}, + { RC_DMC_UPPER_GROTTO_GOSSIP_STONE, {RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"}}, + { RC_DMT_GOSSIP_STONE, {RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Gossip Stone", "DMT Gossip Stone"}}, + { RC_DMT_STORMS_GROTTO_GOSSIP_STONE, {RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"}}, + { RC_DODONGOS_CAVERN_GOSSIP_STONE, {RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, "Gossip Stone", "Dodongo's Cavern Gossip Stone"}}, + { RC_FAIRY_GOSSIP_STONE, {RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Fairy Gossip Stone", "Fairy Gossip Stone"}}, + { RC_GC_MAZE_GOSSIP_STONE, {RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Maze Gossip Stone", "GC Maze Gossip Stone"}}, + { RC_GC_MEDIGORON_GOSSIP_STONE, {RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"}}, + { RC_GV_GOSSIP_STONE, {RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, "Gossip Stone", "GV Gossip Stone"}}, + { RC_GY_GOSSIP_STONE, {RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, "Gossip Stone", "GY Gossip Stone"}}, + { RC_HC_MALON_GOSSIP_STONE, {RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Malon Gossip Stone", "HC Malon Gossip Stone"}}, + { RC_HC_ROCK_WALL_GOSSIP_STONE, {RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"}}, + { RC_HC_STORMS_GROTTO_GOSSIP_STONE, {RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"}}, + { RC_HF_COW_GROTTO_GOSSIP_STONE, {RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"}}, + { RC_HF_NEAR_MARKET_GOSSIP_STONE, {RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Near Market Gossip Stone", "HF Near Market Gossip Stone"}}, + { RC_HF_OPEN_GROTTO_GOSSIP_STONE, {RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"}}, + { RC_HF_SOUTHEAST_GOSSIP_STONE, {RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Southeast Gossip Stone", "HF Southeast Gossip Stone"}}, + { RC_JABU_GOSSIP_STONE, {RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Jabu Gossip Stone", "Jabu Gossip Stone"}}, + { RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, {RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"}}, + { RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, {RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"}}, + { RC_KF_GOSSIP_STONE, {RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Gossip Stone", "KF Gossip Stone"}}, + { RC_KF_STORMS_GOSSIP_STONE, {RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Storms Gossip Stone", "KF Storms Gossip Stone"}}, + { RC_KAK_OPEN_GROTTO_GOSSIP_STONE, {RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"}}, + { RC_LH_LAB_GOSSIP_STONE, {RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Lab Gossip Stone", "LH Lab Gossip Stone"}}, + { RC_LH_SOUTHEAST_GOSSIP_STONE, {RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southeast Gossip Stone", "LH Southeast Gossip Stone"}}, + { RC_LH_SOUTHWEST_GOSSIP_STONE, {RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southwest Gossip Stone", "LH Southwest Gossip Stone"}}, + { RC_LW_GOSSIP_STONE, {RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Gossip Stone", "LW Gossip Stone"}}, + { RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"}}, + { RC_SFM_MAZE_LOWER_GOSSIP_STONE, {RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"}}, + { RC_SFM_MAZE_UPPER_GOSSIP_STONE, {RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"}}, + { RC_SFM_SARIA_GOSSIP_STONE, {RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Saria Gossip Stone", "SFM Saria Gossip Stone"}}, + { RC_TOT_LEFT_CENTER_GOSSIP_STONE, {RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"}}, + { RC_TOT_LEFT_GOSSIP_STONE, {RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Gossip Stone", "ToT Left Gossip Stone"}}, + { RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"}}, + { RC_TOT_RIGHT_GOSSIP_STONE, {RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Gossip Stone", "ToT Right Gossip Stone"}}, + { RC_ZD_GOSSIP_STONE, {RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, "Gossip Stone", "ZD Gossip Stone"}}, + { RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, {RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"}}, + { RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, {RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"}}, + { RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"}}, }; std::unordered_map RandomizerCheckObjects::GetAllRCObjects() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index c07d64f05..2e175f43c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -14,7 +14,11 @@ typedef enum { RCTYPE_SMALL_KEY, // Small Keys RCTYPE_GF_KEY, // Gerudo Fortress Keys RCTYPE_BOSS_KEY, // Boss Keys - RCTYPE_GANON_BOSS_KEY + RCTYPE_GANON_BOSS_KEY, // Ganon's boss key + RCTYPE_SHOP, // shops/scrubs + RCTYPE_CHEST_GAME, //todo replace this once we implement it, just using it to exclude for now + RCTYPE_LINKS_POCKET, //todo this feels hacky + RCTYPE_GOSSIP_STONE, } RandomizerCheckType; typedef enum { @@ -25,6 +29,37 @@ typedef enum { typedef enum { RCAREA_KOKIRI_FOREST, + RCAREA_LOST_WOODS, + RCAREA_SACRED_FOREST_MEADOW, + RCAREA_HYRULE_FIELD, + RCAREA_LAKE_HYLIA, + RCAREA_GERUDO_VALLEY, + RCAREA_GERUDO_FORTRESS, + RCAREA_WASTELAND, + RCAREA_DESERT_COLOSSUS, + RCAREA_MARKET, + RCAREA_HYRULE_CASTLE, + RCAREA_KAKARIKO_VILLAGE, + RCAREA_GRAVEYARD, + RCAREA_DEATH_MOUNTAIN_TRAIL, + RCAREA_GORON_CITY, + RCAREA_DEATH_MOUNTAIN_CRATER, + RCAREA_ZORAS_RIVER, + RCAREA_ZORAS_DOMAIN, + RCAREA_ZORAS_FOUNTAIN, + RCAREA_LON_LON_RANCH, + RCAREA_DEKU_TREE, + RCAREA_DODONGOS_CAVERN, + RCAREA_JABU_JABUS_BELLY, + RCAREA_FOREST_TEMPLE, + RCAREA_FIRE_TEMPLE, + RCAREA_WATER_TEMPLE, + RCAREA_SPIRIT_TEMPLE, + RCAREA_SHADOW_TEMPLE, + RCAREA_BOTTOM_OF_THE_WELL, + RCAREA_ICE_CAVERN, + RCAREA_GERUDO_TRAINING_GROUND, + RCAREA_GANONS_CASTLE } RandomizerCheckArea; typedef struct { From e500db810bef304bde85639cf939366e5110c404 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 18 Aug 2022 13:55:59 +0200 Subject: [PATCH 110/212] Code cleanup + more names --- .../custom-message/CustomMessageManager.cpp | 2 -- soh/soh/Enhancements/randomizer/randomizer.cpp | 14 +++++++------- soh/soh/OTRGlobals.cpp | 6 +++--- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 8a42bef95..5f86fbf2e 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -80,8 +80,6 @@ bool CustomMessageManager::InsertCustomMessage(std::string tableID, uint16_t tex return messageInsertResult.second; } - - bool CustomMessageManager::CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messageEntry) { FormatCustomMessage(messageEntry.english, iid); FormatCustomMessage(messageEntry.german, iid); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4acf48cd6..3cae6f9b8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4629,23 +4629,23 @@ void CreateRupeeMessages() { for (u8 rupee : rupees) { switch (rupee) { case TEXT_BLUE_RUPEE: - rupeeText = "\x05\x03 5 %RUPEE%\x05\x00"; + rupeeText = "\x05\x03 5 %RUPEE% \x05\x00"; break; case TEXT_RED_RUPEE: - rupeeText = "\x05\x01 20 %RUPEE%\x05\x00"; + rupeeText = "\x05\x01 20 %RUPEE% \x05\x00"; break; case TEXT_PURPLE_RUPEE: - rupeeText = "\x05\x05 50 %RUPEE%\x05\x00"; + rupeeText = "\x05\x05 50 %RUPEE% \x05\x00"; break; case TEXT_HUGE_RUPEE: - rupeeText = "\x05\x06 200 %RUPEE%\x05\x00"; + rupeeText = "\x05\x06 200 %RUPEE% \x05\x00"; break; } customMessageManager->CreateMessage(Randomizer::rupeeMessageTableID, rupee, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, - "You found" + rupeeText + " !", - "Du hast" + rupeeText + " gefunden!", - "Vous obtenez" + rupeeText + " !" + "You found" + rupeeText + "!", + "Du hast" + rupeeText + " gefunden!", + "Vous obtenez" + rupeeText + "!" }); } } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 8a6fdd44c..1df80f38e 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1448,12 +1448,11 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { } extern "C" std::string Randomizer_InsertRupeeName(std::string message, int language) { - std::string replaceWith; - const char* englishRupeeNames[34] = { + const char* englishRupeeNames[40] = { "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", "Dogecoin", "Mushrooms", "Experience", "Friends", "Coins", "Rings", "Gil", "Pokédollars", "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", - "Smackaroos", "Zorkmids", "Zenny", "Bones" + "Smackaroos", "Zorkmids", "Zenny", "Bones", "Souls", "Studs", "Munny", "Rubies", "Gald", "Gold" }; const char* germanRupeeNames[1] = { "Rubine" @@ -1465,6 +1464,7 @@ extern "C" std::string Randomizer_InsertRupeeName(std::string message, int langu "Munnies", "Orens", "Florens", "Crédits", "Galds", "Bling", "Orbes", "Baguettes", "Croissants" }; int randomIndex; + std::string replaceWith; switch (language) { case LANGUAGE_ENG: randomIndex = rand() % (sizeof(englishRupeeNames) / sizeof(englishRupeeNames[0])); From 3816ed11a4d0a2a3a9e1d044d22bbeb92a60d69a Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 08:20:35 -0400 Subject: [PATCH 111/212] add area names, fix kak bazaar --- .../randomizer/randomizer_check_objects.cpp | 57 ++++++++++++++++--- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index f61ac4a24..f7106e0ec 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -1,5 +1,7 @@ #include "randomizer_check_objects.h" #include +#include +#include /* typedef struct { @@ -680,14 +682,14 @@ std::unordered_map rcObjects = { { RC_MARKET_BAZAAR_ITEM_6, {RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "MK Bazaar Item 6"}}, { RC_MARKET_BAZAAR_ITEM_7, {RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "MK Bazaar Item 7"}}, { RC_MARKET_BAZAAR_ITEM_8, {RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "MK Bazaar Item 8"}}, - { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "Kak Bazaar Item 1"}}, - { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "Kak Bazaar Item 2"}}, - { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "Kak Bazaar Item 3"}}, - { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "Kak Bazaar Item 4"}}, - { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "Kak Bazaar Item 5"}}, - { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "Kak Bazaar Item 6"}}, - { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "Kak Bazaar Item 7"}}, - { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "Kak Bazaar Item 8"}}, + { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 1", "Kak Bazaar Item 1"}}, + { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 2", "Kak Bazaar Item 2"}}, + { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 3", "Kak Bazaar Item 3"}}, + { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 4", "Kak Bazaar Item 4"}}, + { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 5", "Kak Bazaar Item 5"}}, + { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 6", "Kak Bazaar Item 6"}}, + { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 7", "Kak Bazaar Item 7"}}, + { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 8", "Kak Bazaar Item 8"}}, { RC_ZD_SHOP_ITEM_1, {RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 1", "ZD Shop Item 1"}}, { RC_ZD_SHOP_ITEM_2, {RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 2", "ZD Shop Item 2"}}, { RC_ZD_SHOP_ITEM_3, {RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 3", "ZD Shop Item 3"}}, @@ -746,6 +748,45 @@ std::unordered_map rcObjects = { { RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"}}, }; +std::map rcAreas = { + { RCAREA_KOKIRI_FOREST, "Kokiri Forest"}, + { RCAREA_LOST_WOODS, "Lost Woods"}, + { RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow"}, + { RCAREA_HYRULE_FIELD, "Hyrule Field"}, + { RCAREA_LAKE_HYLIA, "Lake Hylia"}, + { RCAREA_GERUDO_VALLEY, "Gerudo Valley"}, + { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress"}, + { RCAREA_WASTELAND, "Desert Wasteland"}, + { RCAREA_DESERT_COLOSSUS, "Desert Colossus"}, + { RCAREA_MARKET, "Hyrule Market"}, + { RCAREA_HYRULE_CASTLE, "Hyrule Castle"}, + { RCAREA_KAKARIKO_VILLAGE, "Kakariko Village"}, + { RCAREA_GRAVEYARD, "Graveyard"}, + { RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail"}, + { RCAREA_GORON_CITY, "Goron City"}, + { RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater"}, + { RCAREA_ZORAS_RIVER, "Zora's River"}, + { RCAREA_ZORAS_DOMAIN, "Zora's Domain"}, + { RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain"}, + { RCAREA_LON_LON_RANCH, "Lon Lon Ranch"}, + { RCAREA_DEKU_TREE, "Deku Tree"}, + { RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern"}, + { RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly"}, + { RCAREA_FOREST_TEMPLE, "Forest Temple"}, + { RCAREA_FIRE_TEMPLE, "Fire Temple"}, + { RCAREA_WATER_TEMPLE, "Water Temple"}, + { RCAREA_SPIRIT_TEMPLE, "Spirit Temple"}, + { RCAREA_SHADOW_TEMPLE, "Shadow Temple"}, + { RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well"}, + { RCAREA_ICE_CAVERN, "Ice Cavern"}, + { RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Grounds"}, + { RCAREA_GANONS_CASTLE, "Ganon's Castle"}, + }; + +std::map RandomizerCheckObjects::GetAllRCAreas() { + return rcAreas; +} + std::unordered_map RandomizerCheckObjects::GetAllRCObjects() { return rcObjects; } From dbb4e3eefcdca09978580bdf55f68ca3dd500da5 Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 08:20:52 -0400 Subject: [PATCH 112/212] start on tree view --- .../Enhancements/randomizer/randomizer.cpp | 48 +++++++++---------- .../randomizer/randomizer_check_objects.h | 2 + 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 6f18e878e..070909814 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3747,37 +3747,35 @@ void DrawRandoEditor(bool& open) { window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::BeginChild("ChildRandomizedLocations"); - for (auto it : SpoilerfileCheckNameToEnum) { - if (!excludedLocations.count(it.second) && locationSearch.PassFilter(it.first.c_str())) { - if (ImGui::ArrowButton(std::to_string(it.second).c_str(), ImGuiDir_Right)) { - excludedLocations.insert(it.second); + for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { + // todo fix this, it's hacky and we shouldn't need to iterate through so many times + bool hasItems = false; + for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { + if (!excludedLocations.count(locationIt.second.rc) && + locationIt.second.rcArea == areaIt.first && + locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { + hasItems = true; + break; } - ImGui::SameLine(); - ImGui::Text("%s", it.first.c_str()); } - /* Checkbox UI - - if (locationSearch.PassFilter(it.first.c_str())) { - // we need the part from ## on to make each button unique in imgui - std::string buttonKey = "->##" + std::to_string(it.second); - // if (ImGui::SmallButton(buttonKey.c_str())) { - // excludedLocations.insert(it.second); - // } - auto elfound = excludedLocations.find(it.second); - bool varTheImguiCheckboxNeeds = elfound == excludedLocations.end(); - if (ImGui::Checkbox(it.first.c_str(), &varTheImguiCheckboxNeeds)) { - if (elfound != excludedLocations.end()) { - excludedLocations.erase(elfound); - } else { - excludedLocations.insert(it.second); + if (hasItems) { + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode(areaIt.second.c_str())) { + for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { + if (!excludedLocations.count(locationIt.second.rc) && + locationIt.second.rcArea == areaIt.first && + locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { + if (ImGui::ArrowButton(std::to_string(locationIt.first).c_str(), ImGuiDir_Right)) { + excludedLocations.insert(locationIt.first); + } + ImGui::SameLine(); + ImGui::Text(locationIt.second.rcShortName.c_str()); + } } + ImGui::TreePop(); } - // ImGui::SameLine(); - // ImGui::Text("%s", it.first.c_str()); } - - */ } ImGui::EndChild(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index 2e175f43c..44e8a149a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -1,6 +1,7 @@ #pragma once #include "randomizerTypes.h" #include +#include #include // Check types based on main settings @@ -72,6 +73,7 @@ typedef struct { } RandomizerCheckObject; namespace RandomizerCheckObjects { + std::map GetAllRCAreas(); std::unordered_map GetAllRCObjects(); RandomizerCheckObject GetRCObject(RandomizerCheck check); From 5ac69e0bd8948a291bfc334896eba04db3225acb Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 08:48:24 -0400 Subject: [PATCH 113/212] start filtering --- .../Enhancements/randomizer/randomizer.cpp | 28 +++++++++++++++++-- .../randomizer/randomizer_check_objects.cpp | 21 +++++++++++++- .../randomizer/randomizer_check_objects.h | 6 ++-- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 070909814..11e654316 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3748,14 +3748,25 @@ void DrawRandoEditor(bool& open) { ImGui::BeginChild("ChildRandomizedLocations"); for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { - // todo fix this, it's hacky and we shouldn't need to iterate through so many times + // todo fix this, it's hacky and copypasta bool hasItems = false; for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { if (!excludedLocations.count(locationIt.second.rc) && + locationIt.second.vOrMQ != RCVORMQ_MQ && //disable all MQ checks until we support them + locationIt.second.rcType != RCTYPE_SHOP && //disable shops until we have shopsanity + locationIt.second.rcType != RCTYPE_GOSSIP_STONE && + locationIt.second.rcType != RCTYPE_LINKS_POCKET && + locationIt.second.rcType != RCTYPE_CHEST_GAME && + ((locationIt.second.rcType != RCTYPE_SKULL_TOKEN) || + (CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(areaIt.first)) || // overworld tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(areaIt.first)) // dungeon tokens + ) && locationIt.second.rcArea == areaIt.first && locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { - hasItems = true; - break; + + hasItems = true; + break; } } @@ -3764,8 +3775,19 @@ void DrawRandoEditor(bool& open) { if (ImGui::TreeNode(areaIt.second.c_str())) { for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { if (!excludedLocations.count(locationIt.second.rc) && + locationIt.second.vOrMQ != RCVORMQ_MQ && //disable all MQ checks until we support them + locationIt.second.rcType != RCTYPE_SHOP && //disable shops until we have shopsanity + locationIt.second.rcType != RCTYPE_GOSSIP_STONE && + locationIt.second.rcType != RCTYPE_LINKS_POCKET && + locationIt.second.rcType != RCTYPE_CHEST_GAME && + ((locationIt.second.rcType != RCTYPE_SKULL_TOKEN) || + (CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(areaIt.first)) || // overworld tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(areaIt.first)) // dungeon tokens + ) && locationIt.second.rcArea == areaIt.first && locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { + if (ImGui::ArrowButton(std::to_string(locationIt.first).c_str(), ImGuiDir_Right)) { excludedLocations.insert(locationIt.first); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index f7106e0ec..494aed2a8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -14,7 +14,7 @@ typedef struct { } RandomizerCheckObject; */ std::unordered_map rcObjects = { - { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Invalid Location", "Invalid Location"}}, + { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_INVALID, "Invalid Location", "Invalid Location"}}, { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"}}, { RC_KF_MIDOS_TOP_RIGHT_CHEST, {RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Right Chest", "KF Mido Top Right Chest"}}, @@ -783,6 +783,25 @@ std::map rcAreas = { { RCAREA_GANONS_CASTLE, "Ganon's Castle"}, }; +bool RandomizerCheckObjects::AreaIsDungeon(RandomizerCheckArea area) { + return area == RCAREA_GANONS_CASTLE || + area == RCAREA_GERUDO_TRAINING_GROUND || + area == RCAREA_ICE_CAVERN || + area == RCAREA_BOTTOM_OF_THE_WELL || + area == RCAREA_SHADOW_TEMPLE || + area == RCAREA_SPIRIT_TEMPLE || + area == RCAREA_WATER_TEMPLE || + area == RCAREA_FIRE_TEMPLE || + area == RCAREA_FOREST_TEMPLE || + area == RCAREA_JABU_JABUS_BELLY || + area == RCAREA_DODONGOS_CAVERN || + area == RCAREA_DEKU_TREE; +} + +bool RandomizerCheckObjects::AreaIsOverworld(RandomizerCheckArea area) { + return !AreaIsDungeon(area); +} + std::map RandomizerCheckObjects::GetAllRCAreas() { return rcAreas; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index 44e8a149a..14c7e80e6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -60,7 +60,8 @@ typedef enum { RCAREA_BOTTOM_OF_THE_WELL, RCAREA_ICE_CAVERN, RCAREA_GERUDO_TRAINING_GROUND, - RCAREA_GANONS_CASTLE + RCAREA_GANONS_CASTLE, + RCAREA_INVALID } RandomizerCheckArea; typedef struct { @@ -73,8 +74,9 @@ typedef struct { } RandomizerCheckObject; namespace RandomizerCheckObjects { + bool AreaIsDungeon(RandomizerCheckArea area); + bool AreaIsOverworld(RandomizerCheckArea area); std::map GetAllRCAreas(); std::unordered_map GetAllRCObjects(); RandomizerCheckObject GetRCObject(RandomizerCheck check); - } \ No newline at end of file From dd9acbbb43e56905dfd07b9ee962e7307b825e52 Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 12:19:57 -0400 Subject: [PATCH 114/212] use ordered map to help arrange checks in imgui --- soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp | 5 ++--- soh/soh/Enhancements/randomizer/randomizer_check_objects.h | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 494aed2a8..54a064788 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -1,5 +1,4 @@ #include "randomizer_check_objects.h" -#include #include #include @@ -13,7 +12,7 @@ typedef struct { std::string rcSpoilerName; } RandomizerCheckObject; */ -std::unordered_map rcObjects = { +std::map rcObjects = { { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_INVALID, "Invalid Location", "Invalid Location"}}, { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"}}, @@ -806,7 +805,7 @@ std::map RandomizerCheckObjects::GetAllRCAreas return rcAreas; } -std::unordered_map RandomizerCheckObjects::GetAllRCObjects() { +std::map RandomizerCheckObjects::GetAllRCObjects() { return rcObjects; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index 14c7e80e6..27b2441b4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -2,7 +2,6 @@ #include "randomizerTypes.h" #include #include -#include // Check types based on main settings typedef enum { @@ -77,6 +76,6 @@ namespace RandomizerCheckObjects { bool AreaIsDungeon(RandomizerCheckArea area); bool AreaIsOverworld(RandomizerCheckArea area); std::map GetAllRCAreas(); - std::unordered_map GetAllRCObjects(); + std::map GetAllRCObjects(); RandomizerCheckObject GetRCObject(RandomizerCheck check); } \ No newline at end of file From 9bc6aac81e8918187e17448ed0d6d0081aedf558 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Thu, 18 Aug 2022 10:40:41 -0700 Subject: [PATCH 115/212] MacOS OTR (#973) --- CMakeLists.txt | 408 +++++++++++++++++++++------------------- Jenkinsfile | 2 +- soh/macosx/soh-macos.sh | 73 ++++++- 3 files changed, 281 insertions(+), 202 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f42fb69cb..38739bc8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,195 +1,213 @@ -cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) - -set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) -set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") -#set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use") - issue with soh compile with MSVC - -if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") -set(MACOSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE) -endif() - -project(Ship C CXX) - -set(PROJECT_VERSION_MAJOR "3") -set(PROJECT_VERSION_MINOR "0") -set(PROJECT_VERSION_PATCH "0") - -set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh) -add_compile_options($<$:/MP>) - -if (CMAKE_SYSTEM_NAME STREQUAL "Windows") -include(CMake/automate-vcpkg.cmake) - -set(VCPKG_TRIPLET x64-windows-static) -set(VCPKG_TARGET_TRIPLET x64-windows-static) - -vcpkg_bootstrap() -vcpkg_install_packages(zlib bzip2 libpng SDL2 GLEW glfw3) -endif() - -################################################################################ -# Set target arch type if empty. Visual studio solution generator provides it. -################################################################################ -if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - if(NOT CMAKE_VS_PLATFORM_NAME) - set(CMAKE_VS_PLATFORM_NAME "x64") - endif() - message("${CMAKE_VS_PLATFORM_NAME} architecture in use") - - if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64" - OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")) - message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") - endif() -endif() - -################################################################################ -# Global configuration types -################################################################################ -if (CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") -set(CMAKE_C_FLAGS_DEBUG "-O3 -ffast-math") -set(CMAKE_CXX_FLAGS_DEBUG "-O3 -ffast-math") -set(CMAKE_C_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG") -else() -set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG") -set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") -set(CMAKE_OBJCXX_FLAGS_RELEASE "-O2 -DNDEBUG") -endif() - -if(NOT CMAKE_BUILD_TYPE ) - set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE) -endif() - -################################################################################ -# Global compiler options -################################################################################ -if(MSVC) - # remove default flags provided with CMake for MSVC - set(CMAKE_C_FLAGS "") - set(CMAKE_C_FLAGS_DEBUG "") - set(CMAKE_C_FLAGS_RELEASE "") - set(CMAKE_CXX_FLAGS "") - set(CMAKE_CXX_FLAGS_DEBUG "") - set(CMAKE_CXX_FLAGS_RELEASE "") -endif() - -################################################################################ -# Global linker options -################################################################################ -if(MSVC) - # remove default flags provided with CMake for MSVC - set(CMAKE_EXE_LINKER_FLAGS "") - set(CMAKE_MODULE_LINKER_FLAGS "") - set(CMAKE_SHARED_LINKER_FLAGS "") - set(CMAKE_STATIC_LINKER_FLAGS "") - set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}") - set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}") - set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}") - set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}") - set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}") - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}") - set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}") -endif() - -################################################################################ -# Common utils -################################################################################ -include(CMake/Utils.cmake) - -if(CMAKE_SYSTEM_NAME MATCHES "Linux") - get_linux_lsb_release_information() - message(STATUS "Linux ${LSB_RELEASE_ID_SHORT} ${LSB_RELEASE_VERSION_SHORT} ${LSB_RELEASE_CODENAME_SHORT}") -else() - message(STATUS ${CMAKE_SYSTEM_NAME}) -endif() - -################################################################################ -# Additional Global Settings(add specific info there) -################################################################################ -include(CMake/GlobalSettingsInclude.cmake OPTIONAL) - -################################################################################ -# Use solution folders feature -################################################################################ -set_property(GLOBAL PROPERTY USE_FOLDERS ON) - -################################################################################ -# Sub-projects -################################################################################ -add_subdirectory(libultraship/libultraship ${CMAKE_BINARY_DIR}/libultraship) -add_subdirectory(ZAPDTR/ZAPD ${CMAKE_BINARY_DIR}/ZAPD) -add_subdirectory(ZAPDTR/ZAPDUtils ${CMAKE_BINARY_DIR}/ZAPDUtils) -add_subdirectory(OTRExporter) -add_subdirectory(soh) -if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|NintendoSwitch|CafeOS") -add_subdirectory(OTRGui) -endif() - -set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES) -set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.desktop") -set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png") - -if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") -INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage) -endif() - -find_package(Python3 COMPONENTS Interpreter) - -add_custom_target( - ExtractAssets - # CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions - COMMAND ${CMAKE_COMMAND} -E $,remove,rm> -f oot.otr - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" - COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_BINARY_DIR}/soh - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter - COMMENT "Running asset extraction..." - DEPENDS ZAPD - BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr -) - -if(CMAKE_SYSTEM_NAME MATCHES "Linux") - find_package(ImageMagick COMPONENTS convert) - if (ImageMagick_FOUND) - execute_process ( - COMMAND ${ImageMagick_convert_EXECUTABLE} soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png - OUTPUT_VARIABLE outVar - ) - endif() -endif() - -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") -add_custom_target(CreateOSXIcons - COMMAND mkdir -p ${CMAKE_BINARY_DIR}/macosx/soh.iconset - COMMAND sips -z 16 16 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png - COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png - COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png - COMMAND sips -z 64 64 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png - COMMAND sips -z 128 128 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png - COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png - COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png - COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png - COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png - COMMAND cp soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png - COMMAND iconutil -c icns -o ${CMAKE_BINARY_DIR}/macosx/soh.icns ${CMAKE_BINARY_DIR}/macosx/soh.iconset - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Creating OSX icons ..." - ) -add_dependencies(soh CreateOSXIcons) -endif() - -if(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") -INSTALL(FILES ${CMAKE_SOURCE_DIR}/README.md DESTINATION . COMPONENT ship RENAME readme.txt ) -endif() - -if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(CPACK_GENERATOR "External") -elseif(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") - set(CPACK_GENERATOR "ZIP") -elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(CPACK_GENERATOR "Bundle") -endif() - -set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/CMake/Packaging-2.cmake) -include(CMake/Packaging.cmake) +cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) + +set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) +set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") +#set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use") - issue with soh compile with MSVC + +if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") +set(MACOSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE) +endif() + +project(Ship C CXX) + +set(PROJECT_VERSION_MAJOR "3") +set(PROJECT_VERSION_MINOR "0") +set(PROJECT_VERSION_PATCH "0") + +set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh) +add_compile_options($<$:/MP>) + +if (CMAKE_SYSTEM_NAME STREQUAL "Windows") +include(CMake/automate-vcpkg.cmake) + +set(VCPKG_TRIPLET x64-windows-static) +set(VCPKG_TARGET_TRIPLET x64-windows-static) + +vcpkg_bootstrap() +vcpkg_install_packages(zlib bzip2 libpng SDL2 GLEW glfw3) +endif() + +################################################################################ +# Set target arch type if empty. Visual studio solution generator provides it. +################################################################################ +if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + if(NOT CMAKE_VS_PLATFORM_NAME) + set(CMAKE_VS_PLATFORM_NAME "x64") + endif() + message("${CMAKE_VS_PLATFORM_NAME} architecture in use") + + if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64" + OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")) + message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") + endif() +endif() + +################################################################################ +# Global configuration types +################################################################################ +if (CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") +set(CMAKE_C_FLAGS_DEBUG "-O3 -ffast-math") +set(CMAKE_CXX_FLAGS_DEBUG "-O3 -ffast-math") +set(CMAKE_C_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG") +set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG") +else() +set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG") +set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") +set(CMAKE_OBJCXX_FLAGS_RELEASE "-O2 -DNDEBUG") +endif() + +if(NOT CMAKE_BUILD_TYPE ) + set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE) +endif() + +################################################################################ +# Global compiler options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_C_FLAGS "") + set(CMAKE_C_FLAGS_DEBUG "") + set(CMAKE_C_FLAGS_RELEASE "") + set(CMAKE_CXX_FLAGS "") + set(CMAKE_CXX_FLAGS_DEBUG "") + set(CMAKE_CXX_FLAGS_RELEASE "") +endif() + +################################################################################ +# Global linker options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_EXE_LINKER_FLAGS "") + set(CMAKE_MODULE_LINKER_FLAGS "") + set(CMAKE_SHARED_LINKER_FLAGS "") + set(CMAKE_STATIC_LINKER_FLAGS "") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}") +endif() + +################################################################################ +# Common utils +################################################################################ +include(CMake/Utils.cmake) + +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + get_linux_lsb_release_information() + message(STATUS "Linux ${LSB_RELEASE_ID_SHORT} ${LSB_RELEASE_VERSION_SHORT} ${LSB_RELEASE_CODENAME_SHORT}") +else() + message(STATUS ${CMAKE_SYSTEM_NAME}) +endif() + +################################################################################ +# Additional Global Settings(add specific info there) +################################################################################ +include(CMake/GlobalSettingsInclude.cmake OPTIONAL) + +################################################################################ +# Use solution folders feature +################################################################################ +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +################################################################################ +# Sub-projects +################################################################################ +add_subdirectory(libultraship/libultraship ${CMAKE_BINARY_DIR}/libultraship) +add_subdirectory(ZAPDTR/ZAPD ${CMAKE_BINARY_DIR}/ZAPD) +add_subdirectory(ZAPDTR/ZAPDUtils ${CMAKE_BINARY_DIR}/ZAPDUtils) +add_subdirectory(OTRExporter) +add_subdirectory(soh) +if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|NintendoSwitch|CafeOS") +add_subdirectory(OTRGui) +endif() + +set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES) +set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.desktop") +set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png") + +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") +install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage) +endif() + +find_package(Python3 COMPONENTS Interpreter) + +add_custom_target( + ExtractAssets + # CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions + COMMAND ${CMAKE_COMMAND} -E $,remove,rm> -f oot.otr + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" + COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_BINARY_DIR}/soh + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter + COMMENT "Running asset extraction..." + DEPENDS ZAPD + BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr +) + +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + find_package(ImageMagick COMPONENTS convert) + if (ImageMagick_FOUND) + execute_process ( + COMMAND ${ImageMagick_convert_EXECUTABLE} soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png + OUTPUT_VARIABLE outVar + ) + endif() +endif() + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +add_custom_target(CreateOSXIcons + COMMAND mkdir -p ${CMAKE_BINARY_DIR}/macosx/soh.iconset + COMMAND sips -z 16 16 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png + COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png + COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png + COMMAND sips -z 64 64 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png + COMMAND sips -z 128 128 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png + COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png + COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png + COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png + COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png + COMMAND cp soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png + COMMAND iconutil -c icns -o ${CMAKE_BINARY_DIR}/macosx/soh.icns ${CMAKE_BINARY_DIR}/macosx/soh.iconset + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Creating OSX icons ..." + ) +add_dependencies(soh CreateOSXIcons) + +add_custom_target(Assets ALL + COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/OTRGui/assets/extractor" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/extractor" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake" + COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/OTRExporter/assets" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/game" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake" + COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/soh/assets/xml" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/extractor/xmls" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake" + ) +add_dependencies(soh Assets) + +install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets/extractor) + +set(PROGRAM_PERMISSIONS_EXECUTE OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ) + +install(DIRECTORY ${CMAKE_BINARY_DIR}/assets + DESTINATION . + PATTERN ZAPD.out + PERMISSIONS ${PROGRAM_PERMISSIONS_EXECUTE} + ) + +endif() + +if(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") +install(FILES ${CMAKE_SOURCE_DIR}/README.md DESTINATION . COMPONENT ship RENAME readme.txt ) +endif() + +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(CPACK_GENERATOR "External") +elseif(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") + set(CPACK_GENERATOR "ZIP") +elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(CPACK_GENERATOR "Bundle") +endif() + +set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/CMake/Packaging-2.cmake) +include(CMake/Packaging.cmake) diff --git a/Jenkinsfile b/Jenkinsfile index ca6c9aef5..55c4b4f28 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -23,7 +23,7 @@ pipeline { ]) sh ''' cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64 - cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release + cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" cmake --build build-cmake --target ExtractAssets --config Release ''' stash includes: 'soh/assets/**/*', name: 'assets' diff --git a/soh/macosx/soh-macos.sh b/soh/macosx/soh-macos.sh index 6ce17f55d..790c649fd 100755 --- a/soh/macosx/soh-macos.sh +++ b/soh/macosx/soh-macos.sh @@ -1,8 +1,69 @@ -#!/bin/sh -BUNDLE="`echo "$0" | sed -e 's/\/Contents\/MacOS\/.*//'`" -RESOURCES="$BUNDLE/Contents/Resources" +#!/bin/bash -export DYLD_FRAMEWORK_PATH=$RESOURCES/Frameworks -export DYLD_LIBRARY_PATH=$RESOURCES/bin +SNAME="$(dirname $0)" +export DATA_SHARE="$HOME/Library/Application Support/com.shipofharkinian.soh" +export SNAME +export RESPATH="${SNAME%/MacOS*}/Resources" +export LIBPATH="${SNAME%/MacOS*}/Frameworks" +export DYLD_FALLBACK_LIBRARY_PATH="$LIBPATH" -exec "$RESOURCES/soh-macos" +while [ ! -e "$DATA_SHARE/oot.otr" ]; do + ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)" + export ASSETDIR + cp -r "$RESPATH/assets" "$ASSETDIR" + mkdir -p "$ASSETDIR"/tmp + mkdir -p "$ASSETDIR"/Extract/assets + DROPROM="$(osascript -ss - "$ASSETDIR" <<-EOF + set romFile to choose file of type {"b64","n64","v64","z64"} with prompt "Please select your ROM:" + set destinationFolder to POSIX file "$ASSETDIR" + tell application "Finder" + duplicate romFile to destinationFolder + end tell + EOF + )" + "$DROPROM" + for rom in "$ASSETDIR"/*.*64 + do + if [ ! -e "$rom" ]; then + echo "no ROM" + osascript -e 'display dialog "Select ROM to generate OTR" giving up after 5' + rm -r "$ASSETDIR" + exit + fi + done + cp "$ASSETDIR"/*.*64 "$ASSETDIR"/tmp/rom.z64 + cp -r "$ASSETDIR"/assets/game/ship_of_harkinian "$ASSETDIR"/Extract/assets/ + cd "$ASSETDIR" || return + ROMHASH="$(shasum "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }')" + case "$ROMHASH" in + cee6bc3c2a634b41728f2af8da54d9bf8cc14099) + export ROM=GC_NMQ_D;; + 0227d7c0074f2d0ac935631990da8ec5914597b4) + export ROM=GC_NMQ_PAL_F;; + *) + WRONGHASH="$(osascript -ss - "$ROMHASH" <<-EOF + display dialog "Incompatible ROM hash $ROMHASH" \ + with title "Incompatible ROM hash" \ + with icon caution \ + giving up after 5 + EOF + )" + "$WRONGHASH" + rm -r "$ASSETDIR" + exit;; + esac + echo "$ROM" + + osascript -e 'display notification "Processing OTR..." with title "SOH: Generating OTR"' + assets/extractor/ZAPD.out ed -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR + if [ -e "$PWD"/oot.otr ]; then + osascript -e 'display notification "OTR Successfully Generated" with title "SOH: Generating OTR"' + if [ ! -e "$DATA_SHARE" ]; then mkdir "$DATA_SHARE"; fi + cp "$ASSETDIR"/oot.otr "$DATA_SHARE" + rm -r "$ASSETDIR" + fi + break +done + +"$RESPATH"/soh-macos +exit From 7fdb194dadb080fbe6fed95e9ccb1d88ef119889 Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 14:11:22 -0400 Subject: [PATCH 116/212] refactor location visibility filtering --- .../Enhancements/randomizer/randomizer.cpp | 31 +- .../randomizer/randomizer_check_objects.cpp | 1495 +++++++++-------- .../randomizer/randomizer_check_objects.h | 2 + 3 files changed, 775 insertions(+), 753 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 11e654316..8d8d457ce 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3727,8 +3727,13 @@ void DrawRandoEditor(bool& open) { ImGui::EndTabItem(); } + static bool locationsTabOpen = false; if (ImGui::BeginTabItem("Locations")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + if (!locationsTabOpen) { + locationsTabOpen = true; + RandomizerCheckObjects::UpdateImGuiVisibility(); + } static ImGuiTextFilter locationSearch; locationSearch.Draw(); @@ -3751,17 +3756,8 @@ void DrawRandoEditor(bool& open) { // todo fix this, it's hacky and copypasta bool hasItems = false; for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { - if (!excludedLocations.count(locationIt.second.rc) && - locationIt.second.vOrMQ != RCVORMQ_MQ && //disable all MQ checks until we support them - locationIt.second.rcType != RCTYPE_SHOP && //disable shops until we have shopsanity - locationIt.second.rcType != RCTYPE_GOSSIP_STONE && - locationIt.second.rcType != RCTYPE_LINKS_POCKET && - locationIt.second.rcType != RCTYPE_CHEST_GAME && - ((locationIt.second.rcType != RCTYPE_SKULL_TOKEN) || - (CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens - ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(areaIt.first)) || // overworld tokens - ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(areaIt.first)) // dungeon tokens - ) && + if (locationIt.second.visibleInImgui && + !excludedLocations.count(locationIt.second.rc) && locationIt.second.rcArea == areaIt.first && locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { @@ -3775,16 +3771,7 @@ void DrawRandoEditor(bool& open) { if (ImGui::TreeNode(areaIt.second.c_str())) { for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { if (!excludedLocations.count(locationIt.second.rc) && - locationIt.second.vOrMQ != RCVORMQ_MQ && //disable all MQ checks until we support them - locationIt.second.rcType != RCTYPE_SHOP && //disable shops until we have shopsanity - locationIt.second.rcType != RCTYPE_GOSSIP_STONE && - locationIt.second.rcType != RCTYPE_LINKS_POCKET && - locationIt.second.rcType != RCTYPE_CHEST_GAME && - ((locationIt.second.rcType != RCTYPE_SKULL_TOKEN) || - (CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens - ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(areaIt.first)) || // overworld tokens - ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(areaIt.first)) // dungeon tokens - ) && + locationIt.second.visibleInImgui && locationIt.second.rcArea == areaIt.first && locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { @@ -3823,6 +3810,8 @@ void DrawRandoEditor(bool& open) { ImGui::PopStyleVar(1); PaddedSeparator(); ImGui::EndTabItem(); + } else { + locationsTabOpen = false; } if (ImGui::BeginTabItem("Tricks/Glitches")) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 54a064788..2ac01b767 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -1,6 +1,8 @@ #include "randomizer_check_objects.h" #include #include +#include +#include /* typedef struct { @@ -8,743 +10,744 @@ typedef struct { RandomizerCheckVanillaOrMQ vOrMQ; RandomizerCheckType rcType; RandomizerCheckArea rcArea; + bool visibleInImgui; std::string rcShortName; std::string rcSpoilerName; } RandomizerCheckObject; */ std::map rcObjects = { - { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_INVALID, "Invalid Location", "Invalid Location"}}, - { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, - { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"}}, - { RC_KF_MIDOS_TOP_RIGHT_CHEST, {RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Right Chest", "KF Mido Top Right Chest"}}, - { RC_KF_MIDOS_BOTTOM_LEFT_CHEST, {RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"}}, - { RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, {RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"}}, - { RC_KF_STORMS_GROTTO_CHEST, {RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Storms Grotto Chest", "KF Storms Grotto Chest"}}, - { RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"}}, - { RC_LW_SKULL_KID, {RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Skull Kid", "LW Skull Kid"}}, - { RC_LW_TRADE_COJIRO, {RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Cojiro", "LW Trade Cojiro"}}, - { RC_LW_TRADE_ODD_POTION, {RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Odd Potion", "LW Trade Odd Potion"}}, - { RC_LW_OCARINA_MEMORY_GAME, {RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Ocarina Memory Game", "LW Ocarina Memory Game"}}, - { RC_LW_TARGET_IN_WOODS, {RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Target in Woods", "LW Target in Woods"}}, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"}}, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"}}, - { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, {RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"}}, - { RC_LW_DEKU_SCRUB_GROTTO_REAR, {RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"}}, - { RC_LW_DEKU_SCRUB_GROTTO_FRONT, {RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"}}, - { RC_DEKU_THEATER_SKULL_MASK, {RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Skull Mask", "Deku Theater Skull Mask"}}, - { RC_DEKU_THEATER_MASK_OF_TRUTH, {RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"}}, - { RC_SFM_WOLFOS_GROTTO_CHEST, {RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"}}, - { RC_SFM_DEKU_SCRUB_GROTTO_REAR, {RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"}}, - { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, {RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"}}, - { RC_HF_SOUTHEAST_GROTTO_CHEST, {RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Southeast Grotto Chest", "HF Southeast Grotto Chest"}}, - { RC_HF_OPEN_GROTTO_CHEST, {RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Open Grotto Chest", "HF Open Grotto Chest"}}, - { RC_HF_NEAR_MARKET_GROTTO_CHEST, {RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Near Market Grotto Chest", "HF Near Market Grotto Chest"}}, - { RC_HF_OCARINA_OF_TIME_ITEM, {RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Ocarina of Time Item", "HF Ocarina of Time Item"}}, - { RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, {RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"}}, - { RC_HF_DEKU_SCRUB_GROTTO, {RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Deku Scrub Grotto", "HF Deku Scrub Grotto"}}, - { RC_LH_CHILD_FISHING, {RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Child Fishing", "LH Child Fishing"}}, - { RC_LH_ADULT_FISHING, {RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Adult Fishing", "LH Adult Fishing"}}, - { RC_LH_LAB_DIVE, {RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Dive", "LH Lab Dive"}}, - { RC_LH_TRADE_FROG, {RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"}}, - { RC_LH_UNDERWATER_ITEM, {RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Underwater Item", "LH Underwater Item"}}, - { RC_LH_SUN, {RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Sun", "LH Sun"}}, - { RC_LH_FREESTANDING_POH, {RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Freestanding PoH", "LH Freestanding PoH"}}, - { RC_LH_DEKU_SCRUB_GROTTO_LEFT, {RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"}}, - { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, {RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"}}, - { RC_LH_DEKU_SCRUB_GROTTO_CENTER, {RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"}}, - { RC_GV_CHEST, {RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Chest", "GV Chest"}}, - { RC_GV_TRADE_SAW, {RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Trade Saw", "GV Trade Saw"}}, - { RC_GV_WATERFALL_FREESTANDING_POH, {RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"}}, - { RC_GV_CRATE_FREESTANDING_POH, {RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Crate Freestanding PoH", "GV Crate Freestanding PoH"}}, - { RC_GV_DEKU_SCRUB_GROTTO_REAR, {RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"}}, - { RC_GV_DEKU_SCRUB_GROTTO_FRONT, {RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"}}, - { RC_GF_CHEST, {RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "Chest", "GF Chest"}}, - { RC_GF_HBA_1000_POINTS, {RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1000 Points", "GF HBA 1000 Points"}}, - { RC_GF_HBA_1500_POINTS, {RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1500 Points", "GF HBA 1500 Points"}}, - { RC_GF_GERUDO_MEMBERSHIP_CARD, {RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF Gerudo Membership Card", "GF Gerudo Membership Card"}}, - { RC_GF_NORTH_F1_CARPENTER, {RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F1 Carpenter", "GF North F1 Carpenter"}}, - { RC_GF_NORTH_F2_CARPENTER, {RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F2 Carpenter", "GF North F2 Carpenter"}}, - { RC_GF_SOUTH_F1_CARPENTER, {RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F1 Carpenter", "GF South F1 Carpenter"}}, - { RC_GF_SOUTH_F2_CARPENTER, {RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F2 Carpenter", "GF South F2 Carpenter"}}, - { RC_WASTELAND_CHEST, {RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Chest", "Wasteland Chest"}}, - { RC_WASTELAND_BOMBCHU_SALESMAN, {RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Carpet Salesman", "Wasteland Carpet Salesman"}}, - { RC_COLOSSUS_FREESTANDING_POH, {RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Freestanding PoH", "Colossus Freestanding PoH"}}, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"}}, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"}}, - { RC_MARKET_TREASURE_CHEST_GAME_REWARD, {RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"}}, - { RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"}}, - { RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"}}, - { RC_MARKET_LOST_DOG, {RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Lost Dog", "MK Lost Dog"}}, - { RC_MARKET_SHOOTING_GALLERY_REWARD, {RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Shooting Gallery", "MK Shooting Gallery"}}, - { RC_MARKET_10_BIG_POES, {RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "10 Big Poes", "MK 10 Big Poes"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game First Room Chest", "MK Chest Game First Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"}}, - { RC_HC_MALON_EGG, {RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Malon Egg", "HC Malon Egg"}}, - { RC_HC_ZELDAS_LETTER, {RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Zeldas Letter", "HC Zeldas Letter"}}, - { RC_KAK_REDEAD_GROTTO_CHEST, {RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Redead Grotto Chest", "Kak Redead Grotto Chest"}}, - { RC_KAK_OPEN_GROTTO_CHEST, {RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Chest", "Kak Open Grotto Chest"}}, - { RC_KAK_10_GOLD_SKULLTULA_REWARD, {RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"}}, - { RC_KAK_20_GOLD_SKULLTULA_REWARD, {RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"}}, - { RC_KAK_30_GOLD_SKULLTULA_REWARD, {RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"}}, - { RC_KAK_40_GOLD_SKULLTULA_REWARD, {RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"}}, - { RC_KAK_50_GOLD_SKULLTULA_REWARD, {RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"}}, - { RC_KAK_MAN_ON_ROOF, {RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Man on Roof", "Kak Man on Roof"}}, - { RC_KAK_SHOOTING_GALLERY_REWARD, {RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"}}, - { RC_KAK_TRADE_ODD_MUSHROOM, {RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"}}, - { RC_KAK_ANJU_AS_ADULT, {RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Adult", "Kak Anju as Adult"}}, - { RC_KAK_ANJU_AS_CHILD, {RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Child", "Kak Anju as Child"}}, - { RC_KAK_TRADE_POCKET_CUCCO, {RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"}}, - { RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, {RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"}}, - { RC_KAK_WINDMILL_FREESTANDING_POH, {RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"}}, - { RC_GRAVEYARD_SHIELD_GRAVE_CHEST, {RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Shield Grave Chest", "GY Shield Grave Chest"}}, - { RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"}}, - { RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, {RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Composers Grave Chest", "GY Composers Grave Chest"}}, - { RC_GRAVEYARD_HOOKSHOT_CHEST, {RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Hookshot Chest", "GY Hookshot Chest"}}, - { RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"}}, - { RC_GRAVEYARD_FREESTANDING_POH, {RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Freestanding PoH", "GY Freestanding PoH"}}, - { RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"}}, - { RC_DMT_CHEST, {RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Chest", "DMT Chest"}}, - { RC_DMT_STORMS_GROTTO_CHEST, {RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Chest", "DMT Storms Grotto Chest"}}, - { RC_DMT_TRADE_BROKEN_SWORD, {RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Broken Sword", "DMT Trade Broken Sword"}}, - { RC_DMT_TRADE_EYEDROPS, {RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Eyedrops", "DMT Trade Eyedrops"}}, - { RC_DMT_TRADE_CLAIM_CHECK, {RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Claim Check", "DMT Trade Claim Check"}}, - { RC_DMT_FREESTANDING_POH, {RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Freestanding PoH", "DMT Freestanding PoH"}}, - { RC_GC_MAZE_LEFT_CHEST, {RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Left Chest", "GC Maze Left Chest"}}, - { RC_GC_MAZE_RIGHT_CHEST, {RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Right Chest", "GC Maze Right Chest"}}, - { RC_GC_MAZE_CENTER_CHEST, {RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Center Chest", "GC Maze Center Chest"}}, - { RC_GC_ROLLING_GORON_AS_CHILD, {RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Child", "GC Rolling Goron as Child"}}, - { RC_GC_ROLLING_GORON_AS_ADULT, {RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Adult", "GC Rolling Goron as Adult"}}, - { RC_GC_DARUNIAS_JOY, {RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Darunias Joy", "GC Darunias Joy"}}, - { RC_GC_POT_FREESTANDING_POH, {RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Pot Freestanding PoH", "GC Pot Freestanding PoH"}}, - { RC_GC_DEKU_SCRUB_GROTTO_LEFT, {RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"}}, - { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, {RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"}}, - { RC_GC_DEKU_SCRUB_GROTTO_CENTER, {RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"}}, - { RC_GC_MEDIGORON, {RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Medigoron", "GC Medigoron"}}, - { RC_DMC_UPPER_GROTTO_CHEST, {RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Chest", "DMC Upper Grotto Chest"}}, - { RC_DMC_WALL_FREESTANDING_POH, {RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"}}, - { RC_DMC_VOLCANO_FREESTANDING_POH, {RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"}}, - { RC_DMC_DEKU_SCRUB, {RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub", "DMC Deku Scrub"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, {RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, {RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, {RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"}}, - { RC_ZR_OPEN_GROTTO_CHEST, {RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Open Grotto Chest", "ZR Open Grotto Chest"}}, - { RC_ZR_MAGIC_BEAN_SALESMAN, {RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Magic Bean Salesman", "ZR Magic Bean Salesman"}}, - { RC_ZR_FROGS_ZELDAS_LULLABY, {RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"}}, - { RC_ZR_FROGS_EPONAS_SONG, {RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Epona's Song", "ZR Frogs Epona's Song"}}, - { RC_ZR_FROGS_SARIAS_SONG, {RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Saria's Song", "ZR Frogs Saria's Song"}}, - { RC_ZR_FROGS_SUNS_SONG, {RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Sun's Song", "ZR Frogs Sun's Song"}}, - { RC_ZR_FROGS_SONG_OF_TIME, {RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Song of Time", "ZR Frogs Song of Time"}}, - { RC_ZR_FROGS_IN_THE_RAIN, {RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs in the Rain", "ZR Frogs in the Rain"}}, - { RC_ZR_FROGS_OCARINA_GAME, {RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"}}, - { RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"}}, - { RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, {RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"}}, - { RC_ZR_DEKU_SCRUB_GROTTO_REAR, {RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"}}, - { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, {RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"}}, - { RC_ZD_CHEST, {RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Chest", "ZD Chest"}}, - { RC_ZD_DIVING_MINIGAME, {RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Diving Minigame", "ZD Diving Minigame"}}, - { RC_ZD_KING_ZORA_THAWED, {RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "King Zora Thawed", "ZD King Zora Thawed"}}, - { RC_ZD_TRADE_PRESCRIPTION, {RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Trade Prescription", "ZD Trade Prescription"}}, - { RC_ZF_ICEBERC_FREESTANDING_POH, {RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"}}, - { RC_ZF_BOTTOM_FREESTANDING_POH, {RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"}}, - { RC_LLR_TALONS_CHICKENS, {RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Talons Chickens", "LLR Talons Chickens"}}, - { RC_LLR_FREESTANDING_POH, {RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Freestanding PoH", "LLR Freestanding PoH"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, {RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, {RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, {RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"}}, - { RC_DEKU_TREE_MAP_CHEST, {RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Map Chest", "Deku Tree Map Chest"}}, - { RC_DEKU_TREE_COMPASS_CHEST, {RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Chest", "Deku Tree Compass Chest"}}, - { RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"}}, - { RC_DEKU_TREE_BASEMENT_CHEST, {RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Basement Chest", "Deku Tree Basement Chest"}}, - { RC_DEKU_TREE_SLINGSHOT_CHEST, {RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Chest", "Deku Tree Slingshot Chest"}}, - { RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"}}, - { RC_DEKU_TREE_MQ_MAP_CHEST, {RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Map Chest", "Deku Tree MQ Map Chest"}}, - { RC_DEKU_TREE_MQ_COMPASS_CHEST, {RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Compass Chest", "Deku Tree MQ Compass Chest"}}, - { RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"}}, - { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"}}, - { RC_DEKU_TREE_MQ_BASEMENT_CHEST, {RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Basement Chest", "Deku Tree MQ Basement Chest"}}, - { RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"}}, - { RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"}}, - { RC_DEKU_TREE_MQ_DEKU_SCRUB, {RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"}}, - { RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, {RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"}}, - { RC_DODONGOS_CAVERN_MAP_CHEST, {RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Map Chest", "Dodongos Cavern Map Chest"}}, - { RC_DODONGOS_CAVERN_COMPASS_CHEST, {RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Compass Chest", "Dodongos Cavern Compass Chest"}}, - { RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"}}, - { RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"}}, - { RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"}}, - { RC_DODONGOS_CAVERN_MQ_MAP_CHEST, {RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"}}, - { RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"}}, - { RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, {RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"}}, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"}}, - { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"}}, - { RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"}}, - { RC_JABU_JABUS_BELLY_MAP_CHEST, {RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Map Chest", "Jabu Jabus Belly Map Chest"}}, - { RC_JABU_JABUS_BELLY_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Compass Chest", "Jabu Jabus Belly Compass Chest"}}, - { RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"}}, - { RC_JABU_JABUS_BELLY_DEKU_SCRUB, {RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"}}, - { RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, {RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"}}, - { RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Room Chest", "Forest Temple First Room Chest"}}, - { RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, {RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Stalfos Chest", "Forest Temple First Stalfos Chest"}}, - { RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"}}, - { RC_FOREST_TEMPLE_MAP_CHEST, {RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Map Chest", "Forest Temple Map Chest"}}, - { RC_FOREST_TEMPLE_WELL_CHEST, {RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Well Chest", "Forest Temple Well Chest"}}, - { RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"}}, - { RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, {RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Eye Switch Chest", "Forest Temple Eye Switch Chest"}}, - { RC_FOREST_TEMPLE_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Boss Key Chest", "Forest Temple Boss Key Chest"}}, - { RC_FOREST_TEMPLE_FLOORMASTER_CHEST, {RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Floormaster Chest", "Forest Temple Floormaster Chest"}}, - { RC_FOREST_TEMPLE_BOW_CHEST, {RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Bow Chest", "Forest Temple Bow Chest"}}, - { RC_FOREST_TEMPLE_RED_POE_CHEST, {RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Red Poe Chest", "Forest Temple Red Poe Chest"}}, - { RC_FOREST_TEMPLE_BLUE_POE_CHEST, {RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Blue Poe Chest", "Forest Temple Blue Poe Chest"}}, - { RC_FOREST_TEMPLE_BASEMENT_CHEST, {RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Basement Chest", "Forest Temple Basement Chest"}}, - { RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ First Room Chest", "Forest Temple MQ First Room Chest"}}, - { RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, {RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"}}, - { RC_FOREST_TEMPLE_MQ_BOW_CHEST, {RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Bow Chest", "Forest Temple MQ Bow Chest"}}, - { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"}}, - { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"}}, - { RC_FOREST_TEMPLE_MQ_WELL_CHEST, {RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Well Chest", "Forest Temple MQ Well Chest"}}, - { RC_FOREST_TEMPLE_MQ_MAP_CHEST, {RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Map Chest", "Forest Temple MQ Map Chest"}}, - { RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, {RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Compass Chest", "Forest Temple MQ Compass Chest"}}, - { RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"}}, - { RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, {RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Basement Chest", "Forest Temple MQ Basement Chest"}}, - { RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, {RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Redead Chest", "Forest Temple MQ Redead Chest"}}, - { RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"}}, - { RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Near Boss Chest", "Fire Temple Near Boss Chest"}}, - { RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, {RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"}}, - { RC_FIRE_TEMPLE_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boss Key Chest", "Fire Temple Boss Key Chest"}}, - { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"}}, - { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"}}, - { RC_FIRE_TEMPLE_SCARECROW_CHEST, {RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Scarecrow Chest", "Fire Temple Scarecrow Chest"}}, - { RC_FIRE_TEMPLE_MAP_CHEST, {RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Map Chest", "Fire Temple Map Chest"}}, - { RC_FIRE_TEMPLE_COMPASS_CHEST, {RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Compass Chest", "Fire Temple Compass Chest"}}, - { RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, {RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Highest Goron Chest", "Fire Temple Highest Goron Chest"}}, - { RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"}}, - { RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"}}, - { RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"}}, - { RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, {RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Compass Chest", "Fire Temple MQ Compass Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"}}, - { RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"}}, - { RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"}}, - { RC_FIRE_TEMPLE_MQ_MAP_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Chest", "Fire Temple MQ Map Chest"}}, - { RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"}}, - { RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"}}, - { RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, {RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"}}, - { RC_WATER_TEMPLE_MAP_CHEST, {RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Map Chest", "Water Temple Map Chest"}}, - { RC_WATER_TEMPLE_COMPASS_CHEST, {RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Compass Chest", "Water Temple Compass Chest"}}, - { RC_WATER_TEMPLE_TORCHES_CHEST, {RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Torches Chest", "Water Temple Torches Chest"}}, - { RC_WATER_TEMPLE_DRAGON_CHEST, {RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Dragon Chest", "Water Temple Dragon Chest"}}, - { RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"}}, - { RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Pillar Chest", "Water Temple Central Pillar Chest"}}, - { RC_WATER_TEMPLE_CRACKED_WALL_CHEST, {RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"}}, - { RC_WATER_TEMPLE_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Boss Key Chest", "Water Temple Boss Key Chest"}}, - { RC_WATER_TEMPLE_LONGSHOT_CHEST, {RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Longshot Chest", "Water Temple Longshot Chest"}}, - { RC_WATER_TEMPLE_RIVER_CHEST, {RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "River Chest", "Water Temple River Chest"}}, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"}}, - { RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"}}, - { RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, {RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"}}, - { RC_WATER_TEMPLE_MQ_COMPASS_CHEST, {RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Compass Chest", "Water Temple MQ Compass Chest"}}, - { RC_WATER_TEMPLE_MQ_MAP_CHEST, {RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Map Chest", "Water Temple MQ Map Chest"}}, - { RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, {RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"}}, - { RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"}}, - { RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"}}, - { RC_SPIRIT_TEMPLE_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Compass Chest", "Spirit Temple Compass Chest"}}, - { RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"}}, - { RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"}}, - { RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"}}, - { RC_SPIRIT_TEMPLE_MAP_CHEST, {RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Map Chest", "Spirit Temple Map Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"}}, - { RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"}}, - { RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"}}, - { RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"}}, - { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"}}, - { RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Boss Key Chest", "Spirit Temple Boss Key Chest"}}, - { RC_SPIRIT_TEMPLE_TOPMOST_CHEST, {RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Topmost Chest", "Spirit Temple Topmost Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Chest", "Spirit Temple MQ Map Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MAP_CHEST, {RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Map Chest", "Shadow Temple Map Chest"}}, - { RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"}}, - { RC_SHADOW_TEMPLE_COMPASS_CHEST, {RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Compass Chest", "Shadow Temple Compass Chest"}}, - { RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"}}, - { RC_SHADOW_TEMPLE_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"}}, - { RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"}}, - { RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"}}, - { RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"}}, - { RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Boss Key Chest", "Shadow Temple Boss Key Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"}}, - { RC_SHADOW_TEMPLE_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Freestanding Key", "Shadow Temple Freestanding Key"}}, - { RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, {RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"}}, - { RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"}}, - { RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"}}, - { RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Map Chest", "Shadow Temple MQ Map Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"}}, - { RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"}}, - { RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"}}, - { RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"}}, - { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"}}, - { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"}}, - { RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"}}, - { RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"}}, - { RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Compass Chest", "Bottom of the Well Compass Chest"}}, - { RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"}}, - { RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"}}, - { RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"}}, - { RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Invisible Chest", "Bottom of the Well Invisible Chest"}}, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"}}, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Map Chest", "Bottom of the Well Map Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"}}, - { RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Like Like Chest", "Bottom of the Well Like Like Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Freestanding Key", "Bottom of the Well Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Map Chest", "Bottom of the Well MQ Map Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"}}, - { RC_ICE_CAVERN_MAP_CHEST, {RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Map Chest", "Ice Cavern Map Chest"}}, - { RC_ICE_CAVERN_COMPASS_CHEST, {RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Compass Chest", "Ice Cavern Compass Chest"}}, - { RC_ICE_CAVERN_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"}}, - { RC_ICE_CAVERN_FREESTANDING_POH, {RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Freestanding PoH", "Ice Cavern Freestanding PoH"}}, - { RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"}}, - { RC_ICE_CAVERN_MQ_COMPASS_CHEST, {RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"}}, - { RC_ICE_CAVERN_MQ_MAP_CHEST, {RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Map Chest", "Ice Cavern MQ Map Chest"}}, - { RC_ICE_CAVERN_MQ_FREESTANDING_POH, {RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"}}, - { RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"}}, - { RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"}}, - { RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, {RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"}}, - { RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"}}, - { RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"}}, - { RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, {RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"}}, - { RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"}}, - { RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, {RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"}}, - { RC_GANONS_TOWER_BOSS_KEY_CHEST, {RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Boss Key Chest", "Ganon's Tower Boss Key Chest"}}, - { RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"}}, - { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"}}, - { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"}}, - { RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"}}, - { RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"}}, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"}}, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"}}, - { RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"}}, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"}}, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"}}, - { RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Back Room", "Deku Tree GS Basement Back Room"}}, - { RC_DEKU_TREE_GS_BASEMENT_GATE, {RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Gate", "Deku Tree GS Basement Gate"}}, - { RC_DEKU_TREE_GS_BASEMENT_VINES, {RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Vines", "Deku Tree GS Basement Vines"}}, - { RC_DEKU_TREE_GS_COMPASS_ROOM, {RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Compass Room", "Deku Tree GS Compass Room"}}, - { RC_DEKU_TREE_MQ_GS_LOBBY, {RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Lobby", "Deku Tree MQ GS Lobby"}}, - { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"}}, - { RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"}}, - { RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"}}, - { RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"}}, - { RC_DODONGOS_CAVERN_GS_SCARECROW, {RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"}}, - { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"}}, - { RC_DODONGOS_CAVERN_GS_BACK_ROOM, {RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Back Room", "Dodongos Cavern GS Back Room"}}, - { RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"}}, - { RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, {RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"}}, - { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"}}, - { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"}}, - { RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"}}, - { RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"}}, - { RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"}}, - { RC_FOREST_TEMPLE_GS_FIRST_ROOM, {RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS First Room", "Forest Temple GS First Room"}}, - { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"}}, - { RC_FOREST_TEMPLE_GS_LOBBY, {RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Lobby", "Forest Temple GS Lobby"}}, - { RC_FOREST_TEMPLE_GS_BASEMENT, {RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Basement", "Forest Temple GS Basement"}}, - { RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"}}, - { RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"}}, - { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"}}, - { RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"}}, - { RC_FOREST_TEMPLE_MQ_GS_WELL, {RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Well", "Forest Temple MQ GS Well"}}, - { RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Song of Time Room", "Fire Temple GS Song of Time Room"}}, - { RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"}}, - { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, {RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boulder Maze", "Fire Temple GS Boulder Maze"}}, - { RC_FIRE_TEMPLE_GS_SCARECROW_TOP, {RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"}}, - { RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, {RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"}}, - { RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"}}, - { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"}}, - { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"}}, - { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"}}, - { RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"}}, - { RC_WATER_TEMPLE_GS_BEHIND_GATE, {RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Behind Gate", "Water Temple GS Behind Gate"}}, - { RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"}}, - { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, {RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Central Pillar", "Water Temple GS Central Pillar"}}, - { RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"}}, - { RC_WATER_TEMPLE_GS_RIVER, {RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS River", "Water Temple GS River"}}, - { RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"}}, - { RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"}}, - { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"}}, - { RC_WATER_TEMPLE_MQ_GS_RIVER, {RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS River", "Water Temple MQ GS River"}}, - { RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"}}, - { RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"}}, - { RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Boulder Room", "Spirit Temple GS Boulder Room"}}, - { RC_SPIRIT_TEMPLE_GS_LOBBY, {RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Lobby", "Spirit Temple GS Lobby"}}, - { RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"}}, - { RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Metal Fence", "Spirit Temple GS Metal Fence"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"}}, - { RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"}}, - { RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"}}, - { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"}}, - { RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Like Like Room", "Shadow Temple GS Like Like Room"}}, - { RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Near Ship", "Shadow Temple GS Near Ship"}}, - { RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"}}, - { RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"}}, - { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"}}, - { RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"}}, - { RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"}}, - { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"}}, - { RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS East Inner Room", "Bottom of the Well GS East Inner Room"}}, - { RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS West Inner Room", "Bottom of the Well GS West Inner Room"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Basement", "Bottom of the Well MQ GS Basement"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"}}, - { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Push Block Room", "Ice Cavern GS Push Block Room"}}, - { RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"}}, - { RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"}}, - { RC_ICE_CAVERN_MQ_GS_SCARECROW, {RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"}}, - { RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, {RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"}}, - { RC_ICE_CAVERN_MQ_GS_RED_ICE, {RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"}}, - { RC_KF_GS_BEAN_PATCH, {RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Bean Patch", "KF GS Bean Patch"}}, - { RC_KF_GS_KNOW_IT_ALL_HOUSE, {RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Know It All House", "KF GS Know It All House"}}, - { RC_KF_GS_HOUSE_OF_TWINS, {RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS House of Twins", "KF GS House of Twins"}}, - { RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, {RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"}}, - { RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"}}, - { RC_LW_GS_ABOVE_THEATER, {RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Above Theater", "LW GS Above Theater"}}, - { RC_SFM_GS, {RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, "GS", "SFM GS"}}, - { RC_HF_GS_COW_GROTTO, {RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Cow Grotto", "HF GS Cow Grotto"}}, - { RC_HF_GS_NEAR_KAK_GROTTO, {RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Near Kak Grotto", "HF GS Near Kak Grotto"}}, - { RC_LH_GS_BEAN_PATCH, {RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Bean Patch", "LH GS Bean Patch"}}, - { RC_LH_GS_SMALL_ISLAND, {RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Small Island", "LH GS Small Island"}}, - { RC_LH_GS_LAB_WALL, {RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Wall", "LH GS Lab Wall"}}, - { RC_LH_GS_LAB_CRATE, {RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Crate", "LH GS Lab Crate"}}, - { RC_LH_GS_TREE, {RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Tree", "LH GS Tree"}}, - { RC_GV_GS_BEAN_PATCH, {RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Bean Patch", "GV GS Bean Patch"}}, - { RC_GV_GS_SMALL_BRIDGE, {RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Small Bridge", "GV GS Small Bridge"}}, - { RC_GV_GS_PILLAR, {RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Pillar", "GV GS Pillar"}}, - { RC_GV_GS_BEHIND_TENT, {RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Behind Tent", "GV GS Behind Tent"}}, - { RC_GF_GS_ARCHERY_RANGE, {RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Archery Range", "GF GS Archery Range"}}, - { RC_GF_GS_TOP_FLOOR, {RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Top Floor", "GF GS Top Floor"}}, - { RC_WASTELAND_GS, {RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, "GS", "Wasteland GS"}}, - { RC_COLOSSUS_GS_BEAN_PATCH, {RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Bean Patch", "Colossus GS Bean Patch"}}, - { RC_COLOSSUS_GS_HILL, {RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Hill", "Colossus GS Hill"}}, - { RC_COLOSSUS_GS_TREE, {RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Tree", "Colossus GS Tree"}}, - { RC_OGC_GS, {RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "OGC GS", "OGC GS"}}, - { RC_HC_GS_STORMS_GROTTO, {RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Storms Grotto", "HC GS Storms Grotto"}}, - { RC_HC_GS_TREE, {RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Tree", "HC GS Tree"}}, - { RC_MARKET_GS_GUARD_HOUSE, {RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "Market GS Guard House", "Market GS Guard House"}}, - { RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, {RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS House Under Construction", "Kak GS House Under Construction"}}, - { RC_KAK_GS_SKULLTULA_HOUSE, {RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Skulltula House", "Kak GS Skulltula House"}}, - { RC_KAK_GS_GUARDS_HOUSE, {RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Guards House", "Kak GS Guards House"}}, - { RC_KAK_GS_TREE, {RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Tree", "Kak GS Tree"}}, - { RC_KAK_GS_WATCHTOWER, {RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Watchtower", "Kak GS Watchtower"}}, - { RC_KAK_GS_ABOVE_IMPAS_HOUSE, {RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Above Impas House", "Kak GS Above Impas House"}}, - { RC_GRAVEYARD_GS_WALL, {RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Wall", "Graveyard GS Wall"}}, - { RC_GRAVEYARD_GS_BEAN_PATCH, {RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Bean Patch", "Graveyard GS Bean Patch"}}, - { RC_DMC_GS_BEAN_PATCH, {RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Bean Patch", "DMC GS Bean Patch"}}, - { RC_DMC_GS_CRATE, {RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Crate", "DMC GS Crate"}}, - { RC_DMT_GS_BEAN_PATCH, {RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Bean Patch", "DMT GS Bean Patch"}}, - { RC_DMT_GS_NEAR_KAK, {RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Near Kak", "DMT GS Near Kak"}}, - { RC_DMT_GS_ABOVE_DODONGOS_CAVERN, {RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"}}, - { RC_DMT_GS_FALLING_ROCKS_PATH, {RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"}}, - { RC_GC_GS_CENTER_PLATFORM, {RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Center Platform", "GC GS Center Platform"}}, - { RC_GC_GS_BOULDER_MAZE, {RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Boulder Maze", "GC GS Boulder Maze"}}, - { RC_ZR_GS_LADDER, {RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Ladder", "ZR GS Ladder"}}, - { RC_ZR_GS_TREE, {RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Tree", "ZR GS Tree"}}, - { RC_ZR_GS_ABOVE_BRIDGE, {RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Above Bridge", "ZR GS Above Bridge"}}, - { RC_ZR_GS_NEAR_RAISED_GROTTOS, {RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"}}, - { RC_ZD_GS_FROZEN_WATERFALL, {RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"}}, - { RC_ZF_GS_ABOVE_THE_LOG, {RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Above The Log", "ZF GS Above The Log"}}, - { RC_ZF_GS_HIDDEN_CAVE, {RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Hidden Cave", "ZF GS Hidden Cave"}}, - { RC_ZF_GS_TREE, {RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Tree", "ZF GS Tree"}}, - { RC_LLR_GS_BACK_WALL, {RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Back Wall", "LLR GS Back Wall"}}, - { RC_LLR_GS_RAIN_SHED, {RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Rain Shed", "LLR GS Rain Shed"}}, - { RC_LLR_GS_HOUSE_WINDOW, {RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS House Window", "LLR GS House Window"}}, - { RC_LLR_GS_TREE, {RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Tree", "LLR GS Tree"}}, - { RC_LINKS_POCKET, {RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_LINKS_POCKET, RCAREA_KOKIRI_FOREST, "Link's Pocket", "Link's Pocket"}}, - { RC_QUEEN_GOHMA, {RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma", "Queen Gohma"}}, - { RC_KING_DODONGO, {RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo", "King Dodongo"}}, - { RC_BARINADE, {RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade", "Barinade"}}, - { RC_PHANTOM_GANON, {RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon", "Phantom Ganon"}}, - { RC_VOLVAGIA, {RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia", "Volvagia"}}, - { RC_MORPHA, {RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha", "Morpha"}}, - { RC_TWINROVA, {RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova", "Twinrova"}}, - { RC_BONGO_BONGO, {RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo", "Bongo Bongo"}}, - { RC_DEKU_TREE_QUEEN_GOHMA_HEART, {RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"}}, - { RC_DODONGOS_CAVERN_KING_DODONGO_HEART, {RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"}}, - { RC_JABU_JABUS_BELLY_BARINADE_HEART, {RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"}}, - { RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, {RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"}}, - { RC_FIRE_TEMPLE_VOLVAGIA_HEART, {RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"}}, - { RC_WATER_TEMPLE_MORPHA_HEART, {RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha Heart Container", "Water Temple Morpha Heart Container"}}, - { RC_SPIRIT_TEMPLE_TWINROVA_HEART, {RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"}}, - { RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, {RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"}}, - { RC_TOT_LIGHT_ARROWS_CUTSCENE, {RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"}}, - { RC_LW_GIFT_FROM_SARIA, {RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Gift From Saria", "LW Gift From Saria"}}, - { RC_ZF_GREAT_FAIRY_REWARD, {RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Great Fairy Reward", "ZF Great Fairy Reward"}}, - { RC_HC_GREAT_FAIRY_REWARD, {RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Great Fairy Reward", "HC Great Fairy Reward"}}, - { RC_COLOSSUS_GREAT_FAIRY_REWARD, {RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Great Fairy Reward", "Colossus Great Fairy Reward"}}, - { RC_DMT_GREAT_FAIRY_REWARD, {RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Great Fairy Reward", "DMT Great Fairy Reward"}}, - { RC_DMC_GREAT_FAIRY_REWARD, {RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Great Fairy Reward", "DMC Great Fairy Reward"}}, - { RC_OGC_GREAT_FAIRY_REWARD, {RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "OGC Great Fairy Reward", "OGC Great Fairy Reward"}}, - { RC_SHEIK_IN_FOREST, {RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Sheik in Forest", "Sheik in Forest"}}, - { RC_SHEIK_IN_CRATER, {RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Sheik in Crater", "Sheik in Crater"}}, - { RC_SHEIK_IN_ICE_CAVERN, {RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Sheik in Ice Cavern", "Sheik in Ice Cavern"}}, - { RC_SHEIK_AT_COLOSSUS, {RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Sheik at Colossus", "Sheik at Colossus"}}, - { RC_SHEIK_IN_KAKARIKO, {RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Sheik in Kakariko", "Sheik in Kakariko"}}, - { RC_SHEIK_AT_TEMPLE, {RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Sheik at Temple", "Sheik at Temple"}}, - { RC_SONG_FROM_IMPA, {RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Song from Impa", "Song from Impa"}}, - { RC_SONG_FROM_MALON, {RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Song from Malon", "Song from Malon"}}, - { RC_SONG_FROM_SARIA, {RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Song from Saria", "Song from Saria"}}, - { RC_SONG_FROM_ROYAL_FAMILYS_TOMB, {RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Song from Composers Grave", "Song from Composers Grave"}}, - { RC_SONG_FROM_OCARINA_OF_TIME, {RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Song from Ocarina of Time", "Song from Ocarina of Time"}}, - { RC_SONG_FROM_WINDMILL, {RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Song from Windmill", "Song from Windmill"}}, - { RC_KF_LINKS_HOUSE_COW, {RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, "Links House Cow", "KF Links House Cow"}}, - { RC_HF_COW_GROTTO_COW, {RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, "Cow Grotto Cow", "HF Cow Grotto Cow"}}, - { RC_LLR_STABLES_LEFT_COW, {RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Left Cow", "LLR Stables Left Cow"}}, - { RC_LLR_STABLES_RIGHT_COW, {RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Right Cow", "LLR Stables Right Cow"}}, - { RC_LLR_TOWER_LEFT_COW, {RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Left Cow", "LLR Tower Left Cow"}}, - { RC_LLR_TOWER_RIGHT_COW, {RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Right Cow", "LLR Tower Right Cow"}}, - { RC_KAK_IMPAS_HOUSE_COW, {RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, "Impas House Cow", "Kak Impas House Cow"}}, - { RC_DMT_COW_GROTTO_COW, {RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, "Cow Grotto Cow", "DMT Cow Grotto Cow"}}, - { RC_GV_COW, {RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, "Cow", "GV Cow"}}, - { RC_JABU_JABUS_BELLY_MQ_COW, {RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, "MQ Cow", "Jabu Jabus Belly MQ Cow"}}, - { RC_KF_SHOP_ITEM_1, {RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 1", "KF Shop Item 1"}}, - { RC_KF_SHOP_ITEM_2, {RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 2", "KF Shop Item 2"}}, - { RC_KF_SHOP_ITEM_3, {RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 3", "KF Shop Item 3"}}, - { RC_KF_SHOP_ITEM_4, {RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 4", "KF Shop Item 4"}}, - { RC_KF_SHOP_ITEM_5, {RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 5", "KF Shop Item 5"}}, - { RC_KF_SHOP_ITEM_6, {RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 6", "KF Shop Item 6"}}, - { RC_KF_SHOP_ITEM_7, {RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 7", "KF Shop Item 7"}}, - { RC_KF_SHOP_ITEM_8, {RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 8", "KF Shop Item 8"}}, - { RC_KAK_POTION_SHOP_ITEM_1, {RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 1", "Kak Potion Shop Item 1"}}, - { RC_KAK_POTION_SHOP_ITEM_2, {RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 2", "Kak Potion Shop Item 2"}}, - { RC_KAK_POTION_SHOP_ITEM_3, {RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 3", "Kak Potion Shop Item 3"}}, - { RC_KAK_POTION_SHOP_ITEM_4, {RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 4", "Kak Potion Shop Item 4"}}, - { RC_KAK_POTION_SHOP_ITEM_5, {RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 5", "Kak Potion Shop Item 5"}}, - { RC_KAK_POTION_SHOP_ITEM_6, {RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 6", "Kak Potion Shop Item 6"}}, - { RC_KAK_POTION_SHOP_ITEM_7, {RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 7", "Kak Potion Shop Item 7"}}, - { RC_KAK_POTION_SHOP_ITEM_8, {RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 8", "Kak Potion Shop Item 8"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_1, {RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_2, {RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_3, {RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_4, {RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_5, {RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_6, {RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_7, {RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_8, {RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"}}, - { RC_MARKET_POTION_SHOP_ITEM_1, {RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 1", "MK Potion Shop Item 1"}}, - { RC_MARKET_POTION_SHOP_ITEM_2, {RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 2", "MK Potion Shop Item 2"}}, - { RC_MARKET_POTION_SHOP_ITEM_3, {RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 3", "MK Potion Shop Item 3"}}, - { RC_MARKET_POTION_SHOP_ITEM_4, {RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 4", "MK Potion Shop Item 4"}}, - { RC_MARKET_POTION_SHOP_ITEM_5, {RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 5", "MK Potion Shop Item 5"}}, - { RC_MARKET_POTION_SHOP_ITEM_6, {RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 6", "MK Potion Shop Item 6"}}, - { RC_MARKET_POTION_SHOP_ITEM_7, {RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 7", "MK Potion Shop Item 7"}}, - { RC_MARKET_POTION_SHOP_ITEM_8, {RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 8", "MK Potion Shop Item 8"}}, - { RC_MARKET_BAZAAR_ITEM_1, {RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "MK Bazaar Item 1"}}, - { RC_MARKET_BAZAAR_ITEM_2, {RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "MK Bazaar Item 2"}}, - { RC_MARKET_BAZAAR_ITEM_3, {RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "MK Bazaar Item 3"}}, - { RC_MARKET_BAZAAR_ITEM_4, {RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "MK Bazaar Item 4"}}, - { RC_MARKET_BAZAAR_ITEM_5, {RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "MK Bazaar Item 5"}}, - { RC_MARKET_BAZAAR_ITEM_6, {RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "MK Bazaar Item 6"}}, - { RC_MARKET_BAZAAR_ITEM_7, {RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "MK Bazaar Item 7"}}, - { RC_MARKET_BAZAAR_ITEM_8, {RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "MK Bazaar Item 8"}}, - { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 1", "Kak Bazaar Item 1"}}, - { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 2", "Kak Bazaar Item 2"}}, - { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 3", "Kak Bazaar Item 3"}}, - { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 4", "Kak Bazaar Item 4"}}, - { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 5", "Kak Bazaar Item 5"}}, - { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 6", "Kak Bazaar Item 6"}}, - { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 7", "Kak Bazaar Item 7"}}, - { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 8", "Kak Bazaar Item 8"}}, - { RC_ZD_SHOP_ITEM_1, {RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 1", "ZD Shop Item 1"}}, - { RC_ZD_SHOP_ITEM_2, {RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 2", "ZD Shop Item 2"}}, - { RC_ZD_SHOP_ITEM_3, {RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 3", "ZD Shop Item 3"}}, - { RC_ZD_SHOP_ITEM_4, {RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 4", "ZD Shop Item 4"}}, - { RC_ZD_SHOP_ITEM_5, {RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 5", "ZD Shop Item 5"}}, - { RC_ZD_SHOP_ITEM_6, {RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 6", "ZD Shop Item 6"}}, - { RC_ZD_SHOP_ITEM_7, {RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 7", "ZD Shop Item 7"}}, - { RC_ZD_SHOP_ITEM_8, {RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 8", "ZD Shop Item 8"}}, - { RC_GC_SHOP_ITEM_1, {RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 1", "GC Shop Item 1"}}, - { RC_GC_SHOP_ITEM_2, {RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 2", "GC Shop Item 2"}}, - { RC_GC_SHOP_ITEM_3, {RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 3", "GC Shop Item 3"}}, - { RC_GC_SHOP_ITEM_4, {RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 4", "GC Shop Item 4"}}, - { RC_GC_SHOP_ITEM_5, {RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 5", "GC Shop Item 5"}}, - { RC_GC_SHOP_ITEM_6, {RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 6", "GC Shop Item 6"}}, - { RC_GC_SHOP_ITEM_7, {RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 7", "GC Shop Item 7"}}, - { RC_GC_SHOP_ITEM_8, {RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 8", "GC Shop Item 8"}}, - { RC_COLOSSUS_GOSSIP_STONE, {RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, "Gossip Stone", "Colossus Gossip Stone"}}, - { RC_DMC_GOSSIP_STONE, {RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Gossip Stone", "DMC Gossip Stone"}}, - { RC_DMC_UPPER_GROTTO_GOSSIP_STONE, {RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"}}, - { RC_DMT_GOSSIP_STONE, {RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Gossip Stone", "DMT Gossip Stone"}}, - { RC_DMT_STORMS_GROTTO_GOSSIP_STONE, {RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"}}, - { RC_DODONGOS_CAVERN_GOSSIP_STONE, {RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, "Gossip Stone", "Dodongo's Cavern Gossip Stone"}}, - { RC_FAIRY_GOSSIP_STONE, {RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Fairy Gossip Stone", "Fairy Gossip Stone"}}, - { RC_GC_MAZE_GOSSIP_STONE, {RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Maze Gossip Stone", "GC Maze Gossip Stone"}}, - { RC_GC_MEDIGORON_GOSSIP_STONE, {RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"}}, - { RC_GV_GOSSIP_STONE, {RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, "Gossip Stone", "GV Gossip Stone"}}, - { RC_GY_GOSSIP_STONE, {RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, "Gossip Stone", "GY Gossip Stone"}}, - { RC_HC_MALON_GOSSIP_STONE, {RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Malon Gossip Stone", "HC Malon Gossip Stone"}}, - { RC_HC_ROCK_WALL_GOSSIP_STONE, {RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"}}, - { RC_HC_STORMS_GROTTO_GOSSIP_STONE, {RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"}}, - { RC_HF_COW_GROTTO_GOSSIP_STONE, {RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"}}, - { RC_HF_NEAR_MARKET_GOSSIP_STONE, {RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Near Market Gossip Stone", "HF Near Market Gossip Stone"}}, - { RC_HF_OPEN_GROTTO_GOSSIP_STONE, {RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"}}, - { RC_HF_SOUTHEAST_GOSSIP_STONE, {RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Southeast Gossip Stone", "HF Southeast Gossip Stone"}}, - { RC_JABU_GOSSIP_STONE, {RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Jabu Gossip Stone", "Jabu Gossip Stone"}}, - { RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, {RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"}}, - { RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, {RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"}}, - { RC_KF_GOSSIP_STONE, {RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Gossip Stone", "KF Gossip Stone"}}, - { RC_KF_STORMS_GOSSIP_STONE, {RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Storms Gossip Stone", "KF Storms Gossip Stone"}}, - { RC_KAK_OPEN_GROTTO_GOSSIP_STONE, {RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"}}, - { RC_LH_LAB_GOSSIP_STONE, {RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Lab Gossip Stone", "LH Lab Gossip Stone"}}, - { RC_LH_SOUTHEAST_GOSSIP_STONE, {RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southeast Gossip Stone", "LH Southeast Gossip Stone"}}, - { RC_LH_SOUTHWEST_GOSSIP_STONE, {RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southwest Gossip Stone", "LH Southwest Gossip Stone"}}, - { RC_LW_GOSSIP_STONE, {RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Gossip Stone", "LW Gossip Stone"}}, - { RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"}}, - { RC_SFM_MAZE_LOWER_GOSSIP_STONE, {RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"}}, - { RC_SFM_MAZE_UPPER_GOSSIP_STONE, {RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"}}, - { RC_SFM_SARIA_GOSSIP_STONE, {RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Saria Gossip Stone", "SFM Saria Gossip Stone"}}, - { RC_TOT_LEFT_CENTER_GOSSIP_STONE, {RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"}}, - { RC_TOT_LEFT_GOSSIP_STONE, {RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Gossip Stone", "ToT Left Gossip Stone"}}, - { RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"}}, - { RC_TOT_RIGHT_GOSSIP_STONE, {RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Gossip Stone", "ToT Right Gossip Stone"}}, - { RC_ZD_GOSSIP_STONE, {RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, "Gossip Stone", "ZD Gossip Stone"}}, - { RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, {RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"}}, - { RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, {RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"}}, - { RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"}}, + { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_INVALID, false, "Invalid Location", "Invalid Location"}}, + { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, + { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Top Left Chest", "KF Mido Top Left Chest"}}, + { RC_KF_MIDOS_TOP_RIGHT_CHEST, {RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Top Right Chest", "KF Mido Top Right Chest"}}, + { RC_KF_MIDOS_BOTTOM_LEFT_CHEST, {RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"}}, + { RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, {RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"}}, + { RC_KF_STORMS_GROTTO_CHEST, {RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Storms Grotto Chest", "KF Storms Grotto Chest"}}, + { RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"}}, + { RC_LW_SKULL_KID, {RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Skull Kid", "LW Skull Kid"}}, + { RC_LW_TRADE_COJIRO, {RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Trade Cojiro", "LW Trade Cojiro"}}, + { RC_LW_TRADE_ODD_POTION, {RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Trade Odd Potion", "LW Trade Odd Potion"}}, + { RC_LW_OCARINA_MEMORY_GAME, {RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Ocarina Memory Game", "LW Ocarina Memory Game"}}, + { RC_LW_TARGET_IN_WOODS, {RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Target in Woods", "LW Target in Woods"}}, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"}}, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"}}, + { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, {RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"}}, + { RC_LW_DEKU_SCRUB_GROTTO_REAR, {RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"}}, + { RC_LW_DEKU_SCRUB_GROTTO_FRONT, {RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"}}, + { RC_DEKU_THEATER_SKULL_MASK, {RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Theater Skull Mask", "Deku Theater Skull Mask"}}, + { RC_DEKU_THEATER_MASK_OF_TRUTH, {RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"}}, + { RC_SFM_WOLFOS_GROTTO_CHEST, {RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"}}, + { RC_SFM_DEKU_SCRUB_GROTTO_REAR, {RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"}}, + { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, {RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"}}, + { RC_HF_SOUTHEAST_GROTTO_CHEST, {RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Southeast Grotto Chest", "HF Southeast Grotto Chest"}}, + { RC_HF_OPEN_GROTTO_CHEST, {RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Open Grotto Chest", "HF Open Grotto Chest"}}, + { RC_HF_NEAR_MARKET_GROTTO_CHEST, {RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Near Market Grotto Chest", "HF Near Market Grotto Chest"}}, + { RC_HF_OCARINA_OF_TIME_ITEM, {RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Ocarina of Time Item", "HF Ocarina of Time Item"}}, + { RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, {RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"}}, + { RC_HF_DEKU_SCRUB_GROTTO, {RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Deku Scrub Grotto", "HF Deku Scrub Grotto"}}, + { RC_LH_CHILD_FISHING, {RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Child Fishing", "LH Child Fishing"}}, + { RC_LH_ADULT_FISHING, {RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Adult Fishing", "LH Adult Fishing"}}, + { RC_LH_LAB_DIVE, {RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Lab Dive", "LH Lab Dive"}}, + { RC_LH_TRADE_FROG, {RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"}}, + { RC_LH_UNDERWATER_ITEM, {RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Underwater Item", "LH Underwater Item"}}, + { RC_LH_SUN, {RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Sun", "LH Sun"}}, + { RC_LH_FREESTANDING_POH, {RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Freestanding PoH", "LH Freestanding PoH"}}, + { RC_LH_DEKU_SCRUB_GROTTO_LEFT, {RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"}}, + { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, {RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"}}, + { RC_LH_DEKU_SCRUB_GROTTO_CENTER, {RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"}}, + { RC_GV_CHEST, {RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Chest", "GV Chest"}}, + { RC_GV_TRADE_SAW, {RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Trade Saw", "GV Trade Saw"}}, + { RC_GV_WATERFALL_FREESTANDING_POH, {RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"}}, + { RC_GV_CRATE_FREESTANDING_POH, {RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Crate Freestanding PoH", "GV Crate Freestanding PoH"}}, + { RC_GV_DEKU_SCRUB_GROTTO_REAR, {RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"}}, + { RC_GV_DEKU_SCRUB_GROTTO_FRONT, {RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"}}, + { RC_GF_CHEST, {RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "Chest", "GF Chest"}}, + { RC_GF_HBA_1000_POINTS, {RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF HBA 1000 Points", "GF HBA 1000 Points"}}, + { RC_GF_HBA_1500_POINTS, {RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF HBA 1500 Points", "GF HBA 1500 Points"}}, + { RC_GF_GERUDO_MEMBERSHIP_CARD, {RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF Gerudo Membership Card", "GF Gerudo Membership Card"}}, + { RC_GF_NORTH_F1_CARPENTER, {RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF North F1 Carpenter", "GF North F1 Carpenter"}}, + { RC_GF_NORTH_F2_CARPENTER, {RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF North F2 Carpenter", "GF North F2 Carpenter"}}, + { RC_GF_SOUTH_F1_CARPENTER, {RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF South F1 Carpenter", "GF South F1 Carpenter"}}, + { RC_GF_SOUTH_F2_CARPENTER, {RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF South F2 Carpenter", "GF South F2 Carpenter"}}, + { RC_WASTELAND_CHEST, {RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, false, "Chest", "Wasteland Chest"}}, + { RC_WASTELAND_BOMBCHU_SALESMAN, {RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, false, "Carpet Salesman", "Wasteland Carpet Salesman"}}, + { RC_COLOSSUS_FREESTANDING_POH, {RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Freestanding PoH", "Colossus Freestanding PoH"}}, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"}}, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"}}, + { RC_MARKET_TREASURE_CHEST_GAME_REWARD, {RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"}}, + { RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"}}, + { RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"}}, + { RC_MARKET_LOST_DOG, {RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Lost Dog", "MK Lost Dog"}}, + { RC_MARKET_SHOOTING_GALLERY_REWARD, {RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Shooting Gallery", "MK Shooting Gallery"}}, + { RC_MARKET_10_BIG_POES, {RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "10 Big Poes", "MK 10 Big Poes"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game First Room Chest", "MK Chest Game First Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"}}, + { RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"}}, + { RC_HC_MALON_EGG, {RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Malon Egg", "HC Malon Egg"}}, + { RC_HC_ZELDAS_LETTER, {RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Zeldas Letter", "HC Zeldas Letter"}}, + { RC_KAK_REDEAD_GROTTO_CHEST, {RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Redead Grotto Chest", "Kak Redead Grotto Chest"}}, + { RC_KAK_OPEN_GROTTO_CHEST, {RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Open Grotto Chest", "Kak Open Grotto Chest"}}, + { RC_KAK_10_GOLD_SKULLTULA_REWARD, {RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"}}, + { RC_KAK_20_GOLD_SKULLTULA_REWARD, {RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"}}, + { RC_KAK_30_GOLD_SKULLTULA_REWARD, {RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"}}, + { RC_KAK_40_GOLD_SKULLTULA_REWARD, {RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"}}, + { RC_KAK_50_GOLD_SKULLTULA_REWARD, {RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"}}, + { RC_KAK_MAN_ON_ROOF, {RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Man on Roof", "Kak Man on Roof"}}, + { RC_KAK_SHOOTING_GALLERY_REWARD, {RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"}}, + { RC_KAK_TRADE_ODD_MUSHROOM, {RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"}}, + { RC_KAK_ANJU_AS_ADULT, {RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Anju as Adult", "Kak Anju as Adult"}}, + { RC_KAK_ANJU_AS_CHILD, {RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Anju as Child", "Kak Anju as Child"}}, + { RC_KAK_TRADE_POCKET_CUCCO, {RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"}}, + { RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, {RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"}}, + { RC_KAK_WINDMILL_FREESTANDING_POH, {RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"}}, + { RC_GRAVEYARD_SHIELD_GRAVE_CHEST, {RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Shield Grave Chest", "GY Shield Grave Chest"}}, + { RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"}}, + { RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, {RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Composers Grave Chest", "GY Composers Grave Chest"}}, + { RC_GRAVEYARD_HOOKSHOT_CHEST, {RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Hookshot Chest", "GY Hookshot Chest"}}, + { RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"}}, + { RC_GRAVEYARD_FREESTANDING_POH, {RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Freestanding PoH", "GY Freestanding PoH"}}, + { RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"}}, + { RC_DMT_CHEST, {RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Chest", "DMT Chest"}}, + { RC_DMT_STORMS_GROTTO_CHEST, {RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Storms Grotto Chest", "DMT Storms Grotto Chest"}}, + { RC_DMT_TRADE_BROKEN_SWORD, {RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Trade Broken Sword", "DMT Trade Broken Sword"}}, + { RC_DMT_TRADE_EYEDROPS, {RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Trade Eyedrops", "DMT Trade Eyedrops"}}, + { RC_DMT_TRADE_CLAIM_CHECK, {RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Trade Claim Check", "DMT Trade Claim Check"}}, + { RC_DMT_FREESTANDING_POH, {RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Freestanding PoH", "DMT Freestanding PoH"}}, + { RC_GC_MAZE_LEFT_CHEST, {RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Maze Left Chest", "GC Maze Left Chest"}}, + { RC_GC_MAZE_RIGHT_CHEST, {RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Maze Right Chest", "GC Maze Right Chest"}}, + { RC_GC_MAZE_CENTER_CHEST, {RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Maze Center Chest", "GC Maze Center Chest"}}, + { RC_GC_ROLLING_GORON_AS_CHILD, {RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Rolling Goron as Child", "GC Rolling Goron as Child"}}, + { RC_GC_ROLLING_GORON_AS_ADULT, {RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Rolling Goron as Adult", "GC Rolling Goron as Adult"}}, + { RC_GC_DARUNIAS_JOY, {RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Darunias Joy", "GC Darunias Joy"}}, + { RC_GC_POT_FREESTANDING_POH, {RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Pot Freestanding PoH", "GC Pot Freestanding PoH"}}, + { RC_GC_DEKU_SCRUB_GROTTO_LEFT, {RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"}}, + { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, {RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"}}, + { RC_GC_DEKU_SCRUB_GROTTO_CENTER, {RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"}}, + { RC_GC_MEDIGORON, {RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Medigoron", "GC Medigoron"}}, + { RC_DMC_UPPER_GROTTO_CHEST, {RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Upper Grotto Chest", "DMC Upper Grotto Chest"}}, + { RC_DMC_WALL_FREESTANDING_POH, {RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"}}, + { RC_DMC_VOLCANO_FREESTANDING_POH, {RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"}}, + { RC_DMC_DEKU_SCRUB, {RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub", "DMC Deku Scrub"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, {RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, {RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"}}, + { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, {RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"}}, + { RC_ZR_OPEN_GROTTO_CHEST, {RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Open Grotto Chest", "ZR Open Grotto Chest"}}, + { RC_ZR_MAGIC_BEAN_SALESMAN, {RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Magic Bean Salesman", "ZR Magic Bean Salesman"}}, + { RC_ZR_FROGS_ZELDAS_LULLABY, {RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"}}, + { RC_ZR_FROGS_EPONAS_SONG, {RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Epona's Song", "ZR Frogs Epona's Song"}}, + { RC_ZR_FROGS_SARIAS_SONG, {RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Saria's Song", "ZR Frogs Saria's Song"}}, + { RC_ZR_FROGS_SUNS_SONG, {RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Sun's Song", "ZR Frogs Sun's Song"}}, + { RC_ZR_FROGS_SONG_OF_TIME, {RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Song of Time", "ZR Frogs Song of Time"}}, + { RC_ZR_FROGS_IN_THE_RAIN, {RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs in the Rain", "ZR Frogs in the Rain"}}, + { RC_ZR_FROGS_OCARINA_GAME, {RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"}}, + { RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"}}, + { RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, {RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"}}, + { RC_ZR_DEKU_SCRUB_GROTTO_REAR, {RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"}}, + { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, {RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"}}, + { RC_ZD_CHEST, {RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "Chest", "ZD Chest"}}, + { RC_ZD_DIVING_MINIGAME, {RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "Diving Minigame", "ZD Diving Minigame"}}, + { RC_ZD_KING_ZORA_THAWED, {RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "King Zora Thawed", "ZD King Zora Thawed"}}, + { RC_ZD_TRADE_PRESCRIPTION, {RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "Trade Prescription", "ZD Trade Prescription"}}, + { RC_ZF_ICEBERC_FREESTANDING_POH, {RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, false, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"}}, + { RC_ZF_BOTTOM_FREESTANDING_POH, {RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, false, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"}}, + { RC_LLR_TALONS_CHICKENS, {RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Talons Chickens", "LLR Talons Chickens"}}, + { RC_LLR_FREESTANDING_POH, {RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Freestanding PoH", "LLR Freestanding PoH"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, {RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, {RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"}}, + { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, {RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"}}, + { RC_DEKU_TREE_MAP_CHEST, {RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "Map Chest", "Deku Tree Map Chest"}}, + { RC_DEKU_TREE_COMPASS_CHEST, {RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "Compass Chest", "Deku Tree Compass Chest"}}, + { RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"}}, + { RC_DEKU_TREE_BASEMENT_CHEST, {RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Basement Chest", "Deku Tree Basement Chest"}}, + { RC_DEKU_TREE_SLINGSHOT_CHEST, {RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Slingshot Chest", "Deku Tree Slingshot Chest"}}, + { RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"}}, + { RC_DEKU_TREE_MQ_MAP_CHEST, {RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "MQ Map Chest", "Deku Tree MQ Map Chest"}}, + { RC_DEKU_TREE_MQ_COMPASS_CHEST, {RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "MQ Compass Chest", "Deku Tree MQ Compass Chest"}}, + { RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"}}, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"}}, + { RC_DEKU_TREE_MQ_BASEMENT_CHEST, {RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Basement Chest", "Deku Tree MQ Basement Chest"}}, + { RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"}}, + { RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"}}, + { RC_DEKU_TREE_MQ_DEKU_SCRUB, {RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"}}, + { RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, {RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"}}, + { RC_DODONGOS_CAVERN_MAP_CHEST, {RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "Map Chest", "Dodongos Cavern Map Chest"}}, + { RC_DODONGOS_CAVERN_COMPASS_CHEST, {RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "Compass Chest", "Dodongos Cavern Compass Chest"}}, + { RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"}}, + { RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"}}, + { RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"}}, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"}}, + { RC_DODONGOS_CAVERN_MQ_MAP_CHEST, {RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"}}, + { RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"}}, + { RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, {RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"}}, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"}}, + { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"}}, + { RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"}}, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"}}, + { RC_JABU_JABUS_BELLY_MAP_CHEST, {RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "Map Chest", "Jabu Jabus Belly Map Chest"}}, + { RC_JABU_JABUS_BELLY_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "Compass Chest", "Jabu Jabus Belly Compass Chest"}}, + { RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"}}, + { RC_JABU_JABUS_BELLY_DEKU_SCRUB, {RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"}}, + { RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, {RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"}}, + { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"}}, + { RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "First Room Chest", "Forest Temple First Room Chest"}}, + { RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, {RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "First Stalfos Chest", "Forest Temple First Stalfos Chest"}}, + { RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"}}, + { RC_FOREST_TEMPLE_MAP_CHEST, {RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, false, "Map Chest", "Forest Temple Map Chest"}}, + { RC_FOREST_TEMPLE_WELL_CHEST, {RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Well Chest", "Forest Temple Well Chest"}}, + { RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"}}, + { RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, {RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Eye Switch Chest", "Forest Temple Eye Switch Chest"}}, + { RC_FOREST_TEMPLE_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Boss Key Chest", "Forest Temple Boss Key Chest"}}, + { RC_FOREST_TEMPLE_FLOORMASTER_CHEST, {RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Floormaster Chest", "Forest Temple Floormaster Chest"}}, + { RC_FOREST_TEMPLE_BOW_CHEST, {RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Bow Chest", "Forest Temple Bow Chest"}}, + { RC_FOREST_TEMPLE_RED_POE_CHEST, {RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Red Poe Chest", "Forest Temple Red Poe Chest"}}, + { RC_FOREST_TEMPLE_BLUE_POE_CHEST, {RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Blue Poe Chest", "Forest Temple Blue Poe Chest"}}, + { RC_FOREST_TEMPLE_BASEMENT_CHEST, {RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Basement Chest", "Forest Temple Basement Chest"}}, + { RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ First Room Chest", "Forest Temple MQ First Room Chest"}}, + { RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, {RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"}}, + { RC_FOREST_TEMPLE_MQ_BOW_CHEST, {RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Bow Chest", "Forest Temple MQ Bow Chest"}}, + { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"}}, + { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"}}, + { RC_FOREST_TEMPLE_MQ_WELL_CHEST, {RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Well Chest", "Forest Temple MQ Well Chest"}}, + { RC_FOREST_TEMPLE_MQ_MAP_CHEST, {RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, false, "MQ Map Chest", "Forest Temple MQ Map Chest"}}, + { RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, {RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, false, "MQ Compass Chest", "Forest Temple MQ Compass Chest"}}, + { RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"}}, + { RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, {RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Basement Chest", "Forest Temple MQ Basement Chest"}}, + { RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, {RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Redead Chest", "Forest Temple MQ Redead Chest"}}, + { RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"}}, + { RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Near Boss Chest", "Fire Temple Near Boss Chest"}}, + { RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, {RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"}}, + { RC_FIRE_TEMPLE_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boss Key Chest", "Fire Temple Boss Key Chest"}}, + { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"}}, + { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"}}, + { RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"}}, + { RC_FIRE_TEMPLE_SCARECROW_CHEST, {RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Scarecrow Chest", "Fire Temple Scarecrow Chest"}}, + { RC_FIRE_TEMPLE_MAP_CHEST, {RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "Map Chest", "Fire Temple Map Chest"}}, + { RC_FIRE_TEMPLE_COMPASS_CHEST, {RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "Compass Chest", "Fire Temple Compass Chest"}}, + { RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, {RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Highest Goron Chest", "Fire Temple Highest Goron Chest"}}, + { RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"}}, + { RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"}}, + { RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"}}, + { RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, {RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "MQ Compass Chest", "Fire Temple MQ Compass Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"}}, + { RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"}}, + { RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"}}, + { RC_FIRE_TEMPLE_MQ_MAP_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "MQ Map Chest", "Fire Temple MQ Map Chest"}}, + { RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"}}, + { RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"}}, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"}}, + { RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, {RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"}}, + { RC_WATER_TEMPLE_MAP_CHEST, {RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "Map Chest", "Water Temple Map Chest"}}, + { RC_WATER_TEMPLE_COMPASS_CHEST, {RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "Compass Chest", "Water Temple Compass Chest"}}, + { RC_WATER_TEMPLE_TORCHES_CHEST, {RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Torches Chest", "Water Temple Torches Chest"}}, + { RC_WATER_TEMPLE_DRAGON_CHEST, {RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Dragon Chest", "Water Temple Dragon Chest"}}, + { RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"}}, + { RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Central Pillar Chest", "Water Temple Central Pillar Chest"}}, + { RC_WATER_TEMPLE_CRACKED_WALL_CHEST, {RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"}}, + { RC_WATER_TEMPLE_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Boss Key Chest", "Water Temple Boss Key Chest"}}, + { RC_WATER_TEMPLE_LONGSHOT_CHEST, {RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Longshot Chest", "Water Temple Longshot Chest"}}, + { RC_WATER_TEMPLE_RIVER_CHEST, {RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "River Chest", "Water Temple River Chest"}}, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"}}, + { RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"}}, + { RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, {RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"}}, + { RC_WATER_TEMPLE_MQ_COMPASS_CHEST, {RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "MQ Compass Chest", "Water Temple MQ Compass Chest"}}, + { RC_WATER_TEMPLE_MQ_MAP_CHEST, {RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "MQ Map Chest", "Water Temple MQ Map Chest"}}, + { RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, {RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"}}, + { RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"}}, + { RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"}}, + { RC_SPIRIT_TEMPLE_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "Compass Chest", "Spirit Temple Compass Chest"}}, + { RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"}}, + { RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"}}, + { RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"}}, + { RC_SPIRIT_TEMPLE_MAP_CHEST, {RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "Map Chest", "Spirit Temple Map Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"}}, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"}}, + { RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"}}, + { RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"}}, + { RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"}}, + { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"}}, + { RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Boss Key Chest", "Spirit Temple Boss Key Chest"}}, + { RC_SPIRIT_TEMPLE_TOPMOST_CHEST, {RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Topmost Chest", "Spirit Temple Topmost Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "MQ Map Chest", "Spirit Temple MQ Map Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"}}, + { RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MAP_CHEST, {RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "Map Chest", "Shadow Temple Map Chest"}}, + { RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"}}, + { RC_SHADOW_TEMPLE_COMPASS_CHEST, {RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "Compass Chest", "Shadow Temple Compass Chest"}}, + { RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"}}, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"}}, + { RC_SHADOW_TEMPLE_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"}}, + { RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"}}, + { RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"}}, + { RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"}}, + { RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Boss Key Chest", "Shadow Temple Boss Key Chest"}}, + { RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"}}, + { RC_SHADOW_TEMPLE_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Freestanding Key", "Shadow Temple Freestanding Key"}}, + { RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, {RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"}}, + { RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"}}, + { RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"}}, + { RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "MQ Map Chest", "Shadow Temple MQ Map Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"}}, + { RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"}}, + { RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"}}, + { RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"}}, + { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"}}, + { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"}}, + { RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"}}, + { RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"}}, + { RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"}}, + { RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "Compass Chest", "Bottom of the Well Compass Chest"}}, + { RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"}}, + { RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"}}, + { RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"}}, + { RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Invisible Chest", "Bottom of the Well Invisible Chest"}}, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"}}, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "Map Chest", "Bottom of the Well Map Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"}}, + { RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Like Like Chest", "Bottom of the Well Like Like Chest"}}, + { RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Freestanding Key", "Bottom of the Well Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Map Chest", "Bottom of the Well MQ Map Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"}}, + { RC_ICE_CAVERN_MAP_CHEST, {RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "Map Chest", "Ice Cavern Map Chest"}}, + { RC_ICE_CAVERN_COMPASS_CHEST, {RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "Compass Chest", "Ice Cavern Compass Chest"}}, + { RC_ICE_CAVERN_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"}}, + { RC_ICE_CAVERN_FREESTANDING_POH, {RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "Freestanding PoH", "Ice Cavern Freestanding PoH"}}, + { RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"}}, + { RC_ICE_CAVERN_MQ_COMPASS_CHEST, {RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"}}, + { RC_ICE_CAVERN_MQ_MAP_CHEST, {RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "MQ Map Chest", "Ice Cavern MQ Map Chest"}}, + { RC_ICE_CAVERN_MQ_FREESTANDING_POH, {RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"}}, + { RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"}}, + { RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"}}, + { RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, {RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"}}, + { RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"}}, + { RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"}}, + { RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, {RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"}}, + { RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"}}, + { RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, {RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"}}, + { RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"}}, + { RC_GANONS_TOWER_BOSS_KEY_CHEST, {RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Boss Key Chest", "Ganon's Tower Boss Key Chest"}}, + { RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"}}, + { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"}}, + { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"}}, + { RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"}}, + { RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"}}, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"}}, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"}}, + { RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"}}, + { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"}}, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"}}, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"}}, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"}}, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"}}, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"}}, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"}}, + { RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Basement Back Room", "Deku Tree GS Basement Back Room"}}, + { RC_DEKU_TREE_GS_BASEMENT_GATE, {RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Basement Gate", "Deku Tree GS Basement Gate"}}, + { RC_DEKU_TREE_GS_BASEMENT_VINES, {RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Basement Vines", "Deku Tree GS Basement Vines"}}, + { RC_DEKU_TREE_GS_COMPASS_ROOM, {RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Compass Room", "Deku Tree GS Compass Room"}}, + { RC_DEKU_TREE_MQ_GS_LOBBY, {RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Lobby", "Deku Tree MQ GS Lobby"}}, + { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"}}, + { RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"}}, + { RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"}}, + { RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"}}, + { RC_DODONGOS_CAVERN_GS_SCARECROW, {RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"}}, + { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"}}, + { RC_DODONGOS_CAVERN_GS_BACK_ROOM, {RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Back Room", "Dodongos Cavern GS Back Room"}}, + { RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"}}, + { RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"}}, + { RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, {RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"}}, + { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"}}, + { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"}}, + { RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"}}, + { RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"}}, + { RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"}}, + { RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"}}, + { RC_FOREST_TEMPLE_GS_FIRST_ROOM, {RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS First Room", "Forest Temple GS First Room"}}, + { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"}}, + { RC_FOREST_TEMPLE_GS_LOBBY, {RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Lobby", "Forest Temple GS Lobby"}}, + { RC_FOREST_TEMPLE_GS_BASEMENT, {RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Basement", "Forest Temple GS Basement"}}, + { RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"}}, + { RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"}}, + { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"}}, + { RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"}}, + { RC_FOREST_TEMPLE_MQ_GS_WELL, {RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Well", "Forest Temple MQ GS Well"}}, + { RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Song of Time Room", "Fire Temple GS Song of Time Room"}}, + { RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"}}, + { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, {RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Boulder Maze", "Fire Temple GS Boulder Maze"}}, + { RC_FIRE_TEMPLE_GS_SCARECROW_TOP, {RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"}}, + { RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, {RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"}}, + { RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"}}, + { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"}}, + { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"}}, + { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"}}, + { RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"}}, + { RC_WATER_TEMPLE_GS_BEHIND_GATE, {RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Behind Gate", "Water Temple GS Behind Gate"}}, + { RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"}}, + { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, {RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Central Pillar", "Water Temple GS Central Pillar"}}, + { RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"}}, + { RC_WATER_TEMPLE_GS_RIVER, {RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS River", "Water Temple GS River"}}, + { RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"}}, + { RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"}}, + { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"}}, + { RC_WATER_TEMPLE_MQ_GS_RIVER, {RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS River", "Water Temple MQ GS River"}}, + { RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"}}, + { RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"}}, + { RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Boulder Room", "Spirit Temple GS Boulder Room"}}, + { RC_SPIRIT_TEMPLE_GS_LOBBY, {RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Lobby", "Spirit Temple GS Lobby"}}, + { RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"}}, + { RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Metal Fence", "Spirit Temple GS Metal Fence"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"}}, + { RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"}}, + { RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"}}, + { RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"}}, + { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"}}, + { RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Like Like Room", "Shadow Temple GS Like Like Room"}}, + { RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Near Ship", "Shadow Temple GS Near Ship"}}, + { RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"}}, + { RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"}}, + { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"}}, + { RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"}}, + { RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"}}, + { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"}}, + { RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "GS East Inner Room", "Bottom of the Well GS East Inner Room"}}, + { RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "GS West Inner Room", "Bottom of the Well GS West Inner Room"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ GS Basement", "Bottom of the Well MQ GS Basement"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"}}, + { RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"}}, + { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "GS Push Block Room", "Ice Cavern GS Push Block Room"}}, + { RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"}}, + { RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"}}, + { RC_ICE_CAVERN_MQ_GS_SCARECROW, {RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"}}, + { RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, {RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"}}, + { RC_ICE_CAVERN_MQ_GS_RED_ICE, {RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"}}, + { RC_KF_GS_BEAN_PATCH, {RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "GS Bean Patch", "KF GS Bean Patch"}}, + { RC_KF_GS_KNOW_IT_ALL_HOUSE, {RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "GS Know It All House", "KF GS Know It All House"}}, + { RC_KF_GS_HOUSE_OF_TWINS, {RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "GS House of Twins", "KF GS House of Twins"}}, + { RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, {RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, false, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"}}, + { RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, false, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"}}, + { RC_LW_GS_ABOVE_THEATER, {RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, false, "GS Above Theater", "LW GS Above Theater"}}, + { RC_SFM_GS, {RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, false, "GS", "SFM GS"}}, + { RC_HF_GS_COW_GROTTO, {RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, false, "GS Cow Grotto", "HF GS Cow Grotto"}}, + { RC_HF_GS_NEAR_KAK_GROTTO, {RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, false, "GS Near Kak Grotto", "HF GS Near Kak Grotto"}}, + { RC_LH_GS_BEAN_PATCH, {RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Bean Patch", "LH GS Bean Patch"}}, + { RC_LH_GS_SMALL_ISLAND, {RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Small Island", "LH GS Small Island"}}, + { RC_LH_GS_LAB_WALL, {RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Lab Wall", "LH GS Lab Wall"}}, + { RC_LH_GS_LAB_CRATE, {RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Lab Crate", "LH GS Lab Crate"}}, + { RC_LH_GS_TREE, {RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Tree", "LH GS Tree"}}, + { RC_GV_GS_BEAN_PATCH, {RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Bean Patch", "GV GS Bean Patch"}}, + { RC_GV_GS_SMALL_BRIDGE, {RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Small Bridge", "GV GS Small Bridge"}}, + { RC_GV_GS_PILLAR, {RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Pillar", "GV GS Pillar"}}, + { RC_GV_GS_BEHIND_TENT, {RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Behind Tent", "GV GS Behind Tent"}}, + { RC_GF_GS_ARCHERY_RANGE, {RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, false, "GS Archery Range", "GF GS Archery Range"}}, + { RC_GF_GS_TOP_FLOOR, {RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, false, "GS Top Floor", "GF GS Top Floor"}}, + { RC_WASTELAND_GS, {RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, false, "GS", "Wasteland GS"}}, + { RC_COLOSSUS_GS_BEAN_PATCH, {RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, false, "GS Bean Patch", "Colossus GS Bean Patch"}}, + { RC_COLOSSUS_GS_HILL, {RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, false, "GS Hill", "Colossus GS Hill"}}, + { RC_COLOSSUS_GS_TREE, {RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, false, "GS Tree", "Colossus GS Tree"}}, + { RC_OGC_GS, {RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, false, "OGC GS", "OGC GS"}}, + { RC_HC_GS_STORMS_GROTTO, {RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, false, "GS Storms Grotto", "HC GS Storms Grotto"}}, + { RC_HC_GS_TREE, {RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, false, "GS Tree", "HC GS Tree"}}, + { RC_MARKET_GS_GUARD_HOUSE, {RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "Market GS Guard House", "Market GS Guard House"}}, + { RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, {RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS House Under Construction", "Kak GS House Under Construction"}}, + { RC_KAK_GS_SKULLTULA_HOUSE, {RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Skulltula House", "Kak GS Skulltula House"}}, + { RC_KAK_GS_GUARDS_HOUSE, {RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Guards House", "Kak GS Guards House"}}, + { RC_KAK_GS_TREE, {RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Tree", "Kak GS Tree"}}, + { RC_KAK_GS_WATCHTOWER, {RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Watchtower", "Kak GS Watchtower"}}, + { RC_KAK_GS_ABOVE_IMPAS_HOUSE, {RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Above Impas House", "Kak GS Above Impas House"}}, + { RC_GRAVEYARD_GS_WALL, {RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, false, "GS Wall", "Graveyard GS Wall"}}, + { RC_GRAVEYARD_GS_BEAN_PATCH, {RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, false, "GS Bean Patch", "Graveyard GS Bean Patch"}}, + { RC_DMC_GS_BEAN_PATCH, {RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, false, "GS Bean Patch", "DMC GS Bean Patch"}}, + { RC_DMC_GS_CRATE, {RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, false, "GS Crate", "DMC GS Crate"}}, + { RC_DMT_GS_BEAN_PATCH, {RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Bean Patch", "DMT GS Bean Patch"}}, + { RC_DMT_GS_NEAR_KAK, {RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Near Kak", "DMT GS Near Kak"}}, + { RC_DMT_GS_ABOVE_DODONGOS_CAVERN, {RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"}}, + { RC_DMT_GS_FALLING_ROCKS_PATH, {RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"}}, + { RC_GC_GS_CENTER_PLATFORM, {RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, false, "GS Center Platform", "GC GS Center Platform"}}, + { RC_GC_GS_BOULDER_MAZE, {RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, false, "GS Boulder Maze", "GC GS Boulder Maze"}}, + { RC_ZR_GS_LADDER, {RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Ladder", "ZR GS Ladder"}}, + { RC_ZR_GS_TREE, {RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Tree", "ZR GS Tree"}}, + { RC_ZR_GS_ABOVE_BRIDGE, {RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Above Bridge", "ZR GS Above Bridge"}}, + { RC_ZR_GS_NEAR_RAISED_GROTTOS, {RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"}}, + { RC_ZD_GS_FROZEN_WATERFALL, {RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, false, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"}}, + { RC_ZF_GS_ABOVE_THE_LOG, {RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, false, "GS Above The Log", "ZF GS Above The Log"}}, + { RC_ZF_GS_HIDDEN_CAVE, {RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, false, "GS Hidden Cave", "ZF GS Hidden Cave"}}, + { RC_ZF_GS_TREE, {RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, false, "GS Tree", "ZF GS Tree"}}, + { RC_LLR_GS_BACK_WALL, {RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS Back Wall", "LLR GS Back Wall"}}, + { RC_LLR_GS_RAIN_SHED, {RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS Rain Shed", "LLR GS Rain Shed"}}, + { RC_LLR_GS_HOUSE_WINDOW, {RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS House Window", "LLR GS House Window"}}, + { RC_LLR_GS_TREE, {RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS Tree", "LLR GS Tree"}}, + { RC_LINKS_POCKET, {RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_LINKS_POCKET, RCAREA_KOKIRI_FOREST, false, "Link's Pocket", "Link's Pocket"}}, + { RC_QUEEN_GOHMA, {RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Queen Gohma", "Queen Gohma"}}, + { RC_KING_DODONGO, {RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "King Dodongo", "King Dodongo"}}, + { RC_BARINADE, {RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Barinade", "Barinade"}}, + { RC_PHANTOM_GANON, {RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Phantom Ganon", "Phantom Ganon"}}, + { RC_VOLVAGIA, {RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Volvagia", "Volvagia"}}, + { RC_MORPHA, {RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Morpha", "Morpha"}}, + { RC_TWINROVA, {RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Twinrova", "Twinrova"}}, + { RC_BONGO_BONGO, {RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Bongo Bongo", "Bongo Bongo"}}, + { RC_DEKU_TREE_QUEEN_GOHMA_HEART, {RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"}}, + { RC_DODONGOS_CAVERN_KING_DODONGO_HEART, {RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"}}, + { RC_JABU_JABUS_BELLY_BARINADE_HEART, {RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"}}, + { RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, {RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"}}, + { RC_FIRE_TEMPLE_VOLVAGIA_HEART, {RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"}}, + { RC_WATER_TEMPLE_MORPHA_HEART, {RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Morpha Heart Container", "Water Temple Morpha Heart Container"}}, + { RC_SPIRIT_TEMPLE_TWINROVA_HEART, {RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"}}, + { RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, {RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"}}, + { RC_TOT_LIGHT_ARROWS_CUTSCENE, {RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"}}, + { RC_LW_GIFT_FROM_SARIA, {RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Gift From Saria", "LW Gift From Saria"}}, + { RC_ZF_GREAT_FAIRY_REWARD, {RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, false, "Great Fairy Reward", "ZF Great Fairy Reward"}}, + { RC_HC_GREAT_FAIRY_REWARD, {RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Great Fairy Reward", "HC Great Fairy Reward"}}, + { RC_COLOSSUS_GREAT_FAIRY_REWARD, {RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Great Fairy Reward", "Colossus Great Fairy Reward"}}, + { RC_DMT_GREAT_FAIRY_REWARD, {RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Great Fairy Reward", "DMT Great Fairy Reward"}}, + { RC_DMC_GREAT_FAIRY_REWARD, {RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Great Fairy Reward", "DMC Great Fairy Reward"}}, + { RC_OGC_GREAT_FAIRY_REWARD, {RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "OGC Great Fairy Reward", "OGC Great Fairy Reward"}}, + { RC_SHEIK_IN_FOREST, {RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Sheik in Forest", "Sheik in Forest"}}, + { RC_SHEIK_IN_CRATER, {RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Sheik in Crater", "Sheik in Crater"}}, + { RC_SHEIK_IN_ICE_CAVERN, {RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "Sheik in Ice Cavern", "Sheik in Ice Cavern"}}, + { RC_SHEIK_AT_COLOSSUS, {RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Sheik at Colossus", "Sheik at Colossus"}}, + { RC_SHEIK_IN_KAKARIKO, {RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Sheik in Kakariko", "Sheik in Kakariko"}}, + { RC_SHEIK_AT_TEMPLE, {RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Sheik at Temple", "Sheik at Temple"}}, + { RC_SONG_FROM_IMPA, {RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Song from Impa", "Song from Impa"}}, + { RC_SONG_FROM_MALON, {RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Song from Malon", "Song from Malon"}}, + { RC_SONG_FROM_SARIA, {RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Song from Saria", "Song from Saria"}}, + { RC_SONG_FROM_ROYAL_FAMILYS_TOMB, {RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Song from Composers Grave", "Song from Composers Grave"}}, + { RC_SONG_FROM_OCARINA_OF_TIME, {RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Song from Ocarina of Time", "Song from Ocarina of Time"}}, + { RC_SONG_FROM_WINDMILL, {RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Song from Windmill", "Song from Windmill"}}, + { RC_KF_LINKS_HOUSE_COW, {RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, false, "Links House Cow", "KF Links House Cow"}}, + { RC_HF_COW_GROTTO_COW, {RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, false, "Cow Grotto Cow", "HF Cow Grotto Cow"}}, + { RC_LLR_STABLES_LEFT_COW, {RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Stables Left Cow", "LLR Stables Left Cow"}}, + { RC_LLR_STABLES_RIGHT_COW, {RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Stables Right Cow", "LLR Stables Right Cow"}}, + { RC_LLR_TOWER_LEFT_COW, {RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Tower Left Cow", "LLR Tower Left Cow"}}, + { RC_LLR_TOWER_RIGHT_COW, {RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Tower Right Cow", "LLR Tower Right Cow"}}, + { RC_KAK_IMPAS_HOUSE_COW, {RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, false, "Impas House Cow", "Kak Impas House Cow"}}, + { RC_DMT_COW_GROTTO_COW, {RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Cow Grotto Cow", "DMT Cow Grotto Cow"}}, + { RC_GV_COW, {RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, false, "Cow", "GV Cow"}}, + { RC_JABU_JABUS_BELLY_MQ_COW, {RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, false, "MQ Cow", "Jabu Jabus Belly MQ Cow"}}, + { RC_KF_SHOP_ITEM_1, {RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 1", "KF Shop Item 1"}}, + { RC_KF_SHOP_ITEM_2, {RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 2", "KF Shop Item 2"}}, + { RC_KF_SHOP_ITEM_3, {RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 3", "KF Shop Item 3"}}, + { RC_KF_SHOP_ITEM_4, {RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 4", "KF Shop Item 4"}}, + { RC_KF_SHOP_ITEM_5, {RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 5", "KF Shop Item 5"}}, + { RC_KF_SHOP_ITEM_6, {RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 6", "KF Shop Item 6"}}, + { RC_KF_SHOP_ITEM_7, {RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 7", "KF Shop Item 7"}}, + { RC_KF_SHOP_ITEM_8, {RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 8", "KF Shop Item 8"}}, + { RC_KAK_POTION_SHOP_ITEM_1, {RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 1", "Kak Potion Shop Item 1"}}, + { RC_KAK_POTION_SHOP_ITEM_2, {RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 2", "Kak Potion Shop Item 2"}}, + { RC_KAK_POTION_SHOP_ITEM_3, {RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 3", "Kak Potion Shop Item 3"}}, + { RC_KAK_POTION_SHOP_ITEM_4, {RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 4", "Kak Potion Shop Item 4"}}, + { RC_KAK_POTION_SHOP_ITEM_5, {RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 5", "Kak Potion Shop Item 5"}}, + { RC_KAK_POTION_SHOP_ITEM_6, {RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 6", "Kak Potion Shop Item 6"}}, + { RC_KAK_POTION_SHOP_ITEM_7, {RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 7", "Kak Potion Shop Item 7"}}, + { RC_KAK_POTION_SHOP_ITEM_8, {RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 8", "Kak Potion Shop Item 8"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_1, {RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_2, {RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_3, {RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_4, {RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_5, {RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_6, {RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_7, {RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"}}, + { RC_MARKET_BOMBCHU_SHOP_ITEM_8, {RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"}}, + { RC_MARKET_POTION_SHOP_ITEM_1, {RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 1", "MK Potion Shop Item 1"}}, + { RC_MARKET_POTION_SHOP_ITEM_2, {RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 2", "MK Potion Shop Item 2"}}, + { RC_MARKET_POTION_SHOP_ITEM_3, {RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 3", "MK Potion Shop Item 3"}}, + { RC_MARKET_POTION_SHOP_ITEM_4, {RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 4", "MK Potion Shop Item 4"}}, + { RC_MARKET_POTION_SHOP_ITEM_5, {RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 5", "MK Potion Shop Item 5"}}, + { RC_MARKET_POTION_SHOP_ITEM_6, {RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 6", "MK Potion Shop Item 6"}}, + { RC_MARKET_POTION_SHOP_ITEM_7, {RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 7", "MK Potion Shop Item 7"}}, + { RC_MARKET_POTION_SHOP_ITEM_8, {RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 8", "MK Potion Shop Item 8"}}, + { RC_MARKET_BAZAAR_ITEM_1, {RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 1", "MK Bazaar Item 1"}}, + { RC_MARKET_BAZAAR_ITEM_2, {RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 2", "MK Bazaar Item 2"}}, + { RC_MARKET_BAZAAR_ITEM_3, {RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 3", "MK Bazaar Item 3"}}, + { RC_MARKET_BAZAAR_ITEM_4, {RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 4", "MK Bazaar Item 4"}}, + { RC_MARKET_BAZAAR_ITEM_5, {RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 5", "MK Bazaar Item 5"}}, + { RC_MARKET_BAZAAR_ITEM_6, {RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 6", "MK Bazaar Item 6"}}, + { RC_MARKET_BAZAAR_ITEM_7, {RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 7", "MK Bazaar Item 7"}}, + { RC_MARKET_BAZAAR_ITEM_8, {RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 8", "MK Bazaar Item 8"}}, + { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 1", "Kak Bazaar Item 1"}}, + { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 2", "Kak Bazaar Item 2"}}, + { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 3", "Kak Bazaar Item 3"}}, + { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 4", "Kak Bazaar Item 4"}}, + { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 5", "Kak Bazaar Item 5"}}, + { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 6", "Kak Bazaar Item 6"}}, + { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 7", "Kak Bazaar Item 7"}}, + { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 8", "Kak Bazaar Item 8"}}, + { RC_ZD_SHOP_ITEM_1, {RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 1", "ZD Shop Item 1"}}, + { RC_ZD_SHOP_ITEM_2, {RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 2", "ZD Shop Item 2"}}, + { RC_ZD_SHOP_ITEM_3, {RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 3", "ZD Shop Item 3"}}, + { RC_ZD_SHOP_ITEM_4, {RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 4", "ZD Shop Item 4"}}, + { RC_ZD_SHOP_ITEM_5, {RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 5", "ZD Shop Item 5"}}, + { RC_ZD_SHOP_ITEM_6, {RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 6", "ZD Shop Item 6"}}, + { RC_ZD_SHOP_ITEM_7, {RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 7", "ZD Shop Item 7"}}, + { RC_ZD_SHOP_ITEM_8, {RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 8", "ZD Shop Item 8"}}, + { RC_GC_SHOP_ITEM_1, {RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 1", "GC Shop Item 1"}}, + { RC_GC_SHOP_ITEM_2, {RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 2", "GC Shop Item 2"}}, + { RC_GC_SHOP_ITEM_3, {RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 3", "GC Shop Item 3"}}, + { RC_GC_SHOP_ITEM_4, {RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 4", "GC Shop Item 4"}}, + { RC_GC_SHOP_ITEM_5, {RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 5", "GC Shop Item 5"}}, + { RC_GC_SHOP_ITEM_6, {RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 6", "GC Shop Item 6"}}, + { RC_GC_SHOP_ITEM_7, {RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 7", "GC Shop Item 7"}}, + { RC_GC_SHOP_ITEM_8, {RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 8", "GC Shop Item 8"}}, + { RC_COLOSSUS_GOSSIP_STONE, {RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, false, "Gossip Stone", "Colossus Gossip Stone"}}, + { RC_DMC_GOSSIP_STONE, {RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Gossip Stone", "DMC Gossip Stone"}}, + { RC_DMC_UPPER_GROTTO_GOSSIP_STONE, {RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"}}, + { RC_DMT_GOSSIP_STONE, {RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Gossip Stone", "DMT Gossip Stone"}}, + { RC_DMT_STORMS_GROTTO_GOSSIP_STONE, {RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"}}, + { RC_DODONGOS_CAVERN_GOSSIP_STONE, {RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, false, "Gossip Stone", "Dodongo's Cavern Gossip Stone"}}, + { RC_FAIRY_GOSSIP_STONE, {RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, false, "Fairy Gossip Stone", "Fairy Gossip Stone"}}, + { RC_GC_MAZE_GOSSIP_STONE, {RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, false, "Maze Gossip Stone", "GC Maze Gossip Stone"}}, + { RC_GC_MEDIGORON_GOSSIP_STONE, {RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, false, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"}}, + { RC_GV_GOSSIP_STONE, {RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, false, "Gossip Stone", "GV Gossip Stone"}}, + { RC_GY_GOSSIP_STONE, {RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, false, "Gossip Stone", "GY Gossip Stone"}}, + { RC_HC_MALON_GOSSIP_STONE, {RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, false, "Malon Gossip Stone", "HC Malon Gossip Stone"}}, + { RC_HC_ROCK_WALL_GOSSIP_STONE, {RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, false, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"}}, + { RC_HC_STORMS_GROTTO_GOSSIP_STONE, {RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, false, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"}}, + { RC_HF_COW_GROTTO_GOSSIP_STONE, {RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"}}, + { RC_HF_NEAR_MARKET_GOSSIP_STONE, {RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Near Market Gossip Stone", "HF Near Market Gossip Stone"}}, + { RC_HF_OPEN_GROTTO_GOSSIP_STONE, {RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"}}, + { RC_HF_SOUTHEAST_GOSSIP_STONE, {RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Southeast Gossip Stone", "HF Southeast Gossip Stone"}}, + { RC_JABU_GOSSIP_STONE, {RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, false, "Jabu Gossip Stone", "Jabu Gossip Stone"}}, + { RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, {RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"}}, + { RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, {RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"}}, + { RC_KF_GOSSIP_STONE, {RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Gossip Stone", "KF Gossip Stone"}}, + { RC_KF_STORMS_GOSSIP_STONE, {RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Storms Gossip Stone", "KF Storms Gossip Stone"}}, + { RC_KAK_OPEN_GROTTO_GOSSIP_STONE, {RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, false, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"}}, + { RC_LH_LAB_GOSSIP_STONE, {RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, false, "Lab Gossip Stone", "LH Lab Gossip Stone"}}, + { RC_LH_SOUTHEAST_GOSSIP_STONE, {RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, false, "Southeast Gossip Stone", "LH Southeast Gossip Stone"}}, + { RC_LH_SOUTHWEST_GOSSIP_STONE, {RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, false, "Southwest Gossip Stone", "LH Southwest Gossip Stone"}}, + { RC_LW_GOSSIP_STONE, {RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, false, "Gossip Stone", "LW Gossip Stone"}}, + { RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, false, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"}}, + { RC_SFM_MAZE_LOWER_GOSSIP_STONE, {RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, false, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"}}, + { RC_SFM_MAZE_UPPER_GOSSIP_STONE, {RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, false, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"}}, + { RC_SFM_SARIA_GOSSIP_STONE, {RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, false, "Saria Gossip Stone", "SFM Saria Gossip Stone"}}, + { RC_TOT_LEFT_CENTER_GOSSIP_STONE, {RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"}}, + { RC_TOT_LEFT_GOSSIP_STONE, {RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Left Gossip Stone", "ToT Left Gossip Stone"}}, + { RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"}}, + { RC_TOT_RIGHT_GOSSIP_STONE, {RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Right Gossip Stone", "ToT Right Gossip Stone"}}, + { RC_ZD_GOSSIP_STONE, {RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, false, "Gossip Stone", "ZD Gossip Stone"}}, + { RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, {RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, false, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"}}, + { RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, {RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, false, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"}}, + { RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, false, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"}}, }; std::map rcAreas = { @@ -809,6 +812,34 @@ std::map RandomizerCheckObjects::GetAllR return rcObjects; } +void RandomizerCheckObjects::UpdateImGuiVisibility() { + for (auto& locationIt : rcObjects) { + locationIt.second.visibleInImgui = ( + (locationIt.second.vOrMQ != RCVORMQ_MQ) && // don't show MQ checks until we support MQ + (locationIt.second.rcType != RCTYPE_SHOP) && // don't show shop items until we have shopsanity + (locationIt.second.rcType != RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) + (locationIt.second.rcType != RCTYPE_LINKS_POCKET) && + (locationIt.second.rcType != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them + ((locationIt.second.rcType != RCTYPE_SKULL_TOKEN) || + (CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(locationIt.second.rcArea)) || // overworld tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(locationIt.second.rcArea)) // dungeon tokens + ) && + ((locationIt.second.rcType != RCTYPE_COW) || CVar_GetS32("gRandomizeShuffleCows", 0)) && + ((locationIt.second.rcType != RCTYPE_ADULT_TRADE) || CVar_GetS32("gRandomizeShuffleAdultTrade", 0)) && + ((locationIt.second.rc != RC_KF_KOKIRI_SWORD_CHEST) || CVar_GetS32("gRandomizeShuffleKokiriSword", 0)) && + ((locationIt.second.rc != RC_HC_MALON_EGG) || CVar_GetS32("gRandomizeShuffleWeirdEgg", 0)) && + ((locationIt.second.rc != RC_GF_GERUDO_MEMBERSHIP_CARD) || CVar_GetS32("gRandomizeShuffleGerudoToken", 0)) && + ((locationIt.second.rcType != RCTYPE_FROG_SONG) || CVar_GetS32("gRandomizeShuffleFrogSongRupees", 0)) && + ((locationIt.second.rcType != RCTYPE_MAP_COMPASS) || CVar_GetS32("gRandomizeStartingMapsCompasses", 0) != 1) && // 1 is the value for "vanilla" maps/compasses + ((locationIt.second.rcType != RCTYPE_SMALL_KEY) || CVar_GetS32("gRandomizeKeysanity", 0) != 1) && // 1 is the value for "vanilla" small keys + ((locationIt.second.rcType != RCTYPE_GF_KEY) || CVar_GetS32("randoShuffleGerudoFortressKeys", 0) != 0) && // 0 is the value for "vanilla" gf keys + ((locationIt.second.rcType != RCTYPE_BOSS_KEY) || CVar_GetS32("gRandomizeBossKeysanity", 0) != 1) && // 1 is the value for "vanilla" boss keys + ((locationIt.second.rcType != RCTYPE_GANON_BOSS_KEY) || CVar_GetS32("gRandomizeShuffleGanonBossKey", 0) != 0) // 0 is the value for "vanilla" ganon's boss key + ); + } +} + RandomizerCheckObject RandomizerCheckObjects::GetRCObject(RandomizerCheck check) { return rcObjects[check]; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index 27b2441b4..544cab901 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -68,6 +68,7 @@ typedef struct { RandomizerCheckVanillaOrMQ vOrMQ; RandomizerCheckType rcType; RandomizerCheckArea rcArea; + bool visibleInImgui; std::string rcShortName; std::string rcSpoilerName; } RandomizerCheckObject; @@ -77,5 +78,6 @@ namespace RandomizerCheckObjects { bool AreaIsOverworld(RandomizerCheckArea area); std::map GetAllRCAreas(); std::map GetAllRCObjects(); + void UpdateImGuiVisibility(); RandomizerCheckObject GetRCObject(RandomizerCheck check); } \ No newline at end of file From fb3320c3ed1a15927c2e0cd95624731469f6763c Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 15:15:34 -0400 Subject: [PATCH 117/212] use macro for rco --- .../randomizer/randomizer_check_objects.cpp | 1468 +++++++++-------- 1 file changed, 736 insertions(+), 732 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 2ac01b767..cb3ae00ab 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -15,739 +15,743 @@ typedef struct { std::string rcSpoilerName; } RandomizerCheckObject; */ + +#define RC_OBJECT_MAP_ENTRY(rc, rc_v_or_mq, rc_type, rc_area, rc_shortname, rc_spoilername) \ + {rc, {rc, rc_v_or_mq, rc_type, rc_area, false, rc_shortname, rc_spoilername}} + std::map rcObjects = { - { RC_UNKNOWN_CHECK, {RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_INVALID, false, "Invalid Location", "Invalid Location"}}, - { RC_KF_KOKIRI_SWORD_CHEST, {RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Kokiri Sword Chest", "KF Kokiri Sword Chest"}}, - { RC_KF_MIDOS_TOP_LEFT_CHEST, {RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Top Left Chest", "KF Mido Top Left Chest"}}, - { RC_KF_MIDOS_TOP_RIGHT_CHEST, {RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Top Right Chest", "KF Mido Top Right Chest"}}, - { RC_KF_MIDOS_BOTTOM_LEFT_CHEST, {RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"}}, - { RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, {RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"}}, - { RC_KF_STORMS_GROTTO_CHEST, {RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, false, "Storms Grotto Chest", "KF Storms Grotto Chest"}}, - { RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"}}, - { RC_LW_SKULL_KID, {RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Skull Kid", "LW Skull Kid"}}, - { RC_LW_TRADE_COJIRO, {RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Trade Cojiro", "LW Trade Cojiro"}}, - { RC_LW_TRADE_ODD_POTION, {RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Trade Odd Potion", "LW Trade Odd Potion"}}, - { RC_LW_OCARINA_MEMORY_GAME, {RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Ocarina Memory Game", "LW Ocarina Memory Game"}}, - { RC_LW_TARGET_IN_WOODS, {RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Target in Woods", "LW Target in Woods"}}, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"}}, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"}}, - { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, {RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"}}, - { RC_LW_DEKU_SCRUB_GROTTO_REAR, {RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"}}, - { RC_LW_DEKU_SCRUB_GROTTO_FRONT, {RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"}}, - { RC_DEKU_THEATER_SKULL_MASK, {RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Theater Skull Mask", "Deku Theater Skull Mask"}}, - { RC_DEKU_THEATER_MASK_OF_TRUTH, {RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"}}, - { RC_SFM_WOLFOS_GROTTO_CHEST, {RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"}}, - { RC_SFM_DEKU_SCRUB_GROTTO_REAR, {RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"}}, - { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, {RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"}}, - { RC_HF_SOUTHEAST_GROTTO_CHEST, {RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Southeast Grotto Chest", "HF Southeast Grotto Chest"}}, - { RC_HF_OPEN_GROTTO_CHEST, {RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Open Grotto Chest", "HF Open Grotto Chest"}}, - { RC_HF_NEAR_MARKET_GROTTO_CHEST, {RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Near Market Grotto Chest", "HF Near Market Grotto Chest"}}, - { RC_HF_OCARINA_OF_TIME_ITEM, {RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Ocarina of Time Item", "HF Ocarina of Time Item"}}, - { RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, {RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"}}, - { RC_HF_DEKU_SCRUB_GROTTO, {RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Deku Scrub Grotto", "HF Deku Scrub Grotto"}}, - { RC_LH_CHILD_FISHING, {RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Child Fishing", "LH Child Fishing"}}, - { RC_LH_ADULT_FISHING, {RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Adult Fishing", "LH Adult Fishing"}}, - { RC_LH_LAB_DIVE, {RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Lab Dive", "LH Lab Dive"}}, - { RC_LH_TRADE_FROG, {RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"}}, - { RC_LH_UNDERWATER_ITEM, {RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Underwater Item", "LH Underwater Item"}}, - { RC_LH_SUN, {RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Sun", "LH Sun"}}, - { RC_LH_FREESTANDING_POH, {RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Freestanding PoH", "LH Freestanding PoH"}}, - { RC_LH_DEKU_SCRUB_GROTTO_LEFT, {RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"}}, - { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, {RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"}}, - { RC_LH_DEKU_SCRUB_GROTTO_CENTER, {RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, false, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"}}, - { RC_GV_CHEST, {RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Chest", "GV Chest"}}, - { RC_GV_TRADE_SAW, {RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Trade Saw", "GV Trade Saw"}}, - { RC_GV_WATERFALL_FREESTANDING_POH, {RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"}}, - { RC_GV_CRATE_FREESTANDING_POH, {RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Crate Freestanding PoH", "GV Crate Freestanding PoH"}}, - { RC_GV_DEKU_SCRUB_GROTTO_REAR, {RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"}}, - { RC_GV_DEKU_SCRUB_GROTTO_FRONT, {RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, false, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"}}, - { RC_GF_CHEST, {RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "Chest", "GF Chest"}}, - { RC_GF_HBA_1000_POINTS, {RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF HBA 1000 Points", "GF HBA 1000 Points"}}, - { RC_GF_HBA_1500_POINTS, {RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF HBA 1500 Points", "GF HBA 1500 Points"}}, - { RC_GF_GERUDO_MEMBERSHIP_CARD, {RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF Gerudo Membership Card", "GF Gerudo Membership Card"}}, - { RC_GF_NORTH_F1_CARPENTER, {RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF North F1 Carpenter", "GF North F1 Carpenter"}}, - { RC_GF_NORTH_F2_CARPENTER, {RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF North F2 Carpenter", "GF North F2 Carpenter"}}, - { RC_GF_SOUTH_F1_CARPENTER, {RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF South F1 Carpenter", "GF South F1 Carpenter"}}, - { RC_GF_SOUTH_F2_CARPENTER, {RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, false, "GF South F2 Carpenter", "GF South F2 Carpenter"}}, - { RC_WASTELAND_CHEST, {RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, false, "Chest", "Wasteland Chest"}}, - { RC_WASTELAND_BOMBCHU_SALESMAN, {RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, false, "Carpet Salesman", "Wasteland Carpet Salesman"}}, - { RC_COLOSSUS_FREESTANDING_POH, {RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Freestanding PoH", "Colossus Freestanding PoH"}}, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"}}, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"}}, - { RC_MARKET_TREASURE_CHEST_GAME_REWARD, {RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"}}, - { RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"}}, - { RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"}}, - { RC_MARKET_LOST_DOG, {RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Lost Dog", "MK Lost Dog"}}, - { RC_MARKET_SHOOTING_GALLERY_REWARD, {RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Shooting Gallery", "MK Shooting Gallery"}}, - { RC_MARKET_10_BIG_POES, {RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "10 Big Poes", "MK 10 Big Poes"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game First Room Chest", "MK Chest Game First Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"}}, - { RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, {RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, false, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"}}, - { RC_HC_MALON_EGG, {RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Malon Egg", "HC Malon Egg"}}, - { RC_HC_ZELDAS_LETTER, {RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Zeldas Letter", "HC Zeldas Letter"}}, - { RC_KAK_REDEAD_GROTTO_CHEST, {RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Redead Grotto Chest", "Kak Redead Grotto Chest"}}, - { RC_KAK_OPEN_GROTTO_CHEST, {RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Open Grotto Chest", "Kak Open Grotto Chest"}}, - { RC_KAK_10_GOLD_SKULLTULA_REWARD, {RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"}}, - { RC_KAK_20_GOLD_SKULLTULA_REWARD, {RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"}}, - { RC_KAK_30_GOLD_SKULLTULA_REWARD, {RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"}}, - { RC_KAK_40_GOLD_SKULLTULA_REWARD, {RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"}}, - { RC_KAK_50_GOLD_SKULLTULA_REWARD, {RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"}}, - { RC_KAK_MAN_ON_ROOF, {RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Man on Roof", "Kak Man on Roof"}}, - { RC_KAK_SHOOTING_GALLERY_REWARD, {RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"}}, - { RC_KAK_TRADE_ODD_MUSHROOM, {RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"}}, - { RC_KAK_ANJU_AS_ADULT, {RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Anju as Adult", "Kak Anju as Adult"}}, - { RC_KAK_ANJU_AS_CHILD, {RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Anju as Child", "Kak Anju as Child"}}, - { RC_KAK_TRADE_POCKET_CUCCO, {RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"}}, - { RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, {RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"}}, - { RC_KAK_WINDMILL_FREESTANDING_POH, {RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"}}, - { RC_GRAVEYARD_SHIELD_GRAVE_CHEST, {RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Shield Grave Chest", "GY Shield Grave Chest"}}, - { RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"}}, - { RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, {RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Composers Grave Chest", "GY Composers Grave Chest"}}, - { RC_GRAVEYARD_HOOKSHOT_CHEST, {RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Hookshot Chest", "GY Hookshot Chest"}}, - { RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"}}, - { RC_GRAVEYARD_FREESTANDING_POH, {RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Freestanding PoH", "GY Freestanding PoH"}}, - { RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"}}, - { RC_DMT_CHEST, {RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Chest", "DMT Chest"}}, - { RC_DMT_STORMS_GROTTO_CHEST, {RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Storms Grotto Chest", "DMT Storms Grotto Chest"}}, - { RC_DMT_TRADE_BROKEN_SWORD, {RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Trade Broken Sword", "DMT Trade Broken Sword"}}, - { RC_DMT_TRADE_EYEDROPS, {RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Trade Eyedrops", "DMT Trade Eyedrops"}}, - { RC_DMT_TRADE_CLAIM_CHECK, {RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Trade Claim Check", "DMT Trade Claim Check"}}, - { RC_DMT_FREESTANDING_POH, {RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Freestanding PoH", "DMT Freestanding PoH"}}, - { RC_GC_MAZE_LEFT_CHEST, {RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Maze Left Chest", "GC Maze Left Chest"}}, - { RC_GC_MAZE_RIGHT_CHEST, {RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Maze Right Chest", "GC Maze Right Chest"}}, - { RC_GC_MAZE_CENTER_CHEST, {RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Maze Center Chest", "GC Maze Center Chest"}}, - { RC_GC_ROLLING_GORON_AS_CHILD, {RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Rolling Goron as Child", "GC Rolling Goron as Child"}}, - { RC_GC_ROLLING_GORON_AS_ADULT, {RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Rolling Goron as Adult", "GC Rolling Goron as Adult"}}, - { RC_GC_DARUNIAS_JOY, {RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Darunias Joy", "GC Darunias Joy"}}, - { RC_GC_POT_FREESTANDING_POH, {RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Pot Freestanding PoH", "GC Pot Freestanding PoH"}}, - { RC_GC_DEKU_SCRUB_GROTTO_LEFT, {RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"}}, - { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, {RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"}}, - { RC_GC_DEKU_SCRUB_GROTTO_CENTER, {RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"}}, - { RC_GC_MEDIGORON, {RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, false, "Medigoron", "GC Medigoron"}}, - { RC_DMC_UPPER_GROTTO_CHEST, {RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Upper Grotto Chest", "DMC Upper Grotto Chest"}}, - { RC_DMC_WALL_FREESTANDING_POH, {RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"}}, - { RC_DMC_VOLCANO_FREESTANDING_POH, {RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"}}, - { RC_DMC_DEKU_SCRUB, {RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub", "DMC Deku Scrub"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, {RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, {RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"}}, - { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, {RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"}}, - { RC_ZR_OPEN_GROTTO_CHEST, {RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Open Grotto Chest", "ZR Open Grotto Chest"}}, - { RC_ZR_MAGIC_BEAN_SALESMAN, {RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Magic Bean Salesman", "ZR Magic Bean Salesman"}}, - { RC_ZR_FROGS_ZELDAS_LULLABY, {RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"}}, - { RC_ZR_FROGS_EPONAS_SONG, {RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Epona's Song", "ZR Frogs Epona's Song"}}, - { RC_ZR_FROGS_SARIAS_SONG, {RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Saria's Song", "ZR Frogs Saria's Song"}}, - { RC_ZR_FROGS_SUNS_SONG, {RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Sun's Song", "ZR Frogs Sun's Song"}}, - { RC_ZR_FROGS_SONG_OF_TIME, {RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Song of Time", "ZR Frogs Song of Time"}}, - { RC_ZR_FROGS_IN_THE_RAIN, {RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs in the Rain", "ZR Frogs in the Rain"}}, - { RC_ZR_FROGS_OCARINA_GAME, {RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"}}, - { RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"}}, - { RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, {RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"}}, - { RC_ZR_DEKU_SCRUB_GROTTO_REAR, {RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"}}, - { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, {RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, false, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"}}, - { RC_ZD_CHEST, {RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "Chest", "ZD Chest"}}, - { RC_ZD_DIVING_MINIGAME, {RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "Diving Minigame", "ZD Diving Minigame"}}, - { RC_ZD_KING_ZORA_THAWED, {RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "King Zora Thawed", "ZD King Zora Thawed"}}, - { RC_ZD_TRADE_PRESCRIPTION, {RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, false, "Trade Prescription", "ZD Trade Prescription"}}, - { RC_ZF_ICEBERC_FREESTANDING_POH, {RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, false, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"}}, - { RC_ZF_BOTTOM_FREESTANDING_POH, {RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, false, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"}}, - { RC_LLR_TALONS_CHICKENS, {RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Talons Chickens", "LLR Talons Chickens"}}, - { RC_LLR_FREESTANDING_POH, {RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Freestanding PoH", "LLR Freestanding PoH"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, {RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, {RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"}}, - { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, {RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"}}, - { RC_DEKU_TREE_MAP_CHEST, {RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "Map Chest", "Deku Tree Map Chest"}}, - { RC_DEKU_TREE_COMPASS_CHEST, {RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "Compass Chest", "Deku Tree Compass Chest"}}, - { RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"}}, - { RC_DEKU_TREE_BASEMENT_CHEST, {RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Basement Chest", "Deku Tree Basement Chest"}}, - { RC_DEKU_TREE_SLINGSHOT_CHEST, {RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Slingshot Chest", "Deku Tree Slingshot Chest"}}, - { RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"}}, - { RC_DEKU_TREE_MQ_MAP_CHEST, {RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "MQ Map Chest", "Deku Tree MQ Map Chest"}}, - { RC_DEKU_TREE_MQ_COMPASS_CHEST, {RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, false, "MQ Compass Chest", "Deku Tree MQ Compass Chest"}}, - { RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"}}, - { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"}}, - { RC_DEKU_TREE_MQ_BASEMENT_CHEST, {RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Basement Chest", "Deku Tree MQ Basement Chest"}}, - { RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"}}, - { RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"}}, - { RC_DEKU_TREE_MQ_DEKU_SCRUB, {RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"}}, - { RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, {RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"}}, - { RC_DODONGOS_CAVERN_MAP_CHEST, {RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "Map Chest", "Dodongos Cavern Map Chest"}}, - { RC_DODONGOS_CAVERN_COMPASS_CHEST, {RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "Compass Chest", "Dodongos Cavern Compass Chest"}}, - { RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"}}, - { RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"}}, - { RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"}}, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"}}, - { RC_DODONGOS_CAVERN_MQ_MAP_CHEST, {RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"}}, - { RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"}}, - { RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, {RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, false, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"}}, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"}}, - { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"}}, - { RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"}}, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"}}, - { RC_JABU_JABUS_BELLY_MAP_CHEST, {RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "Map Chest", "Jabu Jabus Belly Map Chest"}}, - { RC_JABU_JABUS_BELLY_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "Compass Chest", "Jabu Jabus Belly Compass Chest"}}, - { RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"}}, - { RC_JABU_JABUS_BELLY_DEKU_SCRUB, {RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"}}, - { RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, {RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, false, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"}}, - { RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"}}, - { RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "First Room Chest", "Forest Temple First Room Chest"}}, - { RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, {RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "First Stalfos Chest", "Forest Temple First Stalfos Chest"}}, - { RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"}}, - { RC_FOREST_TEMPLE_MAP_CHEST, {RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, false, "Map Chest", "Forest Temple Map Chest"}}, - { RC_FOREST_TEMPLE_WELL_CHEST, {RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Well Chest", "Forest Temple Well Chest"}}, - { RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"}}, - { RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, {RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Eye Switch Chest", "Forest Temple Eye Switch Chest"}}, - { RC_FOREST_TEMPLE_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Boss Key Chest", "Forest Temple Boss Key Chest"}}, - { RC_FOREST_TEMPLE_FLOORMASTER_CHEST, {RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Floormaster Chest", "Forest Temple Floormaster Chest"}}, - { RC_FOREST_TEMPLE_BOW_CHEST, {RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Bow Chest", "Forest Temple Bow Chest"}}, - { RC_FOREST_TEMPLE_RED_POE_CHEST, {RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Red Poe Chest", "Forest Temple Red Poe Chest"}}, - { RC_FOREST_TEMPLE_BLUE_POE_CHEST, {RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Blue Poe Chest", "Forest Temple Blue Poe Chest"}}, - { RC_FOREST_TEMPLE_BASEMENT_CHEST, {RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Basement Chest", "Forest Temple Basement Chest"}}, - { RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ First Room Chest", "Forest Temple MQ First Room Chest"}}, - { RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, {RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"}}, - { RC_FOREST_TEMPLE_MQ_BOW_CHEST, {RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Bow Chest", "Forest Temple MQ Bow Chest"}}, - { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"}}, - { RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"}}, - { RC_FOREST_TEMPLE_MQ_WELL_CHEST, {RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Well Chest", "Forest Temple MQ Well Chest"}}, - { RC_FOREST_TEMPLE_MQ_MAP_CHEST, {RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, false, "MQ Map Chest", "Forest Temple MQ Map Chest"}}, - { RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, {RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, false, "MQ Compass Chest", "Forest Temple MQ Compass Chest"}}, - { RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"}}, - { RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, {RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Basement Chest", "Forest Temple MQ Basement Chest"}}, - { RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, {RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Redead Chest", "Forest Temple MQ Redead Chest"}}, - { RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"}}, - { RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Near Boss Chest", "Fire Temple Near Boss Chest"}}, - { RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, {RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"}}, - { RC_FIRE_TEMPLE_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boss Key Chest", "Fire Temple Boss Key Chest"}}, - { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"}}, - { RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"}}, - { RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"}}, - { RC_FIRE_TEMPLE_SCARECROW_CHEST, {RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Scarecrow Chest", "Fire Temple Scarecrow Chest"}}, - { RC_FIRE_TEMPLE_MAP_CHEST, {RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "Map Chest", "Fire Temple Map Chest"}}, - { RC_FIRE_TEMPLE_COMPASS_CHEST, {RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "Compass Chest", "Fire Temple Compass Chest"}}, - { RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, {RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Highest Goron Chest", "Fire Temple Highest Goron Chest"}}, - { RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"}}, - { RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"}}, - { RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"}}, - { RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, {RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "MQ Compass Chest", "Fire Temple MQ Compass Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"}}, - { RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"}}, - { RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"}}, - { RC_FIRE_TEMPLE_MQ_MAP_CHEST, {RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, false, "MQ Map Chest", "Fire Temple MQ Map Chest"}}, - { RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"}}, - { RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"}}, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"}}, - { RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, {RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"}}, - { RC_WATER_TEMPLE_MAP_CHEST, {RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "Map Chest", "Water Temple Map Chest"}}, - { RC_WATER_TEMPLE_COMPASS_CHEST, {RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "Compass Chest", "Water Temple Compass Chest"}}, - { RC_WATER_TEMPLE_TORCHES_CHEST, {RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Torches Chest", "Water Temple Torches Chest"}}, - { RC_WATER_TEMPLE_DRAGON_CHEST, {RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Dragon Chest", "Water Temple Dragon Chest"}}, - { RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"}}, - { RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Central Pillar Chest", "Water Temple Central Pillar Chest"}}, - { RC_WATER_TEMPLE_CRACKED_WALL_CHEST, {RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"}}, - { RC_WATER_TEMPLE_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Boss Key Chest", "Water Temple Boss Key Chest"}}, - { RC_WATER_TEMPLE_LONGSHOT_CHEST, {RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Longshot Chest", "Water Temple Longshot Chest"}}, - { RC_WATER_TEMPLE_RIVER_CHEST, {RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "River Chest", "Water Temple River Chest"}}, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"}}, - { RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"}}, - { RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, {RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"}}, - { RC_WATER_TEMPLE_MQ_COMPASS_CHEST, {RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "MQ Compass Chest", "Water Temple MQ Compass Chest"}}, - { RC_WATER_TEMPLE_MQ_MAP_CHEST, {RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, false, "MQ Map Chest", "Water Temple MQ Map Chest"}}, - { RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, {RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"}}, - { RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"}}, - { RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"}}, - { RC_SPIRIT_TEMPLE_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "Compass Chest", "Spirit Temple Compass Chest"}}, - { RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"}}, - { RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"}}, - { RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"}}, - { RC_SPIRIT_TEMPLE_MAP_CHEST, {RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "Map Chest", "Spirit Temple Map Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"}}, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"}}, - { RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"}}, - { RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"}}, - { RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"}}, - { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"}}, - { RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Boss Key Chest", "Spirit Temple Boss Key Chest"}}, - { RC_SPIRIT_TEMPLE_TOPMOST_CHEST, {RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Topmost Chest", "Spirit Temple Topmost Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "MQ Map Chest", "Spirit Temple MQ Map Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, false, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"}}, - { RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MAP_CHEST, {RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "Map Chest", "Shadow Temple Map Chest"}}, - { RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"}}, - { RC_SHADOW_TEMPLE_COMPASS_CHEST, {RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "Compass Chest", "Shadow Temple Compass Chest"}}, - { RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"}}, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"}}, - { RC_SHADOW_TEMPLE_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"}}, - { RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"}}, - { RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"}}, - { RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"}}, - { RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Boss Key Chest", "Shadow Temple Boss Key Chest"}}, - { RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"}}, - { RC_SHADOW_TEMPLE_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Freestanding Key", "Shadow Temple Freestanding Key"}}, - { RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, {RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"}}, - { RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"}}, - { RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"}}, - { RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, false, "MQ Map Chest", "Shadow Temple MQ Map Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"}}, - { RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"}}, - { RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"}}, - { RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"}}, - { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"}}, - { RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"}}, - { RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"}}, - { RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"}}, - { RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"}}, - { RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "Compass Chest", "Bottom of the Well Compass Chest"}}, - { RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"}}, - { RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"}}, - { RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"}}, - { RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Invisible Chest", "Bottom of the Well Invisible Chest"}}, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"}}, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "Map Chest", "Bottom of the Well Map Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"}}, - { RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Like Like Chest", "Bottom of the Well Like Like Chest"}}, - { RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "Freestanding Key", "Bottom of the Well Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Map Chest", "Bottom of the Well MQ Map Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"}}, - { RC_ICE_CAVERN_MAP_CHEST, {RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "Map Chest", "Ice Cavern Map Chest"}}, - { RC_ICE_CAVERN_COMPASS_CHEST, {RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "Compass Chest", "Ice Cavern Compass Chest"}}, - { RC_ICE_CAVERN_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"}}, - { RC_ICE_CAVERN_FREESTANDING_POH, {RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "Freestanding PoH", "Ice Cavern Freestanding PoH"}}, - { RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"}}, - { RC_ICE_CAVERN_MQ_COMPASS_CHEST, {RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"}}, - { RC_ICE_CAVERN_MQ_MAP_CHEST, {RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, false, "MQ Map Chest", "Ice Cavern MQ Map Chest"}}, - { RC_ICE_CAVERN_MQ_FREESTANDING_POH, {RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"}}, - { RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"}}, - { RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"}}, - { RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, {RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"}}, - { RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, {RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"}}, - { RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"}}, - { RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, {RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"}}, - { RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, {RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"}}, - { RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, {RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"}}, - { RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, false, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"}}, - { RC_GANONS_TOWER_BOSS_KEY_CHEST, {RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Boss Key Chest", "Ganon's Tower Boss Key Chest"}}, - { RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"}}, - { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"}}, - { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"}}, - { RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"}}, - { RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"}}, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"}}, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"}}, - { RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"}}, - { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"}}, - { RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"}}, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"}}, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"}}, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"}}, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"}}, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, false, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"}}, - { RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Basement Back Room", "Deku Tree GS Basement Back Room"}}, - { RC_DEKU_TREE_GS_BASEMENT_GATE, {RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Basement Gate", "Deku Tree GS Basement Gate"}}, - { RC_DEKU_TREE_GS_BASEMENT_VINES, {RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Basement Vines", "Deku Tree GS Basement Vines"}}, - { RC_DEKU_TREE_GS_COMPASS_ROOM, {RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "GS Compass Room", "Deku Tree GS Compass Room"}}, - { RC_DEKU_TREE_MQ_GS_LOBBY, {RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Lobby", "Deku Tree MQ GS Lobby"}}, - { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"}}, - { RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"}}, - { RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, false, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"}}, - { RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"}}, - { RC_DODONGOS_CAVERN_GS_SCARECROW, {RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"}}, - { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"}}, - { RC_DODONGOS_CAVERN_GS_BACK_ROOM, {RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Back Room", "Dodongos Cavern GS Back Room"}}, - { RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"}}, - { RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"}}, - { RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, {RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, false, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"}}, - { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"}}, - { RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"}}, - { RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"}}, - { RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"}}, - { RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, false, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"}}, - { RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"}}, - { RC_FOREST_TEMPLE_GS_FIRST_ROOM, {RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS First Room", "Forest Temple GS First Room"}}, - { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"}}, - { RC_FOREST_TEMPLE_GS_LOBBY, {RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Lobby", "Forest Temple GS Lobby"}}, - { RC_FOREST_TEMPLE_GS_BASEMENT, {RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "GS Basement", "Forest Temple GS Basement"}}, - { RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"}}, - { RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"}}, - { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"}}, - { RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"}}, - { RC_FOREST_TEMPLE_MQ_GS_WELL, {RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, false, "MQ GS Well", "Forest Temple MQ GS Well"}}, - { RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Song of Time Room", "Fire Temple GS Song of Time Room"}}, - { RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"}}, - { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, {RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Boulder Maze", "Fire Temple GS Boulder Maze"}}, - { RC_FIRE_TEMPLE_GS_SCARECROW_TOP, {RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"}}, - { RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, {RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"}}, - { RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"}}, - { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"}}, - { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"}}, - { RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"}}, - { RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, false, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"}}, - { RC_WATER_TEMPLE_GS_BEHIND_GATE, {RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Behind Gate", "Water Temple GS Behind Gate"}}, - { RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"}}, - { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, {RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Central Pillar", "Water Temple GS Central Pillar"}}, - { RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"}}, - { RC_WATER_TEMPLE_GS_RIVER, {RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "GS River", "Water Temple GS River"}}, - { RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"}}, - { RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"}}, - { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"}}, - { RC_WATER_TEMPLE_MQ_GS_RIVER, {RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS River", "Water Temple MQ GS River"}}, - { RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, false, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"}}, - { RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"}}, - { RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Boulder Room", "Spirit Temple GS Boulder Room"}}, - { RC_SPIRIT_TEMPLE_GS_LOBBY, {RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Lobby", "Spirit Temple GS Lobby"}}, - { RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"}}, - { RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "GS Metal Fence", "Spirit Temple GS Metal Fence"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"}}, - { RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, false, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"}}, - { RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"}}, - { RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"}}, - { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"}}, - { RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Like Like Room", "Shadow Temple GS Like Like Room"}}, - { RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "GS Near Ship", "Shadow Temple GS Near Ship"}}, - { RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"}}, - { RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"}}, - { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"}}, - { RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"}}, - { RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, false, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"}}, - { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"}}, - { RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "GS East Inner Room", "Bottom of the Well GS East Inner Room"}}, - { RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "GS West Inner Room", "Bottom of the Well GS West Inner Room"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ GS Basement", "Bottom of the Well MQ GS Basement"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"}}, - { RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, false, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"}}, - { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "GS Push Block Room", "Ice Cavern GS Push Block Room"}}, - { RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"}}, - { RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"}}, - { RC_ICE_CAVERN_MQ_GS_SCARECROW, {RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"}}, - { RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, {RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"}}, - { RC_ICE_CAVERN_MQ_GS_RED_ICE, {RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, false, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"}}, - { RC_KF_GS_BEAN_PATCH, {RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "GS Bean Patch", "KF GS Bean Patch"}}, - { RC_KF_GS_KNOW_IT_ALL_HOUSE, {RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "GS Know It All House", "KF GS Know It All House"}}, - { RC_KF_GS_HOUSE_OF_TWINS, {RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "GS House of Twins", "KF GS House of Twins"}}, - { RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, {RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, false, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"}}, - { RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, false, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"}}, - { RC_LW_GS_ABOVE_THEATER, {RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, false, "GS Above Theater", "LW GS Above Theater"}}, - { RC_SFM_GS, {RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, false, "GS", "SFM GS"}}, - { RC_HF_GS_COW_GROTTO, {RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, false, "GS Cow Grotto", "HF GS Cow Grotto"}}, - { RC_HF_GS_NEAR_KAK_GROTTO, {RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, false, "GS Near Kak Grotto", "HF GS Near Kak Grotto"}}, - { RC_LH_GS_BEAN_PATCH, {RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Bean Patch", "LH GS Bean Patch"}}, - { RC_LH_GS_SMALL_ISLAND, {RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Small Island", "LH GS Small Island"}}, - { RC_LH_GS_LAB_WALL, {RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Lab Wall", "LH GS Lab Wall"}}, - { RC_LH_GS_LAB_CRATE, {RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Lab Crate", "LH GS Lab Crate"}}, - { RC_LH_GS_TREE, {RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, false, "GS Tree", "LH GS Tree"}}, - { RC_GV_GS_BEAN_PATCH, {RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Bean Patch", "GV GS Bean Patch"}}, - { RC_GV_GS_SMALL_BRIDGE, {RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Small Bridge", "GV GS Small Bridge"}}, - { RC_GV_GS_PILLAR, {RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Pillar", "GV GS Pillar"}}, - { RC_GV_GS_BEHIND_TENT, {RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, false, "GS Behind Tent", "GV GS Behind Tent"}}, - { RC_GF_GS_ARCHERY_RANGE, {RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, false, "GS Archery Range", "GF GS Archery Range"}}, - { RC_GF_GS_TOP_FLOOR, {RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, false, "GS Top Floor", "GF GS Top Floor"}}, - { RC_WASTELAND_GS, {RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, false, "GS", "Wasteland GS"}}, - { RC_COLOSSUS_GS_BEAN_PATCH, {RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, false, "GS Bean Patch", "Colossus GS Bean Patch"}}, - { RC_COLOSSUS_GS_HILL, {RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, false, "GS Hill", "Colossus GS Hill"}}, - { RC_COLOSSUS_GS_TREE, {RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, false, "GS Tree", "Colossus GS Tree"}}, - { RC_OGC_GS, {RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, false, "OGC GS", "OGC GS"}}, - { RC_HC_GS_STORMS_GROTTO, {RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, false, "GS Storms Grotto", "HC GS Storms Grotto"}}, - { RC_HC_GS_TREE, {RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, false, "GS Tree", "HC GS Tree"}}, - { RC_MARKET_GS_GUARD_HOUSE, {RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, false, "Market GS Guard House", "Market GS Guard House"}}, - { RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, {RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS House Under Construction", "Kak GS House Under Construction"}}, - { RC_KAK_GS_SKULLTULA_HOUSE, {RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Skulltula House", "Kak GS Skulltula House"}}, - { RC_KAK_GS_GUARDS_HOUSE, {RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Guards House", "Kak GS Guards House"}}, - { RC_KAK_GS_TREE, {RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Tree", "Kak GS Tree"}}, - { RC_KAK_GS_WATCHTOWER, {RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Watchtower", "Kak GS Watchtower"}}, - { RC_KAK_GS_ABOVE_IMPAS_HOUSE, {RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, false, "GS Above Impas House", "Kak GS Above Impas House"}}, - { RC_GRAVEYARD_GS_WALL, {RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, false, "GS Wall", "Graveyard GS Wall"}}, - { RC_GRAVEYARD_GS_BEAN_PATCH, {RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, false, "GS Bean Patch", "Graveyard GS Bean Patch"}}, - { RC_DMC_GS_BEAN_PATCH, {RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, false, "GS Bean Patch", "DMC GS Bean Patch"}}, - { RC_DMC_GS_CRATE, {RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, false, "GS Crate", "DMC GS Crate"}}, - { RC_DMT_GS_BEAN_PATCH, {RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Bean Patch", "DMT GS Bean Patch"}}, - { RC_DMT_GS_NEAR_KAK, {RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Near Kak", "DMT GS Near Kak"}}, - { RC_DMT_GS_ABOVE_DODONGOS_CAVERN, {RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"}}, - { RC_DMT_GS_FALLING_ROCKS_PATH, {RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"}}, - { RC_GC_GS_CENTER_PLATFORM, {RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, false, "GS Center Platform", "GC GS Center Platform"}}, - { RC_GC_GS_BOULDER_MAZE, {RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, false, "GS Boulder Maze", "GC GS Boulder Maze"}}, - { RC_ZR_GS_LADDER, {RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Ladder", "ZR GS Ladder"}}, - { RC_ZR_GS_TREE, {RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Tree", "ZR GS Tree"}}, - { RC_ZR_GS_ABOVE_BRIDGE, {RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Above Bridge", "ZR GS Above Bridge"}}, - { RC_ZR_GS_NEAR_RAISED_GROTTOS, {RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, false, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"}}, - { RC_ZD_GS_FROZEN_WATERFALL, {RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, false, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"}}, - { RC_ZF_GS_ABOVE_THE_LOG, {RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, false, "GS Above The Log", "ZF GS Above The Log"}}, - { RC_ZF_GS_HIDDEN_CAVE, {RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, false, "GS Hidden Cave", "ZF GS Hidden Cave"}}, - { RC_ZF_GS_TREE, {RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, false, "GS Tree", "ZF GS Tree"}}, - { RC_LLR_GS_BACK_WALL, {RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS Back Wall", "LLR GS Back Wall"}}, - { RC_LLR_GS_RAIN_SHED, {RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS Rain Shed", "LLR GS Rain Shed"}}, - { RC_LLR_GS_HOUSE_WINDOW, {RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS House Window", "LLR GS House Window"}}, - { RC_LLR_GS_TREE, {RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, false, "GS Tree", "LLR GS Tree"}}, - { RC_LINKS_POCKET, {RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_LINKS_POCKET, RCAREA_KOKIRI_FOREST, false, "Link's Pocket", "Link's Pocket"}}, - { RC_QUEEN_GOHMA, {RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Queen Gohma", "Queen Gohma"}}, - { RC_KING_DODONGO, {RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "King Dodongo", "King Dodongo"}}, - { RC_BARINADE, {RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Barinade", "Barinade"}}, - { RC_PHANTOM_GANON, {RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Phantom Ganon", "Phantom Ganon"}}, - { RC_VOLVAGIA, {RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Volvagia", "Volvagia"}}, - { RC_MORPHA, {RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Morpha", "Morpha"}}, - { RC_TWINROVA, {RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Twinrova", "Twinrova"}}, - { RC_BONGO_BONGO, {RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Bongo Bongo", "Bongo Bongo"}}, - { RC_DEKU_TREE_QUEEN_GOHMA_HEART, {RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, false, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"}}, - { RC_DODONGOS_CAVERN_KING_DODONGO_HEART, {RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, false, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"}}, - { RC_JABU_JABUS_BELLY_BARINADE_HEART, {RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, false, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"}}, - { RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, {RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, false, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"}}, - { RC_FIRE_TEMPLE_VOLVAGIA_HEART, {RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, false, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"}}, - { RC_WATER_TEMPLE_MORPHA_HEART, {RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, false, "Morpha Heart Container", "Water Temple Morpha Heart Container"}}, - { RC_SPIRIT_TEMPLE_TWINROVA_HEART, {RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, false, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"}}, - { RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, {RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, false, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"}}, - { RC_TOT_LIGHT_ARROWS_CUTSCENE, {RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"}}, - { RC_LW_GIFT_FROM_SARIA, {RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, false, "Gift From Saria", "LW Gift From Saria"}}, - { RC_ZF_GREAT_FAIRY_REWARD, {RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, false, "Great Fairy Reward", "ZF Great Fairy Reward"}}, - { RC_HC_GREAT_FAIRY_REWARD, {RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Great Fairy Reward", "HC Great Fairy Reward"}}, - { RC_COLOSSUS_GREAT_FAIRY_REWARD, {RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Great Fairy Reward", "Colossus Great Fairy Reward"}}, - { RC_DMT_GREAT_FAIRY_REWARD, {RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Great Fairy Reward", "DMT Great Fairy Reward"}}, - { RC_DMC_GREAT_FAIRY_REWARD, {RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Great Fairy Reward", "DMC Great Fairy Reward"}}, - { RC_OGC_GREAT_FAIRY_REWARD, {RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "OGC Great Fairy Reward", "OGC Great Fairy Reward"}}, - { RC_SHEIK_IN_FOREST, {RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Sheik in Forest", "Sheik in Forest"}}, - { RC_SHEIK_IN_CRATER, {RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Sheik in Crater", "Sheik in Crater"}}, - { RC_SHEIK_IN_ICE_CAVERN, {RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, false, "Sheik in Ice Cavern", "Sheik in Ice Cavern"}}, - { RC_SHEIK_AT_COLOSSUS, {RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, false, "Sheik at Colossus", "Sheik at Colossus"}}, - { RC_SHEIK_IN_KAKARIKO, {RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Sheik in Kakariko", "Sheik in Kakariko"}}, - { RC_SHEIK_AT_TEMPLE, {RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, false, "Sheik at Temple", "Sheik at Temple"}}, - { RC_SONG_FROM_IMPA, {RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, false, "Song from Impa", "Song from Impa"}}, - { RC_SONG_FROM_MALON, {RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, false, "Song from Malon", "Song from Malon"}}, - { RC_SONG_FROM_SARIA, {RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, false, "Song from Saria", "Song from Saria"}}, - { RC_SONG_FROM_ROYAL_FAMILYS_TOMB, {RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, false, "Song from Composers Grave", "Song from Composers Grave"}}, - { RC_SONG_FROM_OCARINA_OF_TIME, {RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, false, "Song from Ocarina of Time", "Song from Ocarina of Time"}}, - { RC_SONG_FROM_WINDMILL, {RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, false, "Song from Windmill", "Song from Windmill"}}, - { RC_KF_LINKS_HOUSE_COW, {RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, false, "Links House Cow", "KF Links House Cow"}}, - { RC_HF_COW_GROTTO_COW, {RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, false, "Cow Grotto Cow", "HF Cow Grotto Cow"}}, - { RC_LLR_STABLES_LEFT_COW, {RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Stables Left Cow", "LLR Stables Left Cow"}}, - { RC_LLR_STABLES_RIGHT_COW, {RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Stables Right Cow", "LLR Stables Right Cow"}}, - { RC_LLR_TOWER_LEFT_COW, {RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Tower Left Cow", "LLR Tower Left Cow"}}, - { RC_LLR_TOWER_RIGHT_COW, {RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, false, "Tower Right Cow", "LLR Tower Right Cow"}}, - { RC_KAK_IMPAS_HOUSE_COW, {RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, false, "Impas House Cow", "Kak Impas House Cow"}}, - { RC_DMT_COW_GROTTO_COW, {RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Cow Grotto Cow", "DMT Cow Grotto Cow"}}, - { RC_GV_COW, {RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, false, "Cow", "GV Cow"}}, - { RC_JABU_JABUS_BELLY_MQ_COW, {RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, false, "MQ Cow", "Jabu Jabus Belly MQ Cow"}}, - { RC_KF_SHOP_ITEM_1, {RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 1", "KF Shop Item 1"}}, - { RC_KF_SHOP_ITEM_2, {RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 2", "KF Shop Item 2"}}, - { RC_KF_SHOP_ITEM_3, {RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 3", "KF Shop Item 3"}}, - { RC_KF_SHOP_ITEM_4, {RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 4", "KF Shop Item 4"}}, - { RC_KF_SHOP_ITEM_5, {RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 5", "KF Shop Item 5"}}, - { RC_KF_SHOP_ITEM_6, {RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 6", "KF Shop Item 6"}}, - { RC_KF_SHOP_ITEM_7, {RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 7", "KF Shop Item 7"}}, - { RC_KF_SHOP_ITEM_8, {RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, false, "Shop Item 8", "KF Shop Item 8"}}, - { RC_KAK_POTION_SHOP_ITEM_1, {RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 1", "Kak Potion Shop Item 1"}}, - { RC_KAK_POTION_SHOP_ITEM_2, {RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 2", "Kak Potion Shop Item 2"}}, - { RC_KAK_POTION_SHOP_ITEM_3, {RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 3", "Kak Potion Shop Item 3"}}, - { RC_KAK_POTION_SHOP_ITEM_4, {RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 4", "Kak Potion Shop Item 4"}}, - { RC_KAK_POTION_SHOP_ITEM_5, {RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 5", "Kak Potion Shop Item 5"}}, - { RC_KAK_POTION_SHOP_ITEM_6, {RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 6", "Kak Potion Shop Item 6"}}, - { RC_KAK_POTION_SHOP_ITEM_7, {RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 7", "Kak Potion Shop Item 7"}}, - { RC_KAK_POTION_SHOP_ITEM_8, {RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Potion Shop Item 8", "Kak Potion Shop Item 8"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_1, {RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_2, {RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_3, {RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_4, {RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_5, {RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_6, {RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_7, {RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"}}, - { RC_MARKET_BOMBCHU_SHOP_ITEM_8, {RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"}}, - { RC_MARKET_POTION_SHOP_ITEM_1, {RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 1", "MK Potion Shop Item 1"}}, - { RC_MARKET_POTION_SHOP_ITEM_2, {RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 2", "MK Potion Shop Item 2"}}, - { RC_MARKET_POTION_SHOP_ITEM_3, {RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 3", "MK Potion Shop Item 3"}}, - { RC_MARKET_POTION_SHOP_ITEM_4, {RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 4", "MK Potion Shop Item 4"}}, - { RC_MARKET_POTION_SHOP_ITEM_5, {RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 5", "MK Potion Shop Item 5"}}, - { RC_MARKET_POTION_SHOP_ITEM_6, {RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 6", "MK Potion Shop Item 6"}}, - { RC_MARKET_POTION_SHOP_ITEM_7, {RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 7", "MK Potion Shop Item 7"}}, - { RC_MARKET_POTION_SHOP_ITEM_8, {RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Potion Shop Item 8", "MK Potion Shop Item 8"}}, - { RC_MARKET_BAZAAR_ITEM_1, {RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 1", "MK Bazaar Item 1"}}, - { RC_MARKET_BAZAAR_ITEM_2, {RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 2", "MK Bazaar Item 2"}}, - { RC_MARKET_BAZAAR_ITEM_3, {RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 3", "MK Bazaar Item 3"}}, - { RC_MARKET_BAZAAR_ITEM_4, {RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 4", "MK Bazaar Item 4"}}, - { RC_MARKET_BAZAAR_ITEM_5, {RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 5", "MK Bazaar Item 5"}}, - { RC_MARKET_BAZAAR_ITEM_6, {RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 6", "MK Bazaar Item 6"}}, - { RC_MARKET_BAZAAR_ITEM_7, {RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 7", "MK Bazaar Item 7"}}, - { RC_MARKET_BAZAAR_ITEM_8, {RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, false, "Bazaar Item 8", "MK Bazaar Item 8"}}, - { RC_KAK_BAZAAR_ITEM_1, {RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 1", "Kak Bazaar Item 1"}}, - { RC_KAK_BAZAAR_ITEM_2, {RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 2", "Kak Bazaar Item 2"}}, - { RC_KAK_BAZAAR_ITEM_3, {RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 3", "Kak Bazaar Item 3"}}, - { RC_KAK_BAZAAR_ITEM_4, {RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 4", "Kak Bazaar Item 4"}}, - { RC_KAK_BAZAAR_ITEM_5, {RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 5", "Kak Bazaar Item 5"}}, - { RC_KAK_BAZAAR_ITEM_6, {RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 6", "Kak Bazaar Item 6"}}, - { RC_KAK_BAZAAR_ITEM_7, {RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 7", "Kak Bazaar Item 7"}}, - { RC_KAK_BAZAAR_ITEM_8, {RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, false, "Bazaar Item 8", "Kak Bazaar Item 8"}}, - { RC_ZD_SHOP_ITEM_1, {RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 1", "ZD Shop Item 1"}}, - { RC_ZD_SHOP_ITEM_2, {RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 2", "ZD Shop Item 2"}}, - { RC_ZD_SHOP_ITEM_3, {RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 3", "ZD Shop Item 3"}}, - { RC_ZD_SHOP_ITEM_4, {RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 4", "ZD Shop Item 4"}}, - { RC_ZD_SHOP_ITEM_5, {RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 5", "ZD Shop Item 5"}}, - { RC_ZD_SHOP_ITEM_6, {RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 6", "ZD Shop Item 6"}}, - { RC_ZD_SHOP_ITEM_7, {RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 7", "ZD Shop Item 7"}}, - { RC_ZD_SHOP_ITEM_8, {RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, false, "Shop Item 8", "ZD Shop Item 8"}}, - { RC_GC_SHOP_ITEM_1, {RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 1", "GC Shop Item 1"}}, - { RC_GC_SHOP_ITEM_2, {RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 2", "GC Shop Item 2"}}, - { RC_GC_SHOP_ITEM_3, {RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 3", "GC Shop Item 3"}}, - { RC_GC_SHOP_ITEM_4, {RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 4", "GC Shop Item 4"}}, - { RC_GC_SHOP_ITEM_5, {RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 5", "GC Shop Item 5"}}, - { RC_GC_SHOP_ITEM_6, {RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 6", "GC Shop Item 6"}}, - { RC_GC_SHOP_ITEM_7, {RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 7", "GC Shop Item 7"}}, - { RC_GC_SHOP_ITEM_8, {RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, false, "Shop Item 8", "GC Shop Item 8"}}, - { RC_COLOSSUS_GOSSIP_STONE, {RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, false, "Gossip Stone", "Colossus Gossip Stone"}}, - { RC_DMC_GOSSIP_STONE, {RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Gossip Stone", "DMC Gossip Stone"}}, - { RC_DMC_UPPER_GROTTO_GOSSIP_STONE, {RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, false, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"}}, - { RC_DMT_GOSSIP_STONE, {RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Gossip Stone", "DMT Gossip Stone"}}, - { RC_DMT_STORMS_GROTTO_GOSSIP_STONE, {RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, false, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"}}, - { RC_DODONGOS_CAVERN_GOSSIP_STONE, {RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, false, "Gossip Stone", "Dodongo's Cavern Gossip Stone"}}, - { RC_FAIRY_GOSSIP_STONE, {RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, false, "Fairy Gossip Stone", "Fairy Gossip Stone"}}, - { RC_GC_MAZE_GOSSIP_STONE, {RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, false, "Maze Gossip Stone", "GC Maze Gossip Stone"}}, - { RC_GC_MEDIGORON_GOSSIP_STONE, {RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, false, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"}}, - { RC_GV_GOSSIP_STONE, {RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, false, "Gossip Stone", "GV Gossip Stone"}}, - { RC_GY_GOSSIP_STONE, {RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, false, "Gossip Stone", "GY Gossip Stone"}}, - { RC_HC_MALON_GOSSIP_STONE, {RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, false, "Malon Gossip Stone", "HC Malon Gossip Stone"}}, - { RC_HC_ROCK_WALL_GOSSIP_STONE, {RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, false, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"}}, - { RC_HC_STORMS_GROTTO_GOSSIP_STONE, {RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, false, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"}}, - { RC_HF_COW_GROTTO_GOSSIP_STONE, {RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"}}, - { RC_HF_NEAR_MARKET_GOSSIP_STONE, {RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Near Market Gossip Stone", "HF Near Market Gossip Stone"}}, - { RC_HF_OPEN_GROTTO_GOSSIP_STONE, {RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"}}, - { RC_HF_SOUTHEAST_GOSSIP_STONE, {RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, false, "Southeast Gossip Stone", "HF Southeast Gossip Stone"}}, - { RC_JABU_GOSSIP_STONE, {RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, false, "Jabu Gossip Stone", "Jabu Gossip Stone"}}, - { RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, {RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"}}, - { RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, {RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"}}, - { RC_KF_GOSSIP_STONE, {RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Gossip Stone", "KF Gossip Stone"}}, - { RC_KF_STORMS_GOSSIP_STONE, {RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, false, "Storms Gossip Stone", "KF Storms Gossip Stone"}}, - { RC_KAK_OPEN_GROTTO_GOSSIP_STONE, {RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, false, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"}}, - { RC_LH_LAB_GOSSIP_STONE, {RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, false, "Lab Gossip Stone", "LH Lab Gossip Stone"}}, - { RC_LH_SOUTHEAST_GOSSIP_STONE, {RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, false, "Southeast Gossip Stone", "LH Southeast Gossip Stone"}}, - { RC_LH_SOUTHWEST_GOSSIP_STONE, {RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, false, "Southwest Gossip Stone", "LH Southwest Gossip Stone"}}, - { RC_LW_GOSSIP_STONE, {RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, false, "Gossip Stone", "LW Gossip Stone"}}, - { RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, false, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"}}, - { RC_SFM_MAZE_LOWER_GOSSIP_STONE, {RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, false, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"}}, - { RC_SFM_MAZE_UPPER_GOSSIP_STONE, {RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, false, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"}}, - { RC_SFM_SARIA_GOSSIP_STONE, {RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, false, "Saria Gossip Stone", "SFM Saria Gossip Stone"}}, - { RC_TOT_LEFT_CENTER_GOSSIP_STONE, {RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"}}, - { RC_TOT_LEFT_GOSSIP_STONE, {RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Left Gossip Stone", "ToT Left Gossip Stone"}}, - { RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"}}, - { RC_TOT_RIGHT_GOSSIP_STONE, {RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, false, "ToT Right Gossip Stone", "ToT Right Gossip Stone"}}, - { RC_ZD_GOSSIP_STONE, {RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, false, "Gossip Stone", "ZD Gossip Stone"}}, - { RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, {RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, false, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"}}, - { RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, {RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, false, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"}}, - { RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, false, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"}}, + RC_OBJECT_MAP_ENTRY(RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_INVALID, "Invalid Location", "Invalid Location"), + RC_OBJECT_MAP_ENTRY(RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"), + RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Right Chest", "KF Mido Top Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Storms Grotto Chest", "KF Storms Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Skull Kid", "LW Skull Kid"), + RC_OBJECT_MAP_ENTRY(RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Cojiro", "LW Trade Cojiro"), + RC_OBJECT_MAP_ENTRY(RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Odd Potion", "LW Trade Odd Potion"), + RC_OBJECT_MAP_ENTRY(RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Ocarina Memory Game", "LW Ocarina Memory Game"), + RC_OBJECT_MAP_ENTRY(RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Target in Woods", "LW Target in Woods"), + RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"), + RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"), + RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"), + RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"), + RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Skull Mask", "Deku Theater Skull Mask"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"), + RC_OBJECT_MAP_ENTRY(RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"), + RC_OBJECT_MAP_ENTRY(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"), + RC_OBJECT_MAP_ENTRY(RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Southeast Grotto Chest", "HF Southeast Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Open Grotto Chest", "HF Open Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Near Market Grotto Chest", "HF Near Market Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Ocarina of Time Item", "HF Ocarina of Time Item"), + RC_OBJECT_MAP_ENTRY(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Deku Scrub Grotto", "HF Deku Scrub Grotto"), + RC_OBJECT_MAP_ENTRY(RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Child Fishing", "LH Child Fishing"), + RC_OBJECT_MAP_ENTRY(RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Adult Fishing", "LH Adult Fishing"), + RC_OBJECT_MAP_ENTRY(RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Dive", "LH Lab Dive"), + RC_OBJECT_MAP_ENTRY(RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"), + RC_OBJECT_MAP_ENTRY(RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Underwater Item", "LH Underwater Item"), + RC_OBJECT_MAP_ENTRY(RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Sun", "LH Sun"), + RC_OBJECT_MAP_ENTRY(RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Freestanding PoH", "LH Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"), + RC_OBJECT_MAP_ENTRY(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"), + RC_OBJECT_MAP_ENTRY(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"), + RC_OBJECT_MAP_ENTRY(RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Chest", "GV Chest"), + RC_OBJECT_MAP_ENTRY(RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Trade Saw", "GV Trade Saw"), + RC_OBJECT_MAP_ENTRY(RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Crate Freestanding PoH", "GV Crate Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"), + RC_OBJECT_MAP_ENTRY(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"), + RC_OBJECT_MAP_ENTRY(RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "Chest", "GF Chest"), + RC_OBJECT_MAP_ENTRY(RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1000 Points", "GF HBA 1000 Points"), + RC_OBJECT_MAP_ENTRY(RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1500 Points", "GF HBA 1500 Points"), + RC_OBJECT_MAP_ENTRY(RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF Gerudo Membership Card", "GF Gerudo Membership Card"), + RC_OBJECT_MAP_ENTRY(RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F1 Carpenter", "GF North F1 Carpenter"), + RC_OBJECT_MAP_ENTRY(RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F2 Carpenter", "GF North F2 Carpenter"), + RC_OBJECT_MAP_ENTRY(RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F1 Carpenter", "GF South F1 Carpenter"), + RC_OBJECT_MAP_ENTRY(RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F2 Carpenter", "GF South F2 Carpenter"), + RC_OBJECT_MAP_ENTRY(RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Chest", "Wasteland Chest"), + RC_OBJECT_MAP_ENTRY(RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Carpet Salesman", "Wasteland Carpet Salesman"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Freestanding PoH", "Colossus Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Lost Dog", "MK Lost Dog"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Shooting Gallery", "MK Shooting Gallery"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "10 Big Poes", "MK 10 Big Poes"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game First Room Chest", "MK Chest Game First Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Malon Egg", "HC Malon Egg"), + RC_OBJECT_MAP_ENTRY(RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Zeldas Letter", "HC Zeldas Letter"), + RC_OBJECT_MAP_ENTRY(RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Redead Grotto Chest", "Kak Redead Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Chest", "Kak Open Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"), + RC_OBJECT_MAP_ENTRY(RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"), + RC_OBJECT_MAP_ENTRY(RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"), + RC_OBJECT_MAP_ENTRY(RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"), + RC_OBJECT_MAP_ENTRY(RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"), + RC_OBJECT_MAP_ENTRY(RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Man on Roof", "Kak Man on Roof"), + RC_OBJECT_MAP_ENTRY(RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"), + RC_OBJECT_MAP_ENTRY(RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"), + RC_OBJECT_MAP_ENTRY(RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Adult", "Kak Anju as Adult"), + RC_OBJECT_MAP_ENTRY(RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Child", "Kak Anju as Child"), + RC_OBJECT_MAP_ENTRY(RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"), + RC_OBJECT_MAP_ENTRY(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Shield Grave Chest", "GY Shield Grave Chest"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Composers Grave Chest", "GY Composers Grave Chest"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Hookshot Chest", "GY Hookshot Chest"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Freestanding PoH", "GY Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"), + RC_OBJECT_MAP_ENTRY(RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Chest", "DMT Chest"), + RC_OBJECT_MAP_ENTRY(RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Chest", "DMT Storms Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Broken Sword", "DMT Trade Broken Sword"), + RC_OBJECT_MAP_ENTRY(RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Eyedrops", "DMT Trade Eyedrops"), + RC_OBJECT_MAP_ENTRY(RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Claim Check", "DMT Trade Claim Check"), + RC_OBJECT_MAP_ENTRY(RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Freestanding PoH", "DMT Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Left Chest", "GC Maze Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Right Chest", "GC Maze Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Center Chest", "GC Maze Center Chest"), + RC_OBJECT_MAP_ENTRY(RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Child", "GC Rolling Goron as Child"), + RC_OBJECT_MAP_ENTRY(RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Adult", "GC Rolling Goron as Adult"), + RC_OBJECT_MAP_ENTRY(RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Darunias Joy", "GC Darunias Joy"), + RC_OBJECT_MAP_ENTRY(RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Pot Freestanding PoH", "GC Pot Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"), + RC_OBJECT_MAP_ENTRY(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"), + RC_OBJECT_MAP_ENTRY(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"), + RC_OBJECT_MAP_ENTRY(RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Medigoron", "GC Medigoron"), + RC_OBJECT_MAP_ENTRY(RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Chest", "DMC Upper Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub", "DMC Deku Scrub"), + RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"), + RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"), + RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"), + RC_OBJECT_MAP_ENTRY(RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Open Grotto Chest", "ZR Open Grotto Chest"), + RC_OBJECT_MAP_ENTRY(RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Magic Bean Salesman", "ZR Magic Bean Salesman"), + RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"), + RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Epona's Song", "ZR Frogs Epona's Song"), + RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Saria's Song", "ZR Frogs Saria's Song"), + RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Sun's Song", "ZR Frogs Sun's Song"), + RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Song of Time", "ZR Frogs Song of Time"), + RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs in the Rain", "ZR Frogs in the Rain"), + RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"), + RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"), + RC_OBJECT_MAP_ENTRY(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"), + RC_OBJECT_MAP_ENTRY(RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Chest", "ZD Chest"), + RC_OBJECT_MAP_ENTRY(RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Diving Minigame", "ZD Diving Minigame"), + RC_OBJECT_MAP_ENTRY(RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "King Zora Thawed", "ZD King Zora Thawed"), + RC_OBJECT_MAP_ENTRY(RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Trade Prescription", "ZD Trade Prescription"), + RC_OBJECT_MAP_ENTRY(RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Talons Chickens", "LLR Talons Chickens"), + RC_OBJECT_MAP_ENTRY(RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Freestanding PoH", "LLR Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"), + RC_OBJECT_MAP_ENTRY(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"), + RC_OBJECT_MAP_ENTRY(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Map Chest", "Deku Tree Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Compass Chest", "Deku Tree Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Basement Chest", "Deku Tree Basement Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Chest", "Deku Tree Slingshot Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Map Chest", "Deku Tree MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Compass Chest", "Deku Tree MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Basement Chest", "Deku Tree MQ Basement Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Map Chest", "Dodongos Cavern Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Compass Chest", "Dodongos Cavern Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Map Chest", "Jabu Jabus Belly Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Compass Chest", "Jabu Jabus Belly Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Room Chest", "Forest Temple First Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Stalfos Chest", "Forest Temple First Stalfos Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "Map Chest", "Forest Temple Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Well Chest", "Forest Temple Well Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Eye Switch Chest", "Forest Temple Eye Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Boss Key Chest", "Forest Temple Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Floormaster Chest", "Forest Temple Floormaster Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Bow Chest", "Forest Temple Bow Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Red Poe Chest", "Forest Temple Red Poe Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Blue Poe Chest", "Forest Temple Blue Poe Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Basement Chest", "Forest Temple Basement Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ First Room Chest", "Forest Temple MQ First Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Bow Chest", "Forest Temple MQ Bow Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Well Chest", "Forest Temple MQ Well Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Map Chest", "Forest Temple MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Compass Chest", "Forest Temple MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Basement Chest", "Forest Temple MQ Basement Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Redead Chest", "Forest Temple MQ Redead Chest"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Near Boss Chest", "Fire Temple Near Boss Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boss Key Chest", "Fire Temple Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Scarecrow Chest", "Fire Temple Scarecrow Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Map Chest", "Fire Temple Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Compass Chest", "Fire Temple Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Highest Goron Chest", "Fire Temple Highest Goron Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Compass Chest", "Fire Temple MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Map Chest", "Fire Temple MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Map Chest", "Water Temple Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Compass Chest", "Water Temple Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Torches Chest", "Water Temple Torches Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Dragon Chest", "Water Temple Dragon Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Pillar Chest", "Water Temple Central Pillar Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Boss Key Chest", "Water Temple Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Longshot Chest", "Water Temple Longshot Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "River Chest", "Water Temple River Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Compass Chest", "Water Temple MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Map Chest", "Water Temple MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Compass Chest", "Spirit Temple Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Map Chest", "Spirit Temple Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Boss Key Chest", "Spirit Temple Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Topmost Chest", "Spirit Temple Topmost Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Map Chest", "Spirit Temple MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Map Chest", "Shadow Temple Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Compass Chest", "Shadow Temple Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Boss Key Chest", "Shadow Temple Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Freestanding Key", "Shadow Temple Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Map Chest", "Shadow Temple MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Compass Chest", "Bottom of the Well Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Invisible Chest", "Bottom of the Well Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Map Chest", "Bottom of the Well Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Like Like Chest", "Bottom of the Well Like Like Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Freestanding Key", "Bottom of the Well Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Map Chest", "Bottom of the Well MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Map Chest", "Ice Cavern Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Compass Chest", "Ice Cavern Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Freestanding PoH", "Ice Cavern Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Map Chest", "Ice Cavern MQ Map Chest"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"), + RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Boss Key Chest", "Ganon's Tower Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"), + RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Back Room", "Deku Tree GS Basement Back Room"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Gate", "Deku Tree GS Basement Gate"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Vines", "Deku Tree GS Basement Vines"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Compass Room", "Deku Tree GS Compass Room"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Lobby", "Deku Tree MQ GS Lobby"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Back Room", "Dodongos Cavern GS Back Room"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS First Room", "Forest Temple GS First Room"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Lobby", "Forest Temple GS Lobby"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Basement", "Forest Temple GS Basement"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Well", "Forest Temple MQ GS Well"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Song of Time Room", "Fire Temple GS Song of Time Room"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boulder Maze", "Fire Temple GS Boulder Maze"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Behind Gate", "Water Temple GS Behind Gate"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Central Pillar", "Water Temple GS Central Pillar"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS River", "Water Temple GS River"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS River", "Water Temple MQ GS River"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Boulder Room", "Spirit Temple GS Boulder Room"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Lobby", "Spirit Temple GS Lobby"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Metal Fence", "Spirit Temple GS Metal Fence"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Like Like Room", "Shadow Temple GS Like Like Room"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Near Ship", "Shadow Temple GS Near Ship"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS East Inner Room", "Bottom of the Well GS East Inner Room"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS West Inner Room", "Bottom of the Well GS West Inner Room"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Basement", "Bottom of the Well MQ GS Basement"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"), + RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Push Block Room", "Ice Cavern GS Push Block Room"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"), + RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"), + RC_OBJECT_MAP_ENTRY(RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Bean Patch", "KF GS Bean Patch"), + RC_OBJECT_MAP_ENTRY(RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Know It All House", "KF GS Know It All House"), + RC_OBJECT_MAP_ENTRY(RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS House of Twins", "KF GS House of Twins"), + RC_OBJECT_MAP_ENTRY(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"), + RC_OBJECT_MAP_ENTRY(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"), + RC_OBJECT_MAP_ENTRY(RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Above Theater", "LW GS Above Theater"), + RC_OBJECT_MAP_ENTRY(RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, "GS", "SFM GS"), + RC_OBJECT_MAP_ENTRY(RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Cow Grotto", "HF GS Cow Grotto"), + RC_OBJECT_MAP_ENTRY(RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Near Kak Grotto", "HF GS Near Kak Grotto"), + RC_OBJECT_MAP_ENTRY(RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Bean Patch", "LH GS Bean Patch"), + RC_OBJECT_MAP_ENTRY(RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Small Island", "LH GS Small Island"), + RC_OBJECT_MAP_ENTRY(RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Wall", "LH GS Lab Wall"), + RC_OBJECT_MAP_ENTRY(RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Crate", "LH GS Lab Crate"), + RC_OBJECT_MAP_ENTRY(RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Tree", "LH GS Tree"), + RC_OBJECT_MAP_ENTRY(RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Bean Patch", "GV GS Bean Patch"), + RC_OBJECT_MAP_ENTRY(RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Small Bridge", "GV GS Small Bridge"), + RC_OBJECT_MAP_ENTRY(RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Pillar", "GV GS Pillar"), + RC_OBJECT_MAP_ENTRY(RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Behind Tent", "GV GS Behind Tent"), + RC_OBJECT_MAP_ENTRY(RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Archery Range", "GF GS Archery Range"), + RC_OBJECT_MAP_ENTRY(RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Top Floor", "GF GS Top Floor"), + RC_OBJECT_MAP_ENTRY(RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, "GS", "Wasteland GS"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Bean Patch", "Colossus GS Bean Patch"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Hill", "Colossus GS Hill"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Tree", "Colossus GS Tree"), + RC_OBJECT_MAP_ENTRY(RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "OGC GS", "OGC GS"), + RC_OBJECT_MAP_ENTRY(RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Storms Grotto", "HC GS Storms Grotto"), + RC_OBJECT_MAP_ENTRY(RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Tree", "HC GS Tree"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "Market GS Guard House", "Market GS Guard House"), + RC_OBJECT_MAP_ENTRY(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS House Under Construction", "Kak GS House Under Construction"), + RC_OBJECT_MAP_ENTRY(RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Skulltula House", "Kak GS Skulltula House"), + RC_OBJECT_MAP_ENTRY(RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Guards House", "Kak GS Guards House"), + RC_OBJECT_MAP_ENTRY(RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Tree", "Kak GS Tree"), + RC_OBJECT_MAP_ENTRY(RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Watchtower", "Kak GS Watchtower"), + RC_OBJECT_MAP_ENTRY(RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Above Impas House", "Kak GS Above Impas House"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Wall", "Graveyard GS Wall"), + RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Bean Patch", "Graveyard GS Bean Patch"), + RC_OBJECT_MAP_ENTRY(RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Bean Patch", "DMC GS Bean Patch"), + RC_OBJECT_MAP_ENTRY(RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Crate", "DMC GS Crate"), + RC_OBJECT_MAP_ENTRY(RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Bean Patch", "DMT GS Bean Patch"), + RC_OBJECT_MAP_ENTRY(RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Near Kak", "DMT GS Near Kak"), + RC_OBJECT_MAP_ENTRY(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"), + RC_OBJECT_MAP_ENTRY(RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"), + RC_OBJECT_MAP_ENTRY(RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Center Platform", "GC GS Center Platform"), + RC_OBJECT_MAP_ENTRY(RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Boulder Maze", "GC GS Boulder Maze"), + RC_OBJECT_MAP_ENTRY(RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Ladder", "ZR GS Ladder"), + RC_OBJECT_MAP_ENTRY(RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Tree", "ZR GS Tree"), + RC_OBJECT_MAP_ENTRY(RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Above Bridge", "ZR GS Above Bridge"), + RC_OBJECT_MAP_ENTRY(RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"), + RC_OBJECT_MAP_ENTRY(RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"), + RC_OBJECT_MAP_ENTRY(RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Above The Log", "ZF GS Above The Log"), + RC_OBJECT_MAP_ENTRY(RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Hidden Cave", "ZF GS Hidden Cave"), + RC_OBJECT_MAP_ENTRY(RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Tree", "ZF GS Tree"), + RC_OBJECT_MAP_ENTRY(RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Back Wall", "LLR GS Back Wall"), + RC_OBJECT_MAP_ENTRY(RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Rain Shed", "LLR GS Rain Shed"), + RC_OBJECT_MAP_ENTRY(RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS House Window", "LLR GS House Window"), + RC_OBJECT_MAP_ENTRY(RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Tree", "LLR GS Tree"), + RC_OBJECT_MAP_ENTRY(RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_LINKS_POCKET, RCAREA_KOKIRI_FOREST, "Link's Pocket", "Link's Pocket"), + RC_OBJECT_MAP_ENTRY(RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma", "Queen Gohma"), + RC_OBJECT_MAP_ENTRY(RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo", "King Dodongo"), + RC_OBJECT_MAP_ENTRY(RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade", "Barinade"), + RC_OBJECT_MAP_ENTRY(RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon", "Phantom Ganon"), + RC_OBJECT_MAP_ENTRY(RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia", "Volvagia"), + RC_OBJECT_MAP_ENTRY(RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha", "Morpha"), + RC_OBJECT_MAP_ENTRY(RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova", "Twinrova"), + RC_OBJECT_MAP_ENTRY(RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo", "Bongo Bongo"), + RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha Heart Container", "Water Temple Morpha Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"), + RC_OBJECT_MAP_ENTRY(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"), + RC_OBJECT_MAP_ENTRY(RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Gift From Saria", "LW Gift From Saria"), + RC_OBJECT_MAP_ENTRY(RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Great Fairy Reward", "ZF Great Fairy Reward"), + RC_OBJECT_MAP_ENTRY(RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Great Fairy Reward", "HC Great Fairy Reward"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Great Fairy Reward", "Colossus Great Fairy Reward"), + RC_OBJECT_MAP_ENTRY(RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Great Fairy Reward", "DMT Great Fairy Reward"), + RC_OBJECT_MAP_ENTRY(RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Great Fairy Reward", "DMC Great Fairy Reward"), + RC_OBJECT_MAP_ENTRY(RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "OGC Great Fairy Reward", "OGC Great Fairy Reward"), + RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Sheik in Forest", "Sheik in Forest"), + RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Sheik in Crater", "Sheik in Crater"), + RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Sheik in Ice Cavern", "Sheik in Ice Cavern"), + RC_OBJECT_MAP_ENTRY(RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Sheik at Colossus", "Sheik at Colossus"), + RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Sheik in Kakariko", "Sheik in Kakariko"), + RC_OBJECT_MAP_ENTRY(RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Sheik at Temple", "Sheik at Temple"), + RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Song from Impa", "Song from Impa"), + RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Song from Malon", "Song from Malon"), + RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Song from Saria", "Song from Saria"), + RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Song from Composers Grave", "Song from Composers Grave"), + RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Song from Ocarina of Time", "Song from Ocarina of Time"), + RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Song from Windmill", "Song from Windmill"), + RC_OBJECT_MAP_ENTRY(RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, "Links House Cow", "KF Links House Cow"), + RC_OBJECT_MAP_ENTRY(RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, "Cow Grotto Cow", "HF Cow Grotto Cow"), + RC_OBJECT_MAP_ENTRY(RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Left Cow", "LLR Stables Left Cow"), + RC_OBJECT_MAP_ENTRY(RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Right Cow", "LLR Stables Right Cow"), + RC_OBJECT_MAP_ENTRY(RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Left Cow", "LLR Tower Left Cow"), + RC_OBJECT_MAP_ENTRY(RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Right Cow", "LLR Tower Right Cow"), + RC_OBJECT_MAP_ENTRY(RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, "Impas House Cow", "Kak Impas House Cow"), + RC_OBJECT_MAP_ENTRY(RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, "Cow Grotto Cow", "DMT Cow Grotto Cow"), + RC_OBJECT_MAP_ENTRY(RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, "Cow", "GV Cow"), + RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, "MQ Cow", "Jabu Jabus Belly MQ Cow"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 1", "KF Shop Item 1"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 2", "KF Shop Item 2"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 3", "KF Shop Item 3"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 4", "KF Shop Item 4"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 5", "KF Shop Item 5"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 6", "KF Shop Item 6"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 7", "KF Shop Item 7"), + RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 8", "KF Shop Item 8"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 1", "Kak Potion Shop Item 1"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 2", "Kak Potion Shop Item 2"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 3", "Kak Potion Shop Item 3"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 4", "Kak Potion Shop Item 4"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 5", "Kak Potion Shop Item 5"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 6", "Kak Potion Shop Item 6"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 7", "Kak Potion Shop Item 7"), + RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 8", "Kak Potion Shop Item 8"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 1", "MK Potion Shop Item 1"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 2", "MK Potion Shop Item 2"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 3", "MK Potion Shop Item 3"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 4", "MK Potion Shop Item 4"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 5", "MK Potion Shop Item 5"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 6", "MK Potion Shop Item 6"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 7", "MK Potion Shop Item 7"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 8", "MK Potion Shop Item 8"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "MK Bazaar Item 1"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "MK Bazaar Item 2"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "MK Bazaar Item 3"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "MK Bazaar Item 4"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "MK Bazaar Item 5"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "MK Bazaar Item 6"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "MK Bazaar Item 7"), + RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "MK Bazaar Item 8"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 1", "Kak Bazaar Item 1"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 2", "Kak Bazaar Item 2"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 3", "Kak Bazaar Item 3"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 4", "Kak Bazaar Item 4"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 5", "Kak Bazaar Item 5"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 6", "Kak Bazaar Item 6"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 7", "Kak Bazaar Item 7"), + RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 8", "Kak Bazaar Item 8"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 1", "ZD Shop Item 1"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 2", "ZD Shop Item 2"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 3", "ZD Shop Item 3"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 4", "ZD Shop Item 4"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 5", "ZD Shop Item 5"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 6", "ZD Shop Item 6"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 7", "ZD Shop Item 7"), + RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 8", "ZD Shop Item 8"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 1", "GC Shop Item 1"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 2", "GC Shop Item 2"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 3", "GC Shop Item 3"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 4", "GC Shop Item 4"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 5", "GC Shop Item 5"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 6", "GC Shop Item 6"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 7", "GC Shop Item 7"), + RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 8", "GC Shop Item 8"), + RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, "Gossip Stone", "Colossus Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Gossip Stone", "DMC Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Gossip Stone", "DMT Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, "Gossip Stone", "Dodongo's Cavern Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Fairy Gossip Stone", "Fairy Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Maze Gossip Stone", "GC Maze Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, "Gossip Stone", "GV Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, "Gossip Stone", "GY Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Malon Gossip Stone", "HC Malon Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Near Market Gossip Stone", "HF Near Market Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Southeast Gossip Stone", "HF Southeast Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Jabu Gossip Stone", "Jabu Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Gossip Stone", "KF Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Storms Gossip Stone", "KF Storms Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Lab Gossip Stone", "LH Lab Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southeast Gossip Stone", "LH Southeast Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southwest Gossip Stone", "LH Southwest Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Gossip Stone", "LW Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Saria Gossip Stone", "SFM Saria Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Gossip Stone", "ToT Left Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Gossip Stone", "ToT Right Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, "Gossip Stone", "ZD Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"), + RC_OBJECT_MAP_ENTRY(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"), }; std::map rcAreas = { From 11a8dc85ee40bbb278d75d789b67af144ca425de Mon Sep 17 00:00:00 2001 From: briaguya Date: Thu, 18 Aug 2022 15:50:25 -0400 Subject: [PATCH 118/212] filter on one side, trees on both --- .../Enhancements/randomizer/randomizer.cpp | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 8d8d457ce..197ac5ed3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3735,9 +3735,6 @@ void DrawRandoEditor(bool& open) { RandomizerCheckObjects::UpdateImGuiVisibility(); } - static ImGuiTextFilter locationSearch; - locationSearch.Draw(); - if (ImGui::BeginTable("tableRandoLocations", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { ImGui::TableSetupColumn("Randomized", ImGuiTableColumnFlags_WidthStretch, 200.0f); @@ -3751,6 +3748,9 @@ void DrawRandoEditor(bool& open) { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; + static ImGuiTextFilter locationSearch; + locationSearch.Draw(); + ImGui::BeginChild("ChildRandomizedLocations"); for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { // todo fix this, it's hacky and copypasta @@ -3770,8 +3770,8 @@ void DrawRandoEditor(bool& open) { ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode(areaIt.second.c_str())) { for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { - if (!excludedLocations.count(locationIt.second.rc) && - locationIt.second.visibleInImgui && + if (locationIt.second.visibleInImgui && + !excludedLocations.count(locationIt.second.rc) && locationIt.second.rcArea == areaIt.first && locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { @@ -3793,14 +3793,37 @@ void DrawRandoEditor(bool& open) { window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::BeginChild("ChildVanillaLocations"); - for (auto it : SpoilerfileCheckNameToEnum) { - auto elfound = excludedLocations.find(it.second); - if (elfound != excludedLocations.end() && locationSearch.PassFilter(it.first.c_str())) { - if (ImGui::ArrowButton(std::to_string(it.second).c_str(), ImGuiDir_Left)) { - excludedLocations.erase(elfound); + for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { + // todo fix this, it's hacky and copypasta + bool hasItems = false; + for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { + if (locationIt.second.visibleInImgui && + excludedLocations.count(locationIt.second.rc) && + locationIt.second.rcArea == areaIt.first) { + + hasItems = true; + break; + } + } + + if (hasItems) { + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode(areaIt.second.c_str())) { + for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { + auto elfound = excludedLocations.find(locationIt.first); + if (locationIt.second.visibleInImgui && + elfound != excludedLocations.end() && + locationIt.second.rcArea == areaIt.first) { + + if (ImGui::ArrowButton(std::to_string(locationIt.first).c_str(), ImGuiDir_Left)) { + excludedLocations.erase(elfound); + } + ImGui::SameLine(); + ImGui::Text(locationIt.second.rcShortName.c_str()); + } + } + ImGui::TreePop(); } - ImGui::SameLine(); - ImGui::Text("%s", it.first.c_str()); } } ImGui::EndChild(); @@ -3808,7 +3831,6 @@ void DrawRandoEditor(bool& open) { ImGui::EndTable(); } ImGui::PopStyleVar(1); - PaddedSeparator(); ImGui::EndTabItem(); } else { locationsTabOpen = false; From 3db2ce708521a8fb2a2b5306474af0788ae91701 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 18 Aug 2022 22:06:28 -0400 Subject: [PATCH 119/212] Updates Zora's Sapphire Cutscene to use GetItemEntry --- soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index 5e2921729..8d81b41c4 100644 --- a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -2087,8 +2087,8 @@ void DemoEffect_DrawGetItem(Actor* thisx, GlobalContext* globalCtx) { return; } if (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) { - GetItemID getItemID = Randomizer_GetItemIdFromKnownCheck(RC_BARINADE, RG_ZORA_SAPPHIRE); - this->getItem.drawId = Randomizer_GetItemModelFromId(getItemID); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_BARINADE, RG_ZORA_SAPPHIRE); + this->getItem.drawId = getItemEntry.gid; } func_8002EBCC(thisx, globalCtx, 0); func_8002ED80(thisx, globalCtx, 0); From 7f62d00200a35388a97d2f005ed8f09f76c08c7a Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 04:53:35 -0400 Subject: [PATCH 120/212] fix double scrollbar issue --- soh/soh/Enhancements/randomizer/randomizer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 197ac5ed3..00c61f2d1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3751,7 +3751,7 @@ void DrawRandoEditor(bool& open) { static ImGuiTextFilter locationSearch; locationSearch.Draw(); - ImGui::BeginChild("ChildRandomizedLocations"); + ImGui::BeginChild("ChildRandomizedLocations", ImVec2(0, -8)); for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { // todo fix this, it's hacky and copypasta bool hasItems = false; @@ -3792,14 +3792,14 @@ void DrawRandoEditor(bool& open) { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::BeginChild("ChildVanillaLocations"); + ImGui::BeginChild("ChildVanillaLocations", ImVec2(0, -8)); for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { // todo fix this, it's hacky and copypasta bool hasItems = false; for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { if (locationIt.second.visibleInImgui && - excludedLocations.count(locationIt.second.rc) && - locationIt.second.rcArea == areaIt.first) { + locationIt.second.rcArea == areaIt.first && + excludedLocations.count(locationIt.second.rc)) { hasItems = true; break; @@ -3812,8 +3812,8 @@ void DrawRandoEditor(bool& open) { for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { auto elfound = excludedLocations.find(locationIt.first); if (locationIt.second.visibleInImgui && - elfound != excludedLocations.end() && - locationIt.second.rcArea == areaIt.first) { + locationIt.second.rcArea == areaIt.first && + elfound != excludedLocations.end()) { if (ImGui::ArrowButton(std::to_string(locationIt.first).c_str(), ImGuiDir_Left)) { excludedLocations.erase(elfound); From 252f5fe68aecc193d1bd830827342a5881291c1d Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Fri, 19 Aug 2022 03:59:06 -0500 Subject: [PATCH 121/212] Initial work towards cleaning up item tracker --- .../randomizer/randomizer_item_tracker.cpp | 1355 ++++------------- .../randomizer/randomizer_item_tracker.h | 30 + 2 files changed, 366 insertions(+), 1019 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index ed26e9078..8140a2dd4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -1,12 +1,15 @@ #include "randomizer_item_tracker.h" #include "../../util.h" #include "../libultraship/ImGuiImpl.h" +#include "../libultraship/Hooks.h" +#include "../libultraship/UltraController.h" #include #include #include #include #include +#include #include extern "C" { @@ -20,200 +23,71 @@ extern GlobalContext* gGlobalCtx; #include "textures/icon_item_24_static/icon_item_24_static.h" } -typedef struct { - uint32_t id; - std::string name; - std::string nameFaded; - std::string texturePath; -} ItemMapEntry; +void DrawEquip(ItemTrackerItem item); +void DrawItem(ItemTrackerItem item); +void DrawDungeonItem(ItemTrackerItem item); +void DrawBottle(ItemTrackerItem item); +void DrawQuest(ItemTrackerItem item); +void DrawUpgrade(ItemTrackerItem item); +void DrawSong(ItemTrackerItem item); -#define ITEM_MAP_ENTRY(id) \ - { \ - id, { \ - id, #id, #id "_Faded", static_cast(gItemIcons[id]) \ - } \ - } - -// Maps items ids to info for use in ImGui -std::map itemMappingSSS = { - ITEM_MAP_ENTRY(ITEM_STICK), - ITEM_MAP_ENTRY(ITEM_NUT), - ITEM_MAP_ENTRY(ITEM_BOMB), - ITEM_MAP_ENTRY(ITEM_BOW), - ITEM_MAP_ENTRY(ITEM_ARROW_FIRE), - ITEM_MAP_ENTRY(ITEM_DINS_FIRE), - ITEM_MAP_ENTRY(ITEM_SLINGSHOT), - ITEM_MAP_ENTRY(ITEM_OCARINA_FAIRY), - ITEM_MAP_ENTRY(ITEM_OCARINA_TIME), - ITEM_MAP_ENTRY(ITEM_BOMBCHU), - ITEM_MAP_ENTRY(ITEM_HOOKSHOT), - ITEM_MAP_ENTRY(ITEM_LONGSHOT), - ITEM_MAP_ENTRY(ITEM_ARROW_ICE), - ITEM_MAP_ENTRY(ITEM_FARORES_WIND), - ITEM_MAP_ENTRY(ITEM_BOOMERANG), - ITEM_MAP_ENTRY(ITEM_LENS), - ITEM_MAP_ENTRY(ITEM_BEAN), - ITEM_MAP_ENTRY(ITEM_HAMMER), - ITEM_MAP_ENTRY(ITEM_ARROW_LIGHT), - ITEM_MAP_ENTRY(ITEM_NAYRUS_LOVE), - ITEM_MAP_ENTRY(ITEM_BOTTLE), - ITEM_MAP_ENTRY(ITEM_POTION_RED), - ITEM_MAP_ENTRY(ITEM_POTION_GREEN), - ITEM_MAP_ENTRY(ITEM_POTION_BLUE), - ITEM_MAP_ENTRY(ITEM_FAIRY), - ITEM_MAP_ENTRY(ITEM_FISH), - ITEM_MAP_ENTRY(ITEM_MILK_BOTTLE), - ITEM_MAP_ENTRY(ITEM_LETTER_RUTO), - ITEM_MAP_ENTRY(ITEM_BLUE_FIRE), - ITEM_MAP_ENTRY(ITEM_BUG), - ITEM_MAP_ENTRY(ITEM_BIG_POE), - ITEM_MAP_ENTRY(ITEM_MILK_HALF), - ITEM_MAP_ENTRY(ITEM_POE), - ITEM_MAP_ENTRY(ITEM_WEIRD_EGG), - ITEM_MAP_ENTRY(ITEM_CHICKEN), - ITEM_MAP_ENTRY(ITEM_LETTER_ZELDA), - ITEM_MAP_ENTRY(ITEM_MASK_KEATON), - ITEM_MAP_ENTRY(ITEM_MASK_SKULL), - ITEM_MAP_ENTRY(ITEM_MASK_SPOOKY), - ITEM_MAP_ENTRY(ITEM_MASK_BUNNY), - ITEM_MAP_ENTRY(ITEM_MASK_GORON), - ITEM_MAP_ENTRY(ITEM_MASK_ZORA), - ITEM_MAP_ENTRY(ITEM_MASK_GERUDO), - ITEM_MAP_ENTRY(ITEM_MASK_TRUTH), - ITEM_MAP_ENTRY(ITEM_SOLD_OUT), - ITEM_MAP_ENTRY(ITEM_POCKET_EGG), - ITEM_MAP_ENTRY(ITEM_POCKET_CUCCO), - ITEM_MAP_ENTRY(ITEM_COJIRO), - ITEM_MAP_ENTRY(ITEM_ODD_MUSHROOM), - ITEM_MAP_ENTRY(ITEM_ODD_POTION), - ITEM_MAP_ENTRY(ITEM_SAW), - ITEM_MAP_ENTRY(ITEM_SWORD_BROKEN), - ITEM_MAP_ENTRY(ITEM_PRESCRIPTION), - ITEM_MAP_ENTRY(ITEM_FROG), - ITEM_MAP_ENTRY(ITEM_EYEDROPS), - ITEM_MAP_ENTRY(ITEM_CLAIM_CHECK), - ITEM_MAP_ENTRY(ITEM_BOW_ARROW_FIRE), - ITEM_MAP_ENTRY(ITEM_BOW_ARROW_ICE), - ITEM_MAP_ENTRY(ITEM_BOW_ARROW_LIGHT), - ITEM_MAP_ENTRY(ITEM_SWORD_KOKIRI), - ITEM_MAP_ENTRY(ITEM_SWORD_MASTER), - ITEM_MAP_ENTRY(ITEM_SWORD_BGS), - ITEM_MAP_ENTRY(ITEM_SHIELD_DEKU), - ITEM_MAP_ENTRY(ITEM_SHIELD_HYLIAN), - ITEM_MAP_ENTRY(ITEM_SHIELD_MIRROR), - ITEM_MAP_ENTRY(ITEM_TUNIC_KOKIRI), - ITEM_MAP_ENTRY(ITEM_TUNIC_GORON), - ITEM_MAP_ENTRY(ITEM_TUNIC_ZORA), - ITEM_MAP_ENTRY(ITEM_BOOTS_KOKIRI), - ITEM_MAP_ENTRY(ITEM_BOOTS_IRON), - ITEM_MAP_ENTRY(ITEM_BOOTS_HOVER), - ITEM_MAP_ENTRY(ITEM_BULLET_BAG_30), - ITEM_MAP_ENTRY(ITEM_BULLET_BAG_40), - ITEM_MAP_ENTRY(ITEM_BULLET_BAG_50), - ITEM_MAP_ENTRY(ITEM_QUIVER_30), - ITEM_MAP_ENTRY(ITEM_QUIVER_40), - ITEM_MAP_ENTRY(ITEM_QUIVER_50), - ITEM_MAP_ENTRY(ITEM_BOMB_BAG_20), - ITEM_MAP_ENTRY(ITEM_BOMB_BAG_30), - ITEM_MAP_ENTRY(ITEM_BOMB_BAG_40), - ITEM_MAP_ENTRY(ITEM_BRACELET), - ITEM_MAP_ENTRY(ITEM_GAUNTLETS_SILVER), - ITEM_MAP_ENTRY(ITEM_GAUNTLETS_GOLD), - ITEM_MAP_ENTRY(ITEM_SCALE_SILVER), - ITEM_MAP_ENTRY(ITEM_SCALE_GOLDEN), - ITEM_MAP_ENTRY(ITEM_SWORD_KNIFE), - ITEM_MAP_ENTRY(ITEM_WALLET_ADULT), - ITEM_MAP_ENTRY(ITEM_WALLET_GIANT), - ITEM_MAP_ENTRY(ITEM_SEEDS), - ITEM_MAP_ENTRY(ITEM_FISHING_POLE), - ITEM_MAP_ENTRY(ITEM_KEY_BOSS), - ITEM_MAP_ENTRY(ITEM_COMPASS), - ITEM_MAP_ENTRY(ITEM_DUNGEON_MAP), - ITEM_MAP_ENTRY(ITEM_KEY_SMALL), +OSContPad* buttonsPressed; +std::vector inventoryItems = { + ITEM_TRACKER_ITEM(ITEM_STICK, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NUT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMB, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOW, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_FIRE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_DINS_FIRE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_SLINGSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMBCHU, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_ICE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_FARORES_WIND, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOOMERANG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_LENS, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BEAN, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HAMMER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_LIGHT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NAYRUS_LOVE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 1, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 2, DrawBottle), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 3, DrawBottle), ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem), }; -// Maps entries in the GS flag array to the area name it represents - -std::vector gsMappingSSS = { - "Deku Tree", - "Dodongo's Cavern", - "Inside Jabu-Jabu's Belly", - "Forest Temple", - "Fire Temple", - "Water Temple", - "Spirit Temple", - "Shadow Temple", - "Bottom of the Well", - "Ice Cavern", - "Hyrule Field", - "Lon Lon Ranch", - "Kokiri Forest", - "Lost Woods, Sacred Forest Meadow", - "Castle Town and Ganon's Castle", - "Death Mountain Trail, Goron City", - "Kakariko Village", - "Zora Fountain, River", - "Lake Hylia", - "Gerudo Valley", - "Gerudo Fortress", - "Desert Colossus, Haunted Wasteland", +std::vector equipmentItems = { + ITEM_TRACKER_ITEM(ITEM_SWORD_KOKIRI, 1 << 0, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_MASTER, 1 << 1, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_BGS, 1 << 2, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_TUNIC_KOKIRI, 1 << 8, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_GORON, 1 << 9, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_ZORA, 1 << 10, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SHIELD_DEKU, 1 << 4, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_HYLIAN, 1 << 5, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_MIRROR, 1 << 6, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_BOOTS_KOKIRI, 1 << 12, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_IRON, 1 << 13, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_HOVER, 1 << 14, DrawEquip), }; -extern "C" u8 gAreaGsFlags[]; - -extern "C" u8 gAmmoItems[]; - -// Modification of gAmmoItems that replaces ITEM_NONE with the item in inventory slot it represents -u8 gAllAmmoItemsSSS[] = { - ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE, - ITEM_SLINGSHOT, ITEM_OCARINA_TIME, ITEM_BOMBCHU, ITEM_LONGSHOT, ITEM_ARROW_ICE, ITEM_FARORES_WIND, - ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER, +std::vector miscItems = { + ITEM_TRACKER_ITEM(UPG_STRENGTH, 0, DrawUpgrade), ITEM_TRACKER_ITEM(UPG_SCALE, 0, DrawUpgrade), ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HEART_CONTAINER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM(QUEST_STONE_OF_AGONY, 1 << 21, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_GERUDO_CARD, 1 << 22, DrawQuest), ITEM_TRACKER_ITEM(QUEST_SKULL_TOKEN, 1 << 23, DrawQuest), }; -// Encapsulates what is drawn by the passed-in function within a border -template void DrawGroupWithBorder(T&& drawFunc) { - // First group encapsulates the inner portion and border - ImGui::BeginGroup(); +std::vector dungeonRewardStones = { + ITEM_TRACKER_ITEM(QUEST_KOKIRI_EMERALD, 1 << 18, DrawQuest), ITEM_TRACKER_ITEM(QUEST_GORON_RUBY, 1 << 19, DrawQuest), ITEM_TRACKER_ITEM(QUEST_ZORA_SAPPHIRE, 1 << 20, DrawQuest), +}; - ImVec2 padding = ImGui::GetStyle().FramePadding; - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y)); +std::vector dungeonRewardMedallions = { + ITEM_TRACKER_ITEM(QUEST_MEDALLION_FOREST, 1 << 0, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_FIRE, 1 << 1, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_WATER, 1 << 2, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_SPIRIT, 1 << 3, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_SHADOW, 1 << 4, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_LIGHT, 1 << 5, DrawQuest), +}; - // Second group encapsulates just the inner portion - ImGui::BeginGroup(); +std::vector songItems = { + ITEM_TRACKER_ITEM(QUEST_SONG_LULLABY, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_EPONA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SARIA, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_SUN, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_TIME, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_STORMS, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_MINUET, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_BOLERO, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SERENADE, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_REQUIEM, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_NOCTURNE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_PRELUDE, 0, DrawSong), +}; - drawFunc(); - - ImGui::Dummy(padding); - ImGui::EndGroup(); - - ImVec2 p1 = ImGui::GetItemRectMax(); - p1.x += padding.x; - ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border]; - ImGui::GetWindowDrawList()->AddRect( - p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255)); - - ImGui::EndGroup(); -} - -char z2ASCIISSS(int code) { - int ret; - if (code < 10) { // Digits - ret = code + 0x30; - } else if (code >= 10 && code < 36) { // Uppercase letters - ret = code + 0x37; - } else if (code >= 36 && code < 62) { // Lowercase letters - ret = code + 0x3D; - } else if (code == 62) { // Space - ret = code - 0x1E; - } else if (code == 63 || code == 64) { // _ and . - ret = code - 0x12; - } else { - ret = code; - } - return char(ret); -} +std::vector itemTrackerDungeons = { + ITEM_TRACKER_DUNGEON(SCENE_BMORI1, "FRST", true, true, true, true), + ITEM_TRACKER_DUNGEON(SCENE_HIDAN, "FIRE", true, true, true, true), + ITEM_TRACKER_DUNGEON(SCENE_MIZUSIN, "WATR", true, true, true, true), + ITEM_TRACKER_DUNGEON(SCENE_JYASINZOU, "SPIR", true, true, true, true), + ITEM_TRACKER_DUNGEON(SCENE_HAKADAN, "SHAD", true, true, true, true), + ITEM_TRACKER_DUNGEON(SCENE_HAKADANCH, "BOTW", true, true, false, true), + ITEM_TRACKER_DUNGEON(SCENE_YDAN, "DEKU", true, true, false, false), + ITEM_TRACKER_DUNGEON(SCENE_DDAN, "DODO", true, true, false, false), + ITEM_TRACKER_DUNGEON(SCENE_BDAN, "JABU", true, true, false, false), + ITEM_TRACKER_DUNGEON(SCENE_ICE_DOUKUTO, "ICE", true, true, false, false), + ITEM_TRACKER_DUNGEON(SCENE_GANON, "GAN", false, false, true, true), + ITEM_TRACKER_DUNGEON(SCENE_MEN, "GTG", false, false, false, true), + ITEM_TRACKER_DUNGEON(SCENE_GERUDOWAY, "HIDE", false, false, false, true), +}; typedef struct { uint32_t id; @@ -229,47 +103,25 @@ typedef struct { } \ } -std::unordered_map equipTrackerMap = { - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_KOKIRI, 0), ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_MASTER, 1), - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BGS, 2), ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BROKEN, 3), - ITEM_TRACKER_MAP_ENTRY(ITEM_SHIELD_DEKU, 4), ITEM_TRACKER_MAP_ENTRY(ITEM_SHIELD_HYLIAN, 5), - ITEM_TRACKER_MAP_ENTRY(ITEM_SHIELD_MIRROR, 6), ITEM_TRACKER_MAP_ENTRY(ITEM_TUNIC_KOKIRI, 8), - ITEM_TRACKER_MAP_ENTRY(ITEM_TUNIC_GORON, 9), ITEM_TRACKER_MAP_ENTRY(ITEM_TUNIC_ZORA, 10), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOOTS_KOKIRI, 12), ITEM_TRACKER_MAP_ENTRY(ITEM_BOOTS_IRON, 13), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOOTS_HOVER, 14), -}; - bool IsValidSaveFile() { bool validSave = gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2; return validSave; } -void DrawEquip(uint32_t itemId) { - const ItemTrackerMapEntry& entry = equipTrackerMap[itemId]; - bool hasEquip = (entry.bitMask & gSaveContext.inventory.equipment) != 0; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - ImGui::Image(SohImGui::GetTextureByName(hasEquip && IsValidSaveFile() ? entry.name : entry.nameFaded), +void DrawEquip(ItemTrackerItem item) { + bool hasEquip = (item.data & gSaveContext.inventory.equipment) != 0; + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + ImGui::Image(SohImGui::GetTextureByName(hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + SetLastItemHoverText(SohUtils::GetItemName(item.id)); } -std::unordered_map questTrackerMap = { - ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_FOREST, 0), ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_FIRE, 1), - ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_WATER, 2), ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_SPIRIT, 3), - ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_SHADOW, 4), ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_LIGHT, 5), - ITEM_TRACKER_MAP_ENTRY(QUEST_KOKIRI_EMERALD, 18), ITEM_TRACKER_MAP_ENTRY(QUEST_GORON_RUBY, 19), - ITEM_TRACKER_MAP_ENTRY(QUEST_ZORA_SAPPHIRE, 20), ITEM_TRACKER_MAP_ENTRY(QUEST_STONE_OF_AGONY, 21), - ITEM_TRACKER_MAP_ENTRY(QUEST_GERUDO_CARD, 22), ITEM_TRACKER_MAP_ENTRY(QUEST_SKULL_TOKEN, 23), - -}; - -void DrawQuest(uint32_t itemId) { - const ItemTrackerMapEntry& entry = questTrackerMap[itemId]; - bool hasQuestItem = (entry.bitMask & gSaveContext.inventory.questItems) != 0; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); +void DrawQuest(ItemTrackerItem item) { + bool hasQuestItem = (item.data & gSaveContext.inventory.questItems) != 0; + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); ImGui::BeginGroup(); - ImGui::Image(SohImGui::GetTextureByName(hasQuestItem && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); ImVec2 p = ImGui::GetCursorScreenPos(); @@ -277,7 +129,7 @@ void DrawQuest(uint32_t itemId) { int estimatedTextHeight = 10; ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); - if (entry.name == "QUEST_SKULL_TOKEN") { + if (item.name == "QUEST_SKULL_TOKEN") { if (gSaveContext.inventory.gsTokens == 0) { ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); ImGui::Text("%i", gSaveContext.inventory.gsTokens); @@ -293,7 +145,7 @@ void DrawQuest(uint32_t itemId) { ImGui::EndGroup(); - SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); + SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); }; std::unordered_map itemTrackerMap = { @@ -403,8 +255,18 @@ std::unordered_map itemTrackerMap = { ITEM_TRACKER_MAP_ENTRY(ITEM_KEY_BOSS, 0) }; -void DrawItem(uint32_t itemId) { +void DrawItem(ItemTrackerItem item) { + uint32_t itemId = item.id; uint32_t actualItemId = INV_CONTENT(itemId); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + + if (itemId == ITEM_NONE) { + ImGui::BeginGroup(); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - 10, p.y - 10)); + ImGui::EndGroup(); + return; + } if (itemId == ITEM_HEART_CONTAINER) { actualItemId = itemId; @@ -453,7 +315,6 @@ void DrawItem(uint32_t itemId) { } const ItemTrackerMapEntry& entry = itemTrackerMap[hasItem && IsValidSaveFile() ? actualItemId : itemId]; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); ImGui::BeginGroup(); ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), @@ -685,30 +546,30 @@ void DrawItemAmmo(int itemId) { } } -void DrawBottle(uint32_t itemId, uint32_t bottleSlot) { - uint32_t actualItemId = gSaveContext.inventory.items[SLOT(itemId) + bottleSlot]; +void DrawBottle(ItemTrackerItem item) { + uint32_t actualItemId = gSaveContext.inventory.items[SLOT(item.id) + item.data]; bool hasItem = actualItemId != ITEM_NONE; - const ItemTrackerMapEntry& entry = itemTrackerMap[hasItem && IsValidSaveFile() ? actualItemId : itemId]; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); + const ItemTrackerMapEntry& entry = itemTrackerMap[hasItem && IsValidSaveFile() ? actualItemId : item.id]; + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); SetLastItemHoverText(SohUtils::GetItemName(entry.id)); }; -void DrawDungeonItem(uint32_t itemId, uint32_t scene) { - const ItemTrackerMapEntry& entry = itemTrackerMap[itemId]; - uint32_t bitMask = 1 << (entry.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[scene]) != 0; - bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[scene]) >= 0; +void DrawDungeonItem(ItemTrackerItem item) { + uint32_t itemId = item.id; + uint32_t bitMask = 1 << (item.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[item.data]) != 0; + bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[item.data]) >= 0; ImGui::BeginGroup(); if (itemId == ITEM_KEY_SMALL) { - ImGui::Image(SohImGui::GetTextureByName(hasSmallKey && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } else { - ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } @@ -718,18 +579,18 @@ void DrawDungeonItem(uint32_t itemId, uint32_t scene) { ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); if (itemId == ITEM_KEY_SMALL) { // This check there for small key is necessary to get the text position properly and can't be on the same ITEM_KEY chack from the top - if (gSaveContext.inventory.dungeonKeys[scene] <= 0 || !IsValidSaveFile()) { + if (gSaveContext.inventory.dungeonKeys[item.data] <= 0 || !IsValidSaveFile()) { ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); ImGui::Text("0"); ImGui::PopStyleColor(); } else { - ImGui::Text("%i", gSaveContext.inventory.dungeonKeys[scene]); + ImGui::Text("%i", gSaveContext.inventory.dungeonKeys[item.data]); } } ImGui::EndGroup(); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + SetLastItemHoverText(SohUtils::GetItemName(item.id)); } typedef struct { @@ -774,8 +635,9 @@ std::unordered_map> upgradeTracker }; -void DrawUpgrade(int32_t categoryId) { - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); +void DrawUpgrade(ItemTrackerItem item) { + uint32_t categoryId = item.id; + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); if (CUR_UPG_VALUE(categoryId) == 0 || !IsValidSaveFile()) { const ItemTrackerUpgradeEntry& entry = upgradeTrackerMap[categoryId][0]; ImGui::Image(SohImGui::GetTextureByName(entry.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), @@ -788,622 +650,13 @@ void DrawUpgrade(int32_t categoryId) { } } -typedef struct { - uint32_t id; - std::string name; - std::string nameFaded; - ImVec4 color; -} ItemTrackerSongEntry; - -#define ITEM_TRACKER_SONG_ENTRY(id) \ - { \ - id, { \ - id, #id, #id "_Faded" \ - } \ - } - -// Maps song ids to info for use in ImGui -std::unordered_map songTrackerMap = { - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_LULLABY), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_EPONA), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SARIA), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SUN), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_TIME), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_STORMS), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_MINUET), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_BOLERO), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SERENADE), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_REQUIEM), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_NOCTURNE), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_PRELUDE), -}; - -#define VANILLA_ITEM_TRACKER_SONG_ENTRY(id) \ - { \ - id, { \ - id, #id "_Vanilla", #id "_Vanilla_Faded" \ - } \ - } - -// Maps song ids to info for use in ImGui -std::unordered_map vanillaSongTrackerMap = { - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_LULLABY), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_EPONA), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SARIA), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SUN), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_TIME), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_STORMS), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_MINUET), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_BOLERO), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SERENADE), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_REQUIEM), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_NOCTURNE), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_PRELUDE), -}; - -void DrawSong(int32_t songId) { - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - const ItemTrackerSongEntry& entry = - CVar_GetS32("gItemTrackeSongColor", 0) ? songTrackerMap[songId] : vanillaSongTrackerMap[songId]; - uint32_t bitMask = 1 << entry.id; +void DrawSong(ItemTrackerItem item) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + uint32_t bitMask = 1 << item.id; bool hasSong = (bitMask & gSaveContext.inventory.questItems) != 0; - ImGui::Image(SohImGui::GetTextureByName(hasSong && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasSong && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); -} - -// Theme 1 Original Tracker style -void DrawFloatingInventory(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawItem(ITEM_STICK); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_NUT); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_BOMB); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_BOW); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_ARROW_FIRE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_DINS_FIRE); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawItem(ITEM_SLINGSHOT); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_OCARINA_FAIRY); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_BOMBCHU); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_HOOKSHOT); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_ARROW_ICE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_FARORES_WIND); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawItem(ITEM_BOOMERANG); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_LENS); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_BEAN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_HAMMER); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_ARROW_LIGHT); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_NAYRUS_LOVE); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawBottle(ITEM_BOTTLE, 0); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawBottle(ITEM_BOTTLE, 1); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawBottle(ITEM_BOTTLE, 2); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawBottle(ITEM_BOTTLE, 3); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_POCKET_EGG); // ADULT TRADE - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_MASK_KEATON); // CHILD TRADE - ImGui::EndGroup(); -} -void DrawFloatingEquipsQuestUpgradeStones(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawEquip(ITEM_SWORD_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SWORD_MASTER); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SWORD_BGS); // PURPLE TODO: CHECK IF BGS OR BROKEN SWORD TO DISPLAY - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawQuest(QUEST_STONE_OF_AGONY); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawQuest(QUEST_GERUDO_CARD); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawQuest(QUEST_SKULL_TOKEN); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_SHIELD_DEKU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SHIELD_HYLIAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SHIELD_MIRROR); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawUpgrade(UPG_STRENGTH); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawUpgrade(UPG_SCALE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_WALLET_ADULT); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_TUNIC_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_TUNIC_GORON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_TUNIC_ZORA); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_HEART_CONTAINER); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_MAGIC_SMALL); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_BOOTS_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_BOOTS_IRON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_BOOTS_HOVER); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawQuest(QUEST_KOKIRI_EMERALD); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawQuest(QUEST_GORON_RUBY); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawQuest(QUEST_ZORA_SAPPHIRE); - ImGui::EndGroup(); -} -void DrawFloatingTokens(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerTheme", 0) == 0 || !CVar_GetS32("gItemTrackerMedallionsPlacement", 0)) { - DrawQuest(QUEST_MEDALLION_FOREST); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawQuest(QUEST_MEDALLION_FIRE); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_MEDALLION_WATER); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawQuest(QUEST_MEDALLION_SPIRIT); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawQuest(QUEST_MEDALLION_SHADOW); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawQuest(QUEST_MEDALLION_LIGHT); - } else if (CVar_GetS32("gItemTrackerTheme", 0) != 0 && CVar_GetS32("gItemTrackerMedallionsPlacement", 0)) { - ImGui::BeginGroup(); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 1); - DrawQuest(QUEST_MEDALLION_LIGHT); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawQuest(QUEST_MEDALLION_SHADOW); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_MEDALLION_FOREST); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawQuest(QUEST_MEDALLION_SPIRIT); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_MEDALLION_FIRE); - ImGui::EndGroup(); - ImGui::BeginGroup(); - ImGui::NewLine(); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 1); - DrawQuest(QUEST_MEDALLION_WATER); - ImGui::EndGroup(); - } - ImGui::EndGroup(); -} - -void DrawFloatingSongs(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawSong(QUEST_SONG_LULLABY); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawSong(QUEST_SONG_EPONA); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawSong(QUEST_SONG_SARIA); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawSong(QUEST_SONG_SUN); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawSong(QUEST_SONG_TIME); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawSong(QUEST_SONG_STORMS); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawSong(QUEST_SONG_MINUET); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawSong(QUEST_SONG_BOLERO); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawSong(QUEST_SONG_SERENADE); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawSong(QUEST_SONG_REQUIEM); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawSong(QUEST_SONG_NOCTURNE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawSong(QUEST_SONG_PRELUDE); - ImGui::EndGroup(); -} - -// Theme 2 per cells elements -void DrawFloatingEquipments(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawEquip(ITEM_SWORD_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SWORD_MASTER); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SWORD_BGS); // PURPLE TODO: CHECK IF BGS OR BROKEN SWORD TO DISPLAY - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_SHIELD_DEKU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SHIELD_HYLIAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SHIELD_MIRROR); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_TUNIC_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_TUNIC_GORON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_TUNIC_ZORA); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_BOOTS_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_BOOTS_IRON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_BOOTS_HOVER); - ImGui::EndGroup(); -} - -void DrawFloatingUpgrades(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawUpgrade(UPG_STRENGTH); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawUpgrade(UPG_SCALE); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_WALLET_ADULT); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawItem(ITEM_HEART_CONTAINER); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_MAGIC_SMALL); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::EndGroup(); -} - -void DrawFloatingQuest(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawQuest(QUEST_STONE_OF_AGONY); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawQuest(QUEST_GERUDO_CARD); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_SKULL_TOKEN); - ImGui::EndGroup(); -} - -void DrawFloatingStones(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawQuest(QUEST_KOKIRI_EMERALD); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawQuest(QUEST_GORON_RUBY); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_ZORA_SAPPHIRE); - ImGui::EndGroup(); -} - -void DrawFloatingDungeons(int Icon_Cells_Size, int Icon_Spacing) { - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::Text("DEKU"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("DCVN"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("JABU"); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::Text("FRST"); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - ImGui::Text("FIRE"); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::Text("WATR"); - } - else { - ImGui::Text("FRST"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("FIRE"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("WATR"); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::Text("SPRT"); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - ImGui::Text("SHDW"); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::Text("GANON"); - } - ImGui::EndGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_YDAN); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_DDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_BDAN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_MIZUSIN); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_COMPASS, SCENE_YDAN); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_COMPASS, SCENE_DDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_COMPASS, SCENE_BDAN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_COMPASS, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_COMPASS, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_COMPASS, SCENE_MIZUSIN); - ImGui::EndGroup(); - } - // SMALL KEYS FOR DEKU TREE TO WATER TEMPLE - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::NewLine(); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MIZUSIN); - ImGui::EndGroup(); - // BOSS KEYS FOR DEKU TREE TO WATER TEMPLE - ImGui::BeginGroup(); - ImGui::NewLine(); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_MIZUSIN); - } else { - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing ); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MIZUSIN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size *4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_GANONTIKA); - ImGui::EndGroup(); - // BOSS KEYS FOR FOREST TO GANON - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_MIZUSIN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size *4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_GANON); - } - ImGui::EndGroup(); - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::Text("SPRT"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("SHDW"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("BOTW"); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::Text("ICE"); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - ImGui::Text("GTG"); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::Text("GANON"); - } else { - ImGui::Text("BOTW"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("HIDE"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("GTG"); - } - ImGui::EndGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_HAKADANCH); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_ICE_DOUKUTO); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MEN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_GANONTIKA); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_COMPASS, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_COMPASS, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_COMPASS, SCENE_HAKADANCH); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_COMPASS, SCENE_ICE_DOUKUTO); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_GANON); - ImGui::EndGroup(); - } - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADANCH); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HAKADAN); - } else { - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADANCH); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_GERUDOWAY); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MEN); - } - ImGui::EndGroup(); - } + SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); } void DrawFloatingNotes(int Icon_Cells_Size, int Icon_Spacing) { @@ -1439,17 +692,16 @@ void DrawFloatingNotes(int Icon_Cells_Size, int Icon_Spacing) { } // Windowing stuff -ImVec4 ChromaKeyBackground = { 0, 0, 0, 1 }; // Float value, 1 = 255 in rgb value. +ImVec4 ChromaKeyBackground = { 0, 0, 0, 0 }; // Float value, 1 = 255 in rgb value. void BeginFloatingWindows(std::string UniqueName) { - ImGuiWindowFlags FloatingWndFlags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | - ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | - ImGuiWindowFlags_NoScrollbar; - if (!CVar_GetS32("gItemTrackerHudEditMode", 0)) { - FloatingWndFlags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoDecoration | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; + ImGuiWindowFlags FloatingWndFlags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; + + if (!CVar_GetS32("gItemTrackerWindowType", 0)) { + FloatingWndFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; + + if (!CVar_GetS32("gItemTrackerHudEditMode", 0)) { + FloatingWndFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; + } } ImGui::PushStyleColor(ImGuiCol_WindowBg, ChromaKeyBackground); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); @@ -1461,102 +713,165 @@ void EndFloatingWindows() { ImGui::End(); } +/** + * DrawItemsInRows + * Takes in a vector of ItemTrackerItem and draws them in rows of N items + */ +void DrawItemsInRows(std::vector items, int columns = 6) { + int Icon_Cells_Size = CVar_GetS32("gItemTrackerIconSize", 32); + int Icon_Spacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + for (int i = 0; i < items.size(); i++) { + if (i % columns == 0) { + ImGui::BeginGroup(); + } else { + ImGui::SameLine(Icon_Cells_Size * (i % columns)); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * (i % columns)); + } + items[i].drawFunc(items[i]); + if (i % columns == columns - 1) { + ImGui::EndGroup(); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); + } + } + if (items.size() % columns != 0) { + ImGui::EndGroup(); + } +} + +/** + * DrawDungeons + * Loops over dungeons and creates vectors of items in the correct order + * to then call DrawItemsInRows + */ +void DrawDungeons(std::vector dungeons, int columns = 6) { + int Icon_Cells_Size = CVar_GetS32("gItemTrackerIconSize", 32); + int Icon_Spacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + std::vector dungeonItems = {}; + + if (!CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 0)) { + dungeons.erase(std::remove_if(dungeons.begin(), dungeons.end(), [](ItemTrackerDungeon d) { return !d.hasBossKey && !d.hasSmallKey; }), dungeons.end()); + } + + ImGui::BeginGroup(); + ImGui::NewLine(); + for (int i = 0; i < MIN(dungeons.size(), columns); i++) { + ImGui::SameLine(Icon_Cells_Size * i); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * i); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (Icon_Cells_Size / 2) - 10, p.y - 4)); + ImGui::Text(dungeons[i].shortName.c_str()); + } + ImGui::EndGroup(); + for (int i = 0; i < MIN(dungeons.size(), columns); i++) { + if (dungeons[i].hasSmallKey) { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[i].id, DrawDungeonItem)); + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + } + for (int i = 0; i < MIN(dungeons.size(), columns); i++) { + if (dungeons[i].hasBossKey) { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, dungeons[i].id, DrawDungeonItem)); + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + } + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 0)) { + for (int i = 0; i < MIN(dungeons.size(), columns); i++) { + if (dungeons[i].hasMap) { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_DUNGEON_MAP, dungeons[i].id, DrawDungeonItem)); + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + } + for (int i = 0; i < MIN(dungeons.size(), columns); i++) { + if (dungeons[i].hasCompass) { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_COMPASS, dungeons[i].id, DrawDungeonItem)); + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + } + } + DrawItemsInRows(dungeonItems, MIN(dungeons.size(), columns)); + + if (dungeons.size() > columns) { + DrawDungeons(std::vector(dungeons.begin() + columns, dungeons.end()), columns); + } +} + void DrawItemTracker(bool& open) { if (!open) { - CVar_SetS32("gItemTrackerEnabled", 0); return; } - int Icon_Cells_Size = CVar_GetS32("gRandoTrackIconSize", 0); - int Icon_Spacing = CVar_GetS32("gRandoTrackIconSpacing", 0); + int Icon_Cells_Size = CVar_GetS32("gItemTrackerIconSize", 32); + int Icon_Spacing = CVar_GetS32("gItemTrackerIconSpacing", 0); - if (CVar_GetS32("gItemTrackerEnabled", 0)) { - int ImGui_DefaultMargin = 0; - if (CVar_GetS32("gItemTrackerTheme", 0) == 0) { // One block tracker, original tracker style - BeginFloatingWindows("ItemTracker_Theme_0_Grouped"); - DrawFloatingInventory(Icon_Cells_Size, Icon_Spacing); - DrawFloatingEquipsQuestUpgradeStones(Icon_Cells_Size, Icon_Spacing); - DrawFloatingTokens(Icon_Cells_Size, Icon_Spacing); - DrawFloatingSongs(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - BeginFloatingWindows("ItemTracker_Theme_0_Dungeons"); - DrawFloatingDungeons(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); + if (CVar_GetS32("gItemTrackerHotKeyShow", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : buttonsPressed[0].button & BTN_L) { + BeginFloatingWindows("Item Tracker#window"); + if (CVar_GetS32("gItemTrackerDisplayInventory", 0) && !CVar_GetS32("gItemTrackerDisplayInventorySeparate", 0)) { + DrawItemsInRows(inventoryItems); + } + if (CVar_GetS32("gItemTrackerDisplayEquipment", 0) && !CVar_GetS32("gItemTrackerDisplayEquipmentSeparate", 0)) { + DrawItemsInRows(equipmentItems); + } + if (CVar_GetS32("gItemTrackerDisplayMisc", 0) && !CVar_GetS32("gItemTrackerDisplayMiscSeparate", 0)) { + DrawItemsInRows(miscItems); + } + if (CVar_GetS32("gItemTrackerDisplayDungeonRewards", 0) && !CVar_GetS32("gItemTrackerDisplayDungeonRewardsSeparate", 0)) { + if (CVar_GetS32("gItemTrackerDisplayMisc", 0) && !CVar_GetS32("gItemTrackerDisplayMiscSeparate", 0)) { + ImGui::SameLine(Icon_Cells_Size * 3); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); } - /* - if (CVar_GetS32("gItemTrackerNotes", 0)) { - BeginFloatingWindows("ItemTracker_Theme_0_Notes"); - DrawFloatingNotes(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - }*/ - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 1) { // Per groups elements N.1 - BeginFloatingWindows("ItemTracker_Theme_1_Inventory"); - DrawFloatingInventory(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); + DrawItemsInRows(dungeonRewardStones); + DrawItemsInRows(dungeonRewardMedallions); + } + if (CVar_GetS32("gItemTrackerDisplaySongs", 0) && !CVar_GetS32("gItemTrackerDisplaySongsSeparate", 0)) { + DrawItemsInRows(songItems); + } + if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0) && !CVar_GetS32("gItemTrackerDisplayDungeonItemsSeparate", 0)) { + DrawDungeons(itemTrackerDungeons); + } + EndFloatingWindows(); - BeginFloatingWindows("ItemTracker_Theme_1_Stuffs"); - DrawFloatingEquipsQuestUpgradeStones(Icon_Cells_Size, Icon_Spacing); + if (CVar_GetS32("gItemTrackerDisplayInventory", 0) && CVar_GetS32("gItemTrackerDisplayInventorySeparate", 0)) { + BeginFloatingWindows("Inventory Items Tracker"); + DrawItemsInRows(inventoryItems); EndFloatingWindows(); + } - BeginFloatingWindows("ItemTracker_Theme_1_Tokens"); - DrawFloatingTokens(Icon_Cells_Size, Icon_Spacing); + if (CVar_GetS32("gItemTrackerDisplayEquipment", 0) && CVar_GetS32("gItemTrackerDisplayEquipmentSeparate", 0)) { + BeginFloatingWindows("Equipment Items Tracker"); + DrawItemsInRows(equipmentItems); EndFloatingWindows(); + } - BeginFloatingWindows("ItemTracker_Theme_1_Songs"); - DrawFloatingSongs(Icon_Cells_Size, Icon_Spacing); + if (CVar_GetS32("gItemTrackerDisplayMisc", 0) && CVar_GetS32("gItemTrackerDisplayMiscSeparate", 0)) { + BeginFloatingWindows("Misc Items Tracker"); + DrawItemsInRows(miscItems); EndFloatingWindows(); + } - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - BeginFloatingWindows("ItemTracker_Theme_1_Dungeons"); - DrawFloatingDungeons(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); + if (CVar_GetS32("gItemTrackerDisplayDungeonRewards", 0) && CVar_GetS32("gItemTrackerDisplayDungeonRewardsSeparate", 0)) { + BeginFloatingWindows("Dungeon Rewards Tracker"); + DrawItemsInRows(dungeonRewardStones); + DrawItemsInRows(dungeonRewardMedallions); + EndFloatingWindows(); + } + + if (CVar_GetS32("gItemTrackerDisplaySongs", 0) && CVar_GetS32("gItemTrackerDisplaySongsSeparate", 0)) { + BeginFloatingWindows("Songs Tracker"); + DrawItemsInRows(songItems); + EndFloatingWindows(); + } + + if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0) && CVar_GetS32("gItemTrackerDisplayDungeonItemsSeparate", 0)) { + BeginFloatingWindows("Dungeon Items Tracker"); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 0)) { + DrawDungeons(itemTrackerDungeons, 13); + } else { + DrawDungeons(itemTrackerDungeons); } - /* - if (CVar_GetS32("gItemTrackerNotes", 0)) { - BeginFloatingWindows("ItemTracker_Theme_1_Notes"); - DrawFloatingNotes(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - }*/ - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 2) { // Per groups elements N.2 - BeginFloatingWindows("ItemTracker_Theme_2_Inventory"); - DrawFloatingInventory(Icon_Cells_Size, Icon_Spacing); EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Equips"); - DrawFloatingEquipments(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Upgrade"); - DrawFloatingUpgrades(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Quest"); - DrawFloatingQuest(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Stones"); - DrawFloatingStones(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Tokens"); - DrawFloatingTokens(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Song"); - DrawFloatingSongs(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - BeginFloatingWindows("ItemTracker_Theme_2_Dungeons"); - DrawFloatingDungeons(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - } - /* - if (CVar_GetS32("gItemTrackerNotes", 0)) { - BeginFloatingWindows("ItemTracker_Theme_2_Notes"); - DrawFloatingNotes(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - }*/ } } } @@ -1574,89 +889,89 @@ void DrawItemTrackerOptions(bool& open) { return; } - SohImGui::EnhancementCheckbox("Display \"Ammo/MaxAmo\"", "gItemTrackerAmmoDisplay"); - SohImGui::EnhancementCheckbox("Randomizer colors for Songs", "gItemTrackeSongColor"); - SohImGui::Tooltip("Will display non-warp songs with randomizer colors instead of pure white"); + SohImGui::PaddedText("Hotkey"); + SohImGui::PaddedEnhancementCheckbox("L Button to show Item Tracker", "gItemTrackerHotKeyShow", 0); + if (CVar_GetS32("gItemTrackerHotKeyShow", 0)) { + if (ImGui::BeginCombo("Button Type", CVar_GetS32("gItemTrackerHotKeyShowType", 0) == 0 ? "Hold" : "Toggle")) { + if (ImGui::Selectable("Hold")) { + CVar_SetS32("gItemTrackerHotKeyShowType", 0); + } + if (ImGui::Selectable("Toggle")) { + CVar_SetS32("gItemTrackerHotKeyShowType", 1); + } - SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gRandoTrackIconSize", 25, 128, "", 32, - true); - SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gRandoTrackIconSpacing", -5, 50, "", - 0, true); - // SohImGui::EnhancementSliderInt("X spacing : %dpx", "##ITEMTRACKERSPACINGX", "gRandoTrackIconSpacingX", 0, 256, - // ""); SohImGui::EnhancementSliderInt("Y Spacing : %dpx", "##ITEMTRACKERSPACINGY", "gRandoTrackIconSpacingY", 0, - // 255, ""); - - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - ImGui::Text("Chroma Key"); - auto flags = ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel; - ImGui::ColorEdit4("Chroma Key Selection", (float*)&ChromaKeyBackground, flags); - CVar_SetFloat("gItemTrackerBgColorR", ChromaKeyBackground.x); - CVar_SetFloat("gItemTrackerBgColorG", ChromaKeyBackground.y); - CVar_SetFloat("gItemTrackerBgColorB", ChromaKeyBackground.z); - CVar_SetFloat("gItemTrackerBgColorA", ChromaKeyBackground.w); - - const char* ItemsTrackerTheme[3] = { "One Block", "Grouped style n.1", "Grouped style n.2" }; - ImGui::Text("Using theme :"); - SohImGui::EnhancementCombobox("gItemTrackerTheme", ItemsTrackerTheme, 3, 0); - SohImGui::EnhancementCheckbox("Edit mode HUD", "gItemTrackerHudEditMode"); - std::string ResetButtonName = "Reset \""; - ResetButtonName += ItemsTrackerTheme[CVar_GetS32("gItemTrackerTheme", 0)]; - ResetButtonName += "\" theme"; - if (ImGui::Button(ResetButtonName.c_str())) { - ImVec2 OriginPosition = { - ImGui::GetMainViewport()->GetWorkCenter().x - 100, - ImGui::GetMainViewport()->GetWorkCenter().y - 220, - }; - CVar_SetS32("gRandoTrackIconSize", 32); - CVar_SetS32("gRandoTrackIconSpacing", 0); - if (CVar_GetS32("gItemTrackerTheme", 0) == 0) { // One block tracker, original tracker style - ImVec2 Default_Pos_Wnd_0 = { OriginPosition.x, OriginPosition.y }; - ImGui::SetWindowPos("ItemTracker_Theme_0_Grouped", Default_Pos_Wnd_0); - ImVec2 Default_Pos_Wnd_1 = { OriginPosition.x, OriginPosition.y + 175}; - ImGui::SetWindowPos("ItemTracker_Theme_0_Dungeons", Default_Pos_Wnd_1); - //ImVec2 Default_Pos_Wnd_2 = { OriginPosition.x + 100, OriginPosition.y}; - //ImGui::SetWindowPos("ItemTracker_Theme_0_Notes", Default_Pos_Wnd_2); - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 1) { // Per groups elements N.1 - ImVec2 Default_Pos_Wnd_0 = { OriginPosition.x, OriginPosition.y }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Inventory", Default_Pos_Wnd_0); - ImVec2 Default_Pos_Wnd_1 = { OriginPosition.x, OriginPosition.y + 175 }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Stuffs", Default_Pos_Wnd_1); - ImVec2 Default_Pos_Wnd_2 = { OriginPosition.x, OriginPosition.y + 340 }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Tokens", Default_Pos_Wnd_2); - ImVec2 Default_Pos_Wnd_3 = { OriginPosition.x + 5, OriginPosition.y + 380 }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Songs", Default_Pos_Wnd_3); - ImVec2 Default_Pos_Wnd_4 = { OriginPosition.x + 100, OriginPosition.y + 175}; - ImGui::SetWindowPos("ItemTracker_Theme_1_Dungeons", Default_Pos_Wnd_4); - //ImVec2 Default_Pos_Wnd_5 = { OriginPosition.x - 100, OriginPosition.y}; - //ImGui::SetWindowPos("ItemTracker_Theme_1_Notes", Default_Pos_Wnd_5); - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 2) { // Per groups elements N.2 - ImVec2 Default_Pos_Wnd_0 = { OriginPosition.x, OriginPosition.y }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Inventory", Default_Pos_Wnd_0); - ImVec2 Default_Pos_Wnd_1 = { OriginPosition.x, OriginPosition.y + 175 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Equips", Default_Pos_Wnd_1); - ImVec2 Default_Pos_Wnd_2 = { OriginPosition.x + 100, OriginPosition.y + 170 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Upgrade", Default_Pos_Wnd_2); - ImVec2 Default_Pos_Wnd_3 = { OriginPosition.x + 100, OriginPosition.y + 250 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Quest", Default_Pos_Wnd_3); - ImVec2 Default_Pos_Wnd_4 = { OriginPosition.x + 100, OriginPosition.y + 290 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Stones", Default_Pos_Wnd_4); - ImVec2 Default_Pos_Wnd_5 = { OriginPosition.x, OriginPosition.y + 330 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Tokens", Default_Pos_Wnd_5); - ImVec2 Default_Pos_Wnd_6 = { OriginPosition.x, OriginPosition.y + 368 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Song", Default_Pos_Wnd_6); - ImVec2 Default_Pos_Wnd_7 = { OriginPosition.x - 100, OriginPosition.y}; - ImGui::SetWindowPos("ItemTracker_Theme_2_Dungeons", Default_Pos_Wnd_7); - //ImVec2 Default_Pos_Wnd_8 = { OriginPosition.x - 100, OriginPosition.y + 170}; - //ImGui::SetWindowPos("ItemTracker_Theme_2_Notes", Default_Pos_Wnd_8); + ImGui::EndCombo(); } + SohImGui::PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerHotKeyShowOnlyPaused", 0); } - SohImGui::EnhancementCheckbox("Alternative medallions display", "gItemTrackerMedallionsPlacement"); - SohImGui::Tooltip("Will display medallions into a placement that will be from the Quest Menu"); - - SohImGui::EnhancementCheckbox("Key Tracker", "gItemTrackerDisplayDungeonItems"); + SohImGui::PaddedText("Window"); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); + if (ImGui::ColorEdit4("Background Color", (float*)&ChromaKeyBackground, ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel)) { + CVar_SetFloat("gItemTrackerBgColorR", ChromaKeyBackground.x); + CVar_SetFloat("gItemTrackerBgColorG", ChromaKeyBackground.y); + CVar_SetFloat("gItemTrackerBgColorB", ChromaKeyBackground.z); + CVar_SetFloat("gItemTrackerBgColorA", ChromaKeyBackground.w); + } + ImGui::PushItemWidth(0); + if (ImGui::BeginCombo("Window Type", CVar_GetS32("gItemTrackerWindowType", 0) == 0 ? "Floating" : "Window")) { + if (ImGui::Selectable("Floating")) { + CVar_SetS32("gItemTrackerWindowType", 0); + } + if (ImGui::Selectable("Window")) { + CVar_SetS32("gItemTrackerWindowType", 1); + } + + ImGui::EndCombo(); + } + if (CVar_GetS32("gItemTrackerWindowType", 0) == 0) { + SohImGui::PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode", 0); + } + + SohImGui::PaddedText("Icons"); + SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 32, true); + SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 0, true); + SohImGui::PaddedEnhancementCheckbox("Display \"Current/Max\" values on items", "gItemTrackerDisplayCurrentMax", 0); + + SohImGui::PaddedText("Items"); + SohImGui::PaddedEnhancementCheckbox("Display general items in tracker", "gItemTrackerDisplayInventory", 0); + if (CVar_GetS32("gItemTrackerDisplayInventory", 0)) { + SohImGui::PaddedEnhancementCheckbox("Display general items in separate window", "gItemTrackerDisplayInventorySeparate", 0); + } + + SohImGui::PaddedText("Equipment"); + SohImGui::PaddedEnhancementCheckbox("Display equipment in tracker", "gItemTrackerDisplayEquipment", 0); + if (CVar_GetS32("gItemTrackerDisplayEquipment", 0)) { + SohImGui::PaddedEnhancementCheckbox("Display equipment in separate window", "gItemTrackerDisplayEquipmentSeparate", 0); + } + + SohImGui::PaddedText("Misc Items"); + SohImGui::PaddedEnhancementCheckbox("Display misc items in tracker", "gItemTrackerDisplayMisc", 0); + if (CVar_GetS32("gItemTrackerDisplayMisc", 0)) { + SohImGui::PaddedEnhancementCheckbox("Display misc items in separate window", "gItemTrackerDisplayMiscSeparate", 0); + } + + SohImGui::PaddedText("Dungeon Rewards"); + SohImGui::PaddedEnhancementCheckbox("Display dungeon rewards in tracker", "gItemTrackerDisplayDungeonRewards", 0); + if (CVar_GetS32("gItemTrackerDisplayDungeonRewards", 0)) { + SohImGui::PaddedEnhancementCheckbox("Display dungeon rewards in separate window", "gItemTrackerDisplayDungeonRewardsSeparate", 0); + } + + SohImGui::PaddedText("Songs"); + SohImGui::PaddedEnhancementCheckbox("Display songs in tracker", "gItemTrackerDisplaySongs", 0); + if (CVar_GetS32("gItemTrackerDisplaySongs", 0)) { + SohImGui::PaddedEnhancementCheckbox("Display songs in separate window", "gItemTrackerDisplaySongsSeparate", 0); + SohImGui::PaddedEnhancementCheckbox("Use randomizer colors", "gItemTrackerDisplaySongsRandom", 0); + } + + SohImGui::PaddedText("Dungeon Items"); + SohImGui::PaddedEnhancementCheckbox("Display dungeon items in tracker", "gItemTrackerDisplayDungeonItems", 0); if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - SohImGui::EnhancementCheckbox("Map and Compass Tracker", "gItemTrackerDisplayMapsAndCompasses"); + SohImGui::PaddedEnhancementCheckbox("Display dungeon items in separate window", "gItemTrackerDisplayDungeonItemsSeparate", 0); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsSeparate", 0)) { + SohImGui::PaddedEnhancementCheckbox("Horizontal dungeon items display", "gItemTrackerDisplayDungeonItemsHorizontal", 0); + } + SohImGui::PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 0); } // SohImGui::EnhancementCheckbox("Personal notes space", "gItemTrackerNotes"); @@ -1667,7 +982,6 @@ void DrawItemTrackerOptions(bool& open) { } void InitItemTracker() { - CVar_RegisterS32("gRandoTrackIconSize", 32); SohImGui::AddWindow("Randomizer", "Item Tracker", DrawItemTracker); SohImGui::AddWindow("Randomizer", "Item Tracker Settings", DrawItemTrackerOptions); float trackerBgR = CVar_GetFloat("gItemTrackerBgColorR", 0); @@ -1680,4 +994,7 @@ void InitItemTracker() { trackerBgB, trackerBgA }; // Float value, 1 = 255 in rgb value. + Ship::RegisterHook([](OSContPad* cont_pad) { + buttonsPressed = cont_pad; + }); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h index 1397c3d58..dfdd300c0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h @@ -1,5 +1,35 @@ #pragma once +#include +#include + void InitItemTracker(); void DrawItemTracker(bool& open); void DrawItemAmmo(int itemId); + +typedef struct ItemTrackerItem { + uint32_t id; + std::string name; + std::string nameFaded; + uint32_t data; + void (*drawFunc)(ItemTrackerItem); +} ItemTrackerItem; + +#define ITEM_TRACKER_ITEM(id, data, drawFunc) \ + { \ + id, #id, #id "_Faded", data, drawFunc \ + } + +typedef struct ItemTrackerDungeon { + uint32_t id; + std::string shortName; + bool hasMap; + bool hasCompass; + bool hasBossKey; + bool hasSmallKey; +} ItemTrackerDungeon; + +#define ITEM_TRACKER_DUNGEON(id, shortName, hasMap, hasCompass, hasBossKey, hasSmallKey) \ + { \ + id, shortName, hasMap, hasCompass, hasBossKey, hasSmallKey \ + } From f818380079dcf99af1765bc1835a032a42fba39e Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 06:30:52 -0400 Subject: [PATCH 122/212] fix performance issues --- .../Enhancements/randomizer/randomizer.cpp | 62 +- .../randomizer/randomizer_check_objects.cpp | 1723 +++++++++-------- .../randomizer/randomizer_check_objects.h | 8 +- 3 files changed, 957 insertions(+), 836 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 00c61f2d1..868ca0e6e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -62,8 +62,10 @@ Randomizer::Randomizer() { Sprite ootOcarinaSprite = { dgOcarinaofTimeIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b, 9 }; gSeedTextures[9] = ootOcarinaSprite; - for (auto it : RandomizerCheckObjects::GetAllRCObjects()) { - SpoilerfileCheckNameToEnum[it.second.rcSpoilerName] = it.first; + for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { + for (auto locationIt : areaIt.second) { + SpoilerfileCheckNameToEnum[locationIt.rcSpoilerName] = locationIt.rc; + } } } @@ -3752,14 +3754,12 @@ void DrawRandoEditor(bool& open) { locationSearch.Draw(); ImGui::BeginChild("ChildRandomizedLocations", ImVec2(0, -8)); - for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { - // todo fix this, it's hacky and copypasta + for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { bool hasItems = false; - for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { - if (locationIt.second.visibleInImgui && - !excludedLocations.count(locationIt.second.rc) && - locationIt.second.rcArea == areaIt.first && - locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { + for (auto locationIt : areaIt.second) { + if (locationIt.visibleInImgui && + !excludedLocations.count(locationIt.rc) && + locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { hasItems = true; break; @@ -3768,18 +3768,17 @@ void DrawRandoEditor(bool& open) { if (hasItems) { ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode(areaIt.second.c_str())) { - for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { - if (locationIt.second.visibleInImgui && - !excludedLocations.count(locationIt.second.rc) && - locationIt.second.rcArea == areaIt.first && - locationSearch.PassFilter(locationIt.second.rcSpoilerName.c_str())) { + if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(areaIt.first).c_str())) { + for (auto locationIt : areaIt.second) { + if (locationIt.visibleInImgui && + !excludedLocations.count(locationIt.rc) && + locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { - if (ImGui::ArrowButton(std::to_string(locationIt.first).c_str(), ImGuiDir_Right)) { - excludedLocations.insert(locationIt.first); + if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Right)) { + excludedLocations.insert(locationIt.rc); } ImGui::SameLine(); - ImGui::Text(locationIt.second.rcShortName.c_str()); + ImGui::Text(locationIt.rcShortName.c_str()); } } ImGui::TreePop(); @@ -3793,13 +3792,12 @@ void DrawRandoEditor(bool& open) { window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::BeginChild("ChildVanillaLocations", ImVec2(0, -8)); - for (auto areaIt : RandomizerCheckObjects::GetAllRCAreas()) { - // todo fix this, it's hacky and copypasta + for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { bool hasItems = false; - for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { - if (locationIt.second.visibleInImgui && - locationIt.second.rcArea == areaIt.first && - excludedLocations.count(locationIt.second.rc)) { + for (auto locationIt : areaIt.second) { + if (locationIt.visibleInImgui && + excludedLocations.count(locationIt.rc) && + locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { hasItems = true; break; @@ -3808,18 +3806,18 @@ void DrawRandoEditor(bool& open) { if (hasItems) { ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode(areaIt.second.c_str())) { - for (auto locationIt : RandomizerCheckObjects::GetAllRCObjects()) { - auto elfound = excludedLocations.find(locationIt.first); - if (locationIt.second.visibleInImgui && - locationIt.second.rcArea == areaIt.first && - elfound != excludedLocations.end()) { + if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(areaIt.first).c_str())) { + for (auto locationIt : areaIt.second) { + auto elfound = excludedLocations.find(locationIt.rc); + if (locationIt.visibleInImgui && + elfound != excludedLocations.end() && + locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { - if (ImGui::ArrowButton(std::to_string(locationIt.first).c_str(), ImGuiDir_Left)) { + if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Left)) { excludedLocations.erase(elfound); } ImGui::SameLine(); - ImGui::Text(locationIt.second.rcShortName.c_str()); + ImGui::Text(locationIt.rcShortName.c_str()); } } ImGui::TreePop(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index cb3ae00ab..9c898ee57 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -16,779 +16,904 @@ typedef struct { } RandomizerCheckObject; */ -#define RC_OBJECT_MAP_ENTRY(rc, rc_v_or_mq, rc_type, rc_area, rc_shortname, rc_spoilername) \ - {rc, {rc, rc_v_or_mq, rc_type, rc_area, false, rc_shortname, rc_spoilername}} +#define RC_OBJECT(rc, rc_v_or_mq, rc_type, rc_area, rc_shortname, rc_spoilername) \ + {rc, rc_v_or_mq, rc_type, rc_area, false, rc_shortname, rc_spoilername} -std::map rcObjects = { - RC_OBJECT_MAP_ENTRY(RC_UNKNOWN_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_INVALID, "Invalid Location", "Invalid Location"), - RC_OBJECT_MAP_ENTRY(RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"), - RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Right Chest", "KF Mido Top Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Storms Grotto Chest", "KF Storms Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Skull Kid", "LW Skull Kid"), - RC_OBJECT_MAP_ENTRY(RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Cojiro", "LW Trade Cojiro"), - RC_OBJECT_MAP_ENTRY(RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Odd Potion", "LW Trade Odd Potion"), - RC_OBJECT_MAP_ENTRY(RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Ocarina Memory Game", "LW Ocarina Memory Game"), - RC_OBJECT_MAP_ENTRY(RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Target in Woods", "LW Target in Woods"), - RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"), - RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"), - RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"), - RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"), - RC_OBJECT_MAP_ENTRY(RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Skull Mask", "Deku Theater Skull Mask"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"), - RC_OBJECT_MAP_ENTRY(RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"), - RC_OBJECT_MAP_ENTRY(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"), - RC_OBJECT_MAP_ENTRY(RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Southeast Grotto Chest", "HF Southeast Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Open Grotto Chest", "HF Open Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Near Market Grotto Chest", "HF Near Market Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Ocarina of Time Item", "HF Ocarina of Time Item"), - RC_OBJECT_MAP_ENTRY(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Deku Scrub Grotto", "HF Deku Scrub Grotto"), - RC_OBJECT_MAP_ENTRY(RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Child Fishing", "LH Child Fishing"), - RC_OBJECT_MAP_ENTRY(RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Adult Fishing", "LH Adult Fishing"), - RC_OBJECT_MAP_ENTRY(RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Dive", "LH Lab Dive"), - RC_OBJECT_MAP_ENTRY(RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"), - RC_OBJECT_MAP_ENTRY(RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Underwater Item", "LH Underwater Item"), - RC_OBJECT_MAP_ENTRY(RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Sun", "LH Sun"), - RC_OBJECT_MAP_ENTRY(RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Freestanding PoH", "LH Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"), - RC_OBJECT_MAP_ENTRY(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"), - RC_OBJECT_MAP_ENTRY(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"), - RC_OBJECT_MAP_ENTRY(RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Chest", "GV Chest"), - RC_OBJECT_MAP_ENTRY(RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Trade Saw", "GV Trade Saw"), - RC_OBJECT_MAP_ENTRY(RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Crate Freestanding PoH", "GV Crate Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"), - RC_OBJECT_MAP_ENTRY(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"), - RC_OBJECT_MAP_ENTRY(RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "Chest", "GF Chest"), - RC_OBJECT_MAP_ENTRY(RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1000 Points", "GF HBA 1000 Points"), - RC_OBJECT_MAP_ENTRY(RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1500 Points", "GF HBA 1500 Points"), - RC_OBJECT_MAP_ENTRY(RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF Gerudo Membership Card", "GF Gerudo Membership Card"), - RC_OBJECT_MAP_ENTRY(RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F1 Carpenter", "GF North F1 Carpenter"), - RC_OBJECT_MAP_ENTRY(RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F2 Carpenter", "GF North F2 Carpenter"), - RC_OBJECT_MAP_ENTRY(RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F1 Carpenter", "GF South F1 Carpenter"), - RC_OBJECT_MAP_ENTRY(RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F2 Carpenter", "GF South F2 Carpenter"), - RC_OBJECT_MAP_ENTRY(RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Chest", "Wasteland Chest"), - RC_OBJECT_MAP_ENTRY(RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Carpet Salesman", "Wasteland Carpet Salesman"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Freestanding PoH", "Colossus Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Lost Dog", "MK Lost Dog"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Shooting Gallery", "MK Shooting Gallery"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "10 Big Poes", "MK 10 Big Poes"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game First Room Chest", "MK Chest Game First Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Malon Egg", "HC Malon Egg"), - RC_OBJECT_MAP_ENTRY(RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Zeldas Letter", "HC Zeldas Letter"), - RC_OBJECT_MAP_ENTRY(RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Redead Grotto Chest", "Kak Redead Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Chest", "Kak Open Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"), - RC_OBJECT_MAP_ENTRY(RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"), - RC_OBJECT_MAP_ENTRY(RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"), - RC_OBJECT_MAP_ENTRY(RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"), - RC_OBJECT_MAP_ENTRY(RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"), - RC_OBJECT_MAP_ENTRY(RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Man on Roof", "Kak Man on Roof"), - RC_OBJECT_MAP_ENTRY(RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"), - RC_OBJECT_MAP_ENTRY(RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"), - RC_OBJECT_MAP_ENTRY(RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Adult", "Kak Anju as Adult"), - RC_OBJECT_MAP_ENTRY(RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Child", "Kak Anju as Child"), - RC_OBJECT_MAP_ENTRY(RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"), - RC_OBJECT_MAP_ENTRY(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Shield Grave Chest", "GY Shield Grave Chest"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Composers Grave Chest", "GY Composers Grave Chest"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Hookshot Chest", "GY Hookshot Chest"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Freestanding PoH", "GY Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"), - RC_OBJECT_MAP_ENTRY(RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Chest", "DMT Chest"), - RC_OBJECT_MAP_ENTRY(RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Chest", "DMT Storms Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Broken Sword", "DMT Trade Broken Sword"), - RC_OBJECT_MAP_ENTRY(RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Eyedrops", "DMT Trade Eyedrops"), - RC_OBJECT_MAP_ENTRY(RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Claim Check", "DMT Trade Claim Check"), - RC_OBJECT_MAP_ENTRY(RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Freestanding PoH", "DMT Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Left Chest", "GC Maze Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Right Chest", "GC Maze Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Center Chest", "GC Maze Center Chest"), - RC_OBJECT_MAP_ENTRY(RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Child", "GC Rolling Goron as Child"), - RC_OBJECT_MAP_ENTRY(RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Adult", "GC Rolling Goron as Adult"), - RC_OBJECT_MAP_ENTRY(RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Darunias Joy", "GC Darunias Joy"), - RC_OBJECT_MAP_ENTRY(RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Pot Freestanding PoH", "GC Pot Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"), - RC_OBJECT_MAP_ENTRY(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"), - RC_OBJECT_MAP_ENTRY(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"), - RC_OBJECT_MAP_ENTRY(RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Medigoron", "GC Medigoron"), - RC_OBJECT_MAP_ENTRY(RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Chest", "DMC Upper Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub", "DMC Deku Scrub"), - RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"), - RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"), - RC_OBJECT_MAP_ENTRY(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"), - RC_OBJECT_MAP_ENTRY(RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Open Grotto Chest", "ZR Open Grotto Chest"), - RC_OBJECT_MAP_ENTRY(RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Magic Bean Salesman", "ZR Magic Bean Salesman"), - RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"), - RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Epona's Song", "ZR Frogs Epona's Song"), - RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Saria's Song", "ZR Frogs Saria's Song"), - RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Sun's Song", "ZR Frogs Sun's Song"), - RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Song of Time", "ZR Frogs Song of Time"), - RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs in the Rain", "ZR Frogs in the Rain"), - RC_OBJECT_MAP_ENTRY(RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"), - RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"), - RC_OBJECT_MAP_ENTRY(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"), - RC_OBJECT_MAP_ENTRY(RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Chest", "ZD Chest"), - RC_OBJECT_MAP_ENTRY(RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Diving Minigame", "ZD Diving Minigame"), - RC_OBJECT_MAP_ENTRY(RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "King Zora Thawed", "ZD King Zora Thawed"), - RC_OBJECT_MAP_ENTRY(RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Trade Prescription", "ZD Trade Prescription"), - RC_OBJECT_MAP_ENTRY(RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Talons Chickens", "LLR Talons Chickens"), - RC_OBJECT_MAP_ENTRY(RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Freestanding PoH", "LLR Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"), - RC_OBJECT_MAP_ENTRY(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"), - RC_OBJECT_MAP_ENTRY(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Map Chest", "Deku Tree Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Compass Chest", "Deku Tree Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Basement Chest", "Deku Tree Basement Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Chest", "Deku Tree Slingshot Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Map Chest", "Deku Tree MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Compass Chest", "Deku Tree MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Basement Chest", "Deku Tree MQ Basement Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Map Chest", "Dodongos Cavern Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Compass Chest", "Dodongos Cavern Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Map Chest", "Jabu Jabus Belly Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Compass Chest", "Jabu Jabus Belly Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Room Chest", "Forest Temple First Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Stalfos Chest", "Forest Temple First Stalfos Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "Map Chest", "Forest Temple Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Well Chest", "Forest Temple Well Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Eye Switch Chest", "Forest Temple Eye Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Boss Key Chest", "Forest Temple Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Floormaster Chest", "Forest Temple Floormaster Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Bow Chest", "Forest Temple Bow Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Red Poe Chest", "Forest Temple Red Poe Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Blue Poe Chest", "Forest Temple Blue Poe Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Basement Chest", "Forest Temple Basement Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ First Room Chest", "Forest Temple MQ First Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Bow Chest", "Forest Temple MQ Bow Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Well Chest", "Forest Temple MQ Well Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Map Chest", "Forest Temple MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Compass Chest", "Forest Temple MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Basement Chest", "Forest Temple MQ Basement Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Redead Chest", "Forest Temple MQ Redead Chest"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Near Boss Chest", "Fire Temple Near Boss Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boss Key Chest", "Fire Temple Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Scarecrow Chest", "Fire Temple Scarecrow Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Map Chest", "Fire Temple Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Compass Chest", "Fire Temple Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Highest Goron Chest", "Fire Temple Highest Goron Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Compass Chest", "Fire Temple MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Map Chest", "Fire Temple MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Map Chest", "Water Temple Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Compass Chest", "Water Temple Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Torches Chest", "Water Temple Torches Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Dragon Chest", "Water Temple Dragon Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Pillar Chest", "Water Temple Central Pillar Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Boss Key Chest", "Water Temple Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Longshot Chest", "Water Temple Longshot Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "River Chest", "Water Temple River Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Compass Chest", "Water Temple MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Map Chest", "Water Temple MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Compass Chest", "Spirit Temple Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Map Chest", "Spirit Temple Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Boss Key Chest", "Spirit Temple Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Topmost Chest", "Spirit Temple Topmost Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Map Chest", "Spirit Temple MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Map Chest", "Shadow Temple Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Compass Chest", "Shadow Temple Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Boss Key Chest", "Shadow Temple Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Freestanding Key", "Shadow Temple Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Map Chest", "Shadow Temple MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Compass Chest", "Bottom of the Well Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Invisible Chest", "Bottom of the Well Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Map Chest", "Bottom of the Well Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Like Like Chest", "Bottom of the Well Like Like Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Freestanding Key", "Bottom of the Well Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Map Chest", "Bottom of the Well MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Map Chest", "Ice Cavern Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Compass Chest", "Ice Cavern Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Freestanding PoH", "Ice Cavern Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Map Chest", "Ice Cavern MQ Map Chest"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"), - RC_OBJECT_MAP_ENTRY(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Boss Key Chest", "Ganon's Tower Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"), - RC_OBJECT_MAP_ENTRY(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Back Room", "Deku Tree GS Basement Back Room"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Gate", "Deku Tree GS Basement Gate"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Vines", "Deku Tree GS Basement Vines"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Compass Room", "Deku Tree GS Compass Room"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Lobby", "Deku Tree MQ GS Lobby"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Back Room", "Dodongos Cavern GS Back Room"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS First Room", "Forest Temple GS First Room"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Lobby", "Forest Temple GS Lobby"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Basement", "Forest Temple GS Basement"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Well", "Forest Temple MQ GS Well"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Song of Time Room", "Fire Temple GS Song of Time Room"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boulder Maze", "Fire Temple GS Boulder Maze"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Behind Gate", "Water Temple GS Behind Gate"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Central Pillar", "Water Temple GS Central Pillar"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS River", "Water Temple GS River"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS River", "Water Temple MQ GS River"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Boulder Room", "Spirit Temple GS Boulder Room"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Lobby", "Spirit Temple GS Lobby"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Metal Fence", "Spirit Temple GS Metal Fence"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Like Like Room", "Shadow Temple GS Like Like Room"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Near Ship", "Shadow Temple GS Near Ship"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS East Inner Room", "Bottom of the Well GS East Inner Room"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS West Inner Room", "Bottom of the Well GS West Inner Room"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Basement", "Bottom of the Well MQ GS Basement"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"), - RC_OBJECT_MAP_ENTRY(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Push Block Room", "Ice Cavern GS Push Block Room"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"), - RC_OBJECT_MAP_ENTRY(RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"), - RC_OBJECT_MAP_ENTRY(RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Bean Patch", "KF GS Bean Patch"), - RC_OBJECT_MAP_ENTRY(RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Know It All House", "KF GS Know It All House"), - RC_OBJECT_MAP_ENTRY(RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS House of Twins", "KF GS House of Twins"), - RC_OBJECT_MAP_ENTRY(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"), - RC_OBJECT_MAP_ENTRY(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"), - RC_OBJECT_MAP_ENTRY(RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Above Theater", "LW GS Above Theater"), - RC_OBJECT_MAP_ENTRY(RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, "GS", "SFM GS"), - RC_OBJECT_MAP_ENTRY(RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Cow Grotto", "HF GS Cow Grotto"), - RC_OBJECT_MAP_ENTRY(RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Near Kak Grotto", "HF GS Near Kak Grotto"), - RC_OBJECT_MAP_ENTRY(RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Bean Patch", "LH GS Bean Patch"), - RC_OBJECT_MAP_ENTRY(RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Small Island", "LH GS Small Island"), - RC_OBJECT_MAP_ENTRY(RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Wall", "LH GS Lab Wall"), - RC_OBJECT_MAP_ENTRY(RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Crate", "LH GS Lab Crate"), - RC_OBJECT_MAP_ENTRY(RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Tree", "LH GS Tree"), - RC_OBJECT_MAP_ENTRY(RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Bean Patch", "GV GS Bean Patch"), - RC_OBJECT_MAP_ENTRY(RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Small Bridge", "GV GS Small Bridge"), - RC_OBJECT_MAP_ENTRY(RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Pillar", "GV GS Pillar"), - RC_OBJECT_MAP_ENTRY(RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Behind Tent", "GV GS Behind Tent"), - RC_OBJECT_MAP_ENTRY(RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Archery Range", "GF GS Archery Range"), - RC_OBJECT_MAP_ENTRY(RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Top Floor", "GF GS Top Floor"), - RC_OBJECT_MAP_ENTRY(RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, "GS", "Wasteland GS"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Bean Patch", "Colossus GS Bean Patch"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Hill", "Colossus GS Hill"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Tree", "Colossus GS Tree"), - RC_OBJECT_MAP_ENTRY(RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "OGC GS", "OGC GS"), - RC_OBJECT_MAP_ENTRY(RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Storms Grotto", "HC GS Storms Grotto"), - RC_OBJECT_MAP_ENTRY(RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Tree", "HC GS Tree"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "Market GS Guard House", "Market GS Guard House"), - RC_OBJECT_MAP_ENTRY(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS House Under Construction", "Kak GS House Under Construction"), - RC_OBJECT_MAP_ENTRY(RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Skulltula House", "Kak GS Skulltula House"), - RC_OBJECT_MAP_ENTRY(RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Guards House", "Kak GS Guards House"), - RC_OBJECT_MAP_ENTRY(RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Tree", "Kak GS Tree"), - RC_OBJECT_MAP_ENTRY(RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Watchtower", "Kak GS Watchtower"), - RC_OBJECT_MAP_ENTRY(RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Above Impas House", "Kak GS Above Impas House"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Wall", "Graveyard GS Wall"), - RC_OBJECT_MAP_ENTRY(RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Bean Patch", "Graveyard GS Bean Patch"), - RC_OBJECT_MAP_ENTRY(RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Bean Patch", "DMC GS Bean Patch"), - RC_OBJECT_MAP_ENTRY(RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Crate", "DMC GS Crate"), - RC_OBJECT_MAP_ENTRY(RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Bean Patch", "DMT GS Bean Patch"), - RC_OBJECT_MAP_ENTRY(RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Near Kak", "DMT GS Near Kak"), - RC_OBJECT_MAP_ENTRY(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"), - RC_OBJECT_MAP_ENTRY(RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"), - RC_OBJECT_MAP_ENTRY(RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Center Platform", "GC GS Center Platform"), - RC_OBJECT_MAP_ENTRY(RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Boulder Maze", "GC GS Boulder Maze"), - RC_OBJECT_MAP_ENTRY(RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Ladder", "ZR GS Ladder"), - RC_OBJECT_MAP_ENTRY(RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Tree", "ZR GS Tree"), - RC_OBJECT_MAP_ENTRY(RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Above Bridge", "ZR GS Above Bridge"), - RC_OBJECT_MAP_ENTRY(RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"), - RC_OBJECT_MAP_ENTRY(RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"), - RC_OBJECT_MAP_ENTRY(RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Above The Log", "ZF GS Above The Log"), - RC_OBJECT_MAP_ENTRY(RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Hidden Cave", "ZF GS Hidden Cave"), - RC_OBJECT_MAP_ENTRY(RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Tree", "ZF GS Tree"), - RC_OBJECT_MAP_ENTRY(RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Back Wall", "LLR GS Back Wall"), - RC_OBJECT_MAP_ENTRY(RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Rain Shed", "LLR GS Rain Shed"), - RC_OBJECT_MAP_ENTRY(RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS House Window", "LLR GS House Window"), - RC_OBJECT_MAP_ENTRY(RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Tree", "LLR GS Tree"), - RC_OBJECT_MAP_ENTRY(RC_LINKS_POCKET, RCVORMQ_VANILLA, RCTYPE_LINKS_POCKET, RCAREA_KOKIRI_FOREST, "Link's Pocket", "Link's Pocket"), - RC_OBJECT_MAP_ENTRY(RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma", "Queen Gohma"), - RC_OBJECT_MAP_ENTRY(RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo", "King Dodongo"), - RC_OBJECT_MAP_ENTRY(RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade", "Barinade"), - RC_OBJECT_MAP_ENTRY(RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon", "Phantom Ganon"), - RC_OBJECT_MAP_ENTRY(RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia", "Volvagia"), - RC_OBJECT_MAP_ENTRY(RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha", "Morpha"), - RC_OBJECT_MAP_ENTRY(RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova", "Twinrova"), - RC_OBJECT_MAP_ENTRY(RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo", "Bongo Bongo"), - RC_OBJECT_MAP_ENTRY(RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha Heart Container", "Water Temple Morpha Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"), - RC_OBJECT_MAP_ENTRY(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"), - RC_OBJECT_MAP_ENTRY(RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Gift From Saria", "LW Gift From Saria"), - RC_OBJECT_MAP_ENTRY(RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Great Fairy Reward", "ZF Great Fairy Reward"), - RC_OBJECT_MAP_ENTRY(RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Great Fairy Reward", "HC Great Fairy Reward"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Great Fairy Reward", "Colossus Great Fairy Reward"), - RC_OBJECT_MAP_ENTRY(RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Great Fairy Reward", "DMT Great Fairy Reward"), - RC_OBJECT_MAP_ENTRY(RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Great Fairy Reward", "DMC Great Fairy Reward"), - RC_OBJECT_MAP_ENTRY(RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "OGC Great Fairy Reward", "OGC Great Fairy Reward"), - RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Sheik in Forest", "Sheik in Forest"), - RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Sheik in Crater", "Sheik in Crater"), - RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Sheik in Ice Cavern", "Sheik in Ice Cavern"), - RC_OBJECT_MAP_ENTRY(RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Sheik at Colossus", "Sheik at Colossus"), - RC_OBJECT_MAP_ENTRY(RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Sheik in Kakariko", "Sheik in Kakariko"), - RC_OBJECT_MAP_ENTRY(RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Sheik at Temple", "Sheik at Temple"), - RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Song from Impa", "Song from Impa"), - RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Song from Malon", "Song from Malon"), - RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Song from Saria", "Song from Saria"), - RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Song from Composers Grave", "Song from Composers Grave"), - RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Song from Ocarina of Time", "Song from Ocarina of Time"), - RC_OBJECT_MAP_ENTRY(RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Song from Windmill", "Song from Windmill"), - RC_OBJECT_MAP_ENTRY(RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, "Links House Cow", "KF Links House Cow"), - RC_OBJECT_MAP_ENTRY(RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, "Cow Grotto Cow", "HF Cow Grotto Cow"), - RC_OBJECT_MAP_ENTRY(RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Left Cow", "LLR Stables Left Cow"), - RC_OBJECT_MAP_ENTRY(RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Right Cow", "LLR Stables Right Cow"), - RC_OBJECT_MAP_ENTRY(RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Left Cow", "LLR Tower Left Cow"), - RC_OBJECT_MAP_ENTRY(RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Right Cow", "LLR Tower Right Cow"), - RC_OBJECT_MAP_ENTRY(RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, "Impas House Cow", "Kak Impas House Cow"), - RC_OBJECT_MAP_ENTRY(RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, "Cow Grotto Cow", "DMT Cow Grotto Cow"), - RC_OBJECT_MAP_ENTRY(RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, "Cow", "GV Cow"), - RC_OBJECT_MAP_ENTRY(RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, "MQ Cow", "Jabu Jabus Belly MQ Cow"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 1", "KF Shop Item 1"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 2", "KF Shop Item 2"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 3", "KF Shop Item 3"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 4", "KF Shop Item 4"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 5", "KF Shop Item 5"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 6", "KF Shop Item 6"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 7", "KF Shop Item 7"), - RC_OBJECT_MAP_ENTRY(RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 8", "KF Shop Item 8"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 1", "Kak Potion Shop Item 1"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 2", "Kak Potion Shop Item 2"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 3", "Kak Potion Shop Item 3"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 4", "Kak Potion Shop Item 4"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 5", "Kak Potion Shop Item 5"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 6", "Kak Potion Shop Item 6"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 7", "Kak Potion Shop Item 7"), - RC_OBJECT_MAP_ENTRY(RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 8", "Kak Potion Shop Item 8"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 1", "MK Potion Shop Item 1"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 2", "MK Potion Shop Item 2"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 3", "MK Potion Shop Item 3"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 4", "MK Potion Shop Item 4"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 5", "MK Potion Shop Item 5"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 6", "MK Potion Shop Item 6"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 7", "MK Potion Shop Item 7"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 8", "MK Potion Shop Item 8"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "MK Bazaar Item 1"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "MK Bazaar Item 2"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "MK Bazaar Item 3"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "MK Bazaar Item 4"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "MK Bazaar Item 5"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "MK Bazaar Item 6"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "MK Bazaar Item 7"), - RC_OBJECT_MAP_ENTRY(RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "MK Bazaar Item 8"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 1", "Kak Bazaar Item 1"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 2", "Kak Bazaar Item 2"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 3", "Kak Bazaar Item 3"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 4", "Kak Bazaar Item 4"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 5", "Kak Bazaar Item 5"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 6", "Kak Bazaar Item 6"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 7", "Kak Bazaar Item 7"), - RC_OBJECT_MAP_ENTRY(RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 8", "Kak Bazaar Item 8"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 1", "ZD Shop Item 1"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 2", "ZD Shop Item 2"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 3", "ZD Shop Item 3"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 4", "ZD Shop Item 4"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 5", "ZD Shop Item 5"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 6", "ZD Shop Item 6"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 7", "ZD Shop Item 7"), - RC_OBJECT_MAP_ENTRY(RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 8", "ZD Shop Item 8"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 1", "GC Shop Item 1"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 2", "GC Shop Item 2"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 3", "GC Shop Item 3"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 4", "GC Shop Item 4"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 5", "GC Shop Item 5"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 6", "GC Shop Item 6"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 7", "GC Shop Item 7"), - RC_OBJECT_MAP_ENTRY(RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 8", "GC Shop Item 8"), - RC_OBJECT_MAP_ENTRY(RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, "Gossip Stone", "Colossus Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Gossip Stone", "DMC Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Gossip Stone", "DMT Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, "Gossip Stone", "Dodongo's Cavern Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Fairy Gossip Stone", "Fairy Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Maze Gossip Stone", "GC Maze Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, "Gossip Stone", "GV Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, "Gossip Stone", "GY Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Malon Gossip Stone", "HC Malon Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Near Market Gossip Stone", "HF Near Market Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Southeast Gossip Stone", "HF Southeast Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Jabu Gossip Stone", "Jabu Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Gossip Stone", "KF Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Storms Gossip Stone", "KF Storms Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Lab Gossip Stone", "LH Lab Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southeast Gossip Stone", "LH Southeast Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southwest Gossip Stone", "LH Southwest Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Gossip Stone", "LW Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Saria Gossip Stone", "SFM Saria Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Gossip Stone", "ToT Left Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Gossip Stone", "ToT Right Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, "Gossip Stone", "ZD Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"), - RC_OBJECT_MAP_ENTRY(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"), +std::vector rcObjectsKF = { + RC_OBJECT(RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"), + RC_OBJECT(RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"), + RC_OBJECT(RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Right Chest", "KF Mido Top Right Chest"), + RC_OBJECT(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"), + RC_OBJECT(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"), + RC_OBJECT(RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Storms Grotto Chest", "KF Storms Grotto Chest"), + RC_OBJECT(RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Bean Patch", "KF GS Bean Patch"), + RC_OBJECT(RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Know It All House", "KF GS Know It All House"), + RC_OBJECT(RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS House of Twins", "KF GS House of Twins"), + RC_OBJECT(RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, "Links House Cow", "KF Links House Cow"), + RC_OBJECT(RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 1", "KF Shop Item 1"), + RC_OBJECT(RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 2", "KF Shop Item 2"), + RC_OBJECT(RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 3", "KF Shop Item 3"), + RC_OBJECT(RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 4", "KF Shop Item 4"), + RC_OBJECT(RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 5", "KF Shop Item 5"), + RC_OBJECT(RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 6", "KF Shop Item 6"), + RC_OBJECT(RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 7", "KF Shop Item 7"), + RC_OBJECT(RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 8", "KF Shop Item 8"), + RC_OBJECT(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"), + RC_OBJECT(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"), + RC_OBJECT(RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Gossip Stone", "KF Gossip Stone"), + RC_OBJECT(RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Storms Gossip Stone", "KF Storms Gossip Stone"), }; -std::map rcAreas = { - { RCAREA_KOKIRI_FOREST, "Kokiri Forest"}, - { RCAREA_LOST_WOODS, "Lost Woods"}, - { RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow"}, - { RCAREA_HYRULE_FIELD, "Hyrule Field"}, - { RCAREA_LAKE_HYLIA, "Lake Hylia"}, - { RCAREA_GERUDO_VALLEY, "Gerudo Valley"}, - { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress"}, - { RCAREA_WASTELAND, "Desert Wasteland"}, - { RCAREA_DESERT_COLOSSUS, "Desert Colossus"}, - { RCAREA_MARKET, "Hyrule Market"}, - { RCAREA_HYRULE_CASTLE, "Hyrule Castle"}, - { RCAREA_KAKARIKO_VILLAGE, "Kakariko Village"}, - { RCAREA_GRAVEYARD, "Graveyard"}, - { RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail"}, - { RCAREA_GORON_CITY, "Goron City"}, - { RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater"}, - { RCAREA_ZORAS_RIVER, "Zora's River"}, - { RCAREA_ZORAS_DOMAIN, "Zora's Domain"}, - { RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain"}, - { RCAREA_LON_LON_RANCH, "Lon Lon Ranch"}, - { RCAREA_DEKU_TREE, "Deku Tree"}, - { RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern"}, - { RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly"}, - { RCAREA_FOREST_TEMPLE, "Forest Temple"}, - { RCAREA_FIRE_TEMPLE, "Fire Temple"}, - { RCAREA_WATER_TEMPLE, "Water Temple"}, - { RCAREA_SPIRIT_TEMPLE, "Spirit Temple"}, - { RCAREA_SHADOW_TEMPLE, "Shadow Temple"}, - { RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well"}, - { RCAREA_ICE_CAVERN, "Ice Cavern"}, - { RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Grounds"}, - { RCAREA_GANONS_CASTLE, "Ganon's Castle"}, +std::vector rcObjectsLW = { + RC_OBJECT(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"), + RC_OBJECT(RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Skull Kid", "LW Skull Kid"), + RC_OBJECT(RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Cojiro", "LW Trade Cojiro"), + RC_OBJECT(RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Odd Potion", "LW Trade Odd Potion"), + RC_OBJECT(RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Ocarina Memory Game", "LW Ocarina Memory Game"), + RC_OBJECT(RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Target in Woods", "LW Target in Woods"), + RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"), + RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"), + RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"), + RC_OBJECT(RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"), + RC_OBJECT(RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"), + RC_OBJECT(RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Skull Mask", "Deku Theater Skull Mask"), + RC_OBJECT(RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"), + RC_OBJECT(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"), + RC_OBJECT(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"), + RC_OBJECT(RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Above Theater", "LW GS Above Theater"), + RC_OBJECT(RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Gift From Saria", "LW Gift From Saria"), + RC_OBJECT(RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Gossip Stone", "LW Gossip Stone"), + RC_OBJECT(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"), +}; + +std::vector rcObjectsSFM = { + RC_OBJECT(RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"), + RC_OBJECT(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"), + RC_OBJECT(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"), + RC_OBJECT(RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, "GS", "SFM GS"), + RC_OBJECT(RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Sheik in Forest", "Sheik in Forest"), + RC_OBJECT(RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Song from Saria", "Song from Saria"), + RC_OBJECT(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"), + RC_OBJECT(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"), + RC_OBJECT(RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Saria Gossip Stone", "SFM Saria Gossip Stone"), +}; + +std::vector rcObjectsHF = { + RC_OBJECT(RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Southeast Grotto Chest", "HF Southeast Grotto Chest"), + RC_OBJECT(RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Open Grotto Chest", "HF Open Grotto Chest"), + RC_OBJECT(RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Near Market Grotto Chest", "HF Near Market Grotto Chest"), + RC_OBJECT(RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Ocarina of Time Item", "HF Ocarina of Time Item"), + RC_OBJECT(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"), + RC_OBJECT(RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Deku Scrub Grotto", "HF Deku Scrub Grotto"), + RC_OBJECT(RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Cow Grotto", "HF GS Cow Grotto"), + RC_OBJECT(RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Near Kak Grotto", "HF GS Near Kak Grotto"), + RC_OBJECT(RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Song from Ocarina of Time", "Song from Ocarina of Time"), + RC_OBJECT(RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, "Cow Grotto Cow", "HF Cow Grotto Cow"), + RC_OBJECT(RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"), + RC_OBJECT(RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Near Market Gossip Stone", "HF Near Market Gossip Stone"), + RC_OBJECT(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"), + RC_OBJECT(RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Southeast Gossip Stone", "HF Southeast Gossip Stone"), +}; + +std::vector rcObjectsLH = { + RC_OBJECT(RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Child Fishing", "LH Child Fishing"), + RC_OBJECT(RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Adult Fishing", "LH Adult Fishing"), + RC_OBJECT(RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Dive", "LH Lab Dive"), + RC_OBJECT(RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"), + RC_OBJECT(RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Underwater Item", "LH Underwater Item"), + RC_OBJECT(RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Sun", "LH Sun"), + RC_OBJECT(RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Freestanding PoH", "LH Freestanding PoH"), + RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"), + RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"), + RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"), + RC_OBJECT(RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Bean Patch", "LH GS Bean Patch"), + RC_OBJECT(RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Small Island", "LH GS Small Island"), + RC_OBJECT(RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Wall", "LH GS Lab Wall"), + RC_OBJECT(RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Crate", "LH GS Lab Crate"), + RC_OBJECT(RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Tree", "LH GS Tree"), + RC_OBJECT(RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Lab Gossip Stone", "LH Lab Gossip Stone"), + RC_OBJECT(RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southeast Gossip Stone", "LH Southeast Gossip Stone"), + RC_OBJECT(RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southwest Gossip Stone", "LH Southwest Gossip Stone"), +}; + +std::vector rcObjectsGV = { + RC_OBJECT(RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Chest", "GV Chest"), + RC_OBJECT(RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Trade Saw", "GV Trade Saw"), + RC_OBJECT(RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"), + RC_OBJECT(RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Crate Freestanding PoH", "GV Crate Freestanding PoH"), + RC_OBJECT(RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"), + RC_OBJECT(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"), + RC_OBJECT(RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Bean Patch", "GV GS Bean Patch"), + RC_OBJECT(RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Small Bridge", "GV GS Small Bridge"), + RC_OBJECT(RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Pillar", "GV GS Pillar"), + RC_OBJECT(RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Behind Tent", "GV GS Behind Tent"), + RC_OBJECT(RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, "Cow", "GV Cow"), + RC_OBJECT(RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, "Gossip Stone", "GV Gossip Stone"), +}; + +std::vector rcObjectsGF = { + RC_OBJECT(RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "Chest", "GF Chest"), + RC_OBJECT(RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1000 Points", "GF HBA 1000 Points"), + RC_OBJECT(RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1500 Points", "GF HBA 1500 Points"), + RC_OBJECT(RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF Gerudo Membership Card", "GF Gerudo Membership Card"), + RC_OBJECT(RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F1 Carpenter", "GF North F1 Carpenter"), + RC_OBJECT(RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F2 Carpenter", "GF North F2 Carpenter"), + RC_OBJECT(RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F1 Carpenter", "GF South F1 Carpenter"), + RC_OBJECT(RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F2 Carpenter", "GF South F2 Carpenter"), + RC_OBJECT(RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Archery Range", "GF GS Archery Range"), + RC_OBJECT(RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Top Floor", "GF GS Top Floor"), +}; + +std::vector rcObjectsWL = { + RC_OBJECT(RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Chest", "Wasteland Chest"), + RC_OBJECT(RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Carpet Salesman", "Wasteland Carpet Salesman"), + RC_OBJECT(RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, "GS", "Wasteland GS"), +}; + +std::vector rcObjectsCL = { + RC_OBJECT(RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Freestanding PoH", "Colossus Freestanding PoH"), + RC_OBJECT(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"), + RC_OBJECT(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"), + RC_OBJECT(RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Bean Patch", "Colossus GS Bean Patch"), + RC_OBJECT(RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Hill", "Colossus GS Hill"), + RC_OBJECT(RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Tree", "Colossus GS Tree"), + RC_OBJECT(RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Great Fairy Reward", "Colossus Great Fairy Reward"), + RC_OBJECT(RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Sheik at Colossus", "Sheik at Colossus"), + RC_OBJECT(RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, "Gossip Stone", "Colossus Gossip Stone"), +}; + +std::vector rcObjectsMK = { + RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"), + RC_OBJECT(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"), + RC_OBJECT(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"), + RC_OBJECT(RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Lost Dog", "MK Lost Dog"), + RC_OBJECT(RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Shooting Gallery", "MK Shooting Gallery"), + RC_OBJECT(RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "10 Big Poes", "MK 10 Big Poes"), + RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game First Room Chest", "MK Chest Game First Room Chest"), + RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"), + RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"), + RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"), + RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"), + RC_OBJECT(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_MARKET, "Market GS Guard House", "Market GS Guard House"), + RC_OBJECT(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"), + RC_OBJECT(RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Sheik at Temple", "Sheik at Temple"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"), + RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 1", "MK Potion Shop Item 1"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 2", "MK Potion Shop Item 2"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 3", "MK Potion Shop Item 3"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 4", "MK Potion Shop Item 4"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 5", "MK Potion Shop Item 5"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 6", "MK Potion Shop Item 6"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 7", "MK Potion Shop Item 7"), + RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 8", "MK Potion Shop Item 8"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "MK Bazaar Item 1"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "MK Bazaar Item 2"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "MK Bazaar Item 3"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "MK Bazaar Item 4"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "MK Bazaar Item 5"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "MK Bazaar Item 6"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "MK Bazaar Item 7"), + RC_OBJECT(RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "MK Bazaar Item 8"), + RC_OBJECT(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"), + RC_OBJECT(RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Gossip Stone", "ToT Left Gossip Stone"), + RC_OBJECT(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"), + RC_OBJECT(RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Gossip Stone", "ToT Right Gossip Stone"), +}; + +std::vector rcObjectsHC = { + RC_OBJECT(RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Malon Egg", "HC Malon Egg"), + RC_OBJECT(RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Zeldas Letter", "HC Zeldas Letter"), + RC_OBJECT(RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "OGC GS", "OGC GS"), + RC_OBJECT(RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Storms Grotto", "HC GS Storms Grotto"), + RC_OBJECT(RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Tree", "HC GS Tree"), + RC_OBJECT(RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Great Fairy Reward", "HC Great Fairy Reward"), + RC_OBJECT(RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "OGC Great Fairy Reward", "OGC Great Fairy Reward"), + RC_OBJECT(RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Song from Impa", "Song from Impa"), + RC_OBJECT(RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Malon Gossip Stone", "HC Malon Gossip Stone"), + RC_OBJECT(RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"), + RC_OBJECT(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"), +}; + +std::vector rcObjectsKV = { + RC_OBJECT(RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Redead Grotto Chest", "Kak Redead Grotto Chest"), + RC_OBJECT(RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Chest", "Kak Open Grotto Chest"), + RC_OBJECT(RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"), + RC_OBJECT(RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"), + RC_OBJECT(RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"), + RC_OBJECT(RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"), + RC_OBJECT(RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"), + RC_OBJECT(RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Man on Roof", "Kak Man on Roof"), + RC_OBJECT(RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"), + RC_OBJECT(RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"), + RC_OBJECT(RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Adult", "Kak Anju as Adult"), + RC_OBJECT(RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Child", "Kak Anju as Child"), + RC_OBJECT(RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"), + RC_OBJECT(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"), + RC_OBJECT(RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"), + RC_OBJECT(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS House Under Construction", "Kak GS House Under Construction"), + RC_OBJECT(RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Skulltula House", "Kak GS Skulltula House"), + RC_OBJECT(RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Guards House", "Kak GS Guards House"), + RC_OBJECT(RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Tree", "Kak GS Tree"), + RC_OBJECT(RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Watchtower", "Kak GS Watchtower"), + RC_OBJECT(RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Above Impas House", "Kak GS Above Impas House"), + RC_OBJECT(RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Sheik in Kakariko", "Sheik in Kakariko"), + RC_OBJECT(RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Song from Windmill", "Song from Windmill"), + RC_OBJECT(RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, "Impas House Cow", "Kak Impas House Cow"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 1", "Kak Potion Shop Item 1"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 2", "Kak Potion Shop Item 2"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 3", "Kak Potion Shop Item 3"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 4", "Kak Potion Shop Item 4"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 5", "Kak Potion Shop Item 5"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 6", "Kak Potion Shop Item 6"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 7", "Kak Potion Shop Item 7"), + RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 8", "Kak Potion Shop Item 8"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 1", "Kak Bazaar Item 1"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 2", "Kak Bazaar Item 2"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 3", "Kak Bazaar Item 3"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 4", "Kak Bazaar Item 4"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 5", "Kak Bazaar Item 5"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 6", "Kak Bazaar Item 6"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 7", "Kak Bazaar Item 7"), + RC_OBJECT(RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 8", "Kak Bazaar Item 8"), + RC_OBJECT(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"), +}; + +std::vector rcObjectsGY = { + RC_OBJECT(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Shield Grave Chest", "GY Shield Grave Chest"), + RC_OBJECT(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"), + RC_OBJECT(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Composers Grave Chest", "GY Composers Grave Chest"), + RC_OBJECT(RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Hookshot Chest", "GY Hookshot Chest"), + RC_OBJECT(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"), + RC_OBJECT(RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Freestanding PoH", "GY Freestanding PoH"), + RC_OBJECT(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"), + RC_OBJECT(RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Wall", "Graveyard GS Wall"), + RC_OBJECT(RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Bean Patch", "Graveyard GS Bean Patch"), + RC_OBJECT(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Song from Composers Grave", "Song from Composers Grave"), + RC_OBJECT(RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, "Gossip Stone", "GY Gossip Stone"), +}; + +std::vector rcObjectsDMT = { + RC_OBJECT(RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Chest", "DMT Chest"), + RC_OBJECT(RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Chest", "DMT Storms Grotto Chest"), + RC_OBJECT(RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Broken Sword", "DMT Trade Broken Sword"), + RC_OBJECT(RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Eyedrops", "DMT Trade Eyedrops"), + RC_OBJECT(RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Claim Check", "DMT Trade Claim Check"), + RC_OBJECT(RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Freestanding PoH", "DMT Freestanding PoH"), + RC_OBJECT(RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Bean Patch", "DMT GS Bean Patch"), + RC_OBJECT(RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Near Kak", "DMT GS Near Kak"), + RC_OBJECT(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"), + RC_OBJECT(RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"), + RC_OBJECT(RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Great Fairy Reward", "DMT Great Fairy Reward"), + RC_OBJECT(RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, "Cow Grotto Cow", "DMT Cow Grotto Cow"), + RC_OBJECT(RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Gossip Stone", "DMT Gossip Stone"), + RC_OBJECT(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"), +}; + +std::vector rcObjectsGC = { + RC_OBJECT(RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Left Chest", "GC Maze Left Chest"), + RC_OBJECT(RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Right Chest", "GC Maze Right Chest"), + RC_OBJECT(RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Center Chest", "GC Maze Center Chest"), + RC_OBJECT(RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Child", "GC Rolling Goron as Child"), + RC_OBJECT(RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Adult", "GC Rolling Goron as Adult"), + RC_OBJECT(RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Darunias Joy", "GC Darunias Joy"), + RC_OBJECT(RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Pot Freestanding PoH", "GC Pot Freestanding PoH"), + RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"), + RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"), + RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"), + RC_OBJECT(RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Medigoron", "GC Medigoron"), + RC_OBJECT(RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Center Platform", "GC GS Center Platform"), + RC_OBJECT(RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Boulder Maze", "GC GS Boulder Maze"), + RC_OBJECT(RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 1", "GC Shop Item 1"), + RC_OBJECT(RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 2", "GC Shop Item 2"), + RC_OBJECT(RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 3", "GC Shop Item 3"), + RC_OBJECT(RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 4", "GC Shop Item 4"), + RC_OBJECT(RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 5", "GC Shop Item 5"), + RC_OBJECT(RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 6", "GC Shop Item 6"), + RC_OBJECT(RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 7", "GC Shop Item 7"), + RC_OBJECT(RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 8", "GC Shop Item 8"), + RC_OBJECT(RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Maze Gossip Stone", "GC Maze Gossip Stone"), + RC_OBJECT(RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"), +}; + +std::vector rcObjectsDMC = { + RC_OBJECT(RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Chest", "DMC Upper Grotto Chest"), + RC_OBJECT(RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"), + RC_OBJECT(RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"), + RC_OBJECT(RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub", "DMC Deku Scrub"), + RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"), + RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"), + RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"), + RC_OBJECT(RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Bean Patch", "DMC GS Bean Patch"), + RC_OBJECT(RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Crate", "DMC GS Crate"), + RC_OBJECT(RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Great Fairy Reward", "DMC Great Fairy Reward"), + RC_OBJECT(RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Sheik in Crater", "Sheik in Crater"), + RC_OBJECT(RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Gossip Stone", "DMC Gossip Stone"), + RC_OBJECT(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"), +}; + +std::vector rcObjectsZR = { + RC_OBJECT(RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Open Grotto Chest", "ZR Open Grotto Chest"), + RC_OBJECT(RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Magic Bean Salesman", "ZR Magic Bean Salesman"), + RC_OBJECT(RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"), + RC_OBJECT(RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Epona's Song", "ZR Frogs Epona's Song"), + RC_OBJECT(RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Saria's Song", "ZR Frogs Saria's Song"), + RC_OBJECT(RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Sun's Song", "ZR Frogs Sun's Song"), + RC_OBJECT(RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Song of Time", "ZR Frogs Song of Time"), + RC_OBJECT(RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs in the Rain", "ZR Frogs in the Rain"), + RC_OBJECT(RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"), + RC_OBJECT(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"), + RC_OBJECT(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"), + RC_OBJECT(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"), + RC_OBJECT(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"), + RC_OBJECT(RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Ladder", "ZR GS Ladder"), + RC_OBJECT(RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Tree", "ZR GS Tree"), + RC_OBJECT(RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Above Bridge", "ZR GS Above Bridge"), + RC_OBJECT(RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"), + RC_OBJECT(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"), + RC_OBJECT(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"), + RC_OBJECT(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"), +}; + +std::vector rcObjectsZD = { + RC_OBJECT(RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Chest", "ZD Chest"), + RC_OBJECT(RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Diving Minigame", "ZD Diving Minigame"), + RC_OBJECT(RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "King Zora Thawed", "ZD King Zora Thawed"), + RC_OBJECT(RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Trade Prescription", "ZD Trade Prescription"), + RC_OBJECT(RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"), + RC_OBJECT(RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 1", "ZD Shop Item 1"), + RC_OBJECT(RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 2", "ZD Shop Item 2"), + RC_OBJECT(RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 3", "ZD Shop Item 3"), + RC_OBJECT(RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 4", "ZD Shop Item 4"), + RC_OBJECT(RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 5", "ZD Shop Item 5"), + RC_OBJECT(RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 6", "ZD Shop Item 6"), + RC_OBJECT(RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 7", "ZD Shop Item 7"), + RC_OBJECT(RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 8", "ZD Shop Item 8"), + RC_OBJECT(RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, "Gossip Stone", "ZD Gossip Stone"), +}; + +std::vector rcObjectsZF = { + RC_OBJECT(RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"), + RC_OBJECT(RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"), + RC_OBJECT(RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Above The Log", "ZF GS Above The Log"), + RC_OBJECT(RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Hidden Cave", "ZF GS Hidden Cave"), + RC_OBJECT(RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Tree", "ZF GS Tree"), + RC_OBJECT(RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Great Fairy Reward", "ZF Great Fairy Reward"), + RC_OBJECT(RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Fairy Gossip Stone", "Fairy Gossip Stone"), + RC_OBJECT(RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Jabu Gossip Stone", "Jabu Gossip Stone"), +}; + +std::vector rcObjectsLLR = { + RC_OBJECT(RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Talons Chickens", "LLR Talons Chickens"), + RC_OBJECT(RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Freestanding PoH", "LLR Freestanding PoH"), + RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"), + RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"), + RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"), + RC_OBJECT(RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Back Wall", "LLR GS Back Wall"), + RC_OBJECT(RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Rain Shed", "LLR GS Rain Shed"), + RC_OBJECT(RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS House Window", "LLR GS House Window"), + RC_OBJECT(RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Tree", "LLR GS Tree"), + RC_OBJECT(RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Song from Malon", "Song from Malon"), + RC_OBJECT(RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Left Cow", "LLR Stables Left Cow"), + RC_OBJECT(RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Right Cow", "LLR Stables Right Cow"), + RC_OBJECT(RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Left Cow", "LLR Tower Left Cow"), + RC_OBJECT(RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Right Cow", "LLR Tower Right Cow"), +}; + +std::vector rcObjectsDT = { + RC_OBJECT(RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Map Chest", "Deku Tree Map Chest"), + RC_OBJECT(RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Compass Chest", "Deku Tree Compass Chest"), + RC_OBJECT(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"), + RC_OBJECT(RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Basement Chest", "Deku Tree Basement Chest"), + RC_OBJECT(RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Chest", "Deku Tree Slingshot Chest"), + RC_OBJECT(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Map Chest", "Deku Tree MQ Map Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Compass Chest", "Deku Tree MQ Compass Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Basement Chest", "Deku Tree MQ Basement Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"), + RC_OBJECT(RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"), + RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Back Room", "Deku Tree GS Basement Back Room"), + RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Gate", "Deku Tree GS Basement Gate"), + RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Vines", "Deku Tree GS Basement Vines"), + RC_OBJECT(RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Compass Room", "Deku Tree GS Compass Room"), + RC_OBJECT(RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Lobby", "Deku Tree MQ GS Lobby"), + RC_OBJECT(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"), + RC_OBJECT(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"), + RC_OBJECT(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"), + RC_OBJECT(RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma", "Queen Gohma"), + RC_OBJECT(RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"), +}; + +std::vector rcObjectsDC = { + RC_OBJECT(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Map Chest", "Dodongos Cavern Map Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Compass Chest", "Dodongos Cavern Compass Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"), + RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"), + RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"), + RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"), + RC_OBJECT(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"), + RC_OBJECT(RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"), + RC_OBJECT(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"), + RC_OBJECT(RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Back Room", "Dodongos Cavern GS Back Room"), + RC_OBJECT(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"), + RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"), + RC_OBJECT(RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo", "King Dodongo"), + RC_OBJECT(RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"), + RC_OBJECT(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, "Gossip Stone", "Dodongo's Cavern Gossip Stone"), +}; + +std::vector rcObjectsJB = { + RC_OBJECT(RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Map Chest", "Jabu Jabus Belly Map Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Compass Chest", "Jabu Jabus Belly Compass Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"), + RC_OBJECT(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"), + RC_OBJECT(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"), + RC_OBJECT(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"), + RC_OBJECT(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"), + RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"), + RC_OBJECT(RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade", "Barinade"), + RC_OBJECT(RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"), +}; + +std::vector rcObjectsFST = { + RC_OBJECT(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Room Chest", "Forest Temple First Room Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Stalfos Chest", "Forest Temple First Stalfos Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "Map Chest", "Forest Temple Map Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Well Chest", "Forest Temple Well Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Eye Switch Chest", "Forest Temple Eye Switch Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Boss Key Chest", "Forest Temple Boss Key Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Floormaster Chest", "Forest Temple Floormaster Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Bow Chest", "Forest Temple Bow Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Red Poe Chest", "Forest Temple Red Poe Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Blue Poe Chest", "Forest Temple Blue Poe Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Basement Chest", "Forest Temple Basement Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ First Room Chest", "Forest Temple MQ First Room Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Bow Chest", "Forest Temple MQ Bow Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Well Chest", "Forest Temple MQ Well Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Map Chest", "Forest Temple MQ Map Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Compass Chest", "Forest Temple MQ Compass Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Basement Chest", "Forest Temple MQ Basement Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Redead Chest", "Forest Temple MQ Redead Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"), + RC_OBJECT(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"), + RC_OBJECT(RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS First Room", "Forest Temple GS First Room"), + RC_OBJECT(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"), + RC_OBJECT(RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Lobby", "Forest Temple GS Lobby"), + RC_OBJECT(RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Basement", "Forest Temple GS Basement"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"), + RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Well", "Forest Temple MQ GS Well"), + RC_OBJECT(RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon", "Phantom Ganon"), + RC_OBJECT(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"), +}; + +std::vector rcObjectsFRT = { + RC_OBJECT(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Near Boss Chest", "Fire Temple Near Boss Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boss Key Chest", "Fire Temple Boss Key Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Scarecrow Chest", "Fire Temple Scarecrow Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Map Chest", "Fire Temple Map Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Compass Chest", "Fire Temple Compass Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Highest Goron Chest", "Fire Temple Highest Goron Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Compass Chest", "Fire Temple MQ Compass Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Map Chest", "Fire Temple MQ Map Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"), + RC_OBJECT(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Song of Time Room", "Fire Temple GS Song of Time Room"), + RC_OBJECT(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"), + RC_OBJECT(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boulder Maze", "Fire Temple GS Boulder Maze"), + RC_OBJECT(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"), + RC_OBJECT(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"), + RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"), + RC_OBJECT(RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia", "Volvagia"), + RC_OBJECT(RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"), +}; + +std::vector rcObjectsWT = { + RC_OBJECT(RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Map Chest", "Water Temple Map Chest"), + RC_OBJECT(RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Compass Chest", "Water Temple Compass Chest"), + RC_OBJECT(RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Torches Chest", "Water Temple Torches Chest"), + RC_OBJECT(RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Dragon Chest", "Water Temple Dragon Chest"), + RC_OBJECT(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"), + RC_OBJECT(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Pillar Chest", "Water Temple Central Pillar Chest"), + RC_OBJECT(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"), + RC_OBJECT(RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Boss Key Chest", "Water Temple Boss Key Chest"), + RC_OBJECT(RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Longshot Chest", "Water Temple Longshot Chest"), + RC_OBJECT(RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "River Chest", "Water Temple River Chest"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Compass Chest", "Water Temple MQ Compass Chest"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Map Chest", "Water Temple MQ Map Chest"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"), + RC_OBJECT(RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Behind Gate", "Water Temple GS Behind Gate"), + RC_OBJECT(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"), + RC_OBJECT(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Central Pillar", "Water Temple GS Central Pillar"), + RC_OBJECT(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"), + RC_OBJECT(RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS River", "Water Temple GS River"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS River", "Water Temple MQ GS River"), + RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"), + RC_OBJECT(RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha", "Morpha"), + RC_OBJECT(RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha Heart Container", "Water Temple Morpha Heart Container"), +}; + +std::vector rcObjectsSPT = { + RC_OBJECT(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Compass Chest", "Spirit Temple Compass Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Map Chest", "Spirit Temple Map Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Boss Key Chest", "Spirit Temple Boss Key Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Topmost Chest", "Spirit Temple Topmost Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Map Chest", "Spirit Temple MQ Map Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"), + RC_OBJECT(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"), + RC_OBJECT(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Boulder Room", "Spirit Temple GS Boulder Room"), + RC_OBJECT(RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Lobby", "Spirit Temple GS Lobby"), + RC_OBJECT(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"), + RC_OBJECT(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Metal Fence", "Spirit Temple GS Metal Fence"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"), + RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"), + RC_OBJECT(RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova", "Twinrova"), + RC_OBJECT(RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"), +}; + +std::vector rcObjectsSDT = { + RC_OBJECT(RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Map Chest", "Shadow Temple Map Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Compass Chest", "Shadow Temple Compass Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Boss Key Chest", "Shadow Temple Boss Key Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Freestanding Key", "Shadow Temple Freestanding Key"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Map Chest", "Shadow Temple MQ Map Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"), + RC_OBJECT(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"), + RC_OBJECT(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"), + RC_OBJECT(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"), + RC_OBJECT(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Like Like Room", "Shadow Temple GS Like Like Room"), + RC_OBJECT(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Near Ship", "Shadow Temple GS Near Ship"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"), + RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"), + RC_OBJECT(RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo", "Bongo Bongo"), + RC_OBJECT(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"), +}; + +std::vector rcObjectsBW = { + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Compass Chest", "Bottom of the Well Compass Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Invisible Chest", "Bottom of the Well Invisible Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Map Chest", "Bottom of the Well Map Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Like Like Chest", "Bottom of the Well Like Like Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Freestanding Key", "Bottom of the Well Freestanding Key"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Map Chest", "Bottom of the Well MQ Map Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS East Inner Room", "Bottom of the Well GS East Inner Room"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS West Inner Room", "Bottom of the Well GS West Inner Room"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Basement", "Bottom of the Well MQ GS Basement"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"), + RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"), +}; + +std::vector rcObjectsIC = { + RC_OBJECT(RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Map Chest", "Ice Cavern Map Chest"), + RC_OBJECT(RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Compass Chest", "Ice Cavern Compass Chest"), + RC_OBJECT(RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"), + RC_OBJECT(RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Freestanding PoH", "Ice Cavern Freestanding PoH"), + RC_OBJECT(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"), + RC_OBJECT(RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"), + RC_OBJECT(RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Map Chest", "Ice Cavern MQ Map Chest"), + RC_OBJECT(RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"), + RC_OBJECT(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Push Block Room", "Ice Cavern GS Push Block Room"), + RC_OBJECT(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"), + RC_OBJECT(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"), + RC_OBJECT(RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"), + RC_OBJECT(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"), + RC_OBJECT(RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"), + RC_OBJECT(RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Sheik in Ice Cavern", "Sheik in Ice Cavern"), +}; + +std::vector rcObjectsGTG = { + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"), + RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"), +}; + +std::vector rcObjectsGNC = { + RC_OBJECT(RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Boss Key Chest", "Ganon's Tower Boss Key Chest"), + RC_OBJECT(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"), + RC_OBJECT(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"), + RC_OBJECT(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"), + RC_OBJECT(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"), + RC_OBJECT(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"), + RC_OBJECT(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"), + RC_OBJECT(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"), + RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"), + RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"), + RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"), + RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"), + RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"), + RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"), +}; + +std::map rcAreaNames = { + { RCAREA_KOKIRI_FOREST, "Kokiri Forest"}, + { RCAREA_LOST_WOODS, "Lost Woods"}, + { RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow"}, + { RCAREA_HYRULE_FIELD, "Hyrule Field"}, + { RCAREA_LAKE_HYLIA, "Lake Hylia"}, + { RCAREA_GERUDO_VALLEY, "Gerudo Valley"}, + { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress"}, + { RCAREA_WASTELAND, "Desert Wasteland"}, + { RCAREA_DESERT_COLOSSUS, "Desert Colossus"}, + { RCAREA_MARKET, "Hyrule Market"}, + { RCAREA_HYRULE_CASTLE, "Hyrule Castle"}, + { RCAREA_KAKARIKO_VILLAGE, "Kakariko Village"}, + { RCAREA_GRAVEYARD, "Graveyard"}, + { RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail"}, + { RCAREA_GORON_CITY, "Goron City"}, + { RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater"}, + { RCAREA_ZORAS_RIVER, "Zora's River"}, + { RCAREA_ZORAS_DOMAIN, "Zora's Domain"}, + { RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain"}, + { RCAREA_LON_LON_RANCH, "Lon Lon Ranch"}, + { RCAREA_DEKU_TREE, "Deku Tree"}, + { RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern"}, + { RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly"}, + { RCAREA_FOREST_TEMPLE, "Forest Temple"}, + { RCAREA_FIRE_TEMPLE, "Fire Temple"}, + { RCAREA_WATER_TEMPLE, "Water Temple"}, + { RCAREA_SPIRIT_TEMPLE, "Spirit Temple"}, + { RCAREA_SHADOW_TEMPLE, "Shadow Temple"}, + { RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well"}, + { RCAREA_ICE_CAVERN, "Ice Cavern"}, + { RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Grounds"}, + { RCAREA_GANONS_CASTLE, "Ganon's Castle"}, }; +std::map> rcObjects = { + { RCAREA_KOKIRI_FOREST, rcObjectsKF }, + { RCAREA_LOST_WOODS, rcObjectsLW }, + { RCAREA_SACRED_FOREST_MEADOW, rcObjectsSFM }, + { RCAREA_HYRULE_FIELD, rcObjectsHF }, + { RCAREA_LAKE_HYLIA, rcObjectsLH }, + { RCAREA_GERUDO_VALLEY, rcObjectsGV }, + { RCAREA_GERUDO_FORTRESS, rcObjectsGF }, + { RCAREA_WASTELAND, rcObjectsWL }, + { RCAREA_DESERT_COLOSSUS, rcObjectsCL }, + { RCAREA_MARKET, rcObjectsMK }, + { RCAREA_HYRULE_CASTLE, rcObjectsHC }, + { RCAREA_KAKARIKO_VILLAGE, rcObjectsKV }, + { RCAREA_GRAVEYARD, rcObjectsGY }, + { RCAREA_DEATH_MOUNTAIN_TRAIL, rcObjectsDMT }, + { RCAREA_GORON_CITY, rcObjectsGC }, + { RCAREA_DEATH_MOUNTAIN_CRATER, rcObjectsDMC }, + { RCAREA_ZORAS_RIVER, rcObjectsZR }, + { RCAREA_ZORAS_DOMAIN, rcObjectsZD }, + { RCAREA_ZORAS_FOUNTAIN, rcObjectsZF }, + { RCAREA_LON_LON_RANCH, rcObjectsLLR }, + { RCAREA_DEKU_TREE, rcObjectsDT }, + { RCAREA_DODONGOS_CAVERN, rcObjectsDC }, + { RCAREA_JABU_JABUS_BELLY, rcObjectsJB }, + { RCAREA_FOREST_TEMPLE, rcObjectsFST }, + { RCAREA_FIRE_TEMPLE, rcObjectsFRT }, + { RCAREA_WATER_TEMPLE, rcObjectsWT }, + { RCAREA_SPIRIT_TEMPLE, rcObjectsSPT }, + { RCAREA_SHADOW_TEMPLE, rcObjectsSDT }, + { RCAREA_BOTTOM_OF_THE_WELL, rcObjectsBW }, + { RCAREA_ICE_CAVERN, rcObjectsIC }, + { RCAREA_GERUDO_TRAINING_GROUND, rcObjectsGTG }, + { RCAREA_GANONS_CASTLE, rcObjectsGNC }, +}; + bool RandomizerCheckObjects::AreaIsDungeon(RandomizerCheckArea area) { return area == RCAREA_GANONS_CASTLE || area == RCAREA_GERUDO_TRAINING_GROUND || @@ -808,42 +933,40 @@ bool RandomizerCheckObjects::AreaIsOverworld(RandomizerCheckArea area) { return !AreaIsDungeon(area); } -std::map RandomizerCheckObjects::GetAllRCAreas() { - return rcAreas; +std::string RandomizerCheckObjects::GetRCAreaName(RandomizerCheckArea area) { + return rcAreaNames[area]; } -std::map RandomizerCheckObjects::GetAllRCObjects() { +std::map> RandomizerCheckObjects::GetAllRCObjects() { return rcObjects; } void RandomizerCheckObjects::UpdateImGuiVisibility() { - for (auto& locationIt : rcObjects) { - locationIt.second.visibleInImgui = ( - (locationIt.second.vOrMQ != RCVORMQ_MQ) && // don't show MQ checks until we support MQ - (locationIt.second.rcType != RCTYPE_SHOP) && // don't show shop items until we have shopsanity - (locationIt.second.rcType != RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) - (locationIt.second.rcType != RCTYPE_LINKS_POCKET) && - (locationIt.second.rcType != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them - ((locationIt.second.rcType != RCTYPE_SKULL_TOKEN) || - (CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens - ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(locationIt.second.rcArea)) || // overworld tokens - ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(locationIt.second.rcArea)) // dungeon tokens - ) && - ((locationIt.second.rcType != RCTYPE_COW) || CVar_GetS32("gRandomizeShuffleCows", 0)) && - ((locationIt.second.rcType != RCTYPE_ADULT_TRADE) || CVar_GetS32("gRandomizeShuffleAdultTrade", 0)) && - ((locationIt.second.rc != RC_KF_KOKIRI_SWORD_CHEST) || CVar_GetS32("gRandomizeShuffleKokiriSword", 0)) && - ((locationIt.second.rc != RC_HC_MALON_EGG) || CVar_GetS32("gRandomizeShuffleWeirdEgg", 0)) && - ((locationIt.second.rc != RC_GF_GERUDO_MEMBERSHIP_CARD) || CVar_GetS32("gRandomizeShuffleGerudoToken", 0)) && - ((locationIt.second.rcType != RCTYPE_FROG_SONG) || CVar_GetS32("gRandomizeShuffleFrogSongRupees", 0)) && - ((locationIt.second.rcType != RCTYPE_MAP_COMPASS) || CVar_GetS32("gRandomizeStartingMapsCompasses", 0) != 1) && // 1 is the value for "vanilla" maps/compasses - ((locationIt.second.rcType != RCTYPE_SMALL_KEY) || CVar_GetS32("gRandomizeKeysanity", 0) != 1) && // 1 is the value for "vanilla" small keys - ((locationIt.second.rcType != RCTYPE_GF_KEY) || CVar_GetS32("randoShuffleGerudoFortressKeys", 0) != 0) && // 0 is the value for "vanilla" gf keys - ((locationIt.second.rcType != RCTYPE_BOSS_KEY) || CVar_GetS32("gRandomizeBossKeysanity", 0) != 1) && // 1 is the value for "vanilla" boss keys - ((locationIt.second.rcType != RCTYPE_GANON_BOSS_KEY) || CVar_GetS32("gRandomizeShuffleGanonBossKey", 0) != 0) // 0 is the value for "vanilla" ganon's boss key - ); + for (auto& areaIt : rcObjects) { + for (auto& locationIt : areaIt.second) { + locationIt.visibleInImgui = ( + (locationIt.vOrMQ != RCVORMQ_MQ) && // don't show MQ checks until we support MQ + (locationIt.rcType != RCTYPE_SHOP) && // don't show shop items until we have shopsanity + (locationIt.rcType != RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) + (locationIt.rcType != RCTYPE_LINKS_POCKET) && + (locationIt.rcType != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them + ((locationIt.rcType != RCTYPE_SKULL_TOKEN) || + (CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(locationIt.rcArea)) || // overworld tokens + ((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(locationIt.rcArea)) // dungeon tokens + ) && + ((locationIt.rcType != RCTYPE_COW) || CVar_GetS32("gRandomizeShuffleCows", 0)) && + ((locationIt.rcType != RCTYPE_ADULT_TRADE) || CVar_GetS32("gRandomizeShuffleAdultTrade", 0)) && + ((locationIt.rc != RC_KF_KOKIRI_SWORD_CHEST) || CVar_GetS32("gRandomizeShuffleKokiriSword", 0)) && + ((locationIt.rc != RC_HC_MALON_EGG) || CVar_GetS32("gRandomizeShuffleWeirdEgg", 0)) && + ((locationIt.rc != RC_GF_GERUDO_MEMBERSHIP_CARD) || CVar_GetS32("gRandomizeShuffleGerudoToken", 0)) && + ((locationIt.rcType != RCTYPE_FROG_SONG) || CVar_GetS32("gRandomizeShuffleFrogSongRupees", 0)) && + ((locationIt.rcType != RCTYPE_MAP_COMPASS) || CVar_GetS32("gRandomizeStartingMapsCompasses", 0) != 1) && // 1 is the value for "vanilla" maps/compasses + ((locationIt.rcType != RCTYPE_SMALL_KEY) || CVar_GetS32("gRandomizeKeysanity", 0) != 1) && // 1 is the value for "vanilla" small keys + ((locationIt.rcType != RCTYPE_GF_KEY) || CVar_GetS32("randoShuffleGerudoFortressKeys", 0) != 0) && // 0 is the value for "vanilla" gf keys + ((locationIt.rcType != RCTYPE_BOSS_KEY) || CVar_GetS32("gRandomizeBossKeysanity", 0) != 1) && // 1 is the value for "vanilla" boss keys + ((locationIt.rcType != RCTYPE_GANON_BOSS_KEY) || CVar_GetS32("gRandomizeShuffleGanonBossKey", 0) != 0) // 0 is the value for "vanilla" ganon's boss key + ); + } } -} - -RandomizerCheckObject RandomizerCheckObjects::GetRCObject(RandomizerCheck check) { - return rcObjects[check]; -} +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index 544cab901..a871d778c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -1,6 +1,7 @@ #pragma once #include "randomizerTypes.h" #include +#include #include // Check types based on main settings @@ -76,8 +77,7 @@ typedef struct { namespace RandomizerCheckObjects { bool AreaIsDungeon(RandomizerCheckArea area); bool AreaIsOverworld(RandomizerCheckArea area); - std::map GetAllRCAreas(); - std::map GetAllRCObjects(); - void UpdateImGuiVisibility(); - RandomizerCheckObject GetRCObject(RandomizerCheck check); + std::string GetRCAreaName(RandomizerCheckArea area); + std::map> GetAllRCObjects(); + void UpdateImGuiVisibility(); } \ No newline at end of file From 815f5a91017ef0db3e74f78425ba253ebc8920dd Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 06:38:39 -0400 Subject: [PATCH 123/212] don't filter on right --- soh/soh/Enhancements/randomizer/randomizer.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 868ca0e6e..7025db172 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3795,10 +3795,7 @@ void DrawRandoEditor(bool& open) { for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { bool hasItems = false; for (auto locationIt : areaIt.second) { - if (locationIt.visibleInImgui && - excludedLocations.count(locationIt.rc) && - locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { - + if (locationIt.visibleInImgui && excludedLocations.count(locationIt.rc)) { hasItems = true; break; } @@ -3809,10 +3806,7 @@ void DrawRandoEditor(bool& open) { if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(areaIt.first).c_str())) { for (auto locationIt : areaIt.second) { auto elfound = excludedLocations.find(locationIt.rc); - if (locationIt.visibleInImgui && - elfound != excludedLocations.end() && - locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { - + if (locationIt.visibleInImgui && elfound != excludedLocations.end()) { if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Left)) { excludedLocations.erase(elfound); } From 7639c0f2ede3c2b17f16ba24b004fef3d21e89e8 Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 19 Aug 2022 14:41:20 +0200 Subject: [PATCH 124/212] Moved code to randomizer.cpp, fixes special chars --- soh/include/message_data_static.h | 22 +------ soh/include/message_data_textbox_types.h | 25 ++++++++ .../custom-message/CustomMessageManager.h | 26 +------- .../Enhancements/randomizer/randomizer.cpp | 64 ++++++++++++++++--- soh/soh/Enhancements/randomizer/randomizer.h | 3 + soh/soh/OTRGlobals.cpp | 52 +-------------- 6 files changed, 89 insertions(+), 103 deletions(-) create mode 100644 soh/include/message_data_textbox_types.h diff --git a/soh/include/message_data_static.h b/soh/include/message_data_static.h index c286771aa..0821f1093 100644 --- a/soh/include/message_data_static.h +++ b/soh/include/message_data_static.h @@ -3,32 +3,12 @@ #include "global.h" #include "message_data_fmt.h" +#include "message_data_textbox_types.h" #ifdef __cplusplus extern "C" { #endif -typedef enum { - /* 0 */ TEXTBOX_TYPE_BLACK, - /* 1 */ TEXTBOX_TYPE_WOODEN, - /* 2 */ TEXTBOX_TYPE_BLUE, - /* 3 */ TEXTBOX_TYPE_OCARINA, - /* 4 */ TEXTBOX_TYPE_NONE_BOTTOM, - /* 5 */ TEXTBOX_TYPE_NONE_NO_SHADOW, - /* 11 */ TEXTBOX_TYPE_CREDITS = 11 -} TextBoxType; - -typedef enum { - /* 0 */ TEXTBOX_BG_CROSS -} TextBoxBackground; - -typedef enum { - /* 0 */ TEXTBOX_POS_VARIABLE, - /* 1 */ TEXTBOX_POS_TOP, - /* 2 */ TEXTBOX_POS_MIDDLE, - /* 3 */ TEXTBOX_POS_BOTTOM -} TextBoxPosition; - typedef struct { u16 textId; u8 typePos; diff --git a/soh/include/message_data_textbox_types.h b/soh/include/message_data_textbox_types.h new file mode 100644 index 000000000..2567617e9 --- /dev/null +++ b/soh/include/message_data_textbox_types.h @@ -0,0 +1,25 @@ +#ifndef MESSAGE_DATA_TEXTBOX_TYPES_H +#define MESSAGE_DATA_TEXTBOX_TYPES_H + +typedef enum { + /* 0 */ TEXTBOX_TYPE_BLACK, + /* 1 */ TEXTBOX_TYPE_WOODEN, + /* 2 */ TEXTBOX_TYPE_BLUE, + /* 3 */ TEXTBOX_TYPE_OCARINA, + /* 4 */ TEXTBOX_TYPE_NONE_BOTTOM, + /* 5 */ TEXTBOX_TYPE_NONE_NO_SHADOW, + /* 11 */ TEXTBOX_TYPE_CREDITS = 11 +} TextBoxType; + +typedef enum { + /* 0 */ TEXTBOX_BG_CROSS +} TextBoxBackground; + +typedef enum { + /* 0 */ TEXTBOX_POS_VARIABLE, + /* 1 */ TEXTBOX_POS_TOP, + /* 2 */ TEXTBOX_POS_MIDDLE, + /* 3 */ TEXTBOX_POS_BOTTOM +} TextBoxPosition; + +#endif \ No newline at end of file diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 0681073b8..2764e97c8 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -2,6 +2,7 @@ #include #include #include "../../../include/z64item.h" +#include "../../../include/message_data_textbox_types.h" #undef MESSAGE_END @@ -14,31 +15,6 @@ #define QM_YELLOW 0x46 #define QM_BLACK 0x47 -#ifndef MESSAGE_DATA_STATIC_H - -typedef enum { - /* 0 */ TEXTBOX_TYPE_BLACK, - /* 1 */ TEXTBOX_TYPE_WOODEN, - /* 2 */ TEXTBOX_TYPE_BLUE, - /* 3 */ TEXTBOX_TYPE_OCARINA, - /* 4 */ TEXTBOX_TYPE_NONE_BOTTOM, - /* 5 */ TEXTBOX_TYPE_NONE_NO_SHADOW, - /* 11 */ TEXTBOX_TYPE_CREDITS = 11 -} TextBoxType; - -typedef enum { - /* 0 */ TEXTBOX_BG_CROSS -} TextBoxBackground; - -typedef enum { - /* 0 */ TEXTBOX_POS_VARIABLE, - /* 1 */ TEXTBOX_POS_TOP, - /* 2 */ TEXTBOX_POS_MIDDLE, - /* 3 */ TEXTBOX_POS_BOTTOM -} TextBoxPosition; - -#endif - typedef struct { TextBoxType textBoxType; TextBoxPosition textBoxPos; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 3cae6f9b8..47caa943a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -14,7 +14,6 @@ #include "3drando/rando_main.hpp" #include #include "Lib/ImGui/imgui_internal.h" -#include #include using json = nlohmann::json; @@ -4629,27 +4628,76 @@ void CreateRupeeMessages() { for (u8 rupee : rupees) { switch (rupee) { case TEXT_BLUE_RUPEE: - rupeeText = "\x05\x03 5 %RUPEE% \x05\x00"; + rupeeText = "\x05\x03 5 %RUPEE%\x05\x00"; break; case TEXT_RED_RUPEE: - rupeeText = "\x05\x01 20 %RUPEE% \x05\x00"; + rupeeText = "\x05\x01 20 %RUPEE%\x05\x00"; break; case TEXT_PURPLE_RUPEE: - rupeeText = "\x05\x05 50 %RUPEE% \x05\x00"; + rupeeText = "\x05\x05 50 %RUPEE%\x05\x00"; break; case TEXT_HUGE_RUPEE: - rupeeText = "\x05\x06 200 %RUPEE% \x05\x00"; + rupeeText = "\x05\x06 200 %RUPEE%\x05\x00"; break; } customMessageManager->CreateMessage(Randomizer::rupeeMessageTableID, rupee, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, - "You found" + rupeeText + "!", - "Du hast" + rupeeText + " gefunden!", - "Vous obtenez" + rupeeText + "!" + "You found" + rupeeText + " !", + "Du hast" + rupeeText + " gefunden!", + "Vous obtenez" + rupeeText + " !" }); } } +std::string Randomizer::Randomizer_InsertRupeeName(std::string message, int language) { + const char* englishRupeeNames[40] = { + "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", + "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", + "Dogecoin", "Mushrooms", "Experience", "Friends", "Coins", "Rings", "Gil", "Pokédollars", + "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", "Smackaroos", "Zorkmids", + "Zenny", "Bones", "Souls", "Studs", "Munny", "Rubies", "Gald", "Gold" + }; + const char* germanRupeeNames[1] = { "Rubine" }; + const char* frenchRupeeNames[36] = { + "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", "Diamants", + "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", + "Pokédollars", "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", + "Champignons", "Blés", "Halos", "Munnies", "Orens", "Florens", "Crédits", "Galds", + "Bling", "Orbes", "Baguettes", "Croissants" + }; + int randomIndex; + std::string replaceWith; + switch (language) { + case LANGUAGE_ENG: + randomIndex = rand() % (sizeof(englishRupeeNames) / sizeof(englishRupeeNames[0])); + replaceWith = englishRupeeNames[randomIndex]; + break; + case LANGUAGE_GER: + randomIndex = rand() % (sizeof(germanRupeeNames) / sizeof(germanRupeeNames[0])); + replaceWith = germanRupeeNames[randomIndex]; + break; + case LANGUAGE_FRA: + randomIndex = rand() % (sizeof(frenchRupeeNames) / sizeof(frenchRupeeNames[0])); + replaceWith = frenchRupeeNames[randomIndex]; + break; + } + std::string replaceString = "%RUPEE%"; + size_t pos = message.find(replaceString); + size_t len = replaceString.length(); + message.replace(pos, len, replaceWith); + CustomMessageManager::Instance->FormatCustomMessage(message); + return message; +} + +CustomMessageEntry Randomizer::Randomizer_GetRupeeMessage(u16 rupeeTextId) { + CustomMessageEntry messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); + messageEntry.english = Randomizer::Randomizer_InsertRupeeName(messageEntry.english, LANGUAGE_ENG); + messageEntry.german = Randomizer::Randomizer_InsertRupeeName(messageEntry.german, LANGUAGE_GER); + messageEntry.french = Randomizer::Randomizer_InsertRupeeName(messageEntry.french, LANGUAGE_FRA); + return messageEntry; +} + void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 88c4f0296..9ec983e14 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -6,6 +6,7 @@ #include "../../../include/z64item.h" #include #include +#include class Randomizer { private: @@ -47,6 +48,8 @@ class Randomizer { GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); static void CreateCustomMessages(); + std::string Randomizer_InsertRupeeName(std::string message, int language); + CustomMessageEntry Randomizer_GetRupeeMessage(u16 rupeeTextId); }; #ifdef __cplusplus diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 1df80f38e..2a5180dce 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -33,6 +33,7 @@ #include "Enhancements/cosmetics/CosmeticsEditor.h" #include "Enhancements/debugconsole.h" #include "Enhancements/debugger/debugger.h" +#include #include #include "Enhancements/n64_weird_frame_data.inc" #include "soh/frame_interpolation.h" @@ -1447,54 +1448,6 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); } -extern "C" std::string Randomizer_InsertRupeeName(std::string message, int language) { - const char* englishRupeeNames[40] = { - "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", "Emeralds", "Bucks", - "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", "Dogecoin", "Mushrooms", "Experience", "Friends", - "Coins", "Rings", "Gil", "Pokédollars", "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", - "Smackaroos", "Zorkmids", "Zenny", "Bones", "Souls", "Studs", "Munny", "Rubies", "Gald", "Gold" - }; - const char* germanRupeeNames[1] = { - "Rubine" - }; - const char* frenchRupeeNames[36] = { - "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", - "Diamants", "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", "Pokédollars", - "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", "Champignons", "Blés", "Halos", - "Munnies", "Orens", "Florens", "Crédits", "Galds", "Bling", "Orbes", "Baguettes", "Croissants" - }; - int randomIndex; - std::string replaceWith; - switch (language) { - case LANGUAGE_ENG: - randomIndex = rand() % (sizeof(englishRupeeNames) / sizeof(englishRupeeNames[0])); - replaceWith = englishRupeeNames[randomIndex]; - break; - case LANGUAGE_GER: - randomIndex = rand() % (sizeof(germanRupeeNames) / sizeof(germanRupeeNames[0])); - replaceWith = germanRupeeNames[randomIndex]; - break; - case LANGUAGE_FRA: - randomIndex = rand() % (sizeof(frenchRupeeNames) / sizeof(frenchRupeeNames[0])); - replaceWith = frenchRupeeNames[randomIndex]; - break; - } - std::string replaceString = "%RUPEE%"; - size_t pos = message.find(replaceString); - size_t len = replaceString.length(); - message.replace(pos, len, replaceWith); - CustomMessageManager::Instance->FormatCustomMessage(message); - return message; -} - -extern "C" CustomMessageEntry Randomizer_GetRupeeMessage(u16 rupeeTextId) { - CustomMessageEntry messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); - messageEntry.english = Randomizer_InsertRupeeName(messageEntry.english, LANGUAGE_ENG); - messageEntry.german = Randomizer_InsertRupeeName(messageEntry.german, LANGUAGE_GER); - messageEntry.french = Randomizer_InsertRupeeName(messageEntry.french, LANGUAGE_FRA); - return messageEntry; -} - extern "C" CustomMessageEntry Randomizer_GetAltarMessage() { return (LINK_IS_ADULT) ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) @@ -1591,7 +1544,8 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } else if (!CVar_GetS32("gRandoDisableRandomRupeeNames", 0) && (textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE || textId == TEXT_HUGE_RUPEE)) { - messageEntry = Randomizer_GetRupeeMessage(textId); + Randomizer randomizerInstance; + messageEntry = randomizerInstance.Randomizer_GetRupeeMessage(textId); } } if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) { From 596d4cd3922becc8ddd44ed168ce9f057c7c4e82 Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 19 Aug 2022 14:45:18 +0200 Subject: [PATCH 125/212] More names --- soh/soh/Enhancements/randomizer/randomizer.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 47caa943a..e32a60dd1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4650,12 +4650,13 @@ void CreateRupeeMessages() { } std::string Randomizer::Randomizer_InsertRupeeName(std::string message, int language) { - const char* englishRupeeNames[40] = { - "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", - "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", - "Dogecoin", "Mushrooms", "Experience", "Friends", "Coins", "Rings", "Gil", "Pokédollars", - "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", "Smackaroos", "Zorkmids", - "Zenny", "Bones", "Souls", "Studs", "Munny", "Rubies", "Gald", "Gold" + const char* englishRupeeNames[44] = { + "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", + "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", + "Dogecoin", "Mushrooms", "Experience", "Friends", "Coins", "Rings", "Gil", "Pokédollars", + "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", "Smackaroos", "Zorkmids", + "Zenny", "Bones", "Souls", "Studs", "Munny", "Rubies", "Gald", "Gold", + "Shillings", "Pounds", "Glimmer", "Potch" }; const char* germanRupeeNames[1] = { "Rubine" }; const char* frenchRupeeNames[36] = { From 1ff006fa9e26646dfcb5dfd89816cd7a21164968 Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 19 Aug 2022 14:45:55 +0200 Subject: [PATCH 126/212] Fixed newline --- soh/include/message_data_textbox_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/include/message_data_textbox_types.h b/soh/include/message_data_textbox_types.h index 2567617e9..03332182c 100644 --- a/soh/include/message_data_textbox_types.h +++ b/soh/include/message_data_textbox_types.h @@ -22,4 +22,4 @@ typedef enum { /* 3 */ TEXTBOX_POS_BOTTOM } TextBoxPosition; -#endif \ No newline at end of file +#endif From 1c785560c4d36778778ce2e12989e69808b4a7e5 Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 19 Aug 2022 14:49:30 +0200 Subject: [PATCH 127/212] Changed tooltip --- libultraship/libultraship/ImGuiImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 7f9b3765c..09e67233b 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1914,7 +1914,7 @@ namespace SohImGui { ); PaddedEnhancementCheckbox("Disable Random Rupee Names", "gRandoDisableRandomRupeeNames", true, false); Tooltip( - "Disables the random rupee names in the textbox when obtaining rupees." + "Reverts textboxes for collecting rupees to their default state, disabling the randomization of rupee names." ); ImGui::EndMenu(); } From 0eee085981c88a392c6eb8119d6a7902497241b6 Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 09:30:17 -0400 Subject: [PATCH 128/212] save/load locations to a string cvar --- .../Enhancements/randomizer/randomizer.cpp | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 7025db172..7e0264b56 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -17,6 +17,7 @@ #include #include #include "randomizer_check_objects.h" +#include using json = nlohmann::json; using namespace std::literals::string_literals; @@ -3735,6 +3736,13 @@ void DrawRandoEditor(bool& open) { if (!locationsTabOpen) { locationsTabOpen = true; RandomizerCheckObjects::UpdateImGuiVisibility(); + // todo: this efficently when we build out cvar array support + std::stringstream excludedLocationStringStream(CVar_GetString("gRandomizeExcludedLocations", "")); + std::string excludedLocationString; + excludedLocations.clear(); + while(getline(excludedLocationStringStream, excludedLocationString, ',')) { + excludedLocations.insert((RandomizerCheck)std::stoi(excludedLocationString)); + } } if (ImGui::BeginTable("tableRandoLocations", 2, @@ -3776,6 +3784,14 @@ void DrawRandoEditor(bool& open) { if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Right)) { excludedLocations.insert(locationIt.rc); + // todo: this efficently when we build out cvar array support + std::string excludedLocationString = ""; + for (auto excludedLocationIt : excludedLocations) { + excludedLocationString += std::to_string(excludedLocationIt); + excludedLocationString += ","; + } + CVar_SetString("gRandomizeExcludedLocations", excludedLocationString.c_str()); + SohImGui::needs_save = true; } ImGui::SameLine(); ImGui::Text(locationIt.rcShortName.c_str()); @@ -3809,6 +3825,14 @@ void DrawRandoEditor(bool& open) { if (locationIt.visibleInImgui && elfound != excludedLocations.end()) { if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Left)) { excludedLocations.erase(elfound); + // todo: this efficently when we build out cvar array support + std::string excludedLocationString = ""; + for (auto excludedLocationIt : excludedLocations) { + excludedLocationString += std::to_string(excludedLocationIt); + excludedLocationString += ","; + } + CVar_SetString("gRandomizeExcludedLocations", excludedLocationString.c_str()); + SohImGui::needs_save = true; } ImGui::SameLine(); ImGui::Text(locationIt.rcShortName.c_str()); From 0971b9aa78444a0e773b47c757deb9f4cddf1444 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Fri, 19 Aug 2022 09:46:11 -0400 Subject: [PATCH 129/212] only toggle menu with controller when controller nav enabled (#1043) --- libultraship/libultraship/ControlDeck.cpp | 5 ----- libultraship/libultraship/ImGuiImpl.cpp | 17 ++++------------- soh/soh/Enhancements/bootcommands.c | 3 +++ 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/libultraship/libultraship/ControlDeck.cpp b/libultraship/libultraship/ControlDeck.cpp index 6e3328053..36e581fc7 100644 --- a/libultraship/libultraship/ControlDeck.cpp +++ b/libultraship/libultraship/ControlDeck.cpp @@ -73,12 +73,7 @@ namespace Ship { } void ControlDeck::WriteToPad(OSContPad* pad) const { - - #ifdef __SWITCH__ - bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0); - #else bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0) && CVar_GetS32("gControlNav", 0); - #endif for (size_t i = 0; i < virtualDevices.size(); i++) { const std::shared_ptr backend = physicalDevices[virtualDevices[i]]; diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index b6353a736..b3b8a1c78 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -484,12 +484,7 @@ namespace SohImGui { io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; } - #ifdef __SWITCH__ - bool enableControllerNavigation = true; - #else - bool enableControllerNavigation = CVar_GetS32("gControlNav", 0); - #endif - if (enableControllerNavigation && CVar_GetS32("gOpenMenuBar", 0)) { + if (CVar_GetS32("gControlNav", 0) && CVar_GetS32("gOpenMenuBar", 0)) { io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard; } else { io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; @@ -921,19 +916,15 @@ namespace SohImGui { ImGui::DockSpace(dockId, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None | ImGuiDockNodeFlags_NoDockingInCentralNode); - if (ImGui::IsKeyPressed(TOGGLE_BTN) || ImGui::IsKeyPressed(TOGGLE_PAD_BTN)) { + if (ImGui::IsKeyPressed(TOGGLE_BTN) || + (ImGui::IsKeyPressed(TOGGLE_PAD_BTN) && CVar_GetS32("gControlNav", 0))) { bool menu_bar = CVar_GetS32("gOpenMenuBar", 0); CVar_SetS32("gOpenMenuBar", !menu_bar); needs_save = true; GlobalCtx2::GetInstance()->GetWindow()->SetMenuBar(menu_bar); ShowCursor(menu_bar, Dialogues::dMenubar); GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->SaveControllerSettings(); - #ifdef __SWITCH__ - bool enableControllerNavigation = true; - #else - bool enableControllerNavigation = CVar_GetS32("gControlNav", 0); - #endif - if (enableControllerNavigation && CVar_GetS32("gOpenMenuBar", 0)) { + if (CVar_GetS32("gControlNav", 0) && CVar_GetS32("gOpenMenuBar", 0)) { io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard; } else { io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index c766049ae..c5d4fcdbc 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -25,6 +25,9 @@ void BootCommands_Init() CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gLanguages", 0); //0 = English / 1 = German / 2 = French CVar_RegisterS32("gHudColors", 1); //0 = N64 / 1 = NGC / 2 = Custom +#ifdef __SWITCH__ + CVar_RegisterS32("gControlNav", 1); // always enable controller nav on switch +#endif } //void BootCommands_ParseBootArgs(char* str) From db7e1bf332dc10be30ea5adbce1f4586c41c06ac Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 10:36:54 -0400 Subject: [PATCH 130/212] trying to figure stuff out --- soh/soh/Enhancements/randomizer/3drando/item_location.hpp | 4 ++++ soh/soh/Enhancements/randomizer/randomizer.cpp | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp b/soh/soh/Enhancements/randomizer/3drando/item_location.hpp index a76e028aa..823cd88ef 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.hpp @@ -168,6 +168,10 @@ public: return key; } + RandomizerCheck GetRandomizerCheck() const { + return rc; + } + SpoilerCollectionCheck GetCollectionCheck() const { return collectionCheck; } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 7e0264b56..d5868a908 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2854,7 +2854,13 @@ void GenerateRandomizerImgui() { cvarSettings[RSK_SKULLS_SUNS_SONG] = CVar_GetS32("gRandomizeGsExpectSunsSong", 0); - std::set excludedLocations = { RC_UNKNOWN_CHECK }; + // todo: this efficently when we build out cvar array support + std::set excludedLocations; + std::stringstream excludedLocationStringStream(CVar_GetString("gRandomizeExcludedLocations", "")); + std::string excludedLocationString; + while(getline(excludedLocationStringStream, excludedLocationString, ',')) { + excludedLocations.insert((RandomizerCheck)std::stoi(excludedLocationString)); + } RandoMain::GenerateRando(cvarSettings, excludedLocations); From c1455cedea2cbc933160658f5a879219dbf694fc Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 10:56:26 -0400 Subject: [PATCH 131/212] fix broken seed parsing --- soh/soh/Enhancements/randomizer/randomizer.cpp | 9 ++------- soh/soh/Enhancements/randomizer/randomizerTypes.h | 6 ------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index d5868a908..e7e1467dd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -67,6 +67,8 @@ Randomizer::Randomizer() { for (auto locationIt : areaIt.second) { SpoilerfileCheckNameToEnum[locationIt.rcSpoilerName] = locationIt.rc; } + SpoilerfileCheckNameToEnum["Invalid Location"] = RC_UNKNOWN_CHECK; + SpoilerfileCheckNameToEnum["Link's Pocket"] = RC_LINKS_POCKET; } } @@ -2828,13 +2830,6 @@ void GenerateRandomizerImgui() { cvarSettings[RSK_STARTING_CONSUMABLES] = CVar_GetS32("gRandomizeStartingConsumables", 0); cvarSettings[RSK_FULL_WALLETS] = CVar_GetS32("gRandomizeFullWallets", 0); - cvarSettings[RSK_EXCLUDE_DEKU_THEATER_MASK_OF_TRUTH] = CVar_GetS32("gRandomizeExcludeDekuTheaterMaskOfTruth", 0); - cvarSettings[RSK_EXCLUDE_KAK_10_GOLD_SKULLTULA_REWARD] = CVar_GetS32("gRandomizeExcludeKak10SkullReward", 0); - cvarSettings[RSK_EXCLUDE_KAK_20_GOLD_SKULLTULA_REWARD] = CVar_GetS32("gRandomizeExcludeKak20SkullReward", 0); - cvarSettings[RSK_EXCLUDE_KAK_30_GOLD_SKULLTULA_REWARD] = CVar_GetS32("gRandomizeExcludeKak30SkullReward", 0); - cvarSettings[RSK_EXCLUDE_KAK_40_GOLD_SKULLTULA_REWARD] = CVar_GetS32("gRandomizeExcludeKak40SkullReward", 0); - cvarSettings[RSK_EXCLUDE_KAK_50_GOLD_SKULLTULA_REWARD] = CVar_GetS32("gRandomizeExcludeKak50SkullReward", 0); - // RANDOTODO implement chest minigame shuffle with keysanity cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME] = false; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 58faeaa7b..742fd56db 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -996,13 +996,7 @@ typedef enum { RSK_SKIP_CHILD_ZELDA, RSK_STARTING_CONSUMABLES, RSK_FULL_WALLETS, - RSK_EXCLUDE_DEKU_THEATER_MASK_OF_TRUTH, RSK_LANGUAGE, - RSK_EXCLUDE_KAK_10_GOLD_SKULLTULA_REWARD, - RSK_EXCLUDE_KAK_20_GOLD_SKULLTULA_REWARD, - RSK_EXCLUDE_KAK_30_GOLD_SKULLTULA_REWARD, - RSK_EXCLUDE_KAK_40_GOLD_SKULLTULA_REWARD, - RSK_EXCLUDE_KAK_50_GOLD_SKULLTULA_REWARD, RSK_SHUFFLE_CHEST_MINIGAME, RSK_CUCCO_COUNT, RSK_BIG_POE_COUNT, From 3b951efac2c26f27fd7c46a14520913422707a85 Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 12:54:27 -0400 Subject: [PATCH 132/212] rename columns, use excluded locations --- .../randomizer/3drando/settings.cpp | 36 ++++++------------- .../Enhancements/randomizer/randomizer.cpp | 12 +++---- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 1d3572724..7edd7574d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2496,6 +2496,17 @@ namespace Settings { break; } + AddExcludedOptions(); + for (auto locationKey : everyPossibleLocation) { + auto location = Location(locationKey); + if (excludedLocations.count(location->GetRandomizerCheck())) { + location->GetExcludedOption()->SetSelectedIndex(1); + } else { + location->GetExcludedOption()->SetSelectedIndex(0); + } + } + auto blarg = excludeLocationsOptionsVector.size(); + OpenForest.SetSelectedIndex(cvarSettings[RSK_FOREST]); OpenKakariko.SetSelectedIndex(cvarSettings[RSK_KAK_GATE]); ZorasFountain.SetSelectedIndex(cvarSettings[RSK_ZORAS_FOUNTAIN]); @@ -2581,31 +2592,6 @@ namespace Settings { // RANDOTODO implement chest shuffle with keysanity // ShuffleChestMinigame.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME]); - - AddExcludedOptions(); - for (size_t i = 1; i < Settings::excludeLocationsOptionsVector.size(); i++) { - for (const auto& location : Settings::excludeLocationsOptionsVector[i]) { - // RANDOTODO implement the ability to exclude any location - if (location->GetName() == "Deku Theater Mask of\n Truth") { - location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_DEKU_THEATER_MASK_OF_TRUTH]); - } - if (location->GetName() == "Kak 10 Gold Skulltula\n Reward") { - location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_10_GOLD_SKULLTULA_REWARD]); - } - if (location->GetName() == "Kak 20 Gold Skulltula\n Reward") { - location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_20_GOLD_SKULLTULA_REWARD]); - } - if (location->GetName() == "Kak 30 Gold Skulltula\n Reward") { - location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_30_GOLD_SKULLTULA_REWARD]); - } - if (location->GetName() == "Kak 40 Gold Skulltula\n Reward") { - location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_40_GOLD_SKULLTULA_REWARD]); - } - if (location->GetName() == "Kak 50 Gold Skulltula\n Reward") { - location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_50_GOLD_SKULLTULA_REWARD]); - } - } - } RandomizeAllSettings(true); //now select any random options instead of just hiding them diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index e7e1467dd..2891bea1e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3748,21 +3748,21 @@ void DrawRandoEditor(bool& open) { if (ImGui::BeginTable("tableRandoLocations", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Randomized", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Vanilla", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Included", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Excluded", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); ImGui::TableHeadersRow(); ImGui::PopItemFlag(); ImGui::TableNextRow(); - // COLUMN 1 - RANDOMIZED LOCATIONS + // COLUMN 1 - INCLUDED LOCATIONS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; static ImGuiTextFilter locationSearch; locationSearch.Draw(); - ImGui::BeginChild("ChildRandomizedLocations", ImVec2(0, -8)); + ImGui::BeginChild("ChildIncludedLocations", ImVec2(0, -8)); for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { bool hasItems = false; for (auto locationIt : areaIt.second) { @@ -3804,11 +3804,11 @@ void DrawRandoEditor(bool& open) { } ImGui::EndChild(); - // COLUMN 2 - VANILLA LOCATIONS + // COLUMN 2 - EXCLUDED LOCATIONS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::BeginChild("ChildVanillaLocations", ImVec2(0, -8)); + ImGui::BeginChild("ChildExcludedLocations", ImVec2(0, -8)); for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { bool hasItems = false; for (auto locationIt : areaIt.second) { From 1c52b589176bfdb000e999450236de31a08a8e5a Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 13:17:05 -0400 Subject: [PATCH 133/212] remove var leftover from debugging --- soh/soh/Enhancements/randomizer/3drando/settings.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 7edd7574d..51eaff18b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2505,7 +2505,6 @@ namespace Settings { location->GetExcludedOption()->SetSelectedIndex(0); } } - auto blarg = excludeLocationsOptionsVector.size(); OpenForest.SetSelectedIndex(cvarSettings[RSK_FOREST]); OpenKakariko.SetSelectedIndex(cvarSettings[RSK_KAK_GATE]); From 708c9a00f4cc3c2c23d1707251a540dbb1b66acb Mon Sep 17 00:00:00 2001 From: briaguya Date: Fri, 19 Aug 2022 13:18:48 -0400 Subject: [PATCH 134/212] formatting cleanup --- soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp | 2 +- soh/soh/Enhancements/randomizer/randomizer_check_objects.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 9c898ee57..67327985b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -969,4 +969,4 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { ); } } -} \ No newline at end of file +} diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index a871d778c..b58190c32 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -80,4 +80,4 @@ namespace RandomizerCheckObjects { std::string GetRCAreaName(RandomizerCheckArea area); std::map> GetAllRCObjects(); void UpdateImGuiVisibility(); -} \ No newline at end of file +} From 02049fb9e1f3acae56da3e9a9a3014b497078c2c Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Fri, 19 Aug 2022 14:38:12 -0500 Subject: [PATCH 135/212] Another big push, mostly done --- .../randomizer/randomizer_item_tracker.cpp | 932 +++++++----------- 1 file changed, 332 insertions(+), 600 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 8140a2dd4..83b111b69 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -28,7 +28,6 @@ void DrawItem(ItemTrackerItem item); void DrawDungeonItem(ItemTrackerItem item); void DrawBottle(ItemTrackerItem item); void DrawQuest(ItemTrackerItem item); -void DrawUpgrade(ItemTrackerItem item); void DrawSong(ItemTrackerItem item); OSContPad* buttonsPressed; @@ -52,7 +51,7 @@ std::vector equipmentItems = { }; std::vector miscItems = { - ITEM_TRACKER_ITEM(UPG_STRENGTH, 0, DrawUpgrade), ITEM_TRACKER_ITEM(UPG_SCALE, 0, DrawUpgrade), ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_HEART_CONTAINER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM(QUEST_STONE_OF_AGONY, 1 << 21, DrawQuest), ITEM_TRACKER_ITEM(QUEST_GERUDO_CARD, 1 << 22, DrawQuest), ITEM_TRACKER_ITEM(QUEST_SKULL_TOKEN, 1 << 23, DrawQuest), }; @@ -89,29 +88,187 @@ std::vector itemTrackerDungeons = { ITEM_TRACKER_DUNGEON(SCENE_GERUDOWAY, "HIDE", false, false, false, true), }; -typedef struct { - uint32_t id; - std::string name; - std::string nameFaded; - uint32_t bitMask; -} ItemTrackerMapEntry; +std::unordered_map actualItemTrackerItemMap = { + { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, + { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BIG_POE, 0, DrawItem) }, + { ITEM_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BLUE_FIRE, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BLUE_FIRE, 0, DrawItem) }, + { ITEM_BUG, ITEM_TRACKER_ITEM(ITEM_BUG, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_BUGS, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BUGS, 0, DrawItem) }, + { ITEM_FAIRY, ITEM_TRACKER_ITEM(ITEM_FAIRY, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_FAIRY, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_FAIRY, 0, DrawItem) }, + { ITEM_FISH, ITEM_TRACKER_ITEM(ITEM_FISH, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_FISH, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_FISH, 0, DrawItem) }, + { ITEM_POTION_GREEN, ITEM_TRACKER_ITEM(ITEM_POTION_GREEN, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_GREEN_POTION, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_GREEN_POTION, 0, DrawItem) }, + { ITEM_POE, ITEM_TRACKER_ITEM(ITEM_POE, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_POE, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_POE, 0, DrawItem) }, + { ITEM_POTION_RED, ITEM_TRACKER_ITEM(ITEM_POTION_RED, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_RED_POTION, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_RED_POTION, 0, DrawItem) }, + { ITEM_POTION_BLUE, ITEM_TRACKER_ITEM(ITEM_POTION_BLUE, 0, DrawItem) }, + { ITEM_BOTTLE_WITH_BLUE_POTION, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BLUE_POTION, 0, DrawItem) }, + { ITEM_MILK, ITEM_TRACKER_ITEM(ITEM_MILK, 0, DrawItem) }, + { ITEM_MILK_BOTTLE, ITEM_TRACKER_ITEM(ITEM_MILK_BOTTLE, 0, DrawItem) }, + { ITEM_MILK_HALF, ITEM_TRACKER_ITEM(ITEM_MILK_HALF, 0, DrawItem) }, + { ITEM_LETTER_RUTO, ITEM_TRACKER_ITEM(ITEM_LETTER_RUTO, 0, DrawItem) }, -#define ITEM_TRACKER_MAP_ENTRY(id, maskShift) \ - { \ - id, { \ - id, #id, #id "_Faded", 1 << maskShift \ - } \ + { ITEM_HOOKSHOT, ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem) }, + { ITEM_LONGSHOT, ITEM_TRACKER_ITEM(ITEM_LONGSHOT, 0, DrawItem) }, + + { ITEM_OCARINA_FAIRY, ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem) }, + { ITEM_OCARINA_TIME, ITEM_TRACKER_ITEM(ITEM_OCARINA_TIME, 0, DrawItem) }, + + { ITEM_MAGIC_SMALL, ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem) }, + { ITEM_MAGIC_LARGE, ITEM_TRACKER_ITEM(ITEM_MAGIC_LARGE, 0, DrawItem) }, + + { ITEM_WALLET_ADULT, ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem) }, + { ITEM_WALLET_GIANT, ITEM_TRACKER_ITEM(ITEM_WALLET_GIANT, 0, DrawItem) }, + + { ITEM_BRACELET, ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem) }, + { ITEM_GAUNTLETS_SILVER, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_SILVER, 0, DrawItem) }, + { ITEM_GAUNTLETS_GOLD, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_GOLD, 0, DrawItem) }, + + { ITEM_SCALE_SILVER, ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem) }, + { ITEM_SCALE_GOLDEN, ITEM_TRACKER_ITEM(ITEM_SCALE_GOLDEN, 0, DrawItem) }, + + { ITEM_WEIRD_EGG, ITEM_TRACKER_ITEM(ITEM_WEIRD_EGG, 0, DrawItem) }, + { ITEM_CHICKEN, ITEM_TRACKER_ITEM(ITEM_CHICKEN, 0, DrawItem) }, + { ITEM_LETTER_ZELDA, ITEM_TRACKER_ITEM(ITEM_LETTER_ZELDA, 0, DrawItem) }, + { ITEM_MASK_KEATON, ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem) }, + { ITEM_MASK_SKULL, ITEM_TRACKER_ITEM(ITEM_MASK_SKULL, 0, DrawItem) }, + { ITEM_MASK_SPOOKY, ITEM_TRACKER_ITEM(ITEM_MASK_SPOOKY, 0, DrawItem) }, + { ITEM_MASK_BUNNY, ITEM_TRACKER_ITEM(ITEM_MASK_BUNNY, 0, DrawItem) }, + { ITEM_MASK_GORON, ITEM_TRACKER_ITEM(ITEM_MASK_GORON, 0, DrawItem) }, + { ITEM_MASK_ZORA, ITEM_TRACKER_ITEM(ITEM_MASK_ZORA, 0, DrawItem) }, + { ITEM_MASK_GERUDO, ITEM_TRACKER_ITEM(ITEM_MASK_GERUDO, 0, DrawItem) }, + { ITEM_MASK_TRUTH, ITEM_TRACKER_ITEM(ITEM_MASK_TRUTH, 0, DrawItem) }, + { ITEM_SOLD_OUT, ITEM_TRACKER_ITEM(ITEM_SOLD_OUT, 0, DrawItem) }, + + { ITEM_POCKET_EGG, ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem) }, + { ITEM_POCKET_CUCCO, ITEM_TRACKER_ITEM(ITEM_POCKET_CUCCO, 0, DrawItem) }, + { ITEM_COJIRO, ITEM_TRACKER_ITEM(ITEM_COJIRO, 0, DrawItem) }, + { ITEM_ODD_MUSHROOM, ITEM_TRACKER_ITEM(ITEM_ODD_MUSHROOM, 0, DrawItem) }, + { ITEM_ODD_POTION, ITEM_TRACKER_ITEM(ITEM_ODD_POTION, 0, DrawItem) }, + { ITEM_SAW, ITEM_TRACKER_ITEM(ITEM_SAW, 0, DrawItem) }, + { ITEM_SWORD_BROKEN, ITEM_TRACKER_ITEM(ITEM_SWORD_BROKEN, 0, DrawItem) }, + { ITEM_PRESCRIPTION, ITEM_TRACKER_ITEM(ITEM_PRESCRIPTION, 0, DrawItem) }, + { ITEM_FROG, ITEM_TRACKER_ITEM(ITEM_FROG, 0, DrawItem) }, + { ITEM_EYEDROPS, ITEM_TRACKER_ITEM(ITEM_EYEDROPS, 0, DrawItem) }, + { ITEM_CLAIM_CHECK, ITEM_TRACKER_ITEM(ITEM_CLAIM_CHECK, 0, DrawItem) }, +}; + +ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { + ImVec2 result = { 0, 0 }; + + switch (item.id) { + case ITEM_STICK: + result.x = CUR_CAPACITY(UPG_STICKS); + result.y = 30; + break; + case ITEM_NUT: + result.x = CUR_CAPACITY(UPG_NUTS); + result.y = 40; + break; + case ITEM_BOMB: + result.x = CUR_CAPACITY(UPG_BOMB_BAG); + result.y = 40; + break; + case ITEM_BOW: + result.x = CUR_CAPACITY(UPG_QUIVER); + result.y = 50; + break; + case ITEM_SLINGSHOT: + result.x = CUR_CAPACITY(UPG_BULLET_BAG); + result.y = 50; + break; + case ITEM_WALLET_ADULT: + case ITEM_WALLET_GIANT: + result.x = CUR_CAPACITY(UPG_WALLET); + result.y = 500; + break; + case ITEM_BEAN: + result.x = AMMO(ITEM_BEAN); + result.y = 10; + break; + case QUEST_SKULL_TOKEN: + result.x = gSaveContext.inventory.gsTokens; + result.y = 100; + break; + case ITEM_KEY_SMALL: + result.x = gSaveContext.inventory.dungeonKeys[item.data]; + switch (item.data) { + case SCENE_BMORI1: + result.y = 5; + break; + case SCENE_HIDAN: + result.y = 8; + break; + case SCENE_MIZUSIN: + result.y = 6; + break; + case SCENE_JYASINZOU: + result.y = 5; + break; + case SCENE_HAKADAN: + result.y = 5; + break; + case SCENE_HAKADANCH: + result.y = 3; + break; + case SCENE_GANON: + result.y = 2; + break; + case SCENE_MEN: + result.y = 9; + break; + case SCENE_GERUDOWAY: + result.y = 4; + break; + } + break; } -bool IsValidSaveFile() { - bool validSave = gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2; - return validSave; + return result; +} + +void DrawItemCount(ItemTrackerItem item) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + ImVec2 currentAndMax = GetItemCurrentAndMax(item); + ImVec2 p = ImGui::GetCursorScreenPos(); + + if (currentAndMax.x > 0) { + if (currentAndMax.x >= currentAndMax.y) { + std::string currentString = std::to_string((int)currentAndMax.x); + + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 10)); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); + ImGui::Text("%d", (int)currentAndMax.x); + ImGui::PopStyleColor(); + } else { + if (CVar_GetS32("gItemTrackerDisplayCurrentMax", 0) == 1) { + std::string currentAndMaxString = std::to_string((int)currentAndMax.x) + "/" + std::to_string((int)currentAndMax.y); + + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentAndMaxString.c_str()).x / 2), p.y - 10)); + ImGui::Text("%d/", (int)currentAndMax.x); + ImGui::SameLine(0, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); + ImGui::Text("%d", (int)currentAndMax.y); + ImGui::PopStyleColor(); + } else { + std::string currentString = std::to_string((int)currentAndMax.x); + + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 10)); + ImGui::Text("%d", (int)currentAndMax.x); + } + } + } } void DrawEquip(ItemTrackerItem item) { bool hasEquip = (item.data & gSaveContext.inventory.equipment) != 0; int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - ImGui::Image(SohImGui::GetTextureByName(hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasEquip ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); SetLastItemHoverText(SohUtils::GetItemName(item.id)); @@ -121,26 +278,11 @@ void DrawQuest(ItemTrackerItem item) { bool hasQuestItem = (item.data & gSaveContext.inventory.questItems) != 0; int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); ImGui::BeginGroup(); - ImGui::Image(SohImGui::GetTextureByName(hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasQuestItem ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - ImVec2 p = ImGui::GetCursorScreenPos(); - int estimatedTextWidth = 10; - int estimatedTextHeight = 10; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); - - if (item.name == "QUEST_SKULL_TOKEN") { - if (gSaveContext.inventory.gsTokens == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", gSaveContext.inventory.gsTokens); - ImGui::PopStyleColor(); - } else if (gSaveContext.inventory.gsTokens >= 1 && gSaveContext.inventory.gsTokens <= 99) { - ImGui::Text("%i", gSaveContext.inventory.gsTokens); - } else if (gSaveContext.inventory.gsTokens >= 100) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 0, 0, 255)); - ImGui::Text("%i", gSaveContext.inventory.gsTokens); - ImGui::PopStyleColor(); - } + if (item.id == QUEST_SKULL_TOKEN) { + DrawItemCount(item); } ImGui::EndGroup(); @@ -148,119 +290,12 @@ void DrawQuest(ItemTrackerItem item) { SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); }; -std::unordered_map itemTrackerMap = { - ITEM_TRACKER_MAP_ENTRY(ITEM_STICK, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_NUT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOMB, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ARROW_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_DINS_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SLINGSHOT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_OCARINA_FAIRY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_OCARINA_TIME, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOMBCHU, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_HOOKSHOT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LONGSHOT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ARROW_ICE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FARORES_WIND, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOOMERANG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LENS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BEAN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_HAMMER, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ARROW_LIGHT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_NAYRUS_LOVE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_RED, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_GREEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_BLUE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FAIRY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FISH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_RUTO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BLUE_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BUG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BIG_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_HALF, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WEIRD_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CHICKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_ZELDA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_KEATON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SKULL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SPOOKY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_BUNNY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GORON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_ZORA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GERUDO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_TRUTH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SOLD_OUT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_CUCCO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_COJIRO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_MUSHROOM, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_POTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SAW, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BROKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_PRESCRIPTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FROG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_EYEDROPS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CLAIM_CHECK, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW_ARROW_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW_ARROW_ICE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW_ARROW_LIGHT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_RED, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_GREEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_BLUE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FAIRY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FISH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_RUTO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BLUE_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BUG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BIG_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_HALF, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WEIRD_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CHICKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_ZELDA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_KEATON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SKULL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SPOOKY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_BUNNY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GORON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_ZORA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GERUDO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_TRUTH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SOLD_OUT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_CUCCO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_COJIRO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_MUSHROOM, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_POTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SAW, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BROKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_PRESCRIPTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FROG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_EYEDROPS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CLAIM_CHECK, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_HEART_CONTAINER, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MAGIC_SMALL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MAGIC_LARGE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WALLET_ADULT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WALLET_GIANT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_DUNGEON_MAP, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_COMPASS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_KEY_SMALL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_KEY_BOSS, 0) -}; - void DrawItem(ItemTrackerItem item) { - uint32_t itemId = item.id; - uint32_t actualItemId = INV_CONTENT(itemId); + uint32_t actualItemId = INV_CONTENT(item.id); int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + bool hasItem = actualItemId != ITEM_NONE; - if (itemId == ITEM_NONE) { + if (item.id == ITEM_NONE) { ImGui::BeginGroup(); ImVec2 p = ImGui::GetCursorScreenPos(); ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - 10, p.y - 10)); @@ -268,293 +303,58 @@ void DrawItem(ItemTrackerItem item) { return; } - if (itemId == ITEM_HEART_CONTAINER) { - actualItemId = itemId; - } - - if (itemId == ITEM_WALLET_ADULT || itemId == ITEM_WALLET_GIANT) { - if (CUR_UPG_VALUE(UPG_WALLET) == 2) { - actualItemId = ITEM_WALLET_GIANT; - } else if (CUR_UPG_VALUE(UPG_WALLET) < 2) { - actualItemId = ITEM_WALLET_ADULT; - } - } - - if (itemId == ITEM_MAGIC_SMALL || itemId == ITEM_MAGIC_LARGE) { - if (gSaveContext.magicLevel == 2) { - actualItemId = ITEM_MAGIC_LARGE; - } else { - actualItemId = ITEM_MAGIC_SMALL; - } - } - - bool hasItem = actualItemId != ITEM_NONE; - - if (itemId == ITEM_HEART_CONTAINER) { - if (gSaveContext.doubleDefense) { - hasItem = true; - } else { - hasItem = false; - } - } - - if (itemId == ITEM_WALLET_ADULT || itemId == ITEM_WALLET_GIANT) { - if (CUR_UPG_VALUE(UPG_WALLET) == 0) { - hasItem = false; - } else { - hasItem = true; - } - } - - if (itemId == ITEM_MAGIC_SMALL || itemId == ITEM_MAGIC_LARGE) { - if (gSaveContext.magicLevel == 0) { - hasItem = false; - } else { - hasItem = true; - } - } - - const ItemTrackerMapEntry& entry = itemTrackerMap[hasItem && IsValidSaveFile() ? actualItemId : itemId]; - - ImGui::BeginGroup(); - ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), - ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - ImVec2 p = ImGui::GetCursorScreenPos(); - int estimatedTextWidth = 10; - int estimatedTextHeight = 10; - ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); - - if (IsValidSaveFile()) { - DrawItemAmmo(actualItemId); - } else { - ImGui::Text(" "); - } - ImGui::EndGroup(); - - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); -} - -void DrawItemAmmo(int itemId) { - switch (itemId) { - case ITEM_STICK: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_STICK) == CUR_CAPACITY(UPG_STICKS)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_STICK)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_STICK) != 0 || AMMO(ITEM_STICK) == CUR_CAPACITY(UPG_STICKS) - 1) { - ImGui::Text("%i", AMMO(ITEM_STICK)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_STICK) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_STICK)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_STICKS)); - ImGui::PopStyleColor(); + switch (item.id) { + case ITEM_HEART_CONTAINER: + actualItemId = item.id; + hasItem = !!gSaveContext.doubleDefense; break; - case ITEM_NUT: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_NUT) == CUR_CAPACITY(UPG_NUTS)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_NUT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_NUT) != 0 || AMMO(ITEM_NUT) == CUR_CAPACITY(UPG_NUTS) - 1) { - ImGui::Text("%i", AMMO(ITEM_NUT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_NUT) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_NUT)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_NUTS)); - ImGui::PopStyleColor(); - break; - case ITEM_BOMB: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_BOMB) == CUR_CAPACITY(UPG_BOMB_BAG)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMB)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BOMB) != 0 || AMMO(ITEM_BOMB) == CUR_CAPACITY(UPG_BOMB_BAG) - 1) { - ImGui::Text("%i", AMMO(ITEM_BOMB)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_BOMB) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMB)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_BOMB_BAG)); - ImGui::PopStyleColor(); - break; - - case ITEM_BOW: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_BOW) == CUR_CAPACITY(UPG_QUIVER)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BOW)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BOW) != 0 || AMMO(ITEM_BOW) == CUR_CAPACITY(UPG_QUIVER) - 1) { - ImGui::Text("%i", AMMO(ITEM_BOW)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_BOW) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BOW)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_QUIVER)); - ImGui::PopStyleColor(); - break; - case ITEM_SLINGSHOT: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_SLINGSHOT) == CUR_CAPACITY(UPG_BULLET_BAG)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_SLINGSHOT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_SLINGSHOT) != 0 || AMMO(ITEM_SLINGSHOT) == CUR_CAPACITY(UPG_BULLET_BAG) - 1) { - ImGui::Text("%i", AMMO(ITEM_SLINGSHOT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_SLINGSHOT) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_SLINGSHOT)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_BULLET_BAG)); - ImGui::PopStyleColor(); - break; - case ITEM_BOMBCHU: - if (AMMO(ITEM_BOMBCHU) == 50) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMBCHU)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BOMBCHU) != 0 || AMMO(ITEM_BOMBCHU) < 50) { - ImGui::Text("%i", AMMO(ITEM_BOMBCHU)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } else if (AMMO(ITEM_BOMBCHU) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMBCHU)); - ImGui::PopStyleColor(); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("50"); - ImGui::PopStyleColor(); - } - break; - case ITEM_BEAN: - if (AMMO(ITEM_BEAN) == 10) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BEAN)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BEAN) != 0 || AMMO(ITEM_BEAN) < 10) { - ImGui::Text("%i", AMMO(ITEM_BEAN)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } else if (AMMO(ITEM_BEAN) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BEAN)); - ImGui::PopStyleColor(); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("10"); - ImGui::PopStyleColor(); - } + case ITEM_MAGIC_SMALL: + case ITEM_MAGIC_LARGE: + actualItemId = gSaveContext.magicLevel == 2 ? ITEM_MAGIC_LARGE : ITEM_MAGIC_SMALL; + hasItem = gSaveContext.magicLevel > 0; break; case ITEM_WALLET_ADULT: case ITEM_WALLET_GIANT: - if (CUR_UPG_VALUE(UPG_WALLET) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("99"); - ImGui::PopStyleColor(); - } else if (CUR_UPG_VALUE(UPG_WALLET) == 1) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("200"); - ImGui::PopStyleColor(); - } else if (CUR_UPG_VALUE(UPG_WALLET) == 2) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("500"); - ImGui::PopStyleColor(); - } + actualItemId = CUR_UPG_VALUE(UPG_WALLET) == 2 ? ITEM_WALLET_GIANT : ITEM_WALLET_ADULT; + hasItem = true; break; - default: - ImGui::Text(" "); + case ITEM_BRACELET: + case ITEM_GAUNTLETS_SILVER: + case ITEM_GAUNTLETS_GOLD: + actualItemId = CUR_UPG_VALUE(UPG_STRENGTH) == 3 ? ITEM_GAUNTLETS_GOLD : CUR_UPG_VALUE(UPG_STRENGTH) == 2 ? ITEM_GAUNTLETS_SILVER : ITEM_BRACELET; + hasItem = CUR_UPG_VALUE(UPG_STRENGTH) > 0; + break; + case ITEM_SCALE_SILVER: + case ITEM_SCALE_GOLDEN: + actualItemId = CUR_UPG_VALUE(UPG_SCALE) == 2 ? ITEM_SCALE_GOLDEN : ITEM_SCALE_SILVER; + hasItem = CUR_UPG_VALUE(UPG_SCALE) > 0; break; } + + if (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end()) { + item = actualItemTrackerItemMap[actualItemId]; + } + + ImGui::BeginGroup(); + ImGui::Image(SohImGui::GetTextureByName(hasItem ? item.name : item.nameFaded), + ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); + + DrawItemCount(item); + ImGui::EndGroup(); + + SetLastItemHoverText(SohUtils::GetItemName(item.id)); } void DrawBottle(ItemTrackerItem item) { uint32_t actualItemId = gSaveContext.inventory.items[SLOT(item.id) + item.data]; bool hasItem = actualItemId != ITEM_NONE; - const ItemTrackerMapEntry& entry = itemTrackerMap[hasItem && IsValidSaveFile() ? actualItemId : item.id]; + + const ItemTrackerItem& actualItem = actualItemTrackerItemMap[hasItem ? actualItemId : item.id]; int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasItem ? actualItem.name : actualItem.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + SetLastItemHoverText(SohUtils::GetItemName(actualItem.id)); }; void DrawDungeonItem(ItemTrackerItem item) { @@ -565,101 +365,32 @@ void DrawDungeonItem(ItemTrackerItem item) { bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[item.data]) >= 0; ImGui::BeginGroup(); if (itemId == ITEM_KEY_SMALL) { - ImGui::Image(SohImGui::GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasSmallKey ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } else { - ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasItem ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } - ImVec2 p = ImGui::GetCursorScreenPos(); - int estimatedTextWidth = 10; - int estimatedTextHeight = 10; - ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); - - if (itemId == ITEM_KEY_SMALL) { // This check there for small key is necessary to get the text position properly and can't be on the same ITEM_KEY chack from the top - if (gSaveContext.inventory.dungeonKeys[item.data] <= 0 || !IsValidSaveFile()) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("0"); - ImGui::PopStyleColor(); - } - else { - ImGui::Text("%i", gSaveContext.inventory.dungeonKeys[item.data]); - } + if (itemId == ITEM_KEY_SMALL) { + DrawItemCount(item); } ImGui::EndGroup(); SetLastItemHoverText(SohUtils::GetItemName(item.id)); } -typedef struct { - uint8_t id; - std::string name; - std::string nameFaded; -} ItemTrackerUpgradeEntry; - -#define ITEM_TRACKER_UPGRADE_ENTRY(id) \ - { id, #id, #id "_Faded" } - -std::unordered_map> upgradeTrackerMap = { - { UPG_STRENGTH, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BRACELET), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_GAUNTLETS_SILVER), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_GAUNTLETS_GOLD), - } }, - { UPG_SCALE, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_SCALE_SILVER), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_SCALE_GOLDEN), - } }, - { UPG_QUIVER, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_QUIVER_30), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_QUIVER_40), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_QUIVER_50), - } }, - { UPG_BULLET_BAG, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BULLET_BAG_30), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BULLET_BAG_40), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BULLET_BAG_50), - } }, - { UPG_BOMB_BAG, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BOMB_BAG_20), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BOMB_BAG_30), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BOMB_BAG_40), - } }, - -}; - -void DrawUpgrade(ItemTrackerItem item) { - uint32_t categoryId = item.id; - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - if (CUR_UPG_VALUE(categoryId) == 0 || !IsValidSaveFile()) { - const ItemTrackerUpgradeEntry& entry = upgradeTrackerMap[categoryId][0]; - ImGui::Image(SohImGui::GetTextureByName(entry.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), - ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); - } else { - const ItemTrackerUpgradeEntry& entry = upgradeTrackerMap[categoryId][CUR_UPG_VALUE(categoryId) - 1]; - ImGui::Image(SohImGui::GetTextureByName(entry.name), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); - } -} - void DrawSong(ItemTrackerItem item) { int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); uint32_t bitMask = 1 << item.id; bool hasSong = (bitMask & gSaveContext.inventory.questItems) != 0; - ImGui::Image(SohImGui::GetTextureByName(hasSong && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasSong ? item.name : item.nameFaded), ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); } -void DrawFloatingNotes(int Icon_Cells_Size, int Icon_Spacing) { +void DrawFloatingNotes(int iconSize, int iconSpacing) { if (CVar_GetS32("gItemTrackerNotes", 0)) { ImGui::BeginGroup(); struct ItemTrackerNotes { @@ -718,19 +449,19 @@ void EndFloatingWindows() { * Takes in a vector of ItemTrackerItem and draws them in rows of N items */ void DrawItemsInRows(std::vector items, int columns = 6) { - int Icon_Cells_Size = CVar_GetS32("gItemTrackerIconSize", 32); - int Icon_Spacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 0); for (int i = 0; i < items.size(); i++) { if (i % columns == 0) { ImGui::BeginGroup(); } else { - ImGui::SameLine(Icon_Cells_Size * (i % columns)); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * (i % columns)); + ImGui::SameLine(iconSize * (i % columns)); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + iconSpacing * (i % columns)); } items[i].drawFunc(items[i]); if (i % columns == columns - 1) { ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + iconSpacing); } } if (items.size() % columns != 0) { @@ -744,8 +475,8 @@ void DrawItemsInRows(std::vector items, int columns = 6) { * to then call DrawItemsInRows */ void DrawDungeons(std::vector dungeons, int columns = 6) { - int Icon_Cells_Size = CVar_GetS32("gItemTrackerIconSize", 32); - int Icon_Spacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 0); std::vector dungeonItems = {}; if (!CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 0)) { @@ -755,10 +486,10 @@ void DrawDungeons(std::vector dungeons, int columns = 6) { ImGui::BeginGroup(); ImGui::NewLine(); for (int i = 0; i < MIN(dungeons.size(), columns); i++) { - ImGui::SameLine(Icon_Cells_Size * i); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * i); + ImGui::SameLine(iconSize * i); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + iconSpacing * i); ImVec2 p = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (Icon_Cells_Size / 2) - 10, p.y - 4)); + ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - 10, p.y - 4)); ImGui::Text(dungeons[i].shortName.c_str()); } ImGui::EndGroup(); @@ -799,74 +530,107 @@ void DrawDungeons(std::vector dungeons, int columns = 6) { } } +void LabeledComboBoxRightAligned(const char* label, const char* cvar, std::vector options, s32 defaultValue) { + s32 currentValue = CVar_GetS32(cvar, defaultValue); + std::string hiddenLabel = "##" + std::string(cvar); + ImGui::Text(label); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(options[currentValue].c_str()).x * 2.0f) + 8.0f); + ImGui::PushItemWidth(ImGui::CalcTextSize(options[currentValue].c_str()).x * 2.0f); + if (ImGui::BeginCombo(hiddenLabel.c_str(), options[currentValue].c_str())) { + for (int i = 0; i < options.size(); i++) { + if (ImGui::Selectable(options[i].c_str())) { + CVar_SetS32(cvar, i); + SohImGui::needs_save = true; + } + } + + ImGui::EndCombo(); + } + ImGui::PopItemWidth(); +} + +bool IsValidSaveFile() { + bool validSave = gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2; + return validSave; +} + void DrawItemTracker(bool& open) { if (!open) { return; } - int Icon_Cells_Size = CVar_GetS32("gItemTrackerIconSize", 32); - int Icon_Spacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 0); - if (CVar_GetS32("gItemTrackerHotKeyShow", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : buttonsPressed[0].button & BTN_L) { - BeginFloatingWindows("Item Tracker#window"); - if (CVar_GetS32("gItemTrackerDisplayInventory", 0) && !CVar_GetS32("gItemTrackerDisplayInventorySeparate", 0)) { - DrawItemsInRows(inventoryItems); - } - if (CVar_GetS32("gItemTrackerDisplayEquipment", 0) && !CVar_GetS32("gItemTrackerDisplayEquipmentSeparate", 0)) { - DrawItemsInRows(equipmentItems); - } - if (CVar_GetS32("gItemTrackerDisplayMisc", 0) && !CVar_GetS32("gItemTrackerDisplayMiscSeparate", 0)) { - DrawItemsInRows(miscItems); - } - if (CVar_GetS32("gItemTrackerDisplayDungeonRewards", 0) && !CVar_GetS32("gItemTrackerDisplayDungeonRewardsSeparate", 0)) { - if (CVar_GetS32("gItemTrackerDisplayMisc", 0) && !CVar_GetS32("gItemTrackerDisplayMiscSeparate", 0)) { - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); + if (IsValidSaveFile() && CVar_GetS32("gItemTrackerHotKeyShow", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : buttonsPressed[0].button & BTN_L) { + if ( + (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 1) == 1) + ) { + BeginFloatingWindows("Item Tracker##main window"); + if (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) { + DrawItemsInRows(inventoryItems); } - DrawItemsInRows(dungeonRewardStones); - DrawItemsInRows(dungeonRewardMedallions); + if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) { + DrawItemsInRows(equipmentItems); + } + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { + DrawItemsInRows(miscItems); + } + if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) { + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { + ImGui::SameLine(iconSize * 3); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + iconSpacing * 3); + } + DrawItemsInRows(dungeonRewardStones); + DrawItemsInRows(dungeonRewardMedallions); + } + if (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) { + DrawItemsInRows(songItems); + } + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 1) { + DrawDungeons(itemTrackerDungeons); + } + EndFloatingWindows(); } - if (CVar_GetS32("gItemTrackerDisplaySongs", 0) && !CVar_GetS32("gItemTrackerDisplaySongsSeparate", 0)) { - DrawItemsInRows(songItems); - } - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0) && !CVar_GetS32("gItemTrackerDisplayDungeonItemsSeparate", 0)) { - DrawDungeons(itemTrackerDungeons); - } - EndFloatingWindows(); - if (CVar_GetS32("gItemTrackerDisplayInventory", 0) && CVar_GetS32("gItemTrackerDisplayInventorySeparate", 0)) { + if (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 2) { BeginFloatingWindows("Inventory Items Tracker"); DrawItemsInRows(inventoryItems); EndFloatingWindows(); } - if (CVar_GetS32("gItemTrackerDisplayEquipment", 0) && CVar_GetS32("gItemTrackerDisplayEquipmentSeparate", 0)) { + if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 2) { BeginFloatingWindows("Equipment Items Tracker"); DrawItemsInRows(equipmentItems); EndFloatingWindows(); } - if (CVar_GetS32("gItemTrackerDisplayMisc", 0) && CVar_GetS32("gItemTrackerDisplayMiscSeparate", 0)) { + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 2) { BeginFloatingWindows("Misc Items Tracker"); DrawItemsInRows(miscItems); EndFloatingWindows(); } - if (CVar_GetS32("gItemTrackerDisplayDungeonRewards", 0) && CVar_GetS32("gItemTrackerDisplayDungeonRewardsSeparate", 0)) { + if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 2) { BeginFloatingWindows("Dungeon Rewards Tracker"); DrawItemsInRows(dungeonRewardStones); DrawItemsInRows(dungeonRewardMedallions); EndFloatingWindows(); } - if (CVar_GetS32("gItemTrackerDisplaySongs", 0) && CVar_GetS32("gItemTrackerDisplaySongsSeparate", 0)) { + if (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 2) { BeginFloatingWindows("Songs Tracker"); DrawItemsInRows(songItems); EndFloatingWindows(); } - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0) && CVar_GetS32("gItemTrackerDisplayDungeonItemsSeparate", 0)) { + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { BeginFloatingWindows("Dungeon Items Tracker"); - if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 0)) { + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1)) { DrawDungeons(itemTrackerDungeons, 13); } else { DrawDungeons(itemTrackerDungeons); @@ -882,98 +646,66 @@ void DrawItemTrackerOptions(bool& open) { return; } - ImGui::SetNextWindowSize(ImVec2(240, 285), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(600,360), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Item Tracker Settings", &open, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); return; } - SohImGui::PaddedText("Hotkey"); + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); + ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); + ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableHeadersRow(); + ImGui::TableNextRow(); + + ImGui::TableNextColumn(); SohImGui::PaddedEnhancementCheckbox("L Button to show Item Tracker", "gItemTrackerHotKeyShow", 0); if (CVar_GetS32("gItemTrackerHotKeyShow", 0)) { - if (ImGui::BeginCombo("Button Type", CVar_GetS32("gItemTrackerHotKeyShowType", 0) == 0 ? "Hold" : "Toggle")) { - if (ImGui::Selectable("Hold")) { - CVar_SetS32("gItemTrackerHotKeyShowType", 0); - } - if (ImGui::Selectable("Toggle")) { - CVar_SetS32("gItemTrackerHotKeyShowType", 1); - } - - ImGui::EndCombo(); - } SohImGui::PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerHotKeyShowOnlyPaused", 0); } - - SohImGui::PaddedText("Window"); + PaddedSeparator(); + ImGui::Text("BG Color"); + ImGui::SameLine(); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (ImGui::ColorEdit4("Background Color", (float*)&ChromaKeyBackground, ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel)) { + if (ImGui::ColorEdit4("BG Color##gItemTrackerBgColor", (float*)&ChromaKeyBackground, ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel)) { CVar_SetFloat("gItemTrackerBgColorR", ChromaKeyBackground.x); CVar_SetFloat("gItemTrackerBgColorG", ChromaKeyBackground.y); CVar_SetFloat("gItemTrackerBgColorB", ChromaKeyBackground.z); CVar_SetFloat("gItemTrackerBgColorA", ChromaKeyBackground.w); + SohImGui::needs_save = true; } - ImGui::PushItemWidth(0); - if (ImGui::BeginCombo("Window Type", CVar_GetS32("gItemTrackerWindowType", 0) == 0 ? "Floating" : "Window")) { - if (ImGui::Selectable("Floating")) { - CVar_SetS32("gItemTrackerWindowType", 0); - } - if (ImGui::Selectable("Window")) { - CVar_SetS32("gItemTrackerWindowType", 1); - } + ImGui::PopItemWidth(); + + LabeledComboBoxRightAligned("Window Type", "gItemTrackerWindowType", { "Floating", "Window" }, 0); - ImGui::EndCombo(); - } if (CVar_GetS32("gItemTrackerWindowType", 0) == 0) { SohImGui::PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode", 0); } - - SohImGui::PaddedText("Icons"); + PaddedSeparator(); SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 32, true); SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 0, true); - SohImGui::PaddedEnhancementCheckbox("Display \"Current/Max\" values on items", "gItemTrackerDisplayCurrentMax", 0); + SohImGui::PaddedEnhancementCheckbox("Display \"Current/Max\" values", "gItemTrackerDisplayCurrentMax", 0); - SohImGui::PaddedText("Items"); - SohImGui::PaddedEnhancementCheckbox("Display general items in tracker", "gItemTrackerDisplayInventory", 0); - if (CVar_GetS32("gItemTrackerDisplayInventory", 0)) { - SohImGui::PaddedEnhancementCheckbox("Display general items in separate window", "gItemTrackerDisplayInventorySeparate", 0); - } + ImGui::TableNextColumn(); - SohImGui::PaddedText("Equipment"); - SohImGui::PaddedEnhancementCheckbox("Display equipment in tracker", "gItemTrackerDisplayEquipment", 0); - if (CVar_GetS32("gItemTrackerDisplayEquipment", 0)) { - SohImGui::PaddedEnhancementCheckbox("Display equipment in separate window", "gItemTrackerDisplayEquipmentSeparate", 0); - } - - SohImGui::PaddedText("Misc Items"); - SohImGui::PaddedEnhancementCheckbox("Display misc items in tracker", "gItemTrackerDisplayMisc", 0); - if (CVar_GetS32("gItemTrackerDisplayMisc", 0)) { - SohImGui::PaddedEnhancementCheckbox("Display misc items in separate window", "gItemTrackerDisplayMiscSeparate", 0); - } - - SohImGui::PaddedText("Dungeon Rewards"); - SohImGui::PaddedEnhancementCheckbox("Display dungeon rewards in tracker", "gItemTrackerDisplayDungeonRewards", 0); - if (CVar_GetS32("gItemTrackerDisplayDungeonRewards", 0)) { - SohImGui::PaddedEnhancementCheckbox("Display dungeon rewards in separate window", "gItemTrackerDisplayDungeonRewardsSeparate", 0); - } - - SohImGui::PaddedText("Songs"); - SohImGui::PaddedEnhancementCheckbox("Display songs in tracker", "gItemTrackerDisplaySongs", 0); - if (CVar_GetS32("gItemTrackerDisplaySongs", 0)) { - SohImGui::PaddedEnhancementCheckbox("Display songs in separate window", "gItemTrackerDisplaySongsSeparate", 0); - SohImGui::PaddedEnhancementCheckbox("Use randomizer colors", "gItemTrackerDisplaySongsRandom", 0); - } - - SohImGui::PaddedText("Dungeon Items"); - SohImGui::PaddedEnhancementCheckbox("Display dungeon items in tracker", "gItemTrackerDisplayDungeonItems", 0); - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - SohImGui::PaddedEnhancementCheckbox("Display dungeon items in separate window", "gItemTrackerDisplayDungeonItemsSeparate", 0); - if (CVar_GetS32("gItemTrackerDisplayDungeonItemsSeparate", 0)) { - SohImGui::PaddedEnhancementCheckbox("Horizontal dungeon items display", "gItemTrackerDisplayDungeonItemsHorizontal", 0); + LabeledComboBoxRightAligned("Inventory", "gItemTrackerInventoryItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Equipment", "gItemTrackerEquipmentItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Misc", "gItemTrackerMiscItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Dungeon Rewards", "gItemTrackerDungeonRewardsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Songs", "gItemTrackerSongsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Dungeon Items", "gItemTrackerDungeonItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 2); + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) != 0) { + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { + SohImGui::PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", 1); } - SohImGui::PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 0); + SohImGui::PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); } + ImGui::PopStyleVar(1); + ImGui::EndTable(); + // SohImGui::EnhancementCheckbox("Personal notes space", "gItemTrackerNotes"); // SohImGui::Tooltip("Adds a textbox under the item tracker to keep your own notes in"); // TODO: FIX THE NOTES SPACE SIZE ON FLOATING WINDOW, DISABLED UNTIL FIXED From a67c6b9e674a98dc8c4118c515e10a9fb46d7503 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 19 Aug 2022 19:36:44 -0400 Subject: [PATCH 136/212] Fixes vanilla ice traps and randomized ice smoke --- soh/soh/Enhancements/item-tables/ItemTableTypes.h | 2 +- soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 1a703f30d..7e5f1a9a3 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -19,7 +19,7 @@ typedef struct { /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? - /* 0x08 */ uint16_t getItemId; + /* 0x08 */ int16_t getItemId; /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. } GetItemEntry; // size = 0x0F diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index a2f57ad6a..3e78982a3 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -481,8 +481,12 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) { } // Chests need to have a negative getItemId in order to not immediately give their item // when approaching. - sItem.getItemId = 0 - sItem.getItemId; - GiveItemEntryFromActorWithFixedRange(&this->dyna.actor, globalCtx, sItem); + if (gSaveContext.n64ddFlag) { + sItem.getItemId = 0 - sItem.getItemId; + GiveItemEntryFromActorWithFixedRange(&this->dyna.actor, globalCtx, sItem); + } else { + func_8002F554(&this->dyna.actor, globalCtx, -(this->dyna.actor.params >> 5 & 0x7F)); + } } if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) { EnBox_SetupAction(this, EnBox_Open); @@ -594,7 +598,7 @@ void EnBox_Update(Actor* thisx, GlobalContext* globalCtx) { } if (((!gSaveContext.n64ddFlag && ((this->dyna.actor.params >> 5 & 0x7F) == 0x7C)) || - (gSaveContext.n64ddFlag && sItem.getItemId == RG_ICE_TRAP)) && + (gSaveContext.n64ddFlag && ABS(sItem.getItemId) == RG_ICE_TRAP)) && this->actionFunc == EnBox_Open && this->skelanime.curFrame > 45 && this->iceSmokeTimer < 100) EnBox_SpawnIceSmoke(this, globalCtx); } From ad8179287e8b43ca1692051a6cbcc4e6eee2de5d Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Fri, 19 Aug 2022 20:03:28 -0400 Subject: [PATCH 137/212] Fix controller nav on WiiU (#1258) Co-authored-by: briaguya --- soh/soh/Enhancements/bootcommands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index c5d4fcdbc..fc6d043e2 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -25,8 +25,8 @@ void BootCommands_Init() CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gLanguages", 0); //0 = English / 1 = German / 2 = French CVar_RegisterS32("gHudColors", 1); //0 = N64 / 1 = NGC / 2 = Custom -#ifdef __SWITCH__ - CVar_RegisterS32("gControlNav", 1); // always enable controller nav on switch +#if defined(__SWITCH__) || defined(__WIIU__) + CVar_RegisterS32("gControlNav", 1); // always enable controller nav on switch/wii u #endif } From 2c410a585733a4d6fa421d445e10b01e154417d9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 19 Aug 2022 21:42:59 -0400 Subject: [PATCH 138/212] Fixes ice traps again. --- soh/soh/OTRGlobals.cpp | 2 +- soh/src/overlays/actors/ovl_player_actor/z_player.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index c271b85cd..e16fced84 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1608,7 +1608,7 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check) } extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); + GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_NONE, getItemID); return giEntry; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 85cd4298e..195da7945 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -4528,7 +4528,7 @@ void func_8083A434(GlobalContext* globalCtx, Player* this) { if (this->getItemId == GI_HEART_CONTAINER_2) { this->unk_850 = 20; } - else if (this->getItemId >= 0 || this->getItemEntry.getItemId >= 0) { + else if (this->getItemId >= 0 || (this->getItemEntry.objectId != OBJECT_INVALID && this->getItemEntry.getItemId >= 0)) { this->unk_850 = 1; } else { @@ -6165,7 +6165,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { - if (this->getItemId != GI_NONE && this->getItemEntry.objectId != OBJECT_INVALID) { + if (this->getItemId != GI_NONE || this->getItemEntry.objectId != OBJECT_INVALID) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { giEntry = ItemTable_Retrieve(-this->getItemId); From 4f2f72b9418e5402b11729307fd402596bd534dc Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 20 Aug 2022 13:07:53 -0400 Subject: [PATCH 139/212] Adds Frog Reward hints from 3dsrando. Fixes the intermittent crash when generating a seed rando-next started having. --- .../hint_list/hint_list_exclude_overworld.cpp | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 5adf816a8..26150c9de 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -293,6 +293,80 @@ void HintTable_Init_Exclude_Overworld() { //obscure text Text{"#frogs in a storm# gift", /*french*/"#des grenouilles mouillées# donnent", /*spanish*/"las #ancas bajo la tormenta# otorgan"}, }); + hintTable[ZR_FROGS_ZELDAS_LULLABY] = HintText::Exclude( + { + // obscure text + Text{ "#sleepy frogs# gift", /*french*/ "#les grenouilles somnolentes# donnent", + /*spanish*/ "las #ranas somnolientas# regalan" }, + Text{ "#the Froggish Tenor in the back-left# gifts", + /*french*/ "#le ténor grenouillesque au fond à gauche# donne", + /*spanish*/ "el #Sapo Tenore al fondo, a la izquierda#, regala" }, + }, + {}, + // clear text + Text{ "after hearing #Zelda's Lullaby, the frogs# gift", + /*french*/ "à l'écoute de #la berceuse de Zelda, les grenouilles# donnent", + /*spanish*/ "después de escuchar #la Nana de Zelda, las ranas# regalan" }); + + hintTable[ZR_FROGS_EPONAS_SONG] = HintText::Exclude( + { + // obscure text + Text{ "#equine frogs# gift", /*french*/ "#les grenouilles équestres# donnent", + /*spanish*/ "las #ranas equinas# regalan" }, + Text{ "#the Froggish Tenor in the back-right# gifts", + /*french*/ "#le ténor grenouillesque au fond à droite# donne", + /*spanish*/ "el #Sapo Tenore al fondo, a la derecha#, regala" }, + }, + {}, + // clear text + Text{ "after hearing #Epona's Song, the frogs# gift", + /*french*/ "à l'écoute du #chant d'Epona, les grenouilles# donnent", + /*spanish*/ "después de escuchar #la Canción de Epona, las ranas# regalan" }); + + hintTable[ZR_FROGS_SARIAS_SONG] = HintText::Exclude( + { + // obscure text + Text{ "#sylvan frogs# gift", /*french*/ "#les grenouilles sylvestres# donnent", + /*spanish*/ "las #ranas silvestres# regalan" }, + Text{ "#the Froggish Tenor in the center# gifts", + /*french*/ "#le ténor grenouillesque dans le centre# donne", + /*spanish*/ "el #Sapo Tenore en el centro# regala" }, + }, + {}, + // clear text + Text{ "after hearing #Saria's Song, the frogs# gift", + /*french*/ "à l'écoute du #chant de Saria, les grenouilles# donnent", + /*spanish*/ "después de escuchar #la Canción de Saria, las ranas# regalan" }); + + hintTable[ZR_FROGS_SUNS_SONG] = HintText::Exclude( + { + // obscure text + Text{ "#enlightened frogs# gift", /*french*/ "#les grenouilles éclairées# donnent", + /*spanish*/ "las #ranas alumbradas# regalan" }, + Text{ "#the Froggish Tenor in the front-left# gifts", + /*french*/ "#le ténor grenouillesque à l'avant gauche# donne", + /*spanish*/ "el #Sapo Tenore al frente, a la izquierda#, regala" }, + }, + {}, + // clear text + Text{ "after hearing #the Sun's Song, the frogs# gift", + /*french*/ "à l'écoute du #chant du soleil, les grenouilles# donnent", + /*spanish*/ "después de escuchar #la Canción del Sol, las ranas# regalan" }); + + hintTable[ZR_FROGS_SONG_OF_TIME] = HintText::Exclude( + { + // obscure text + Text{ "#time-traveling frogs# gift", /*french*/ "#les grenouilles voyageuses dans le temps# donnent", + /*spanish*/ "las #ranas viajeras del tiempo# regalan" }, + Text{ "#the Froggish Tenor in the front-right# gifts", + /*french*/ "#le ténor grenouillesque à l'avant droite# donne", + /*spanish*/ "el #Sapo Tenore al frente, a la derecha#, regala" }, + }, + {}, + // clear text + Text{ "after hearing #the Song of Time, the frogs# gift", + /*french*/ "à l'écoute du #chant du temps, les grenouilles# donnent", + /*spanish*/ "después de escuchar #la Canción del tiempo, las ranas# regalan" }); hintTable[GF_HBA_1000_POINTS] = HintText::Exclude({ //obscure text From ccce87cb8975a6187af6ae54aab1c2b2a92bb08d Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Sat, 20 Aug 2022 11:16:46 -0700 Subject: [PATCH 140/212] Change int to u8 Jenkins plz --- soh/soh/Enhancements/randomizer/randomizer.cpp | 4 ++-- soh/soh/OTRGlobals.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 1bc72f8cf..6bf87348d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3977,12 +3977,12 @@ void CreateScrubMessages() { } CustomMessageMinimal NaviMessages[]; -extern const int NaviMsgCount = 15; +extern const u8 NaviMsgCount = 15; void CreateNaviRandoMessages() { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); - for (int i = 0; i <= (NaviMsgCount - 1); i++) { + for (u8 i = 0; i <= (NaviMsgCount - 1); i++) { customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, i, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, NaviMessages[i].english, NaviMessages[i].german, NaviMessages[i].french }); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2ea662316..f18475ad0 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1447,7 +1447,7 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); } -extern const int NaviMsgCount; +extern const u8 NaviMsgCount; extern "C" CustomMessageEntry Randomizer_GetNaviMessage() { u16 naviTextId = rand() % NaviMsgCount; From 341ac29fa55c01371ee98a71ce28b6b3b57f63ca Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sat, 20 Aug 2022 14:36:38 -0500 Subject: [PATCH 141/212] Various tweaks, added button combo and re-added notes --- .../randomizer/randomizer_item_tracker.cpp | 179 +++++++++++------- 1 file changed, 110 insertions(+), 69 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 83b111b69..55217ffe9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -3,25 +3,17 @@ #include "../libultraship/ImGuiImpl.h" #include "../libultraship/Hooks.h" #include "../libultraship/UltraController.h" -#include +#include "../debugger/ImGuiHelpers.h" -#include -#include #include #include #include #include -extern "C" { #include #include "variables.h" #include "functions.h" #include "macros.h" -extern GlobalContext* gGlobalCtx; - -#include "textures/icon_item_static/icon_item_static.h" -#include "textures/icon_item_24_static/icon_item_24_static.h" -} void DrawEquip(ItemTrackerItem item); void DrawItem(ItemTrackerItem item); @@ -76,14 +68,14 @@ std::vector itemTrackerDungeons = { ITEM_TRACKER_DUNGEON(SCENE_BMORI1, "FRST", true, true, true, true), ITEM_TRACKER_DUNGEON(SCENE_HIDAN, "FIRE", true, true, true, true), ITEM_TRACKER_DUNGEON(SCENE_MIZUSIN, "WATR", true, true, true, true), - ITEM_TRACKER_DUNGEON(SCENE_JYASINZOU, "SPIR", true, true, true, true), - ITEM_TRACKER_DUNGEON(SCENE_HAKADAN, "SHAD", true, true, true, true), + ITEM_TRACKER_DUNGEON(SCENE_JYASINZOU, "SPRT", true, true, true, true), + ITEM_TRACKER_DUNGEON(SCENE_HAKADAN, "SHDW", true, true, true, true), ITEM_TRACKER_DUNGEON(SCENE_HAKADANCH, "BOTW", true, true, false, true), ITEM_TRACKER_DUNGEON(SCENE_YDAN, "DEKU", true, true, false, false), - ITEM_TRACKER_DUNGEON(SCENE_DDAN, "DODO", true, true, false, false), + ITEM_TRACKER_DUNGEON(SCENE_DDAN, "DCVN", true, true, false, false), ITEM_TRACKER_DUNGEON(SCENE_BDAN, "JABU", true, true, false, false), ITEM_TRACKER_DUNGEON(SCENE_ICE_DOUKUTO, "ICE", true, true, false, false), - ITEM_TRACKER_DUNGEON(SCENE_GANON, "GAN", false, false, true, true), + ITEM_TRACKER_DUNGEON(SCENE_GANON, "GANON", false, false, true, true), ITEM_TRACKER_DUNGEON(SCENE_MEN, "GTG", false, false, false, true), ITEM_TRACKER_DUNGEON(SCENE_GERUDOWAY, "HIDE", false, false, false, true), }; @@ -158,6 +150,24 @@ std::unordered_map actualItemTrackerItemMap = { { ITEM_CLAIM_CHECK, ITEM_TRACKER_ITEM(ITEM_CLAIM_CHECK, 0, DrawItem) }, }; +std::vector buttonMap = { + BTN_A, + BTN_B, + BTN_CUP, + BTN_CDOWN, + BTN_CLEFT, + BTN_CRIGHT, + BTN_L, + BTN_Z, + BTN_R, + BTN_START, + BTN_DUP, + BTN_DDOWN, + BTN_DLEFT, + BTN_DRIGHT, + 0 +}; + ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { ImVec2 result = { 0, 0 }; @@ -390,53 +400,57 @@ void DrawSong(ItemTrackerItem item) { SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); } -void DrawFloatingNotes(int iconSize, int iconSpacing) { - if (CVar_GetS32("gItemTrackerNotes", 0)) { - ImGui::BeginGroup(); - struct ItemTrackerNotes { - static int TrackerNotesResizeCallback(ImGuiInputTextCallbackData* data) { - if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) { - ImVector* itemTrackerNotes = (ImVector*)data->UserData; - IM_ASSERT(itemTrackerNotes->begin() == data->Buf); - itemTrackerNotes->resize( - data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 - data->Buf = itemTrackerNotes->begin(); - } - return 0; - } - static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, const ImVec2& size = ImVec2(0, 0), - ImGuiInputTextFlags flags = 0) { - IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), - size, flags | ImGuiInputTextFlags_CallbackResize, - ItemTrackerNotes::TrackerNotesResizeCallback, - (void*)itemTrackerNotes); - } - }; - static ImVector itemTrackerNotes; - if (itemTrackerNotes.empty()) { - itemTrackerNotes.push_back(0); +void DrawNotes() { + ImGui::BeginGroup(); + struct ItemTrackerNotes { + static int TrackerNotesResizeCallback(ImGuiInputTextCallbackData* data) { + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) { + ImVector* itemTrackerNotes = (ImVector*)data->UserData; + IM_ASSERT(itemTrackerNotes->begin() == data->Buf); + itemTrackerNotes->resize( + data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 + data->Buf = itemTrackerNotes->begin(); } - ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput); - ImGui::EndGroup(); + return 0; + } + static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, const ImVec2& size = ImVec2(0, 0), + ImGuiInputTextFlags flags = 0) { + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), + size, flags | ImGuiInputTextFlags_CallbackResize, + ItemTrackerNotes::TrackerNotesResizeCallback, + (void*)itemTrackerNotes); + } + }; + static ImVector itemTrackerNotes; + if (itemTrackerNotes.empty()) { + itemTrackerNotes.push_back(0); } + // ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0, 0, 0, 0)); + ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y), ImGuiInputTextFlags_AllowTabInput); + // ImGui::PopStyleColor(); + ImGui::EndGroup(); } // Windowing stuff ImVec4 ChromaKeyBackground = { 0, 0, 0, 0 }; // Float value, 1 = 255 in rgb value. -void BeginFloatingWindows(std::string UniqueName) { - ImGuiWindowFlags FloatingWndFlags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; +void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { + ImGuiWindowFlags windowFlags = flags; + + if (windowFlags == 0) { + windowFlags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; + } if (!CVar_GetS32("gItemTrackerWindowType", 0)) { - FloatingWndFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; + windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; if (!CVar_GetS32("gItemTrackerHudEditMode", 0)) { - FloatingWndFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; + windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; } } ImGui::PushStyleColor(ImGuiCol_WindowBg, ChromaKeyBackground); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); - ImGui::Begin(UniqueName.c_str(), nullptr, FloatingWndFlags); + ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); } void EndFloatingWindows() { ImGui::PopStyleColor(); @@ -450,7 +464,7 @@ void EndFloatingWindows() { */ void DrawItemsInRows(std::vector items, int columns = 6) { int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 7); for (int i = 0; i < items.size(); i++) { if (i % columns == 0) { ImGui::BeginGroup(); @@ -476,10 +490,10 @@ void DrawItemsInRows(std::vector items, int columns = 6) { */ void DrawDungeons(std::vector dungeons, int columns = 6) { int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 7); std::vector dungeonItems = {}; - if (!CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 0)) { + if (!CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { dungeons.erase(std::remove_if(dungeons.begin(), dungeons.end(), [](ItemTrackerDungeon d) { return !d.hasBossKey && !d.hasSmallKey; }), dungeons.end()); } @@ -507,7 +521,7 @@ void DrawDungeons(std::vector dungeons, int columns = 6) { dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); } } - if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 0)) { + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { for (int i = 0; i < MIN(dungeons.size(), columns); i++) { if (dungeons[i].hasMap) { dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_DUNGEON_MAP, dungeons[i].id, DrawDungeonItem)); @@ -530,12 +544,13 @@ void DrawDungeons(std::vector dungeons, int columns = 6) { } } +/* TODO: These need to be moved to a common imgui file */ void LabeledComboBoxRightAligned(const char* label, const char* cvar, std::vector options, s32 defaultValue) { s32 currentValue = CVar_GetS32(cvar, defaultValue); std::string hiddenLabel = "##" + std::string(cvar); ImGui::Text(label); - ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(options[currentValue].c_str()).x * 2.0f) + 8.0f); - ImGui::PushItemWidth(ImGui::CalcTextSize(options[currentValue].c_str()).x * 2.0f); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(options[currentValue].c_str()).x * 1.0f + 20.0f)); + ImGui::PushItemWidth((ImGui::CalcTextSize(options[currentValue].c_str()).x * 1.0f) + 30.0f); if (ImGui::BeginCombo(hiddenLabel.c_str(), options[currentValue].c_str())) { for (int i = 0; i < options.size(); i++) { if (ImGui::Selectable(options[i].c_str())) { @@ -549,19 +564,33 @@ void LabeledComboBoxRightAligned(const char* label, const char* cvar, std::vecto ImGui::PopItemWidth(); } -bool IsValidSaveFile() { - bool validSave = gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2; - return validSave; +void PaddedEnhancementCheckbox(const char* text, const char* cvarName, s32 defaultValue = 0, bool padTop = true, bool padBottom = true) { + if (padTop) { + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + } + bool val = (bool)CVar_GetS32(cvarName, defaultValue); + if (ImGui::Checkbox(text, &val)) { + CVar_SetS32(cvarName, val); + SohImGui::needs_save = true; + } + if (padBottom) { + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + } } +/* ****************************************************** */ void DrawItemTracker(bool& open) { if (!open) { + CVar_SetS32("gItemTrackerEnabled", 0); return; } int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 0); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 7); + int comboButton1Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton1", 6)]; + int comboButton2Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton2", 8)]; + bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; - if (IsValidSaveFile() && CVar_GetS32("gItemTrackerHotKeyShow", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : buttonsPressed[0].button & BTN_L) { + if (CVar_GetS32("gItemTrackerDisplayType", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : comboButtonsHeld) { if ( (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) || (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) || @@ -594,6 +623,9 @@ void DrawItemTracker(bool& open) { if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 1) { DrawDungeons(itemTrackerDungeons); } + if (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 1 && CVar_GetS32("gItemTrackerDisplayType", 0) == 0) { + DrawNotes(); + } EndFloatingWindows(); } @@ -637,6 +669,12 @@ void DrawItemTracker(bool& open) { } EndFloatingWindows(); } + + if (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 2 && CVar_GetS32("gItemTrackerDisplayType", 0) == 0) { + BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); + DrawNotes(); + EndFloatingWindows(); + } } } @@ -661,9 +699,11 @@ void DrawItemTrackerOptions(bool& open) { ImGui::TableNextRow(); ImGui::TableNextColumn(); - SohImGui::PaddedEnhancementCheckbox("L Button to show Item Tracker", "gItemTrackerHotKeyShow", 0); - if (CVar_GetS32("gItemTrackerHotKeyShow", 0)) { - SohImGui::PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerHotKeyShowOnlyPaused", 0); + LabeledComboBoxRightAligned("Display Mode", "gItemTrackerDisplayType", { "Always", "Combo Button Hold" }, 0); + if (CVar_GetS32("gItemTrackerDisplayType", 0) > 0) { + LabeledComboBoxRightAligned("Combo Button 1", "gItemTrackerComboButton1", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right", "None" }, 6); + LabeledComboBoxRightAligned("Combo Button 2", "gItemTrackerComboButton2", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right", "None" }, 8); + PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerHotKeyShowOnlyPaused", 0); } PaddedSeparator(); ImGui::Text("BG Color"); @@ -681,12 +721,12 @@ void DrawItemTrackerOptions(bool& open) { LabeledComboBoxRightAligned("Window Type", "gItemTrackerWindowType", { "Floating", "Window" }, 0); if (CVar_GetS32("gItemTrackerWindowType", 0) == 0) { - SohImGui::PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode", 0); + PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode", 0); } PaddedSeparator(); SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 32, true); - SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 0, true); - SohImGui::PaddedEnhancementCheckbox("Display \"Current/Max\" values", "gItemTrackerDisplayCurrentMax", 0); + SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 7, true); + PaddedEnhancementCheckbox("Display \"Current/Max\" values", "gItemTrackerDisplayCurrentMax", 0); ImGui::TableNextColumn(); @@ -698,22 +738,23 @@ void DrawItemTrackerOptions(bool& open) { LabeledComboBoxRightAligned("Dungeon Items", "gItemTrackerDungeonItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 2); if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) != 0) { if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { - SohImGui::PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", 1); + PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", 1); } - SohImGui::PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); + PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); + } + + if (CVar_GetS32("gItemTrackerDisplayType", 0) != 1) { + LabeledComboBoxRightAligned("Personal notes", "gItemTrackerNotesDisplayType", { "Hidden", "Main Window", "Seperate" }, 2); } ImGui::PopStyleVar(1); ImGui::EndTable(); - // SohImGui::EnhancementCheckbox("Personal notes space", "gItemTrackerNotes"); - // SohImGui::Tooltip("Adds a textbox under the item tracker to keep your own notes in"); - // TODO: FIX THE NOTES SPACE SIZE ON FLOATING WINDOW, DISABLED UNTIL FIXED - ImGui::End(); } void InitItemTracker() { + // TODO: We want to persist this open, but currently I'm not sure of a way to dependably wait till the textures are loaded before we draw the tracker SohImGui::AddWindow("Randomizer", "Item Tracker", DrawItemTracker); SohImGui::AddWindow("Randomizer", "Item Tracker Settings", DrawItemTrackerOptions); float trackerBgR = CVar_GetFloat("gItemTrackerBgColorR", 0); From 7d2170c82b682c04331c32239421a28963e91b7d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 20 Aug 2022 17:24:12 -0400 Subject: [PATCH 142/212] Stops syncing GS Flags with GS Token Count with Skullsanity on. --- .../Enhancements/debugger/debugSaveEditor.cpp | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index e1d2b8060..174aa63d0 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -911,15 +911,19 @@ void DrawFlagsTab() { setMask <<= 1; } - static bool keepGsCountUpdated = true; - ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); - InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags"); - int32_t gsCount = 0; - if (keepGsCountUpdated) { - for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { - gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); + // If playing a Randomizer Save with Shuffle Skull Tokens on anything other than "Off" we don't want to keep + // GS Token Count updated, since Gold Skulltulas killed will not correlate to GS Tokens Collected. + if (!(gSaveContext.n64ddFlag && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS))) { + static bool keepGsCountUpdated = true; + ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); + InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags."); + int32_t gsCount = 0; + if (keepGsCountUpdated) { + for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { + gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); + } + gSaveContext.inventory.gsTokens = gsCount; } - gSaveContext.inventory.gsTokens = gsCount; } }); From 4dff1443a6c8cfcdafecb3a5d7595d84cb66a785 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 20 Aug 2022 18:00:44 -0400 Subject: [PATCH 143/212] Fixes rendering of treasure chest game items. --- soh/src/code/z_actor.c | 2 +- soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c | 7 ++----- .../overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index c05c76091..7e92a6941 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -6078,7 +6078,7 @@ s16 GetChestGameRandoGiDrawId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { GetItemEntry randoGetItem = GetChestGameRandoGetItem(room, ogDrawId, globalCtx); if (randoGetItem.itemId != RG_NONE) { - return ABS(randoGetItem.gi) - 1; + return randoGetItem.gid; } return ogDrawId; diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 80b53eb1f..0cbc370af 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -139,9 +139,7 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { this->unk_17C = func_8002EBCC; if (gSaveContext.n64ddFlag) { this->giDrawId = - ABS(Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20) - .gi) - - 1; + Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20).gid; } else { this->giDrawId = GID_BOMB_BAG_30; } @@ -175,8 +173,7 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { case EXITEM_BOMBCHUS_BOWLING: this->unk_17C = func_8002EBCC; if (gSaveContext.n64ddFlag) { - this->giDrawId = - ABS(Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).gi) - 1; + this->giDrawId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).gid; } else { this->giDrawId = GID_BOMBCHU; } diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index 5509d11d0..eb6efef7b 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -232,7 +232,7 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, GlobalContext* globalCtx) { if(gSaveContext.n64ddFlag && globalCtx->sceneNum == 16) { GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, globalCtx); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - if (randoGetItem.itemId != RG_NONE) { + if (randoGetItem.itemId != ITEM_NONE) { GetItem_Draw(globalCtx, randoGetItem.gid); return; } From 706653624914d45af90badfdb8fefe58ee1298e1 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Sat, 20 Aug 2022 22:17:02 -0700 Subject: [PATCH 144/212] Add #define, fix conflicting delcaration Also re-ordered randomizer.cpp a bit to have the text array above CreateNaviRandoMessages() --- .../Enhancements/randomizer/randomizer.cpp | 129 +++++++++--------- soh/soh/Enhancements/randomizer/randomizer.h | 2 + soh/soh/OTRGlobals.cpp | 4 +- 3 files changed, 66 insertions(+), 69 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 6bf87348d..5928dca86 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3976,13 +3976,73 @@ void CreateScrubMessages() { } } -CustomMessageMinimal NaviMessages[]; -extern const u8 NaviMsgCount = 15; +CustomMessageMinimal NaviMessages[NUM_NAVI_MESSAGES] = { + + { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", + "%cFehlt dir ein kleiner Schlüssel in &einem Labyrinth? Vielleicht hat ihn&ja der %rEndgegner%c!", + "%cIl te manque une %wPetite Clé %cdans&un donjon? C'est peut-être le %rboss&%cqui l'a!" }, + + { "%cSometimes you can use the %rMegaton&Hammer %cinstead of bombs!", + "%cManchmal kannst du den %rStahlhammer&%cstatt Bomben verwenden!", + "%cParfois, tu peux utiliser la %rMasse&des Titans %cau lieu de tes bombes!" }, + + { "%cThere are three %gbusiness scrubs %cin &Hyrule who sell %wmysterious items%c. Do&you know where they are?", + "%cEs gibt drei %gDeku-Händler %cin Hyrule&die mysteriöse Gegenstände&verkaufen. Weißt du wo Sie sind?", + "%cIl y a trois %gPestes Marchandes%c en&Hyrule qui vendent des %wobjets&mystérieux%c. Tu sais où elles sont?" }, + + { "%cStuck on this seed? You could &throw in the towel and check the&%wspoiler log%c...", + "%cHängst du bei diesem Seed fest?&Du könntest die Flinte ins Korn&werfen und ins %wSpoiler Log %cschauen...", + "%cSi tu es coincé sur cette seed,&tu peux toujours jeter l'éponge&et regader le %wSpoiler log%c..." }, + + { "%cDid you know that the %yHover&Boots %ccan be used to cross&%wquicksand%c?", + "%cWusstest du, dass du mit den&%yGleitstiefeln %cTreibsand %wüberqueren&kannst%c?", + "%cEst-ce que tu savais que les %rBottes&des airs %cpouvaient être utilisées&pour traverser les %wsables mouvants%c?" }, + + { "%cYou can reach the back of %wImpa's&House %cby jumping from the&unfinished house with a %rcucco%c!", + "%cDu kannst den Balkon von %wImpas&Haus %cerreichen indem du von&der Baustelle aus mit einem %rHuhn&%cspringst!", + "%cTu peux atteindre l'arrière de la&%wMaison d'Impa %cen sautant depuis la&maison en construction avec une&%rcocotte%c!" }, + + { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", + "%cDie %yGeister-Prüfung %cin %pGanons&Schloss %chat irgendwo eine&%wversteckte Kiste%c. Weißt du schon&wo?", + "%cL'%yÉpreuve de l'Esprit%c dans le %pChâteau&de Ganon %ca un coffre caché quelque&part. Je suppose que tu le savais&déjà?" }, + + { "%cYou know the %wBombchu Bowling&Alley%c? I heard %wonly two of the &prizes %care worthwhile. The rest &is junk!", + "%cKennst du die %wMinenbowlingbahn%c?&Ich habe gehört dass sich nur &%wzwei der Preise%c lohnen. Der Rest&ist Krimskrams!", + "%cEst-ce que tu savais qu'au %wBowling&Teigneux%c, il n'y a que les %wdeux&premiers prix %cqui sont intéréssant?" }, + + { "%cHave you been using %wDeku Nuts&%cenough? I've seen them blow up&a %rBombchu%c!", + "%cBenutzt du auch genügend %wDeku&Nüsse%c? Ich habe mal gesehen dass&man damit %rKrabbelminen %cdetonieren&kann!", + "%cTu es sûr d'utiliser tes %wNoix Mojo &%ccorrectement? J'en ai déjà vu&exploser des %rChoux-Péteurs%c!" }, + + { "%cYou might end up with an %wextra&key %cfor the %bWater Temple %cor the&%rFire Temple%c. It's for your safety!", + "%cVielleicht verbleibt dir im&%bWassertempel %coder %rFeuertempel %cein&%wzusätzlicher Schlüssel%c. Dies&ist zu deiner Sicherheit!", + "%cIl se peut que tu aies une %wPetite&Clé %cen trop dans le %bTemple de l'Eau&%cou le %rTemple du Feu%c. C'est pour ta&propre sécurité!" }, + + { "%cIf you can't pick up a %rbomb&flower %cwith your hands, you can&still detonate it with %rfire %cor&with %warrows%c!", + "%cNur weil du eine %rDonnerblume&%cnicht hochheben kannst, so kannst&du sie immernoch mit %rFeuer %coder&%wPfeilen %cdetonieren!", + "%cSi tu ne peux pas ramasser&un %rChoux-Péteur %cavec tes mains, tu&peux toujours le faire exploser&avec du %rFeu %cou avec des %wflèches%c!" }, + + { "%cEven an adult can't push large&blocks without some %wextra&strength%c!", + "%cSelbst ein Erwachsener kann ohne&etwas %wzusätzliche Kraft %ckeine&großen Blöcke verschieben!", + "%cMême un adulte ne peut pas pousser&de grands blocs sans un petit %wgain&de force%c!" }, + + { "%cI've heard that %rFlare Dancer&%cis weak to the %wMaster Sword%c!&Have you tried it?", + "%cIch habe gehört dass der&%rFlammenderwisch %ceine Schwäche für&das %wMasterschwert %caufweist. Hast du&es schonmal versucht einzusetzen?", + "%cJ'ai entendu dire que les %rDanse-&Flammes %csont faîbles face à l'%wÉpée de&Légende%c! Est-ce que tu as essayé?" }, + + { "%cDon't have a weapon to kill a&%rspider%c? Try throwing a %wpot&%cat it!", + "%cFehlt dir die Waffe um gegen&eine %rSkulltula %czu kämpfen? Versuch&Sie mit einem %wKrug %cabzuwerfen!", + "%cSi tu n'as pas d'arme pour tuer&une %raraignée%c, pourquoi n'essayerais&-tu pas de lui jetter une %wjarre&%cà la figure?" }, + + { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", + "%cIch habe gehört dass die Stelle&%wfeuchten Bodens %cim %bZora-Fluss %cals&einzige keine %rSkulltula %cbeherbergt.", + "%cJ'ai entendu dire que la %wterre meuble&%cqui se trouve à la %bRivière Zora %cest&la seule qui ne contienne pas&d'%raraignée%c." }, +}; void CreateNaviRandoMessages() { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); - for (u8 i = 0; i <= (NaviMsgCount - 1); i++) { + for (u8 i = 0; i <= (NUM_NAVI_MESSAGES - 1); i++) { customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, i, { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, NaviMessages[i].english, NaviMessages[i].german, NaviMessages[i].french }); @@ -4079,66 +4139,3 @@ void Rando_Init(void) { } } - -CustomMessageMinimal NaviMessages[NaviMsgCount] = { - - { "%cMissing a small key in a dungeon?&Maybe the %rboss %chas it!", - "%cFehlt dir ein kleiner Schlüssel in &einem Labyrinth? Vielleicht hat ihn&ja der %rEndgegner%c!", - "%cIl te manque une %wPetite Clé %cdans&un donjon? C'est peut-être le %rboss&%cqui l'a!" }, - - { "%cSometimes you can use the %rMegaton&Hammer %cinstead of bombs!", - "%cManchmal kannst du den %rStahlhammer&%cstatt Bomben verwenden!", - "%cParfois, tu peux utiliser la %rMasse&des Titans %cau lieu de tes bombes!" }, - - { "%cThere are three %gbusiness scrubs %cin &Hyrule who sell %wmysterious items%c. Do&you know where they are?", - "%cEs gibt drei %gDeku-Händler %cin Hyrule&die mysteriöse Gegenstände&verkaufen. Weißt du wo Sie sind?", - "%cIl y a trois %gPestes Marchandes%c en&Hyrule qui vendent des %wobjets&mystérieux%c. Tu sais où elles sont?" }, - - { "%cStuck on this seed? You could &throw in the towel and check the&%wspoiler log%c...", - "%cHängst du bei diesem Seed fest?&Du könntest die Flinte ins Korn&werfen und ins %wSpoiler Log %cschauen...", - "%cSi tu es coincé sur cette seed,&tu peux toujours jeter l'éponge&et regader le %wSpoiler log%c..." }, - - { "%cDid you know that the %yHover&Boots %ccan be used to cross&%wquicksand%c?", - "%cWusstest du, dass du mit den&%yGleitstiefeln %cTreibsand %wüberqueren&kannst%c?", - "%cEst-ce que tu savais que les %rBottes&des airs %cpouvaient être utilisées&pour traverser les %wsables mouvants%c?" }, - - { "%cYou can reach the back of %wImpa's&House %cby jumping from the&unfinished house with a %rcucco%c!", - "%cDu kannst den Balkon von %wImpas&Haus %cerreichen indem du von&der Baustelle aus mit einem %rHuhn&%cspringst!", - "%cTu peux atteindre l'arrière de la&%wMaison d'Impa %cen sautant depuis la&maison en construction avec une&%rcocotte%c!" }, - - { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", - "%cDie %yGeister-Prüfung %cin %pGanons&Schloss %chat irgendwo eine&%wversteckte Kiste%c. Weißt du schon&wo?", - "%cL'%yÉpreuve de l'Esprit%c dans le %pChâteau&de Ganon %ca un coffre caché quelque&part. Je suppose que tu le savais&déjà?" }, - - { "%cYou know the %wBombchu Bowling&Alley%c? I heard %wonly two of the &prizes %care worthwhile. The rest &is junk!", - "%cKennst du die %wMinenbowlingbahn%c?&Ich habe gehört dass sich nur &%wzwei der Preise%c lohnen. Der Rest&ist Krimskrams!", - "%cEst-ce que tu savais qu'au %wBowling&Teigneux%c, il n'y a que les %wdeux&premiers prix %cqui sont intéréssant?" }, - - { "%cHave you been using %wDeku Nuts&%cenough? I've seen them blow up&a %rBombchu%c!", - "%cBenutzt du auch genügend %wDeku&Nüsse%c? Ich habe mal gesehen dass&man damit %rKrabbelminen %cdetonieren&kann!", - "%cTu es sûr d'utiliser tes %wNoix Mojo &%ccorrectement? J'en ai déjà vu&exploser des %rChoux-Péteurs%c!" }, - - { "%cYou might end up with an %wextra&key %cfor the %bWater Temple %cor the&%rFire Temple%c. It's for your safety!", - "%cVielleicht verbleibt dir im&%bWassertempel %coder %rFeuertempel %cein&%wzusätzlicher Schlüssel%c. Dies&ist zu deiner Sicherheit!", - "%cIl se peut que tu aies une %wPetite&Clé %cen trop dans le %bTemple de l'Eau&%cou le %rTemple du Feu%c. C'est pour ta&propre sécurité!" }, - - { "%cIf you can't pick up a %rbomb&flower %cwith your hands, you can&still detonate it with %rfire %cor&with %warrows%c!", - "%cNur weil du eine %rDonnerblume&%cnicht hochheben kannst, so kannst&du sie immernoch mit %rFeuer %coder&%wPfeilen %cdetonieren!", - "%cSi tu ne peux pas ramasser&un %rChoux-Péteur %cavec tes mains, tu&peux toujours le faire exploser&avec du %rFeu %cou avec des %wflèches%c!" }, - - { "%cEven an adult can't push large&blocks without some %wextra&strength%c!", - "%cSelbst ein Erwachsener kann ohne&etwas %wzusätzliche Kraft %ckeine&großen Blöcke verschieben!", - "%cMême un adulte ne peut pas pousser&de grands blocs sans un petit %wgain&de force%c!" }, - - { "%cI've heard that %rFlare Dancer&%cis weak to the %wMaster Sword%c!&Have you tried it?", - "%cIch habe gehört dass der&%rFlammenderwisch %ceine Schwäche für&das %wMasterschwert %caufweist. Hast du&es schonmal versucht einzusetzen?", - "%cJ'ai entendu dire que les %rDanse-&Flammes %csont faîbles face à l'%wÉpée de&Légende%c! Est-ce que tu as essayé?" }, - - { "%cDon't have a weapon to kill a&%rspider%c? Try throwing a %wpot&%cat it!", - "%cFehlt dir die Waffe um gegen&eine %rSkulltula %czu kämpfen? Versuch&Sie mit einem %wKrug %cabzuwerfen!", - "%cSi tu n'as pas d'arme pour tuer&une %raraignée%c, pourquoi n'essayerais&-tu pas de lui jetter une %wjarre&%cà la figure?" }, - - { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", - "%cIch habe gehört dass die Stelle&%wfeuchten Bodens %cim %bZora-Fluss %cals&einzige keine %rSkulltula %cbeherbergt.", - "%cJ'ai entendu dire que la %wterre meuble&%cqui se trouve à la %bRivière Zora %cest&la seule qui ne contienne pas&d'%raraignée%c." }, -}; diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index eb0ef5edd..77beb6725 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -7,6 +7,8 @@ #include #include +#define NUM_NAVI_MESSAGES 15 + class Randomizer { private: std::unordered_map itemLocations; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index f18475ad0..b8b77d336 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1447,10 +1447,8 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); } -extern const u8 NaviMsgCount; - extern "C" CustomMessageEntry Randomizer_GetNaviMessage() { - u16 naviTextId = rand() % NaviMsgCount; + u16 naviTextId = rand() % NUM_NAVI_MESSAGES; return CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId); } From 3aa82eaaf17a19e46f88c8a9c526c517bde53cbd Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sun, 21 Aug 2022 12:59:40 -0500 Subject: [PATCH 145/212] Support only enabling while paused, better align dungeon name text --- .../randomizer/randomizer_item_tracker.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 55217ffe9..c264a8d06 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -14,6 +14,7 @@ #include "variables.h" #include "functions.h" #include "macros.h" +extern GlobalContext* gGlobalCtx; void DrawEquip(ItemTrackerItem item); void DrawItem(ItemTrackerItem item); @@ -165,7 +166,6 @@ std::vector buttonMap = { BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT, - 0 }; ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { @@ -503,8 +503,10 @@ void DrawDungeons(std::vector dungeons, int columns = 6) { ImGui::SameLine(iconSize * i); ImGui::SetCursorPosX(ImGui::GetCursorPosX() + iconSpacing * i); ImVec2 p = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - 10, p.y - 4)); - ImGui::Text(dungeons[i].shortName.c_str()); + std::string dungeonName = dungeons[i].shortName; + + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - 4)); + ImGui::Text(dungeonName.c_str()); } ImGui::EndGroup(); for (int i = 0; i < MIN(dungeons.size(), columns); i++) { @@ -589,8 +591,9 @@ void DrawItemTracker(bool& open) { int comboButton1Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton1", 6)]; int comboButton2Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton2", 8)]; bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; + bool isPaused = CVar_GetS32("gItemTrackerShowOnlyPaused", 0) == 0 || gGlobalCtx != nullptr && gGlobalCtx->pauseCtx.state > 0; - if (CVar_GetS32("gItemTrackerDisplayType", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : comboButtonsHeld) { + if (isPaused && (CVar_GetS32("gItemTrackerDisplayType", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : comboButtonsHeld)) { if ( (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) || (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) || @@ -701,10 +704,10 @@ void DrawItemTrackerOptions(bool& open) { ImGui::TableNextColumn(); LabeledComboBoxRightAligned("Display Mode", "gItemTrackerDisplayType", { "Always", "Combo Button Hold" }, 0); if (CVar_GetS32("gItemTrackerDisplayType", 0) > 0) { - LabeledComboBoxRightAligned("Combo Button 1", "gItemTrackerComboButton1", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right", "None" }, 6); - LabeledComboBoxRightAligned("Combo Button 2", "gItemTrackerComboButton2", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right", "None" }, 8); - PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerHotKeyShowOnlyPaused", 0); + LabeledComboBoxRightAligned("Combo Button 1", "gItemTrackerComboButton1", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 6); + LabeledComboBoxRightAligned("Combo Button 2", "gItemTrackerComboButton2", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 8); } + PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerShowOnlyPaused", 0); PaddedSeparator(); ImGui::Text("BG Color"); ImGui::SameLine(); From b3307883c787ad7b7749ff351ae3703c6e96db72 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sun, 21 Aug 2022 13:32:01 -0500 Subject: [PATCH 146/212] Update soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp --- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index c264a8d06..37a6a4658 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -165,7 +165,7 @@ std::vector buttonMap = { BTN_DUP, BTN_DDOWN, BTN_DLEFT, - BTN_DRIGHT, + BTN_DRIGHT }; ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { From e1b403a31b1dde6ae190a2a8352d1f0fd69073dd Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 21 Aug 2022 15:14:50 -0400 Subject: [PATCH 147/212] Removes unused `Randomizer_GetItemIdFromGetItemId`. --- .../Enhancements/randomizer/randomizer.cpp | 50 ------------------- soh/soh/OTRGlobals.cpp | 4 -- soh/soh/OTRGlobals.h | 1 - soh/src/code/z_sram.c | 2 +- 4 files changed, 1 insertion(+), 56 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 80bdf1c8d..1fc95a04f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -808,48 +808,6 @@ std::unordered_map SpoilerfileCheckNameToEnum = { { "ZR Open Grotto Gossip Stone", RC_ZR_OPEN_GROTTO_GOSSIP_STONE } }; -std::unordered_map getItemIdToItemId = { - { GI_BOW, ITEM_BOW }, - { GI_ARROW_FIRE, ITEM_ARROW_FIRE }, - { GI_DINS_FIRE, ITEM_DINS_FIRE }, - { GI_SLINGSHOT, ITEM_SLINGSHOT }, - { GI_OCARINA_FAIRY, ITEM_OCARINA_FAIRY }, - { GI_OCARINA_OOT, ITEM_OCARINA_TIME }, - { GI_HOOKSHOT, ITEM_HOOKSHOT }, - { GI_LONGSHOT, ITEM_LONGSHOT }, - { GI_ARROW_ICE, ITEM_ARROW_ICE }, - { GI_FARORES_WIND, ITEM_FARORES_WIND }, - { GI_BOOMERANG, ITEM_BOOMERANG }, - { GI_LENS, ITEM_LENS }, - { GI_HAMMER, ITEM_HAMMER }, - { GI_ARROW_LIGHT, ITEM_ARROW_LIGHT }, - { GI_NAYRUS_LOVE, ITEM_NAYRUS_LOVE }, - { GI_BOTTLE, ITEM_BOTTLE }, - { GI_POTION_RED, ITEM_POTION_RED }, - { GI_POTION_GREEN, ITEM_POTION_GREEN }, - { GI_POTION_BLUE, ITEM_POTION_BLUE }, - { GI_FAIRY, ITEM_FAIRY }, - { GI_FISH, ITEM_FISH }, - { GI_MILK_BOTTLE, ITEM_MILK_BOTTLE }, - { GI_LETTER_RUTO, ITEM_LETTER_RUTO }, - { GI_BLUE_FIRE, ITEM_BLUE_FIRE }, - { GI_BUGS, ITEM_BUG }, - { GI_BIG_POE, ITEM_BIG_POE }, - { GI_POE, ITEM_POE }, - { GI_WEIRD_EGG, ITEM_WEIRD_EGG }, - { GI_LETTER_ZELDA, ITEM_LETTER_ZELDA }, - { GI_POCKET_EGG, ITEM_POCKET_EGG }, - { GI_COJIRO, ITEM_COJIRO }, - { GI_ODD_MUSHROOM, ITEM_ODD_MUSHROOM }, - { GI_ODD_POTION, ITEM_ODD_POTION }, - { GI_SAW, ITEM_SAW }, - { GI_SWORD_BROKEN, ITEM_SWORD_BROKEN }, - { GI_PRESCRIPTION, ITEM_PRESCRIPTION }, - { GI_FROG, ITEM_FROG }, - { GI_EYEDROPS, ITEM_EYEDROPS }, - { GI_CLAIM_CHECK, ITEM_CLAIM_CHECK } -}; - std::unordered_map SpoilerfileGetNameToEnum = { { "No Item", RG_NONE }, { "Rien", RG_NONE }, @@ -1266,14 +1224,6 @@ std::unordered_map SpoilerfileSettingNameToEn { "Timesaver Settings:Skip Tower Escape", RSK_SKIP_TOWER_ESCAPE } }; -s32 Randomizer::GetItemIDFromGetItemID(s32 getItemId) { - if (getItemIdToItemId.count(getItemId) == 0) { - return -1; - } - - return getItemIdToItemId[getItemId]; -} - std::string sanitize(std::string stringValue) { // Add backslashes. for (auto i = stringValue.begin();;) { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index ebfc15d79..3b24bafb3 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1544,10 +1544,6 @@ extern "C" void* getN64WeirdFrame(s32 i) { return &weirdFrameBytes[i + sizeof(n64WeirdFrames)]; } -extern "C" s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId) { - return OTRGlobals::Instance->gRandomizer->GetItemIDFromGetItemID(getItemId); -} - extern "C" void Randomizer_LoadSettings(const char* spoilerFileName) { OTRGlobals::Instance->gRandomizer->LoadRandomizerSettings(spoilerFileName); } diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 5be94cb40..069707cd9 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -98,7 +98,6 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); void Randomizer_LoadHintLocations(const char* spoilerFileName); void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent); -s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); // TODO: Remove me GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor); diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 6e58af4d0..6ab65e3cb 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -757,7 +757,7 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { } else if (giid == GI_NUT_UPGRADE_30 || giid == GI_NUT_UPGRADE_40) { GiveLinkDekuNutUpgrade(giid); } else { - s32 iid = Randomizer_GetItemIDFromGetItemID(giid); + s32 iid = getItem.itemId; if (iid != -1) INV_CONTENT(iid) = iid; } } else if (getItem.modIndex == MOD_RANDOMIZER) { From e5bca727ac2bd799e6354b1052e188a29451f365 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 21 Aug 2022 15:22:18 -0400 Subject: [PATCH 148/212] Cleans up an if statement for item00. --- soh/src/code/z_en_item00.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index e61037328..3300a7172 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -509,12 +509,11 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { break; } - if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { - getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - getItemId = getItem.getItemId; - if (!gSaveContext.n64ddFlag) { + if (!Actor_HasParent(&this->actor, globalCtx)) { + if (!gSaveContext.n64ddFlag && getItemId != GI_NONE) { func_8002F554(&this->actor, globalCtx, getItemId); } else { + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem); } } From 2bbd618599d9bd96250798daffbb7fbb1677db60 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 21 Aug 2022 15:35:10 -0400 Subject: [PATCH 149/212] Cleans up another if statement in item00 --- soh/src/code/z_en_item00.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 3300a7172..be40d80f4 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -671,13 +671,13 @@ void func_8001E304(EnItem00* this, GlobalContext* globalCtx) { void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); - GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - if (this->getItemId != GI_NONE) { if (!Actor_HasParent(&this->actor, globalCtx)) { - if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { - func_8002F434(&this->actor, globalCtx, getItemEntry.getItemId, 50.0f, 80.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f); } else { + GetItemEntry getItemEntry = + Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 50.0f, 80.0f); } this->unk_15A++; From 91cb6f2360c572b0c15c945f16e0cf92ab23fc2b Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 21 Aug 2022 16:40:16 -0400 Subject: [PATCH 150/212] This should fix a bug with the Gerudo Archery minigame. I wasn't able to get the bug to happen after making this change. --- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index 1c57922b1..407c43100 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -546,7 +546,7 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { } } - if (!gSaveContext.n64ddFlag || getItemEntry.getItemId != GI_NONE) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); @@ -587,7 +587,7 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { } } - if (!gSaveContext.n64ddFlag || getItemEntry.getItemId != GI_NONE) { + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); } else { GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); From f52ba103aa32f303f45438b011c13b481fc8bfd9 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sun, 21 Aug 2022 17:07:24 -0500 Subject: [PATCH 151/212] Attempt to fix windows build error --- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index c264a8d06..ba9bf62f6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -10,11 +10,13 @@ #include #include +extern "C" { #include #include "variables.h" #include "functions.h" #include "macros.h" extern GlobalContext* gGlobalCtx; +} void DrawEquip(ItemTrackerItem item); void DrawItem(ItemTrackerItem item); From 51e4485966f82dc190f6a3ec925ffe17dbf21b27 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Sun, 21 Aug 2022 21:08:01 -0400 Subject: [PATCH 152/212] LUS Cleanup: Merge Window and GlobalCtx2 classes. (#1259) * Merges GlobalCtx2 and Window classes. * Includes condition variable in File. * add mac specific include * sstream to get past "implicit instantiation of undefined template" error * switch/wiiu includes * that file doesn't exist * more wii u globalctx2 stuff Co-authored-by: briaguya --- ZAPDTR/ZAPDUtils/Vec3f.h | 2 - libultraship/libultraship/Archive.h | 1 - libultraship/libultraship/CMakeLists.txt | 2 - libultraship/libultraship/Console.cpp | 2 +- libultraship/libultraship/Console.h | 2 - libultraship/libultraship/ControlDeck.cpp | 4 +- libultraship/libultraship/Cvar.cpp | 8 +- libultraship/libultraship/File.h | 3 +- libultraship/libultraship/GameOverlay.cpp | 2 +- libultraship/libultraship/GlobalCtx2.cpp | 149 --------- libultraship/libultraship/GlobalCtx2.h | 54 ---- libultraship/libultraship/ImGuiImpl.cpp | 27 +- libultraship/libultraship/InputEditor.cpp | 4 +- .../libultraship/KeyboardController.cpp | 4 +- .../libultraship/Lib/Fast3D/gfx_gx2.cpp | 1 - .../libultraship/Lib/Fast3D/gfx_opengl.cpp | 2 +- .../libultraship/Lib/Fast3D/gfx_pc.cpp | 4 +- libultraship/libultraship/Lib/Fast3D/gfx_pc.h | 1 + libultraship/libultraship/Material.h | 1 + libultraship/libultraship/Resource.h | 26 +- libultraship/libultraship/ResourceMgr.cpp | 2 +- libultraship/libultraship/ResourceMgr.h | 18 +- libultraship/libultraship/SDLController.cpp | 2 +- libultraship/libultraship/WiiUController.cpp | 1 - libultraship/libultraship/WiiUGamepad.cpp | 1 - libultraship/libultraship/WiiUImpl.cpp | 2 +- libultraship/libultraship/Window.cpp | 286 +++++++++++++----- libultraship/libultraship/Window.h | 58 ++-- soh/soh/Enhancements/debugconsole.cpp | 4 - .../randomizer/3drando/rando_main.cpp | 6 +- .../randomizer/3drando/spoiler_log.cpp | 10 +- soh/soh/OTRGlobals.cpp | 65 ++-- soh/soh/OTRGlobals.h | 4 +- soh/soh/SaveManager.cpp | 8 +- soh/soh/z_play_otr.cpp | 2 +- 35 files changed, 349 insertions(+), 419 deletions(-) delete mode 100644 libultraship/libultraship/GlobalCtx2.cpp delete mode 100644 libultraship/libultraship/GlobalCtx2.h diff --git a/ZAPDTR/ZAPDUtils/Vec3f.h b/ZAPDTR/ZAPDUtils/Vec3f.h index d6e9c5568..844b1522c 100644 --- a/ZAPDTR/ZAPDUtils/Vec3f.h +++ b/ZAPDTR/ZAPDUtils/Vec3f.h @@ -1,7 +1,5 @@ #pragma once -#include - struct Vec3f { float x, y, z; diff --git a/libultraship/libultraship/Archive.h b/libultraship/libultraship/Archive.h index 0eeaa4021..1cd6fb78e 100644 --- a/libultraship/libultraship/Archive.h +++ b/libultraship/libultraship/Archive.h @@ -10,7 +10,6 @@ #include #include #include "Resource.h" -//#include "Lib/StrHash64.h" #include "StormLib.h" diff --git a/libultraship/libultraship/CMakeLists.txt b/libultraship/libultraship/CMakeLists.txt index 49c6ff9b4..297d157b1 100644 --- a/libultraship/libultraship/CMakeLists.txt +++ b/libultraship/libultraship/CMakeLists.txt @@ -133,8 +133,6 @@ source_group("Source Files\\CustomImpl\\Utils" FILES ${Source_Files__CustomImpl_ set(Source_Files__Globals "Cvar.cpp" "Cvar.h" - "GlobalCtx2.cpp" - "GlobalCtx2.h" "LUSMacros.h" "Window.cpp" "Window.h" diff --git a/libultraship/libultraship/Console.cpp b/libultraship/libultraship/Console.cpp index 79064838e..846e6e0a0 100644 --- a/libultraship/libultraship/Console.cpp +++ b/libultraship/libultraship/Console.cpp @@ -1,12 +1,12 @@ #include "Console.h" #include "Cvar.h" -#include "GlobalCtx2.h" #include "ImGuiImpl.h" #include "Lib/ImGui/imgui.h" #include "Utils/StringHelper.h" #include "Lib/ImGui/imgui_internal.h" #include "Utils.h" +#include namespace Ship { std::string BuildUsage(const CommandEntry& entry) { diff --git a/libultraship/libultraship/Console.h b/libultraship/libultraship/Console.h index f0b78aac9..4f846a2c5 100644 --- a/libultraship/libultraship/Console.h +++ b/libultraship/libultraship/Console.h @@ -6,8 +6,6 @@ #include #include "Lib/ImGui/imgui.h" -#define NOGDI -#define WIN32_LEAN_AND_MEAN #include "spdlog/spdlog.h" namespace Ship { diff --git a/libultraship/libultraship/ControlDeck.cpp b/libultraship/libultraship/ControlDeck.cpp index 36e581fc7..7c4708ab2 100644 --- a/libultraship/libultraship/ControlDeck.cpp +++ b/libultraship/libultraship/ControlDeck.cpp @@ -96,7 +96,7 @@ namespace Ship { #define NESTED(key, ...) StringHelper::Sprintf("Controllers.%s.Slot_%d." key, device->GetGuid().c_str(), virtualSlot, __VA_ARGS__) void ControlDeck::LoadControllerSettings() { - std::shared_ptr Config = GlobalCtx2::GetInstance()->GetConfig(); + std::shared_ptr Config = Window::GetInstance()->GetConfig(); for (auto const& val : Config->rjson["Controllers"]["Deck"].items()) { int32_t slot = std::stoi(val.key().substr(5)); @@ -182,7 +182,7 @@ namespace Ship { } void ControlDeck::SaveControllerSettings() { - std::shared_ptr Config = GlobalCtx2::GetInstance()->GetConfig(); + std::shared_ptr Config = Window::GetInstance()->GetConfig(); for (size_t i = 0; i < virtualDevices.size(); i++) { std::shared_ptr backend = physicalDevices[virtualDevices[i]]; diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index 242b4c913..42be25619 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -5,7 +5,7 @@ #include #include #include -#include "GlobalCtx2.h" +#include "Window.h" std::map, std::less<>> cvars; @@ -144,7 +144,7 @@ template bool is_number(const std::string& s) { } void CVar_LoadLegacy() { - auto cvarsConfig = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("cvars.cfg"); + auto cvarsConfig = Ship::Window::GetPathRelativeToAppDirectory("cvars.cfg"); if (File::Exists(cvarsConfig)) { const auto lines = File::ReadAllLines(cvarsConfig); @@ -191,7 +191,7 @@ void CVar_LoadLegacy() { extern "C" void CVar_Load() { - std::shared_ptr pConf = Ship::GlobalCtx2::GetInstance()->GetConfig(); + std::shared_ptr pConf = Ship::Window::GetInstance()->GetConfig(); pConf->reload(); for (const auto& item : pConf->rjson["CVars"].items()) { @@ -235,7 +235,7 @@ extern "C" void CVar_Load() { extern "C" void CVar_Save() { - std::shared_ptr pConf = Ship::GlobalCtx2::GetInstance()->GetConfig(); + std::shared_ptr pConf = Ship::Window::GetInstance()->GetConfig(); for (const auto& cvar : cvars) { const std::string key = StringHelper::Sprintf("CVars.%s", cvar.first.c_str()); diff --git a/libultraship/libultraship/File.h b/libultraship/libultraship/File.h index b5d484d2d..03f08c80f 100644 --- a/libultraship/libultraship/File.h +++ b/libultraship/libultraship/File.h @@ -2,7 +2,8 @@ #include #include -#include "GlobalCtx2.h" +#include +#include namespace Ship { class Archive; diff --git a/libultraship/libultraship/GameOverlay.cpp b/libultraship/libultraship/GameOverlay.cpp index e4a160a50..b5225e22e 100644 --- a/libultraship/libultraship/GameOverlay.cpp +++ b/libultraship/libultraship/GameOverlay.cpp @@ -45,7 +45,7 @@ namespace Ship { void GameOverlay::LoadFont(const std::string& name, const std::string& path, float fontSize) { ImGuiIO& io = ImGui::GetIO(); - std::shared_ptr base = GlobalCtx2::GetInstance()->GetResourceManager()->GetArchive(); + std::shared_ptr base = Window::GetInstance()->GetResourceManager()->GetArchive(); std::shared_ptr font = std::make_shared(); base->LoadFile(path, false, font); if (font->bIsLoaded) { diff --git a/libultraship/libultraship/GlobalCtx2.cpp b/libultraship/libultraship/GlobalCtx2.cpp deleted file mode 100644 index 148a062ef..000000000 --- a/libultraship/libultraship/GlobalCtx2.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "GlobalCtx2.h" -#include -#include -#include "ResourceMgr.h" -#include "Window.h" -#include "spdlog/async.h" -#include "spdlog/sinks/rotating_file_sink.h" -#include "spdlog/sinks/stdout_color_sinks.h" -#include "spdlog/sinks/sohconsole_sink.h" -#ifdef __APPLE__ -#include "OSXFolderManager.h" -#elif defined(__SWITCH__) -#include "SwitchImpl.h" -#elif defined(__WIIU__) -#include "WiiUImpl.h" -#endif - -namespace Ship { - std::weak_ptr GlobalCtx2::Context; - std::shared_ptr GlobalCtx2::GetInstance() { - return Context.lock(); - } - - std::shared_ptr GlobalCtx2::CreateInstance(const std::string& Name) { - if (Context.expired()) { - auto Shared = std::make_shared(Name); - Context = Shared; - Shared->InitWindow(); - return Shared; - } else { - SPDLOG_DEBUG("Trying to create a context when it already exists."); - } - - return GetInstance(); - } - - std::string GlobalCtx2::GetAppDirectoryPath() { - #ifdef __APPLE__ - FolderManager folderManager; - std::string fpath = std::string(folderManager.pathForDirectory(NSApplicationSupportDirectory, NSUserDomainMask)); - fpath.append("/com.shipofharkinian.soh"); - return fpath; - #endif - - return "."; - - } - - std::string GlobalCtx2::GetPathRelativeToAppDirectory(const char* path) { - return GlobalCtx2::GetAppDirectoryPath() + "/" + path; - } - - GlobalCtx2::GlobalCtx2(std::string Name) : Name(std::move(Name)) { - - } - - GlobalCtx2::~GlobalCtx2() { - SPDLOG_INFO("destruct GlobalCtx2"); - } - - void GlobalCtx2::InitWindow() { - InitLogging(); - Config = std::make_shared(GetPathRelativeToAppDirectory("shipofharkinian.json")); - - MainPath = Config->getString("Game.Main Archive", GetPathRelativeToAppDirectory("oot.otr")); - PatchesPath = Config->getString("Game.Patches Archive", GetAppDirectoryPath() + "/mods"); - - ResMan = std::make_shared(GetInstance(), MainPath, PatchesPath); - Win = std::make_shared(GetInstance()); - - if (!ResMan->DidLoadSuccessfully()) - { -#ifdef _WIN32 - MessageBox(nullptr, L"Main OTR file not found!", L"Uh oh", MB_OK); -#elif defined(__SWITCH__) - printf("Main OTR file not found!\n"); -#elif defined(__WIIU__) - Ship::WiiU::ThrowMissingOTR(MainPath.c_str()); -#else - SPDLOG_ERROR("Main OTR file not found!"); -#endif - exit(1); - } - #ifdef __SWITCH__ - Ship::Switch::Init(PostInitPhase); - #endif - } - - void GlobalCtx2::InitLogging() { - try { - // Setup Logging - spdlog::init_thread_pool(8192, 1); - std::vector Sinks; - - auto SohConsoleSink = std::make_shared(); - SohConsoleSink->set_level(spdlog::level::trace); - Sinks.push_back(SohConsoleSink); - -#if (!defined(_WIN32) && !defined(__WIIU__)) || defined(_DEBUG) - auto ConsoleSink = std::make_shared(); - ConsoleSink->set_level(spdlog::level::trace); - Sinks.push_back(ConsoleSink); -#endif - -#ifndef __WIIU__ - auto logPath = GetPathRelativeToAppDirectory(("logs/" + GetName() + ".log").c_str()); - auto FileSink = std::make_shared(logPath, 1024 * 1024 * 10, 10); - FileSink->set_level(spdlog::level::trace); - Sinks.push_back(FileSink); -#endif - - Logger = std::make_shared(GetName(), Sinks.begin(), Sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block); - GetLogger()->set_level(spdlog::level::trace); - -#ifndef __WIIU__ - GetLogger()->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%@] [%l] %v"); -#else - GetLogger()->set_pattern("[%s:%#] [%l] %v"); -#endif - - spdlog::register_logger(GetLogger()); - spdlog::set_default_logger(GetLogger()); - } - catch (const spdlog::spdlog_ex& ex) { - std::cout << "Log initialization failed: " << ex.what() << std::endl; - } - } - - void GlobalCtx2::WriteSaveFile(const std::filesystem::path& savePath, const uintptr_t addr, void* dramAddr, const size_t size) { - std::ofstream saveFile = std::ofstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary); - saveFile.seekp(addr); - saveFile.write((char*)dramAddr, size); - saveFile.close(); - } - - void GlobalCtx2::ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size) { - std::ifstream saveFile = std::ifstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary); - - // If the file doesn't exist, initialize DRAM - if (saveFile.good()) { - saveFile.seekg(addr); - saveFile.read((char*)dramAddr, size); - } else { - memset(dramAddr, 0, size); - } - - saveFile.close(); - } -} diff --git a/libultraship/libultraship/GlobalCtx2.h b/libultraship/libultraship/GlobalCtx2.h deleted file mode 100644 index 21402070d..000000000 --- a/libultraship/libultraship/GlobalCtx2.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef GLOBAL_CTX_2 -#define GLOBAL_CTX_2 - -#pragma once - -#ifdef __cplusplus -#include -#include -#include -#include "spdlog/spdlog.h" -#include "Lib/Mercury/Mercury.h" - -namespace Ship { - class ResourceMgr; - class Window; - - class GlobalCtx2 { - public: - static std::shared_ptr GetInstance(); - static std::shared_ptr CreateInstance(const std::string& Name); - - std::string GetName() { return Name; } - std::shared_ptr GetWindow() { return Win; } - std::shared_ptr GetResourceManager() { return ResMan; } - std::shared_ptr GetLogger() { return Logger; } - std::shared_ptr GetConfig() { return Config; } - - static std::string GetAppDirectoryPath(); - static std::string GetPathRelativeToAppDirectory(const char* path); - - void WriteSaveFile(const std::filesystem::path& savePath, uintptr_t addr, void* dramAddr, size_t size); - void ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size); - - GlobalCtx2(std::string Name); - ~GlobalCtx2(); - - protected: - void InitWindow(); - void InitLogging(); - - private: - static std::weak_ptr Context; - std::shared_ptr Logger; - std::shared_ptr Win; - std::shared_ptr Config; // Config needs to be after the Window because we call the Window during it's destructor. - std::shared_ptr ResMan; - std::string Name; - std::string MainPath; - std::string PatchesPath; - }; -} -#endif - -#endif diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index b3b8a1c78..660df709e 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -18,7 +18,6 @@ #include "Hooks.h" #define IMGUI_DEFINE_MATH_OPERATORS #include "Lib/ImGui/imgui_internal.h" -#include "GlobalCtx2.h" #include "ResourceMgr.h" #include "Window.h" #include "Cvar.h" @@ -345,27 +344,27 @@ namespace SohImGui { void ShowCursor(bool hide, Dialogues d) { if (d == Dialogues::dLoadSettings) { - GlobalCtx2::GetInstance()->GetWindow()->ShowCursor(hide); + Window::GetInstance()->ShowCursor(hide); return; } if (d == Dialogues::dConsole && CVar_GetS32("gOpenMenuBar", 0)) { return; } - if (!GlobalCtx2::GetInstance()->GetWindow()->IsFullscreen()) { + if (!Window::GetInstance()->IsFullscreen()) { oldCursorState = false; return; } if (oldCursorState != hide) { oldCursorState = hide; - GlobalCtx2::GetInstance()->GetWindow()->ShowCursor(hide); + Window::GetInstance()->ShowCursor(hide); } } void LoadTexture(const std::string& name, const std::string& path) { GfxRenderingAPI* api = gfx_get_current_rendering_api(); - const auto res = GlobalCtx2::GetInstance()->GetResourceManager()->LoadFile(path); + const auto res = Window::GetInstance()->GetResourceManager()->LoadFile(path); const auto asset = new GameAsset{ api->new_texture() }; uint8_t* img_data = stbi_load_from_memory(reinterpret_cast(res->buffer.get()), res->dwBufferSize, &asset->width, &asset->height, nullptr, 4); @@ -401,7 +400,7 @@ namespace SohImGui { void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint) { GfxRenderingAPI* api = gfx_get_current_rendering_api(); - const auto res = static_cast(GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(path).get()); + const auto res = static_cast(Window::GetInstance()->GetResourceManager()->LoadResource(path).get()); std::vector texBuffer; texBuffer.reserve(res->width * res->height * 4); @@ -466,7 +465,7 @@ namespace SohImGui { io->DisplaySize.y = window_impl.gx2.height; #endif - lastBackendID = GetBackendID(GlobalCtx2::GetInstance()->GetConfig()); + lastBackendID = GetBackendID(Window::GetInstance()->GetConfig()); if (CVar_GetS32("gOpenMenuBar", 0) != 1) { #if defined(__SWITCH__) || defined(__WIIU__) SohImGui::overlay->TextDrawNotification(30.0f, true, "Press - to access enhancements menu"); @@ -475,8 +474,8 @@ namespace SohImGui { #endif } - auto imguiIniPath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("imgui.ini"); - auto imguiLogPath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("imgui_log.txt"); + auto imguiIniPath = Ship::Window::GetPathRelativeToAppDirectory("imgui.ini"); + auto imguiLogPath = Ship::Window::GetPathRelativeToAppDirectory("imgui_log.txt"); io->IniFilename = strcpy(new char[imguiIniPath.length() + 1], imguiIniPath.c_str()); io->LogFilename = strcpy(new char[imguiLogPath.length() + 1], imguiLogPath.c_str()); @@ -500,7 +499,7 @@ namespace SohImGui { #endif Ship::RegisterHook([] { - if (GlobalCtx2::GetInstance()->GetWindow()->IsFullscreen()) + if (Window::GetInstance()->IsFullscreen()) ShowCursor(CVar_GetS32("gOpenMenuBar", 0), Dialogues::dLoadSettings); LoadTexture("Game_Icon", "assets/ship_of_harkinian/icons/gSohIcon.png"); @@ -883,8 +882,8 @@ namespace SohImGui { ImGuiWMNewFrame(); ImGui::NewFrame(); - const std::shared_ptr wnd = GlobalCtx2::GetInstance()->GetWindow(); - const std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); + const std::shared_ptr wnd = Window::GetInstance(); + const std::shared_ptr pConf = Window::GetInstance()->GetConfig(); ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | @@ -921,9 +920,9 @@ namespace SohImGui { bool menu_bar = CVar_GetS32("gOpenMenuBar", 0); CVar_SetS32("gOpenMenuBar", !menu_bar); needs_save = true; - GlobalCtx2::GetInstance()->GetWindow()->SetMenuBar(menu_bar); + Window::GetInstance()->SetMenuBar(menu_bar); ShowCursor(menu_bar, Dialogues::dMenubar); - GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->SaveControllerSettings(); + Window::GetInstance()->GetControlDeck()->SaveControllerSettings(); if (CVar_GetS32("gControlNav", 0) && CVar_GetS32("gOpenMenuBar", 0)) { io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard; } else { diff --git a/libultraship/libultraship/InputEditor.cpp b/libultraship/libultraship/InputEditor.cpp index 7fc7bc404..a6754045f 100644 --- a/libultraship/libultraship/InputEditor.cpp +++ b/libultraship/libultraship/InputEditor.cpp @@ -16,7 +16,7 @@ namespace Ship { } std::shared_ptr GetControllerPerSlot(int slot) { - auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto controlDeck = Ship::Window::GetInstance()->GetControlDeck(); return controlDeck->GetPhysicalDeviceFromVirtualSlot(slot); } @@ -85,7 +85,7 @@ namespace Ship { } void InputEditor::DrawControllerSchema() { - auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto controlDeck = Ship::Window::GetInstance()->GetControlDeck(); auto Backend = controlDeck->GetPhysicalDeviceFromVirtualSlot(CurrentPort); auto profile = Backend->getProfile(CurrentPort); bool IsKeyboard = Backend->GetGuid() == "Keyboard" || Backend->GetGuid() == "Auto" || !Backend->Connected(); diff --git a/libultraship/libultraship/KeyboardController.cpp b/libultraship/libultraship/KeyboardController.cpp index 7df244d9c..ff0b72b70 100644 --- a/libultraship/libultraship/KeyboardController.cpp +++ b/libultraship/libultraship/KeyboardController.cpp @@ -7,7 +7,7 @@ #endif #include "Hooks.h" -#include "GlobalCtx2.h" + #include "Window.h" namespace Ship { @@ -70,7 +70,7 @@ namespace Ship { }); if (find == Mappings.end()) return "Unknown"; - const char* name = GlobalCtx2::GetInstance()->GetWindow()->GetKeyName(find->first); + const char* name = Window::GetInstance()->GetKeyName(find->first); return strlen(name) == 0 ? "Unknown" : name; } diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_gx2.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_gx2.cpp index dddc0fa85..876375169 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_gx2.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_gx2.cpp @@ -16,7 +16,6 @@ #include "gfx_cc.h" #include "gfx_rendering_api.h" -#include "../../GlobalCtx2.h" #include "gfx_pc.h" #include "gfx_wiiu.h" diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index 7b70ba11b..7d2428a45 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -44,7 +44,7 @@ #include "gfx_cc.h" #include "gfx_rendering_api.h" #include "../../ImGuiImpl.h" -#include "../../GlobalCtx2.h" +#include "../../Window.h" #include "gfx_pc.h" using namespace std; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index fc35f6f7f..cca872f99 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -15,6 +15,7 @@ #ifndef _LANGUAGE_C #define _LANGUAGE_C #endif +#include #include #include #include @@ -36,6 +37,7 @@ #include "../../ResourceMgr.h" #include "../../Utils.h" + // OTRTODO: fix header files for these extern "C" { const char* ResourceMgr_GetNameByCRC(uint64_t crc); @@ -2171,7 +2173,7 @@ static void gfx_run_dl(Gfx* cmd) { uintptr_t mtxAddr = cmd->words.w1; // OTRTODO: Temp way of dealing with gMtxClear. Need something more elegant in the future... - uint32_t gameVersion = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->GetGameVersion(); + uint32_t gameVersion = Ship::Window::GetInstance()->GetResourceManager()->GetGameVersion(); if (gameVersion == OOT_PAL_GC) { if (mtxAddr == SEG_ADDR(0, 0x0FBC20)) { mtxAddr = clearMtx; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h index feab8e3d9..2804c7010 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h @@ -8,6 +8,7 @@ #include #include +#include "U64/PR/ultra64/gbi.h" #include "U64/PR/ultra64/types.h" // TODO figure out why changing these to 640x480 makes the game only render in a quarter of the window diff --git a/libultraship/libultraship/Material.h b/libultraship/libultraship/Material.h index 2d9e70327..ec45dcb91 100644 --- a/libultraship/libultraship/Material.h +++ b/libultraship/libultraship/Material.h @@ -1,4 +1,5 @@ #include "Resource.h" +#include "StrHash.h" namespace Ship { diff --git a/libultraship/libultraship/Resource.h b/libultraship/libultraship/Resource.h index f7ea98e93..9e89d19f5 100644 --- a/libultraship/libultraship/Resource.h +++ b/libultraship/libultraship/Resource.h @@ -3,15 +3,14 @@ #include #include "Utils/BinaryReader.h" #include "Utils/BinaryWriter.h" -#include "GlobalCtx2.h" -#include "StrHash.h" #include "File.h" #include "Lib/tinyxml2/tinyxml2.h" +#include "spdlog/spdlog.h" -namespace Ship -{ - enum class ResourceType - { +namespace Ship { + class ResourceMgr; + + enum class ResourceType { Archive = 0x4F415243, // OARC (UNUSED) Model = 0x4F4D444C, // OMDL (WIP) Texture = 0x4F544558, // OTEX @@ -36,8 +35,7 @@ namespace Ship AudioSequence = 0x4F534551, // OSEQ }; - enum class DataType - { + enum class DataType { U8 = 0, S8 = 1, U16 = 2, @@ -51,8 +49,7 @@ namespace Ship F64 = 10 }; - enum class Version - { + enum class Version { // BR Deckard = 0, Roy = 1, @@ -61,15 +58,13 @@ namespace Ship // ... }; - struct Patch - { + struct Patch { uint64_t crc; uint32_t index; uintptr_t origData; }; - class Resource - { + class Resource { public: ResourceMgr* resMgr; uint64_t id; // Unique Resource ID @@ -81,8 +76,7 @@ namespace Ship virtual ~Resource(); }; - class ResourceFile - { + class ResourceFile { public: Endianness endianness; // 0x00 - Endianness of the file uint32_t resourceType; // 0x01 - 4 byte MAGIC diff --git a/libultraship/libultraship/ResourceMgr.cpp b/libultraship/libultraship/ResourceMgr.cpp index 4c517b39d..58f1a8a83 100644 --- a/libultraship/libultraship/ResourceMgr.cpp +++ b/libultraship/libultraship/ResourceMgr.cpp @@ -9,7 +9,7 @@ namespace Ship { - ResourceMgr::ResourceMgr(std::shared_ptr Context, const std::string& MainPath, const std::string& PatchesPath) : Context(Context), bIsRunning(false), FileLoadThread(nullptr) { + ResourceMgr::ResourceMgr(std::shared_ptr Context, const std::string& MainPath, const std::string& PatchesPath) : Context(Context), bIsRunning(false), FileLoadThread(nullptr) { OTR = std::make_shared(MainPath, PatchesPath, false); gameVersion = OOT_UNKNOWN; diff --git a/libultraship/libultraship/ResourceMgr.h b/libultraship/libultraship/ResourceMgr.h index 5604552d5..0d9f40f86 100644 --- a/libultraship/libultraship/ResourceMgr.h +++ b/libultraship/libultraship/ResourceMgr.h @@ -5,26 +5,26 @@ #include #include #include +#include "Window.h" #include "Resource.h" -#include "GlobalCtx2.h" +#include "Archive.h" +#include "File.h" -namespace Ship -{ - class Archive; - class File; +namespace Ship { + class Window; // Resource manager caches any and all files it comes across into memory. This will be unoptimal in the future when modifications have gigabytes of assets. // It works with the original game's assets because the entire ROM is 64MB and fits into RAM of any semi-modern PC. class ResourceMgr { public: - ResourceMgr(std::shared_ptr Context, const std::string& MainPath, const std::string& PatchesPath); + ResourceMgr(std::shared_ptr Context, const std::string& MainPath, const std::string& PatchesPath); ~ResourceMgr(); bool IsRunning(); bool DidLoadSuccessfully(); std::shared_ptr GetArchive() { return OTR; } - std::shared_ptr GetContext() { return Context.lock(); } + std::shared_ptr GetContext() { return Context; } const std::string* HashToString(uint64_t Hash) const; @@ -34,7 +34,7 @@ namespace Ship void SetGameVersion(uint32_t newGameVersion); std::shared_ptr LoadFileAsync(const std::string& FilePath); std::shared_ptr LoadFile(const std::string& FilePath); - std::shared_ptr GetCachedFile(const char* FilePath) const; + std::shared_ptr GetCachedFile(const char* FilePath) const; std::shared_ptr LoadResource(const char* FilePath); std::shared_ptr LoadResource(const std::string& FilePath) { return LoadResource(FilePath.c_str()); } std::variant, std::shared_ptr> LoadResourceAsync(const char* FilePath); @@ -50,7 +50,7 @@ namespace Ship void LoadResourceThread(); private: - std::weak_ptr Context; + std::shared_ptr Context; volatile bool bIsRunning; std::unordered_map> FileCache; std::unordered_map> ResourceCache; diff --git a/libultraship/libultraship/SDLController.cpp b/libultraship/libultraship/SDLController.cpp index 97a9a019f..d0bb8e1f7 100644 --- a/libultraship/libultraship/SDLController.cpp +++ b/libultraship/libultraship/SDLController.cpp @@ -1,5 +1,5 @@ #include "SDLController.h" -#include "GlobalCtx2.h" + #include "spdlog/spdlog.h" #include "Window.h" #include diff --git a/libultraship/libultraship/WiiUController.cpp b/libultraship/libultraship/WiiUController.cpp index 19835a548..de5c33633 100644 --- a/libultraship/libultraship/WiiUController.cpp +++ b/libultraship/libultraship/WiiUController.cpp @@ -1,6 +1,5 @@ #ifdef __WIIU__ #include "WiiUController.h" -#include "GlobalCtx2.h" #include "Window.h" #include "ImGuiImpl.h" diff --git a/libultraship/libultraship/WiiUGamepad.cpp b/libultraship/libultraship/WiiUGamepad.cpp index 64ef9e90f..ac1558e08 100644 --- a/libultraship/libultraship/WiiUGamepad.cpp +++ b/libultraship/libultraship/WiiUGamepad.cpp @@ -1,6 +1,5 @@ #ifdef __WIIU__ #include "WiiUGamepad.h" -#include "GlobalCtx2.h" #include "ImGuiImpl.h" #include "WiiUImpl.h" diff --git a/libultraship/libultraship/WiiUImpl.cpp b/libultraship/libultraship/WiiUImpl.cpp index 06cd3ec60..41439542a 100644 --- a/libultraship/libultraship/WiiUImpl.cpp +++ b/libultraship/libultraship/WiiUImpl.cpp @@ -114,7 +114,7 @@ void Update() { // rescan devices if connection state changed if (rescan) { - Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->ScanPhysicalDevices(); + Window::GetInstance()->GetControlDeck()->ScanPhysicalDevices(); } } diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 7a543d1d8..591d926e0 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -1,23 +1,18 @@ +#include +#include +#include +#include #include "Window.h" -#include "spdlog/spdlog.h" -#include "KeyboardController.h" -#include "GlobalCtx2.h" -#include "DisplayList.h" -#include "Vertex.h" -#include "Array.h" #include "ResourceMgr.h" +#include "KeyboardController.h" +#include "UltraController.h" +#include "DisplayList.h" +#include "Console.h" +#include "Array.h" #include "Texture.h" #include "Blob.h" #include "Matrix.h" -#include "AudioPlayer.h" #include "Hooks.h" -#include "UltraController.h" -#include -#include -#include -#include "Console.h" -#include "ImGuiImpl.h" -#include "PR/ultra64/gbi.h" #include "Lib/Fast3D/gfx_pc.h" #include "Lib/Fast3D/gfx_sdl.h" #include "Lib/Fast3D/gfx_dxgi.h" @@ -27,12 +22,25 @@ #include "Lib/Fast3D/gfx_direct3d12.h" #include "Lib/Fast3D/gfx_wiiu.h" #include "Lib/Fast3D/gfx_gx2.h" +#include "Lib/Fast3D/gfx_rendering_api.h" #include "Lib/Fast3D/gfx_window_manager_api.h" -#include +#include +#include "ImGuiImpl.h" +#include "spdlog/async.h" +#include "spdlog/sinks/rotating_file_sink.h" +#include "spdlog/sinks/stdout_color_sinks.h" +#include "spdlog/sinks/sohconsole_sink.h" +#include "PR/ultra64/gbi.h" +#ifdef __APPLE__ +#include "OSXFolderManager.h" +#elif defined(__SWITCH__) +#include "SwitchImpl.h" +#elif defined(__WIIU__) +#include "WiiUImpl.h" +#endif -#include -#define LOAD_TEX(texPath) static_cast(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(texPath).get()); +#define LOAD_TEX(texPath) static_cast(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(texPath).get()); extern "C" { struct OSMesgQueue; @@ -59,7 +67,7 @@ extern "C" { #endif #endif - Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->Init(controllerBits); + Ship::Window::GetInstance()->GetControlDeck()->Init(controllerBits); return 0; } @@ -80,20 +88,20 @@ extern "C" { if (SohImGui::controller->Opened) return; - Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->WriteToPad(pad); + Ship::Window::GetInstance()->GetControlDeck()->WriteToPad(pad); Ship::ExecuteHooks(pad); } const char* ResourceMgr_GetNameByCRC(uint64_t crc) { - const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); + const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc); return hashStr != nullptr ? hashStr->c_str() : nullptr; } Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc) { - const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); + const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc); if (hashStr != nullptr) { - auto res = std::static_pointer_cast(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); + auto res = std::static_pointer_cast(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); return (Vtx*)res->vertices.data(); } @@ -101,10 +109,10 @@ extern "C" { } int32_t* ResourceMgr_LoadMtxByCRC(uint64_t crc) { - const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); + const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc); if (hashStr != nullptr) { - auto res = std::static_pointer_cast(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); + auto res = std::static_pointer_cast(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); return (int32_t*)res->mtx.data(); } @@ -112,10 +120,10 @@ extern "C" { } Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc) { - const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); + const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc); if (hashStr != nullptr) { - auto res = std::static_pointer_cast(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); + auto res = std::static_pointer_cast(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); return (Gfx*)&res->instructions[0]; } else { return nullptr; @@ -123,7 +131,7 @@ extern "C" { } char* ResourceMgr_LoadTexByCRC(uint64_t crc) { - const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); + const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc); if (hashStr != nullptr) { const auto res = LOAD_TEX(hashStr->c_str()); @@ -137,11 +145,11 @@ extern "C" { void ResourceMgr_RegisterResourcePatch(uint64_t hash, uint32_t instrIndex, uintptr_t origData) { - const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(hash); + const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(hash); if (hashStr != nullptr) { - auto res = (Ship::Texture*)Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str()).get(); + auto res = (Ship::Texture*)Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str()).get(); Ship::Patch patch; patch.crc = hash; @@ -201,7 +209,7 @@ extern "C" { } char* ResourceMgr_LoadBlobByName(char* blobPath) { - auto res = (Ship::Blob*)Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(blobPath).get(); + auto res = (Ship::Blob*)Ship::Window::GetInstance()->GetResourceManager()->LoadResource(blobPath).get(); return (char*)res->data.data(); } @@ -217,7 +225,26 @@ extern "C" { namespace Ship { - Window::Window(std::shared_ptr Context) : Context(Context), APlayer(nullptr), ControllerApi(nullptr) { + std::weak_ptr Window::Context; + + std::shared_ptr Window::GetInstance() { + return Context.lock(); + } + + std::shared_ptr Window::CreateInstance(const std::string Name) { + if (Context.expired()) { + auto Shared = std::make_shared(Name); + Context = Shared; + Shared->Initialize(); + return Shared; + } + + SPDLOG_DEBUG("Trying to create a context when it already exists. Returning existing."); + + return GetInstance(); + } + + Window::Window(std::string Name) : Name(std::move(Name)), APlayer(nullptr), ControllerApi(nullptr), ResMan(nullptr), Logger(nullptr), Config(nullptr) { WmApi = nullptr; RenderingApi = nullptr; bIsFullscreen = false; @@ -226,77 +253,85 @@ namespace Ship { } Window::~Window() { - SPDLOG_INFO("destruct window"); + SPDLOG_DEBUG("destruct window"); } void Window::CreateDefaults() { - const std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); - if (pConf->isNewInstance) { - pConf->setInt("Window.Width", 640); - pConf->setInt("Window.Height", 480); - pConf->setBool("Window.Options", false); - pConf->setString("Window.GfxBackend", ""); + if (GetConfig()->isNewInstance) { + GetConfig()->setInt("Window.Width", 640); + GetConfig()->setInt("Window.Height", 480); + GetConfig()->setBool("Window.Options", false); + GetConfig()->setString("Window.GfxBackend", ""); - pConf->setBool("Window.Fullscreen.Enabled", false); - pConf->setInt("Window.Fullscreen.Width", 1920); - pConf->setInt("Window.Fullscreen.Height", 1080); + GetConfig()->setBool("Window.Fullscreen.Enabled", false); + GetConfig()->setInt("Window.Fullscreen.Width", 1920); + GetConfig()->setInt("Window.Fullscreen.Height", 1080); - pConf->setString("Game.SaveName", ""); - pConf->setString("Game.Main Archive", ""); - pConf->setString("Game.Patches Archive", ""); + GetConfig()->setString("Game.SaveName", ""); + GetConfig()->setString("Game.Main Archive", ""); + GetConfig()->setString("Game.Patches Archive", ""); - pConf->setInt("Shortcuts.Fullscreen", 0x044); - pConf->setInt("Shortcuts.Console", 0x029); - pConf->save(); + GetConfig()->setInt("Shortcuts.Fullscreen", 0x044); + GetConfig()->setInt("Shortcuts.Console", 0x029); + GetConfig()->save(); } } - void Window::Init() { - std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); - + void Window::Initialize() { + InitializeLogging(); + InitializeConfiguration(); + InitializeResourceManager(); CreateDefaults(); InitializeAudioPlayer(); InitializeControlDeck(); - bIsFullscreen = pConf->getBool("Window.Fullscreen.Enabled", false); + bIsFullscreen = GetConfig()->getBool("Window.Fullscreen.Enabled", false); if (bIsFullscreen) { - dwWidth = pConf->getInt("Window.Fullscreen.Width", 1920); - dwHeight = pConf->getInt("Window.Fullscreen.Height", 1080); + dwWidth = GetConfig()->getInt("Window.Fullscreen.Width", 1920); + dwHeight = GetConfig()->getInt("Window.Fullscreen.Height", 1080); } else { - dwWidth = pConf->getInt("Window.Width", 640); - dwHeight = pConf->getInt("Window.Height", 480); + dwWidth = GetConfig()->getInt("Window.Width", 640); + dwHeight = GetConfig()->getInt("Window.Height", 480); } - dwMenubar = pConf->getBool("Window.Options", false); - gfxBackend = pConf->getString("Window.GfxBackend"); + dwMenubar = GetConfig()->getBool("Window.Options", false); + const std::string& gfx_backend = GetConfig()->getString("Window.GfxBackend"); InitializeWindowManager(); - gfx_init(WmApi, RenderingApi, GetContext()->GetName().c_str(), bIsFullscreen, dwWidth, dwHeight); + gfx_init(WmApi, RenderingApi, GetName().c_str(), bIsFullscreen, dwWidth, dwHeight); WmApi->set_fullscreen_changed_callback(OnFullscreenChanged); WmApi->set_keyboard_callbacks(KeyDown, KeyUp, AllKeysUp); - Ship::RegisterHook([this]() { + Ship::RegisterHook([this]() { ControllerApi->SaveControllerSettings(); }); } + std::string Window::GetAppDirectoryPath() { +#ifdef __APPLE__ + FolderManager folderManager; + std::string fpath = std::string(folderManager.pathForDirectory(NSApplicationSupportDirectory, NSUserDomainMask)); + fpath.append("/com.shipofharkinian.soh"); + return fpath; +#endif + + return "."; + } + + std::string Window::GetPathRelativeToAppDirectory(const char* path) { + return GetAppDirectoryPath() + "/" + path; + } + void Window::StartFrame() { gfx_start_frame(); } - void Window::RunCommands(Gfx* Commands, const std::vector>& mtx_replacements) { - for (const auto& m : mtx_replacements) { - gfx_run(Commands, m); - gfx_end_frame(); - } - } - - void Window::SetTargetFps(int fps) { + void Window::SetTargetFps(int32_t fps) { gfx_set_target_fps(fps); } - void Window::SetMaximumFrameLatency(int latency) { + void Window::SetMaximumFrameLatency(int32_t latency) { gfx_set_maximum_frame_latency(latency); } @@ -329,17 +364,17 @@ namespace Ship { void Window::MainLoop(void (*MainFunction)(void)) { WmApi->main_loop(MainFunction); } - bool Window::KeyUp(int32_t dwScancode) { - std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); - if (dwScancode == pConf->getInt("Shortcuts.Fullscreen", 0x044)) { - GlobalCtx2::GetInstance()->GetWindow()->ToggleFullscreen(); + bool Window::KeyUp(int32_t dwScancode) { + if (dwScancode == GetInstance()->GetConfig()->getInt("Shortcuts.Fullscreen", 0x044)) { + GetInstance()->ToggleFullscreen(); } - GlobalCtx2::GetInstance()->GetWindow()->SetLastScancode(-1); + GetInstance()->SetLastScancode(-1); + bool bIsProcessed = false; - auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto controlDeck = GetInstance()->GetControlDeck(); const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); if (pad != nullptr) { if (pad->ReleaseButton(dwScancode)) { @@ -352,7 +387,7 @@ namespace Ship { bool Window::KeyDown(int32_t dwScancode) { bool bIsProcessed = false; - auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto controlDeck = GetInstance()->GetControlDeck(); const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); if (pad != nullptr) { if (pad->PressButton(dwScancode)) { @@ -360,14 +395,14 @@ namespace Ship { } } - GlobalCtx2::GetInstance()->GetWindow()->SetLastScancode(dwScancode); + GetInstance()->SetLastScancode(dwScancode); return bIsProcessed; } void Window::AllKeysUp(void) { - auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto controlDeck = Window::GetInstance()->GetControlDeck(); const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); if (pad != nullptr) { pad->ReleaseAllButtons(); @@ -375,15 +410,13 @@ namespace Ship { } void Window::OnFullscreenChanged(bool bIsFullscreen) { - std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); + std::shared_ptr pConf = Window::GetInstance()->GetConfig(); - GlobalCtx2::GetInstance()->GetWindow()->bIsFullscreen = bIsFullscreen; + Window::GetInstance()->bIsFullscreen = bIsFullscreen; pConf->setBool("Window.Fullscreen.Enabled", bIsFullscreen); - GlobalCtx2::GetInstance()->GetWindow()->ShowCursor(!bIsFullscreen); + Window::GetInstance()->ShowCursor(!bIsFullscreen); } - - uint32_t Window::GetCurrentWidth() { WmApi->get_dimensions(&dwWidth, &dwHeight); return dwWidth; @@ -453,4 +486,93 @@ namespace Ship { void Window::InitializeControlDeck() { ControllerApi = std::make_shared(); } + + void Window::InitializeLogging() { + try { + // Setup Logging + spdlog::init_thread_pool(8192, 1); + std::vector Sinks; + + auto SohConsoleSink = std::make_shared(); + SohConsoleSink->set_level(spdlog::level::trace); + Sinks.push_back(SohConsoleSink); + +#if (!defined(_WIN32) && !defined(__WIIU__)) || defined(_DEBUG) + auto ConsoleSink = std::make_shared(); + ConsoleSink->set_level(spdlog::level::trace); + Sinks.push_back(ConsoleSink); +#endif + +#ifndef __WIIU__ + auto logPath = GetPathRelativeToAppDirectory(("logs/" + GetName() + ".log").c_str()); + auto FileSink = std::make_shared(logPath, 1024 * 1024 * 10, 10); + FileSink->set_level(spdlog::level::trace); + Sinks.push_back(FileSink); +#endif + + Logger = std::make_shared(GetName(), Sinks.begin(), Sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block); + GetLogger()->set_level(spdlog::level::trace); + +#ifndef __WIIU__ + GetLogger()->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%@] [%l] %v"); +#else + GetLogger()->set_pattern("[%s:%#] [%l] %v"); +#endif + + spdlog::register_logger(GetLogger()); + spdlog::set_default_logger(GetLogger()); + } + catch (const spdlog::spdlog_ex& ex) { + std::cout << "Log initialization failed: " << ex.what() << std::endl; + } + } + + void Window::InitializeResourceManager() { + MainPath = Config->getString("Game.Main Archive", GetPathRelativeToAppDirectory("oot.otr")); + PatchesPath = Config->getString("Game.Patches Archive", GetAppDirectoryPath() + "/mods"); + ResMan = std::make_shared(GetInstance(), MainPath, PatchesPath); + + if (!ResMan->DidLoadSuccessfully()) + { +#ifdef _WIN32 + MessageBox(nullptr, L"Main OTR file not found!", L"Uh oh", MB_OK); +#elif defined(__SWITCH__) + printf("Main OTR file not found!\n"); +#elif defined(__WIIU__) + Ship::WiiU::ThrowMissingOTR(MainPath.c_str()); +#else + SPDLOG_ERROR("Main OTR file not found!"); +#endif + exit(1); + } +#ifdef __SWITCH__ + Ship::Switch::Init(PostInitPhase); +#endif + } + + void Window::InitializeConfiguration() { + Config = std::make_shared(GetPathRelativeToAppDirectory("shipofharkinian.json")); + } + + void Window::WriteSaveFile(const std::filesystem::path& savePath, const uintptr_t addr, void* dramAddr, const size_t size) { + std::ofstream saveFile = std::ofstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary); + saveFile.seekp(addr); + saveFile.write((char*)dramAddr, size); + saveFile.close(); + } + + void Window::ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size) { + std::ifstream saveFile = std::ifstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary); + + // If the file doesn't exist, initialize DRAM + if (saveFile.good()) { + saveFile.seekg(addr); + saveFile.read((char*)dramAddr, size); + } + else { + memset(dramAddr, 0, size); + } + + saveFile.close(); + } } diff --git a/libultraship/libultraship/Window.h b/libultraship/libultraship/Window.h index 54488f4c9..6a0e68899 100644 --- a/libultraship/libultraship/Window.h +++ b/libultraship/libultraship/Window.h @@ -1,27 +1,36 @@ #pragma once -#include -#include "PR/ultra64/gbi.h" -#include "Lib/Fast3D/gfx_pc.h" -#include "Controller.h" -#include "GlobalCtx2.h" -#include "ControlDeck.h" +#include +#include +#include "spdlog/spdlog.h" +#include "ControlDeck.h" +#include "AudioPlayer.h" #include "Lib/Fast3D/gfx_window_manager_api.h" +#include "Lib/Mercury/Mercury.h" + +struct GfxRenderingAPI; +struct GfxWindowManagerAPI; namespace Ship { - class AudioPlayer; + class ResourceMgr; class Window { public: - Window(std::shared_ptr Context); + static std::shared_ptr GetInstance(); + static std::shared_ptr CreateInstance(const std::string Name); + static std::string GetAppDirectoryPath(); + static std::string GetPathRelativeToAppDirectory(const char* path); + + Window(std::string Name); ~Window(); + void WriteSaveFile(const std::filesystem::path& savePath, uintptr_t addr, void* dramAddr, size_t size); + void ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size); void CreateDefaults(); void MainLoop(void (*MainFunction)(void)); - void Init(); + void Initialize(); void StartFrame(); - void RunCommands(Gfx* Commands, const std::vector>& mtx_replacements); - void SetTargetFps(int fps); - void SetMaximumFrameLatency(int latency); + void SetTargetFps(int32_t fps); + void SetMaximumFrameLatency(int32_t latency); void GetPixelDepthPrepare(float x, float y); uint16_t GetPixelDepth(float x, float y); void ToggleFullscreen(); @@ -32,29 +41,39 @@ namespace Ship { uint32_t GetCurrentHeight(); uint32_t GetMenuBar() { return dwMenubar; } void SetMenuBar(uint32_t dwMenuBar) { this->dwMenubar = dwMenuBar; } + std::string GetName() { return Name; } std::shared_ptr GetControlDeck() { return ControllerApi; }; - std::shared_ptr GetContext() { return Context.lock(); } std::shared_ptr GetAudioPlayer() { return APlayer; } - const char* GetKeyName(int scancode) { return WmApi->get_key_name(scancode); } - int32_t GetLastScancode() { return lastScancode; }; - void SetLastScancode(int32_t scanCode) { lastScancode = scanCode; }; + std::shared_ptr GetResourceManager() { return ResMan; } + std::shared_ptr GetConfig() { return Config; } + std::shared_ptr GetLogger() { return Logger; } + const char* GetKeyName(int32_t scancode) { return WmApi->get_key_name(scancode); } + int32_t GetLastScancode() { return lastScancode; } + void SetLastScancode(int32_t scanCode) { lastScancode = scanCode; } protected: + Window() = default; private: static bool KeyDown(int32_t dwScancode); static bool KeyUp(int32_t dwScancode); static void AllKeysUp(void); static void OnFullscreenChanged(bool bIsNowFullscreen); + static std::weak_ptr Context; + void InitializeConfiguration(); void InitializeControlDeck(); void InitializeAudioPlayer(); + void InitializeLogging(); + void InitializeResourceManager(); void InitializeWindowManager(); - std::weak_ptr Context; + std::shared_ptr Logger; + std::shared_ptr Config; // Config needs to be after the Window because we call the Window during it's destructor. + std::shared_ptr ResMan; std::shared_ptr APlayer; std::shared_ptr ControllerApi; - std::string gfxBackend; + std::string gfxBackend; GfxRenderingAPI* RenderingApi; GfxWindowManagerAPI* WmApi; bool bIsFullscreen; @@ -62,5 +81,8 @@ namespace Ship { uint32_t dwHeight; uint32_t dwMenubar; int32_t lastScancode; + std::string Name; + std::string MainPath; + std::string PatchesPath; }; } diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 8e72392ca..7ffabf90d 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -1,7 +1,3 @@ -#ifdef _MSC_VER -#define NOGDI -#endif - #include "debugconsole.h" #include "../libultraship/ImGuiImpl.h" #include "savestates.h" diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index 5fb1b34c5..7d0fc8b14 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -6,9 +6,7 @@ #include "rando_main.hpp" // #include #include -#define NOGDI -#define WIN32_LEAN_AND_MEAN -#include +#include #include #define TICKS_PER_SEC 268123480.0 @@ -21,7 +19,7 @@ void RandoMain::GenerateRando(std::unordered_map cvarS // std::string settingsFileName = "./randomizer/latest_settings.json"; // CVar_SetString("gLoadedPreset", settingsFileName.c_str()); - std::string fileName = Ship::GlobalCtx2::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings).c_str()); + std::string fileName = Ship::Window::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings).c_str()); CVar_SetString("gSpoilerLog", fileName.c_str()); CVar_Save(); diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 8b829057f..c9af08082 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -26,9 +26,7 @@ #include #include -#define NOGDI -#define WIN32_LEAN_AND_MEAN -#include "GlobalCtx2.h" +#include "Window.h" using json = nlohmann::json; @@ -726,12 +724,12 @@ const char* SpoilerLog_Write(int language) { //WriteShuffledEntrances(spoilerLog); WriteAllLocations(language); - if (!std::filesystem::exists(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Randomizer"))) { - std::filesystem::create_directory(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Randomizer")); + if (!std::filesystem::exists(Ship::Window::GetPathRelativeToAppDirectory("Randomizer"))) { + std::filesystem::create_directory(Ship::Window::GetPathRelativeToAppDirectory("Randomizer")); } std::string jsonString = jsonData.dump(4); - std::ofstream jsonFile(Ship::GlobalCtx2::GetPathRelativeToAppDirectory( + std::ofstream jsonFile(Ship::Window::GetPathRelativeToAppDirectory( (std::string("Randomizer/") + std::string(Settings::seed) + std::string(".json")).c_str())); jsonFile << std::setw(4) << jsonString << std::endl; jsonFile.close(); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index db12b8e2c..e83695fc0 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -3,8 +3,8 @@ #include #include #include -#include -#include "GlobalCtx2.h" +#include + #include "ResourceMgr.h" #include "DisplayList.h" #include "PlayerAnimation.h" @@ -42,6 +42,9 @@ #include "Hooks.h" #include +#include "Lib/Fast3D/gfx_pc.h" +#include "Lib/Fast3D/gfx_rendering_api.h" + #ifdef __APPLE__ #include #else @@ -63,10 +66,9 @@ SaveManager* SaveManager::Instance; CustomMessageManager* CustomMessageManager::Instance; OTRGlobals::OTRGlobals() { - context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian"); + context = Ship::Window::CreateInstance("Ship of Harkinian"); gSaveStateMgr = std::make_shared(); gRandomizer = std::make_shared(); - context->GetWindow()->Init(); } OTRGlobals::~OTRGlobals() { @@ -237,14 +239,14 @@ extern "C" uint64_t GetPerfCounter() { // C->C++ Bridge extern "C" void Graph_ProcessFrame(void (*run_one_game_iter)(void)) { - OTRGlobals::Instance->context->GetWindow()->MainLoop(run_one_game_iter); + OTRGlobals::Instance->context->MainLoop(run_one_game_iter); } extern "C" void Graph_StartFrame() { #ifndef __WIIU__ // Why -1? - int32_t dwScancode = OTRGlobals::Instance->context->GetWindow()->GetLastScancode(); - OTRGlobals::Instance->context->GetWindow()->SetLastScancode(-1); + int32_t dwScancode = OTRGlobals::Instance->context->GetLastScancode(); + OTRGlobals::Instance->context->SetLastScancode(-1); switch (dwScancode - 1) { case SDL_SCANCODE_F5: { @@ -300,7 +302,14 @@ extern "C" void Graph_StartFrame() { } } #endif - OTRGlobals::Instance->context->GetWindow()->StartFrame(); + OTRGlobals::Instance->context->StartFrame(); +} + +void RunCommands(Gfx* Commands, const std::vector>& mtx_replacements) { + for (const auto& m : mtx_replacements) { + gfx_run(Commands, m); + gfx_end_frame(); + } } // C->C++ Bridge @@ -341,12 +350,12 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) { time -= fps; - OTRGlobals::Instance->context->GetWindow()->SetTargetFps(fps); + OTRGlobals::Instance->context->SetTargetFps(fps); int threshold = CVar_GetS32("gExtraLatencyThreshold", 80); - OTRGlobals::Instance->context->GetWindow()->SetMaximumFrameLatency(threshold > 0 && target_fps >= threshold ? 2 : 1); + OTRGlobals::Instance->context->SetMaximumFrameLatency(threshold > 0 && target_fps >= threshold ? 2 : 1); - OTRGlobals::Instance->context->GetWindow()->RunCommands(commands, mtx_replacements); + RunCommands(commands, mtx_replacements); last_fps = fps; last_update_rate = R_UPDATE_RATE; @@ -359,19 +368,19 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) { } // OTRTODO: FIGURE OUT END FRAME POINT - /* if (OTRGlobals::Instance->context->GetWindow()->lastScancode != -1) - OTRGlobals::Instance->context->GetWindow()->lastScancode = -1;*/ + /* if (OTRGlobals::Instance->context->lastScancode != -1) + OTRGlobals::Instance->context->lastScancode = -1;*/ } float divisor_num = 0.0f; extern "C" void OTRGetPixelDepthPrepare(float x, float y) { - OTRGlobals::Instance->context->GetWindow()->GetPixelDepthPrepare(x, y); + OTRGlobals::Instance->context->GetPixelDepthPrepare(x, y); } extern "C" uint16_t OTRGetPixelDepth(float x, float y) { - return OTRGlobals::Instance->context->GetWindow()->GetPixelDepth(x, y); + return OTRGlobals::Instance->context->GetPixelDepth(x, y); } extern "C" uint32_t ResourceMgr_GetGameVersion() @@ -1183,7 +1192,7 @@ extern "C" s32* ResourceMgr_LoadCSByName(const char* path) } std::filesystem::path GetSaveFile(std::shared_ptr Conf) { - const std::string fileName = Conf->getString("Game.SaveName", Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav")); + const std::string fileName = Conf->getString("Game.SaveName", Ship::Window::GetPathRelativeToAppDirectory("oot_save.sav")); std::filesystem::path saveFile = std::filesystem::absolute(fileName); if (!exists(saveFile.parent_path())) { @@ -1314,15 +1323,15 @@ extern "C" void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(vo } extern "C" uint32_t OTRGetCurrentWidth() { - return OTRGlobals::Instance->context->GetWindow()->GetCurrentWidth(); + return OTRGlobals::Instance->context->GetCurrentWidth(); } extern "C" uint32_t OTRGetCurrentHeight() { - return OTRGlobals::Instance->context->GetWindow()->GetCurrentHeight(); + return OTRGlobals::Instance->context->GetCurrentHeight(); } extern "C" void OTRControllerCallback(ControllerCallback* controller) { - auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto controlDeck = Ship::Window::GetInstance()->GetControlDeck(); for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i); @@ -1354,33 +1363,33 @@ extern "C" int16_t OTRGetRectDimensionFromRightEdge(float v) { } extern "C" bool AudioPlayer_Init(void) { - if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { - return OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Init(); + if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) { + return OTRGlobals::Instance->context->GetAudioPlayer()->Init(); } return false; } extern "C" int AudioPlayer_Buffered(void) { - if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { - return OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Buffered(); + if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) { + return OTRGlobals::Instance->context->GetAudioPlayer()->Buffered(); } } extern "C" int AudioPlayer_GetDesiredBuffered(void) { - if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { - return OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->GetDesiredBuffered(); + if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) { + return OTRGlobals::Instance->context->GetAudioPlayer()->GetDesiredBuffered(); } } extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) { - if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { - OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Play(buf, len); + if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) { + OTRGlobals::Instance->context->GetAudioPlayer()->Play(buf, len); } } extern "C" int Controller_ShouldRumble(size_t i) { - auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto controlDeck = Ship::Window::GetInstance()->GetControlDeck(); for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i); diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index ae8f799b9..53f64ff12 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -3,10 +3,10 @@ #pragma once -#include "GlobalCtx2.h" #include "SaveManager.h" #ifdef __cplusplus +#include "Window.h" #include "Enhancements/savestates.h" #include "Enhancements/randomizer/randomizer.h" @@ -17,7 +17,7 @@ class OTRGlobals public: static OTRGlobals* Instance; - std::shared_ptr context; + std::shared_ptr context; std::shared_ptr gSaveStateMgr; std::shared_ptr gRandomizer; diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 9b7f5126a..9bf99ac12 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -16,7 +16,7 @@ extern "C" SaveContext gSaveContext; std::filesystem::path SaveManager::GetFileName(int fileNum) { - const std::filesystem::path sSavePath(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Save")); + const std::filesystem::path sSavePath(Ship::Window::GetPathRelativeToAppDirectory("Save")); return sSavePath / ("file" + std::to_string(fileNum + 1) + ".sav"); } @@ -133,10 +133,10 @@ void SaveManager::SaveRandomizer() { } void SaveManager::Init() { - const std::filesystem::path sSavePath(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Save")); + const std::filesystem::path sSavePath(Ship::Window::GetPathRelativeToAppDirectory("Save")); const std::filesystem::path sGlobalPath = sSavePath / std::string("global.sav"); - auto sOldSavePath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav"); - auto sOldBackupSavePath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.bak"); + auto sOldSavePath = Ship::Window::GetPathRelativeToAppDirectory("oot_save.sav"); + auto sOldBackupSavePath = Ship::Window::GetPathRelativeToAppDirectory("oot_save.bak"); // If the save directory does not exist, create it if (!std::filesystem::exists(sSavePath)) { diff --git a/soh/soh/z_play_otr.cpp b/soh/soh/z_play_otr.cpp index 9921d3050..1a07ceb7e 100644 --- a/soh/soh/z_play_otr.cpp +++ b/soh/soh/z_play_otr.cpp @@ -68,7 +68,7 @@ void OTRGameplay_InitScene(GlobalContext* globalCtx, s32 spawn) { gSaveContext.worldMapArea = 0; OTRScene_ExecuteCommands(globalCtx, globalCtx->sceneSegment); Gameplay_InitEnvironment(globalCtx, globalCtx->skyboxId); - /* auto data = static_cast(Ship::GlobalCtx2::GetInstance() + /* auto data = static_cast(Ship::Window::GetInstance() ->GetResourceManager() ->LoadResource("object_link_child\\object_link_childVtx_01FE08") .get()); From de9465c22a9040b2b203361db1c36d4261411787 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 21 Aug 2022 21:48:01 -0400 Subject: [PATCH 153/212] Fixes goofup of ImGui window from bad merge conflict resolution. --- .../Enhancements/randomizer/randomizer.cpp | 1880 +++++++---------- 1 file changed, 778 insertions(+), 1102 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 63d7a380a..f4d5eae52 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2629,9 +2629,9 @@ void DrawRandoEditor(bool& open) { return; } -// Randomizer settings + // Randomizer settings // Logic Settings - const char* randoLogicRules[2] = { "Glitchless", "No logic"}; + const char* randoLogicRules[2] = { "Glitchless", "No logic" }; // Open Settings const char* randoForest[3] = { "Closed", "Closed Deku", "Open" }; @@ -2639,7 +2639,8 @@ void DrawRandoEditor(bool& open) { const char* randoDoorOfTime[3] = { "Closed", "Song only", "Open" }; const char* randoZorasFountain[3] = { "Closed", "Closed as child", "Open" }; const char* randoGerudoFortress[3] = { "Normal", "Fast", "Open" }; - const char* randoRainbowBridge[7] = { "Vanilla", "Always open", "Stones", "Medallions", "Dungeon rewards", "Dungeons", "Tokens" }; + const char* randoRainbowBridge[7] = { "Vanilla", "Always open", "Stones", "Medallions", + "Dungeon rewards", "Dungeons", "Tokens" }; const char* randoGanonsTrial[2] = { "Off", "On" }; // World Settings @@ -2672,19 +2673,23 @@ void DrawRandoEditor(bool& open) { const char* randoShuffleAdultTrade[2] = { "Off", "On" }; // Shuffle Dungeon Items Settings - const char* randoShuffleMapsAndCompasses[6] = { "Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere" }; - const char* randoShuffleSmallKeys[6] = { "Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere" }; + const char* randoShuffleMapsAndCompasses[6] = { "Start With", "Vanilla", "Own Dungeon", + "Any Dungeon", "Overworld", "Anywhere" }; + const char* randoShuffleSmallKeys[6] = { "Start With", "Vanilla", "Own Dungeon", + "Any Dungeon", "Overworld", "Anywhere" }; const char* randoShuffleGerudoFortressKeys[4] = { "Vanilla", "Any Dungeon", "Overworld", "Anywhere" }; - const char* randoShuffleBossKeys[6] = { "Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere" }; - const char* randoShuffleGanonsBossKey[6] = { "Vanilla", "Own dungeon", "Start with", "Any Dungeon", "Overworld", "Anywhere" }; + const char* randoShuffleBossKeys[6] = { "Start With", "Vanilla", "Own Dungeon", + "Any Dungeon", "Overworld", "Anywhere" }; + const char* randoShuffleGanonsBossKey[6] = { "Vanilla", "Own dungeon", "Start with", + "Any Dungeon", "Overworld", "Anywhere" }; // Timesaver Settings const char* randoSkipSongReplays[3] = { "Don't skip", "Skip (no SFX)", "Skip (Keep SFX)" }; // Misc Settings - const char* randoGossipStoneHints[4] = {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}; + const char* randoGossipStoneHints[4] = { "No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony" }; const char* randoHintClarity[3] = { "Obscure", "Ambiguous", "Clear" }; - const char* randoHintDistribution[4] = {"Useless", "Balanced", "Strong", "Very Strong"}; + const char* randoHintDistribution[4] = { "Useless", "Balanced", "Strong", "Very Strong" }; const char* randoDamageMultiplier[7] = { "x1", "x2", "x4", "x8", "x16", "OHKO", "x1/2" }; const char* randoStartingTime[2] = { "Day", "Night" }; const char* randoChestAnimations[2] = { "Always Fast", "Match contents" }; @@ -2694,7 +2699,7 @@ void DrawRandoEditor(bool& open) { // Item Pool Settings const char* randoItemPool[4] = { "Plentiful", "Balanced", "Scarce", "Minimal" }; - const char* randoIceTraps[5] = {"Off", "Normal", "Extra", "Mayhem", "Onslaught"}; + const char* randoIceTraps[5] = { "Off", "Normal", "Extra", "Mayhem", "Onslaught" }; // SFX Settings const char* randoSFXBackgroundMusic[3] = { "Normal", "No Music", "Random" }; @@ -2841,767 +2846,276 @@ void DrawRandoEditor(bool& open) { "Timer", "Zelda Gasp (Adult)" }; - ImGui::SetNextWindowSize(ImVec2(830, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Randomizer Editor", &open, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } + ImGui::SetNextWindowSize(ImVec2(830, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Randomizer Editor", &open, ImGuiWindowFlags_NoFocusOnAppearing)) { + ImGui::End(); + return; + } - bool disableEditingRandoSettings = CVar_GetS32("gRandoGenerating", 0) || CVar_GetS32("gOnFileSelectNameEntry", 0); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, disableEditingRandoSettings); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, - ImGui::GetStyle().Alpha * (disableEditingRandoSettings ? 0.5f : 1.0f)); - SohImGui::EnhancementCheckbox("Enable Randomizer", "gRandomizer"); + bool disableEditingRandoSettings = CVar_GetS32("gRandoGenerating", 0) || CVar_GetS32("gOnFileSelectNameEntry", 0); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, disableEditingRandoSettings); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * (disableEditingRandoSettings ? 0.5f : 1.0f)); + SohImGui::EnhancementCheckbox("Enable Randomizer", "gRandomizer"); - if (CVar_GetS32("gRandomizer", 0) == 1) { - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - if (ImGui::Button("Generate Seed")) { - if (CVar_GetS32("gRandoGenerating", 0) == 0) { - randoThread = std::thread(&GenerateRandomizerImgui); - } + if (CVar_GetS32("gRandomizer", 0) == 1) { + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + if (ImGui::Button("Generate Seed")) { + if (CVar_GetS32("gRandoGenerating", 0) == 0) { + randoThread = std::thread(&GenerateRandomizerImgui); } - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - std::string spoilerfilepath = CVar_GetString("gSpoilerLog", ""); - ImGui::Text("Spoiler File: %s", spoilerfilepath.c_str()); - - // RANDOTODO settings presets - // std::string presetfilepath = CVar_GetString("gLoadedPreset", ""); - // ImGui::Text("Settings File: %s", presetfilepath.c_str()); } - PaddedSeparator(); + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + std::string spoilerfilepath = CVar_GetString("gSpoilerLog", ""); + ImGui::Text("Spoiler File: %s", spoilerfilepath.c_str()); - ImGuiWindow* window = ImGui::GetCurrentWindow(); - static ImVec2 cellPadding(8.0f, 8.0f); + // RANDOTODO settings presets + // std::string presetfilepath = CVar_GetString("gLoadedPreset", ""); + // ImGui::Text("Settings File: %s", presetfilepath.c_str()); + } + PaddedSeparator(); - if (CVar_GetS32("gRandomizer", 0) == 1 && ImGui::BeginTabBar("Randomizer Settings", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { - if (ImGui::BeginTabItem("Main Rules")) { - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - if (ImGui::BeginTable("tableRandoMainRules", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Open Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Shuffle Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Shuffle Dungeon Items", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::TableHeadersRow(); - ImGui::PopItemFlag(); - ImGui::TableNextRow(); + ImGuiWindow* window = ImGui::GetCurrentWindow(); + static ImVec2 cellPadding(8.0f, 8.0f); - // COLUMN 1 - OPEN SETTINGS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::PushItemWidth(-FLT_MIN); + if (CVar_GetS32("gRandomizer", 0) == 1 && + ImGui::BeginTabBar("Randomizer Settings", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { + if (ImGui::BeginTabItem("Main Rules")) { + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + if (ImGui::BeginTable("tableRandoMainRules", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("Open Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Shuffle Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Shuffle Dungeon Items", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::TableHeadersRow(); + ImGui::PopItemFlag(); + ImGui::TableNextRow(); - if (CVar_GetS32("gRandomizeAllOpenSettings", 0) != 1) { - // Forest - ImGui::Text(Settings::OpenForest.GetName().c_str()); - InsertHelpHoverText( - "Closed - Kokiri sword & shield are required to access " - "the Deku Tree, and completing the Deku Tree is required to " - "access the Hyrule Field exit.\n" - "\n" - "Closed Deku - Kokiri boy no longer blocks the path to Hyrule " - "Field but Mido still requires the Kokiri sword and Deku shield " - "to access the tree.\n" - "\n" - "Open - Mido no longer blocks the path to the Deku Tree. Kokiri " - "boy no longer blocks the path out of the forest."); - SohImGui::EnhancementCombobox("gRandomizeForest", randoForest, 3, 0); - PaddedSeparator(); - // Kakariko Gate - ImGui::Text(Settings::OpenKakariko.GetName().c_str()); - InsertHelpHoverText( - "Closed - The gate will remain closed until Zelda's letter " - "is shown to the guard.\n" - "\n" - "Open - The gate is always open. The happy mask shop " - "will open immediately after obtaining Zelda's letter." - ); - SohImGui::EnhancementCombobox("gRandomizeKakarikoGate", randoKakarikoGate, 2, 0); - PaddedSeparator(); + // COLUMN 1 - OPEN SETTINGS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::PushItemWidth(-FLT_MIN); - // Door of Time - ImGui::Text(Settings::OpenDoorOfTime.GetName().c_str()); - InsertHelpHoverText( - "Closed - The Ocarina of Time, the Song of Time and all " - "three spiritual stones are required to open the Door of Time.\n" - "\n" - "Song only - Play the Song of Time in front of the Door of " - "Time to open it.\n" - "\n" - "Open - The Door of Time is permanently open with no requirements." - ); - SohImGui::EnhancementCombobox("gRandomizeDoorOfTime", randoDoorOfTime, 3, 0); - PaddedSeparator(); - - // Zora's Fountain - ImGui::Text(Settings::ZorasFountain.GetName().c_str()); - InsertHelpHoverText( - "Closed - King Zora obstructs the way to Zora's Fountain. " - "Ruto's letter must be shown as child Link in order to move " - "him in both time periods.\n" - "\n" - "Closed as child - Ruto's Letter is only required to move King Zora " - "as child Link. Zora's Fountain starts open as adult.\n" - "\n" - "Open - King Zora has already mweeped out of the way in both " - "time periods. Ruto's Letter is removed from the item pool." - ); - SohImGui::EnhancementCombobox("gRandomizeZorasFountain", randoZorasFountain, 3, 0); - PaddedSeparator(); - - // Gerudo Fortress - ImGui::Text(Settings::GerudoFortress.GetName().c_str()); - InsertHelpHoverText( - "Sets the amount of carpenters required to repair the bridge " - "in Gerudo Valley.\n" - "\n" - "Normal - All 4 carpenters are required to be saved.\n" - "\n" - "Fast - Only the bottom left carpenter requires rescuing.\n" - "\n" - "Open - The bridge is repaired from the start." - ); - SohImGui::EnhancementCombobox("gRandomizeGerudoFortress", randoGerudoFortress, 3, 0); - PaddedSeparator(); - - // Rainbow Bridge - ImGui::Text(Settings::Bridge.GetName().c_str()); - InsertHelpHoverText( - "Alters the requirements to open the bridge to Ganon's Castle.\n" - "\n" - "Vanilla - Obtain the Shadow Medallion, Spirit Medallion and Light Arrows.\n" - "\n" - "Always open - No requirements.\n" - "\n" - "Stones - Obtain the specified amount of spiritual stones.\n" - "\n" - "Medallions - Obtain the specified amount of medallions.\n" - "\n" - "Dungeon rewards - Obtain the specified total sum of spiritual " - "stones or medallions.\n" - "\n" - "Dungeons - Complete the specified amount of dungeons. Dungeons " - "are considered complete after stepping in to the blue warp after " - "the boss.\n" - "\n" - "Tokens - Obtain the specified amount of Skulltula tokens." - ); - SohImGui::EnhancementCombobox("gRandomizeRainbowBridge", randoRainbowBridge, 7, 0); - ImGui::PopItemWidth(); - switch (CVar_GetS32("gRandomizeRainbowBridge", 0)) { - case 0: - break; - case 1: - break; - case 2: - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - SohImGui::EnhancementSliderInt("Stone Count: %d", "##RandoStoneCount", - "gRandomizeStoneCount", 1, 3, "", 3, true); - break; - case 3: - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - SohImGui::EnhancementSliderInt("Medallion Count: %d", "##RandoMedallionCount", - "gRandomizeMedallionCount", 1, 6, "", 6, true); - break; - case 4: - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - SohImGui::EnhancementSliderInt("Reward Count: %d", "##RandoRewardCount", - "gRandomizeRewardCount", 1, 9, "", 9, true); - break; - case 5: - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - SohImGui::EnhancementSliderInt("Dungeon Count: %d", "##RandoDungeonCount", - "gRandomizeDungeonCount", 1, 8, "", 8, true); - break; - case 6: - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - SohImGui::EnhancementSliderInt("Token Count: %d", "##RandoTokenCount", - "gRandomizeTokenCount", 1, 100, "", 100, true); - break; - } - PaddedSeparator(); - - // Random Ganon's Trials - /* - ImGui::Text("Random Ganon's Trials"); - InsertHelpHoverText("Sets a random number or required trials to enter\nGanon's Tower."); - SohImGui::EnhancementCombobox("gRandomizeGanonTrial", randoGanonsTrial, 2, 0); - if (CVar_GetS32("gRandomizeGanonTrial", 0) == 0) { - ImGui::PopItemWidth(); - SohImGui::EnhancementSliderInt("Ganon's Trial Count: %d", "##RandoTrialCount", - "gRandomizeGanonTrialCount", 0, 6, "", 6); - InsertHelpHoverText("Set the number of trials required to enter Ganon's Tower."); - RANDTODO: Switch back to slider when pre-completing some of Ganon's Trials is properly implemnted. - } - */ - SohImGui::EnhancementCheckbox("Skip Ganon's Trials", "gRandomizeGanonTrialCount"); - InsertHelpHoverText( - "Sets whether or not Ganon's Castle Trials are required to enter Ganon's Tower."); - } - ImGui::PopItemWidth(); - ImGui::TableNextColumn(); - - // COLUMN 2 - WORLD SETTINGS - // ImGui::NewLine(); - // SohImGui::EnhancementCheckbox("Randomize All World Settings", "gRandomizeAllWorldSettings"); - // InsertHelpHoverText("Randomize all World Settings"); - // ImGui::Separator(); - - // if (CVar_GetS32("gRandomizeAllWorldSettings", 0) != 1) { - // todo implement starting age - // Starting Age - // ImGui::Text("Starting Age"); - // InsertHelpHoverText( - // "Choose which age Link will start as.\nStarting as adult means you start with the " - // "Master Sword in your inventory.\nOnly the child option is compatible with " - // "Closed Forest."); - // SohImGui::EnhancementCombobox("gRandomizeStartingAge", randoStartingAge, 3, 0); - // ImGui::Separator(); - - // todo implement entrance shuffle - // Shuffle Entrances - // ImGui::Text("Shuffle Entrances"); - // InsertHelpHoverText("Shuffle where the entrances between areas lead to.\n" - // "If turned on, select which kinds of entrances you " - // "want shuffled in the options below.\n Note that some " - // "types of entrances can have widly varying generation times."); - // SohImGui::EnhancementCombobox("gRandomizeShuffleEntrances", randoShuffleEntrances, 2, 0); - // if (CVar_GetS32("gRandomizeShuffleEntrances", 0) == 1) { - // ImGui::Indent(); - // ImGui::Text("Shuffle Dungeons Entrances"); - // InsertHelpHoverText( - // "Shuffle the pool of dungeon entrances, including Bottom of the Well, Ice Cavern and " - // "Gerudo Training Grounds\nGanon's Castle is not shuffled.\nAdditionally, the entrance " - // "of Deku Tree, Fire Temple and Bottom of the Well are open for both adult and child."); - // SohImGui::EnhancementCombobox("gRandomizeShuffleDungeonsEntrances", - // randoShuffleDungeonsEntrances, 2, 0); - // ImGui::Text("Shuffle Overworld Entrances"); - // InsertHelpHoverText( - // "Shuffle the pool of Overworld entrances, which corresponds to almost all loading " - // "zones between Overworld areas.\nSome entrances are unshuffled to avoid issues:\n" - // "- Hyrule Castle Courtyard and Garden entrance\n" - // "- Both Market Back Alley entrances\n" - // "- Gerudo Valley to Lake Hylia (unless entrances are decoupled)"); - // SohImGui::EnhancementCombobox("gRandomizeShuffleOverworldEntrances", - // randoShuffleOverworldEntrances, 2, 0); - // ImGui::Text("Shuffle Interiors Entrances"); - // InsertHelpHoverText("Interior entrances will not be shuffled."); - // SohImGui::EnhancementCombobox("gRandomizeShuffleInteriorsEntrances", - // randoShuffleInteriorsEntrances, 2, 0); - // ImGui::Text("Shuffle Grottos Entrances"); - // InsertHelpHoverText( - // "Shuffle the pool of grotto entrances, including all graves, small Fairy " - // "fountains and the Lost Woods Stage."); - // SohImGui::EnhancementCombobox("gRandomizeShuffleGrottosEntrances", - // randoShuffleGrottosEntrances, 2, 0); - // ImGui::Unindent(); - // } - // ImGui::Separator(); - - // todo can't do this until bowling is unlocked by chus - // Bombchus in Logic - // ImGui::Text("Bombchus in Logic"); - // InsertHelpHoverText( - // "Bombchus are properly considered in logic.\nThey can be replenished in shops or " - // "through bombchu drops, if those are enabled.\nBombchu Bowling is opened by bombchus."); - // SohImGui::EnhancementCombobox("gRandomizeBombchusInLogic", randoBombchusInLogic, 3, 0); - // ImGui::Separator(); - - // todo implement chu drops - // Ammo Drops - // ImGui::Text("Ammo Drops"); - // switch (CVar_GetS32("gRandomizeAmmoDrops", 0)) { - // case 0: - // InsertHelpHoverText( - // "Bombs, arrows, seeds, nuts, sticks and magic jars appear as normal.\n" - // "Bombchus can sometimes replace bomb drops."); - // break; - // case 1: - // InsertHelpHoverText( - // "All ammo drops will be replaced by blue rupees, except for Deku Sticks.\n" - // "Ammo upgrades will only refill ammo by 10 units."); - // break; - // case 2: - // InsertHelpHoverText( - // "Bombs, arrow, seeds, nuts, sticks and magic jars appear as normal."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeAmmoDrops", randoAmmoDrops, 3, 0); - // ImGui::Separator(); - - // todo implement drop replacements - // Heart Drops and Refills - // ImGui::Text("Heart Drops and Refills"); - // switch (CVar_GetS32("gRandomizeHeartDropsAndRefills", 0)) { - // case 0: - // InsertHelpHoverText( - // "Heart drops will appear as normal.\nHealth upgrades fully heal Link when " - // "picked up.\nFairies heal Link as normal."); - // break; - // case 1: - // InsertHelpHoverText( - // "Heart drops will be replaced by green rupees.\nHealth upgrades fully heal " - // "Link when picked up.\nFairies heal Link as normal."); - // break; - // case 2: - // InsertHelpHoverText( - // "Heart drops will appear as normal.\nHealth upgrades don't heal Link when " - // "picked up.\nFairies heal Link by only 3 hearts."); - // break; - // case 3: - // InsertHelpHoverText( - // "Heart drops will be replaced by green rupees.\nHealth upgrades don't heal " - // "Link when picked up.\nFairies heal Link by only 3 hearts."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeHeartDropsAndRefills", randoHeartDropsAndRefills, 4, - // 0); - // ImGui::Separator(); - // } - // ImGui::TableNextColumn(); - - // COLUMN 3 - // Randomize Settings - //ImGui::NewLine(); - // SohImGui::EnhancementCheckbox("Randomize All Shuffle Settings", "gRandomizeAllShuffleSettings"); - // InsertHelpHoverText("Randomize all Shuffle Settings"); - // ImGui::Separator(); - ImGui::PushItemWidth(-FLT_MIN); - if (CVar_GetS32("gRandomizeAllShuffleSettings", 0) != 1) { - - // Shuffle Songs - ImGui::Text(Settings::ShuffleSongs.GetName().c_str()); - InsertHelpHoverText( - "Song locations - Songs will only appear at locations that normally teach songs.\n" - "\n" - "Dungeon rewards - Songs appear after beating a major dungeon boss.\n" - "The 4 remaining songs are located at:\n" - " - Zelda's lullaby location\n" - " - Ice Cavern's Serenade of Water location\n" - " - Bottom of the Well Lens of Truth location\n" - " - Gerudo Training Ground's Ice Arrows location\n" - "\n" - "Anywhere - Songs can appear at any location." - ); - - SohImGui::EnhancementCombobox("gRandomizeShuffleSongs", randoShuffleSongs, 3, 0); - PaddedSeparator(); - - // Shuffle Tokens - ImGui::Text(Settings::Tokensanity.GetName().c_str()); - InsertHelpHoverText( - "Shuffles Golden Skulltula Tokens into the item pool. This means " - "Golden Skulltulas can contain other items as well.\n" - "\n" - "Off - GS tokens will not be shuffled.\n" - "\n" - "Dungeons - Only shuffle GS tokens that are within dungeons.\n" - "\n" - "Overworld - Only shuffle GS tokens that are outside of dungeons.\n" - "\n" - "All Tokens - Shuffle all 100 GS tokens." - ); - SohImGui::EnhancementCombobox("gRandomizeShuffleTokens", randoShuffleTokens, 4, 0); - PaddedSeparator(); - - SohImGui::EnhancementCheckbox("Nighttime GS expect Sun's Song", "gRandomizeGsExpectSunsSong"); - InsertHelpHoverText("All Golden Skulltulas that require nighttime to appear will only be " - "expected to be collected after getting Sun's Song."); - PaddedSeparator(); - - // Shuffle Cows - SohImGui::EnhancementCheckbox(Settings::ShuffleCows.GetName().c_str(), "gRandomizeShuffleCows"); - InsertHelpHoverText("Cows give a randomized item from the pool upon performing Epona's Song in front of them."); - PaddedSeparator(); - - // Shuffle Adult Trade Quest - SohImGui::EnhancementCheckbox(Settings::ShuffleAdultTradeQuest.GetName().c_str(), "gRandomizeShuffleAdultTrade"); - InsertHelpHoverText( - "Adds all of the adult trade quest items into the pool, each of which " - "can be traded for a unique reward.\n" - "\n" - "You will be able to choose which of your owned adult trade items is visible " - "in the inventory by selecting the item with A and using the control stick or " - "D-pad.\n" - "\n" - "If disabled, only the Claim Check will be found in the pool." - ); - PaddedSeparator(); - - if(CVar_GetS32("gRandomizeStartingKokiriSword", 0) == 0) { - // Shuffle Kokiri Sword - SohImGui::EnhancementCheckbox(Settings::ShuffleKokiriSword.GetName().c_str(), "gRandomizeShuffleKokiriSword"); - InsertHelpHoverText( - "Shuffles the Kokiri Sword into the item pool.\n" - "\n" - "This will require the use of sticks until the Kokiri Sword is found." - ); - PaddedSeparator(); - } - - if(CVar_GetS32("gRandomizeStartingOcarina", 0) == 0) { - // Shuffle Ocarinas - SohImGui::EnhancementCheckbox(Settings::ShuffleOcarinas.GetName().c_str(), "gRandomizeShuffleOcarinas"); - InsertHelpHoverText( - "Enabling this shuffles the Fairy Ocarina and the Ocarina of Time into the item pool.\n" - "\n" - "This will require finding an Ocarina before being able to play songs." - ); - PaddedSeparator(); - } - - // hide this option if we're skipping child zelda - if(CVar_GetS32("gRandomizeSkipChildZelda", 0) == 0) { - // Shuffle Weird Egg - ImGui::Text("Shuffle Weird Egg"); - InsertHelpHoverText( - "Enabling this shuffles the Weird Egg from Malon into the item pool.\nThis " - "will require finding the Weird Egg to talk to Zelda in Hyrule Castle which " - "in turn unlocks rewards from Impa, Saria, Malon and Talon as well as the " - "Happy Mask Sidequest.\nThe Weird egg is also required for Zelda's Letter to " - "unlock the Kakariko Gate as child which can lock some progression."); - SohImGui::EnhancementCombobox("gRandomizeShuffleWeirdEgg", randoShuffleWeirdEgg, 2, 0); - ImGui::Separator(); - } - - // Shuffle Gerudo Membership Card - SohImGui::EnhancementCheckbox(Settings::ShuffleGerudoToken.GetName().c_str(), "gRandomizeShuffleGerudoToken"); - InsertHelpHoverText( - "Enabling this shuffles the Gerudo Membership Card into the item pool.\nThe Gerudo " - "Token is required to enter the Gerudo Training Ground."); - SohImGui::EnhancementCombobox("gRandomizeShuffleGerudoToken", randoShuffleGerudoToken, 2, 0); - ImGui::Separator(); - - // todo implement magic bean 10 pack - // // Shuffle Magic Beans - // ImGui::Text("Shuffle Magic Beans"); - // InsertHelpHoverText("Enabling this adds a pack of 10 beans to the item " - // "pool and changes the Magic Bean Salesman to sell a " - // "random item at a price of 60 rupees."); - // SohImGui::EnhancementCombobox("gRandomizeShuffleMagicBeans", randoShuffleMagicBeans, 2, 0); - // ImGui::Separator(); - - // todo implement shuffle merchants - // // Shuffle Merchants - // ImGui::Text("Shuffle Merchants"); - // if (CVar_GetS32("gRandomizeShuffleMerchants", 0) == 0) { - // InsertHelpHoverText( - // "Enabling this adds a Giant's Knife and a pack of Bombchus to the item " - // "pool and changes both Mediagoron and the Haunted Wasteland " - // "Carpet Salesman to sell a random item once at the price of 200 rupees."); - // } else if (CVar_GetS32("gRandomizeShuffleMerchants", 0) <= 2) { - // InsertHelpHoverText( - // "These hints will make Medigoron and the Carpet salesman tell you which item they're " - // "selling.\nThe Clearer Hints setting will affect how they refer to the item."); - // } - // SohImGui::EnhancementCombobox("gRandomizeShuffleMerchants", randoShuffleMerchants, 3, 0); - // ImGui::Separator(); - - // todo implement adult trade item selection - // Shuffle Adult Trade - // ImGui::Text("Shuffle Adult Trade"); - // InsertHelpHoverText( - // "Enabling this adds all of the adult trade quest items to the pool, each of which can be " - // "traded for a unique reward.\nYou will be able to choose which of your adult trade items " - // "are visible in the inventory by selecting the item and using the L and R buttons.\n" - // "If disabled only the Claim Check will be found in the pool."); - // SohImGui::EnhancementCombobox("gRandomizeShuffleAdultTrade", randoShuffleAdultTrade, 2, 0); - } - ImGui::PopItemWidth(); - - // COLUMN 3 - Shuffle Dungeon Items - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::PushItemWidth(-FLT_MIN); - - // // COLUMN 4 - SHUFFLE DUNGEON ITEMS - // ImGui::NewLine(); - // SohImGui::EnhancementCheckbox("Randomize All Shuffle Dungeon Items Settings", - // "gRandomizeAllShuffleDungeonItemsettings"); - // InsertHelpHoverText("Randomize all Dungeon Shuffle Settings"); - // ImGui::Separator(); - - // if (CVar_GetS32("gRandomizeAllShuffleDungeonItemsettings", 0) != 1) { - // todo implement maps/compasses outside of own dungeon - // Maps / Compasses - // ImGui::Text("Maps / Compasses"); - // switch (CVar_GetS32("gRandomizeShuffleMapsAndCompasses", 0)) { - // case 0: - // InsertHelpHoverText("Maps and Compasses can only appear in their respective dungeon."); - // break; - // case 1: - // InsertHelpHoverText( - // "Maps and Compasses can only appear in a dungeon but not necessarily the " - // "dungeon they are for."); - // break; - // case 2: - // InsertHelpHoverText("Maps and Compasses can only appear outside of dungeons."); - // break; - // case 3: - // InsertHelpHoverText("Maps and Compasses can appear anywhere in the world."); - // break; - // case 4: - // InsertHelpHoverText( - // "Maps and Compasses are given to you from the start.\nThis will add a " - // "small amount of money and refill items to the pool."); - // break; - // case 5: - // InsertHelpHoverText("Maps and Compasses will appear in their vanilla locations."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeShuffleMapsAndCompasses", randoShuffleMapsAndCompasses, - // 6, 0); - // ImGui::Separator(); - - // todo implement small keys outside their own dungeons - // // Small Keys - // ImGui::Text("Small Keys"); - // switch (CVar_GetS32("gRandomizeShuffleSmallKeys", 0)) { - // case 0: - // InsertHelpHoverText("Small Keys can only appear in their respective dungeon."); - // break; - // case 1: - // InsertHelpHoverText( - // "Small Keys can only appear inside of any dungon, but won't necessarily " - // "be in the dungeon that the key is for.\nA difficult mode since it is " - // "more likely to need to enter a dungeon multiple times."); - // break; - // case 2: - // InsertHelpHoverText( - // "Small Keys can only appear outside of dungeons.\nYou may need to enter a " - // "dungeon multiple times to gain items to access the overworld locations " - // "with the keys required to finish a dungeon."); - // break; - // case 3: - // InsertHelpHoverText( - // "Small Keys can appear anywhere in the world.\nA difficult mode since it " - // "is more likely to need to enter a dungeon multiple times."); - // break; - // case 4: - // InsertHelpHoverText( - // "Small Keys are given to you from the start so you won't have to worry " - // "about locked doors.\nAn easier mode."); - // break; - // case 5: - // InsertHelpHoverText("Small Keys will appear in their vanilla locations."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeShuffleSmallKeys", randoShuffleSmallKeys, 6, 0); - // ImGui::Separator(); - - // todo implement gf keys outside of gf - // // Gerudo Fortress Keys - // ImGui::Text("Gerudo Fortress Keys"); - // switch (CVar_GetS32("gRandomizeShuffleGerudoFortressKeys", 0)) { - // case 0: - // InsertHelpHoverText( - // "Gerudo Fortress Keys will appear in their vanilla location dropping from " - // "fighting Gerudo guards that attack when trying to free the jailed carpenters."); - // break; - // case 1: - // InsertHelpHoverText("Gerudo Fortress Keys can only appear inside of dungeons."); - // break; - // case 2: - // InsertHelpHoverText("Gerudo Fortress Keys can only appear outside of dungeons."); - // break; - // case 3: - // InsertHelpHoverText("Gerudo Fortress Keys can appear anywhere in the world."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeShuffleGerudoFortressKeys", - // randoShuffleGerudoFortressKeys, 4, 0); - // ImGui::Separator(); - - // todo implement boss keys outside of own dungeon - // // Boss Keys - // ImGui::Text("Boss Keys"); - // switch (CVar_GetS32("gRandomizeShuffleBossKeys", 0)) { - // case 0: - // InsertHelpHoverText("Boss Keys can only appear in their respective dungeons."); - // break; - // case 1: - // InsertHelpHoverText( - // "Boss Keys can only appear inside of any dungeon, but won't necessarily " - // "be in the dungon that the key is for.\nA difficult mode since it is " - // "more likely to need to enter a dungeon multiple times."); - // break; - // case 2: - // InsertHelpHoverText( - // "Boss Keys can only appear outside of dungeons.\nYou may need to enter a dungeon " - // "without the boss key to get items required to find the key in the overworld."); - // break; - // case 3: - // InsertHelpHoverText( - // "Boss Keys can appear anywhere in the overworld.\nA difficult mode since it " - // "is more likely to need to enter a dungeon multiple times."); - // break; - // case 4: - // InsertHelpHoverText( - // "Boss Keys are given to you from the start so you won't have to worry " - // "about boss doors.\nAn easier mode."); - // break; - // case 5: - // InsertHelpHoverText("Boss Keys will appear in their vanilla locations."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeShuffleBossKeys", randoShuffleBossKeys, 6, 0); - // ImGui::Separator(); - - // RANDOTODO implement ganon's boss key outside of ganon's castle - // Ganon's Boss Key - ImGui::PushItemWidth(-FLT_MIN); - ImGui::Text("Ganon's Boss Key"); - SohImGui::EnhancementCombobox("gRandomizeShuffleGanonBossKey", randoShuffleGanonsBossKey, 3, - 0); - switch (CVar_GetS32("gRandomizeShuffleGanonBossKey", 0)) { - case 0: - SetLastItemHoverText( - "Ganon's Boss Key is given to you from the start and you don't " - "have to worry about finding it."); - break; - case 1: - SetLastItemHoverText("Ganon's Boss Key will appear in the vanilla location."); - break; - case 2: - SetLastItemHoverText("Ganon's Boss Key will appear somewhere inside Ganon's Castle."); - break; - // case 0: - // SetLastItemHoverText( - // "Ganon's Castle Boss Key can only appear inside of a dungeon, but not " - // "necessarily Ganon's Castle."); - // break; - // case 1: - // SetLastItemHoverText("Ganon's Castle Boss Key can only appear outside of dungeons."); - // break; - // case 2: - // SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the world."); - // break; - // case 3: - // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow Cutscene location, " - // "from Zelda in Temple of Time as adult, with differing requirements."); - // break; - // case 4: - // SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the world."); - // break; - // case 5: - // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow Cutscene location, " - // "from Zelda in Temple of Time as adult, with differing requirements."); - // SohImGui::EnhancementSliderInt("Medallion Count: %d", "##RandoGanonMedallionCount", - // "gRandomizeGanonMedallionCount", 0, 6, ""); - // InsertHelpHoverText( - // "Set the number of Medallions required to trigger the Light Arrow Cutscene."); - // break; - // case 6: - // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow Cutscene location, " - // "from Zelda in Temple of Time as adult, with differing requirements."); - // SohImGui::EnhancementSliderInt("Stone Count: %d", "##RandoGanonStoneCount", - // "gRandomizeGanonStoneCount", 0, 3, ""); - // InsertHelpHoverText("Set the number of Spiritual Stones required to trigger the Light " - // "Arrow Cutscene."); - // break; - // case 7: - // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow Cutscene location, " - // "from Zelda in Temple of Time as adult, with differing requirements."); - // SohImGui::EnhancementSliderInt("Reward Count: %d", "##RandoGanonRewardCount", - // "gRandomizeGanonRewardCount", 0, 9, ""); - // InsertHelpHoverText( - // "Set the number of Dungeon Rewards (Spiritual Stones and Medallions) " - // "required to trigger the Light Arrow Cutscene."); - // break; - // case 8: - // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow Cutscene location, " - // "from Zelda in Temple of Time as adult, with differing requirements."); - // SohImGui::EnhancementSliderInt("MDungeon Count: %d", "##RandoGanonDungeonCount", - // "gRandomizeGanonDungeonCount", 0, 8, ""); - // InsertHelpHoverText( - // "Set the number of completed dungeons required to trigger the Light Arrow " - // "Cutscene.\nDungeons are considered complete when Link steps into the " - // "blue warp at the end of them."); - // break; - // case 9: - // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow Cutscene location, " - // "from Zelda in Temple of Time as adult, with differing requirements."); - // SohImGui::EnhancementSliderInt("Token Count: %d", "##RandoGanonTokenCount", - // "gRandomizeGanonTokenCount", 0, 100, ""); - // InsertHelpHoverText("Set the number of Gold Skulltula Tokens required to trigger the " - // "Light Arrow Cutscene."); - // break; - } - ImGui::Separator(); - ImGui::PopItemWidth(); - ImGui::EndTable(); - } - ImGui::PopStyleVar(1); - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Other")) { - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - if (ImGui::BeginTable("tableRandoOther", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Timesavers", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Hint Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Item Pool Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::TableHeadersRow(); - ImGui::PopItemFlag(); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - // COLUMN 1 - TIME SAVERS - // ImGui::NewLine(); - - // todo implement minigame repeat skip - // // Skip Minigame repetition - // SohImGui::EnhancementCheckbox("Skip Minigame Repetition", "gRandomizeSkipMinigameRepetition"); - // InsertHelpHoverText("Completing the second objective in the Dampe Race and Gerudo Archery on the " - // "first attempt will give both rewards at once for that minigame."); - // ImGui::Separator(); - - // todo implement free scarecrow (is this already in?) - // // Free scarecrow - // SohImGui::EnhancementCheckbox("Free Scarecrow", "gRandomizeFreeScarecrow"); - // InsertHelpHoverText( - // "Pulling the Ocarina near a spot at which Pierre can spawn will do so, without " - // "needing the song."); - // ImGui::Separator(); - - // todo implement skip poes (did we already?) - // // Skip Four Poes cutscene - // SohImGui::EnhancementCheckbox("Skip Four Poes Cutscene", "gRandomizeSkipFourPoesCutscene"); - // InsertHelpHoverText( - // "The cutscene with the 4 poes in Forest Temple will be skipped. If the cutscene " - // "is not skipped, it can be exploited to reach the basement early."); - // ImGui::Separator(); - - // todo implement skip lake hylia owl - // // Skip Lake Hylia owl - // SohImGui::EnhancementCheckbox("Skip Lake Hylia Owl Cutscene", "gRandomizeSkipLakeHyliaOwl"); - // InsertHelpHoverText( - // "The owl flight cutscene in Lake Hylia will be skipped. This cutscene lets you " - // "see what item is on top of the laboratory roof."); - // ImGui::Separator(); - - // Cuccos to return - SohImGui::EnhancementSliderInt("Cuccos to return: %d", "##RandoCuccosToReturn", - "gRandomizeCuccosToReturn", 0, 7, "", 7, true); - InsertHelpHoverText( - "The amount of cuccos needed to claim the reward from Anju the cucco lady" - ); + if (CVar_GetS32("gRandomizeAllOpenSettings", 0) != 1) { + // Forest + ImGui::Text(Settings::OpenForest.GetName().c_str()); + InsertHelpHoverText("Closed - Kokiri sword & shield are required to access " + "the Deku Tree, and completing the Deku Tree is required to " + "access the Hyrule Field exit.\n" + "\n" + "Closed Deku - Kokiri boy no longer blocks the path to Hyrule " + "Field but Mido still requires the Kokiri sword and Deku shield " + "to access the tree.\n" + "\n" + "Open - Mido no longer blocks the path to the Deku Tree. Kokiri " + "boy no longer blocks the path out of the forest."); + SohImGui::EnhancementCombobox("gRandomizeForest", randoForest, 3, 0); + PaddedSeparator(); + // Kakariko Gate + ImGui::Text(Settings::OpenKakariko.GetName().c_str()); + InsertHelpHoverText("Closed - The gate will remain closed until Zelda's letter " + "is shown to the guard.\n" + "\n" + "Open - The gate is always open. The happy mask shop " + "will open immediately after obtaining Zelda's letter."); + SohImGui::EnhancementCombobox("gRandomizeKakarikoGate", randoKakarikoGate, 2, 0); PaddedSeparator(); - // Big Poe Target Count - SohImGui::EnhancementSliderInt("Big Poe Target Count: %d", "##RandoBigPoeTargetCount", - "gRandomizeBigPoeTargetCount", 1, 10, "", 10, true); - InsertHelpHoverText( - "The Poe collector will give a reward for turning in this many Big Poes." - ); + // Door of Time + ImGui::Text(Settings::OpenDoorOfTime.GetName().c_str()); + InsertHelpHoverText("Closed - The Ocarina of Time, the Song of Time and all " + "three spiritual stones are required to open the Door of Time.\n" + "\n" + "Song only - Play the Song of Time in front of the Door of " + "Time to open it.\n" + "\n" + "Open - The Door of Time is permanently open with no requirements."); + SohImGui::EnhancementCombobox("gRandomizeDoorOfTime", randoDoorOfTime, 3, 0); PaddedSeparator(); - // Skip child stealth + // Zora's Fountain + ImGui::Text(Settings::ZorasFountain.GetName().c_str()); + InsertHelpHoverText("Closed - King Zora obstructs the way to Zora's Fountain. " + "Ruto's letter must be shown as child Link in order to move " + "him in both time periods.\n" + "\n" + "Closed as child - Ruto's Letter is only required to move King Zora " + "as child Link. Zora's Fountain starts open as adult.\n" + "\n" + "Open - King Zora has already mweeped out of the way in both " + "time periods. Ruto's Letter is removed from the item pool."); + SohImGui::EnhancementCombobox("gRandomizeZorasFountain", randoZorasFountain, 3, 0); + PaddedSeparator(); + + // Gerudo Fortress + ImGui::Text(Settings::GerudoFortress.GetName().c_str()); + InsertHelpHoverText("Sets the amount of carpenters required to repair the bridge " + "in Gerudo Valley.\n" + "\n" + "Normal - All 4 carpenters are required to be saved.\n" + "\n" + "Fast - Only the bottom left carpenter requires rescuing.\n" + "\n" + "Open - The bridge is repaired from the start."); + SohImGui::EnhancementCombobox("gRandomizeGerudoFortress", randoGerudoFortress, 3, 0); + PaddedSeparator(); + + // Rainbow Bridge + ImGui::Text(Settings::Bridge.GetName().c_str()); + InsertHelpHoverText("Alters the requirements to open the bridge to Ganon's Castle.\n" + "\n" + "Vanilla - Obtain the Shadow Medallion, Spirit Medallion and Light Arrows.\n" + "\n" + "Always open - No requirements.\n" + "\n" + "Stones - Obtain the specified amount of spiritual stones.\n" + "\n" + "Medallions - Obtain the specified amount of medallions.\n" + "\n" + "Dungeon rewards - Obtain the specified total sum of spiritual " + "stones or medallions.\n" + "\n" + "Dungeons - Complete the specified amount of dungeons. Dungeons " + "are considered complete after stepping in to the blue warp after " + "the boss.\n" + "\n" + "Tokens - Obtain the specified amount of Skulltula tokens."); + SohImGui::EnhancementCombobox("gRandomizeRainbowBridge", randoRainbowBridge, 7, 0); + ImGui::PopItemWidth(); + switch (CVar_GetS32("gRandomizeRainbowBridge", 0)) { + case 0: + break; + case 1: + break; + case 2: + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + SohImGui::EnhancementSliderInt("Stone Count: %d", "##RandoStoneCount", + "gRandomizeStoneCount", 1, 3, "", 3, true); + break; + case 3: + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + SohImGui::EnhancementSliderInt("Medallion Count: %d", "##RandoMedallionCount", + "gRandomizeMedallionCount", 1, 6, "", 6, true); + break; + case 4: + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + SohImGui::EnhancementSliderInt("Reward Count: %d", "##RandoRewardCount", + "gRandomizeRewardCount", 1, 9, "", 9, true); + break; + case 5: + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + SohImGui::EnhancementSliderInt("Dungeon Count: %d", "##RandoDungeonCount", + "gRandomizeDungeonCount", 1, 8, "", 8, true); + break; + case 6: + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + SohImGui::EnhancementSliderInt("Token Count: %d", "##RandoTokenCount", + "gRandomizeTokenCount", 1, 100, "", 100, true); + break; + } + PaddedSeparator(); + + // Random Ganon's Trials + /* + ImGui::Text("Random Ganon's Trials"); + InsertHelpHoverText("Sets a random number or required trials to enter\nGanon's Tower."); + SohImGui::EnhancementCombobox("gRandomizeGanonTrial", randoGanonsTrial, 2, 0); + if (CVar_GetS32("gRandomizeGanonTrial", 0) == 0) { + ImGui::PopItemWidth(); + SohImGui::EnhancementSliderInt("Ganon's Trial Count: %d", "##RandoTrialCount", + "gRandomizeGanonTrialCount", 0, 6, "", 6); + InsertHelpHoverText("Set the number of trials required to enter Ganon's Tower."); + RANDTODO: Switch back to slider when pre-completing some of Ganon's Trials is properly implemnted. + } + */ + SohImGui::EnhancementCheckbox("Skip Ganon's Trials", "gRandomizeGanonTrialCount"); + InsertHelpHoverText( + "Sets whether or not Ganon's Castle Trials are required to enter Ganon's Tower."); + } + + // COLUMN 2 - Shuffle Settings + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::PushItemWidth(-FLT_MIN); + if (CVar_GetS32("gRandomizeAllShuffleSettings", 0) != 1) { + + // Shuffle Songs + ImGui::Text(Settings::ShuffleSongs.GetName().c_str()); + InsertHelpHoverText( + "Song locations - Songs will only appear at locations that normally teach songs.\n" + "\n" + "Dungeon rewards - Songs appear after beating a major dungeon boss.\n" + "The 4 remaining songs are located at:\n" + " - Zelda's lullaby location\n" + " - Ice Cavern's Serenade of Water location\n" + " - Bottom of the Well Lens of Truth location\n" + " - Gerudo Training Ground's Ice Arrows location\n" + "\n" + "Anywhere - Songs can appear at any location."); + + SohImGui::EnhancementCombobox("gRandomizeShuffleSongs", randoShuffleSongs, 3, 0); + PaddedSeparator(); + + // Shuffle Tokens + ImGui::Text(Settings::Tokensanity.GetName().c_str()); + InsertHelpHoverText("Shuffles Golden Skulltula Tokens into the item pool. This means " + "Golden Skulltulas can contain other items as well.\n" + "\n" + "Off - GS tokens will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle GS tokens that are within dungeons.\n" + "\n" + "Overworld - Only shuffle GS tokens that are outside of dungeons.\n" + "\n" + "All Tokens - Shuffle all 100 GS tokens."); + SohImGui::EnhancementCombobox("gRandomizeShuffleTokens", randoShuffleTokens, 4, 0); + PaddedSeparator(); + + SohImGui::EnhancementCheckbox("Nighttime GS expect Sun's Song", "gRandomizeGsExpectSunsSong"); + InsertHelpHoverText("All Golden Skulltulas that require nighttime to appear will only be " + "expected to be collected after getting Sun's Song."); + PaddedSeparator(); + + // Shuffle Cows + SohImGui::EnhancementCheckbox(Settings::ShuffleCows.GetName().c_str(), "gRandomizeShuffleCows"); + InsertHelpHoverText( + "Cows give a randomized item from the pool upon performing Epona's Song in front of them."); + PaddedSeparator(); + + // Shuffle Adult Trade Quest + SohImGui::EnhancementCheckbox(Settings::ShuffleAdultTradeQuest.GetName().c_str(), + "gRandomizeShuffleAdultTrade"); + InsertHelpHoverText("Adds all of the adult trade quest items into the pool, each of which " + "can be traded for a unique reward.\n" + "\n" + "You will be able to choose which of your owned adult trade items is visible " + "in the inventory by selecting the item with A and using the control stick or " + "D-pad.\n" + "\n" + "If disabled, only the Claim Check will be found in the pool."); + PaddedSeparator(); + + if (CVar_GetS32("gRandomizeStartingKokiriSword", 0) == 0) { + // Shuffle Kokiri Sword + SohImGui::EnhancementCheckbox(Settings::ShuffleKokiriSword.GetName().c_str(), + "gRandomizeShuffleKokiriSword"); + InsertHelpHoverText("Shuffles the Kokiri Sword into the item pool.\n" + "\n" + "This will require the use of sticks until the Kokiri Sword is found."); + PaddedSeparator(); + } + + if (CVar_GetS32("gRandomizeStartingOcarina", 0) == 0) { + // Shuffle Ocarinas + SohImGui::EnhancementCheckbox(Settings::ShuffleOcarinas.GetName().c_str(), + "gRandomizeShuffleOcarinas"); + InsertHelpHoverText( + "Enabling this shuffles the Fairy Ocarina and the Ocarina of Time into the item pool.\n" + "\n" + "This will require finding an Ocarina before being able to play songs."); + PaddedSeparator(); + } + + // Shuffle Weird Egg // Disabled when Skip Child Zelda is active if (!disableEditingRandoSettings) { ImGui::PushItemFlag(ImGuiItemFlags_Disabled, CVar_GetS32("gRandomizeSkipChildZelda", 0)); @@ -3609,8 +3123,8 @@ void DrawRandoEditor(bool& open) { ImGui::GetStyle().Alpha * (CVar_GetS32("gRandomizeSkipChildZelda", 0) ? 0.5f : 1.0f)); } - SohImGui::EnhancementCheckbox(Settings::SkipChildStealth.GetName().c_str(), - "gRandomizeSkipChildStealth"); + SohImGui::EnhancementCheckbox(Settings::ShuffleWeirdEgg.GetName().c_str(), + "gRandomizeShuffleWeirdEgg"); if (!disableEditingRandoSettings) { ImGui::PopStyleVar(); if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && @@ -3619,356 +3133,518 @@ void DrawRandoEditor(bool& open) { } ImGui::PopItemFlag(); } - InsertHelpHoverText("The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards."); - PaddedSeparator(); - - // Skip child zelda - SohImGui::EnhancementCheckbox("Skip Child Zelda", "gRandomizeSkipChildZelda"); - InsertHelpHoverText( - "Start with Zelda's Letter in your inventory and skip the sequence up " - "until after meeting Zelda. Disables the ability to shuffle Weird Egg." - ); - PaddedSeparator(); - - // Skip Epona race - SohImGui::EnhancementCheckbox(Settings::SkipEponaRace.GetName().c_str(), "gRandomizeSkipEponaRace"); - InsertHelpHoverText( - "Epona can be summoned with Epona's Song without needing to race Ingo." - ); - PaddedSeparator(); - - // Skip tower escape - SohImGui::EnhancementCheckbox(Settings::SkipTowerEscape.GetName().c_str(), "gRandomizeSkipTowerEscape"); - InsertHelpHoverText( - "The tower escape sequence between Ganondorf and Ganon will be skipped." - ); - PaddedSeparator(); - - // Complete mask quest - SohImGui::EnhancementCheckbox(Settings::CompleteMaskQuest.GetName().c_str(), "gRandomizeCompleteMaskQuest"); - InsertHelpHoverText( - "Once the happy mask shop is opened, all masks will be available to be borrowed." - ); - PaddedSeparator(); - - // Enable Glitch-Useful Cutscenes - SohImGui::EnhancementCheckbox(Settings::EnableGlitchCutscenes.GetName().c_str(), "gRandomizeEnableGlitchCutscenes"); - InsertHelpHoverText( - "The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. " - "These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise." - ); - - // COLUMN 2 - HINT SETTINGS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::PushItemWidth(-FLT_MIN); - - // Gossip Stone Hints - ImGui::Text(Settings::GossipStoneHints.GetName().c_str()); - InsertHelpHoverText( - "Allows Gossip Stones to provide hints on item locations. Hints mentioning " - "\"Way of the Hero\" indicate a location that holds an item required to beat " - "the seed.\n" - "\n" - "No hints - No hints will be given at all.\n" - "\n" - "Need Nothing - Hints are always available from Gossip Stones.\n" - "\n" - "Need Stone of Agony - Hints are only available after obtaining the Stone of Agony.\n" - "\n" - "Need Mask of Truth - Hints are only available whilst wearing the Mask of Truth.\n" - ); - - SohImGui::EnhancementCombobox("gRandomizeGossipStoneHints", randoGossipStoneHints, 4, 1); - if (CVar_GetS32("gRandomizeGossipStoneHints", 1) != 0) { - // Hint Clarity - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - ImGui::Indent(); - ImGui::Text(Settings::ClearerHints.GetName().c_str()); - InsertHelpHoverText( - "Sets the difficulty of hints.\n" - "\n" - "Obscure - Hints are unique for each item, but the writing may be cryptic.\n" - "Ex: Kokiri Sword > a butter knife\n" - "\n" - "Ambiguous - Hints are clearly written, but may refer to more than one item.\n" - "Ex: Kokiri Sword > a sword\n" - "\n" - "Clear - Hints are clearly written and are unique for each item.\n" - "Ex: Kokiri Sword > the Kokiri Sword" - ); - SohImGui::EnhancementCombobox("gRandomizeHintClarity", randoHintClarity, 3, 2); - - // Hint Distribution - ImGui::Dummy(ImVec2(0.0f, 0.0f)); - ImGui::Text(Settings::HintDistribution.GetName().c_str()); - InsertHelpHoverText( - "Sets how many hints will be useful.\n" - "\n" - "Useless - Only junk hints.\n" - "\n" - "Balanced - Recommended hint spread.\n" - "\n" - "Strong - More useful hints.\n" - "\n" - "Very Strong - Many powerful hints." - ); - SohImGui::EnhancementCombobox("gRandomizeHintDistribution", randoHintDistribution, 4, 1); - ImGui::Unindent(); - } - ImGui::PopItemWidth(); - - // COLUMN 3 - ITEM POOL SETTINGS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::PushItemWidth(-FLT_MIN); - ImGui::Text(Settings::ItemPoolValue.GetName().c_str()); - InsertHelpHoverText( - "Sets how many major items appear in the item pool.\n" - "\n" - "Plentiful - Extra major items are added to the pool.\n" - "\n" - "Balanced - Original item pool.\n" - "\n" - "Scarce - Some excess items are removed, including health upgrades.\n" - "\n" - "Minimal - Most excess items are removed." - ); - SohImGui::EnhancementCombobox("gRandomizeItemPool", randoItemPool, 4, 1); - PaddedSeparator(); - - // Ice Traps - ImGui::Text(Settings::IceTrapValue.GetName().c_str()); - InsertHelpHoverText( - "Sets how many items are replaced by ice traps.\n" - "\n" - "Off - No ice traps.\n" - "\n" - "Normal - Only Ice Traps from the base item pool are shuffled in.\n" - "\n" - "Extra - Chance to replace added junk items with additional ice traps.\n" - "\n" - "Mayhem - All added junk items will be Ice Traps.\n" - "\n" - "Onslaught - All junk items will be replaced by Ice Traps, even those " - "in the base pool." - ); - SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1); - ImGui::PopItemWidth(); - ImGui::EndTable(); - } - ImGui::PopStyleVar(1); - ImGui::EndTabItem(); - } - - static bool locationsTabOpen = false; - if (ImGui::BeginTabItem("Locations")) { - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - if (!locationsTabOpen) { - locationsTabOpen = true; - RandomizerCheckObjects::UpdateImGuiVisibility(); - // todo: this efficently when we build out cvar array support - std::stringstream excludedLocationStringStream(CVar_GetString("gRandomizeExcludedLocations", "")); - std::string excludedLocationString; - excludedLocations.clear(); - while(getline(excludedLocationStringStream, excludedLocationString, ',')) { - excludedLocations.insert((RandomizerCheck)std::stoi(excludedLocationString)); - } - } - - if (ImGui::BeginTable("tableRandoLocations", 2, - ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Included", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Excluded", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::TableHeadersRow(); - ImGui::PopItemFlag(); - ImGui::TableNextRow(); - - // COLUMN 1 - INCLUDED LOCATIONS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - - static ImGuiTextFilter locationSearch; - locationSearch.Draw(); - - ImGui::BeginChild("ChildIncludedLocations", ImVec2(0, -8)); - for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { - bool hasItems = false; - for (auto locationIt : areaIt.second) { - if (locationIt.visibleInImgui && - !excludedLocations.count(locationIt.rc) && - locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { - - hasItems = true; - break; - } - } - - if (hasItems) { - ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(areaIt.first).c_str())) { - for (auto locationIt : areaIt.second) { - if (locationIt.visibleInImgui && - !excludedLocations.count(locationIt.rc) && - locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { - - if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Right)) { - excludedLocations.insert(locationIt.rc); - // todo: this efficently when we build out cvar array support - std::string excludedLocationString = ""; - for (auto excludedLocationIt : excludedLocations) { - excludedLocationString += std::to_string(excludedLocationIt); - excludedLocationString += ","; - } - CVar_SetString("gRandomizeExcludedLocations", excludedLocationString.c_str()); - SohImGui::needs_save = true; - } - ImGui::SameLine(); - ImGui::Text(locationIt.rcShortName.c_str()); - } - } - ImGui::TreePop(); - } - } - } - ImGui::EndChild(); - - // COLUMN 2 - EXCLUDED LOCATIONS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - - ImGui::BeginChild("ChildExcludedLocations", ImVec2(0, -8)); - for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { - bool hasItems = false; - for (auto locationIt : areaIt.second) { - if (locationIt.visibleInImgui && excludedLocations.count(locationIt.rc)) { - hasItems = true; - break; - } - } - - if (hasItems) { - ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(areaIt.first).c_str())) { - for (auto locationIt : areaIt.second) { - auto elfound = excludedLocations.find(locationIt.rc); - if (locationIt.visibleInImgui && elfound != excludedLocations.end()) { - if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Left)) { - excludedLocations.erase(elfound); - // todo: this efficently when we build out cvar array support - std::string excludedLocationString = ""; - for (auto excludedLocationIt : excludedLocations) { - excludedLocationString += std::to_string(excludedLocationIt); - excludedLocationString += ","; - } - CVar_SetString("gRandomizeExcludedLocations", excludedLocationString.c_str()); - SohImGui::needs_save = true; - } - ImGui::SameLine(); - ImGui::Text(locationIt.rcShortName.c_str()); - } - } - ImGui::TreePop(); - } - } - } - ImGui::EndChild(); - - ImGui::EndTable(); - } - ImGui::PopStyleVar(1); - ImGui::EndTabItem(); - } else { - locationsTabOpen = false; - } - - if (ImGui::BeginTabItem("Tricks/Glitches")) { - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - if (ImGui::BeginTable("tableRandoLogic", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::PushItemWidth(170.0); - ImGui::Text("Logic Rules"); - InsertHelpHoverText("Glitchless - No glitches are required, but may require some minor tricks.\n" + InsertHelpHoverText("Shuffles the Weird Egg from Malon in to the item pool. Enabling " + "\"Skip Child Zelda\" disables this feature.\n" "\n" - "No logic - Item placement is completely random. MAY BE IMPOSSIBLE TO BEAT."); - SohImGui::EnhancementCombobox("gRandomizeLogicRules", randoLogicRules, 2, 0); - ImGui::PopItemWidth(); - ImGui::EndTable(); + "The Weird Egg is required to unlock several events:\n" + " - Zelda's Lullaby from Impa\n" + " - Saria's song in Sacred Forest Meadow\n" + " - Epona's song and chicken minigame at Lon Lon Ranch\n" + " - Zelda's letter for Kakariko gate (if set to closed)\n" + " - Happy Mask Shop sidequest\n"); + PaddedSeparator(); + + // Shuffle Gerudo Membership Card + SohImGui::EnhancementCheckbox(Settings::ShuffleGerudoToken.GetName().c_str(), + "gRandomizeShuffleGerudoToken"); + InsertHelpHoverText("Shuffles the Gerudo Membership Card into the item pool.\n" + "\n" + "The Gerudo Card is required to enter the Gerudo Training Grounds, opening " + "the gate to Haunted Wasteland and the Horseback Archery minigame."); + PaddedSeparator(); + + // Shuffle Frog Song Rupees + SohImGui::EnhancementCheckbox(Settings::ShuffleFrogSongRupees.GetName().c_str(), + "gRandomizeShuffleFrogSongRupees"); + InsertHelpHoverText("Shuffles 5 Purple Rupees into to the item pool, and allows\n" + "you to earn items by playing songs at the Frog Choir.\n" + "\n" + "This setting does not effect the item earned from playing\n" + "the Song of Storms and the frog song minigame."); } - if (ImGui::BeginTable("tableRandoTricksGlitches", 2, - ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Enable Tricks", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Enable Glitches", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::TableHeadersRow(); - ImGui::PopItemFlag(); - ImGui::TableNextRow(); + ImGui::PopItemWidth(); - // COLUMN 1 - ENABLE TRICKS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::Text("Coming soon"); + // COLUMN 3 - Shuffle Dungeon Items + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::PushItemWidth(-FLT_MIN); - // COLUMN 2 - ENABLE GLITCHES - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::Text("Coming soon"); + // Shuffle Dungeon Rewards + ImGui::Text(Settings::ShuffleRewards.GetName().c_str()); + InsertHelpHoverText( + "Shuffles the location of spiritual stones and medallions.\n" + "\n" + "End of dungeons - Spiritual stones and medallions will be given as rewards " + "for beating major dungeons. Link will always start with one stone or medallion.\n" + "\n" + "Any dungeon - Spiritual stones and medallions can be found inside any dungeon.\n" + "\n" + "Overworld - Spiritual stones and medallions can only be found outside of dungeons.\n" + "\n" + "Anywhere - Spiritual stones and medallions can appear anywhere."); + SohImGui::EnhancementCombobox("gRandomizeShuffleDungeonReward", randoShuffleDungeonRewards, 4, 0); + PaddedSeparator(); - ImGui::EndTable(); - } - ImGui::PopStyleVar(1); - ImGui::EndTabItem(); + // Maps & Compasses + ImGui::Text(Settings::MapsAndCompasses.GetName().c_str()); + InsertHelpHoverText("Start with - You will start with Maps & Compasses from all dungeons.\n" + "\n" + "Vanilla - Maps & Compasses will appear in their vanilla locations.\n" + "\n" + "Own dungeon - Maps & Compasses can only appear in their respective dungeon.\n" + "\n" + "Any dungeon - Maps & Compasses can only appear inside of any dungon.\n" + "\n" + "Overworld - Maps & Compasses can only appear outside of dungeons.\n" + "\n" + "Anywhere - Maps & Compasses can appear anywhere in the world."); + SohImGui::EnhancementCombobox("gRandomizeStartingMapsCompasses", randoShuffleMapsAndCompasses, 6, 2); + PaddedSeparator(); + + // Keysanity + ImGui::Text(Settings::Keysanity.GetName().c_str()); + InsertHelpHoverText("Start with - You will start with all Small Keys from all dungeons.\n" + "\n" + "Vanilla - Small Keys will appear in their vanilla locations.\n" + "\n" + "Own dungeon - Small Keys can only appear in their respective dungeon.\n" + "\n" + "Any dungeon - Small Keys can only appear inside of any dungon.\n" + "\n" + "Overworld - Small Keys can only appear outside of dungeons.\n" + "\n" + "Anywhere - Small Keys can appear anywhere in the world."); + SohImGui::EnhancementCombobox("gRandomizeKeysanity", randoShuffleSmallKeys, 6, 2); + PaddedSeparator(); + + // Gerudo Keys + ImGui::Text(Settings::GerudoKeys.GetName().c_str()); + InsertHelpHoverText("Vanilla - Thieve's Hideout Keys will appear in their vanilla locations.\n" + "\n" + "Any dungeon - Thieve's Hideout Keys can only appear inside of any dungon.\n" + "\n" + "Overworld - Thieve's Hideout Keys can only appear outside of dungeons.\n" + "\n" + "Anywhere - Thieve's Hideout Keys can appear anywhere in the world."); + SohImGui::EnhancementCombobox("gRandomizeGerudoKeys", randoShuffleGerudoFortressKeys, 4, 0); + PaddedSeparator(); + + // Boss Keysanity + ImGui::Text(Settings::BossKeysanity.GetName().c_str()); + InsertHelpHoverText("Start with - You will start with Boss keys from all dungeons.\n" + "\n" + "Vanilla - Boss Keys will appear in their vanilla locations.\n" + "\n" + "Own dungeon - Boss Keys can only appear in their respective dungeon.\n" + "\n" + "Any dungeon - Boss Keys can only appear inside of any dungon.\n" + "\n" + "Overworld - Boss Keys can only appear outside of dungeons.\n" + "\n" + "Anywhere - Boss Keys can appear anywhere in the world."); + SohImGui::EnhancementCombobox("gRandomizeBossKeysanity", randoShuffleBossKeys, 6, 2); + PaddedSeparator(); + + // Ganon's Boss Key + ImGui::Text(Settings::GanonsBossKey.GetName().c_str()); + InsertHelpHoverText("Vanilla - Ganon's Boss Key will appear in the vanilla location.\n" + "\n" + "Own dungeon - Ganon's Boss Key can appear anywhere inside Ganon's Castle.\n" + "\n" + "Start with - Places Ganon's Boss Key in your starting inventory." + "\n" + "Any dungeon - Ganon's Boss Key Key can only appear inside of any dungon.\n" + "\n" + "Overworld - Ganon's Boss Key Key can only appear outside of dungeons.\n" + "\n" + "Anywhere - Ganon's Boss Key Key can appear anywhere in the world."); + SohImGui::EnhancementCombobox("gRandomizeShuffleGanonBossKey", randoShuffleGanonsBossKey, 6, 1); + + ImGui::PopItemWidth(); + ImGui::EndTable(); } - - if (ImGui::BeginTabItem("Starting Inventory")) { - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - if (ImGui::BeginTable("tableRandoStartingInventory", 3, - ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Starting Equipment", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Starting Items", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Starting Songs", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::TableHeadersRow(); - ImGui::PopItemFlag(); - ImGui::TableNextRow(); - - // COLUMN 1 - STARTING EQUIPMENT - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - SohImGui::EnhancementCheckbox(Settings::StartingKokiriSword.GetName().c_str(), "gRandomizeStartingKokiriSword"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox(Settings::StartingDekuShield.GetName().c_str(), "gRandomizeStartingDekuShield"); - - // COLUMN 2 - STARTING ITEMS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - SohImGui::EnhancementCheckbox(Settings::StartingOcarina.GetName().c_str(), "gRandomizeStartingOcarina"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox(Settings::StartingConsumables.GetName().c_str(), "gRandomizeStartingConsumables"); - PaddedSeparator(); - SohImGui::EnhancementCheckbox("Full Wallets", "gRandomizeFullWallets"); - InsertHelpHoverText("Start with a full wallet. All wallet upgrades come filled with rupees."); - - // COLUMN 3 - STARTING SONGS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::Text("Coming soon"); - - ImGui::EndTable(); - } - ImGui::PopStyleVar(1); - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); + ImGui::PopStyleVar(1); + ImGui::EndTabItem(); } - ImGui::PopItemFlag(); - ImGui::PopStyleVar(); - ImGui::End(); + + if (ImGui::BeginTabItem("Other")) { + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + if (ImGui::BeginTable("tableRandoOther", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("Timesavers", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Hint Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Item Pool Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::TableHeadersRow(); + ImGui::PopItemFlag(); + ImGui::TableNextRow(); + + // COLUMN 1 - TIME SAVERS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + + // Cuccos to return + SohImGui::EnhancementSliderInt("Cuccos to return: %d", "##RandoCuccosToReturn", + "gRandomizeCuccosToReturn", 0, 7, "", 7, true); + InsertHelpHoverText("The amount of cuccos needed to claim the reward from Anju the cucco lady"); + PaddedSeparator(); + + // Big Poe Target Count + SohImGui::EnhancementSliderInt("Big Poe Target Count: %d", "##RandoBigPoeTargetCount", + "gRandomizeBigPoeTargetCount", 1, 10, "", 10, true); + InsertHelpHoverText("The Poe collector will give a reward for turning in this many Big Poes."); + PaddedSeparator(); + + // Skip child stealth + // Disabled when Skip Child Zelda is active + if (!disableEditingRandoSettings) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, CVar_GetS32("gRandomizeSkipChildZelda", 0)); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, + ImGui::GetStyle().Alpha * + (CVar_GetS32("gRandomizeSkipChildZelda", 0) ? 0.5f : 1.0f)); + } + SohImGui::EnhancementCheckbox(Settings::SkipChildStealth.GetName().c_str(), + "gRandomizeSkipChildStealth"); + if (!disableEditingRandoSettings) { + ImGui::PopStyleVar(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && + CVar_GetS32("gRandomizeSkipChildZelda", 0)) { + ImGui::SetTooltip("%s", "This option is disabled because \"Skip Child Zelda\" is enabled"); + } + ImGui::PopItemFlag(); + } + InsertHelpHoverText("The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards."); + PaddedSeparator(); + + // Skip child zelda + SohImGui::EnhancementCheckbox("Skip Child Zelda", "gRandomizeSkipChildZelda"); + InsertHelpHoverText("Start with Zelda's Letter in your inventory and skip the sequence up " + "until after meeting Zelda. Disables the ability to shuffle Weird Egg."); + PaddedSeparator(); + + // Skip Epona race + SohImGui::EnhancementCheckbox(Settings::SkipEponaRace.GetName().c_str(), "gRandomizeSkipEponaRace"); + InsertHelpHoverText("Epona can be summoned with Epona's Song without needing to race Ingo."); + PaddedSeparator(); + + // Skip tower escape + SohImGui::EnhancementCheckbox(Settings::SkipTowerEscape.GetName().c_str(), "gRandomizeSkipTowerEscape"); + InsertHelpHoverText("The tower escape sequence between Ganondorf and Ganon will be skipped."); + PaddedSeparator(); + + // Complete mask quest + SohImGui::EnhancementCheckbox(Settings::CompleteMaskQuest.GetName().c_str(), + "gRandomizeCompleteMaskQuest"); + InsertHelpHoverText("Once the happy mask shop is opened, all masks will be available to be borrowed."); + PaddedSeparator(); + + // Enable Glitch-Useful Cutscenes + SohImGui::EnhancementCheckbox(Settings::EnableGlitchCutscenes.GetName().c_str(), + "gRandomizeEnableGlitchCutscenes"); + InsertHelpHoverText( + "The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. " + "These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise."); + + // COLUMN 2 - HINT SETTINGS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::PushItemWidth(-FLT_MIN); + + // Gossip Stone Hints + ImGui::Text(Settings::GossipStoneHints.GetName().c_str()); + InsertHelpHoverText( + "Allows Gossip Stones to provide hints on item locations. Hints mentioning " + "\"Way of the Hero\" indicate a location that holds an item required to beat " + "the seed.\n" + "\n" + "No hints - No hints will be given at all.\n" + "\n" + "Need Nothing - Hints are always available from Gossip Stones.\n" + "\n" + "Need Stone of Agony - Hints are only available after obtaining the Stone of Agony.\n" + "\n" + "Need Mask of Truth - Hints are only available whilst wearing the Mask of Truth.\n"); + + SohImGui::EnhancementCombobox("gRandomizeGossipStoneHints", randoGossipStoneHints, 4, 1); + if (CVar_GetS32("gRandomizeGossipStoneHints", 1) != 0) { + // Hint Clarity + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + ImGui::Indent(); + ImGui::Text(Settings::ClearerHints.GetName().c_str()); + InsertHelpHoverText("Sets the difficulty of hints.\n" + "\n" + "Obscure - Hints are unique for each item, but the writing may be cryptic.\n" + "Ex: Kokiri Sword > a butter knife\n" + "\n" + "Ambiguous - Hints are clearly written, but may refer to more than one item.\n" + "Ex: Kokiri Sword > a sword\n" + "\n" + "Clear - Hints are clearly written and are unique for each item.\n" + "Ex: Kokiri Sword > the Kokiri Sword"); + SohImGui::EnhancementCombobox("gRandomizeHintClarity", randoHintClarity, 3, 2); + + // Hint Distribution + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + ImGui::Text(Settings::HintDistribution.GetName().c_str()); + InsertHelpHoverText("Sets how many hints will be useful.\n" + "\n" + "Useless - Only junk hints.\n" + "\n" + "Balanced - Recommended hint spread.\n" + "\n" + "Strong - More useful hints.\n" + "\n" + "Very Strong - Many powerful hints."); + SohImGui::EnhancementCombobox("gRandomizeHintDistribution", randoHintDistribution, 4, 1); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + // COLUMN 3 - ITEM POOL SETTINGS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::PushItemWidth(-FLT_MIN); + ImGui::Text(Settings::ItemPoolValue.GetName().c_str()); + InsertHelpHoverText("Sets how many major items appear in the item pool.\n" + "\n" + "Plentiful - Extra major items are added to the pool.\n" + "\n" + "Balanced - Original item pool.\n" + "\n" + "Scarce - Some excess items are removed, including health upgrades.\n" + "\n" + "Minimal - Most excess items are removed."); + SohImGui::EnhancementCombobox("gRandomizeItemPool", randoItemPool, 4, 1); + PaddedSeparator(); + + // Ice Traps + ImGui::Text(Settings::IceTrapValue.GetName().c_str()); + InsertHelpHoverText("Sets how many items are replaced by ice traps.\n" + "\n" + "Off - No ice traps.\n" + "\n" + "Normal - Only Ice Traps from the base item pool are shuffled in.\n" + "\n" + "Extra - Chance to replace added junk items with additional ice traps.\n" + "\n" + "Mayhem - All added junk items will be Ice Traps.\n" + "\n" + "Onslaught - All junk items will be replaced by Ice Traps, even those " + "in the base pool."); + SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1); + ImGui::PopItemWidth(); + ImGui::EndTable(); + } + ImGui::PopStyleVar(1); + ImGui::EndTabItem(); + } + + static bool locationsTabOpen = false; + if (ImGui::BeginTabItem("Locations")) { + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + if (!locationsTabOpen) { + locationsTabOpen = true; + RandomizerCheckObjects::UpdateImGuiVisibility(); + // todo: this efficently when we build out cvar array support + std::stringstream excludedLocationStringStream(CVar_GetString("gRandomizeExcludedLocations", "")); + std::string excludedLocationString; + excludedLocations.clear(); + while (getline(excludedLocationStringStream, excludedLocationString, ',')) { + excludedLocations.insert((RandomizerCheck)std::stoi(excludedLocationString)); + } + } + + if (ImGui::BeginTable("tableRandoLocations", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("Included", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Excluded", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::TableHeadersRow(); + ImGui::PopItemFlag(); + ImGui::TableNextRow(); + + // COLUMN 1 - INCLUDED LOCATIONS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + + static ImGuiTextFilter locationSearch; + locationSearch.Draw(); + + ImGui::BeginChild("ChildIncludedLocations", ImVec2(0, -8)); + for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { + bool hasItems = false; + for (auto locationIt : areaIt.second) { + if (locationIt.visibleInImgui && !excludedLocations.count(locationIt.rc) && + locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { + + hasItems = true; + break; + } + } + + if (hasItems) { + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(areaIt.first).c_str())) { + for (auto locationIt : areaIt.second) { + if (locationIt.visibleInImgui && !excludedLocations.count(locationIt.rc) && + locationSearch.PassFilter(locationIt.rcSpoilerName.c_str())) { + + if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Right)) { + excludedLocations.insert(locationIt.rc); + // todo: this efficently when we build out cvar array support + std::string excludedLocationString = ""; + for (auto excludedLocationIt : excludedLocations) { + excludedLocationString += std::to_string(excludedLocationIt); + excludedLocationString += ","; + } + CVar_SetString("gRandomizeExcludedLocations", excludedLocationString.c_str()); + SohImGui::needs_save = true; + } + ImGui::SameLine(); + ImGui::Text(locationIt.rcShortName.c_str()); + } + } + ImGui::TreePop(); + } + } + } + ImGui::EndChild(); + + // COLUMN 2 - EXCLUDED LOCATIONS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + + ImGui::BeginChild("ChildExcludedLocations", ImVec2(0, -8)); + for (auto areaIt : RandomizerCheckObjects::GetAllRCObjects()) { + bool hasItems = false; + for (auto locationIt : areaIt.second) { + if (locationIt.visibleInImgui && excludedLocations.count(locationIt.rc)) { + hasItems = true; + break; + } + } + + if (hasItems) { + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(areaIt.first).c_str())) { + for (auto locationIt : areaIt.second) { + auto elfound = excludedLocations.find(locationIt.rc); + if (locationIt.visibleInImgui && elfound != excludedLocations.end()) { + if (ImGui::ArrowButton(std::to_string(locationIt.rc).c_str(), ImGuiDir_Left)) { + excludedLocations.erase(elfound); + // todo: this efficently when we build out cvar array support + std::string excludedLocationString = ""; + for (auto excludedLocationIt : excludedLocations) { + excludedLocationString += std::to_string(excludedLocationIt); + excludedLocationString += ","; + } + CVar_SetString("gRandomizeExcludedLocations", excludedLocationString.c_str()); + SohImGui::needs_save = true; + } + ImGui::SameLine(); + ImGui::Text(locationIt.rcShortName.c_str()); + } + } + ImGui::TreePop(); + } + } + } + ImGui::EndChild(); + + ImGui::EndTable(); + } + ImGui::PopStyleVar(1); + ImGui::EndTabItem(); + } else { + locationsTabOpen = false; + } + + if (ImGui::BeginTabItem("Tricks/Glitches")) { + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + if (ImGui::BeginTable("tableRandoLogic", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::PushItemWidth(170.0); + ImGui::Text("Logic Rules"); + InsertHelpHoverText("Glitchless - No glitches are required, but may require some minor tricks.\n" + "\n" + "No logic - Item placement is completely random. MAY BE IMPOSSIBLE TO BEAT."); + SohImGui::EnhancementCombobox("gRandomizeLogicRules", randoLogicRules, 2, 0); + ImGui::PopItemWidth(); + ImGui::EndTable(); + } + if (ImGui::BeginTable("tableRandoTricksGlitches", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("Enable Tricks", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Enable Glitches", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::TableHeadersRow(); + ImGui::PopItemFlag(); + ImGui::TableNextRow(); + + // COLUMN 1 - ENABLE TRICKS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::Text("Coming soon"); + + // COLUMN 2 - ENABLE GLITCHES + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::Text("Coming soon"); + + ImGui::EndTable(); + } + ImGui::PopStyleVar(1); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Starting Inventory")) { + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + if (ImGui::BeginTable("tableRandoStartingInventory", 3, + ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("Starting Equipment", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Starting Items", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Starting Songs", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::TableHeadersRow(); + ImGui::PopItemFlag(); + ImGui::TableNextRow(); + + // COLUMN 1 - STARTING EQUIPMENT + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + SohImGui::EnhancementCheckbox(Settings::StartingKokiriSword.GetName().c_str(), + "gRandomizeStartingKokiriSword"); + PaddedSeparator(); + SohImGui::EnhancementCheckbox(Settings::StartingDekuShield.GetName().c_str(), + "gRandomizeStartingDekuShield"); + + // COLUMN 2 - STARTING ITEMS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + SohImGui::EnhancementCheckbox(Settings::StartingOcarina.GetName().c_str(), "gRandomizeStartingOcarina"); + PaddedSeparator(); + SohImGui::EnhancementCheckbox(Settings::StartingConsumables.GetName().c_str(), + "gRandomizeStartingConsumables"); + PaddedSeparator(); + SohImGui::EnhancementCheckbox("Full Wallets", "gRandomizeFullWallets"); + InsertHelpHoverText("Start with a full wallet. All wallet upgrades come filled with rupees."); + + // COLUMN 3 - STARTING SONGS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::Text("Coming soon"); + + ImGui::EndTable(); + } + ImGui::PopStyleVar(1); + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); } + ImGui::PopItemFlag(); + ImGui::PopStyleVar(); + ImGui::End(); +} void CreateGetItemMessages(std::vector messageEntries) { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; From f6bb46a0dc34687050d6615ee88589f6a3f85490 Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Mon, 22 Aug 2022 03:57:55 +0200 Subject: [PATCH 154/212] FIX: Disable Draw Distance, Miniboss music could still play in DC with Lizalfos under certain conditions (#1170) Thanks @jbodner09 for the report :100: --- soh/src/code/z_actor.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 649821160..5c2ae2fff 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1195,7 +1195,8 @@ void Actor_Init(Actor* actor, GlobalContext* globalCtx) { actor->uncullZoneDownward = 700.0f; if (CVar_GetS32("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence - && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA) { // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning + && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning + && (globalCtx->sceneNum != SCENE_DDAN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room actor->uncullZoneForward = 32767.0f; actor->uncullZoneScale = 32767.0f; actor->uncullZoneDownward = 32767.0f; @@ -2766,7 +2767,8 @@ s32 func_800314D4(GlobalContext* globalCtx, Actor* actor, Vec3f* arg2, f32 arg3) if (CVar_GetS32("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence - && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA) { // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning + && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning + && (globalCtx->sceneNum != SCENE_DDAN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room return true; } From f5112a709ab8843722ec4462c79ad5811c9ff438 Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Sun, 21 Aug 2022 22:01:51 -0400 Subject: [PATCH 155/212] Add'l Console Commands (#1207) * Added console commands * Style conformance --- soh/soh/Enhancements/debugconsole.cpp | 68 +++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 7ffabf90d..409f2e4b5 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -309,6 +309,69 @@ static bool EntranceHandler(std::shared_ptr Console, const std::v gSaveContext.nextTransition = 11; } +static bool VoidHandler(std::shared_ptr Console, const std::vector& args) { + if (gGlobalCtx != nullptr) { + gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = gGlobalCtx->actorCtx.flags.tempSwch; + gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = gGlobalCtx->actorCtx.flags.tempCollect; + gSaveContext.respawnFlag = 1; + gGlobalCtx->sceneLoadFlag = 0x14; + gGlobalCtx->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex; + gGlobalCtx->fadeTransition = 2; + gSaveContext.nextTransition = 2; + } else { + SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr"); + return CMD_FAILED; + } + return CMD_SUCCESS; +} + +static bool ReloadHandler(std::shared_ptr Console, const std::vector& args) { + if (gGlobalCtx != nullptr) { + gGlobalCtx->nextEntranceIndex = gSaveContext.entranceIndex; + gGlobalCtx->sceneLoadFlag = 0x14; + gGlobalCtx->fadeTransition = 11; + gSaveContext.nextTransition = 11; + } else { + SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr"); + return CMD_FAILED; + } + return CMD_SUCCESS; +} + +static bool FWHandler(std::shared_ptr Console, const std::vector& args) { + if (gGlobalCtx != nullptr) { + if (gSaveContext.respawn[RESPAWN_MODE_TOP].data > 0) { + gGlobalCtx->sceneLoadFlag = 0x14; + gGlobalCtx->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex; + gGlobalCtx->fadeTransition = 5; + } else { + SohImGui::console->SendErrorMessage("Farore's wind not set!"); + } + } + else { + SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr"); + return CMD_FAILED; + } + + return CMD_SUCCESS; +} + +static bool FileSelectHandler(std::shared_ptr Console, const std::vector& args) { + if (gGlobalCtx != nullptr) { + SET_NEXT_GAMESTATE(&gGlobalCtx->state, FileChoose_Init, FileChooseContext); + gGlobalCtx->state.running = 0; + } else { + SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr"); + return CMD_FAILED; + } + return CMD_SUCCESS; +} + +static bool QuitHandler(std::shared_ptr Console, const std::vector& args) { + gGlobalCtx->state.running = 0; + return CMD_SUCCESS; +} + static bool SaveStateHandler(std::shared_ptr Console, const std::vector& args) { unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot(); const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::SAVE }); @@ -496,6 +559,11 @@ void DebugConsole_Init(void) { CMD_REGISTER("entrance", { EntranceHandler, "Sends player to the entered entrance (hex)", { { "entrance", Ship::ArgumentType::NUMBER } } }); + CMD_REGISTER("void", {VoidHandler, "Voids out of the current map.",}); + CMD_REGISTER("reload", {ReloadHandler, "Reloads the current map.",}); + CMD_REGISTER("file_select", {FileSelectHandler, "Returns to the file select.",}); + CMD_REGISTER("fw", {FWHandler,"Spawns the player where Farore's Wind is set.", }); + CMD_REGISTER("quit", {QuitHandler, "Quits the game.",}); CMD_REGISTER("save_state", { SaveStateHandler, "Save a state." }); CMD_REGISTER("load_state", { LoadStateHandler, "Load a state." }); From eed3942b814e2af6487807e4886b3f2b8211db1d Mon Sep 17 00:00:00 2001 From: louist103 <35883445+louist103@users.noreply.github.com> Date: Sun, 21 Aug 2022 22:11:23 -0400 Subject: [PATCH 156/212] Restore Gold skulltula CS from the "0.9" version (#1217) * GS CS * add to defaults --- libultraship/libultraship/ImGuiImpl.cpp | 2 ++ soh/include/z64player.h | 2 +- soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 660df709e..284fb8489 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1501,6 +1501,7 @@ namespace SohImGui { Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64"); PaddedEnhancementCheckbox("Bombchus out of bounds", "gBombchusOOB", true, false); Tooltip("Allows bombchus to explode out of bounds\nSimilar to GameCube and Wii VC"); + PaddedEnhancementCheckbox("Restore old Gold Skulltula cutscene", "gGsCutscene", true, false); ImGui::EndMenu(); } @@ -2266,6 +2267,7 @@ namespace SohImGui { // Bombchus out of bounds CVar_SetS32("gBombchusOOB", 0); + CVar_SetS32("gGsCutscene", 0); // Autosave CVar_SetS32("gAutosave", 0); } diff --git a/soh/include/z64player.h b/soh/include/z64player.h index a5caa174d..9fe63ab6f 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -356,7 +356,7 @@ typedef struct { /* 0x00 */ s32 active; /* 0x04 */ Vec3f tip; /* 0x10 */ Vec3f base; -} WeaponInfo; // size = 0x1C\ +} WeaponInfo; // size = 0x1C typedef enum { FLAG_NONE, diff --git a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c index 911678022..1a68dc3d5 100644 --- a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c +++ b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c @@ -331,6 +331,9 @@ s32 func_80B0C9F0(EnSw* this, GlobalContext* globalCtx) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALTU_DAMAGE); return true; } + if(CVar_GetS32("gGsCutscene", 0)) { + OnePointCutscene_Init(globalCtx, 2200, 90, &this->actor, MAIN_CAM); + } Enemy_StartFinishingBlow(globalCtx, &this->actor); if (((this->actor.params & 0xE000) >> 0xD) != 0) { this->skelAnime.playSpeed = 8.0f; From f87f63682880da147bdf997379030d208ae8ab78 Mon Sep 17 00:00:00 2001 From: InfoManiac742 <26778801+InfoManiac742@users.noreply.github.com> Date: Sun, 21 Aug 2022 19:14:05 -0700 Subject: [PATCH 157/212] Update BUILDING.md (#1228) --- BUILDING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILDING.md b/BUILDING.md index 5e4836d8e..32e682705 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -60,7 +60,7 @@ To build you'll need to follow the instructions from the building section. _Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ -_Experimental: You can also use another build system entirely rathen than MSVC like [Ninja](https://ninja-build.org/) for possibly better performance._ +_Experimental: You can also use another build system entirely rather than MSVC like [Ninja](https://ninja-build.org/) for possibly better performance._ ### Generating the distributable From d39a1a0bdfb142c61296f187689b2af916dd8d8a Mon Sep 17 00:00:00 2001 From: th-2021 <90853655+th-2021@users.noreply.github.com> Date: Mon, 22 Aug 2022 10:43:50 +0200 Subject: [PATCH 158/212] [macos] Embed dependencies for ZAPD in bundle (#1271) --- CMakeLists.txt | 5 +++++ soh/CMakeLists.txt | 8 -------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38739bc8c..5ad05e72f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,6 +195,11 @@ install(DIRECTORY ${CMAKE_BINARY_DIR}/assets PERMISSIONS ${PROGRAM_PERMISSIONS_EXECUTE} ) +install(CODE " + include(BundleUtilities) + fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/soh-macos\" \"\" \"${dirs}\") + ") + endif() if(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index d8580be4e..3179555c7 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -1983,14 +1983,6 @@ elseif(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "NintendoSwitch|CafeOS") INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION . COMPONENT ship) endif() -if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") -install(CODE " - include(InstallRequiredSystemLibraries) - include(BundleUtilities) - fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/soh-macos\" \"\" \"${dirs}\") - ") -endif() - if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS") if (NOT TARGET pathconf) add_library(pathconf OBJECT platform/pathconf.c) From 01dbfc71adbab509e756cf2082d47563e4b4c020 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 22 Aug 2022 19:32:42 -0400 Subject: [PATCH 159/212] Documents our new GiveItemEntry fuctions. --- soh/include/functions.h | 1 + soh/src/code/z_actor.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/soh/include/functions.h b/soh/include/functions.h index 66d278eb6..a336cb1ef 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -454,6 +454,7 @@ u32 Actor_TextboxIsClosing(Actor* actor, GlobalContext* globalCtx); s8 func_8002F368(GlobalContext* globalCtx); void Actor_GetScreenPos(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y); u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx); +// TODO: Rename the follwing 3 functions using whatever scheme we use when we rename func_8002F434 and func_8002F554. s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry); s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange); void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 7e92a6941..950dd2525 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1955,6 +1955,15 @@ u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx) { } } +/** + * Uses the given `GetItemEntry` to prepare the player to receive an item via the animation + * where Link holds an item over his head. This function does not require an actor for giving + * the player an item, instead setting the player as their own interactRangeActor and getItemDirection. + * + * \param globalCtx the Global Context + * \param getItemEntry the GetItemEntry for the item you want the player to receive. + * \return true if the player can receive an item, false if not. + */ s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry) { Player* player = GET_PLAYER(globalCtx); @@ -1975,6 +1984,22 @@ s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntr return false; } +/** + * Uses the given `GetItemEntry` to prepare the player to receive an item via the animation + * where Link holds an item over his head. This uses data from the actor link is receiving + * the item from to set the player's interactRangeActor and getItemDirection. It also checks + * a range from which Link must be from said actor in order to receive the item. + * + * \param actor the actor link is receiving an item from. Will usually be a chest but can also + * be an npc. + * \param globalCtx the Global Context + * \param getItemEntry the GetItemEntry for the item you want the player to receive. + * \param xzRange the distance on the x and z axes that the player can be from the target + * actor to receive the item. + * \param yRange the distance on the y axis that the player can be from the target actor + * to receive the item. + * \return true if the player can receive an item, false if not. + */ s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange) { Player* player = GET_PLAYER(globalCtx); @@ -2001,6 +2026,15 @@ s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry return false; } +/** + * Uses the given `GetItemEntry` to prepare the player to receive an item via the animation + * where Link holds an item over his head. This is a wrapper function around `GiveItemEntryFromActor` + * that supplies a fixed xzRange of 50.0f and a fixed yRange of 10.0f. + * + * \param actor the target actor that link is receiving an item from. + * \param globalCtx the Global Context + * \param getItemEntry the GetItemEntry for the item you want the player to receive. + */ void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry) { GiveItemEntryFromActor(actor, globalCtx, getItemEntry, 50.0f, 10.0f); } From 10c05892bfa9b8ad5c11884bbda8391b0f17ac98 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 22 Aug 2022 19:38:30 -0400 Subject: [PATCH 160/212] Uses more descriptive type name for ItemIDs for creating custom messages. --- soh/soh/Enhancements/custom-message/CustomMessageManager.cpp | 4 ++-- soh/soh/Enhancements/custom-message/CustomMessageManager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 7c36fe209..00c7153ea 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -47,7 +47,7 @@ void CustomMessageManager::ReplaceColors(std::string& string) { } } -void CustomMessageManager::FormatCustomMessage(std::string& message, uint16_t iid) { +void CustomMessageManager::FormatCustomMessage(std::string& message, ItemID iid) { message.insert(0, ITEM_OBTAINED(iid)); size_t start_pos = 0; std::replace(message.begin(), message.end(), '&', NEWLINE()[0]); @@ -81,7 +81,7 @@ bool CustomMessageManager::InsertCustomMessage(std::string tableID, uint16_t tex return messageInsertResult.second; } -bool CustomMessageManager::CreateGetItemMessage(std::string tableID, uint16_t giid, uint16_t iid, +bool CustomMessageManager::CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid, CustomMessageEntry messageEntry) { FormatCustomMessage(messageEntry.english, iid); FormatCustomMessage(messageEntry.german, iid); diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 76a613105..389457d00 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -89,7 +89,7 @@ class CustomMessageManager { with the provided giid (getItemID) as its key. This function also inserts the icon corresponding to the provided iid (itemID) at the beginning of each page of the textbox. */ - bool CreateGetItemMessage(std::string tableID, uint16_t giid, uint16_t iid, CustomMessageEntry messages); + bool CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid, CustomMessageEntry messages); /* Formats the provided Custom Message Entry and inserts it into the table with the provided tableID, @@ -122,7 +122,7 @@ class CustomMessageManager { & for newline, ^ for wait-for-input, and @ for the player name, as well as % for colors (i.e. %r for red and %w for white). */ - void FormatCustomMessage(std::string& message, uint16_t iid); + void FormatCustomMessage(std::string& message, ItemID iid); /* Replaces special characters and certain symbols with control codes From 3a67e2a806e2eb2a81cd0fb81c61db6579925249 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 22 Aug 2022 19:40:58 -0400 Subject: [PATCH 161/212] Fixes potential issue with if statement. --- soh/src/code/z_en_item00.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index be40d80f4..a50c74e87 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -510,8 +510,10 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { } if (!Actor_HasParent(&this->actor, globalCtx)) { - if (!gSaveContext.n64ddFlag && getItemId != GI_NONE) { - func_8002F554(&this->actor, globalCtx, getItemId); + if (!gSaveContext.n64ddFlag) { + if (getItemId != GI_NONE) { + func_8002F554(&this->actor, globalCtx, getItemId); + } } else { getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem); From 28edabdbe4bb78ad32685e374f107b9c5b34b74e Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 23 Aug 2022 00:08:22 -0400 Subject: [PATCH 162/212] Fixes missed type change. --- soh/soh/Enhancements/custom-message/CustomMessageTypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index bc56964fe..39dceea1d 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -18,7 +18,7 @@ typedef enum { typedef struct { u16 giid; - u16 iid; + ItemID iid; std::string english; std::string german; std::string french; From 2e7fd2b0beff78a400032579d284f2730835ec9a Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 23 Aug 2022 00:33:07 -0500 Subject: [PATCH 163/212] More cleanup and tweaks --- .../randomizer/randomizer_item_tracker.cpp | 289 +++++++++++------- .../randomizer/randomizer_item_tracker.h | 11 +- 2 files changed, 176 insertions(+), 124 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 78621bf78..76d28a0b7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -16,6 +16,9 @@ extern "C" { #include "functions.h" #include "macros.h" extern GlobalContext* gGlobalCtx; + +#include "textures/icon_item_static/icon_item_static.h" +#include "textures/icon_item_24_static/icon_item_24_static.h" } void DrawEquip(ItemTrackerItem item); @@ -68,19 +71,35 @@ std::vector songItems = { }; std::vector itemTrackerDungeons = { - ITEM_TRACKER_DUNGEON(SCENE_BMORI1, "FRST", true, true, true, true), - ITEM_TRACKER_DUNGEON(SCENE_HIDAN, "FIRE", true, true, true, true), - ITEM_TRACKER_DUNGEON(SCENE_MIZUSIN, "WATR", true, true, true, true), - ITEM_TRACKER_DUNGEON(SCENE_JYASINZOU, "SPRT", true, true, true, true), - ITEM_TRACKER_DUNGEON(SCENE_HAKADAN, "SHDW", true, true, true, true), - ITEM_TRACKER_DUNGEON(SCENE_HAKADANCH, "BOTW", true, true, false, true), - ITEM_TRACKER_DUNGEON(SCENE_YDAN, "DEKU", true, true, false, false), - ITEM_TRACKER_DUNGEON(SCENE_DDAN, "DCVN", true, true, false, false), - ITEM_TRACKER_DUNGEON(SCENE_BDAN, "JABU", true, true, false, false), - ITEM_TRACKER_DUNGEON(SCENE_ICE_DOUKUTO, "ICE", true, true, false, false), - ITEM_TRACKER_DUNGEON(SCENE_GANON, "GANON", false, false, true, true), - ITEM_TRACKER_DUNGEON(SCENE_MEN, "GTG", false, false, false, true), - ITEM_TRACKER_DUNGEON(SCENE_GERUDOWAY, "HIDE", false, false, false, true), + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_YDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_DDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_BDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, + // { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, // We're adding this manually for space +}; + +std::map itemTrackerDungeonShortNames = { + { SCENE_BMORI1, "FRST" }, + { SCENE_HIDAN, "FIRE" }, + { SCENE_MIZUSIN, "WATR" }, + { SCENE_JYASINZOU, "SPRT" }, + { SCENE_HAKADAN, "SHDW" }, + { SCENE_HAKADANCH, "BOTW" }, + { SCENE_YDAN, "DEKU" }, + { SCENE_DDAN, "DCVN" }, + { SCENE_BDAN, "JABU" }, + { SCENE_ICE_DOUKUTO, "ICE" }, + { SCENE_GANON, "GANON" }, + { SCENE_MEN, "GTG" }, + { SCENE_GERUDOWAY, "HIDE" }, }; std::unordered_map actualItemTrackerItemMap = { @@ -245,7 +264,7 @@ ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { } void DrawItemCount(ItemTrackerItem item) { - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); ImVec2 currentAndMax = GetItemCurrentAndMax(item); ImVec2 p = ImGui::GetCursorScreenPos(); @@ -253,7 +272,7 @@ void DrawItemCount(ItemTrackerItem item) { if (currentAndMax.x >= currentAndMax.y) { std::string currentString = std::to_string((int)currentAndMax.x); - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 10)); + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 14)); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); ImGui::Text("%d", (int)currentAndMax.x); ImGui::PopStyleColor(); @@ -261,7 +280,7 @@ void DrawItemCount(ItemTrackerItem item) { if (CVar_GetS32("gItemTrackerDisplayCurrentMax", 0) == 1) { std::string currentAndMaxString = std::to_string((int)currentAndMax.x) + "/" + std::to_string((int)currentAndMax.y); - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentAndMaxString.c_str()).x / 2), p.y - 10)); + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentAndMaxString.c_str()).x / 2), p.y - 14)); ImGui::Text("%d/", (int)currentAndMax.x); ImGui::SameLine(0, 0.0f); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); @@ -270,7 +289,7 @@ void DrawItemCount(ItemTrackerItem item) { } else { std::string currentString = std::to_string((int)currentAndMax.x); - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 10)); + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 14)); ImGui::Text("%d", (int)currentAndMax.x); } } @@ -279,7 +298,7 @@ void DrawItemCount(ItemTrackerItem item) { void DrawEquip(ItemTrackerItem item) { bool hasEquip = (item.data & gSaveContext.inventory.equipment) != 0; - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); ImGui::Image(SohImGui::GetTextureByName(hasEquip ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); @@ -288,7 +307,7 @@ void DrawEquip(ItemTrackerItem item) { void DrawQuest(ItemTrackerItem item) { bool hasQuestItem = (item.data & gSaveContext.inventory.questItems) != 0; - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); ImGui::BeginGroup(); ImGui::Image(SohImGui::GetTextureByName(hasQuestItem ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); @@ -304,14 +323,10 @@ void DrawQuest(ItemTrackerItem item) { void DrawItem(ItemTrackerItem item) { uint32_t actualItemId = INV_CONTENT(item.id); - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); bool hasItem = actualItemId != ITEM_NONE; if (item.id == ITEM_NONE) { - ImGui::BeginGroup(); - ImVec2 p = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - 10, p.y - 10)); - ImGui::EndGroup(); return; } @@ -362,7 +377,7 @@ void DrawBottle(ItemTrackerItem item) { bool hasItem = actualItemId != ITEM_NONE; const ItemTrackerItem& actualItem = actualItemTrackerItemMap[hasItem ? actualItemId : item.id]; - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); ImGui::Image(SohImGui::GetTextureByName(hasItem ? actualItem.name : actualItem.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); @@ -372,7 +387,7 @@ void DrawBottle(ItemTrackerItem item) { void DrawDungeonItem(ItemTrackerItem item) { uint32_t itemId = item.id; uint32_t bitMask = 1 << (item.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[item.data]) != 0; bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[item.data]) >= 0; ImGui::BeginGroup(); @@ -387,6 +402,20 @@ void DrawDungeonItem(ItemTrackerItem item) { if (itemId == ITEM_KEY_SMALL) { DrawItemCount(item); + + ImVec2 p = ImGui::GetCursorScreenPos(); + std::string dungeonName = itemTrackerDungeonShortNames[item.data]; + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 16))); + ImGui::Text(dungeonName.c_str()); + } + + if (itemId == ITEM_DUNGEON_MAP && + (item.data == SCENE_YDAN || item.data == SCENE_DDAN || item.data == SCENE_BDAN || item.data == SCENE_ICE_DOUKUTO) + ) { + ImVec2 p = ImGui::GetCursorScreenPos(); + std::string dungeonName = itemTrackerDungeonShortNames[item.data]; + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::Text(dungeonName.c_str()); } ImGui::EndGroup(); @@ -394,16 +423,21 @@ void DrawDungeonItem(ItemTrackerItem item) { } void DrawSong(ItemTrackerItem item) { - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); uint32_t bitMask = 1 << item.id; bool hasSong = (bitMask & gSaveContext.inventory.questItems) != 0; + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::SetCursorScreenPos(ImVec2(p.x + 6, p.y)); ImGui::Image(SohImGui::GetTextureByName(hasSong ? item.name : item.nameFaded), ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); } -void DrawNotes() { +void DrawNotes(bool resizeable = false) { ImGui::BeginGroup(); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + struct ItemTrackerNotes { static int TrackerNotesResizeCallback(ImGuiInputTextCallbackData* data) { if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) { @@ -428,9 +462,8 @@ void DrawNotes() { if (itemTrackerNotes.empty()) { itemTrackerNotes.push_back(0); } - // ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0, 0, 0, 0)); - ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y), ImGuiInputTextFlags_AllowTabInput); - // ImGui::PopStyleColor(); + ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) : ImVec2(((iconSize + iconSpacing) * 6) - 8, 200); + ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput); ImGui::EndGroup(); } @@ -452,9 +485,11 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { } ImGui::PushStyleColor(ImGuiCol_WindowBg, ChromaKeyBackground); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); } void EndFloatingWindows() { + ImGui::PopStyleVar(); ImGui::PopStyleColor(); ImGui::PopStyleColor(); ImGui::End(); @@ -465,87 +500,82 @@ void EndFloatingWindows() { * Takes in a vector of ItemTrackerItem and draws them in rows of N items */ void DrawItemsInRows(std::vector items, int columns = 6) { - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 7); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + for (int i = 0; i < items.size(); i++) { - if (i % columns == 0) { - ImGui::BeginGroup(); - } else { - ImGui::SameLine(iconSize * (i % columns)); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + iconSpacing * (i % columns)); - } + int row = i / columns; + int column = i % columns; + ImGui::SetCursorPos(ImVec2((column * (iconSize + iconSpacing) + 8), (row * (iconSize + iconSpacing)) + 8)); items[i].drawFunc(items[i]); - if (i % columns == columns - 1) { - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + iconSpacing); - } - } - if (items.size() % columns != 0) { - ImGui::EndGroup(); } } /** - * DrawDungeons + * DrawItemsInACircle + * Takes in a vector of ItemTrackerItem and draws them evenly spread across a circle + */ +void DrawItemsInACircle(std::vector items) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + + ImVec2 max = ImGui::GetWindowContentRegionMax(); + float radius = (iconSize + iconSpacing) * 2; + + for (int i = 0; i < items.size(); i++) { + float angle = (float)i / items.size() * 2.0f * M_PI; + float x = (radius / 2.0f) * cos(angle) + max.x / 2.0f; + float y = (radius / 2.0f) * sin(angle) + max.y / 2.0f; + ImGui::SetCursorPos(ImVec2(x - 14, y + 4)); + items[i].drawFunc(items[i]); + } +} + +/** + * GetDungeonItemsVector * Loops over dungeons and creates vectors of items in the correct order * to then call DrawItemsInRows */ -void DrawDungeons(std::vector dungeons, int columns = 6) { - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 7); +std::vector GetDungeonItemsVector(std::vector dungeons, int columns = 6) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); std::vector dungeonItems = {}; - if (!CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { - dungeons.erase(std::remove_if(dungeons.begin(), dungeons.end(), [](ItemTrackerDungeon d) { return !d.hasBossKey && !d.hasSmallKey; }), dungeons.end()); - } + // if (!CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { + // dungeons.erase(std::remove_if(dungeons.begin(), dungeons.end(), [](ItemTrackerDungeon d) { + // return (d.id == SCENE_YDAN || d.id == SCENE_DDAN || d.id == SCENE_BDAN || d.id == SCENE_ICE_DOUKUTO); + // }), dungeons.end()); + // } - ImGui::BeginGroup(); - ImGui::NewLine(); - for (int i = 0; i < MIN(dungeons.size(), columns); i++) { - ImGui::SameLine(iconSize * i); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + iconSpacing * i); - ImVec2 p = ImGui::GetCursorScreenPos(); - std::string dungeonName = dungeons[i].shortName; - - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - 4)); - ImGui::Text(dungeonName.c_str()); - } - ImGui::EndGroup(); - for (int i = 0; i < MIN(dungeons.size(), columns); i++) { - if (dungeons[i].hasSmallKey) { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[i].id, DrawDungeonItem)); - } else { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - } - } - for (int i = 0; i < MIN(dungeons.size(), columns); i++) { - if (dungeons[i].hasBossKey) { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, dungeons[i].id, DrawDungeonItem)); - } else { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - } - } - if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { - for (int i = 0; i < MIN(dungeons.size(), columns); i++) { - if (dungeons[i].hasMap) { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_DUNGEON_MAP, dungeons[i].id, DrawDungeonItem)); - } else { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - } - } - for (int i = 0; i < MIN(dungeons.size(), columns); i++) { - if (dungeons[i].hasCompass) { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_COMPASS, dungeons[i].id, DrawDungeonItem)); + for (int i = 0; i < dungeons[i].items.size(); i++) { + for (int j = 0; j < MIN(dungeons.size(), columns); j++) { + if (dungeons[j].items.size() > i) { + switch (dungeons[j].items[i]) { + case ITEM_KEY_SMALL: + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[j].id, DrawDungeonItem)); + break; + case ITEM_KEY_BOSS: + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, dungeons[j].id, DrawDungeonItem)); + break; + case ITEM_DUNGEON_MAP: + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_DUNGEON_MAP, dungeons[j].id, DrawDungeonItem)); + break; + case ITEM_COMPASS: + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_COMPASS, dungeons[j].id, DrawDungeonItem)); + break; + } } else { dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); } } } - DrawItemsInRows(dungeonItems, MIN(dungeons.size(), columns)); if (dungeons.size() > columns) { - DrawDungeons(std::vector(dungeons.begin() + columns, dungeons.end()), columns); + std::vector nextDungeonItems = GetDungeonItemsVector(std::vector(dungeons.begin() + columns, dungeons.end()), columns); + dungeonItems.insert(dungeonItems.end(), nextDungeonItems.begin(), nextDungeonItems.end()); } + + return dungeonItems; } /* TODO: These need to be moved to a common imgui file */ @@ -588,8 +618,8 @@ void DrawItemTracker(bool& open) { CVar_SetS32("gItemTrackerEnabled", 0); return; } - int iconSize = CVar_GetS32("gItemTrackerIconSize", 32); - int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 7); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); int comboButton1Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton1", 6)]; int comboButton2Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton2", 8)]; bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; @@ -604,30 +634,41 @@ void DrawItemTracker(bool& open) { (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) || (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 1) == 1) ) { - BeginFloatingWindows("Item Tracker##main window"); + std::vector mainWindowItems = {}; if (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) { - DrawItemsInRows(inventoryItems); + mainWindowItems.insert(mainWindowItems.end(), inventoryItems.begin(), inventoryItems.end()); } if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) { - DrawItemsInRows(equipmentItems); + mainWindowItems.insert(mainWindowItems.end(), equipmentItems.begin(), equipmentItems.end()); } if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { - DrawItemsInRows(miscItems); + mainWindowItems.insert(mainWindowItems.end(), miscItems.begin(), miscItems.end()); } if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) { if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { - ImGui::SameLine(iconSize * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + iconSpacing * 3); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); } - DrawItemsInRows(dungeonRewardStones); - DrawItemsInRows(dungeonRewardMedallions); + mainWindowItems.insert(mainWindowItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); + mainWindowItems.insert(mainWindowItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); } if (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) { - DrawItemsInRows(songItems); + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1 && CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) != 1) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + mainWindowItems.insert(mainWindowItems.end(), songItems.begin(), songItems.end()); } if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 1) { - DrawDungeons(itemTrackerDungeons); + std::vector dungeonItemsTemp = GetDungeonItemsVector(itemTrackerDungeons); + dungeonItemsTemp[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + mainWindowItems.insert(mainWindowItems.end(), dungeonItemsTemp.begin(), dungeonItemsTemp.end()); } + + BeginFloatingWindows("Item Tracker##main window"); + DrawItemsInRows(mainWindowItems, 6); + if (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 1 && CVar_GetS32("gItemTrackerDisplayType", 0) == 0) { DrawNotes(); } @@ -642,20 +683,31 @@ void DrawItemTracker(bool& open) { if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 2) { BeginFloatingWindows("Equipment Items Tracker"); - DrawItemsInRows(equipmentItems); + DrawItemsInRows(equipmentItems, 3); EndFloatingWindows(); } if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 2) { BeginFloatingWindows("Misc Items Tracker"); - DrawItemsInRows(miscItems); + DrawItemsInRows(miscItems, 4); EndFloatingWindows(); } if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 2) { BeginFloatingWindows("Dungeon Rewards Tracker"); - DrawItemsInRows(dungeonRewardStones); - DrawItemsInRows(dungeonRewardMedallions); + if (CVar_GetS32("gItemTrackerDungeonRewardsCircle", 0) == 1) { + ImGui::BeginGroup(); + DrawItemsInACircle(dungeonRewardMedallions); + ImGui::EndGroup(); + ImGui::BeginGroup(); + DrawItemsInRows(dungeonRewardStones); + ImGui::EndGroup(); + } else { + std::vector dungeonRewardItems = {}; + dungeonRewardItems.insert(dungeonRewardItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); + dungeonRewardItems.insert(dungeonRewardItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); + DrawItemsInRows(dungeonRewardItems, 3); + } EndFloatingWindows(); } @@ -668,16 +720,21 @@ void DrawItemTracker(bool& open) { if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { BeginFloatingWindows("Dungeon Items Tracker"); if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1)) { - DrawDungeons(itemTrackerDungeons, 13); + std::vector dungeonItemsTemp = GetDungeonItemsVector(itemTrackerDungeons, 12); + dungeonItemsTemp[23] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + DrawItemsInRows(dungeonItemsTemp, 12); } else { - DrawDungeons(itemTrackerDungeons); + std::vector dungeonItemsTemp = GetDungeonItemsVector(itemTrackerDungeons); + dungeonItemsTemp[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + DrawItemsInRows(dungeonItemsTemp); } EndFloatingWindows(); } if (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 2 && CVar_GetS32("gItemTrackerDisplayType", 0) == 0) { + ImGui::SetNextWindowSize(ImVec2(400,300), ImGuiCond_FirstUseEver); BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); - DrawNotes(); + DrawNotes(true); EndFloatingWindows(); } } @@ -729,8 +786,8 @@ void DrawItemTrackerOptions(bool& open) { PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode", 0); } PaddedSeparator(); - SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 32, true); - SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 7, true); + SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 36, true); + SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 12, true); PaddedEnhancementCheckbox("Display \"Current/Max\" values", "gItemTrackerDisplayCurrentMax", 0); ImGui::TableNextColumn(); @@ -739,13 +796,17 @@ void DrawItemTrackerOptions(bool& open) { LabeledComboBoxRightAligned("Equipment", "gItemTrackerEquipmentItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); LabeledComboBoxRightAligned("Misc", "gItemTrackerMiscItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); LabeledComboBoxRightAligned("Dungeon Rewards", "gItemTrackerDungeonRewardsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 2) { + PaddedEnhancementCheckbox("Circle display", "gItemTrackerDungeonRewardsCircle", 1); + } LabeledComboBoxRightAligned("Songs", "gItemTrackerSongsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); LabeledComboBoxRightAligned("Dungeon Items", "gItemTrackerDungeonItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 2); if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) != 0) { if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", 1); } - PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); + // TODO: Re-add this, kinda complicated + // PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); } if (CVar_GetS32("gItemTrackerDisplayType", 0) != 1) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h index dfdd300c0..910d1a7b7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h @@ -22,14 +22,5 @@ typedef struct ItemTrackerItem { typedef struct ItemTrackerDungeon { uint32_t id; - std::string shortName; - bool hasMap; - bool hasCompass; - bool hasBossKey; - bool hasSmallKey; + std::vector items; } ItemTrackerDungeon; - -#define ITEM_TRACKER_DUNGEON(id, shortName, hasMap, hasCompass, hasBossKey, hasSmallKey) \ - { \ - id, shortName, hasMap, hasCompass, hasBossKey, hasSmallKey \ - } From e12e1d67c61c607f58ba4972f8df8d4e26f2a5bd Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 23 Aug 2022 03:32:49 -0400 Subject: [PATCH 164/212] Prevents optimizations for debug configuration on Windows. (#1270) --- libultraship/libultraship/CMakeLists.txt | 4 ++++ soh/CMakeLists.txt | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libultraship/libultraship/CMakeLists.txt b/libultraship/libultraship/CMakeLists.txt index 297d157b1..8f365162d 100644 --- a/libultraship/libultraship/CMakeLists.txt +++ b/libultraship/libultraship/CMakeLists.txt @@ -567,6 +567,10 @@ target_include_directories(${PROJECT_NAME} PRIVATE if(MSVC) if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") target_compile_options(${PROJECT_NAME} PRIVATE + $<$: + /Od; + /Oi- + > $<$: /std:c++latest; /Oi; diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 3179555c7..e9b67408f 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -1738,15 +1738,15 @@ if(MSVC) if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") target_compile_options(${PROJECT_NAME} PRIVATE $<$: - /sdl-; - /w + /w; + /Od > $<$: /Oi; - /sdl-; /Gy; /W3 > + /sdl-; /permissive-; /MP; ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; From d0f8374c4c6c3a6622a2c999195741662d3b41ca Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 23 Aug 2022 09:42:32 +0200 Subject: [PATCH 165/212] Changed checkbox to default to on, invert logic --- libultraship/libultraship/ImGuiImpl.cpp | 5 +++-- soh/soh/OTRGlobals.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 09e67233b..5efeb2706 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -452,6 +452,7 @@ namespace SohImGui { io->ConfigFlags |= ImGuiConfigFlags_DockingEnable; io->Fonts->AddFontDefault(); statsWindowOpen = CVar_GetS32("gStatsEnabled", 0); + CVar_RegisterS32("gRandoRandomRupeeNames", 1); #ifdef __SWITCH__ Ship::Switch::SetupFont(io->Fonts); #endif @@ -1912,9 +1913,9 @@ namespace SohImGui { "(medallions/stones/songs). Note that these fanfares\n" "are longer than usual." ); - PaddedEnhancementCheckbox("Disable Random Rupee Names", "gRandoDisableRandomRupeeNames", true, false); + PaddedEnhancementCheckbox("Random Rupee Names", "gRandoRandomRupeeNames", true, false); Tooltip( - "Reverts textboxes for collecting rupees to their default state, disabling the randomization of rupee names." + "When obtaining rupees, randomize what the rupee is called in the textbox." ); ImGui::EndMenu(); } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2a5180dce..fd800464d 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1541,7 +1541,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { messageEntry = Randomizer_GetScrubMessage(textId); - } else if (!CVar_GetS32("gRandoDisableRandomRupeeNames", 0) && + } else if (CVar_GetS32("gRandoRandomRupeeNames", 0) && (textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE || textId == TEXT_HUGE_RUPEE)) { Randomizer randomizerInstance; From 35fefdecb000131cf17a2876a6e86c5d251f8aaf Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 23 Aug 2022 09:45:40 +0200 Subject: [PATCH 166/212] Changed CVar name --- libultraship/libultraship/ImGuiImpl.cpp | 4 ++-- soh/soh/OTRGlobals.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 5efeb2706..69e86a8ce 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -452,7 +452,7 @@ namespace SohImGui { io->ConfigFlags |= ImGuiConfigFlags_DockingEnable; io->Fonts->AddFontDefault(); statsWindowOpen = CVar_GetS32("gStatsEnabled", 0); - CVar_RegisterS32("gRandoRandomRupeeNames", 1); + CVar_RegisterS32("gRandomizeRupeeNames", 1); #ifdef __SWITCH__ Ship::Switch::SetupFont(io->Fonts); #endif @@ -1913,7 +1913,7 @@ namespace SohImGui { "(medallions/stones/songs). Note that these fanfares\n" "are longer than usual." ); - PaddedEnhancementCheckbox("Random Rupee Names", "gRandoRandomRupeeNames", true, false); + PaddedEnhancementCheckbox("Random Rupee Names", "gRandomizeRupeeNames", true, false); Tooltip( "When obtaining rupees, randomize what the rupee is called in the textbox." ); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index fd800464d..602f2793c 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1541,7 +1541,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { messageEntry = Randomizer_GetScrubMessage(textId); - } else if (CVar_GetS32("gRandoRandomRupeeNames", 0) && + } else if (CVar_GetS32("gRandomizeRupeeNames", 0) && (textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE || textId == TEXT_HUGE_RUPEE)) { Randomizer randomizerInstance; From 267c27036c2e334a351548e41f1b15869f57fe6a Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 23 Aug 2022 08:06:53 -0500 Subject: [PATCH 167/212] Allow aligning text to the left --- .../Enhancements/randomizer/randomizer_item_tracker.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 76d28a0b7..23c65bc13 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -271,8 +271,9 @@ void DrawItemCount(ItemTrackerItem item) { if (currentAndMax.x > 0) { if (currentAndMax.x >= currentAndMax.y) { std::string currentString = std::to_string((int)currentAndMax.x); + float x = CVar_GetS32("gItemTrackerCurrentOnLeft", 0) ? p.x : p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2); - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 14)); + ImGui::SetCursorScreenPos(ImVec2(x, p.y - 14)); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); ImGui::Text("%d", (int)currentAndMax.x); ImGui::PopStyleColor(); @@ -288,8 +289,9 @@ void DrawItemCount(ItemTrackerItem item) { ImGui::PopStyleColor(); } else { std::string currentString = std::to_string((int)currentAndMax.x); + float x = CVar_GetS32("gItemTrackerCurrentOnLeft", 0) ? p.x : p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2); - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2), p.y - 14)); + ImGui::SetCursorScreenPos(ImVec2(x, p.y - 14)); ImGui::Text("%d", (int)currentAndMax.x); } } @@ -789,6 +791,9 @@ void DrawItemTrackerOptions(bool& open) { SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 36, true); SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 12, true); PaddedEnhancementCheckbox("Display \"Current/Max\" values", "gItemTrackerDisplayCurrentMax", 0); + if (CVar_GetS32("gItemTrackerDisplayCurrentMax", 0) == 0) { + PaddedEnhancementCheckbox("Align count to left side", "gItemTrackerCurrentOnLeft", 0); + } ImGui::TableNextColumn(); From b0cdfc1be19203e6db1a209478d2c1747093e88e Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 23 Aug 2022 09:44:11 -0500 Subject: [PATCH 168/212] Only update vectors when options change --- .../randomizer/randomizer_item_tracker.cpp | 116 +++++++++++------- 1 file changed, 71 insertions(+), 45 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 23c65bc13..03451e41b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -30,6 +30,10 @@ void DrawSong(ItemTrackerItem item); OSContPad* buttonsPressed; +bool shouldUpdateVectors = true; + +std::vector mainWindowItems = {}; + std::vector inventoryItems = { ITEM_TRACKER_ITEM(ITEM_STICK, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NUT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMB, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOW, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_FIRE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_DINS_FIRE, 0, DrawItem), @@ -63,6 +67,8 @@ std::vector dungeonRewardMedallions = { ITEM_TRACKER_ITEM(QUEST_MEDALLION_SPIRIT, 1 << 3, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_SHADOW, 1 << 4, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_LIGHT, 1 << 5, DrawQuest), }; +std::vector dungeonRewards = {}; + std::vector songItems = { ITEM_TRACKER_ITEM(QUEST_SONG_LULLABY, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_EPONA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SARIA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SUN, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_TIME, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_STORMS, 0, DrawSong), @@ -102,6 +108,8 @@ std::map itemTrackerDungeonShortNames = { { SCENE_GERUDOWAY, "HIDE" }, }; +std::vector dungeonItems = {}; + std::unordered_map actualItemTrackerItemMap = { { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, @@ -592,6 +600,7 @@ void LabeledComboBoxRightAligned(const char* label, const char* cvar, std::vecto if (ImGui::Selectable(options[i].c_str())) { CVar_SetS32(cvar, i); SohImGui::needs_save = true; + shouldUpdateVectors = true; } } @@ -608,6 +617,7 @@ void PaddedEnhancementCheckbox(const char* text, const char* cvarName, s32 defau if (ImGui::Checkbox(text, &val)) { CVar_SetS32(cvarName, val); SohImGui::needs_save = true; + shouldUpdateVectors = true; } if (padBottom) { ImGui::Dummy(ImVec2(0.0f, 0.0f)); @@ -615,7 +625,61 @@ void PaddedEnhancementCheckbox(const char* text, const char* cvarName, s32 defau } /* ****************************************************** */ +void UpdateVectors() { + if (!shouldUpdateVectors) { + return; + } + + SohImGui::console->SendInfoMessage("updateVectors"); + + dungeonRewards.clear(); + dungeonRewards.insert(dungeonRewards.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); + dungeonRewards.insert(dungeonRewards.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); + + dungeonItems.clear(); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1) && CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeons, 12); + dungeonItems[23] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } else { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeons); + dungeonItems[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } + + mainWindowItems.clear(); + if (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) { + mainWindowItems.insert(mainWindowItems.end(), inventoryItems.begin(), inventoryItems.end()); + } + if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) { + mainWindowItems.insert(mainWindowItems.end(), equipmentItems.begin(), equipmentItems.end()); + } + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { + mainWindowItems.insert(mainWindowItems.end(), miscItems.begin(), miscItems.end()); + } + if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) { + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + mainWindowItems.insert(mainWindowItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); + mainWindowItems.insert(mainWindowItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); + } + if (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) { + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1 && CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) != 1) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + mainWindowItems.insert(mainWindowItems.end(), songItems.begin(), songItems.end()); + } + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 1) { + mainWindowItems.insert(mainWindowItems.end(), dungeonItems.begin(), dungeonItems.end()); + } + + shouldUpdateVectors = false; +} + void DrawItemTracker(bool& open) { + UpdateVectors(); if (!open) { CVar_SetS32("gItemTrackerEnabled", 0); return; @@ -634,40 +698,9 @@ void DrawItemTracker(bool& open) { (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) || (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) || (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) || - (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 1) == 1) + (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 1) ) { - std::vector mainWindowItems = {}; - if (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) { - mainWindowItems.insert(mainWindowItems.end(), inventoryItems.begin(), inventoryItems.end()); - } - if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) { - mainWindowItems.insert(mainWindowItems.end(), equipmentItems.begin(), equipmentItems.end()); - } - if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { - mainWindowItems.insert(mainWindowItems.end(), miscItems.begin(), miscItems.end()); - } - if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) { - if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { - mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - } - mainWindowItems.insert(mainWindowItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); - mainWindowItems.insert(mainWindowItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); - } - if (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) { - if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1 && CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) != 1) { - mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); - } - mainWindowItems.insert(mainWindowItems.end(), songItems.begin(), songItems.end()); - } - if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 1) { - std::vector dungeonItemsTemp = GetDungeonItemsVector(itemTrackerDungeons); - dungeonItemsTemp[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); - mainWindowItems.insert(mainWindowItems.end(), dungeonItemsTemp.begin(), dungeonItemsTemp.end()); - } - BeginFloatingWindows("Item Tracker##main window"); DrawItemsInRows(mainWindowItems, 6); @@ -705,10 +738,7 @@ void DrawItemTracker(bool& open) { DrawItemsInRows(dungeonRewardStones); ImGui::EndGroup(); } else { - std::vector dungeonRewardItems = {}; - dungeonRewardItems.insert(dungeonRewardItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); - dungeonRewardItems.insert(dungeonRewardItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); - DrawItemsInRows(dungeonRewardItems, 3); + DrawItemsInRows(dungeonRewards, 3); } EndFloatingWindows(); } @@ -722,13 +752,9 @@ void DrawItemTracker(bool& open) { if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { BeginFloatingWindows("Dungeon Items Tracker"); if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1)) { - std::vector dungeonItemsTemp = GetDungeonItemsVector(itemTrackerDungeons, 12); - dungeonItemsTemp[23] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); - DrawItemsInRows(dungeonItemsTemp, 12); + DrawItemsInRows(dungeonItems, 12); } else { - std::vector dungeonItemsTemp = GetDungeonItemsVector(itemTrackerDungeons); - dungeonItemsTemp[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); - DrawItemsInRows(dungeonItemsTemp); + DrawItemsInRows(dungeonItems); } EndFloatingWindows(); } @@ -748,7 +774,7 @@ void DrawItemTrackerOptions(bool& open) { return; } - ImGui::SetNextWindowSize(ImVec2(600,360), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(600,375), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Item Tracker Settings", &open, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); @@ -825,7 +851,7 @@ void DrawItemTrackerOptions(bool& open) { } void InitItemTracker() { - // TODO: We want to persist this open, but currently I'm not sure of a way to dependably wait till the textures are loaded before we draw the tracker + // TODO: We want to persist this open, but currently the tracker is crashing if it's opened to quickly on launch SohImGui::AddWindow("Randomizer", "Item Tracker", DrawItemTracker); SohImGui::AddWindow("Randomizer", "Item Tracker Settings", DrawItemTrackerOptions); float trackerBgR = CVar_GetFloat("gItemTrackerBgColorR", 0); From 20737a20451bab8e586d195c2687abea4ffac520 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 23 Aug 2022 11:46:08 -0500 Subject: [PATCH 169/212] Fix various issues including crash yay --- .../randomizer/randomizer_item_tracker.cpp | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 03451e41b..95c7a4f4d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -113,24 +113,14 @@ std::vector dungeonItems = {}; std::unordered_map actualItemTrackerItemMap = { { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BIG_POE, 0, DrawItem) }, { ITEM_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BLUE_FIRE, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BLUE_FIRE, 0, DrawItem) }, { ITEM_BUG, ITEM_TRACKER_ITEM(ITEM_BUG, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_BUGS, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BUGS, 0, DrawItem) }, { ITEM_FAIRY, ITEM_TRACKER_ITEM(ITEM_FAIRY, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_FAIRY, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_FAIRY, 0, DrawItem) }, { ITEM_FISH, ITEM_TRACKER_ITEM(ITEM_FISH, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_FISH, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_FISH, 0, DrawItem) }, { ITEM_POTION_GREEN, ITEM_TRACKER_ITEM(ITEM_POTION_GREEN, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_GREEN_POTION, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_GREEN_POTION, 0, DrawItem) }, { ITEM_POE, ITEM_TRACKER_ITEM(ITEM_POE, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_POE, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_POE, 0, DrawItem) }, { ITEM_POTION_RED, ITEM_TRACKER_ITEM(ITEM_POTION_RED, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_RED_POTION, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_RED_POTION, 0, DrawItem) }, { ITEM_POTION_BLUE, ITEM_TRACKER_ITEM(ITEM_POTION_BLUE, 0, DrawItem) }, - { ITEM_BOTTLE_WITH_BLUE_POTION, ITEM_TRACKER_ITEM(ITEM_BOTTLE_WITH_BLUE_POTION, 0, DrawItem) }, - { ITEM_MILK, ITEM_TRACKER_ITEM(ITEM_MILK, 0, DrawItem) }, { ITEM_MILK_BOTTLE, ITEM_TRACKER_ITEM(ITEM_MILK_BOTTLE, 0, DrawItem) }, { ITEM_MILK_HALF, ITEM_TRACKER_ITEM(ITEM_MILK_HALF, 0, DrawItem) }, { ITEM_LETTER_RUTO, ITEM_TRACKER_ITEM(ITEM_LETTER_RUTO, 0, DrawItem) }, @@ -197,6 +187,11 @@ std::vector buttonMap = { BTN_DRIGHT }; +bool IsValidSaveFile() { + bool validSave = gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2; + return validSave; +} + ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { ImVec2 result = { 0, 0 }; @@ -276,6 +271,12 @@ void DrawItemCount(ItemTrackerItem item) { ImVec2 currentAndMax = GetItemCurrentAndMax(item); ImVec2 p = ImGui::GetCursorScreenPos(); + if (!IsValidSaveFile()) { + ImGui::SetCursorScreenPos(ImVec2(p.x, p.y - 14)); + ImGui::Text(""); + return; + } + if (currentAndMax.x > 0) { if (currentAndMax.x >= currentAndMax.y) { std::string currentString = std::to_string((int)currentAndMax.x); @@ -309,7 +310,7 @@ void DrawItemCount(ItemTrackerItem item) { void DrawEquip(ItemTrackerItem item) { bool hasEquip = (item.data & gSaveContext.inventory.equipment) != 0; int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); - ImGui::Image(SohImGui::GetTextureByName(hasEquip ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); SetLastItemHoverText(SohUtils::GetItemName(item.id)); @@ -319,7 +320,7 @@ void DrawQuest(ItemTrackerItem item) { bool hasQuestItem = (item.data & gSaveContext.inventory.questItems) != 0; int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); ImGui::BeginGroup(); - ImGui::Image(SohImGui::GetTextureByName(hasQuestItem ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); if (item.id == QUEST_SKULL_TOKEN) { @@ -373,7 +374,7 @@ void DrawItem(ItemTrackerItem item) { } ImGui::BeginGroup(); - ImGui::Image(SohImGui::GetTextureByName(hasItem ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); DrawItemCount(item); @@ -386,12 +387,15 @@ void DrawBottle(ItemTrackerItem item) { uint32_t actualItemId = gSaveContext.inventory.items[SLOT(item.id) + item.data]; bool hasItem = actualItemId != ITEM_NONE; - const ItemTrackerItem& actualItem = actualItemTrackerItemMap[hasItem ? actualItemId : item.id]; + if (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end()) { + item = actualItemTrackerItemMap[actualItemId]; + } + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); - ImGui::Image(SohImGui::GetTextureByName(hasItem ? actualItem.name : actualItem.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(actualItem.id)); + SetLastItemHoverText(SohUtils::GetItemName(item.id)); }; void DrawDungeonItem(ItemTrackerItem item) { @@ -402,11 +406,11 @@ void DrawDungeonItem(ItemTrackerItem item) { bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[item.data]) >= 0; ImGui::BeginGroup(); if (itemId == ITEM_KEY_SMALL) { - ImGui::Image(SohImGui::GetTextureByName(hasSmallKey ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } else { - ImGui::Image(SohImGui::GetTextureByName(hasItem ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } @@ -438,7 +442,7 @@ void DrawSong(ItemTrackerItem item) { bool hasSong = (bitMask & gSaveContext.inventory.questItems) != 0; ImVec2 p = ImGui::GetCursorScreenPos(); ImGui::SetCursorScreenPos(ImVec2(p.x + 6, p.y)); - ImGui::Image(SohImGui::GetTextureByName(hasSong ? item.name : item.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasSong && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); } @@ -630,8 +634,6 @@ void UpdateVectors() { return; } - SohImGui::console->SendInfoMessage("updateVectors"); - dungeonRewards.clear(); dungeonRewards.insert(dungeonRewards.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); dungeonRewards.insert(dungeonRewards.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); @@ -851,8 +853,7 @@ void DrawItemTrackerOptions(bool& open) { } void InitItemTracker() { - // TODO: We want to persist this open, but currently the tracker is crashing if it's opened to quickly on launch - SohImGui::AddWindow("Randomizer", "Item Tracker", DrawItemTracker); + SohImGui::AddWindow("Randomizer", "Item Tracker", DrawItemTracker, CVar_GetS32("gItemTrackerEnabled", 0) == 1); SohImGui::AddWindow("Randomizer", "Item Tracker Settings", DrawItemTrackerOptions); float trackerBgR = CVar_GetFloat("gItemTrackerBgColorR", 0); float trackerBgG = CVar_GetFloat("gItemTrackerBgColorG", 0); From 50b3038a136d8836cefa8a950724238ad857a5f8 Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 23 Aug 2022 22:14:13 +0200 Subject: [PATCH 170/212] Made functions static --- soh/soh/Enhancements/randomizer/randomizer.cpp | 10 +++++----- soh/soh/Enhancements/randomizer/randomizer.h | 4 ++-- soh/soh/OTRGlobals.cpp | 3 +-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index e32a60dd1..482cd6227 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4649,7 +4649,7 @@ void CreateRupeeMessages() { } } -std::string Randomizer::Randomizer_InsertRupeeName(std::string message, int language) { +std::string Randomizer::InsertRupeeName(std::string message, int language) { const char* englishRupeeNames[44] = { "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", @@ -4690,12 +4690,12 @@ std::string Randomizer::Randomizer_InsertRupeeName(std::string message, int lang return message; } -CustomMessageEntry Randomizer::Randomizer_GetRupeeMessage(u16 rupeeTextId) { +CustomMessageEntry Randomizer::GetRupeeMessage(u16 rupeeTextId) { CustomMessageEntry messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); - messageEntry.english = Randomizer::Randomizer_InsertRupeeName(messageEntry.english, LANGUAGE_ENG); - messageEntry.german = Randomizer::Randomizer_InsertRupeeName(messageEntry.german, LANGUAGE_GER); - messageEntry.french = Randomizer::Randomizer_InsertRupeeName(messageEntry.french, LANGUAGE_FRA); + messageEntry.english = Randomizer::InsertRupeeName(messageEntry.english, LANGUAGE_ENG); + messageEntry.german = Randomizer::InsertRupeeName(messageEntry.german, LANGUAGE_GER); + messageEntry.french = Randomizer::InsertRupeeName(messageEntry.french, LANGUAGE_FRA); return messageEntry; } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 9ec983e14..645c47bc5 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -48,8 +48,8 @@ class Randomizer { GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); static void CreateCustomMessages(); - std::string Randomizer_InsertRupeeName(std::string message, int language); - CustomMessageEntry Randomizer_GetRupeeMessage(u16 rupeeTextId); + static std::string InsertRupeeName(std::string message, int language); + static CustomMessageEntry GetRupeeMessage(u16 rupeeTextId); }; #ifdef __cplusplus diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 602f2793c..183f99957 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1544,8 +1544,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } else if (CVar_GetS32("gRandomizeRupeeNames", 0) && (textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE || textId == TEXT_HUGE_RUPEE)) { - Randomizer randomizerInstance; - messageEntry = randomizerInstance.Randomizer_GetRupeeMessage(textId); + messageEntry = Randomizer::GetRupeeMessage(textId); } } if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) { From 2283471b7bc876e6eb9e475ec3b183f55c2b22b0 Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 23 Aug 2022 22:23:01 +0200 Subject: [PATCH 171/212] %RUPEE% -> #RUPEE# --- soh/soh/Enhancements/randomizer/randomizer.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 482cd6227..4d6c41c60 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4628,16 +4628,16 @@ void CreateRupeeMessages() { for (u8 rupee : rupees) { switch (rupee) { case TEXT_BLUE_RUPEE: - rupeeText = "\x05\x03 5 %RUPEE%\x05\x00"; + rupeeText = "\x05\x03 5 #RUPEE#\x05\x00"; break; case TEXT_RED_RUPEE: - rupeeText = "\x05\x01 20 %RUPEE%\x05\x00"; + rupeeText = "\x05\x01 20 #RUPEE#\x05\x00"; break; case TEXT_PURPLE_RUPEE: - rupeeText = "\x05\x05 50 %RUPEE%\x05\x00"; + rupeeText = "\x05\x05 50 #RUPEE#\x05\x00"; break; case TEXT_HUGE_RUPEE: - rupeeText = "\x05\x06 200 %RUPEE%\x05\x00"; + rupeeText = "\x05\x06 200 #RUPEE#\x05\x00"; break; } customMessageManager->CreateMessage(Randomizer::rupeeMessageTableID, rupee, @@ -4682,7 +4682,7 @@ std::string Randomizer::InsertRupeeName(std::string message, int language) { replaceWith = frenchRupeeNames[randomIndex]; break; } - std::string replaceString = "%RUPEE%"; + std::string replaceString = "#RUPEE#"; size_t pos = message.find(replaceString); size_t len = replaceString.length(); message.replace(pos, len, replaceWith); From ed1708508a81ed8004045185dc1e229265d01cf1 Mon Sep 17 00:00:00 2001 From: th-2021 <90853655+th-2021@users.noreply.github.com> Date: Tue, 23 Aug 2022 22:29:28 +0200 Subject: [PATCH 172/212] add SHIP_HOME (Linux) (#1210) --- libultraship/libultraship/Window.cpp | 6 ++++++ scripts/linux/appimage/soh.sh | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 591d926e0..81ccb68cc 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -316,6 +316,12 @@ namespace Ship { return fpath; #endif +#ifdef __linux__ + char* fpath = std::getenv("SHIP_HOME"); + if (fpath != NULL) + return std::string(fpath); +#endif + return "."; } diff --git a/scripts/linux/appimage/soh.sh b/scripts/linux/appimage/soh.sh index f3b563cc7..120d775c0 100644 --- a/scripts/linux/appimage/soh.sh +++ b/scripts/linux/appimage/soh.sh @@ -5,14 +5,18 @@ export PATH="$HERE"/bin:"$HERE"/usr/bin:"$PATH" export LD_LIBRARY_PATH="$HERE"/usr/lib:"$LD_LIBRARY_PATH" export ZENITY=$(command -v zenity) -while [[ ! -e "$PWD"/oot.otr ]]; do +if [ -z ${SHIP_HOME+x} ]; then +export SHIP_HOME=$PWD +fi + +while [[ ! -e "$SHIP_HOME"/oot.otr ]]; do export ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)" ln -s "$HERE"/usr/bin/{assets,soh.elf,OTRGui} "$ASSETDIR" export OLDPWD="$PWD" mkdir -p "$ASSETDIR"/tmp mkdir -p "$ASSETDIR"/Extract/assets - if [ -e "$PWD"/*.*64 ]; then - ln -s "$OLDPWD"/*.*64 "$ASSETDIR"/tmp/rom.z64 + if [ -e "$SHIP_HOME"/*.*64 ]; then + ln -s "$SHIP_HOME"/*.*64 "$ASSETDIR"/tmp/rom.z64 cp -r "$ASSETDIR"/assets/game/ship_of_harkinian "$ASSETDIR"/Extract/assets/ cd "$ASSETDIR" ROMHASH=$(sha1sum -b "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }') @@ -36,22 +40,19 @@ while [[ ! -e "$PWD"/oot.otr ]]; do echo "Processing..." fi assets/extractor/ZAPD.out ed -eh -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR > /dev/null 2>&1 - cp "$ASSETDIR"/oot.otr "$OLDPWD" + cp "$ASSETDIR"/oot.otr "$SHIP_HOME" echo "Restart $APPIMAGE to play!" sleep 3 rm -r "$ASSETDIR" break else if [ -n "$ZENITY" ]; then - zenity --error --timeout=5 --text="Place ROM in $OWD" --title="Missing ROM file" --width=500 --width=200 + zenity --error --timeout=5 --text="Place ROM in $SHIP_HOME" --title="Missing ROM file" --width=500 --width=200 else echo -e "\nPlace ROM in this folder\n" fi exit fi done - cd "$OWD" - ln -s "$HERE"/usr/bin/gamecontrollerdb.txt "$PWD" - "$HERE"/usr/bin/soh.elf - unlink "$PWD"/gamecontrollerdb.txt + (cd "$HERE/usr/bin"; ./soh.elf) exit From 694c643aee163df01de8dab8bf3c64be359220f1 Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 23 Aug 2022 22:35:26 +0200 Subject: [PATCH 173/212] Include missing files in CMakeLists.txt --- soh/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 93586ce55..b56f782e9 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -110,6 +110,9 @@ set(Header_Files__include "include/ichain.h" "include/macro.inc" "include/macros.h" + "include/message_data_fmt.h" + "include/message_data_static.h" + "include/message_data_textbox_types.h" #"include/math_n64.h" "include/regs.h" "include/segment_symbols.h" From e8c25fe5283fb4c5dcf0a8229442d5159cd32141 Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 23 Aug 2022 22:43:09 +0200 Subject: [PATCH 174/212] Matched CMakeLists.txt spacing --- soh/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index b56f782e9..2826690a2 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -110,9 +110,9 @@ set(Header_Files__include "include/ichain.h" "include/macro.inc" "include/macros.h" - "include/message_data_fmt.h" - "include/message_data_static.h" - "include/message_data_textbox_types.h" + "include/message_data_fmt.h" + "include/message_data_static.h" + "include/message_data_textbox_types.h" #"include/math_n64.h" "include/regs.h" "include/segment_symbols.h" From e2633c9be10375c98dede3146659063937d0275f Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 23 Aug 2022 23:36:59 +0200 Subject: [PATCH 175/212] Moved name variables out of InsertRupeeName() --- .../Enhancements/randomizer/randomizer.cpp | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4d6c41c60..a0d7a42d4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -28,6 +28,27 @@ const std::string Randomizer::hintMessageTableID = "RandomizerHints"; const std::string Randomizer::scrubMessageTableID = "RandomizerScrubs"; const std::string Randomizer::rupeeMessageTableID = "RandomizerRupees"; +static const char* englishRupeeNames[44] = { + "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", + "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", + "Dogecoin", "Mushrooms", "Experience", "Friends", "Coins", "Rings", "Gil", "Pokédollars", + "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", "Smackaroos", "Zorkmids", + "Zenny", "Bones", "Souls", "Studs", "Munny", "Rubies", "Gald", "Gold", + "Shillings", "Pounds", "Glimmer", "Potch" +}; + +static const char* germanRupeeNames[1] = { + "Rubine" +}; + +static const char* frenchRupeeNames[36] = { + "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", "Diamants", + "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", + "Pokédollars", "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", + "Champignons", "Blés", "Halos", "Munnies", "Orens", "Florens", "Crédits", "Galds", + "Bling", "Orbes", "Baguettes", "Croissants" +}; + Randomizer::Randomizer() { Sprite bowSprite = { dgFairyBowIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b, 0 }; gSeedTextures[0] = bowSprite; @@ -4650,22 +4671,6 @@ void CreateRupeeMessages() { } std::string Randomizer::InsertRupeeName(std::string message, int language) { - const char* englishRupeeNames[44] = { - "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", "Lemmings", - "Emeralds", "Bucks", "Rubles", "Diamonds", "Moons", "Stars", "Mana", "Doll Hairs", - "Dogecoin", "Mushrooms", "Experience", "Friends", "Coins", "Rings", "Gil", "Pokédollars", - "Bells", "Orbs", "Bottle Caps", "Simoleons", "Pokémon", "Toys", "Smackaroos", "Zorkmids", - "Zenny", "Bones", "Souls", "Studs", "Munny", "Rubies", "Gald", "Gold", - "Shillings", "Pounds", "Glimmer", "Potch" - }; - const char* germanRupeeNames[1] = { "Rubine" }; - const char* frenchRupeeNames[36] = { - "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", "Diamants", - "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", - "Pokédollars", "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", - "Champignons", "Blés", "Halos", "Munnies", "Orens", "Florens", "Crédits", "Galds", - "Bling", "Orbes", "Baguettes", "Croissants" - }; int randomIndex; std::string replaceWith; switch (language) { From 168e84498f55a494af21d5a10028d9d550f52681 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 23 Aug 2022 20:11:38 -0400 Subject: [PATCH 176/212] Rework Get Item Table to be more flexible for adding custom items (#1050) * Adds ItemTableManager class. * Implements new getItem table in game. * Adds rando item table and way to differentiate tables in GetItemEntry. * Adds rough ability to differentiate between rando and vanilla items.merge stashed changes from before develop-zhora merge * Change ItemTableID to be uint16_t so we can use ModIndex for it. * Should fix switch build * Should fix switch build pt 2 * Adds new files to CMakeLists. * Implements fixes for competing getItem calls. * Correctly renders freestanding items Particle effects are probably broken, need to fix them still, I pretty much know how I would do that. * Fixed Particle effects in the new getItem system. * Fixes item fanfares * Partially fixes Ice Traps Obtaining a freestanding Ice Trap causes link to slide forward and receiving one from an NPC plays the sound effect and damage animation but doesn't freeze link. * Some more partial ice trap fixing that wasn't pushed earlier * Removes unused function override * Replaces ::find with ::at and adds exception handling * Removes some commented out code. * Refactors rando's GetItemEntry array into two arrays. One array is for the vanilla items that don't have GetItemEntries in vanilla, the other is for rando exclusive items. They are stored in separate arrays before getting added to the table so that we can apply different modIndexes. The items in the first table have are handled by the vanilla Item_Give, and the second table needed a custom `Randomizer_Item_Give` function. * Renames, relocates, and implements ModIndex enum. * Removes now unused ItemIDs and GetItemIDs Also makes all the necessary changes to other code that was still using them indirectly through the GI to GID map that was removed. There's quite a lot of changes here and I haven't had time to test them yet. * Re-implements GIMESSAGE_UNTRANSLATED as macro * Removes commented out function. * Throws exception if an invalid itemID is used Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943694857 * Removes ARRAY_SIZE in favor of ARRAY_COUNT ARRAY_COUNT already exists in `macros.h`, I just didn't find it before. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943153833 * Inverts CheckContainsRandoItem to CheckContainsVanillaItem. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940895135 * Cleanup, bugfixes, removing the `- 1`s from `z_player.c` * Fixes some funky formatting that got committed earlier. * Adds else if to added fanfare sound cases. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940112924 and https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940113492 * Extends GetItemEntry to include getItemId Also adapts some existing calls for both the entry and the id to only get the entry. * Extends GetItemEntry to include GID. This allows for using it later when drawing freestanding items. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943168136 * Rando-specific items use new textId again. This got lost when merging develop-zhora in because I didn't have custom messages merged when I started this. * Sets global modIndex to MOD_NONE on scene load Fixes a crash when buying items in shops due to them not triggering the rando code that normally sets these items. May have also been crashing vanilla playthroughs. * Realized I had the bgm conditions wrong. * Fixes "static drops" (i.e. sticks from withered babas) * Fixes LACS/Prelude situation... again. * Fixes too many arguments error. Not sure why this didn't fail to build on Windows before. * Fixes Link's Pocket items. * Simplifies sram init for rando-specific items * Fixes issues with approaching bottleable items. * Fixes Ruto's Letter. It was accidentally getting classified as a rando item. * Should re-fix freestanding ice traps * Makes freestanding items set player->getItemEntry. This prevents freestanding items from setting the global modIndex. This is part of a larger transition that needs to happen to switch to setting getItemEntries for all of the rando items. This prevents some things that set getItemId of GI_MAX from granting a Fire Medallion when the global modIndex is MOD_RANDOMIZER. * Makes sure we aren't using getItemEntry when not randoed. * Replace Randomizer_GetRandomizedItemId with Randomizer_GetRandomizedItem and Randomizer_GetItemIdFromKnownCheck with Randomizer_GetItemFromKnownCheck * Introduce some new methods and migrate most actors to them * Fixes ocarina game skull kids to set player->getItemEntry * Sets `z_en_box.c` to set `player->getItemEntry` * Fix logical errors and migrate most of the rest of the rando checks to GiveItemEntryFromActor * Use GiveItemEntryFromActorWithFixedRange in item00 * Fixes Anju to set player->getItemEntry. * Add a few missing cases * Additional fix for Skull Kid * Fixes vanilla ice traps and randomized ice smoke * Fixes rendering of treasure chest game items. * Removes unused `Randomizer_GetItemIdFromGetItemId`. * Cleans up an if statement for item00. * Cleans up another if statement in item00 * This should fix a bug with the Gerudo Archery minigame. I wasn't able to get the bug to happen after making this change. * Documents our new GiveItemEntry fuctions. * Uses more descriptive type name for ItemIDs for creating custom messages. * Fixes potential issue with if statement. * Fixes missed type change. Co-authored-by: Garrett Cox --- soh/CMakeLists.txt | 16 + soh/include/functions.h | 7 +- soh/include/z64item.h | 51 +- soh/include/z64player.h | 5 +- .../custom-message/CustomMessageManager.cpp | 6 +- .../custom-message/CustomMessageManager.h | 2 +- .../custom-message/CustomMessageTypes.h | 2 +- .../item-tables/ItemTableManager.cpp | 42 ++ .../item-tables/ItemTableManager.h | 23 + .../Enhancements/item-tables/ItemTableTypes.h | 25 + .../Enhancements/randomizer/randomizer.cpp | 521 ++++++++---------- soh/soh/Enhancements/randomizer/randomizer.h | 5 +- .../Enhancements/randomizer/randomizerTypes.h | 10 +- soh/soh/OTRGlobals.cpp | 187 ++++++- soh/soh/OTRGlobals.h | 11 +- soh/soh/z_play_otr.cpp | 1 + soh/src/code/z_actor.c | 104 +++- soh/src/code/z_en_item00.c | 128 +++-- soh/src/code/z_parameter.c | 142 ++--- soh/src/code/z_play.c | 27 +- soh/src/code/z_sram.c | 207 ++++--- .../ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c | 4 +- .../overlays/actors/ovl_Demo_Im/z_demo_im.c | 4 +- .../actors/ovl_Door_Warp1/z_door_warp1.c | 4 +- soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c | 16 +- .../ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c | 24 +- .../ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h | 1 + soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 28 +- .../ovl_En_Diving_Game/z_en_diving_game.c | 14 +- soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c | 13 +- .../actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c | 6 +- soh/src/overlays/actors/ovl_En_Du/z_en_du.c | 7 +- .../actors/ovl_En_Ex_Item/z_en_ex_item.c | 53 +- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c | 21 +- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h | 1 + soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c | 4 +- soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c | 14 +- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 29 +- soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 14 +- soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c | 14 +- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 14 +- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 26 +- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h | 1 + soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 21 +- soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h | 1 + soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 13 +- soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 12 +- soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c | 14 +- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 26 +- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.h | 1 + .../ovl_En_Okarina_Tag/z_en_okarina_tag.c | 4 +- soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c | 6 +- soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 37 +- soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c | 18 +- .../ovl_En_Syateki_Man/z_en_syateki_man.c | 19 +- .../ovl_En_Syateki_Man/z_en_syateki_man.h | 1 + soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 14 +- soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 24 +- soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c | 4 +- .../overlays/actors/ovl_Fishing/z_fishing.c | 30 +- .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 12 +- .../ovl_Item_Etcetera/z_item_etcetera.c | 43 +- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 20 +- .../actors/ovl_player_actor/z_player.c | 372 +++++-------- 64 files changed, 1439 insertions(+), 1087 deletions(-) create mode 100644 soh/soh/Enhancements/item-tables/ItemTableManager.cpp create mode 100644 soh/soh/Enhancements/item-tables/ItemTableManager.h create mode 100644 soh/soh/Enhancements/item-tables/ItemTableTypes.h diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index e9b67408f..50bf5fa69 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -218,6 +218,7 @@ set(Header_Files__soh__Enhancements__randomizer__3drando "soh/Enhancements/randomizer/3drando/trial.hpp" "soh/Enhancements/randomizer/3drando/utils.hpp" ) + source_group("Header Files\\soh\\Enhancements\\randomizer\\3drando" FILES ${Header_Files__soh__Enhancements__randomizer__3drando}) set(Header_Files__soh__Enhancements__custom_message @@ -227,6 +228,13 @@ set(Header_Files__soh__Enhancements__custom_message source_group("Header Files\\soh\\Enhancements\\custom-message" FILES ${Header_Files__soh__Enhancements__custom_message}) +set(Header_Files__soh__Enhancements__item_tables + "soh/Enhancements/item-tables/ItemTableManager.h" + "soh/Enhancements/item-tables/ItemTableTypes.h" +) + +source_group("Header Files\\soh\\Enhancements\\item-tables" FILES ${Header_Files__soh__Enhancements__item_tables}) + set(Source_Files__soh "soh/GbiWrap.cpp" "soh/OTRAudio.h" @@ -349,6 +357,12 @@ set(Source_Files__soh__Enhancements__custom_message source_group("Source Files\\soh\\Enhancements\\custom-message" FILES ${Source_Files__soh__Enhancements__custom_message}) +set(Source_Files__soh__Enhancements__item_tables + "soh/Enhancements/item-tables/ItemTableManager.cpp" +) + +source_group("Source Files\\soh\\Enhancements\\item-tables" FILES ${Source_Files__soh__Enhancements__item_tables}) + set(Source_Files__src__boot "src/boot/assert.c" "src/boot/boot_main.c" @@ -1558,6 +1572,7 @@ set(ALL_FILES ${Header_Files__soh__Enhancements__debugger} ${Header_Files__soh__Enhancements__randomizer} ${Header_Files__soh__Enhancements__randomizer__3drando} + ${Header_Files__soh__Enhancements__item_tables} ${Header_Files__soh__Enhancements__custom_message} ${Source_Files__soh} ${Source_Files__soh__Enhancements} @@ -1568,6 +1583,7 @@ set(ALL_FILES ${Source_Files__soh__Enhancements__randomizer__3drando} ${Source_Files__soh__Enhancements__randomizer__3drando__hint_list} ${Source_Files__soh__Enhancements__randomizer__3drando__location_access} + ${Source_Files__soh__Enhancements__item_tables} ${Source_Files__soh__Enhancements__custom_message} ${Source_Files__src__boot} ${Source_Files__src__buffers} diff --git a/soh/include/functions.h b/soh/include/functions.h index bd5203790..a336cb1ef 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -10,6 +10,7 @@ extern "C" #endif #include "../../libultraship/libultraship/luslog.h" +#include #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) @@ -453,7 +454,10 @@ u32 Actor_TextboxIsClosing(Actor* actor, GlobalContext* globalCtx); s8 func_8002F368(GlobalContext* globalCtx); void Actor_GetScreenPos(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y); u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx); -s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId); +// TODO: Rename the follwing 3 functions using whatever scheme we use when we rename func_8002F434 and func_8002F554. +s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry); +s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange); +void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry); s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange); void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId); void func_8002F580(Actor* actor, GlobalContext* globalCtx); @@ -1050,6 +1054,7 @@ void Interface_LoadItemIcon1(GlobalContext* globalCtx, u16 button); void Interface_LoadItemIcon2(GlobalContext* globalCtx, u16 button); void func_80084BF4(GlobalContext* globalCtx, u16 flag); u8 Item_Give(GlobalContext* globalCtx, u8 item); +u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry); u8 Item_CheckObtainability(u8 item); void Inventory_DeleteItem(u16 item, u16 invSlot); s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u16 oldItem, u16 newItem); diff --git a/soh/include/z64item.h b/soh/include/z64item.h index 9e78487db..65f6e93d9 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -244,15 +244,6 @@ typedef enum { /* 0x99 */ ITEM_STICK_UPGRADE_30, /* 0x9A */ ITEM_NUT_UPGRADE_30, /* 0x9B */ ITEM_NUT_UPGRADE_40, - /* 0x9C */ ITEM_BOTTLE_WITH_RED_POTION, - /* 0x9D */ ITEM_BOTTLE_WITH_GREEN_POTION, - /* 0x9E */ ITEM_BOTTLE_WITH_BLUE_POTION, - /* 0x9F */ ITEM_BOTTLE_WITH_FAIRY, - /* 0xA0 */ ITEM_BOTTLE_WITH_FISH, - /* 0xA1 */ ITEM_BOTTLE_WITH_BLUE_FIRE, - /* 0xA2 */ ITEM_BOTTLE_WITH_BUGS, - /* 0xA3 */ ITEM_BOTTLE_WITH_POE, - /* 0xA4 */ ITEM_BOTTLE_WITH_BIG_POE, /* 0xFC */ ITEM_LAST_USED = 0xFC, /* 0xFE */ ITEM_NONE_FE = 0xFE, /* 0xFF */ ITEM_NONE = 0xFF @@ -388,47 +379,7 @@ typedef enum { /* 0x7A */ GI_NUT_UPGRADE_40, /* 0x7B */ GI_BULLET_BAG_50, /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest - /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) - - /* 0x7E */ GI_MEDALLION_LIGHT, - /* 0x7F */ GI_MEDALLION_FOREST, - /* 0x80 */ GI_MEDALLION_FIRE, - /* 0x81 */ GI_MEDALLION_WATER, - /* 0x82 */ GI_MEDALLION_SHADOW, - /* 0x83 */ GI_MEDALLION_SPIRIT, - - /* 0x81 */ GI_STONE_KOKIRI, - /* 0x82 */ GI_STONE_GORON, - /* 0x83 */ GI_STONE_ZORA, - - /* 0x81 */ GI_ZELDAS_LULLABY, - /* 0x82 */ GI_SUNS_SONG, - /* 0x83 */ GI_EPONAS_SONG, - /* 0x81 */ GI_SONG_OF_STORMS, - /* 0x82 */ GI_SONG_OF_TIME, - /* 0x83 */ GI_SARIAS_SONG, - - /* 0x81 */ GI_MINUET_OF_FOREST, - /* 0x82 */ GI_BOLERO_OF_FIRE, - /* 0x83 */ GI_SERENADE_OF_WATER, - /* 0x81 */ GI_NOCTURNE_OF_SHADOW, - /* 0x82 */ GI_REQUIEM_OF_SPIRIT, - /* 0x83 */ GI_PRELUDE_OF_LIGHT, - - GI_SINGLE_MAGIC, - GI_DOUBLE_MAGIC, - GI_DOUBLE_DEFENSE, - - GI_BOTTLE_WITH_RED_POTION, - GI_BOTTLE_WITH_GREEN_POTION, - GI_BOTTLE_WITH_BLUE_POTION, - GI_BOTTLE_WITH_FAIRY, - GI_BOTTLE_WITH_FISH, - GI_BOTTLE_WITH_BLUE_FIRE, - GI_BOTTLE_WITH_BUGS, - GI_BOTTLE_WITH_POE, - GI_BOTTLE_WITH_BIG_POE, - + /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) /* 0x84 */ GI_MAX } GetItemID; diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 9fe63ab6f..64ea713d2 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -2,6 +2,7 @@ #define Z64PLAYER_H #include "z64actor.h" +#include "soh/Enhancements/item-tables/ItemTableTypes.h" struct Player; @@ -364,6 +365,7 @@ typedef enum { FLAG_SCENE_TREASURE, FLAG_SCENE_CLEAR, FLAG_SCENE_COLLECTIBLE, + FLAG_EVENT_CHECK_INF, } FlagType; typedef struct { @@ -627,6 +629,7 @@ typedef struct Player { /* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position /* 0x0A94 */ PendingFlag pendingFlag; /* 0x0AA0 */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still? -} Player; // size = 0xAA1 + /* 0x0AA1 */ GetItemEntry getItemEntry; +} Player; // size = 0xAA9 #endif diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 8a42bef95..00c7153ea 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -1,5 +1,6 @@ #include "CustomMessageManager.h" #include +#include using namespace std::literals::string_literals; @@ -80,9 +81,8 @@ bool CustomMessageManager::InsertCustomMessage(std::string tableID, uint16_t tex return messageInsertResult.second; } - - -bool CustomMessageManager::CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messageEntry) { +bool CustomMessageManager::CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid, + CustomMessageEntry messageEntry) { FormatCustomMessage(messageEntry.english, iid); FormatCustomMessage(messageEntry.german, iid); FormatCustomMessage(messageEntry.french, iid); diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 0681073b8..389457d00 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -89,7 +89,7 @@ class CustomMessageManager { with the provided giid (getItemID) as its key. This function also inserts the icon corresponding to the provided iid (itemID) at the beginning of each page of the textbox. */ - bool CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messages); + bool CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid, CustomMessageEntry messages); /* Formats the provided Custom Message Entry and inserts it into the table with the provided tableID, diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index d2f30f123..4da1f0f3f 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -17,7 +17,7 @@ typedef enum { #ifdef __cplusplus typedef struct { - GetItemID giid; + u16 giid; ItemID iid; std::string english; std::string german; diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.cpp b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp new file mode 100644 index 000000000..57f6464e3 --- /dev/null +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.cpp @@ -0,0 +1,42 @@ +#include "ItemTableManager.h" +#include + +ItemTableManager::ItemTableManager() { +} + +ItemTableManager::~ItemTableManager() { + this->itemTables.clear(); +} + +bool ItemTableManager::AddItemTable(uint16_t tableID) { + ItemTable newItemTable; + return itemTables.emplace(tableID, newItemTable).second; +} + +bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry) { + try { + ItemTable* itemTable = RetrieveItemTable(tableID); + return itemTable->emplace(getItemID, getItemEntry).second; + } catch (const std::out_of_range& oor) { return false; } +} + +GetItemEntry ItemTableManager::RetrieveItemEntry(uint16_t tableID, uint16_t itemID) { + try { + ItemTable* itemTable = RetrieveItemTable(tableID); + return itemTable->at(itemID); + } catch (std::out_of_range& oor) { return GET_ITEM_NONE; } +} + +bool ItemTableManager::ClearItemTable(uint16_t tableID) { + try { + ItemTable* itemTable = RetrieveItemTable(tableID); + itemTable->clear(); + return true; + } catch (const std::out_of_range& oor) { return false; } +} + +ItemTable* ItemTableManager::RetrieveItemTable(uint16_t tableID) { + try { + return &itemTables.at(tableID); + } catch (const std::out_of_range& oor) { throw(oor); } +} diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h new file mode 100644 index 000000000..622782265 --- /dev/null +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -0,0 +1,23 @@ +#pragma once +#include "ItemTableTypes.h" +#include "z64item.h" + +#include + +typedef std::unordered_map ItemTable; + +class ItemTableManager { + public: + static ItemTableManager* Instance; + ItemTableManager(); + ~ItemTableManager(); + bool AddItemTable(uint16_t tableID); + bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry); + GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t itemID); + bool ClearItemTable(uint16_t tableID); + + private: + std::unordered_map itemTables; + + ItemTable* RetrieveItemTable(uint16_t tableID); +}; diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h new file mode 100644 index 000000000..7e5f1a9a3 --- /dev/null +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -0,0 +1,25 @@ +#pragma once +#ifdef __cplusplus +#include +#endif + +#define CHEST_ANIM_SHORT 0 +#define CHEST_ANIM_LONG 1 + +#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \ + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true } + +#define GET_ITEM_NONE \ + { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false } + +typedef struct { + /* 0x00 */ uint16_t itemId; + /* 0x01 */ uint16_t field; // various bit-packed data + /* 0x02 */ int16_t gi; // defines the draw id and chest opening animation + /* 0x03 */ uint16_t textId; + /* 0x04 */ uint16_t objectId; + /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? + /* 0x08 */ int16_t getItemId; + /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. + /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. +} GetItemEntry; // size = 0x0F diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 759658e3a..1fc95a04f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -15,6 +15,8 @@ #include "Lib/ImGui/imgui_internal.h" #include #include +#include +#include using json = nlohmann::json; using namespace std::literals::string_literals; @@ -806,202 +808,6 @@ std::unordered_map SpoilerfileCheckNameToEnum = { { "ZR Open Grotto Gossip Stone", RC_ZR_OPEN_GROTTO_GOSSIP_STONE } }; -std::unordered_map getItemIdToItemId = { - { GI_BOW, ITEM_BOW }, - { GI_ARROW_FIRE, ITEM_ARROW_FIRE }, - { GI_DINS_FIRE, ITEM_DINS_FIRE }, - { GI_SLINGSHOT, ITEM_SLINGSHOT }, - { GI_OCARINA_FAIRY, ITEM_OCARINA_FAIRY }, - { GI_OCARINA_OOT, ITEM_OCARINA_TIME }, - { GI_HOOKSHOT, ITEM_HOOKSHOT }, - { GI_LONGSHOT, ITEM_LONGSHOT }, - { GI_ARROW_ICE, ITEM_ARROW_ICE }, - { GI_FARORES_WIND, ITEM_FARORES_WIND }, - { GI_BOOMERANG, ITEM_BOOMERANG }, - { GI_LENS, ITEM_LENS }, - { GI_HAMMER, ITEM_HAMMER }, - { GI_ARROW_LIGHT, ITEM_ARROW_LIGHT }, - { GI_NAYRUS_LOVE, ITEM_NAYRUS_LOVE }, - { GI_BOTTLE, ITEM_BOTTLE }, - { GI_POTION_RED, ITEM_POTION_RED }, - { GI_POTION_GREEN, ITEM_POTION_GREEN }, - { GI_POTION_BLUE, ITEM_POTION_BLUE }, - { GI_FAIRY, ITEM_FAIRY }, - { GI_FISH, ITEM_FISH }, - { GI_MILK_BOTTLE, ITEM_MILK_BOTTLE }, - { GI_LETTER_RUTO, ITEM_LETTER_RUTO }, - { GI_BLUE_FIRE, ITEM_BLUE_FIRE }, - { GI_BUGS, ITEM_BUG }, - { GI_BIG_POE, ITEM_BIG_POE }, - { GI_POE, ITEM_POE }, - { GI_WEIRD_EGG, ITEM_WEIRD_EGG }, - { GI_LETTER_ZELDA, ITEM_LETTER_ZELDA }, - { GI_POCKET_EGG, ITEM_POCKET_EGG }, - { GI_COJIRO, ITEM_COJIRO }, - { GI_ODD_MUSHROOM, ITEM_ODD_MUSHROOM }, - { GI_ODD_POTION, ITEM_ODD_POTION }, - { GI_SAW, ITEM_SAW }, - { GI_SWORD_BROKEN, ITEM_SWORD_BROKEN }, - { GI_PRESCRIPTION, ITEM_PRESCRIPTION }, - { GI_FROG, ITEM_FROG }, - { GI_EYEDROPS, ITEM_EYEDROPS }, - { GI_CLAIM_CHECK, ITEM_CLAIM_CHECK } -}; - -std::unordered_map itemIdToModel = { { GI_NONE, GID_MAXIMUM }, - { GI_BOMBS_5, GID_BOMB }, - { GI_NUTS_5, GID_NUTS }, - { GI_BOMBCHUS_10, GID_BOMBCHU }, - { GI_BOW, GID_BOW }, - { GI_SLINGSHOT, GID_SLINGSHOT }, - { GI_BOOMERANG, GID_BOOMERANG }, - { GI_STICKS_1, GID_STICK }, - { GI_HOOKSHOT, GID_HOOKSHOT }, - { GI_LONGSHOT, GID_LONGSHOT }, - { GI_LENS, GID_LENS }, - { GI_LETTER_ZELDA, GID_LETTER_ZELDA }, - { GI_OCARINA_OOT, GID_OCARINA_TIME }, - { GI_HAMMER, GID_HAMMER }, - { GI_COJIRO, GID_COJIRO }, - { GI_LETTER_RUTO, GID_LETTER_RUTO }, - { GI_LETTER_RUTO, GID_LETTER_RUTO }, - { GI_BOTTLE, GID_BOTTLE }, - { GI_POTION_RED, GID_POTION_RED }, - { GI_POTION_GREEN, GID_POTION_GREEN }, - { GI_POTION_BLUE, GID_POTION_BLUE }, - { GI_FAIRY, GID_FAIRY }, - { GI_MILK_BOTTLE, GID_MILK }, - { GI_LETTER_RUTO, GID_LETTER_RUTO }, - { GI_BEAN, GID_BEAN }, - { GI_MASK_SKULL, GID_MASK_SKULL }, - { GI_MASK_SPOOKY, GID_MASK_SPOOKY }, - { GI_CHICKEN, GID_CHICKEN }, - { GI_MASK_KEATON, GID_MASK_KEATON }, - { GI_MASK_BUNNY, GID_MASK_BUNNY }, - { GI_MASK_TRUTH, GID_MASK_TRUTH }, - { GI_POCKET_EGG, GID_EGG }, - { GI_POCKET_CUCCO, GID_CHICKEN }, - { GI_ODD_MUSHROOM, GID_ODD_MUSHROOM }, - { GI_ODD_POTION, GID_ODD_POTION }, - { GI_SAW, GID_SAW }, - { GI_SWORD_BROKEN, GID_SWORD_BROKEN }, - { GI_PRESCRIPTION, GID_PRESCRIPTION }, - { GI_FROG, GID_FROG }, - { GI_EYEDROPS, GID_EYEDROPS }, - { GI_CLAIM_CHECK, GID_CLAIM_CHECK }, - { GI_SWORD_KOKIRI, GID_SWORD_KOKIRI }, - { GI_SWORD_KNIFE, GID_SWORD_BGS }, - { GI_SHIELD_DEKU, GID_SHIELD_DEKU }, - { GI_SHIELD_HYLIAN, GID_SHIELD_HYLIAN }, - { GI_SHIELD_MIRROR, GID_SHIELD_MIRROR }, - { GI_TUNIC_GORON, GID_TUNIC_GORON }, - { GI_TUNIC_ZORA, GID_TUNIC_ZORA }, - { GI_BOOTS_IRON, GID_BOOTS_IRON }, - { GI_BOOTS_HOVER, GID_BOOTS_HOVER }, - { GI_QUIVER_40, GID_QUIVER_40 }, - { GI_QUIVER_50, GID_QUIVER_50 }, - { GI_BOMB_BAG_20, GID_BOMB_BAG_20 }, - { GI_BOMB_BAG_30, GID_BOMB_BAG_30 }, - { GI_BOMB_BAG_40, GID_BOMB_BAG_40 }, - { GI_GAUNTLETS_SILVER, GID_GAUNTLETS_SILVER }, - { GI_GAUNTLETS_GOLD, GID_GAUNTLETS_GOLD }, - { GI_SCALE_SILVER, GID_SCALE_SILVER }, - { GI_SCALE_GOLD, GID_SCALE_GOLDEN }, - { GI_STONE_OF_AGONY, GID_STONE_OF_AGONY }, - { GI_GERUDO_CARD, GID_GERUDO_CARD }, - { GI_OCARINA_FAIRY, GID_OCARINA_FAIRY }, - { GI_SEEDS_5, GID_SEEDS }, - { GI_HEART_CONTAINER, GID_HEART_CONTAINER }, - { GI_HEART_PIECE, GID_HEART_PIECE }, - { GI_KEY_BOSS, GID_KEY_BOSS }, - { GI_COMPASS, GID_COMPASS }, - { GI_MAP, GID_DUNGEON_MAP }, - { GI_KEY_SMALL, GID_KEY_SMALL }, - { GI_MAGIC_SMALL, GID_MAGIC_SMALL }, - { GI_MAGIC_LARGE, GID_MAGIC_LARGE }, - { GI_WALLET_ADULT, GID_WALLET_ADULT }, - { GI_WALLET_GIANT, GID_WALLET_GIANT }, - { GI_WEIRD_EGG, GID_EGG }, - { GI_HEART, GID_HEART }, - { GI_ARROWS_SMALL, GID_ARROWS_SMALL }, - { GI_ARROWS_MEDIUM, GID_ARROWS_MEDIUM }, - { GI_ARROWS_LARGE, GID_ARROWS_LARGE }, - { GI_RUPEE_GREEN, GID_RUPEE_GREEN }, - { GI_RUPEE_BLUE, GID_RUPEE_BLUE }, - { GI_RUPEE_RED, GID_RUPEE_RED }, - { GI_HEART_CONTAINER_2, GI_HEART_CONTAINER_2 }, - { GI_MILK, GID_MILK }, - { GI_MASK_GORON, GID_MASK_GORON }, - { GI_MASK_ZORA, GID_MASK_ZORA }, - { GI_MASK_GERUDO, GID_MASK_GERUDO }, - { GI_BRACELET, GID_BRACELET }, - { GI_RUPEE_PURPLE, GID_RUPEE_PURPLE }, - { GI_RUPEE_GOLD, GID_RUPEE_GOLD }, - { GI_SWORD_BGS, GID_SWORD_BGS }, - { GI_ARROW_FIRE, GID_ARROW_FIRE }, - { GI_ARROW_ICE, GID_ARROW_ICE }, - { GI_ARROW_LIGHT, GID_ARROW_LIGHT }, - { GI_SKULL_TOKEN, GID_SKULL_TOKEN }, - { GI_DINS_FIRE, GID_DINS_FIRE }, - { GI_FARORES_WIND, GID_FARORES_WIND }, - { GI_NAYRUS_LOVE, GID_NAYRUS_LOVE }, - { GI_BULLET_BAG_30, GID_BULLET_BAG }, - { GI_BULLET_BAG_40, GID_BULLET_BAG }, - { GI_STICKS_5, GID_STICK }, - { GI_STICKS_10, GID_STICK }, - { GI_NUTS_5_2, GID_NUTS }, - { GI_NUTS_10, GID_NUTS }, - { GI_BOMBS_1, GID_BOMB }, - { GI_BOMBS_10, GID_BOMB }, - { GI_BOMBS_20, GID_BOMB }, - { GI_BOMBS_30, GID_BOMB }, - { GI_SEEDS_30, GID_SEEDS }, - { GI_BOMBCHUS_5, GID_BOMBCHU }, - { GI_BOMBCHUS_20, GID_BOMBCHU }, - { GI_FISH, GID_FISH }, - { GI_BUGS, GID_BUG }, - { GI_BLUE_FIRE, GID_BLUE_FIRE }, - { GI_POE, GID_POE }, - { GI_BIG_POE, GID_BIG_POE }, - { GI_DOOR_KEY, GID_KEY_SMALL }, - { GI_RUPEE_GREEN_LOSE, GID_RUPEE_GREEN }, - { GI_RUPEE_BLUE_LOSE, GID_RUPEE_BLUE }, - { GI_RUPEE_RED_LOSE, GID_RUPEE_RED }, - { GI_RUPEE_PURPLE_LOSE, GID_RUPEE_PURPLE }, - { GI_HEART_PIECE_WIN, GID_HEART_PIECE }, - { GI_STICK_UPGRADE_20, GID_STICK }, - { GI_STICK_UPGRADE_30, GID_STICK }, - { GI_NUT_UPGRADE_30, GID_NUTS }, - { GI_NUT_UPGRADE_40, GID_NUTS }, - { GI_BULLET_BAG_50, GID_BULLET_BAG_50 }, - { GI_ZELDAS_LULLABY, GID_SONG_ZELDA }, - { GI_EPONAS_SONG, GID_SONG_EPONA }, - { GI_SARIAS_SONG, GID_SONG_SARIA }, - { GI_SUNS_SONG, GID_SONG_SUN }, - { GI_SONG_OF_TIME, GID_SONG_TIME }, - { GI_SONG_OF_STORMS, GID_SONG_STORM }, - { GI_MINUET_OF_FOREST, GID_SONG_MINUET }, - { GI_BOLERO_OF_FIRE, GID_SONG_BOLERO }, - { GI_SERENADE_OF_WATER, GID_SONG_SERENADE }, - { GI_REQUIEM_OF_SPIRIT, GID_SONG_REQUIEM }, - { GI_NOCTURNE_OF_SHADOW, GID_SONG_NOCTURNE }, - { GI_PRELUDE_OF_LIGHT, GID_SONG_PRELUDE }, - { GI_DOUBLE_DEFENSE, GID_HEART_CONTAINER }, - { GI_STONE_KOKIRI, GID_KOKIRI_EMERALD }, - { GI_STONE_GORON, GID_GORON_RUBY }, - { GI_STONE_ZORA, GID_ZORA_SAPPHIRE }, - { GI_MEDALLION_FOREST, GID_MEDALLION_FOREST }, - { GI_MEDALLION_FIRE, GID_MEDALLION_FIRE }, - { GI_MEDALLION_WATER, GID_MEDALLION_WATER }, - { GI_MEDALLION_SPIRIT, GID_MEDALLION_SPIRIT }, - { GI_MEDALLION_SHADOW, GID_MEDALLION_SHADOW }, - { GI_MEDALLION_LIGHT, GID_MEDALLION_LIGHT }, - { GI_SINGLE_MAGIC, GID_MAGIC_SMALL }, - { GI_DOUBLE_MAGIC, GID_MAGIC_LARGE }, - { GI_ICE_TRAP, GID_RUPEE_GOLD }, - { GI_ICE_TRAP, GID_MAXIMUM }, - { GI_TEXT_0, GID_MAXIMUM } }; - std::unordered_map SpoilerfileGetNameToEnum = { { "No Item", RG_NONE }, { "Rien", RG_NONE }, @@ -1418,18 +1224,6 @@ std::unordered_map SpoilerfileSettingNameToEn { "Timesaver Settings:Skip Tower Escape", RSK_SKIP_TOWER_ESCAPE } }; -s32 Randomizer::GetItemIDFromGetItemID(s32 getItemId) { - if (getItemIdToItemId.count(getItemId) == 0) { - return -1; - } - - return getItemIdToItemId[getItemId]; -} - -s16 Randomizer::GetItemModelFromId(s16 itemId) { - return itemIdToModel[itemId]; -} - std::string sanitize(std::string stringValue) { // Add backslashes. for (auto i = stringValue.begin();;) { @@ -2008,14 +1802,13 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_MAGIC_BEAN_PACK: return GI_BEAN; //todo make it 10 of them - case RG_DOUBLE_DEFENSE: - return GI_DOUBLE_DEFENSE; - case RG_WEIRD_EGG: return GI_WEIRD_EGG; case RG_ZELDAS_LETTER: return GI_LETTER_ZELDA; + case RG_RUTOS_LETTER: + return GI_LETTER_RUTO; case RG_POCKET_EGG: return GI_POCKET_EGG; @@ -2138,9 +1931,9 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_PROGRESSIVE_MAGIC_METER: switch (gSaveContext.magicLevel) { case 0: - return GI_SINGLE_MAGIC; + return (GetItemID)RG_MAGIC_SINGLE; case 1: - return GI_DOUBLE_MAGIC; + return (GetItemID)RG_MAGIC_DOUBLE; } return GI_RUPEE_BLUE; @@ -2160,52 +1953,6 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) return GI_BOTTLE; case RG_BOTTLE_WITH_MILK: return GI_MILK_BOTTLE; - case RG_BOTTLE_WITH_RED_POTION: - return GI_BOTTLE_WITH_RED_POTION; - case RG_BOTTLE_WITH_GREEN_POTION: - return GI_BOTTLE_WITH_GREEN_POTION; - case RG_BOTTLE_WITH_BLUE_POTION: - return GI_BOTTLE_WITH_BLUE_POTION; - case RG_BOTTLE_WITH_FAIRY: - return GI_BOTTLE_WITH_FAIRY; - case RG_BOTTLE_WITH_FISH: - return GI_BOTTLE_WITH_FISH; - case RG_BOTTLE_WITH_BLUE_FIRE: - return GI_BOTTLE_WITH_BLUE_FIRE; - case RG_BOTTLE_WITH_BUGS: - return GI_BOTTLE_WITH_BUGS; - case RG_BOTTLE_WITH_POE: - return GI_BOTTLE_WITH_POE; - case RG_RUTOS_LETTER: - return GI_LETTER_RUTO; - case RG_BOTTLE_WITH_BIG_POE: - return GI_BOTTLE_WITH_BIG_POE; - - case RG_ZELDAS_LULLABY: - return GI_ZELDAS_LULLABY; - case RG_EPONAS_SONG: - return GI_EPONAS_SONG; - case RG_SARIAS_SONG: - return GI_SARIAS_SONG; - case RG_SUNS_SONG: - return GI_SUNS_SONG; - case RG_SONG_OF_TIME: - return GI_SONG_OF_TIME; - case RG_SONG_OF_STORMS: - return GI_SONG_OF_STORMS; - - case RG_MINUET_OF_FOREST: - return GI_MINUET_OF_FOREST; - case RG_BOLERO_OF_FIRE: - return GI_BOLERO_OF_FIRE; - case RG_SERENADE_OF_WATER: - return GI_SERENADE_OF_WATER; - case RG_REQUIEM_OF_SPIRIT: - return GI_REQUIEM_OF_SPIRIT; - case RG_NOCTURNE_OF_SHADOW: - return GI_NOCTURNE_OF_SHADOW; - case RG_PRELUDE_OF_LIGHT: - return GI_PRELUDE_OF_LIGHT; // todo implement dungeon-specific maps/compasses case RG_DEKU_TREE_MAP: @@ -2268,26 +2015,6 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_GANONS_CASTLE_KEY_RING: return GI_RUPEE_BLUE; - case RG_KOKIRI_EMERALD: - return GI_STONE_KOKIRI; - case RG_GORON_RUBY: - return GI_STONE_GORON; - case RG_ZORA_SAPPHIRE: - return GI_STONE_ZORA; - - case RG_FOREST_MEDALLION: - return GI_MEDALLION_FOREST; - case RG_FIRE_MEDALLION: - return GI_MEDALLION_FIRE; - case RG_WATER_MEDALLION: - return GI_MEDALLION_WATER; - case RG_SPIRIT_MEDALLION: - return GI_MEDALLION_SPIRIT; - case RG_SHADOW_MEDALLION: - return GI_MEDALLION_SHADOW; - case RG_LIGHT_MEDALLION: - return GI_MEDALLION_LIGHT; - case RG_RECOVERY_HEART: return GI_HEART; @@ -2307,10 +2034,6 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_HEART_CONTAINER: // todo figure out what GI_HEART_CONTAINER_2 is return GI_HEART_CONTAINER; - - case RG_ICE_TRAP: - return GI_ICE_TRAP; - case RG_MILK: return GI_MILK; //todo logic around needing a bottle? @@ -2365,11 +2088,138 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) case RG_HINT: return GI_RUPEE_BLUE; //todo - default: + default: { + if (!IsItemVanilla(randoGet)) { + return (GetItemID)randoGet; + } return ogItemId; + } } } +bool Randomizer::IsItemVanilla(RandomizerGet randoGet) { + switch (randoGet) { + case RG_NONE: + case RG_KOKIRI_SWORD: + case RG_GIANTS_KNIFE: + case RG_BIGGORON_SWORD: + case RG_DEKU_SHIELD: + case RG_HYLIAN_SHIELD: + case RG_MIRROR_SHIELD: + case RG_GORON_TUNIC: + case RG_ZORA_TUNIC: + case RG_IRON_BOOTS: + case RG_HOVER_BOOTS: + case RG_BOOMERANG: + case RG_LENS_OF_TRUTH: + case RG_MEGATON_HAMMER: + case RG_STONE_OF_AGONY: + case RG_DINS_FIRE: + case RG_FARORES_WIND: + case RG_NAYRUS_LOVE: + case RG_FIRE_ARROWS: + case RG_ICE_ARROWS: + case RG_LIGHT_ARROWS: + case RG_GERUDO_MEMBERSHIP_CARD: + case RG_MAGIC_BEAN: + case RG_WEIRD_EGG: + case RG_ZELDAS_LETTER: + case RG_RUTOS_LETTER: + case RG_POCKET_EGG: + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + case RG_GOLD_SKULLTULA_TOKEN: + case RG_PROGRESSIVE_HOOKSHOT: + case RG_PROGRESSIVE_STRENGTH: + case RG_PROGRESSIVE_BOMB_BAG: + case RG_PROGRESSIVE_BOW: + case RG_PROGRESSIVE_SLINGSHOT: + case RG_PROGRESSIVE_WALLET: + case RG_PROGRESSIVE_SCALE: + case RG_PROGRESSIVE_NUT_UPGRADE: + case RG_PROGRESSIVE_STICK_UPGRADE: + case RG_PROGRESSIVE_BOMBCHUS: + case RG_PROGRESSIVE_OCARINA: + case RG_PROGRESSIVE_GORONSWORD: + case RG_EMPTY_BOTTLE: + case RG_BOTTLE_WITH_MILK: + case RG_RECOVERY_HEART: + case RG_GREEN_RUPEE: + case RG_BLUE_RUPEE: + case RG_RED_RUPEE: + case RG_PURPLE_RUPEE: + case RG_HUGE_RUPEE: + case RG_PIECE_OF_HEART: + case RG_HEART_CONTAINER: + case RG_MILK: + case RG_BOMBS_5: + case RG_BOMBS_10: + case RG_BOMBS_20: + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + case RG_BOMBCHU_DROP: + case RG_ARROWS_5: + case RG_ARROWS_10: + case RG_ARROWS_30: + case RG_DEKU_NUTS_5: + case RG_DEKU_NUTS_10: + case RG_DEKU_SEEDS_30: + case RG_DEKU_STICK_1: + case RG_RED_POTION_REFILL: + case RG_GREEN_POTION_REFILL: + case RG_BLUE_POTION_REFILL: + case RG_TREASURE_GAME_HEART: + case RG_TREASURE_GAME_GREEN_RUPEE: + case RG_BUY_DEKU_NUT_5: + case RG_BUY_ARROWS_30: + case RG_BUY_ARROWS_50: + case RG_BUY_BOMBS_525: + case RG_BUY_DEKU_NUT_10: + case RG_BUY_DEKU_STICK_1: + case RG_BUY_BOMBS_10: + case RG_BUY_FISH: + case RG_BUY_RED_POTION_30: + case RG_BUY_GREEN_POTION: + case RG_BUY_BLUE_POTION: + case RG_BUY_HYLIAN_SHIELD: + case RG_BUY_DEKU_SHIELD: + case RG_BUY_GORON_TUNIC: + case RG_BUY_ZORA_TUNIC: + case RG_BUY_HEART: + case RG_BUY_BOMBCHU_10: + case RG_BUY_BOMBCHU_20: + case RG_BUY_BOMBCHU_5: + case RG_BUY_DEKU_SEEDS_30: + case RG_SOLD_OUT: + case RG_BUY_BLUE_FIRE: + case RG_BUY_BOTTLE_BUG: + case RG_BUY_POE: + case RG_BUY_FAIRYS_SPIRIT: + case RG_BUY_ARROWS_10: + case RG_BUY_BOMBS_20: + case RG_BUY_BOMBS_30: + case RG_BUY_BOMBS_535: + case RG_BUY_RED_POTION_40: + case RG_BUY_RED_POTION_50: + return true; + default: + return false; + } +} + +bool Randomizer::CheckContainsVanillaItem(RandomizerCheck randoCheck) { + RandomizerGet randoGet = this->itemLocations[randoCheck]; + return IsItemVanilla(randoGet); +} + std::string Randomizer::GetAdultAltarText() const { return this->adultAltarText; } @@ -4738,31 +4588,116 @@ void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). const std::vector getItemMessages = { - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, "You got a %rBig Poe in a Bottle%w!&Sell it to the Ghost Shop!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, "You got a %rBottle of Blue Potion%w!&Drink it to replenish your&%ghealth%w and %bmagic%w!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_FISH, ITEM_FISH, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_FISH, ITEM_FISH, "You got a %rFish in a Bottle%w!&It looks fresh and delicious!&They say Jabu-Jabu loves them!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_BUGS, ITEM_BUG, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_BUGS, ITEM_BUG, "You got a %rBug in a Bottle%w!&They love to burrow in&dirt holes!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_FAIRY, ITEM_FAIRY, "You got a %rFairy in a Bottle%w!&Use it wisely!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY, "You got a %rFairy in a Bottle%w!&Use it wisely!"), + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, "You got a %rBottle of Red Potion%w!&Drink it to replenish your&%ghealth%w!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, "You got a %rBottle of Green Potion%w!&Drink it to replenish your&%bmagic%w!"), - GIMESSAGE_UNTRANSLATED(GI_BOTTLE_WITH_POE, ITEM_POE, + GIMESSAGE_UNTRANSLATED(RG_BOTTLE_WITH_POE, ITEM_POE, "You got a %rPoe in a Bottle%w!&That creepy Ghost Shop might&be interested in this..."), }; CreateGetItemMessages(getItemMessages); CreateScrubMessages(); } +class ExtendedVanillaTableInvalidItemIdException: public std::exception { + private: + s16 itemID; + + public: + ExtendedVanillaTableInvalidItemIdException(s16 itemID): itemID(itemID) {} + std::string what() { + return itemID + " is not a valid ItemID for the extendedVanillaGetItemTable. If you are adding a new" + "item, try adding it to randoGetItemTable instead."; + } +}; + +void InitRandoItemTable() { + // These entries have ItemIDs from vanilla, but not GetItemIDs or entries in the old sGetItemTable + GetItemEntry extendedVanillaGetItemTable[] = { + GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_LIGHT_MEDALLION), + GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG, + MOD_NONE, RG_FOREST_MEDALLION), + GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_FIRE_MEDALLION), + GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_WATER_MEDALLION), + GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG, + MOD_NONE, RG_SHADOW_MEDALLION), + GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG, + MOD_NONE, RG_SPIRIT_MEDALLION), + + GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_KOKIRI_EMERALD), + GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_GORON_RUBY), + GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_ZORA_SAPPHIRE), + + GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_ZELDAS_LULLABY), + GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SUNS_SONG), + GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_EPONAS_SONG), + GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SONG_OF_STORMS), + GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SONG_OF_TIME), + GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SARIAS_SONG), + + GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_MINUET_OF_FOREST), + GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_BOLERO_OF_FIRE), + GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_SERENADE_OF_WATER), + GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_NOCTURNE_OF_SHADOW), + GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_REQUIEM_OF_SPIRIT), + GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, MOD_NONE, RG_PRELUDE_OF_LIGHT), + }; + + // These do not have ItemIDs or GetItemIDs from vanilla, so I'm using their + // RandomizerGet enum values for both. + GetItemEntry randoGetItemTable[] = { + GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0, 0x80, CHEST_ANIM_SHORT, MOD_RANDOMIZER, RG_ICE_TRAP), + GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, + RG_MAGIC_SINGLE), + GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, + RG_MAGIC_DOUBLE), + GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, MOD_RANDOMIZER, + RG_DOUBLE_DEFENSE), + + GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_RED_POTION), + GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_GREEN_POTION), + GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_POTION), + GET_ITEM(RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_FAIRY), + GET_ITEM(RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_FISH), + GET_ITEM(RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_FIRE), + GET_ITEM(RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_BUGS), + GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, + MOD_RANDOMIZER, RG_BOTTLE_WITH_POE), + GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, + CHEST_ANIM_LONG, MOD_RANDOMIZER, RG_BOTTLE_WITH_BIG_POE), + }; + ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); + for (int i = 0; i < ARRAY_COUNT(extendedVanillaGetItemTable); i++) { + ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, extendedVanillaGetItemTable[i].getItemId, extendedVanillaGetItemTable[i]); + } + for (int i = 0; i < ARRAY_COUNT(randoGetItemTable); i++) { + ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); + } +} + + void InitRando() { SohImGui::AddWindow("Randomizer", "Randomizer Settings", DrawRandoEditor); Randomizer::CreateCustomMessages(); + InitRandoItemTable(); } extern "C" { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 1994cfdc4..f6aa8279a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -21,6 +21,8 @@ class Randomizer { void ParseRandomizerSettingsFile(const char* spoilerFileName); void ParseHintLocationsFile(const char* spoilerFileName); void ParseItemLocationsFile(const char* spoilerFileName, bool silent); + bool IsItemVanilla(RandomizerGet randoGet); + public: Randomizer(); @@ -38,7 +40,7 @@ class Randomizer { void LoadHintLocations(const char* spoilerFileName); void LoadItemLocations(const char* spoilerFileName, bool silent); u8 GetRandoSettingValue(RandomizerSettingKey randoSettingKey); - RandomizerCheck GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); + RandomizerCheck GetCheckFromActor(s16 sceneNum, s16 actorId, s16 actorParams); std::string GetChildAltarText() const; std::string GetAdultAltarText() const; std::string GetGanonText() const; @@ -46,6 +48,7 @@ class Randomizer { GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); static void CreateCustomMessages(); + bool CheckContainsVanillaItem(RandomizerCheck randoCheck); }; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 551966828..55e28845c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1,5 +1,10 @@ #pragma once +// This should probably go in a less rando-specific location +// but the best location will probably be in the modding engine +// which doesn't exist yet. +typedef enum { MOD_NONE, MOD_RANDOMIZER } ModIndex; + typedef struct { char tex[512]; uint16_t width; @@ -806,6 +811,8 @@ typedef enum { RG_PROGRESSIVE_STICK_UPGRADE, RG_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_MAGIC_METER, + RG_MAGIC_SINGLE, // Added for refactor of GetItemEntries + RG_MAGIC_DOUBLE, // Added for refactor of GetItemEntries RG_PROGRESSIVE_OCARINA, RG_PROGRESSIVE_GORONSWORD, RG_EMPTY_BOTTLE, @@ -947,7 +954,8 @@ typedef enum { RG_BUY_RED_POTION_40, RG_BUY_RED_POTION_50, RG_TRIFORCE, - RG_HINT + RG_HINT, + RG_MAX } RandomizerGet; typedef enum { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index e83695fc0..cdab324d4 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -60,10 +60,12 @@ #include #include #include +#include OTRGlobals* OTRGlobals::Instance; SaveManager* SaveManager::Instance; CustomMessageManager* CustomMessageManager::Instance; +ItemTableManager* ItemTableManager::Instance; OTRGlobals::OTRGlobals() { context = Ship::Window::CreateInstance("Ship of Harkinian"); @@ -160,6 +162,145 @@ extern "C" void OTRAudio_Exit() { audio.thread.join(); } +extern "C" void VanillaItemTable_Init() { + GetItemEntry getItemTable[] = { + GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_5), + GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5), + GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_10), + GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOW), + GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SLINGSHOT), + GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOMERANG), + GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_1), + GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HOOKSHOT), + GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LONGSHOT), + GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LENS), + GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_ZELDA), + GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_OOT), + GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HAMMER), + GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COJIRO), + GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOTTLE), + GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_RED), + GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_GREEN), + GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_BLUE), + GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FAIRY), + GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK_BOTTLE), + GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_RUTO), + GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BEAN), + GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SKULL), + GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SPOOKY), + GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CHICKEN), + GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_KEATON), + GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_BUNNY), + GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_TRUTH), + GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_EGG), + GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_CUCCO), + GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_MUSHROOM), + GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_POTION), + GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SAW), + GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BROKEN), + GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_PRESCRIPTION), + GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FROG), + GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_EYEDROPS), + GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CLAIM_CHECK), + GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KOKIRI), + GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KNIFE), + GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_DEKU), + GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_HYLIAN), + GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SHIELD_MIRROR), + GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_GORON), + GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_ZORA), + GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_IRON), + GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_HOVER), + GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_40), + GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_50), + GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_20), + GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_30), + GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_40), + GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_SILVER), + GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_GOLD), + GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_SILVER), + GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_GOLD), + GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_STONE_OF_AGONY), + GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GERUDO_CARD), + GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_FAIRY), + GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_5), + GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER), + GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE), + GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_KEY_BOSS), + GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COMPASS), + GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MAP), + GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_KEY_SMALL), + GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_SMALL), + GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_LARGE), + GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_ADULT), + GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_GIANT), + GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WEIRD_EGG), + GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART), + GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_SMALL), + GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_MEDIUM), + GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_LARGE), + GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN), + GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE), + GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED), + GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER_2), + GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK), + GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GORON), + GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_ZORA), + GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GERUDO), + GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BRACELET), + GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE), + GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GOLD), + GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BGS), + GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_FIRE), + GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_ICE), + GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_LIGHT), + GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_SKULL_TOKEN), + GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_DINS_FIRE), + GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FARORES_WIND), + GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_NAYRUS_LOVE), + GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_30), + GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_40), + GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_5), + GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_10), + GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5_2), + GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_10), + GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_1), + GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_10), + GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_20), + GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_30), + GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_30), + GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_5), + GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_20), + GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FISH), + GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BUGS), + GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BLUE_FIRE), + GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POE), + GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BIG_POE), + GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_DOOR_KEY), + GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN_LOSE), + GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE_LOSE), + GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED_LOSE), + GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE_LOSE), + GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE_WIN), + GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_20), + GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_30), + GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_30), + GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_40), + GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_50), + GET_ITEM_NONE, + GET_ITEM_NONE, + }; + ItemTableManager::Instance->AddItemTable(MOD_NONE); + for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) { + // The vanilla item table array started with ITEM_BOMBS_5, + // but the GetItemID enum started with GI_NONE. Then everywhere + // that table was accessed used `GetItemID - 1`. This allows the + // "first" item of the new map to start at 1, syncing it up with + // the GetItemID values and removing the need for the `- 1` + ItemTableManager::Instance->AddItemEntry(MOD_NONE, i+1, getItemTable[i]); + } +} + extern "C" void OTRExtScanner() { auto lst = *OTRGlobals::Instance->context->GetResourceManager()->ListFiles("*.*").get(); @@ -182,6 +323,7 @@ extern "C" void InitOTR() { OTRGlobals::Instance = new OTRGlobals(); SaveManager::Instance = new SaveManager(); CustomMessageManager::Instance = new CustomMessageManager(); + ItemTableManager::Instance = new ItemTableManager(); auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version"); if (!t->bHasLoadError) @@ -200,6 +342,7 @@ extern "C" void InitOTR() { Rando_Init(); InitItemTracker(); OTRExtScanner(); + VanillaItemTable_Init(); } extern "C" void DeinitOTR() { @@ -1410,14 +1553,6 @@ extern "C" void* getN64WeirdFrame(s32 i) { return &weirdFrameBytes[i + sizeof(n64WeirdFrames)]; } -extern "C" s16 Randomizer_GetItemModelFromId(s16 itemId) { - return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId); -} - -extern "C" s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId) { - return OTRGlobals::Instance->gRandomizer->GetItemIDFromGetItemID(getItemId); -} - extern "C" void Randomizer_LoadSettings(const char* spoilerFileName) { OTRGlobals::Instance->gRandomizer->LoadRandomizerSettings(spoilerFileName); } @@ -1477,21 +1612,45 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check) return hintText; } -extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { - return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); +extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { + GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); + return giEntry; } -extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { - return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); +extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { + return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID); +} + +extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { + s16 getItemModIndex; + if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem( + OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) { + getItemModIndex = MOD_NONE; + } else { + getItemModIndex = MOD_RANDOMIZER; + } + s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); + return ItemTable_RetrieveEntry(getItemModIndex, itemID); +} + +extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { + s16 getItemModIndex; + if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { + getItemModIndex = MOD_NONE; + } else { + getItemModIndex = MOD_RANDOMIZER; + } + s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); + return ItemTable_RetrieveEntry(getItemModIndex, itemID); } extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { return gSaveContext.n64ddFlag && (actor->parent != NULL) && - Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; + Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP; } extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { - return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; + return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP; } extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(GetItemID giid, char* buffer, const int maxBufferSize) { diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 53f64ff12..dc304358d 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -4,6 +4,7 @@ #pragma once #include "SaveManager.h" +#include #ifdef __cplusplus #include "Window.h" @@ -20,6 +21,7 @@ public: std::shared_ptr context; std::shared_ptr gSaveStateMgr; std::shared_ptr gRandomizer; + uint16_t getItemModIndex; OTRGlobals(); ~OTRGlobals(); @@ -30,6 +32,7 @@ private: #endif #ifndef __cplusplus +void VanillaItemTable_Init(); void OTRAudio_Init(); void InitAudio(); void Graph_StartFrame(); @@ -95,13 +98,13 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); void Randomizer_LoadHintLocations(const char* spoilerFileName); void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent); -s16 Randomizer_GetItemModelFromId(s16 itemId); -s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); -s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); -s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); +GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); +GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor); bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx); +GetItemEntry ItemTable_Retrieve(int16_t getItemID); +GetItemEntry ItemTable_RetrieveEntry(s16 modIndex, s16 getItemID); #endif #endif diff --git a/soh/soh/z_play_otr.cpp b/soh/soh/z_play_otr.cpp index 1a07ceb7e..d0137644c 100644 --- a/soh/soh/z_play_otr.cpp +++ b/soh/soh/z_play_otr.cpp @@ -60,6 +60,7 @@ void OTRGameplay_InitScene(GlobalContext* globalCtx, s32 spawn) { globalCtx->cUpElfMsgs = nullptr; globalCtx->setupPathList = nullptr; globalCtx->numSetupActors = 0; + OTRGlobals::Instance->getItemModIndex = MOD_NONE; Object_InitBank(globalCtx, &globalCtx->objectCtx); LightContext_Init(globalCtx, &globalCtx->lightCtx); TransitionActor_InitContext(&globalCtx->state, &globalCtx->transiActorCtx); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 5c2ae2fff..f419426a7 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1956,14 +1956,25 @@ u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx) { } } -s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { +/** + * Uses the given `GetItemEntry` to prepare the player to receive an item via the animation + * where Link holds an item over his head. This function does not require an actor for giving + * the player an item, instead setting the player as their own interactRangeActor and getItemDirection. + * + * \param globalCtx the Global Context + * \param getItemEntry the GetItemEntry for the item you want the player to receive. + * \return true if the player can receive an item, false if not. + */ +s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry) { Player* player = GET_PLAYER(globalCtx); if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { - if (((player->heldActor != NULL) && (getItemId > GI_NONE) && (getItemId < GI_MAX)) || + if (((player->heldActor != NULL) && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX)) || + (gSaveContext.n64ddFlag && (getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))) || (!(player->stateFlags1 & 0x20000800))) { - if ((getItemId != GI_NONE)) { - player->getItemId = getItemId; + if ((getItemEntry.getItemId != GI_NONE)) { + player->getItemEntry = getItemEntry; + player->getItemId = getItemEntry.getItemId; player->interactRangeActor = &player->actor; player->getItemDirection = player->actor.shape.rot.y; return true; @@ -1974,12 +1985,69 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { return false; } +/** + * Uses the given `GetItemEntry` to prepare the player to receive an item via the animation + * where Link holds an item over his head. This uses data from the actor link is receiving + * the item from to set the player's interactRangeActor and getItemDirection. It also checks + * a range from which Link must be from said actor in order to receive the item. + * + * \param actor the actor link is receiving an item from. Will usually be a chest but can also + * be an npc. + * \param globalCtx the Global Context + * \param getItemEntry the GetItemEntry for the item you want the player to receive. + * \param xzRange the distance on the x and z axes that the player can be from the target + * actor to receive the item. + * \param yRange the distance on the y axis that the player can be from the target actor + * to receive the item. + * \return true if the player can receive an item, false if not. + */ +s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange) { + Player* player = GET_PLAYER(globalCtx); + + if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { + if ((((player->heldActor != NULL) || (actor == player->targetActor)) && + ((!gSaveContext.n64ddFlag && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) || + (gSaveContext.n64ddFlag && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) || + (!(player->stateFlags1 & 0x20000800))) { + if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { + s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; + s32 absYawDiff = ABS(yawDiff); + + if ((getItemEntry.getItemId != GI_NONE) || (player->getItemDirection < absYawDiff)) { + player->getItemEntry = getItemEntry; + player->getItemId = getItemEntry.getItemId; + player->interactRangeActor = actor; + player->getItemDirection = absYawDiff; + return true; + } + } + } + } + + return false; +} + +/** + * Uses the given `GetItemEntry` to prepare the player to receive an item via the animation + * where Link holds an item over his head. This is a wrapper function around `GiveItemEntryFromActor` + * that supplies a fixed xzRange of 50.0f and a fixed yRange of 10.0f. + * + * \param actor the target actor that link is receiving an item from. + * \param globalCtx the Global Context + * \param getItemEntry the GetItemEntry for the item you want the player to receive. + */ +void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry) { + GiveItemEntryFromActor(actor, globalCtx, getItemEntry, 50.0f, 10.0f); +} + +// TODO: Rename to GiveItemIdFromActor or similar +// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActor s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) { Player* player = GET_PLAYER(globalCtx); if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { - if ((((player->heldActor != NULL) || (actor == player->targetActor)) && (getItemId > GI_NONE) && - (getItemId < GI_MAX)) || + if ((((player->heldActor != NULL) || (actor == player->targetActor)) && + ((!gSaveContext.n64ddFlag && ((getItemId > GI_NONE) && (getItemId < GI_MAX))) || (gSaveContext.n64ddFlag && ((getItemId > RG_NONE) && (getItemId < RG_MAX))))) || (!(player->stateFlags1 & 0x20000800))) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; @@ -1998,6 +2066,8 @@ s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzR return false; } +// TODO: Rename to GiveItemIdFromActorWithFixedRange or similar +// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActorWithFixedRange void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) { func_8002F434(actor, globalCtx, getItemId, 50.0f, 10.0f); } @@ -5995,7 +6065,7 @@ s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* ar return true; } -s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { +GetItemEntry GetChestGameRandoGetItem(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { // RANDOTODO update this logic when we implement keysanity // because 3drando replaces the keys not the rupees @@ -6006,27 +6076,27 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) switch(room) { case 1: if(!Flags_GetCollectible(globalCtx, 0x1B)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN); } break; case 2: if(!Flags_GetCollectible(globalCtx, 0x1C)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN); } break; case 3: if(!Flags_GetCollectible(globalCtx, 0x1D)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE); } break; case 4: if(!Flags_GetCollectible(globalCtx, 0x1E)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE); } break; case 5: if(!Flags_GetCollectible(globalCtx, 0x1F)) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED); } break; } @@ -6034,17 +6104,17 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) } if(ogDrawId == GID_HEART_PIECE) { - return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE); + return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE); } - return GI_NONE; + return (GetItemEntry)GET_ITEM_NONE; } s16 GetChestGameRandoGiDrawId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { - s32 randoGetItemId = GetChestGameRandoGetItemId(room, ogDrawId, globalCtx); + GetItemEntry randoGetItem = GetChestGameRandoGetItem(room, ogDrawId, globalCtx); - if(randoGetItemId != GI_NONE) { - return Randomizer_GetItemModelFromId(randoGetItemId); + if (randoGetItem.itemId != RG_NONE) { + return randoGetItem.gid; } return ogDrawId; diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 24d069706..a50c74e87 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -335,6 +335,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { f32 yOffset = 980.0f; f32 shadowScale = 6.0f; s32 getItemId = GI_NONE; + GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE; s16 spawnParam8000 = this->actor.params & 0x8000; s32 pad1; @@ -508,9 +509,15 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { break; } - if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { - getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - func_8002F554(&this->actor, globalCtx, getItemId); + if (!Actor_HasParent(&this->actor, globalCtx)) { + if (!gSaveContext.n64ddFlag) { + if (getItemId != GI_NONE) { + func_8002F554(&this->actor, globalCtx, getItemId); + } + } else { + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem); + } } EnItem00_SetupAction(this, func_8001E5C8); @@ -666,10 +673,15 @@ void func_8001E304(EnItem00* this, GlobalContext* globalCtx) { void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); - if (this->getItemId != GI_NONE) { if (!Actor_HasParent(&this->actor, globalCtx)) { - func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f); + } else { + GetItemEntry getItemEntry = + Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 50.0f, 80.0f); + } this->unk_15A++; } else { this->getItemId = GI_NONE; @@ -703,6 +715,7 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { s16* params; Actor* dynaActor; s32 getItemId = GI_NONE; + GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE; s16 sp3A = 0; s16 i; u32* temp; @@ -883,10 +896,13 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { params = &this->actor.params; if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { - if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + if (!gSaveContext.n64ddFlag) { + func_8002F554(&this->actor, globalCtx, getItemId); + } else { + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + getItemId = getItem.getItemId; + GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem); } - func_8002F554(&this->actor, globalCtx, getItemId); } switch (*params) { @@ -1214,38 +1230,56 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { } } -void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, s16 getItemId) { +void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetItemEntry giEntry) { s16 color_slot; - switch (getItemId) { - case GI_MINUET_OF_FOREST: - case GI_SINGLE_MAGIC: - case GI_DOUBLE_MAGIC: - color_slot = 0; + switch (giEntry.modIndex) { + case MOD_NONE: + switch (giEntry.itemId) { + case ITEM_SONG_MINUET: + color_slot = 0; + break; + case ITEM_SONG_BOLERO: + color_slot = 1; + break; + case ITEM_SONG_SERENADE: + color_slot = 2; + break; + case ITEM_SONG_REQUIEM: + color_slot = 3; + break; + case ITEM_SONG_NOCTURNE: + color_slot = 4; + break; + case ITEM_SONG_PRELUDE: + color_slot = 5; + break; + case ITEM_STICK_UPGRADE_20: + case ITEM_STICK_UPGRADE_30: + color_slot = 6; + break; + case ITEM_NUT_UPGRADE_30: + case ITEM_NUT_UPGRADE_40: + color_slot = 7; + break; + default: + return; + } break; - case GI_BOLERO_OF_FIRE: - case GI_DOUBLE_DEFENSE: - color_slot = 1; - break; - case GI_SERENADE_OF_WATER: - color_slot = 2; - break; - case GI_REQUIEM_OF_SPIRIT: - color_slot = 3; - break; - case GI_NOCTURNE_OF_SHADOW: - color_slot = 4; - break; - case GI_PRELUDE_OF_LIGHT: - color_slot = 5; - break; - case GI_STICK_UPGRADE_20: - case GI_STICK_UPGRADE_30: - color_slot = 6; - break; - case GI_NUT_UPGRADE_30: - case GI_NUT_UPGRADE_40: - color_slot = 7; + case MOD_RANDOMIZER: + switch (giEntry.itemId) { + case RG_MAGIC_SINGLE: + case RG_MAGIC_DOUBLE: + color_slot = 0; + break; + case RG_DOUBLE_DEFENSE: + color_slot = 1; + break; + default: + return; + } break; + default: + return; } s16* colors[9][3] = { @@ -1323,12 +1357,10 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag && (this->getItemId != GI_NONE || this->actor.params == ITEM00_SMALL_KEY)) { f32 mtxScale = 16.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); - s32 randoGetItemId = Randomizer_GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItemEntry = + Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); + GetItem_Draw(globalCtx, randoGetItemEntry.gid); } else { s32 texIndex = this->actor.params - 3; @@ -1384,12 +1416,10 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { f32 mtxScale = 16.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); - s32 randoGetItemId = Randomizer_GetRandomizedItemId(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItemEntry = + Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); + GetItem_Draw(globalCtx, randoGetItemEntry.gid); } else { s32 pad; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index ba589f56c..28ec93b73 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1590,70 +1590,6 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) { osSyncPrintf("item_get_setting=%d pt=%d z=%x\n", item, slot, gSaveContext.inventory.items[slot]); osSyncPrintf(VT_RST); - if (item == ITEM_SINGLE_MAGIC) { - gSaveContext.magicAcquired = true; - gSaveContext.unk_13F6 = 0x30; - Magic_Fill(globalCtx); - return ITEM_NONE; - } else if (item == ITEM_DOUBLE_MAGIC) { - if (!gSaveContext.magicAcquired) { - gSaveContext.magicAcquired = true; - } - gSaveContext.doubleMagic = true; - gSaveContext.unk_13F6 = 0x60; - gSaveContext.magicLevel = 0; - Magic_Fill(globalCtx); - return ITEM_NONE; - } - - if (item == ITEM_DOUBLE_DEFENSE) { - gSaveContext.doubleDefense = true; - gSaveContext.inventory.defenseHearts = 20; - gSaveContext.healthAccumulator = 0x140; - return ITEM_NONE; - } - - if (item >= ITEM_BOTTLE_WITH_RED_POTION && - item <= ITEM_BOTTLE_WITH_BIG_POE) { - temp = SLOT(ITEM_BOTTLE); - for (i = 0; i < 4; i++) { - if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) { - switch (item) { - case ITEM_BOTTLE_WITH_RED_POTION: - item = ITEM_POTION_RED; - break; - case ITEM_BOTTLE_WITH_GREEN_POTION: - item = ITEM_POTION_GREEN; - break; - case ITEM_BOTTLE_WITH_BLUE_POTION: - item = ITEM_POTION_BLUE; - break; - case ITEM_BOTTLE_WITH_FAIRY: - item = ITEM_FAIRY; - break; - case ITEM_BOTTLE_WITH_FISH: - item = ITEM_FISH; - break; - case ITEM_BOTTLE_WITH_BLUE_FIRE: - item = ITEM_BLUE_FIRE; - break; - case ITEM_BOTTLE_WITH_BUGS: - item = ITEM_BUG; - break; - case ITEM_BOTTLE_WITH_POE: - item = ITEM_POE; - break; - case ITEM_BOTTLE_WITH_BIG_POE: - item = ITEM_BIG_POE; - break; - } - - gSaveContext.inventory.items[temp + i] = item; - return ITEM_NONE; - } - } - } - if ((item >= ITEM_MEDALLION_FOREST) && (item <= ITEM_MEDALLION_LIGHT)) { gSaveContext.inventory.questItems |= gBitFlags[item - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST]; @@ -2237,6 +2173,84 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) { return temp; } +u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) { + uint16_t item = giEntry.itemId; + uint16_t temp; + uint16_t i; + uint16_t slot; + + slot = SLOT(item); + if (item == RG_MAGIC_SINGLE) { + gSaveContext.magicAcquired = true; + gSaveContext.unk_13F6 = 0x30; + Magic_Fill(globalCtx); + return RG_NONE; + } else if (item == RG_MAGIC_DOUBLE) { + if (!gSaveContext.magicAcquired) { + gSaveContext.magicAcquired = true; + } + gSaveContext.doubleMagic = true; + gSaveContext.unk_13F6 = 0x60; + gSaveContext.magicLevel = 0; + Magic_Fill(globalCtx); + return RG_NONE; + } + + if (item == RG_DOUBLE_DEFENSE) { + gSaveContext.doubleDefense = true; + gSaveContext.inventory.defenseHearts = 20; + gSaveContext.healthAccumulator = 0x140; + return RG_NONE; + } + + if (item >= RG_BOTTLE_WITH_RED_POTION && item <= RG_BOTTLE_WITH_BIG_POE) { + temp = SLOT(ITEM_BOTTLE); + for (i = 0; i < 4; i++) { + if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) { + switch (item) { + case RG_BOTTLE_WITH_RED_POTION: + item = ITEM_POTION_RED; + break; + case RG_BOTTLE_WITH_GREEN_POTION: + item = ITEM_POTION_GREEN; + break; + case RG_BOTTLE_WITH_BLUE_POTION: + item = ITEM_POTION_BLUE; + break; + case RG_BOTTLE_WITH_FAIRY: + item = ITEM_FAIRY; + break; + case RG_BOTTLE_WITH_FISH: + item = ITEM_FISH; + break; + case RG_BOTTLE_WITH_BLUE_FIRE: + item = ITEM_BLUE_FIRE; + break; + case RG_BOTTLE_WITH_BUGS: + item = ITEM_BUG; + break; + case RG_BOTTLE_WITH_POE: + item = ITEM_POE; + break; + case RG_BOTTLE_WITH_BIG_POE: + item = ITEM_BIG_POE; + break; + } + + gSaveContext.inventory.items[temp + i] = item; + return ITEM_NONE; + } + } + } + + temp = gSaveContext.inventory.items[slot]; + osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp); + INV_CONTENT(item) = item; + + return temp; +} + + u8 Item_CheckObtainability(u8 item) { s16 i; s16 slot = SLOT(item); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 622a64a94..03a977581 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -201,8 +201,8 @@ void GivePlayerRandoRewardSongOfTime(GlobalContext* globalCtx, RandomizerCheck c if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); - GiveItemWithoutActor(globalCtx, getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } @@ -216,8 +216,8 @@ void GivePlayerRandoRewardNocturne(GlobalContext* globalCtx, RandomizerCheck che gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_NOCTURNE_OF_SHADOW); - GiveItemWithoutActor(globalCtx, getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetEventChkInf(0xAA); } } @@ -228,8 +228,8 @@ void GivePlayerRandoRewardRequiem(GlobalContext* globalCtx, RandomizerCheck chec if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); - GiveItemWithoutActor(globalCtx, getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetEventChkInf(0xAC); } } @@ -242,21 +242,22 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) && !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && globalCtx->sceneLoadFlag == 0) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT); - GiveItemWithoutActor(globalCtx, getItemId); - player->pendingFlag.flagID = 0x1E; - player->pendingFlag.flagType = FLAG_SCENE_TREASURE; + GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT); + if (player->pendingFlag.flagType == FLAG_NONE && GiveItemEntryWithoutActor(globalCtx, getItem)) { + player->pendingFlag.flagID = 0x1E; + player->pendingFlag.flagType = FLAG_SCENE_TREASURE; + } } } void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck check) { Player* player = GET_PLAYER(globalCtx); if (gSaveContext.entranceIndex == 0x05E0) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ZELDAS_LULLABY); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY); - if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemId && getItemId != GI_ICE_TRAP)) && + if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemEntry.getItemId && getItemEntry.getItemId != GI_ICE_TRAP)) && player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { - GiveItemWithoutActor(globalCtx, getItemId); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetEventChkInf(0xC1); } } diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 9214a57d2..6ab65e3cb 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -2,6 +2,7 @@ #include "vt.h" #include +#include #define NUM_DUNGEONS 8 #define NUM_TRIALS 6 @@ -306,11 +307,11 @@ void GiveLinkDekuNutUpgrade(GetItemID giid) { } void GiveLinkMagic(GetItemID giid) { - if (giid == GI_SINGLE_MAGIC) { + if (giid == RG_MAGIC_SINGLE) { gSaveContext.magicLevel = 1; gSaveContext.magicAcquired = true; gSaveContext.doubleMagic = false; - } else if (giid == GI_DOUBLE_MAGIC) { + } else if (giid == RG_MAGIC_DOUBLE) { gSaveContext.magicLevel = 2; gSaveContext.magicAcquired = true; gSaveContext.doubleMagic = true; @@ -326,40 +327,40 @@ void GiveLinkSong(GetItemID getItemId) { uint32_t bitMask; switch (getItemId) { - case GI_ZELDAS_LULLABY: + case RG_ZELDAS_LULLABY: bitMask = 1 << QUEST_SONG_LULLABY; break; - case GI_SUNS_SONG: + case RG_SUNS_SONG: bitMask = 1 << QUEST_SONG_SUN; break; - case GI_EPONAS_SONG: + case RG_EPONAS_SONG: bitMask = 1 << QUEST_SONG_EPONA; break; - case GI_SONG_OF_STORMS: + case RG_SONG_OF_STORMS: bitMask = 1 << QUEST_SONG_STORMS; break; - case GI_SONG_OF_TIME: + case RG_SONG_OF_TIME: bitMask = 1 << QUEST_SONG_TIME; break; - case GI_SARIAS_SONG: + case RG_SARIAS_SONG: bitMask = 1 << QUEST_SONG_SARIA; break; - case GI_MINUET_OF_FOREST: + case RG_MINUET_OF_FOREST: bitMask = 1 << QUEST_SONG_MINUET; break; - case GI_BOLERO_OF_FIRE: + case RG_BOLERO_OF_FIRE: bitMask = 1 << QUEST_SONG_BOLERO; break; - case GI_SERENADE_OF_WATER: + case RG_SERENADE_OF_WATER: bitMask = 1 << QUEST_SONG_SERENADE; break; - case GI_NOCTURNE_OF_SHADOW: + case RG_NOCTURNE_OF_SHADOW: bitMask = 1 << QUEST_SONG_NOCTURNE; break; - case GI_REQUIEM_OF_SPIRIT: + case RG_REQUIEM_OF_SPIRIT: bitMask = 1 << QUEST_SONG_REQUIEM; break; - case GI_PRELUDE_OF_LIGHT: + case RG_PRELUDE_OF_LIGHT: bitMask = 1 << QUEST_SONG_PRELUDE; break; } @@ -367,43 +368,43 @@ void GiveLinkSong(GetItemID getItemId) { gSaveContext.inventory.questItems |= bitMask; } -void GiveLinkDungeonReward(GetItemID getItemId) { +void GiveLinkDungeonReward(uint16_t getItemId) { s16 item; u8 medallion = 0; switch (getItemId) { - case GI_MEDALLION_FOREST: + case RG_FOREST_MEDALLION: item = ITEM_MEDALLION_FOREST; medallion = 1; break; - case GI_MEDALLION_FIRE: + case RG_FIRE_MEDALLION: item = ITEM_MEDALLION_FIRE; medallion = 1; break; - case GI_MEDALLION_WATER: + case RG_WATER_MEDALLION: item = ITEM_MEDALLION_WATER; medallion = 1; break; - case GI_MEDALLION_SHADOW: + case RG_SHADOW_MEDALLION: item = ITEM_MEDALLION_SHADOW; medallion = 1; break; - case GI_MEDALLION_SPIRIT: + case RG_SPIRIT_MEDALLION: item = ITEM_MEDALLION_SPIRIT; medallion = 1; break; - case GI_MEDALLION_LIGHT: + case RG_LIGHT_MEDALLION: item = ITEM_MEDALLION_LIGHT; medallion = 1; break; - case GI_STONE_KOKIRI: + case RG_KOKIRI_EMERALD: item = ITEM_KOKIRI_EMERALD; break; - case GI_STONE_GORON: + case RG_GORON_RUBY: item = ITEM_GORON_RUBY; break; - case GI_STONE_ZORA: + case RG_ZORA_SAPPHIRE: item = ITEM_ZORA_SAPPHIRE; break; } @@ -416,9 +417,9 @@ void GiveLinkDungeonReward(GetItemID getItemId) { } void GiveLinksPocketMedallion() { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LINKS_POCKET, RG_NONE); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, RG_NONE); - GiveLinkDungeonReward(getItemId); + GiveLinkDungeonReward(getItemEntry.getItemId); } /** @@ -696,95 +697,71 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { } if(Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { - s32 giid = Randomizer_GetItemIdFromKnownCheck(RC_SONG_FROM_IMPA, GI_ZELDAS_LULLABY); - - if(giid >= GI_ZELDAS_LULLABY && giid <= GI_PRELUDE_OF_LIGHT) { - GiveLinkSong(giid); - } else if (giid == GI_RUPEE_GREEN || - giid == GI_RUPEE_BLUE || - giid == GI_RUPEE_RED || - giid == GI_RUPEE_PURPLE || - giid == GI_RUPEE_GOLD) { - GiveLinkRupeesByGetItemId(giid); - } else if (giid == GI_BOMBCHUS_10 || - giid == GI_BOMBCHUS_5 || - giid == GI_BOMBCHUS_20) { - GiveLinkBombchus(giid); - } else if (giid == GI_STICKS_1 || - giid == GI_STICKS_5 || - giid == GI_STICKS_10) { - GiveLinkDekuSticksByGetItemId(giid); - } else if (giid == GI_NUTS_5 || - giid == GI_NUTS_10) { - GiveLinkDekuNutsByGetItemId(giid); - } else if (giid == GI_BEAN) { - GiveLinkBeans(); - } else if (giid >= GI_MEDALLION_LIGHT && giid <= GI_STONE_ZORA) { - GiveLinkDungeonReward(giid); - } else if (giid == GI_SWORD_KOKIRI) { - GiveLinkKokiriSword(); - } else if (giid == GI_SWORD_BGS) { - GiveLinkBiggoronSword(); - } else if (giid == GI_SWORD_KNIFE) { - GiveLinkGiantsKnife(); - } else if (giid == GI_SHIELD_DEKU) { - GiveLinkDekuShield(); - } else if (giid == GI_SHIELD_HYLIAN) { - GiveLinkHylianShield(); - } else if (giid == GI_SHIELD_MIRROR) { - GiveLinkMirrorShield(); - } else if (giid == GI_TUNIC_GORON) { - GiveLinkGoronTunic(); - } else if (giid == GI_TUNIC_ZORA) { - GiveLinkZoraTunic(); - } else if (giid == GI_BOOTS_IRON) { - GiveLinkIronBoots(); - } else if (giid == GI_BOOTS_HOVER) { - GiveLinkHoverBoots(); - } else if (giid == GI_SLINGSHOT || - giid == GI_BULLET_BAG_40 || - giid == GI_BULLET_BAG_50) { - GiveLinkBulletBagUpgrade(giid); - } else if (giid == GI_BOW || - giid == GI_QUIVER_40 || - giid == GI_QUIVER_50) { - GiveLinkQuiverUpgrade(giid); - } else if (giid == GI_BOMB_BAG_20 || - giid == GI_BOMB_BAG_30 || - giid == GI_BOMB_BAG_40) { - GiveLinkBombBagUpgrade(giid); - } else if (giid == GI_BRACELET || - giid == GI_GAUNTLETS_SILVER || - giid == GI_GAUNTLETS_GOLD) { - GiveLinkStrengthUpgrade(giid); - } else if (giid == GI_SCALE_SILVER || - giid == GI_SCALE_GOLD) { - GiveLinkScaleUpgrade(giid); - } else if (giid == GI_WALLET_ADULT || - giid == GI_WALLET_GIANT) { - GiveLinkWalletUpgrade(giid); - } else if (giid == GI_STONE_OF_AGONY) { - GiveLinkStoneOfAgony(); - } else if (giid == GI_GERUDO_CARD) { - GiveLinkGerudoCard(); - } else if (giid == GI_HEART_PIECE) { - GiveLinkPieceOfHeart(); - } else if (giid == GI_HEART_CONTAINER) { - GiveLinkHeartContainer(); - } else if (giid == GI_STICK_UPGRADE_20 || - giid == GI_STICK_UPGRADE_30) { - GiveLinkDekuStickUpgrade(giid); - } else if (giid == GI_NUT_UPGRADE_30 || - giid == GI_NUT_UPGRADE_40) { - GiveLinkDekuNutUpgrade(giid); - } else if (giid == GI_SINGLE_MAGIC || - giid == GI_DOUBLE_MAGIC) { - GiveLinkMagic(giid); - } else if (giid == GI_DOUBLE_DEFENSE) { - GiveLinkDoubleDefense(); - } else { - s32 iid = Randomizer_GetItemIDFromGetItemID(giid); - if (iid != -1) INV_CONTENT(iid) = iid; + GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY); + s32 giid = getItem.getItemId; + + if (getItem.modIndex == MOD_NONE) { + if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED || + giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_GOLD) { + GiveLinkRupeesByGetItemId(giid); + } else if (giid == GI_BOMBCHUS_10 || giid == GI_BOMBCHUS_5 || giid == GI_BOMBCHUS_20) { + GiveLinkBombchus(giid); + } else if (giid == GI_STICKS_1 || giid == GI_STICKS_5 || giid == GI_STICKS_10) { + GiveLinkDekuSticksByGetItemId(giid); + } else if (giid == GI_NUTS_5 || giid == GI_NUTS_10) { + GiveLinkDekuNutsByGetItemId(giid); + } else if (giid == GI_BEAN) { + GiveLinkBeans(); + } else if (giid == GI_SWORD_KOKIRI) { + GiveLinkKokiriSword(); + } else if (giid == GI_SWORD_BGS) { + GiveLinkBiggoronSword(); + } else if (giid == GI_SWORD_KNIFE) { + GiveLinkGiantsKnife(); + } else if (giid == GI_SHIELD_DEKU) { + GiveLinkDekuShield(); + } else if (giid == GI_SHIELD_HYLIAN) { + GiveLinkHylianShield(); + } else if (giid == GI_SHIELD_MIRROR) { + GiveLinkMirrorShield(); + } else if (giid == GI_TUNIC_GORON) { + GiveLinkGoronTunic(); + } else if (giid == GI_TUNIC_ZORA) { + GiveLinkZoraTunic(); + } else if (giid == GI_BOOTS_IRON) { + GiveLinkIronBoots(); + } else if (giid == GI_BOOTS_HOVER) { + GiveLinkHoverBoots(); + } else if (giid == GI_SLINGSHOT || giid == GI_BULLET_BAG_40 || giid == GI_BULLET_BAG_50) { + GiveLinkBulletBagUpgrade(giid); + } else if (giid == GI_BOW || giid == GI_QUIVER_40 || giid == GI_QUIVER_50) { + GiveLinkQuiverUpgrade(giid); + } else if (giid == GI_BOMB_BAG_20 || giid == GI_BOMB_BAG_30 || giid == GI_BOMB_BAG_40) { + GiveLinkBombBagUpgrade(giid); + } else if (giid == GI_BRACELET || giid == GI_GAUNTLETS_SILVER || giid == GI_GAUNTLETS_GOLD) { + GiveLinkStrengthUpgrade(giid); + } else if (giid == GI_SCALE_SILVER || giid == GI_SCALE_GOLD) { + GiveLinkScaleUpgrade(giid); + } else if (giid == GI_WALLET_ADULT || giid == GI_WALLET_GIANT) { + GiveLinkWalletUpgrade(giid); + } else if (giid == GI_STONE_OF_AGONY) { + GiveLinkStoneOfAgony(); + } else if (giid == GI_GERUDO_CARD) { + GiveLinkGerudoCard(); + } else if (giid == GI_HEART_PIECE) { + GiveLinkPieceOfHeart(); + } else if (giid == GI_HEART_CONTAINER) { + GiveLinkHeartContainer(); + } else if (giid == GI_STICK_UPGRADE_20 || giid == GI_STICK_UPGRADE_30) { + GiveLinkDekuStickUpgrade(giid); + } else if (giid == GI_NUT_UPGRADE_30 || giid == GI_NUT_UPGRADE_40) { + GiveLinkDekuNutUpgrade(giid); + } else { + s32 iid = getItem.itemId; + if (iid != -1) INV_CONTENT(iid) = iid; + } + } else if (getItem.modIndex == MOD_RANDOMIZER) { + Randomizer_Item_Give(NULL, getItem); } // malon/talon back at ranch diff --git a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c index 0f1713ba8..e04755a34 100644 --- a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c +++ b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c @@ -70,14 +70,14 @@ const ActorInit Bg_Dy_Yoseizo_InitVars = { void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); - GetItemID getItemId = Randomizer_GetRandomizedItemId(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum); if (this->actor.parent == GET_PLAYER(globalCtx) && !Flags_GetTreasure(globalCtx, this->fountainType + 1) && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { Flags_SetTreasure(globalCtx, this->fountainType + 1); Actor_Kill(&this->actor); } else if (!Flags_GetTreasure(globalCtx, this->fountainType + 1)) { - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c index cd49f7558..93007f547 100644 --- a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c +++ b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c @@ -899,13 +899,13 @@ void func_80986BF8(DemoIm* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardImpa(Actor* impa, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ZELDAS_LULLABY); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY); if (impa->parent != NULL && impa->parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { - func_8002F434(impa, globalCtx, getItemId, 75.0f, 50.0f); + GiveItemEntryFromActor(impa, globalCtx, getItemEntry, 75.0f, 50.0f); } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { gSaveContext.eventChkInf[5] |= 0x200; globalCtx->sceneLoadFlag = 0x14; diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 291208752..5130f1ca8 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -462,13 +462,13 @@ s32 DoorWarp1_PlayerInRange(DoorWarp1* this, GlobalContext* globalCtx) { } void GivePlayerRandoReward(DoorWarp1* this, Player* player, GlobalContext* globalCtx, u8 ruto, u8 adult) { - GetItemID getItemId = Randomizer_GetRandomizedItemId(GI_NONE, this->actor.id, this->actor.params, globalCtx->sceneNum); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NONE, this->actor.id, this->actor.params, globalCtx->sceneNum); if (this->actor.parent != NULL && this->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { if (adult) { OnePointCutscene_Init(globalCtx, 0x25E8, 999, &this->actor, MAIN_CAM); diff --git a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c index b5c7d8a4a..5debc658e 100644 --- a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c +++ b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c @@ -126,11 +126,11 @@ void func_809B0558(EnAni* this, GlobalContext* globalCtx) { } gSaveContext.itemGetInf[1] |= 0x20; } else { - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 200.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 200.0f); } } } @@ -140,11 +140,11 @@ void func_809B05F0(EnAni* this, GlobalContext* globalCtx) { EnAni_SetupAction(this, func_809B0558); } - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 200.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 200.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c index ee9ce1329..321f76810 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c +++ b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c @@ -177,6 +177,7 @@ void EnBomBowlPit_GivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) { func_8002DF54(globalCtx, NULL, 7); this->getItemId = sGetItemIds[this->prizeIndex]; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; if ((this->getItemId == GI_BOMB_BAG_30) && (CUR_CAPACITY(UPG_BOMB_BAG) == 30)) { this->getItemId = GI_BOMB_BAG_40; @@ -185,22 +186,27 @@ void EnBomBowlPit_GivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { switch (this->prizeIndex) { case EXITEM_BOMB_BAG_BOWLING: - this->getItemId = - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); + this->getItemId = this->getItemEntry.getItemId; break; case EXITEM_HEART_PIECE_BOWLING: - this->getItemId = - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); + this->getItemId = this->getItemEntry.getItemId; break; case EXITEM_BOMBCHUS_BOWLING: - this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); + this->getItemId = this->getItemEntry.getItemId; break; } } player->stateFlags1 &= ~0x20000000; this->actor.parent = NULL; - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } player->stateFlags1 |= 0x20000000; this->actionFunc = EnBomBowlPit_WaitTillPrizeGiven; } @@ -209,7 +215,11 @@ void EnBomBowlPit_WaitTillPrizeGiven(EnBomBowlPit* this, GlobalContext* globalCt if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = EnBomBowlPit_Reset; } else { - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h index af5d8d3e1..fd7c03be4 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h +++ b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h @@ -33,6 +33,7 @@ typedef struct EnBomBowlPit { /* 0x01D4 */ Vec3f unk_1D4; // camera eye (maxsteps) /* 0x01E0 */ EnExItem* exItem; /* 0x01E4 */ char unk_1E4[0x3520]; + /* */ GetItemEntry getItemEntry; } EnBomBowlPit; // size = 0x3704 #endif diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index 533ba593a..3e78982a3 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -70,6 +70,7 @@ static InitChainEntry sInitChain[] = { }; static UNK_TYPE sUnused; +GetItemEntry sItem; void EnBox_SetupAction(EnBox* this, EnBoxActionFunc actionFunc) { this->actionFunc = actionFunc; @@ -445,40 +446,47 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) { func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos); if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f && Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) { - int32_t item = Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); + sItem = Randomizer_GetRandomizedItem(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); + GetItemEntry blueRupee = ItemTable_RetrieveEntry(MOD_NONE, GI_RUPEE_BLUE); // RANDOTODO treasure chest game rando if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) { if((this->dyna.actor.params & 0xF) < 2) { if(Flags_GetCollectible(globalCtx, 0x1B)) { - item = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 2 && (this->dyna.actor.params & 0xF) < 4) { if(Flags_GetCollectible(globalCtx, 0x1C)) { - item = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 4 && (this->dyna.actor.params & 0xF) < 6) { if(Flags_GetCollectible(globalCtx, 0x1D)) { - item = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 6 && (this->dyna.actor.params & 0xF) < 8) { if(Flags_GetCollectible(globalCtx, 0x1E)) { - item = GI_RUPEE_BLUE; + sItem = blueRupee; } } if((this->dyna.actor.params & 0xF) >= 8 && (this->dyna.actor.params & 0xF) < 10) { if(Flags_GetCollectible(globalCtx, 0x1F)) { - item = GI_RUPEE_BLUE; + sItem = blueRupee; } } } } - - func_8002F554(&this->dyna.actor, globalCtx, 0 - item); + // Chests need to have a negative getItemId in order to not immediately give their item + // when approaching. + if (gSaveContext.n64ddFlag) { + sItem.getItemId = 0 - sItem.getItemId; + GiveItemEntryFromActorWithFixedRange(&this->dyna.actor, globalCtx, sItem); + } else { + func_8002F554(&this->dyna.actor, globalCtx, -(this->dyna.actor.params >> 5 & 0x7F)); + } } if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) { EnBox_SetupAction(this, EnBox_Open); @@ -590,9 +598,7 @@ void EnBox_Update(Actor* thisx, GlobalContext* globalCtx) { } if (((!gSaveContext.n64ddFlag && ((this->dyna.actor.params >> 5 & 0x7F) == 0x7C)) || - (gSaveContext.n64ddFlag && Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, - this->dyna.actor.id, this->dyna.actor.params, - globalCtx->sceneNum) == GI_ICE_TRAP)) && + (gSaveContext.n64ddFlag && ABS(sItem.getItemId) == RG_ICE_TRAP)) && this->actionFunc == EnBox_Open && this->skelanime.curFrame > 45 && this->iceSmokeTimer < 100) EnBox_SpawnIceSmoke(this, globalCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c index 9f43a5f54..1f0d47d7a 100644 --- a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c +++ b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c @@ -453,7 +453,12 @@ void func_809EEA00(EnDivingGame* this, GlobalContext* globalCtx) { if ((this->unk_292 == Message_GetState(&globalCtx->msgCtx) && Message_ShouldAdvance(globalCtx))) { Message_CloseTextbox(globalCtx); this->actor.parent = NULL; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER) : GI_SCALE_SILVER, 90.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 90.0f, 10.0f); + } this->actionFunc = func_809EEA90; } } @@ -463,7 +468,12 @@ void func_809EEA90(EnDivingGame* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = func_809EEAF8; } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER) : GI_SCALE_SILVER, 90.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 90.0f, 10.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c index a89d583ae..d3a924356 100644 --- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c +++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c @@ -371,7 +371,8 @@ void EnDns_Talk(EnDns* this, GlobalContext* globalCtx) { void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { if (this->actor.params == 0x9) { if (gSaveContext.n64ddFlag) { - func_8002F434(&this->actor, globalCtx, Randomizer_GetRandomizedItemId(GI_STICK_UPGRADE_30, this->actor.id, this->actor.params, globalCtx->sceneNum), 130.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_STICK_UPGRADE_30, this->actor.id, this->actor.params, globalCtx->sceneNum); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f); } else if (CUR_UPG_VALUE(UPG_STICKS) < 2) { func_8002F434(&this->actor, globalCtx, GI_STICK_UPGRADE_20, 130.0f, 100.0f); } else { @@ -379,14 +380,20 @@ void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { } } else if (this->actor.params == 0xA) { if (gSaveContext.n64ddFlag) { - func_8002F434(&this->actor, globalCtx, Randomizer_GetRandomizedItemId(GI_NUT_UPGRADE_40, this->actor.id, this->actor.params, globalCtx->sceneNum), 130.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NUT_UPGRADE_40, this->actor.id, this->actor.params, globalCtx->sceneNum); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f); } else if (CUR_UPG_VALUE(UPG_NUTS) < 2) { func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_30, 130.0f, 100.0f); } else { func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_40, 130.0f, 100.0f); } } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetRandomizedItemId(this->dnsItemEntry->getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum) : this->dnsItemEntry->getItemId, 130.0f, 100.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, this->dnsItemEntry->getItemId, 130.0f, 100.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(this->dnsItemEntry->getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c index 6d3a4accd..c50e1ec77 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c @@ -139,13 +139,15 @@ void EnDntDemo_Judge(EnDntDemo* this, GlobalContext* globalCtx) { switch (Player_GetMask(globalCtx)) { case PLAYER_MASK_SKULL: if (!Flags_GetTreasure(globalCtx, 0x1F)) { - GiveItemWithoutActor(globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DEKU_THEATER_SKULL_MASK, GI_STICK_UPGRADE_30)); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_SKULL_MASK, GI_STICK_UPGRADE_30); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetTreasure(globalCtx, 0x1F); } break; case PLAYER_MASK_TRUTH: if (!Flags_GetTreasure(globalCtx, 0x1E)) { - GiveItemWithoutActor(globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DEKU_THEATER_MASK_OF_TRUTH, GI_NUT_UPGRADE_40)); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_MASK_OF_TRUTH, GI_NUT_UPGRADE_40); + GiveItemEntryWithoutActor(globalCtx, getItemEntry); Flags_SetTreasure(globalCtx, 0x1E); } break; diff --git a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c index e7f9b51aa..b1953bc74 100644 --- a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c +++ b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c @@ -548,7 +548,12 @@ void func_809FEC70(EnDu* this, GlobalContext* globalCtx) { EnDu_SetupAction(this, func_809FECE4); } else { f32 xzRange = this->actor.xzDistToPlayer + 1.0f; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GC_DARUNIAS_JOY, GI_BRACELET) : GI_BRACELET, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_BRACELET, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GC_DARUNIAS_JOY, GI_BRACELET); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 29632ebc3..0cbc370af 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -138,8 +138,8 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { case EXITEM_BOMB_BAG_BOWLING: this->unk_17C = func_8002EBCC; if (gSaveContext.n64ddFlag) { - this->giDrawId = Randomizer_GetItemModelFromId( - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20)); + this->giDrawId = + Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20).gid; } else { this->giDrawId = GID_BOMB_BAG_30; } @@ -173,8 +173,7 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { case EXITEM_BOMBCHUS_BOWLING: this->unk_17C = func_8002EBCC; if (gSaveContext.n64ddFlag) { - this->giDrawId = Randomizer_GetItemModelFromId( - Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10)); + this->giDrawId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).gid; } else { this->giDrawId = GID_BOMBCHU; } @@ -397,6 +396,7 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { this->actor.world.pos.z += (tmpf3 / tmpf4) * 5.0f; } } else { + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; this->actor.draw = NULL; @@ -404,7 +404,8 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (gSaveContext.n64ddFlag) { GET_PLAYER(globalCtx)->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + getItemId = getItemEntry.getItemId; } else { if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) { getItemId = GI_BULLET_BAG_40; @@ -412,24 +413,28 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { getItemId = GI_BULLET_BAG_50; } } - func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); + } this->actionFunc = EnExItem_TargetPrizeGive; } } void EnExItem_TargetPrizeGive(EnExItem* this, GlobalContext* globalCtx) { - s32 getItemId; - if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = EnExItem_TargetPrizeFinish; } else { - if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + if (!gSaveContext.n64ddFlag) { + s32 getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; + func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); } else { - getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); } - func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); } } @@ -506,24 +511,19 @@ void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx) { if (this) {} func_8002ED80(&this->actor, globalCtx, 0); if (gSaveContext.n64ddFlag) { - s32 randoGetItemId; + GetItemEntry randoGetItem; switch (this->type) { case EXITEM_BOMB_BAG_BOWLING: case EXITEM_BOMB_BAG_COUNTER: - randoGetItemId = Randomizer_GetItemIdFromKnownCheck( - RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); break; case EXITEM_BOMBCHUS_BOWLING: case EXITEM_BOMBCHUS_COUNTER: - randoGetItemId = Randomizer_GetItemIdFromKnownCheck( - RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); break; } - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); } GetItem_Draw(globalCtx, this->giDrawId); @@ -533,13 +533,10 @@ void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx) { func_8002ED80(&this->actor, globalCtx, 0); if (gSaveContext.n64ddFlag) { - s32 randoGetItemId = Randomizer_GetItemIdFromKnownCheck( - RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItem = + Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + GetItem_Draw(globalCtx, randoGetItem.gid); } else { GetItem_Draw(globalCtx, GID_HEART_PIECE); } diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c index 9a9d6354d..850675658 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c @@ -601,6 +601,7 @@ void EnFr_Idle(EnFr* this, GlobalContext* globalCtx) { player->actor.world.pos.z = this->actor.world.pos.z; // z = -1220.0f player->currentYaw = player->actor.world.rot.y = player->actor.shape.rot.y = this->actor.world.rot.y; this->reward = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = EnFr_Activate; } else if (EnFr_IsAboveAndWithin30DistXZ(player, this)) { player->unk_6A8 = &this->actor; @@ -836,6 +837,7 @@ s32 EnFr_IsFrogSongComplete(EnFr* this, GlobalContext* globalCtx) { void EnFr_OcarinaMistake(EnFr* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->reward = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; func_80078884(NA_SE_SY_OCARINA_ERROR); Audio_OcaSetInstrument(0); sEnFrPointers.flags = 12; @@ -927,6 +929,7 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { songIndex = this->songIndex; this->actionFunc = EnFr_Deactivate; this->reward = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; if ((songIndex >= FROG_ZL) && (songIndex <= FROG_SOT)) { if (!(gSaveContext.eventChkInf[13] & sSongIndex[songIndex])) { gSaveContext.eventChkInf[13] |= sSongIndex[songIndex]; @@ -940,7 +943,8 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { this->reward = GI_HEART_PIECE; } else { - this->reward = Randomizer_GetItemIdFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE); + this->reward = this->getItemEntry.getItemId; } } else { this->reward = GI_RUPEE_BLUE; @@ -951,7 +955,8 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { this->reward = GI_HEART_PIECE; } else { - this->reward = Randomizer_GetItemIdFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE); + this->reward = this->getItemEntry.getItemId; } } else { this->reward = GI_RUPEE_PURPLE; @@ -1002,7 +1007,11 @@ void EnFr_Deactivate(EnFr* this, GlobalContext* globalCtx) { this->actionFunc = EnFr_Idle; } else { this->actionFunc = EnFr_GiveReward; - func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 30.0f, 100.0f); + } } } @@ -1011,7 +1020,11 @@ void EnFr_GiveReward(EnFr* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnFr_SetIdle; } else { - func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 30.0f, 100.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h index 154aefc17..972c32e49 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.h @@ -73,6 +73,7 @@ typedef struct EnFr { /* 0x03AA */ s16 xyAngleButterfly; // Butterfly Travels along random angles in the x-y plane /* 0x03AC */ Vec3f posButterfly; // Position/Coordinates of the Butterfly /* 0x03B8 */ Vec3f posButterflyLight; // Used in Lights_PointNoGlowSetInfo() + /* */ GetItemEntry getItemEntry; } EnFr; // size = 0x03C4 typedef struct { diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c index 24676a577..28aa94c0e 100644 --- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -154,8 +154,8 @@ void GivePlayerRandoRewardSongOfStorms(EnFu* windmillGuy, GlobalContext* globalC Flags_SetTreasure(globalCtx, 0x1F); windmillGuy->actionFunc = func_80A1DBD4; } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_STORMS); - func_8002F434(&windmillGuy->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_STORMS); + GiveItemEntryFromActor(&windmillGuy->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c index 31fe04e90..f2b6c8638 100644 --- a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c +++ b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c @@ -353,7 +353,12 @@ void func_80A2FA50(EnGb* this, GlobalContext* globalCtx) { void func_80A2FB40(EnGb* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE && Message_ShouldAdvance(globalCtx)) { - func_8002F434(&this->dyna.actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE) : GI_BOTTLE, 100.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE); + GiveItemEntryFromActor(&this->dyna.actor, globalCtx, getItemEntry, 100.0f, 10.0f); + } this->actionFunc = func_80A2FBB0; } } @@ -363,7 +368,12 @@ void func_80A2FBB0(EnGb* this, GlobalContext* globalCtx) { this->dyna.actor.parent = NULL; this->actionFunc = func_80A2FC0C; } else { - func_8002F434(&this->dyna.actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE) : GI_BOTTLE, 100.0f, 10.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE); + GiveItemEntryFromActor(&this->dyna.actor, globalCtx, getItemEntry, 100.0f, 10.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index d34fb977b..407c43100 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -502,6 +502,7 @@ void EnGe1_SetupWait_Archery(EnGe1* this, GlobalContext* globalCtx) { } void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; if (Actor_HasParent(&this->actor, globalCtx)) { @@ -533,21 +534,28 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { break; } } else { - getItemId = Randomizer_GetItemIdFromKnownCheck( - RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemId = getItemEntry.getItemId; } } else { if (!gSaveContext.n64ddFlag) { getItemId = GI_HEART_PIECE; } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemId = getItemEntry.getItemId; } } - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { @@ -567,18 +575,23 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { break; } } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1500_POINTS, - CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); + getItemId = getItemEntry.getItemId; } } else { if (!gSaveContext.n64ddFlag) { getItemId = GI_HEART_PIECE; } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); + getItemId = getItemEntry.getItemId; } } - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } void EnGe1_TalkWinPrize_Archery(EnGe1* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index 5310fc65e..9fc4ce295 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -457,7 +457,12 @@ void EnGe2_WaitTillCardGiven(EnGe2* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnGe2_SetActionAfterTalk; } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } @@ -466,7 +471,12 @@ void EnGe2_GiveCard(EnGe2* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->actor.flags &= ~ACTOR_FLAG_16; this->actionFunc = EnGe2_WaitTillCardGiven; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c index 556e7c203..261ce49ec 100644 --- a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c +++ b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c @@ -142,7 +142,12 @@ void EnGe3_WaitTillCardGiven(EnGe3* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnGe3_Wait; } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } @@ -151,7 +156,12 @@ void EnGe3_GiveCard(EnGe3* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->actor.flags &= ~ACTOR_FLAG_16; this->actionFunc = EnGe3_WaitTillCardGiven; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index e1179fe1b..832f4ac4d 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -946,6 +946,7 @@ void func_80A40B1C(EnGo* this, GlobalContext* globalCtx) { void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { f32 xzDist; f32 yDist; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; if (Actor_HasParent(&this->actor, globalCtx)) { @@ -956,7 +957,12 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { this->unk_20C = 0; if ((this->actor.params & 0xF0) == 0x90) { if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_CLAIM_CHECK) { - getItemId = gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS) : GI_SWORD_BGS; + if (!gSaveContext.n64ddFlag) { + getItemId = GI_SWORD_BGS; + } else { + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS); + getItemId = getItemEntry.getItemId; + } this->unk_20C = 1; } if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_EYEDROPS) { @@ -973,7 +979,11 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { yDist = fabsf(this->actor.yDistToPlayer) + 1.0f; xzDist = this->actor.xzDistToPlayer + 1.0f; - func_8002F434(&this->actor, globalCtx, getItemId, xzDist, yDist); + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, xzDist, yDist); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzDist, yDist); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 22c19f5f0..c9b97c8a9 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -286,6 +286,13 @@ void EnGo2_GetItem(EnGo2* this, GlobalContext* globalCtx, s32 getItemId) { fabsf(this->actor.yDistToPlayer) + 1.0f); } +void EnGo2_GetItemEntry(EnGo2* this, GlobalContext* globalCtx, GetItemEntry getItemEntry) { + this->getItemId = getItemEntry.getItemId; + this->getItemEntry = getItemEntry; + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, this->actor.xzDistToPlayer + 1.0f, + fabsf(this->actor.yDistToPlayer) + 1.0f); +} + s32 EnGo2_GetDialogState(EnGo2* this, GlobalContext* globalCtx) { s16 dialogState = Message_GetState(&globalCtx->msgCtx); @@ -334,8 +341,6 @@ u16 EnGo2_GetTextIdGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { } s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { - s32 bombBagUpgrade; - switch (Message_GetState(&globalCtx->msgCtx)) { case TEXT_STATE_CLOSING: return 2; @@ -344,11 +349,10 @@ s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { if (this->actor.textId == 0x3012) { this->actionFunc = EnGo2_SetupGetItem; if(!gSaveContext.n64ddFlag) { - bombBagUpgrade = CUR_CAPACITY(UPG_BOMB_BAG) == 30 ? GI_BOMB_BAG_40 : GI_BOMB_BAG_30; + EnGo2_GetItem(this, globalCtx, CUR_CAPACITY(UPG_BOMB_BAG) == 30 ? GI_BOMB_BAG_40 : GI_BOMB_BAG_30); } else { - bombBagUpgrade = Randomizer_GetItemIdFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40); + EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40)); } - EnGo2_GetItem(this, globalCtx, bombBagUpgrade); Message_CloseTextbox(globalCtx); gSaveContext.infTable[17] |= 0x4000; return 2; @@ -542,7 +546,7 @@ s16 EnGo2_GetStateGoronCityLink(GlobalContext* globalCtx, EnGo2* this) { } gSaveContext.infTable[16] |= 0x200; - EnGo2_GetItem(this, globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON)); + EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON)); this->actionFunc = EnGo2_SetupGetItem; Flags_SetTreasure(globalCtx, 0x1F); return 2; @@ -621,7 +625,7 @@ s16 EnGo2_GetStateGoronDmtBiggoron(GlobalContext* globalCtx, EnGo2* this) { return 0; } - EnGo2_GetItem(this, globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS)); + EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS)); Flags_SetTreasure(globalCtx, 0x1F); } else { EnGo2_GetItem(this, globalCtx, GI_SWORD_BGS); @@ -1569,6 +1573,7 @@ void EnGo2_Init(Actor* thisx, GlobalContext* globalCtx) { this->unk_216 = this->actor.shape.rot.z; this->unk_26E = 1; this->path = Path_GetByIndex(globalCtx, (this->actor.params & 0x3E0) >> 5, 0x1F); + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; switch (this->actor.params & 0x1F) { case GORON_CITY_ENTRANCE: case GORON_CITY_ISLAND: @@ -1808,8 +1813,11 @@ void EnGo2_SetupGetItem(EnGo2* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnGo2_SetGetItem; } else { - func_8002F434(&this->actor, globalCtx, this->getItemId, this->actor.xzDistToPlayer + 1.0f, - fabsf(this->actor.yDistToPlayer) + 1.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h index d31eb7678..1618005f9 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.h @@ -104,6 +104,7 @@ typedef struct EnGo2 { /* 0x0598 */ char unk_598[0x02]; /* 0x059A */ s16 camId; /* 0x059C */ s16 unk_59C; + /* */ GetItemEntry getItemEntry; } EnGo2; // size = 0x05A0 #endif diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index af4eb8ef4..5c2340ce7 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -659,7 +659,18 @@ s16 func_80A70058(GlobalContext* globalCtx, Actor* thisx) { gSaveContext.dogParams = 0; break; case 0x709F: - func_80A6F7CC(this, globalCtx, (gSaveContext.infTable[25] & 2) ? GI_RUPEE_BLUE : gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE) : GI_HEART_PIECE); + if (gSaveContext.infTable[25] & 2) { // Already brought the lost dog back + func_80A6F7CC(this, globalCtx, GI_RUPEE_BLUE); + } else { + if (!gSaveContext.n64ddFlag) { + func_80A6F7CC(this, globalCtx, GI_HEART_PIECE); + } else { + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE); + // The follownig line and last arguments of GiveItemEntryFromActor are copied from func_80A6F7CC + this->unkGetItemId = this->getItemEntry.getItemId; + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } + } this->actionFunc = func_80A714C4; break; } @@ -883,6 +894,7 @@ void EnHy_Init(Actor* thisx, GlobalContext* globalCtx) { Actor_Kill(&this->actor); } + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = EnHy_InitImpl; } @@ -1050,8 +1062,11 @@ void func_80A714C4(EnHy* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = func_80A71530; } else { - func_8002F434(&this->actor, globalCtx, this->unkGetItemId, this->actor.xzDistToPlayer + 1.0f, - fabsf(this->actor.yDistToPlayer) + 1.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->unkGetItemId, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h index f7e66544d..253d8df7d 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.h @@ -59,6 +59,7 @@ typedef struct EnHy { /* 0x0270 */ Vec3s jointTable[16]; /* 0x02D0 */ Vec3s morphTable[16]; /* 0x0330 */ u16 unk_330; + /* */ GetItemEntry getItemEntry; } EnHy; // size = 0x0334 #endif diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index cda6e476d..b65f4f74a 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -453,6 +453,7 @@ void EnKz_Wait(EnKz* this, GlobalContext* globalCtx) { } void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; f32 xzRange; f32 yRange; @@ -464,17 +465,23 @@ void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { } else { if (gSaveContext.n64ddFlag) { if (this->isTrading) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG); + getItemId = getItemEntry.getItemId; Flags_SetTreasure(globalCtx, 0x1F); } else { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA); + getItemId = getItemEntry.getItemId; } } else { getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA; } yRange = fabsf(this->actor.yDistToPlayer) + 1.0f; xzRange = this->actor.xzDistToPlayer + 1.0f; - func_8002F434(&this->actor, globalCtx, getItemId, xzRange, yRange); + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, xzRange, yRange); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzRange, yRange); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index b0ff90eac..88c5b0724 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -338,11 +338,11 @@ void func_80AA0EA0(EnMa1* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = func_80AA0EFC; } else { - if (gSaveContext.n64ddFlag) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG); - func_8002F434(&this->actor, globalCtx, getItemId, 120.0f, 10.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_WEIRD_EGG, 120.0f, 10.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 120.0f, 10.0f); } } } @@ -357,7 +357,7 @@ void func_80AA0EFC(EnMa1* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_EPONAS_SONG); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_EPONAS_SONG); // Prevents flag from getting set if we weren't able to get the item (i.e. Player is holding shield // when closing the textbox). if (malon->actor.parent != NULL && malon->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && @@ -367,7 +367,7 @@ void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, Randomiz // (confirmed via breakpoints in a vanilla save). malon->actionFunc = func_80AA0D88; } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&malon->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&malon->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } // make malon sing again after giving the item. malon->unk_1E8.unk_00 = 0; diff --git a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c index f42e09522..a53aeadf9 100644 --- a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c +++ b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c @@ -198,14 +198,24 @@ void func_80AACFA0(EnMk* this, GlobalContext* globalCtx) { gSaveContext.itemGetInf[1] |= 1; } else { // not sure when/how/if this is getting called - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE) : GI_HEART_PIECE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } void func_80AAD014(EnMk* this, GlobalContext* globalCtx) { if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { this->actionFunc = func_80AACFA0; - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE) : GI_HEART_PIECE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } this->flags |= 1; diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c index c31f2b923..01f170506 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c @@ -88,6 +88,7 @@ void EnNiwLady_Init(Actor* thisx, GlobalContext* globalCtx) { osSyncPrintf("\n\n"); this->actionFunc = func_80AB9F24; thisx->uncullZoneForward = 600.0f; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } void EnNiwLady_Destroy(Actor* thisx, GlobalContext* globalCtx) { @@ -304,12 +305,12 @@ void func_80ABA654(EnNiwLady* this, GlobalContext* globalCtx) { if (!(gSaveContext.itemGetInf[0] & 0x1000)) { this->actor.parent = NULL; - if (gSaveContext.n64ddFlag) { - s32 itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); - func_8002F434(&this->actor, globalCtx, itemId, 100.0f, 50.0f); - } else { + if (!gSaveContext.n64ddFlag) { this->getItemId = GI_BOTTLE; func_8002F434(&this->actor, globalCtx, GI_BOTTLE, 100.0f, 50.0f); + } else { + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 100.0f, 50.0f); } this->actionFunc = func_80ABAC00; @@ -394,11 +395,12 @@ void func_80ABA9B8(EnNiwLady* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->actor.parent = NULL; - if (gSaveContext.n64ddFlag) { - s32 itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); - func_8002F434(&this->actor, globalCtx, itemId, 200.0f, 100.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_POCKET_EGG, 200.0f, 100.0f); + } else { + // TODO: get-item-rework Adult trade sequence + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f); } this->actionFunc = func_80ABAC00; @@ -455,10 +457,14 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) { getItemId = !(gSaveContext.itemGetInf[2] & 0x1000) ? GI_POCKET_EGG : GI_COJIRO; if (gSaveContext.n64ddFlag && getItemId == GI_POCKET_EGG) { - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + // TODO: get-item-rework Adult trade sequence + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f); } } - func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f); + if (this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h index 57ba86f2d..5fe9684f4 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h @@ -40,6 +40,7 @@ typedef struct EnNiwLady { /* 0x0284 */ s32 getItemId; /* 0x0288 */ struct_80034A14_arg1 unk_288; /* 0x02B0 */ ColliderCylinder collider; + /* 0x02FC */ GetItemEntry getItemEntry; } EnNiwLady; // size = 0x02FC #endif diff --git a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c index 56bd79e7b..978d61da7 100644 --- a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c +++ b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c @@ -324,8 +324,8 @@ void func_80ABF708(EnOkarinaTag* this, GlobalContext* globalCtx) { void GivePlayerRandoRewardSunSong(EnOkarinaTag* song, GlobalContext* globalCtx, RandomizerCheck check) { Flags_SetTreasure(globalCtx, 0x1F); - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_LETTER_ZELDA); - func_8002F434(&song->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA); + GiveItemEntryFromActor(&song->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } void func_80ABF7CC(EnOkarinaTag* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c index c6dd38acc..6d9c160a8 100644 --- a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c +++ b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c @@ -618,14 +618,12 @@ void func_80AF67D0(EnSa* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardSaria(EnSa* saria, GlobalContext* globalCtx, RandomizerCheck check) { - GetItemID getItemId = - Randomizer_GetItemIdFromKnownCheck(check, GI_SARIAS_SONG); - + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SARIAS_SONG); if (saria->actor.parent != NULL && saria->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && !Flags_GetTreasure(globalCtx, 0x1F)) { Flags_SetTreasure(globalCtx, 0x1F); } else if (!Flags_GetTreasure(globalCtx, 0x1F)) { - func_8002F434(&saria->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GiveItemEntryFromActor(&saria->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index 8929e6362..cded4c801 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1035,8 +1035,12 @@ void EnSkj_SariaSongTalk(EnSkj* this, GlobalContext* globalCtx) { EnSkj_SetupWaitInRange(this); } else { func_80AFFE24(this); - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE) : GI_HEART_PIECE, EnSkj_GetItemXzRange(this), - EnSkj_GetItemYRange(this)); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } } } } @@ -1050,7 +1054,12 @@ void func_80AFFE44(EnSkj* this, GlobalContext* globalCtx) { this->actor.parent = NULL; EnSkj_SetupPostSariasSong(this); } else { - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE) : GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); + } } } @@ -1527,11 +1536,12 @@ void EnSkj_WonOcarinaMiniGame(EnSkj* this, GlobalContext* globalCtx) { void EnSkj_WaitToGiveReward(EnSkj* this, GlobalContext* globalCtx) { if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) { - func_8002F434(&this->actor, globalCtx, - gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 - ? Randomizer_GetItemIdFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE) - : sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], - 26.0f, 26.0f); + if (gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 26.0f, 26.0f); + } else { + func_8002F434(&this->actor, globalCtx, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); + } this->actionFunc = EnSkj_GiveOcarinaGameReward; } @@ -1542,11 +1552,12 @@ void EnSkj_GiveOcarinaGameReward(EnSkj* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = EnSkj_FinishOcarinaGameRound; } else { - func_8002F434(&this->actor, globalCtx, - gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 - ? Randomizer_GetItemIdFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE) - : sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], - 26.0f, 26.0f); + if (gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 26.0f, 26.0f); + } else { + func_8002F434(&this->actor, globalCtx, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c index b01c6b8c4..bfaf4188f 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -239,27 +239,29 @@ void EnSth_ParentRewardObtainedWait(EnSth* this, GlobalContext* globalCtx) { void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { u16 getItemId = sGetItemIds[this->actor.params]; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; if (gSaveContext.n64ddFlag) { switch (getItemId) { case GI_RUPEE_GOLD: break; case GI_WALLET_ADULT: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT); break; case GI_STONE_OF_AGONY: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY); break; case GI_WALLET_GIANT: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT); break; case GI_BOMBCHUS_10: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10); break; case GI_HEART_PIECE: - getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE); + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE); break; } + getItemId = getItemEntry.getItemId; } else { switch (this->actor.params) { case 1: @@ -277,7 +279,11 @@ void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { } } - func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } void EnSth_GiveReward(EnSth* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 7b57bea89..a6ddb5844 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -169,6 +169,7 @@ void EnSyatekiMan_Init(Actor* thisx, GlobalContext* globalCtx) { this->blinkFunc = EnSyatekiMan_BlinkWait; this->actor.colChkInfo.cylRadius = 100; this->actionFunc = EnSyatekiMan_Start; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } void EnSyatekiMan_Destroy(Actor* thisx, GlobalContext* globalCtx) { @@ -336,7 +337,8 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { this->actor.parent = NULL; if (!LINK_IS_ADULT) { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1E)) { - this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50); + this->getItemId = this->getItemEntry.getItemId; Flags_SetTreasure(globalCtx, 0x1E); } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x2000)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Pachinko ☆☆☆☆☆ %d\n" VT_RST, @@ -351,7 +353,8 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { } } else { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1F)) { - this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50); + this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50); + this->getItemId = this->getItemEntry.getItemId; Flags_SetTreasure(globalCtx, 0x1F); } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x4000)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Bow ☆☆☆☆☆ %d\n" VT_RST, @@ -371,7 +374,11 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) { this->getItemId = GI_RUPEE_PURPLE; } } - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } this->actionFunc = EnSyatekiMan_GivePrize; break; case SYATEKI_RESULT_ALMOST: @@ -400,7 +407,11 @@ void EnSyatekiMan_GivePrize(EnSyatekiMan* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { this->actionFunc = EnSyatekiMan_FinishPrize; } else { - func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h index d82cdf9c7..9caa7c88f 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h @@ -28,6 +28,7 @@ typedef struct EnSyatekiMan { /* 0x0220 */ Actor* tempGallery; /* 0x0224 */ EnSyatekiManOtherFunc blinkFunc; // Seems to be part of a blink system with unk_20C and unk_20E, but it's unused. /* 0x0228 */ s16 csCam; + /* */ GetItemEntry getItemEntry; } EnSyatekiMan; // size = 0x022C #endif diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 85e47a7e7..b7b964272 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -876,7 +876,12 @@ void func_80B15E80(EnTa* this, GlobalContext* globalCtx) { } else if (this->unk_2E0 & 2) { func_8002F434(&this->actor, globalCtx, GI_MILK, 10000.0f, 50.0f); } else { - func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } this->unk_2E0 |= 1; } @@ -886,7 +891,12 @@ void func_80B15F54(EnTa* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->unk_2E0 &= ~0x2; func_80B13AA0(this, func_80B15E80, func_80B16938); - func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE) : GI_MILK_BOTTLE, 10000.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f); + } } } diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index d9f96e177..90e401f06 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -289,18 +289,18 @@ void func_80B3CA38(EnXc* this, GlobalContext* globalCtx) { void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, RandomizerCheck check, int sheikType, GetItemID ogSongId) { Player* player = GET_PLAYER(globalCtx); - if (sheik->actor.parent != NULL && sheik->actor.parent->id == player->actor.id && - !(gSaveContext.eventChkInf[5] & sheikType)) { - gSaveContext.eventChkInf[5] |= sheikType; - } else if (!(gSaveContext.eventChkInf[5] & sheikType)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, ogSongId); + if (!(gSaveContext.eventChkInf[5] & sheikType)) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { - if (func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f)) { + if (GiveItemEntryFromActor(&sheik->actor, globalCtx, getItemEntry, 10000.0f, 100.0f)) { player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } } else if (check != RC_SHEIK_AT_TEMPLE) { - func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f); + if (GiveItemEntryFromActor(&sheik->actor, globalCtx, getItemEntry, 10000.0f, 100.0f)) { + player->pendingFlag.flagID = 0x55; + player->pendingFlag.flagType = FLAG_EVENT_CHECK_INF; + } } } } @@ -318,7 +318,7 @@ s32 EnXc_MinuetCS(EnXc* this, GlobalContext* globalCtx) { gSaveContext.eventChkInf[5] |= 1; Item_Give(globalCtx, ITEM_SONG_MINUET); } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_FOREST, 1, GI_MINUET_OF_FOREST); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_FOREST, 1, RG_MINUET_OF_FOREST); return false; } return true; @@ -354,7 +354,7 @@ s32 EnXc_BoleroCS(EnXc* this, GlobalContext* globalCtx) { gSaveContext.eventChkInf[5] |= 2; Item_Give(globalCtx, ITEM_SONG_BOLERO); } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_CRATER, 2, GI_BOLERO_OF_FIRE); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_CRATER, 2, RG_BOLERO_OF_FIRE); return false; } return true; @@ -395,7 +395,7 @@ s32 EnXc_SerenadeCS(EnXc* this, GlobalContext* globalCtx) { gSaveContext.eventChkInf[5] |= 4; // Learned Serenade of Water Flag Item_Give(globalCtx, ITEM_SONG_SERENADE); } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_ICE_CAVERN, 4, GI_SERENADE_OF_WATER); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_ICE_CAVERN, 4, RG_SERENADE_OF_WATER); return false; } osSyncPrintf("ブーツを取った!!!!!!!!!!!!!!!!!!\n"); @@ -2206,7 +2206,7 @@ void EnXc_InitTempleOfTime(EnXc* this, GlobalContext* globalCtx) { gSaveContext.cutsceneTrigger = 1; this->action = SHEIK_ACTION_30; } else { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, GI_PRELUDE_OF_LIGHT); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, RG_PRELUDE_OF_LIGHT); } } else if (!(gSaveContext.eventChkInf[5] & 0x20)) { func_80B3C9EC(this); @@ -2348,7 +2348,7 @@ void EnXc_Update(Actor* thisx, GlobalContext* globalCtx) { if (this->actor.params == SHEIK_TYPE_9) { if (gSaveContext.n64ddFlag && LINK_IS_ADULT) { if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && !(gSaveContext.eventChkInf[5] & 0x20)) { - GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, GI_PRELUDE_OF_LIGHT); + GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, RG_PRELUDE_OF_LIGHT); } } } diff --git a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c index d4250fca2..96bf18aef 100644 --- a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c +++ b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c @@ -233,8 +233,8 @@ void GivePlayerRandoRewardZeldaChild(EnZl4* zelda, GlobalContext* globalCtx, Ran Flags_SetTreasure(globalCtx, 0x1E); } else if (!Flags_GetTreasure(globalCtx, 0x1E) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA) && Actor_TextboxIsClosing(&zelda->actor, globalCtx) && (globalCtx->msgCtx.textId == 0x703C || globalCtx->msgCtx.textId == 0x703D)) { - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_LETTER_ZELDA); - func_8002F434(&zelda->actor, globalCtx, getItemId, 10000.0f, 100.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA); + GiveItemEntryFromActor(&zelda->actor, globalCtx, getItemEntry, 10000.0f, 100.0f); } else if (Flags_GetTreasure(globalCtx, 0x1E) && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { gSaveContext.unk_13EE = 0x32; gSaveContext.eventChkInf[4] |= 1; diff --git a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c index b562dad30..1336a0dcd 100644 --- a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c +++ b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c @@ -5000,6 +5000,7 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_NONE)) && Message_ShouldAdvance(globalCtx)) { s32 getItemId; + GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; Message_CloseTextbox(globalCtx); @@ -5054,9 +5055,12 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) { HIGH_SCORE(HS_FISHING) |= 0x400; sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1; - getItemId = gSaveContext.n64ddFlag ? - Randomizer_GetItemIdFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE) : - GI_HEART_PIECE; + if (!gSaveContext.n64ddFlag) { + getItemId = GI_HEART_PIECE; + } else { + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE); + getItemId = getItemEntry.getItemId; + } } } } else { @@ -5064,9 +5068,12 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) { HIGH_SCORE(HS_FISHING) |= 0x800; sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1; - getItemId = gSaveContext.n64ddFlag ? - Randomizer_GetItemIdFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD) : - GI_SCALE_GOLD; + if (!gSaveContext.n64ddFlag) { + getItemId = GI_SCALE_GOLD; + } else { + getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD); + getItemId = getItemEntry.getItemId; + } } } } @@ -5076,7 +5083,11 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { } this->actor.parent = NULL; - func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) { + func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); + } else { + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); + } this->unk_15C = 23; } break; @@ -5140,9 +5151,8 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_SCALE_GOLD, 2000.0f, 1000.0f); } else { - func_8002F434(&this->actor, globalCtx, - Randomizer_GetItemIdFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD), 2000.0f, - 1000.0f); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f); } } break; diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index e32ab216f..304c3053d 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -59,11 +59,11 @@ void ItemBHeart_Update(Actor* thisx, GlobalContext* globalCtx) { Flags_SetCollectible(globalCtx, 0x1F); Actor_Kill(&this->actor); } else { - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum); - func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 40.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, GI_HEART_CONTAINER_2, 30.0f, 40.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 40.0f); } } } @@ -99,8 +99,8 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) { } if (gSaveContext.n64ddFlag) { - GetItem_Draw(globalCtx, - Randomizer_GetItemModelFromId(Randomizer_GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum))); + GetItem_Draw(globalCtx, Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, + this->actor.id,this->actor.params, globalCtx->sceneNum).gid); } else { if (flag) { func_80093D84(globalCtx->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index 7b422d140..eb6efef7b 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -21,6 +21,7 @@ void ItemEtcetera_SpawnSparkles(ItemEtcetera* this, GlobalContext* globalCtx); void ItemEtcetera_MoveFireArrowDown(ItemEtcetera* this, GlobalContext* globalCtx); void func_80B85B28(ItemEtcetera* this, GlobalContext* globalCtx); void ItemEtcetera_UpdateFireArrow(ItemEtcetera* this, GlobalContext* globalCtx); +GetItemEntry GetChestGameRandoGetItem(s8 room, s16 ogDrawId, GlobalContext* globalCtx); const ActorInit Item_Etcetera_InitVars = { ACTOR_ITEM_ETCETERA, @@ -132,11 +133,11 @@ void func_80B85824(ItemEtcetera* this, GlobalContext* globalCtx) { } Actor_Kill(&this->actor); } else { - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); - func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 50.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f); } } } @@ -155,11 +156,11 @@ void func_80B858B4(ItemEtcetera* this, GlobalContext* globalCtx) { } else { if (0) {} // Necessary to match - if (gSaveContext.n64ddFlag) { - s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); - func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 50.0f); - } else { + if (!gSaveContext.n64ddFlag) { func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f); } if ((globalCtx->gameplayFrames & 0xD) == 0) { @@ -229,13 +230,10 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, GlobalContext* globalCtx) { func_8002ED80(&this->actor, globalCtx, 0); if(gSaveContext.n64ddFlag && globalCtx->sceneNum == 16) { - s32 randoGetItemId = GetChestGameRandoGetItemId(this->actor.room, this->giDrawId, globalCtx); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - if (randoGetItemId != GI_NONE) { - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, globalCtx); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + if (randoGetItem.itemId != ITEM_NONE) { + GetItem_Draw(globalCtx, randoGetItem.gid); return; } } @@ -249,20 +247,17 @@ void ItemEtcetera_Draw(Actor* thisx, GlobalContext* globalCtx) { s32 type = this->actor.params & 0xFF; if (gSaveContext.n64ddFlag) { - s32 randoGetItemId = GI_NONE; + GetItemEntry randoGetItem = (GetItemEntry)GET_ITEM_NONE; if (type == ITEM_ETC_ARROW_FIRE) { - randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); } else if (type == ITEM_ETC_LETTER) { - randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); } - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - if (randoGetItemId != GI_NONE) { - this->giDrawId = Randomizer_GetItemModelFromId(randoGetItemId); + if (randoGetItem.itemId != RG_NONE) { + this->giDrawId = randoGetItem.gid; } } diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index f58b0927a..7acfa4b62 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -190,11 +190,12 @@ void ItemOcarina_WaitInWater(ItemOcarina* this, GlobalContext* globalCtx) { this->actionFunc = ItemOcarina_StartSoTCutscene; this->actor.draw = NULL; } else { - func_8002F434(&this->actor, globalCtx, - gSaveContext.n64ddFlag - ? Randomizer_GetItemIdFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT) - : GI_OCARINA_OOT, - 30.0f, 50.0f); + if (!gSaveContext.n64ddFlag) { + func_8002F434(&this->actor, globalCtx, GI_OCARINA_OOT, 30.0f, 50.0f); + } else { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); + GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f); + } if ((globalCtx->gameplayFrames & 13) == 0) { EffectSsBubble_Spawn(globalCtx, &this->actor.world.pos, 0.0f, 0.0f, 10.0f, 0.13f); @@ -215,12 +216,9 @@ void ItemOcarina_Draw(Actor* thisx, GlobalContext* globalCtx) { func_8002ED80(thisx, globalCtx, 0); if (gSaveContext.n64ddFlag) { - s32 randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); - if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || - (randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); - } - GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId)); + GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + GetItem_Draw(globalCtx, ABS(randoGetItem.gi) - 1); return; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index a480de1fe..d0f5a6b56 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -21,23 +21,7 @@ #include "objects/object_link_child/object_link_child.h" #include "textures/icon_item_24_static/icon_item_24_static.h" #include - -typedef struct { - /* 0x00 */ u8 itemId; - /* 0x01 */ u8 field; // various bit-packed data - /* 0x02 */ s8 gi; // defines the draw id and chest opening animation - /* 0x03 */ u8 textId; - /* 0x04 */ u16 objectId; -} GetItemEntry; // size = 0x06 - -#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } - -#define CHEST_ANIM_SHORT 0 -#define CHEST_ANIM_LONG 1 - -#define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, OBJECT_INVALID } +#include typedef enum { /* 0x00 */ KNOB_ANIM_ADULT_L, @@ -498,176 +482,6 @@ static u16 D_8085361C[] = { NA_SE_VO_LI_FALL_L, }; -static GetItemEntry sGetItemTable[] = { - GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG), - GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT), - GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x3C, 0x80, CHEST_ANIM_SHORT), // Ice Traps - GET_ITEM_NONE, - - GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_SINGLE_MAGIC, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_DOUBLE_MAGIC, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG), - - GET_ITEM(ITEM_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - GET_ITEM(ITEM_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG), - - GET_ITEM_NONE, - GET_ITEM_NONE, -}; - static LinkAnimationHeader* D_80853914[PLAYER_ANIMGROUP_MAX][PLAYER_ANIMTYPE_MAX] = { /* PLAYER_ANIMGROUP_0 */ { &gPlayerAnim_003240, &gPlayerAnim_003238, &gPlayerAnim_003238, &gPlayerAnim_002BE0, &gPlayerAnim_003240, @@ -1594,9 +1408,14 @@ s32 func_808332E4(Player* this) { } void func_808332F4(Player* this, GlobalContext* globalCtx) { - GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1]; + GetItemEntry giEntry; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(this->getItemId); + } else { + giEntry = this->getItemEntry; + } - this->unk_862 = ABS(giEntry->gi); + this->unk_862 = ABS(giEntry.gi); } static LinkAnimationHeader* func_80833338(Player* this) { @@ -1783,6 +1602,7 @@ void func_808337D4(GlobalContext* globalCtx, Player* this) { this->interactRangeActor = spawnedActor; this->heldActor = spawnedActor; this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->unk_3BC.y = spawnedActor->shape.rot.y - this->actor.shape.rot.y; this->stateFlags1 |= PLAYER_STATE1_11; } @@ -5003,7 +4823,7 @@ static LinkAnimationHeader* D_80854548[] = { s32 func_8083B040(Player* this, GlobalContext* globalCtx) { s32 sp2C; s32 sp28; - GetItemEntry* giEntry; + GetItemEntry giEntry; Actor* targetActor; if ((this->unk_6AD != 0) && @@ -5040,8 +4860,12 @@ s32 func_8083B040(Player* this, GlobalContext* globalCtx) { func_80835DE4(globalCtx, this, func_8084F104, 0); if (sp2C >= 0) { - giEntry = &sGetItemTable[D_80854528[sp2C] - 1]; - func_8083AE40(this, giEntry->objectId); + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(D_80854528[sp2C]); + } else { + giEntry = this->getItemEntry; + } + func_8083AE40(this, giEntry.objectId); } this->stateFlags1 |= PLAYER_STATE1_6 | PLAYER_STATE1_28 | PLAYER_STATE1_29; @@ -6258,6 +6082,9 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { case FLAG_SCENE_TREASURE: Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); break; + case FLAG_EVENT_CHECK_INF: + Flags_SetEventChkInf(this->pendingFlag.flagID); + break; case FLAG_NONE: default: break; @@ -6276,16 +6103,20 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->getItemId = iREG(68); } - if (this->getItemId < GI_MAX) { - GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1]; - + GetItemEntry giEntry; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(this->getItemId); + } else { + giEntry = this->getItemEntry; + } + if (giEntry.collectable) { if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; } iREG(67) = false; - if (gSaveContext.n64ddFlag && this->getItemId == GI_ICE_TRAP) { + if (gSaveContext.n64ddFlag && this->getItemId == RG_ICE_TRAP) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->actor.colChkInfo.damage = 0; func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); @@ -6293,24 +6124,25 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { return 1; } - s32 drop = giEntry->objectId; + s32 drop = giEntry.objectId; if (gSaveContext.n64ddFlag || (globalCtx->sceneNum == SCENE_BOWLING) || !(CVar_GetS32("gFastDrops", 0) && ((drop == OBJECT_GI_BOMB_1) || (drop == OBJECT_GI_NUTS) || (drop == OBJECT_GI_STICK) || (drop == OBJECT_GI_SEED) || (drop == OBJECT_GI_MAGICPOT) || (drop == OBJECT_GI_ARROW))) && - (Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) { + (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE)) { if (gSaveContext.n64ddFlag && ((interactedActor->id == ACTOR_EN_ITEM00 && (interactedActor->params != 6 && interactedActor->params != 17)) || (interactedActor->id == ACTOR_EN_KAREBABA || interactedActor->id == ACTOR_EN_DEKUBABA))) { - func_8083E4C4(globalCtx, this, giEntry); + func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; return 0; } func_808323B4(globalCtx, this); - func_8083AE40(this, giEntry->objectId); + func_8083AE40(this, giEntry.objectId); if (!(this->stateFlags2 & PLAYER_STATE2_10) || (this->currentBoots == PLAYER_BOOTS_IRON)) { func_80836898(globalCtx, this, func_8083A434); @@ -6323,29 +6155,35 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { return 1; } - func_8083E4C4(globalCtx, this, giEntry); + func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { if (this->getItemId != GI_NONE) { - GetItemEntry* giEntry = &sGetItemTable[-this->getItemId - 1]; + GetItemEntry giEntry; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(-this->getItemId); + } else { + giEntry = this->getItemEntry; + } EnBox* chest = (EnBox*)interactedActor; if (CVar_GetS32("gFastChests", 0) != 0) { - giEntry->gi = -1 * abs(giEntry->gi); + giEntry.gi = -1 * abs(giEntry.gi); } - if (giEntry->itemId != ITEM_NONE) { - if (((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) && (giEntry->field & 0x40)) || - ((Item_CheckObtainability(giEntry->itemId) != ITEM_NONE) && (giEntry->field & 0x20))) { + if (giEntry.itemId != ITEM_NONE) { + if (((Item_CheckObtainability(giEntry.itemId) == ITEM_NONE) && (giEntry.field & 0x40)) || + ((Item_CheckObtainability(giEntry.itemId) != ITEM_NONE) && (giEntry.field & 0x20))) { this->getItemId = -GI_RUPEE_BLUE; - giEntry = &sGetItemTable[GI_RUPEE_BLUE - 1]; + giEntry = ItemTable_Retrieve(GI_RUPEE_BLUE); } } func_80836898(globalCtx, this, func_8083A434); this->stateFlags1 |= PLAYER_STATE1_10 | PLAYER_STATE1_11 | PLAYER_STATE1_29; - func_8083AE40(this, giEntry->objectId); + func_8083AE40(this, giEntry.objectId); this->actor.world.pos.x = chest->dyna.actor.world.pos.x - (Math_SinS(chest->dyna.actor.shape.rot.y) * 29.4343f); this->actor.world.pos.z = @@ -6353,8 +6191,8 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->currentYaw = this->actor.shape.rot.y = chest->dyna.actor.shape.rot.y; func_80832224(this); - if ((giEntry->itemId != ITEM_NONE) && (giEntry->gi >= 0) && - (Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) { + if ((giEntry.itemId != ITEM_NONE) && (giEntry.gi >= 0) && + (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE)) { func_808322D0(globalCtx, this, this->ageProperties->unk_98); func_80832F54(globalCtx, this, 0x28F); chest->unk_1F4 = 1; @@ -6752,6 +6590,7 @@ s32 func_8083F7BC(Player* this, GlobalContext* globalCtx) { this->stateFlags1 |= PLAYER_STATE1_11; this->interactRangeActor = &wallPolyActor->actor; this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->currentYaw = this->actor.wallYaw + 0x8000; func_80832224(this); @@ -12690,6 +12529,7 @@ void func_8084DF6C(GlobalContext* globalCtx, Player* this) { this->unk_862 = 0; this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; func_8005B1A4(Gameplay_GetCamera(globalCtx, 0)); } @@ -12701,16 +12541,20 @@ void func_8084DFAC(GlobalContext* globalCtx, Player* this) { } s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { - GetItemEntry* giEntry; + GetItemEntry giEntry; s32 temp1; s32 temp2; - if (this->getItemId == GI_NONE) { + if (this->getItemId == GI_NONE && this->getItemEntry.objectId == OBJECT_INVALID) { return 1; } if (this->unk_84F == 0) { - giEntry = &sGetItemTable[this->getItemId - 1]; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + giEntry = ItemTable_Retrieve(this->getItemId); + } else { + giEntry = this->getItemEntry; + } this->unk_84F = 1; // make sure we get the BGS instead of giant's knife @@ -12719,30 +12563,76 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { gSaveContext.swordHealth = 8; } - Message_StartTextbox(globalCtx, giEntry->textId, &this->actor); - Item_Give(globalCtx, giEntry->itemId); - + Message_StartTextbox(globalCtx, giEntry.textId, &this->actor); + if (giEntry.modIndex == MOD_NONE) { + Item_Give(globalCtx, giEntry.itemId); + } else { + Randomizer_Item_Give(globalCtx, giEntry); + } Player_SetPendingFlag(this, globalCtx); - if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || - ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || - ((this->getItemId >= GI_RUPEE_GREEN_LOSE) && (this->getItemId <= GI_RUPEE_PURPLE_LOSE)) || - (this->getItemId == GI_HEART)) { - Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - } - else { - if ((this->getItemId == GI_HEART_CONTAINER_2) || (this->getItemId == GI_HEART_CONTAINER) || - ((this->getItemId == GI_HEART_PIECE) && - ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { - temp1 = NA_BGM_HEART_GET | 0x900; + if (this->getItemEntry.objectId == OBJECT_INVALID) { + // Use this if player does not have a getItemEntry + if (giEntry.modIndex == MOD_NONE) { + if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || + ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || + ((this->getItemId >= GI_RUPEE_GREEN_LOSE) && (this->getItemId <= GI_RUPEE_PURPLE_LOSE)) || + (this->getItemId == GI_HEART)) { + Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); + } else { + if ((this->getItemId == GI_HEART_CONTAINER_2) || (this->getItemId == GI_HEART_CONTAINER) || + ((this->getItemId == GI_HEART_PIECE) && + ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { + temp1 = NA_BGM_HEART_GET | 0x900; + } else { + temp1 = temp2 = + (this->getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } + Audio_PlayFanfare(temp1); + } + } else if (giEntry.modIndex == MOD_RANDOMIZER) { + if (this->getItemId == RG_DOUBLE_DEFENSE || this->getItemId == RG_MAGIC_SINGLE || + this->getItemId == RG_MAGIC_DOUBLE) { + Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); + } else { + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); + } + } else { + // Just in case something weird happens with MOD_INDEX + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } - else { - temp1 = temp2 = (this->getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } else { + // Use this if we do have a getItemEntry + if (giEntry.modIndex == MOD_NONE) { + if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) || + ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) || + (giEntry.itemId == ITEM_HEART)) { + Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); + } else { + if ((giEntry.itemId == ITEM_HEART_CONTAINER) || + ((giEntry.itemId == ITEM_HEART_PIECE) && + ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { + temp1 = NA_BGM_HEART_GET | 0x900; + } else { + temp1 = temp2 = + (giEntry.itemId == ITEM_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; + } + Audio_PlayFanfare(temp1); + } + } else if (giEntry.modIndex == MOD_RANDOMIZER) { + if (giEntry.itemId == RG_DOUBLE_DEFENSE || giEntry.itemId == RG_MAGIC_SINGLE || + giEntry.itemId == RG_MAGIC_DOUBLE) { + Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900); + } else { + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); + } + } else { + // Just in case something weird happens with modIndex. + Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } - Audio_PlayFanfare(temp1); } - } - else { + //this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; + } else { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x0123; @@ -12753,6 +12643,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { func_80852FFC(globalCtx, NULL, 8); } this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } } @@ -12917,15 +12808,16 @@ void func_8084E6D4(Player* this, GlobalContext* globalCtx) { else { func_80832DBC(this); - if (this->getItemId == GI_ICE_TRAP) { + if ((this->getItemId == GI_ICE_TRAP && !gSaveContext.n64ddFlag) || + (gSaveContext.n64ddFlag && this->getItemId == RG_ICE_TRAP)) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); - if (this->getItemId != GI_ICE_TRAP) { + if ((this->getItemId != GI_ICE_TRAP && !gSaveContext.n64ddFlag) || + (gSaveContext.n64ddFlag && this->getItemId != RG_ICE_TRAP)) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0); func_8083C0E8(this, globalCtx); - } - else { + } else { this->actor.colChkInfo.damage = 0; func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); } @@ -13314,14 +13206,14 @@ void func_8084F104(Player* this, GlobalContext* globalCtx) { func_80853148(globalCtx, targetActor); } else { - GetItemEntry* giEntry = &sGetItemTable[D_80854528[this->exchangeItemId - 1] - 1]; + GetItemEntry giEntry = ItemTable_Retrieve(D_80854528[this->exchangeItemId - 1]); if (this->itemActionParam >= PLAYER_AP_LETTER_ZELDA) { - if (giEntry->gi >= 0) { - this->unk_862 = giEntry->gi; + if (giEntry.gi >= 0) { + this->unk_862 = giEntry.gi; } else { - this->unk_862 = -giEntry->gi; + this->unk_862 = -giEntry.gi; } } From d7356160206bf56984b09dc059bc0643ae5d3cd6 Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Wed, 24 Aug 2022 01:12:14 +0100 Subject: [PATCH 177/212] Adds game specific camera options (#1212) * Adds inversion options * Fixes compilation * Adds options to new detailed control editor * Fixes inversion on C-Up view * Fixes right stick aiming * Fixes right stick aiming again * Adds tooltip function + tooltips to gamecontroleditor.cpp * Fixes tooltip for X axis * Uses LUS tooltip function instead of new one * Adds padding to camera control editor To fit more in line with other enhancement checkboxes --- soh/soh/Enhancements/bootcommands.c | 1 + .../controls/GameControlEditor.cpp | 23 ++++- soh/src/code/z_camera.c | 4 +- .../actors/ovl_player_actor/z_player.c | 99 +++++++++++++------ 4 files changed, 95 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index fc6d043e2..05381b446 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -25,6 +25,7 @@ void BootCommands_Init() CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gLanguages", 0); //0 = English / 1 = German / 2 = French CVar_RegisterS32("gHudColors", 1); //0 = N64 / 1 = NGC / 2 = Custom + CVar_RegisterS32("gInvertYAxis", 1); #if defined(__SWITCH__) || defined(__WIIU__) CVar_RegisterS32("gControlNav", 1); // always enable controller nav on switch/wii u #endif diff --git a/soh/soh/Enhancements/controls/GameControlEditor.cpp b/soh/soh/Enhancements/controls/GameControlEditor.cpp index dc8d992e8..ee8e33dea 100644 --- a/soh/soh/Enhancements/controls/GameControlEditor.cpp +++ b/soh/soh/Enhancements/controls/GameControlEditor.cpp @@ -216,7 +216,27 @@ namespace GameControlEditor { ImGui::EndTable(); } - void DrawUI(bool& open) { + void DrawCameraControlPanel() { + if (!ImGui::CollapsingHeader("Camera Controls")) { + return; + } + + ImVec2 cursor = ImGui::GetCursorPos(); + ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); + SohImGui::PaddedEnhancementCheckbox("Invert Camera X Axis", "gInvertXAxis"); + SohImGui::Tooltip("Inverts the Camera X Axis in:\n-Free camera\n-C-Up view\n-Weapon Aiming"); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5); + SohImGui::PaddedEnhancementCheckbox("Invert Camera Y Axis", "gInvertYAxis"); + SohImGui::Tooltip("Inverts the Camera Y Axis in:\n-Free camera\n-C-Up view\n-Weapon Aiming"); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5); + SohImGui::PaddedEnhancementCheckbox("Right Stick Aiming", "gRightStickAiming"); + SohImGui::Tooltip("Allows for aiming with the rights stick when:\n-Aiming in the C-Up view\n-Aiming with weapons"); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5); + SohImGui::PaddedEnhancementCheckbox("Auto-Center First Person View", "gAutoCenterView"); + SohImGui::Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming"); + } + + void DrawUI(bool& open) { if (!open) { CVar_SetS32("gGameControlEditorEnabled", false); return; @@ -225,6 +245,7 @@ namespace GameControlEditor { ImGui::SetNextWindowSize(ImVec2(465, 430), ImGuiCond_FirstUseEver); if (ImGui::Begin("Game Controls Configuration", &open)) { DrawOcarinaControlPanel(); + DrawCameraControlPanel(); } ImGui::End(); } diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c index ea37cab1a..5cb01d052 100644 --- a/soh/src/code/z_camera.c +++ b/soh/src/code/z_camera.c @@ -1488,8 +1488,8 @@ s32 Camera_Free(Camera* camera) { f32 newCamX = -D_8015BD7C->state.input[0].cur.right_stick_x * 10.0f; f32 newCamY = D_8015BD7C->state.input[0].cur.right_stick_y * 10.0f; - camera->globalCtx->camX += newCamX; - camera->globalCtx->camY += newCamY; + camera->globalCtx->camX += newCamX * (CVar_GetS32("gInvertXAxis", 0) ? -1 : 1); + camera->globalCtx->camY += newCamY * (CVar_GetS32("gInvertYAxis", 0) ? 1 : -1); if (camera->globalCtx->camY > 0x32A4) { camera->globalCtx->camY = 0x32A4; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index d0f5a6b56..6cc1f2255 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -11175,42 +11175,83 @@ void Player_Destroy(Actor* thisx, GlobalContext* globalCtx) { } s16 func_8084ABD8(GlobalContext* globalCtx, Player* this, s32 arg2, s16 arg3) { - s32 temp1; - s16 temp2; - s16 temp3; + s32 temp1; + s16 temp2; + s16 temp3; - if (!func_8002DD78(this) && !func_808334B4(this) && (arg2 == 0)) { - temp2 = sControlInput->rel.stick_y * 240.0f; - Math_SmoothStepToS(&this->actor.focus.rot.x, temp2, 14, 4000, 30); + if (!func_8002DD78(this) && !func_808334B4(this) && (arg2 == 0)) { + if (CVar_GetS32("gAutoCenterView", 0) != 0) { + temp2 = sControlInput->rel.stick_y * 240.0f * (CVar_GetS32("gInvertYAxis", 0) ? -1 : 1); + Math_SmoothStepToS(&this->actor.focus.rot.x, temp2, 14, 4000, 30); - temp2 = sControlInput->rel.stick_x * -16.0f; - temp2 = CLAMP(temp2, -3000, 3000); - this->actor.focus.rot.y += temp2; - } - else { - temp1 = (this->stateFlags1 & PLAYER_STATE1_23) ? 3500 : 14000; - temp3 = ((sControlInput->rel.stick_y >= 0) ? 1 : -1) * - (s32)((1.0f - Math_CosS(sControlInput->rel.stick_y * 200)) * 1500.0f); - this->actor.focus.rot.x += temp3; + temp2 = sControlInput->rel.stick_x * -16.0f * (CVar_GetS32("gInvertXAxis", 0) ? -1 : 1); + temp2 = CLAMP(temp2, -3000, 3000); + this->actor.focus.rot.y += temp2; + } else { + temp1 = (this->stateFlags1 & PLAYER_STATE1_23) ? 3500 : 14000; + temp3 = ((sControlInput->rel.stick_y >= 0) ? 1 : -1) * + (s32)((1.0f - Math_CosS(sControlInput->rel.stick_y * 200)) * 1500.0f * (CVar_GetS32("gInvertYAxis", 0) ? 1 : -1)); + this->actor.focus.rot.x += temp3; - if (fabsf(sControlInput->cur.gyro_x) > 0.01f) { - this->actor.focus.rot.x -= (sControlInput->cur.gyro_x) * 750.0f; - } + if (fabsf(sControlInput->cur.gyro_x) > 0.01f) { + this->actor.focus.rot.x -= (sControlInput->cur.gyro_x) * 750.0f; + } + + if (fabsf(sControlInput->cur.right_stick_y) > 15.0f && CVar_GetS32("gRightStickAiming", 0) != 0) { + this->actor.focus.rot.x -= (sControlInput->cur.right_stick_y) * 10.0f * (CVar_GetS32("gInvertYAxis", 0) ? -1 : 1); + } - this->actor.focus.rot.x = CLAMP(this->actor.focus.rot.x, -temp1, temp1); + this->actor.focus.rot.x = CLAMP(this->actor.focus.rot.x, -temp1, temp1); - temp1 = 19114; - temp2 = this->actor.focus.rot.y - this->actor.shape.rot.y; - temp3 = ((sControlInput->rel.stick_x >= 0) ? 1 : -1) * - (s32)((1.0f - Math_CosS(sControlInput->rel.stick_x * 200)) * -1500.0f); - temp2 += temp3; + temp1 = 19114; + temp2 = this->actor.focus.rot.y - this->actor.shape.rot.y; + temp3 = ((sControlInput->rel.stick_x >= 0) ? 1 : -1) * + (s32)((1.0f - Math_CosS(sControlInput->rel.stick_x * 200)) * -1500.0f * (CVar_GetS32("gInvertXAxis", 0) ? -1 : 1)); + temp2 += temp3; - this->actor.focus.rot.y = CLAMP(temp2, -temp1, temp1) + this->actor.shape.rot.y; + this->actor.focus.rot.y = CLAMP(temp2, -temp1, temp1) + this->actor.shape.rot.y; - if (fabsf(sControlInput->cur.gyro_y) > 0.01f) { - this->actor.focus.rot.y += (sControlInput->cur.gyro_y) * 750.0f; - } - } + if (fabsf(sControlInput->cur.gyro_y) > 0.01f) { + this->actor.focus.rot.y += (sControlInput->cur.gyro_y) * 750.0f; + } + + if (fabsf(sControlInput->cur.right_stick_x) > 15.0f && CVar_GetS32("gRightStickAiming", 0) != 0) { + this->actor.focus.rot.y += (sControlInput->cur.right_stick_x) * 10.0f * (CVar_GetS32("gInvertXAxis", 0) ? 1 : -1); + } + } +} + else { + temp1 = (this->stateFlags1 & PLAYER_STATE1_23) ? 3500 : 14000; + temp3 = ((sControlInput->rel.stick_y >= 0) ? 1 : -1) * + (s32)((1.0f - Math_CosS(sControlInput->rel.stick_y * 200)) * 1500.0f * (CVar_GetS32("gInvertYAxis", 0) ? 1 : -1)); + this->actor.focus.rot.x += temp3; + + if (fabsf(sControlInput->cur.gyro_x) > 0.01f) { + this->actor.focus.rot.x -= (sControlInput->cur.gyro_x) * 750.0f; + } + + if (fabsf(sControlInput->cur.right_stick_y) > 15.0f && CVar_GetS32("gRightStickAiming", 0) != 0) { + this->actor.focus.rot.x -= (sControlInput->cur.right_stick_y) * 10.0f * (CVar_GetS32("gInvertYAxis", 0) ? -1 : 1); + } + + this->actor.focus.rot.x = CLAMP(this->actor.focus.rot.x, -temp1, temp1); + + temp1 = 19114; + temp2 = this->actor.focus.rot.y - this->actor.shape.rot.y; + temp3 = ((sControlInput->rel.stick_x >= 0) ? 1 : -1) * + (s32)((1.0f - Math_CosS(sControlInput->rel.stick_x * 200)) * -1500.0f * (CVar_GetS32("gInvertXAxis", 0) ? -1 : 1)); + temp2 += temp3; + + this->actor.focus.rot.y = CLAMP(temp2, -temp1, temp1) + this->actor.shape.rot.y; + + if (fabsf(sControlInput->cur.gyro_y) > 0.01f) { + this->actor.focus.rot.y += (sControlInput->cur.gyro_y) * 750.0f; + } + + if (fabsf(sControlInput->cur.right_stick_x) > 15.0f && CVar_GetS32("gRightStickAiming", 0) != 0) { + this->actor.focus.rot.y += (sControlInput->cur.right_stick_x) * 10.0f * (CVar_GetS32("gInvertXAxis", 0) ? 1 : -1); + } + } this->unk_6AE |= 2; return func_80836AB8(this, (globalCtx->shootingGalleryStatus != 0) || func_8002DD78(this) || func_808334B4(this)) - From 70d7d66d0c9c3cf7a37c6cf1d1e603dd036fdd85 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Wed, 24 Aug 2022 02:12:40 +0200 Subject: [PATCH 178/212] Add multiviewport support for SDL (#1275) --- libultraship/libultraship/ImGuiImpl.cpp | 18 ++++++++++++++++-- .../libultraship/Lib/Fast3D/gfx_sdl2.cpp | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 284fb8489..9f033b002 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -41,8 +41,10 @@ #if __APPLE__ #include +#include #else #include +#include #endif #ifdef __SWITCH__ @@ -337,6 +339,8 @@ namespace SohImGui { switch (impl.backend) { case Backend::DX11: return true; + case Backend::SDL: + return true; default: return false; } @@ -2398,8 +2402,18 @@ namespace SohImGui { ImGui::Render(); ImGuiRenderDrawData(ImGui::GetDrawData()); if (UseViewports()) { - ImGui::UpdatePlatformWindows(); - ImGui::RenderPlatformWindowsDefault(); + if (impl.backend == Backend::SDL) { + SDL_Window* backup_current_window = SDL_GL_GetCurrentWindow(); + SDL_GLContext backup_current_context = SDL_GL_GetCurrentContext(); + + ImGui::UpdatePlatformWindows(); + ImGui::RenderPlatformWindowsDefault(); + + SDL_GL_MakeCurrent(backup_current_window, backup_current_context); + } else { + ImGui::UpdatePlatformWindows(); + ImGui::RenderPlatformWindowsDefault(); + } } } diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp index 76573c084..fa657e40c 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp @@ -189,6 +189,7 @@ static void gfx_sdl_init(const char *game_name, bool start_in_fullscreen, uint32 } #endif + SDL_GL_MakeCurrent(wnd, ctx); SDL_GL_SetSwapInterval(1); SohImGui::WindowImpl window_impl; From ca08680a12b075690c79ff498f4f7230055a12c6 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 24 Aug 2022 02:13:15 +0200 Subject: [PATCH 179/212] Add: Ability to disable ImGui checkboxes (#1272) * Added ability to disable checkboxes * Renamed args, added disabledGraphic option * Moved checkbox out of ImGui source --- libultraship/libultraship/ImGuiImpl.cpp | 96 +++++++++++++++++++++++-- libultraship/libultraship/ImGuiImpl.h | 12 +++- 2 files changed, 102 insertions(+), 6 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 9f033b002..f35ab484d 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -603,13 +603,101 @@ namespace SohImGui { ImGui::Text("%s", text); } - void EnhancementCheckbox(const char* text, const char* cvarName) + void RenderCross(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz) { + float thickness = ImMax(sz / 5.0f, 1.0f); + sz -= thickness * 0.5f; + pos += ImVec2(thickness * 0.25f, thickness * 0.25f); + + draw_list->PathLineTo(ImVec2(pos.x, pos.y)); + draw_list->PathLineTo(ImVec2(pos.x + sz, pos.y + sz)); + draw_list->PathStroke(col, 0, thickness); + + draw_list->PathLineTo(ImVec2(pos.x + sz, pos.y)); + draw_list->PathLineTo(ImVec2(pos.x, pos.y + sz)); + draw_list->PathStroke(col, 0, thickness); + } + + bool CustomCheckbox(const char* label, bool* v, bool disabled, ImGuiCheckboxGraphics disabledGraphic) { + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); + + const float square_sz = ImGui::GetFrameHeight(); + const ImVec2 pos = window->DC.CursorPos; + const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); + ImGui::ItemSize(total_bb, style.FramePadding.y); + if (!ImGui::ItemAdd(total_bb, id)) + { + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); + return false; + } + + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) + { + *v = !(*v); + ImGui::MarkItemEdited(id); + } + + const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); + ImGui::RenderNavHighlight(total_bb, id); + ImGui::RenderFrame(check_bb.Min, check_bb.Max, ImGui::GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding); + ImU32 check_col = ImGui::GetColorU32(ImGuiCol_CheckMark); + ImU32 cross_col = ImGui::GetColorU32(ImVec4(0.50f, 0.50f, 0.50f, 1.00f)); + bool mixed_value = (g.LastItemData.InFlags & ImGuiItemFlags_MixedValue) != 0; + if (mixed_value) + { + // Undocumented tristate/mixed/indeterminate checkbox (#2644) + // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) + ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); + window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); + } + else if ((!disabled && *v) || (disabled && disabledGraphic == ImGuiCheckboxGraphics::Checkmark)) + { + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + ImGui::RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); + } + else if (disabled && disabledGraphic == ImGuiCheckboxGraphics::Cross) { + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + RenderCross(window->DrawList, check_bb.Min + ImVec2(pad, pad), cross_col, square_sz - pad * 2.0f); + } + + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); + if (g.LogEnabled) + ImGui::LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]"); + if (label_size.x > 0.0f) + ImGui::RenderText(label_pos, label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); + return pressed; + } + + void EnhancementCheckbox(const char* text, const char* cvarName, bool disabled, const char* disabledTooltipText, ImGuiCheckboxGraphics disabledGraphic) + { + if (disabled) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); + } bool val = (bool)CVar_GetS32(cvarName, 0); - if (ImGui::Checkbox(text, &val)) { + if (CustomCheckbox(text, &val, disabled, disabledGraphic)) { CVar_SetS32(cvarName, val); needs_save = true; } + + if (disabled) { + ImGui::PopStyleVar(1); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && disabledTooltipText != "") { + ImGui::SetTooltip("%s", disabledTooltipText); + } + ImGui::PopItemFlag(); + } } void EnhancementButton(const char* text, const char* cvarName) @@ -2644,11 +2732,11 @@ namespace SohImGui { } } - void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop, bool padBottom) { + void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop, bool padBottom, bool disabled, const char* disabledTooltipText, ImGuiCheckboxGraphics disabledGraphic) { if (padTop) { ImGui::Dummy(ImVec2(0.0f, 0.0f)); } - EnhancementCheckbox(text, cvarName); + EnhancementCheckbox(text, cvarName, disabled, disabledTooltipText, disabledGraphic); if (padBottom) { ImGui::Dummy(ImVec2(0.0f, 0.0f)); } diff --git a/libultraship/libultraship/ImGuiImpl.h b/libultraship/libultraship/ImGuiImpl.h index 3d6c6e4f9..733e9d1cf 100644 --- a/libultraship/libultraship/ImGuiImpl.h +++ b/libultraship/libultraship/ImGuiImpl.h @@ -34,6 +34,14 @@ namespace SohImGui { dLoadSettings, }; + // Enumeration for disabled checkbox graphics + enum class ImGuiCheckboxGraphics + { + Cross, + Checkmark, + None + }; + typedef struct { Backend backend; union { @@ -86,7 +94,7 @@ namespace SohImGui { void Tooltip(const char* text); void EnhancementRadioButton(const char* text, const char* cvarName, int id); - void EnhancementCheckbox(const char* text, const char* cvarName); + void EnhancementCheckbox(const char* text, const char* cvarName, bool disabled = false, const char* disabledTooltipText = "", ImGuiCheckboxGraphics disabledGraphic = ImGuiCheckboxGraphics::Cross); void EnhancementButton(const char* text, const char* cvarName); void EnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = false); void EnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage, bool PlusMinusButton = false); @@ -123,7 +131,7 @@ namespace SohImGui { void InsertPadding(float extraVerticalPadding = 0.0f); void PaddedSeparator(bool padTop = true, bool padBottom = true, float extraVerticalTopPadding = 0.0f, float extraVerticalBottomPadding = 0.0f); void PaddedEnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = false, bool padTop = true, bool padBottom = true); - void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop = true, bool padBottom = true); + void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop = true, bool padBottom = true, bool disabled = false, const char* disabledTooltipText = "", ImGuiCheckboxGraphics disabledGraphic = ImGuiCheckboxGraphics::Cross); void PaddedText(const char* text, bool padTop = true, bool padBottom = true); std::string GetWindowButtonText(const char* text, bool menuOpen); } From 46806415142f32b06decaec038e8f59bf186deb9 Mon Sep 17 00:00:00 2001 From: lilDavid <1337lilDavid@gmail.com> Date: Tue, 23 Aug 2022 19:14:17 -0500 Subject: [PATCH 180/212] Add bombchu drops (#1257) * Add bombchu drops * Force 3D bombchu drops * Move bombchu drop conditions for better clarity * Fix grouping on chu drop condition --- libultraship/libultraship/ImGuiImpl.cpp | 4 ++ soh/include/z64actor.h | 3 +- soh/src/code/z_en_item00.c | 67 +++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index f35ab484d..fdaeb4eee 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1359,6 +1359,8 @@ namespace SohImGui { ); PaddedEnhancementCheckbox("No Random Drops", "gNoRandomDrops", true, false); Tooltip("Disables random drops, except from the Goron Pot, Dampe, and bosses"); + PaddedEnhancementCheckbox("Enable Bombchu Drops", "gBombchuDrops", true, false); + Tooltip("Bombchus will sometimes drop in place of bombs"); PaddedEnhancementCheckbox("No Heart Drops", "gNoHeartDrops", true, false); Tooltip("Disables heart drops, but not heart placements, like from a Deku Scrub running off\nThis simulates Hero Mode from other games in the series"); PaddedEnhancementCheckbox("Always Win Goron Pot", "gGoronPot", true, false); @@ -2228,6 +2230,8 @@ namespace SohImGui { CVar_SetS32("gNoRandomDrops", 0); // No Heart Drops CVar_SetS32("gNoHeartDrops", 0); + // Enable Bombchu Drops + CVar_SetS32("gBombchuDrops", 0); // Always Win Goron Pot CVar_SetS32("gGoronPot", 0); diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index cd58ac20b..01eb28a1d 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -271,7 +271,8 @@ typedef enum { /* 0x16 */ ITEM00_SHIELD_HYLIAN, /* 0x17 */ ITEM00_TUNIC_ZORA, /* 0x18 */ ITEM00_TUNIC_GORON, - /* 0x19 */ ITEM00_BOMBS_SPECIAL + /* 0x19 */ ITEM00_BOMBS_SPECIAL, + /* 0x20 */ ITEM00_BOMBCHU, } Item00Type; struct EnItem00; diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index a50c74e87..54beafdab 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -70,6 +70,7 @@ static void* sItemDropTex[] = { gDropRecoveryHeartTex, gDropBombTex, gDropArrows1Tex, gDropArrows2Tex, gDropArrows3Tex, gDropBombTex, gDropDekuNutTex, gDropDekuStickTex, gDropMagicLargeTex, gDropMagicSmallTex, gDropDekuSeedsTex, gDropKeySmallTex, + // OTRTODO: use 2D bombchu texture }; static u8 sItemDropIds[] = { @@ -390,6 +391,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { case ITEM00_RUPEE_ORANGE: case ITEM00_RUPEE_PURPLE: case ITEM00_FLEXIBLE: + case ITEM00_BOMBCHU: yOffset = 500.0f; Actor_SetScale(&this->actor, 0.01f); this->scale = 0.01f; @@ -507,6 +509,9 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { case ITEM00_TUNIC_GORON: case ITEM00_BOMBS_SPECIAL: break; + case ITEM00_BOMBCHU: + Item_Give(globalCtx, ITEM_BOMBCHUS_5); + break; } if (!Actor_HasParent(&this->actor, globalCtx)) { @@ -537,7 +542,8 @@ void func_8001DFC8(EnItem00* this, GlobalContext* globalCtx) { (this->actor.params == ITEM00_HEART_PIECE)) { this->actor.shape.rot.y += 960; } else { - if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL)) { + if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL) && + (this->actor.params != ITEM00_BOMBCHU)) { if (this->unk_15A == -1) { if (Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x - 0x4000, 2, 3000, 1500) == 0) { @@ -640,7 +646,8 @@ void func_8001E304(EnItem00* this, GlobalContext* globalCtx) { if (this->actor.params <= ITEM00_RUPEE_RED) { this->actor.shape.rot.y += 960; - } else if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL)) { + } else if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL) && + (this->actor.params != ITEM00_BOMBCHU)) { this->actor.world.rot.x -= 700; this->actor.shape.rot.y += 400; this->actor.shape.rot.x = this->actor.world.rot.x - 0x4000; @@ -722,7 +729,8 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { EnItem00* this = (EnItem00*)thisx; s32 pad; - if (CVar_GetS32("gNewDrops", 0)) { //set the rotation system on selected model only :) + // OTRTODO: remove special case for bombchu when its 2D drop is implemented + if (CVar_GetS32("gNewDrops", 0) || this->actor.params == ITEM00_BOMBCHU) { //set the rotation system on selected model only :) if ((this->actor.params == ITEM00_RUPEE_GREEN) || (this->actor.params == ITEM00_RUPEE_BLUE) || (this->actor.params == ITEM00_RUPEE_RED) || (this->actor.params == ITEM00_ARROWS_SINGLE) || (this->actor.params == ITEM00_ARROWS_SMALL) || (this->actor.params == ITEM00_ARROWS_MEDIUM) || @@ -730,7 +738,8 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { (this->actor.params == ITEM00_BOMBS_B) || (this->actor.params == ITEM00_NUTS) || (this->actor.params == ITEM00_MAGIC_SMALL) || (this->actor.params == ITEM00_SEEDS) || (this->actor.params == ITEM00_MAGIC_LARGE) || (this->actor.params == ITEM00_HEART) || - (this->actor.params == ITEM00_BOMBS_SPECIAL) || this->actor.params == ITEM00_HEART_PIECE) { + (this->actor.params == ITEM00_BOMBS_SPECIAL) || this->actor.params == ITEM00_HEART_PIECE || + (this->actor.params == ITEM00_BOMBCHU)) { this->actor.shape.rot.y += 960; } if (this->actor.params == ITEM00_SMALL_KEY && !gSaveContext.n64ddFlag) { @@ -891,6 +900,9 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { break; case ITEM00_BOMBS_SPECIAL: break; + case ITEM00_BOMBCHU: + Item_Give(globalCtx, ITEM_BOMBCHUS_5); + break; } params = &this->actor.params; @@ -1212,6 +1224,15 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { EnItem00_DrawCollectible(this, globalCtx); break; } + case ITEM00_BOMBCHU: + // OTRTODO: Stop forcing chu drops to be 3D when the texture is added + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + this->actor.shape.yOffset = 50.0f; + this->actor.world.rot.x = 0x4000; + this->actor.shape.shadowScale = 0.3f; + GetItem_Draw(globalCtx, GID_BOMBCHU); + break; case ITEM00_SHIELD_DEKU: GetItem_Draw(globalCtx, GID_SHIELD_DEKU); break; @@ -1370,6 +1391,9 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { if (this->actor.params == ITEM00_BOMBS_SPECIAL) { texIndex = 1; + // OTRTODO: 2D bombchu drops + //} else if (this->actor.params == ITEM00_BOMBCHU) { + // texIndex = 12; } else if (this->actor.params >= ITEM00_ARROWS_SMALL) { texIndex -= 3; } @@ -1435,6 +1459,36 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { } } +/** + * Sometimes convert the given drop ID into a bombchu. + * Returns the new drop type ID. + */ +s16 EnItem00_ConvertBombDropToBombchu(s16 dropId) { + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) { + return dropId; + } + + if (INV_CONTENT(ITEM_BOMB) == ITEM_NONE) { + return ITEM00_BOMBCHU; + } + + if (AMMO(ITEM_BOMB) <= 15) { + // Player needs bombs and might need chus, so drop whichever has less + if (AMMO(ITEM_BOMB) <= AMMO(ITEM_BOMBCHU)) { + return dropId; + } else { + return ITEM00_BOMBCHU; + } + } else { + // Player has enough bombs, so drop chus if they need some, else it's 50/50 + if (AMMO(ITEM_BOMBCHU) <= 15) { + return ITEM00_BOMBCHU; + } else { + return Rand_Next() % 2 ? dropId : ITEM00_BOMBCHU; + } + } +} + /** * Converts a given drop type ID based on link's current age, health and owned items. * Returns a new drop type ID or -1 to cancel the drop. @@ -1452,6 +1506,11 @@ s16 func_8001F404(s16 dropId) { } } + if (CVar_GetS32("gBombchuDrops", 0) && + (dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_B || dropId == ITEM00_BOMBS_SPECIAL)) { + dropId = EnItem00_ConvertBombDropToBombchu(dropId); + } + // This is convoluted but it seems like it must be a single condition to match // clang-format off if (((dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_SPECIAL || dropId == ITEM00_BOMBS_B) && INV_CONTENT(ITEM_BOMB) == ITEM_NONE) || From 45873ba71de9e80f2c16e914d9e4341beb9381b1 Mon Sep 17 00:00:00 2001 From: Sarge-117 Date: Tue, 23 Aug 2022 17:16:19 -0700 Subject: [PATCH 181/212] Add CVar + Cvar check Defaults to "1" --- libultraship/libultraship/ImGuiImpl.cpp | 6 ++++++ soh/soh/OTRGlobals.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index ac7ab9d73..311b559a2 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -452,6 +452,7 @@ namespace SohImGui { io->ConfigFlags |= ImGuiConfigFlags_DockingEnable; io->Fonts->AddFontDefault(); statsWindowOpen = CVar_GetS32("gStatsEnabled", 0); + CVar_RegisterS32("gRandoRelevantNavi", 1); #ifdef __SWITCH__ Ship::Switch::SetupFont(io->Fonts); #endif @@ -1912,6 +1913,11 @@ namespace SohImGui { "(medallions/stones/songs). Note that these fanfares\n" "are longer than usual." ); + EnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi"); + Tooltip( + "Replace Navi's overworld quest hints with rando-\n" + "related gameplay hints.\n" + ); ImGui::EndMenu(); } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index b8b77d336..2b3024c6c 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1546,7 +1546,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { messageEntry = Randomizer_GetScrubMessage(textId); // In rando, replace Navi's general overworld hints with rando-related gameplay tips - } else if (textId >= 0x0140 && textId <= 0x015F) { + } else if (CVar_GetS32("gRandoRelevantNavi", 1) && textId >= 0x0140 && textId <= 0x015F) { messageEntry = Randomizer_GetNaviMessage(); } } From d6ebce068daf16c780ab77409077d0df31da837e Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Wed, 24 Aug 2022 02:20:56 +0200 Subject: [PATCH 182/212] fixes only (#1255) --- libultraship/libultraship/ImGuiImpl.cpp | 30 +- .../cosmetics/CosmeticsEditor.cpp | 1151 +++++++---------- .../Enhancements/cosmetics/CosmeticsEditor.h | 403 ++++++ soh/src/code/z_actor.c | 29 +- soh/src/code/z_eff_blure.c | 18 +- soh/src/code/z_lifemeter.c | 199 +-- soh/src/code/z_map_exp.c | 22 +- soh/src/code/z_parameter.c | 510 +++++--- soh/src/code/z_play.c | 7 + .../actors/ovl_Arrow_Fire/z_arrow_fire.c | 18 +- .../actors/ovl_Arrow_Ice/z_arrow_ice.c | 18 +- .../actors/ovl_Arrow_Light/z_arrow_light.c | 18 +- soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c | 28 +- .../actors/ovl_En_Firefly/z_en_firefly.c | 21 +- .../actors/ovl_En_M_Thunder/z_en_m_thunder.c | 18 +- soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c | 108 +- .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 14 +- .../actors/ovl_Magic_Dark/z_magic_dark.c | 8 +- .../actors/ovl_Magic_Fire/z_magic_fire.c | 14 +- .../actors/ovl_player_actor/z_player.c | 25 +- .../ovl_file_choose/z_file_choose.c | 55 +- .../ovl_kaleido_scope/z_kaleido_collect.c | 79 +- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 151 ++- 23 files changed, 1686 insertions(+), 1258 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index fdaeb4eee..79dbef375 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -844,12 +844,7 @@ namespace SohImGui { } void RandomizeColor(const char* cvarName, ImVec4* colors) { - std::string Cvar_Red = cvarName; - Cvar_Red += "R"; - std::string Cvar_Green = cvarName; - Cvar_Green += "G"; - std::string Cvar_Blue = cvarName; - Cvar_Blue += "B"; + Color_RGBA8 NewColors = {0,0,0,255}; std::string Cvar_RBM = cvarName; Cvar_RBM += "RBM"; std::string MakeInvisible = "##"; @@ -864,9 +859,10 @@ namespace SohImGui { colors->x = (float)RND_R / 255; colors->y = (float)RND_G / 255; colors->z = (float)RND_B / 255; - CVar_SetS32(Cvar_Red.c_str(), ClampFloatToInt(colors->x * 255, 0, 255)); - CVar_SetS32(Cvar_Green.c_str(), ClampFloatToInt(colors->y * 255, 0, 255)); - CVar_SetS32(Cvar_Blue.c_str(), ClampFloatToInt(colors->z * 255, 0, 255)); + NewColors.r = ClampFloatToInt(colors->x * 255, 0, 255); + NewColors.g = ClampFloatToInt(colors->y * 255, 0, 255); + NewColors.b = ClampFloatToInt(colors->z * 255, 0, 255); + CVar_SetRGBA(cvarName, NewColors); CVar_SetS32(Cvar_RBM.c_str(), 0); //On click disable rainbow mode. needs_save = true; } @@ -893,16 +889,16 @@ namespace SohImGui { MakeInvisible += cvarName; MakeInvisible += "Reset"; if (ImGui::Button(MakeInvisible.c_str())) { - colors->x = defaultcolors.x / 255; - colors->y = defaultcolors.y / 255; - colors->z = defaultcolors.z / 255; - if (has_alpha) { colors->w = defaultcolors.w / 255; }; + colors->x = defaultcolors.x; + colors->y = defaultcolors.y; + colors->z = defaultcolors.z; + if (has_alpha) { colors->w = defaultcolors.w; }; Color_RGBA8 colorsRGBA; - colorsRGBA.r = defaultcolors.x / 255; - colorsRGBA.g = defaultcolors.y / 255; - colorsRGBA.b = defaultcolors.z / 255; - if (has_alpha) { colorsRGBA.a = defaultcolors.w / 255; }; + colorsRGBA.r = defaultcolors.x; + colorsRGBA.g = defaultcolors.y; + colorsRGBA.b = defaultcolors.z; + if (has_alpha) { colorsRGBA.a = defaultcolors.w; }; CVar_SetRGBA(cvarName, colorsRGBA); CVar_SetS32(Cvar_RBM.c_str(), 0); //On click disable rainbow mode. diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 52e81ea24..b8bae4d17 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -3,83 +3,14 @@ #include #include +#include +#include #include -/** - * Colors variables - */ -float TablesCellsWidth = 300.0f; //1 Col -ImVec4 hearts_colors; -ImVec4 hearts_dd_colors; -ImVec4 hearts_ddi_colors; //DD inner colors -ImVec4 a_btn_colors; -ImVec4 b_btn_colors; -ImVec4 c_btn_colors; -ImVec4 start_btn_colors; -ImVec4 magic_border_colors; -ImVec4 magic_remaining_colors; -ImVec4 magic_use_colors; -ImVec4 minimap_colors; -ImVec4 rupee_colors; -ImVec4 smolekey_colors; -ImVec4 fileselect_colors; -ImVec4 fileselect_text_colors; -ImVec4 kokiri_col; -ImVec4 goron_col; -ImVec4 zora_col; -ImVec4 navi_idle_i_col; -ImVec4 navi_idle_o_col; -ImVec4 navi_npc_i_col; -ImVec4 navi_npc_o_col; -ImVec4 navi_enemy_i_col; -ImVec4 navi_enemy_o_col; -ImVec4 navi_prop_i_col; -ImVec4 navi_prop_o_col; -ImVec4 trailscol; -ImVec4 c_btn_u_colors; -ImVec4 c_btn_l_colors; -ImVec4 c_btn_d_colors; -ImVec4 c_btn_r_colors; -ImVec4 magic_bordern_colors; -ImVec4 firearrow_col; -ImVec4 icearrow_col; -ImVec4 lightarrow_col; -ImVec4 firearrow_colenv; -ImVec4 icearrow_colenv; -ImVec4 lightarrow_colenv; -ImVec4 charged1_col; -ImVec4 charged2_col; -ImVec4 charged1_colenv; -ImVec4 charged2_colenv; -ImVec4 Keese1_primcol; -ImVec4 Keese2_primcol; -ImVec4 Keese1_envcol; -ImVec4 Keese2_envcol; -ImVec4 doggo1col; -ImVec4 doggo2col; -ImVec4 df_col; -ImVec4 df_colenv; -ImVec4 nl_diam_col; -ImVec4 nl_diam_colenv; -ImVec4 nl_orb_col; -ImVec4 nl_orb_colenv; -ImVec4 dgn_minimap_colors; -ImVec4 cp_minimap_colors; -ImVec4 le_minimap_colors; -ImVec4 tc_ou_colors; -ImVec4 tc_bu_colors; -ImVec4 dpad_colors; -ImVec4 visualagony_colors; -/*ImVec4 menu_equips_colors; -ImVec4 menu_items_colors; -ImVec4 menu_map_colors; -ImVec4 menu_quest_colors; -ImVec4 menu_save_colors; -ImVec4 menu_gameover_colors;*/ const char* RainbowColorCvarList[] = { //This is the list of possible CVars that has rainbow effect. - "gTunic_Kokiri_", "gTunic_Goron_", "gTunic_Zora_", - "gFireArrowCol", "gIceArrowCol", "gTunic_Zora_", + "gTunic_Kokiri", "gTunic_Goron", "gTunic_Zora", + "gFireArrowCol", "gIceArrowCol", "gFireArrowColEnv", "gIceArrowColEnv", "gLightArrowColEnv", "gCCHeartsPrim", "gDDCCHeartsPrim", "gLightArrowCol", "gCCDDHeartsPrim", "gCCABtnPrim", "gCCBBtnPrim", "gCCCBtnPrim", "gCCStartBtnPrim", @@ -88,11 +19,11 @@ const char* RainbowColorCvarList[] = { "gCCMinimapPrim", "gCCMinimapDGNPrim", "gCCMinimapCPPrim", "gCCMinimapLEPrim", "gCCRupeePrim", "gCCKeysPrim", "gDog1Col", "gDog2Col", "gCCVSOAPrim", "gKeese1_Ef_Prim","gKeese2_Ef_Prim","gKeese1_Ef_Env","gKeese2_Ef_Env", - "gDF_Col", "gDF_Env", + "gDF_Col", "gDF_Env", "gNL_Diamond_Col", "gNL_Diamond_Env", "gNL_Orb_Col", "gNL_Orb_Env", "gTrailCol", "gCharged1Col", "gCharged1ColEnv", "gCharged2Col", "gCharged2ColEnv", "gCCFileChoosePrim", "gCCFileChooseTextPrim", "gCCEquipmentsPrim", "gCCItemsPrim", - "gCCMapsPrim", "gCCQuestsPrim", "gCCSavePrim", "gCCGameoverPrim", + "gCCMapsPrim", "gCCQuestsPrim", "gCCSavePrim", "gCCGameoverPrim" }; const char* MarginCvarList[] { "gHearts", "gMagicBar", "gVSOA", "gBBtn", "gABtn", "gStartBtn", @@ -100,6 +31,57 @@ const char* MarginCvarList[] { "gSKC", "gRC", "gCarrots", "gTimers", "gAS", "gTCM", "gTCB" }; +ImVec4 GetRandomValue(int MaximumPossible){ + ImVec4 NewColor; + unsigned long range = 255 - 0; + std::random_device rd; + std::mt19937 rng(rd()); + std::uniform_int_distribution dist(0, 255 - 1); + + NewColor.x = (float)(dist(rng)) / 255; + NewColor.y = (float)(dist(rng)) / 255; + NewColor.z = (float)(dist(rng)) / 255; + return NewColor; +} +void GetRandomColorRGB(CosmeticsColorSection* ColorSection, int SectionSize){ + //std::random_shuffle(ColorSection, ColorSection + SectionSize); + for (int i = 0; i < SectionSize; i++){ + CosmeticsColorIndividual* Element = ColorSection[i].Element; + ImVec4 colors = Element->ModifiedColor; + Color_RGBA8 NewColors = { 0, 0, 0, 255 }; + std::string cvarName = Element->CvarName; + std::string Cvar_RBM = cvarName + "RBM"; + colors = RANDOMIZE_32(255); + NewColors.r = SohImGui::ClampFloatToInt(colors.x * 255, 0, 255); + NewColors.g = SohImGui::ClampFloatToInt(colors.y * 255, 0, 255); + NewColors.b = SohImGui::ClampFloatToInt(colors.z * 255, 0, 255); + Element->ModifiedColor = colors; + CVar_SetRGBA(cvarName.c_str(), NewColors); + CVar_SetS32(Cvar_RBM.c_str(), 0); + } +} +void GetDefaultColorRGB(CosmeticsColorSection* ColorSection, int SectionSize){ + for (int i = 0; i < SectionSize; i++){ + CosmeticsColorIndividual* Element = ColorSection[i].Element; + ImVec4 colors = Element->ModifiedColor; + ImVec4 defaultcolors = Element->DefaultColor; + std::string cvarName = Element->CvarName; + std::string Cvar_RBM = cvarName + "RBM"; + colors.x = defaultcolors.x; + colors.y = defaultcolors.y; + colors.z = defaultcolors.z; + if (Element->hasAlpha) { colors.w = defaultcolors.w; }; + Element->ModifiedColor = colors; + Color_RGBA8 colorsRGBA; + colorsRGBA.r = defaultcolors.x; + colorsRGBA.g = defaultcolors.y; + colorsRGBA.b = defaultcolors.z; + if (Element->hasAlpha) { colorsRGBA.a = defaultcolors.w; }; + CVar_SetRGBA(cvarName.c_str(), colorsRGBA); + CVar_SetS32(Cvar_RBM.c_str(), 0); //On click disable rainbow mode. + + } +} void SetMarginAll(const char* ButtonName, bool SetActivated) { if (ImGui::Button(ButtonName)) { u8 arrayLength = sizeof(MarginCvarList) / sizeof(*MarginCvarList); @@ -142,12 +124,6 @@ void LoadRainbowColor(bool& open) { u8 arrayLength = sizeof(RainbowColorCvarList) / sizeof(*RainbowColorCvarList); for (u8 s = 0; s < arrayLength; s++) { std::string cvarName = RainbowColorCvarList[s]; - std::string Cvar_Red = cvarName; - Cvar_Red += "R"; - std::string Cvar_Green = cvarName; - Cvar_Green += "G"; - std::string Cvar_Blue = cvarName; - Cvar_Blue += "B"; std::string Cvar_RBM = cvarName; Cvar_RBM += "RBM"; std::string RBM_HUE = cvarName; @@ -173,11 +149,14 @@ void LoadRainbowColor(bool& open) { case 5: NewColor.x = b; NewColor.y = 0; NewColor.z = 255; break; case 6: NewColor.x = 255; NewColor.y = 0; NewColor.z = a; break; } - + Color_RGBA8 NewColorRGB = { + SohImGui::ClampFloatToInt(NewColor.x, 0, 255), + SohImGui::ClampFloatToInt(NewColor.y, 0, 255), + SohImGui::ClampFloatToInt(NewColor.z, 0, 255), + 255 + }; if (CVar_GetS32(Cvar_RBM.c_str(), 0) != 0) { - CVar_SetS32(Cvar_Red.c_str(), SohImGui::ClampFloatToInt(NewColor.x, 0, 255)); - CVar_SetS32(Cvar_Green.c_str(), SohImGui::ClampFloatToInt(NewColor.y, 0, 255)); - CVar_SetS32(Cvar_Blue.c_str(), SohImGui::ClampFloatToInt(NewColor.z, 0, 255)); + CVar_SetRGBA(cvarName.c_str(), NewColorRGB); } } } @@ -190,7 +169,7 @@ void Table_InitHeader(bool has_header = true) { ImGui::TableNextColumn(); ImGui::AlignTextToFramePadding(); //This is to adjust Vertical pos of item in a cell to be normlized. ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 2); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x-60); } void Table_NextCol() { ImGui::TableNextColumn(); @@ -216,161 +195,244 @@ void Draw_HelpIcon(const std::string& helptext, bool sameline = true, int Pos = } ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); } +void DrawUseMarginsSlider(const std::string ElementName, const std::string CvarName){ + std::string CvarLabel = CvarName + "UseMargins"; + std::string Label = ElementName + " use margins"; + SohImGui::EnhancementCheckbox(Label.c_str(), CvarLabel.c_str()); + SohImGui::Tooltip("Using this allow you move the element with General margins sliders"); +} +void DrawPositionsRadioBoxes(const std::string CvarName, bool NoAnchorEnabled = true){ + std::string CvarLabel = CvarName + "PosType"; + SohImGui::EnhancementRadioButton("Original position", CvarLabel.c_str(), 0); + SohImGui::Tooltip("This will use original intended elements position"); + SohImGui::EnhancementRadioButton("Anchor to the left", CvarLabel.c_str(), 1); + SohImGui::Tooltip("This will make your elements follow the left side of your game window"); + SohImGui::EnhancementRadioButton("Anchor to the right", CvarLabel.c_str(), 2); + SohImGui::Tooltip("This will make your elements follow the right side of your game window"); + if (NoAnchorEnabled) { + SohImGui::EnhancementRadioButton("No anchors", CvarLabel.c_str(), 3); + SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements"); + } + SohImGui::EnhancementRadioButton("Hidden", CvarLabel.c_str(), 4); + SohImGui::Tooltip("This will make your elements hidden"); +} +void DrawTransitions(const std::string CvarName){ + SohImGui::EnhancementRadioButton("Really slow fade (white)", CvarName.c_str(), 8); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Really slow fade (black)", CvarName.c_str(), 7); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Slow fade (white)", CvarName.c_str(), 10); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Slow fade (black)", CvarName.c_str(), 9); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Normal fade (white)", CvarName.c_str(), 3); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Normal fade (black)", CvarName.c_str(), 2); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Fast fade (white)", CvarName.c_str(), 5); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Fast fade (black)", CvarName.c_str(), 4); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Fast circle (white)", CvarName.c_str(), 40); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Normal circle (black)", CvarName.c_str(), 32); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Slow circle (white)", CvarName.c_str(), 41); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Slow circle (black)", CvarName.c_str(), 33); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Fast noise circle (white)", CvarName.c_str(), 42); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Fast noise circle (black)", CvarName.c_str(), 34); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Slow noise circle (white)", CvarName.c_str(), 43); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Slow noise circle (black)", CvarName.c_str(), 35); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Normal waves circle (white)", CvarName.c_str(), 44); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Normal waves circle (black)", CvarName.c_str(), 36); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Slow waves circle (white)", CvarName.c_str(), 45); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Slow waves circle (black)", CvarName.c_str(), 37); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Normal close circle (white)", CvarName.c_str(), 46); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Normal close circle (black)", CvarName.c_str(), 38); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Slow close circle (white)", CvarName.c_str(), 47); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Slow close circle (black)", CvarName.c_str(), 39); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Super fast circle (white)", CvarName.c_str(), 56); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Super fast circle (black)", CvarName.c_str(), 58); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Super fast noise circle (white)", CvarName.c_str(), 57); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Super fast noise circle (black)", CvarName.c_str(), 59); +} +void DrawPositionSlider(const std::string CvarName, int MinY, int MaxY, int MinX, int MaxX){ + std::string PosXCvar = CvarName+"PosX"; + std::string PosYCvar = CvarName+"PosY"; + std::string InvisibleLabelX = "##"+PosXCvar; + std::string InvisibleLabelY = "##"+PosYCvar; + SohImGui::EnhancementSliderInt("Up <-> Down : %d", InvisibleLabelY.c_str(), PosYCvar.c_str(), MinY, MaxY, "", 0, true); + SohImGui::Tooltip("This slider is used to move Up and Down your elements."); + SohImGui::EnhancementSliderInt("Left <-> Right : %d", InvisibleLabelX.c_str(), PosXCvar.c_str(), MinX, MaxX, "", 0, true); + SohImGui::Tooltip("This slider is used to move Left and Right your elements."); +} +void DrawScaleSlider(const std::string CvarName,float DefaultValue){ + std::string InvisibleLabel = "##"+CvarName; + std::string CvarLabel = CvarName+"Scale"; + //Disabled for now. feature not done and several fixes needed to be merged. + //SohImGui::EnhancementSliderFloat("Scale : %dx", InvisibleLabel.c_str(), CvarLabel.c_str(), 0.1f, 3.0f,"",DefaultValue,true,true); +} +void DrawColorSection(CosmeticsColorSection* ColorSection, int SectionSize) { + for (s16 i = 0; i < SectionSize; i++) { + CosmeticsColorIndividual* ThisElement = ColorSection[i].Element; + const std::string Tooltip = ThisElement->ToolTip; + const std::string Name = ThisElement->Name; + const std::string Cvar = ThisElement->CvarName; + ImVec4 ModifiedColor = ThisElement->ModifiedColor; + ImVec4 DefaultColor = ThisElement->DefaultColor; + bool canRainbow = ThisElement->canRainbow; + bool hasAlpha = ThisElement->hasAlpha; + bool sameLine = ThisElement->sameLine; + bool Nextcol = ColorSection[i].Nextcol; + bool NextLine = ColorSection[i].NextLine; + if (Nextcol){ + Table_NextCol(); + } + if (NextLine){ + Table_NextLine(); + } + Draw_HelpIcon(Tooltip.c_str()); + SohImGui::EnhancementColor(Name.c_str(), Cvar.c_str(), ModifiedColor, DefaultColor, canRainbow, hasAlpha, sameLine); + } +} +void DrawRandomizeResetButton(const std::string Identifier, CosmeticsColorSection* ColorSection, int SectionSize, bool isAllCosmetics = false){ + std::string TableName = Identifier+"_Table"; + std::string Col1Name = Identifier+"_Col1"; + std::string Col2Name = Identifier+"_Col2"; + std::string Tooltip_RNG = "Affect "+Identifier+" colors"; + std::string RNG_BtnText = "Randomize : "+Identifier; + std::string Reset_BtnText = "Reset : "+Identifier; + if (ImGui::BeginTable(TableName.c_str(), 2, FlagsTable)) { + ImGui::TableSetupColumn(Col1Name.c_str(), FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn(Col2Name.c_str(), FlagsCell, TablesCellsWidth/2); + Table_InitHeader(false); + if(ImGui::Button(RNG_BtnText.c_str(), ImVec2( ImGui::GetContentRegionAvail().x, 20.0f))){ + CVar_SetS32("gHudColors", 2); + CVar_SetS32("gUseNaviCol", 1); + CVar_SetS32("gUseKeeseCol", 1); + CVar_SetS32("gUseDogsCol", 1); + CVar_SetS32("gUseTunicsCol", 1); + CVar_SetS32("gUseArrowsCol", 1); + CVar_SetS32("gUseSpellsCol", 1); + CVar_SetS32("gUseChargedCol", 1); + CVar_SetS32("gUseTrailsCol", 1); + CVar_SetS32("gCCparated", 1); + GetRandomColorRGB(ColorSection, SectionSize); + } + SohImGui::Tooltip(Tooltip_RNG.c_str()); + Table_NextCol(); + if(ImGui::Button(Reset_BtnText.c_str(), ImVec2( ImGui::GetContentRegionAvail().x, 20.0f))){ + GetDefaultColorRGB(ColorSection, SectionSize); + } + SohImGui::Tooltip("Enable/Disable custom Link's tunics colors\nIf disabled you will have original colors for Link's tunics."); + SohImGui::Tooltip(Tooltip_RNG.c_str()); + ImGui::EndTable(); + } +} + void Draw_Npcs(){ + DrawRandomizeResetButton("all NPCs", NPCs_section, SECTION_SIZE(NPCs_section)); SohImGui::EnhancementCheckbox("Custom colors for Navi", "gUseNaviCol"); SohImGui::Tooltip("Enable/Disable custom Navi colors\nIf disabled, default colors will be used\nColors go into effect when Navi goes back into your pockets"); - if (CVar_GetS32("gUseNaviCol",0) && ImGui::BeginTable("tableNavi", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Inner colors##Navi", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Outer colors##Navi", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (CVar_GetS32("gUseNaviCol",0)) { + DrawRandomizeResetButton("Navi's", Navi_Section, SECTION_SIZE(Navi_Section)); + }; + if (CVar_GetS32("gUseNaviCol",0) && ImGui::BeginTable("tableNavi", 2, FlagsTable)) { + ImGui::TableSetupColumn("Inner colors##Navi", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Outer colors##Navi", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Inner color for Navi (idle flying around)"); - SohImGui::EnhancementColor("Navi Idle (Primary)", "gNavi_Idle_Inner", navi_idle_i_col, ImVec4(255, 255, 255, 255), false); - Table_NextCol(); - Draw_HelpIcon("Outer color for Navi (idle flying around)"); - SohImGui::EnhancementColor("Navi Idle (Secondary)", "gNavi_Idle_Outer", navi_idle_o_col, ImVec4(0, 0, 255, 255), false); - Table_NextLine(); - Draw_HelpIcon("Inner color for Navi (when Navi fly around NPCs)"); - SohImGui::EnhancementColor("Navi NPC (Primary)", "gNavi_NPC_Inner", navi_npc_i_col, ImVec4(150, 150, 255, 255), false); - Table_NextCol(); - Draw_HelpIcon("Outer color for Navi (when Navi fly around NPCs)"); - SohImGui::EnhancementColor("Navi NPC (Secondary)", "gNavi_NPC_Outer", navi_npc_o_col, ImVec4(150, 150, 255, 255), false); - Table_NextLine(); - Draw_HelpIcon("Inner color for Navi (when Navi fly around Enemies or Bosses)"); - SohImGui::EnhancementColor("Navi Enemy", "gNavi_Enemy_Inner", navi_enemy_i_col, ImVec4(255, 255, 0, 255), false); - Table_NextCol(); - Draw_HelpIcon("Outer color for Navi (when Navi fly around Enemies or Bosses)"); - SohImGui::EnhancementColor("Navi Enemy (Secondary)", "gNavi_Enemy_Outer", navi_enemy_o_col, ImVec4(220, 155, 0, 255), false); - Table_NextLine(); - Draw_HelpIcon("Inner color for Navi (when Navi fly around props (signs etc))"); - SohImGui::EnhancementColor("Navi Prop (Primary)", "gNavi_Prop_Inner", navi_prop_i_col, ImVec4(0, 255, 0, 255), false); - Table_NextCol(); - Draw_HelpIcon("Outer color for Navi (when Navi fly around props (signs etc))"); - SohImGui::EnhancementColor("Navi Prop (Secondary)", "gNavi_Prop_Outer", navi_prop_o_col, ImVec4(0, 255, 0, 255), false); + DrawColorSection(Navi_Section, SECTION_SIZE(Navi_Section)); ImGui::EndTable(); } SohImGui::EnhancementCheckbox("Custom colors for Keese", "gUseKeeseCol"); SohImGui::Tooltip("Enable/Disable custom Keese element colors\nIf disabled, default element colors will be used\nColors go into effect when Keese respawn (or when the room is reloaded)"); - if (CVar_GetS32("gUseKeeseCol",0) && ImGui::BeginTable("tableKeese", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Fire colors##Keese", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Ice colors##Keese", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - Table_InitHeader(false); - Draw_HelpIcon("Affects the primary color of the Fire itself of the Keese"); - SohImGui::EnhancementColor("Fire Primary color", "gKeese1_Ef_Prim", Keese1_primcol, ImVec4(255, 255, 100, 255)); - Table_NextCol(); - Draw_HelpIcon("Affects the primary color of the Ice itself of the Keese"); - SohImGui::EnhancementColor("Ice Primary color", "gKeese2_Ef_Prim", Keese2_primcol, ImVec4(100, 200, 255, 255)); - Table_NextLine(); - Draw_HelpIcon("Affects the secondary color of the Fire itself of the Keese"); - SohImGui::EnhancementColor("Fire Secondary color", "gKeese1_Ef_Env", Keese1_envcol, ImVec4(255, 50, 0, 255)); - Table_NextCol(); - Draw_HelpIcon("Affects the secondary color of the Ice itself of the Keese"); - SohImGui::EnhancementColor("Ice Secondary color", "gKeese2_Ef_Env", Keese2_envcol, ImVec4(0, 0, 255, 255)); + if (CVar_GetS32("gUseKeeseCol",0) && ImGui::BeginTable("tableKeese", 2, FlagsTable)) { + ImGui::TableSetupColumn("Fire colors##Keese", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Ice colors##Keese", FlagsCell, TablesCellsWidth/2); + Table_InitHeader(); + DrawColorSection(Keese_Section, SECTION_SIZE(Keese_Section)); ImGui::EndTable(); } SohImGui::EnhancementCheckbox("Custom colors for Dogs", "gUseDogsCol"); SohImGui::Tooltip("Enable/Disable custom colors for the two Dog variants\nIf disabled, default colors will be used"); - if (CVar_GetS32("gUseDogsCol",0) && ImGui::BeginTable("tableDogs", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Dog N.1 color", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Dog N.2 color", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (CVar_GetS32("gUseDogsCol",0) && ImGui::BeginTable("tableDogs", 2, FlagsTable)) { + ImGui::TableSetupColumn("White Dog color", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Brown Dog color", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Affects the colors of the white dog"); - SohImGui::EnhancementColor("Dog white", "gDog1Col", doggo1col, ImVec4(255,255,200,255), true, false, true); - Table_NextCol(); - Draw_HelpIcon("Affects the colors of the brown dog"); - SohImGui::EnhancementColor("Dog brown", "gDog2Col", doggo2col, ImVec4(150,100,50,255), true, false, true); + DrawColorSection(Dogs_Section, SECTION_SIZE(Dogs_Section)); ImGui::EndTable(); } } void Draw_ItemsSkills(){ + DrawRandomizeResetButton("all skills and items", AllItemsSkills_section, SECTION_SIZE(AllItemsSkills_section)); SohImGui::EnhancementCheckbox("Custom tunics color", "gUseTunicsCol"); SohImGui::Tooltip("Enable/Disable custom Link's tunics colors\nIf disabled you will have original colors for Link's tunics."); - if (CVar_GetS32("gUseTunicsCol",0) && ImGui::BeginTable("tableTunics", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Kokiri Tunic", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/3); - ImGui::TableSetupColumn("Goron Tunic", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/3); - ImGui::TableSetupColumn("Zora Tunic", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/3); + if (CVar_GetS32("gUseTunicsCol",0)) { + DrawRandomizeResetButton("Link's tunics", Tunics_Section, SECTION_SIZE(Tunics_Section)); + }; + if (CVar_GetS32("gUseTunicsCol",0) && ImGui::BeginTable("tableTunics", 3, FlagsTable)) { + ImGui::TableSetupColumn("Kokiri Tunic", FlagsCell, TablesCellsWidth/3); + ImGui::TableSetupColumn("Goron Tunic", FlagsCell, TablesCellsWidth/3); + ImGui::TableSetupColumn("Zora Tunic", FlagsCell, TablesCellsWidth/3); Table_InitHeader(); - Draw_HelpIcon("Affects Kokiri Tunic color", false); - SohImGui::EnhancementColor("Kokiri Tunic", "gTunic_Kokiri_", kokiri_col, ImVec4(30, 105, 27, 255), true, false, true); - Table_NextCol(); - Draw_HelpIcon("Affects Goron Tunic color", false); - SohImGui::EnhancementColor("Goron Tunic", "gTunic_Goron_", goron_col, ImVec4(100, 20, 0, 255), true, false, true); - Table_NextCol(); - Draw_HelpIcon("Affects Zora Tunic color", false); - SohImGui::EnhancementColor("Zora Tunic", "gTunic_Zora_", zora_col, ImVec4(0, 60, 100, 255), true, false, true); + DrawColorSection(Tunics_Section, SECTION_SIZE(Tunics_Section)); ImGui::EndTable(); } SohImGui::EnhancementCheckbox("Custom arrows colors", "gUseArrowsCol"); - if (CVar_GetS32("gUseArrowsCol",0) && ImGui::BeginTable("tableArrows", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Primary colors##Arrows", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Env colors##Arrows", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (CVar_GetS32("gUseArrowsCol",0)) { + DrawRandomizeResetButton("elemental arrows", Arrows_section, SECTION_SIZE(Arrows_section)); + } + if (CVar_GetS32("gUseArrowsCol",0) && ImGui::BeginTable("tableArrows", 2, FlagsTable)) { + ImGui::TableSetupColumn("Primary colors##Arrows", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Env colors##Arrows", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Fire Arrows (primary)", "gFireArrowCol", firearrow_col, ImVec4(255,200,0,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Fire Arrows", "gFireArrowColEnv", firearrow_colenv, ImVec4(255,0,0,255)); - Table_NextLine(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Ice Arrows (primary)", "gIceArrowCol", icearrow_col, ImVec4(170,255,255,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Ice Arrows", "gIceArrowColEnv", icearrow_colenv, ImVec4(0,0,255,255)); - Table_NextLine(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Light Arrows (primary)", "gLightArrowCol", lightarrow_col, ImVec4(255,255,170,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Light Arrows", "gLightArrowColEnv", lightarrow_colenv, ImVec4(255,255,0,255)); + DrawColorSection(Arrows_section, SECTION_SIZE(Arrows_section)); ImGui::EndTable(); } SohImGui::EnhancementCheckbox("Custom spells colors", "gUseSpellsCol"); - if (CVar_GetS32("gUseSpellsCol",0) && ImGui::BeginTable("tableSpells", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Inner colors##Spells", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Outer colors##Spells", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (CVar_GetS32("gUseSpellsCol",0)) { + DrawRandomizeResetButton("spells", Spells_section, SECTION_SIZE(Spells_section)); + } + if (CVar_GetS32("gUseSpellsCol",0) && ImGui::BeginTable("tableSpells", 2, FlagsTable)) { + ImGui::TableSetupColumn("Inner colors##Spells", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Outer colors##Spells", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Din's Fire (primary)", "gDF_Col", df_col, ImVec4(255,200,0,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Din's Fire", "gDF_Env", df_colenv, ImVec4(255,0,0,255)); - Table_NextLine(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Nayru's Love Diamond (primary)", "gNL_Diamond_Col", nl_diam_col, ImVec4(170,255,255,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Nayru's Love Diamond", "gNL_Diamond_Env", nl_diam_colenv, ImVec4(100,255,128,255)); - Table_NextLine(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Nayru's Love Orb (primary)", "gNL_Orb_Col", nl_orb_col, ImVec4(170,255,255,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Nayru's Love Orb", "gNL_Orb_Env", nl_orb_colenv, ImVec4(150,255,255,255)); + DrawColorSection(Spells_section, SECTION_SIZE(Spells_section)); ImGui::EndTable(); } SohImGui::EnhancementCheckbox("Custom spin attack colors", "gUseChargedCol"); - if (CVar_GetS32("gUseChargedCol",0) && ImGui::BeginTable("tableChargeAtk", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Primary colors##Charge", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Env colors##Charge", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (CVar_GetS32("gUseChargedCol",0)) { + DrawRandomizeResetButton("spins attack", SpinAtk_section, SECTION_SIZE(SpinAtk_section)); + } + if (CVar_GetS32("gUseChargedCol",0) && ImGui::BeginTable("tableChargeAtk", 2, FlagsTable)) { + ImGui::TableSetupColumn("Primary colors##Charge", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Env colors##Charge", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Level 1 color (primary)", "gCharged1Col", charged1_col, ImVec4(170,255,255,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Level 1 color", "gCharged1ColEnv", charged1_colenv, ImVec4(0,100,255,255)); - Table_NextLine(); - Draw_HelpIcon("Affects Primary color"); - SohImGui::EnhancementColor("Level 2 color (primary)", "gCharged2Col", charged2_col, ImVec4(255,255,170,255)); - Table_NextCol(); - Draw_HelpIcon("Affects Secondary color"); - SohImGui::EnhancementColor("Level 2 color", "gCharged2ColEnv", charged2_colenv, ImVec4(255,100,0,255)); + DrawColorSection(SpinAtk_section, SECTION_SIZE(SpinAtk_section)); ImGui::EndTable(); } SohImGui::EnhancementCheckbox("Custom trails color", "gUseTrailsCol"); - if (CVar_GetS32("gUseTrailsCol",0) && ImGui::BeginTable("tabletrails", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Custom Trails", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (CVar_GetS32("gUseTrailsCol",0) && ImGui::BeginTable("tabletrails", 1, FlagsTable)) { + ImGui::TableSetupColumn("Custom Trails", FlagsCell, TablesCellsWidth); Table_InitHeader(); - Draw_HelpIcon("Affects Swords slash, boomerang and Bombchu trails color"); - SohImGui::EnhancementColor("Trails color", "gTrailCol", trailscol, ImVec4(255,255,255,255)); + DrawColorSection(Trails_section, SECTION_SIZE(Trails_section)); SohImGui::EnhancementSliderInt("Trails duration: %dx", "##TrailsMul", "gTrailDurantion", 1, 5, ""); SohImGui::Tooltip("The longer the trails the weirder it become"); ImGui::NewLine(); @@ -379,48 +441,20 @@ void Draw_ItemsSkills(){ } void Draw_Menus(){ if (CVar_GetS32("gHudColors",0) ==2 ){ - if (ImGui::BeginTable("tableFileChoose", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("File Choose color", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Bottom text color", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (ImGui::BeginTable("tableFileChoose", 2, FlagsTable)) { + ImGui::TableSetupColumn("File Choose color", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Bottom text color", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Affects the File Select menu background."); - SohImGui::EnhancementColor("File Choose color", "gCCFileChoosePrim", fileselect_colors, ImVec4(100, 150, 255, 255), true, false, true); - Table_NextCol(); - Draw_HelpIcon("Affects the File Select texts."); - SohImGui::EnhancementColor("Bottom text color", "gCCFileChooseTextPrim", fileselect_text_colors, ImVec4(100, 255, 255, 255), true, false, true); + DrawColorSection(FileChoose_section, SECTION_SIZE(FileChoose_section)); ImGui::EndTable(); } - /* - if (ImGui::BeginTable("tablePauseMenu", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Kaleido pages (Non working atm)", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); - Table_InitHeader(); - Draw_HelpIcon("Affect the Equipments menu background."); - SohImGui::EnhancementColor("Equipments", "gCCEquipmentsPrim", menu_equips_colors, ImVec4(0, 100, 255, 255), true, true); - Table_NextLine(); - Draw_HelpIcon("Affect the Select items menu background."); - SohImGui::EnhancementColor("Items", "gCCItemsPrim", menu_items_colors, ImVec4(0, 100, 255, 255), true, true); - Table_NextLine(); - Draw_HelpIcon("Affect the Map menu background."); - SohImGui::EnhancementColor("Maps", "gCCMapsPrim", menu_map_colors, ImVec4(0, 100, 255, 255), true, true); - Table_NextLine(); - Draw_HelpIcon("Affect the Quests statut menu background."); - SohImGui::EnhancementColor("Quests", "gCCQuestsPrim", menu_quest_colors, ImVec4(0, 100, 255, 255), true, true); - Table_NextLine(); - Draw_HelpIcon("Affect the Save menu background."); - SohImGui::EnhancementColor("Save", "gCCSavePrim", menu_save_colors, ImVec4(0, 100, 255, 255), true, true); - Table_NextLine(); - Draw_HelpIcon("Affect the Gameover screen background."); - SohImGui::EnhancementColor("Gameover", "gCCGameoverPrim", menu_gameover_colors, ImVec4(0, 100, 255, 255), true, true); - ImGui::EndTable(); - } - */ } else { ImGui::Text("To modify menus colors you need \"Custom Colors\" scheme\nto be selected in \"General\" tab.\nOnce enabled you will be able to modify the following colors:\nFile Choose color\nBottom text color"); } } void Draw_Placements(){ - if (ImGui::BeginTable("tableMargins", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("General margins settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableMargins", 1, FlagsTable)) { + ImGui::TableSetupColumn("General margins settings", FlagsCell, TablesCellsWidth); Table_InitHeader(); SohImGui::EnhancementSliderInt("Top : %dx", "##UIMARGINT", "gHUDMargin_T", (ImGui::GetWindowViewport()->Size.y/2)*-1, 25, "", 0, true); SohImGui::EnhancementSliderInt("Left: %dx", "##UIMARGINL", "gHUDMargin_L", -25, ImGui::GetWindowViewport()->Size.x, "", 0, true); @@ -438,174 +472,90 @@ void Draw_Placements(){ ImGui::EndTable(); } if (ImGui::CollapsingHeader("Hearts count position")) { - if (ImGui::BeginTable("tableHeartsCounts", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Hearts counts settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableHeartsCounts", 1, FlagsTable)) { + ImGui::TableSetupColumn("Hearts counts settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Hearts count use margins", "gHeartsUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gHeartsCountPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gHeartsCountPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gHeartsCountPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gHeartsCountPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gHeartsCountPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##HeartCountPosY", "gHeartsPosY", -22, ImGui::GetWindowViewport()->Size.y, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##HeartCountPosX", "gHeartsPosX", -25, ImGui::GetWindowViewport()->Size.x, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Hearts counts", "gHearts"); + DrawPositionsRadioBoxes("gHeartsCount"); + DrawPositionSlider("gHeartsCount",-22,ImGui::GetWindowViewport()->Size.y,-25,ImGui::GetWindowViewport()->Size.x); + DrawScaleSlider("gHeartsCount",0.7f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Magic Meter position")) { - if (ImGui::BeginTable("tablemmpos", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Magic meter settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablemmpos", 1, FlagsTable)) { + ImGui::TableSetupColumn("Magic meter settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Magic meter use margins", "gMagicBarUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gMagicBarPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gMagicBarPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gMagicBarPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gMagicBarPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gMagicBarPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##MagicBarPosY", "gMagicBarPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##MagicBarPosX", "gMagicBarPosX", -5, ImGui::GetWindowViewport()->Size.x/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Magic meter", "gMagicBar"); + DrawPositionsRadioBoxes("gMagicBar"); + DrawPositionSlider("gMagicBar", 0, ImGui::GetWindowViewport()->Size.y/2, -5, ImGui::GetWindowViewport()->Size.x/2); + DrawScaleSlider("gMagicBar",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (CVar_GetS32("gVisualAgony",0) && ImGui::CollapsingHeader("Visual stone of agony position")) { - if (ImGui::BeginTable("tabledvisualstoneofagony", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Visual stone of agony settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tabledvisualstoneofagony", 1, FlagsTable)) { + ImGui::TableSetupColumn("Visual stone of agony settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Visual stone of agony use margins", "gVSOAUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gVSOAPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gVSOAPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gVSOAPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gVSOAPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gVSOAPosType", 4); //in case you want only SFX - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##VSOAPosY", "gVSOAPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - s16 Min_X_Dpad = 0; - s16 Max_X_Dpad = ImGui::GetWindowViewport()->Size.x/2; + DrawUseMarginsSlider("Visual stone of agony", "gVSOA"); + DrawPositionsRadioBoxes("gVSOA"); + s16 Min_X_VSOA = 0; + s16 Max_X_VSOA = ImGui::GetWindowViewport()->Size.x/2; if(CVar_GetS32("gVSOAPosType",0) == 2){ - Max_X_Dpad = 290; + Max_X_VSOA = 290; } else if(CVar_GetS32("gVSOAPosType",0) == 4){ - Min_X_Dpad = (ImGui::GetWindowViewport()->Size.x/2)*-1; + Min_X_VSOA = (ImGui::GetWindowViewport()->Size.x/2)*-1; } - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##VSOAPosX", "gVSOAPosX", Min_X_Dpad, Max_X_Dpad, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawPositionSlider("gVSOA", 0, ImGui::GetWindowViewport()->Size.y/2, Min_X_VSOA, Max_X_VSOA); + DrawScaleSlider("gVSOA",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("B Button position")) { - if (ImGui::BeginTable("tablebbtn", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("B Button settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablebbtn", 1, FlagsTable)) { + ImGui::TableSetupColumn("B Button settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("B Button use margins", "gBBtnUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gBBtnPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gBBtnPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gBBtnPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gBBtnPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gBBtnPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##BBtnPosY", "gBBtnPosY", 0, ImGui::GetWindowViewport()->Size.y/4+50, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##BBtnPosX", "gBBtnPosX", -1, ImGui::GetWindowViewport()->Size.x-50, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("B Button", "gBBtn"); + DrawPositionsRadioBoxes("gBBtn"); + DrawPositionSlider("gBBtn", 0, ImGui::GetWindowViewport()->Size.y/4+50, -1, ImGui::GetWindowViewport()->Size.x-50); + DrawScaleSlider("gBBtn",0.95f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("A Button position")) { - if (ImGui::BeginTable("tableabtn", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("A Button settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableabtn", 1, FlagsTable)) { + ImGui::TableSetupColumn("A Button settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("A Button use margins", "gABtnUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gABtnPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gABtnPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gABtnPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gABtnPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gABtnPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##ABtnPosY", "gABtnPosY", -10, ImGui::GetWindowViewport()->Size.y/4+50, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##ABtnPosX", "gABtnPosX", -20, ImGui::GetWindowViewport()->Size.x-50, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("A Button", "gABtn"); + DrawPositionsRadioBoxes("gABtn"); + DrawPositionSlider("gABtn", -10, ImGui::GetWindowViewport()->Size.y/4+50, -20, ImGui::GetWindowViewport()->Size.x-50); + DrawScaleSlider("gABtn",0.95f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Start Button position")) { - if (ImGui::BeginTable("tablestartbtn", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Start Button settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablestartbtn", 1, FlagsTable)) { + ImGui::TableSetupColumn("Start Button settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Start Button use margins", "gStartBtnUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gStartBtnPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gStartBtnPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gStartBtnPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gStartBtnPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gStartBtnPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##StartBtnPosY", "gStartBtnPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##StartBtnPosX", "gStartBtnPosX", 0, ImGui::GetWindowViewport()->Size.x/2+70, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Start Button", "gStartBtn"); + DrawPositionsRadioBoxes("gStartBtn"); + DrawPositionSlider("gStartBtn", 0, ImGui::GetWindowViewport()->Size.y/2, 0, ImGui::GetWindowViewport()->Size.x/2+70); + DrawScaleSlider("gStartBtn",0.75f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("C Button Up position")) { - if (ImGui::BeginTable("tablecubtn", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("C Button Up settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablecubtn", 1, FlagsTable)) { + ImGui::TableSetupColumn("C Button Up settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("C Button Up use margins", "gCBtnUUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gCBtnUPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gCBtnUPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gCBtnUPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gCBtnUPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gCBtnUPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##CBtnUPosY", "gCBtnUPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); + DrawUseMarginsSlider("C Button Up", "gCBtnU"); + DrawPositionsRadioBoxes("gCBtnU"); s16 Min_X_CU = 0; s16 Max_X_CU = ImGui::GetWindowViewport()->Size.x/2; if(CVar_GetS32("gCBtnUPosType",0) == 2){ @@ -615,30 +565,18 @@ void Draw_Placements(){ } else if(CVar_GetS32("gCBtnUPosType",0) == 4){ Min_X_CU = (ImGui::GetWindowViewport()->Size.x/2)*-1; } - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##CBtnUPosX", "gCBtnUPosX", Min_X_CU, Max_X_CU, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawPositionSlider("gCBtnU", 0, ImGui::GetWindowViewport()->Size.y/2, Min_X_CU, Max_X_CU); + DrawScaleSlider("gCBtnU",0.5f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("C Button Down position")) { - if (ImGui::BeginTable("tablecdbtn", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("C Button Down settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablecdbtn", 1, FlagsTable)) { + ImGui::TableSetupColumn("C Button Down settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("C Button Down use margins", "gCBtnDUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gCBtnDPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gCBtnDPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gCBtnDPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gCBtnDPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gCBtnDPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##CBtnDPosY", "gCBtnDPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); + DrawUseMarginsSlider("C Button Down", "gCBtnD"); + DrawPositionsRadioBoxes("gCBtnD"); s16 Min_X_CD = 0; s16 Max_X_CD = ImGui::GetWindowViewport()->Size.x/2; if(CVar_GetS32("gCBtnDPosType",0) == 2){ @@ -648,63 +586,39 @@ void Draw_Placements(){ } else if(CVar_GetS32("gCBtnDPosType",0) == 4){ Min_X_CD = (ImGui::GetWindowViewport()->Size.x/2)*-1; } - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##CBtnDPosX", "gCBtnDPosX", Min_X_CD, Max_X_CD, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawPositionSlider("gCBtnD", 0, ImGui::GetWindowViewport()->Size.y/2, Min_X_CD, Max_X_CD); + DrawScaleSlider("gCBtnD",0.87f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("C Button Left position")) { - if (ImGui::BeginTable("tableclbtn", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("C Button Left settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableclbtn", 1, FlagsTable)) { + ImGui::TableSetupColumn("C Button Left settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("C Button Left use margins", "gCBtnLUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gCBtnLPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gCBtnLPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gCBtnLPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gCBtnLPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gCBtnLPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##CBtnLPosY", "gCBtnLPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); + DrawUseMarginsSlider("C Button Left", "gCBtnL"); + DrawPositionsRadioBoxes("gCBtnL"); s16 Min_X_CL = 0; s16 Max_X_CL = ImGui::GetWindowViewport()->Size.x/2; - if(CVar_GetS32("gCBtnDPosType",0) == 2){ + if(CVar_GetS32("gCBtnLPosType",0) == 2){ Max_X_CL = 294; - } else if(CVar_GetS32("gCBtnDPosType",0) == 3){ + } else if(CVar_GetS32("gCBtnLPosType",0) == 3){ Max_X_CL = ImGui::GetWindowViewport()->Size.x/2; - } else if(CVar_GetS32("gCBtnDPosType",0) == 4){ + } else if(CVar_GetS32("gCBtnLPosType",0) == 4){ Min_X_CL = (ImGui::GetWindowViewport()->Size.x/2)*-1; } - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##CBtnLPosX", "gCBtnLPosX", Min_X_CL, Max_X_CL, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawPositionSlider("gCBtnL", 0, ImGui::GetWindowViewport()->Size.y/2, Min_X_CL, Max_X_CL); + DrawScaleSlider("gCBtnL",0.87f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("C Button Right position")) { - if (ImGui::BeginTable("tablecrnbtn", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("C Button Right settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablecrnbtn", 1, FlagsTable)) { + ImGui::TableSetupColumn("C Button Right settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("C Button Right use margins", "gCBtnRUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gCBtnRPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gCBtnRPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gCBtnRPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gCBtnRPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gCBtnRPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##CBtnRPosY", "gCBtnRPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); + DrawUseMarginsSlider("C Button Right", "gCBtnR"); + DrawPositionsRadioBoxes("gCBtnR"); s16 Min_X_CR = 0; s16 Max_X_CR = ImGui::GetWindowViewport()->Size.x/2; if(CVar_GetS32("gCBtnRPosType",0) == 2){ @@ -714,30 +628,18 @@ void Draw_Placements(){ } else if(CVar_GetS32("gCBtnRPosType",0) == 4){ Min_X_CR = (ImGui::GetWindowViewport()->Size.x/2)*-1; } - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##CBtnRPosX", "gCBtnRPosX", Min_X_CR, Max_X_CR, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawPositionSlider("gCBtnR", 0, ImGui::GetWindowViewport()->Size.y/2, Min_X_CR, Max_X_CR); + DrawScaleSlider("gCBtnR",0.87f); ImGui::NewLine(); ImGui::EndTable(); } } if (CVar_GetS32("gDpadEquips",0) && ImGui::CollapsingHeader("DPad items position")) { - if (ImGui::BeginTable("tabledpaditems", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("DPad items settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tabledpaditems", 1, FlagsTable)) { + ImGui::TableSetupColumn("DPad items settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("DPad items use margins", "gDPadUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gDPadPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gDPadPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gDPadPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gDPadPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gDPadPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##DPadPosY", "gDPadPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); + DrawUseMarginsSlider("DPad items", "gDPad"); + DrawPositionsRadioBoxes("gDPad"); s16 Min_X_Dpad = 0; s16 Max_X_Dpad = ImGui::GetWindowViewport()->Size.x/2; if(CVar_GetS32("gDPadPosType",0) == 2){ @@ -745,200 +647,104 @@ void Draw_Placements(){ } else if(CVar_GetS32("gDPadPosType",0) == 4){ Min_X_Dpad = (ImGui::GetWindowViewport()->Size.x/2)*-1; } - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##DPadPosX", "gDPadPosX", Min_X_Dpad, Max_X_Dpad, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawPositionSlider("gDPad", 0, ImGui::GetWindowViewport()->Size.y/2, Min_X_Dpad, Max_X_Dpad); + DrawScaleSlider("gDPad",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Minimaps position")) { - if (ImGui::BeginTable("tableminimapspos", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("minimaps settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableminimapspos", 1, FlagsTable)) { + ImGui::TableSetupColumn("minimaps settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Minimap Button use margins", "gMinimapUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gMinimapPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gMinimapPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gMinimapPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - //SohImGui::EnhancementRadioButton("No anchors", "gMinimapPosType", 3); //currently bugged - //SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gMinimapPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##MinimapPosY", "gMinimapPosY", (ImGui::GetWindowViewport()->Size.y/3)*-1, ImGui::GetWindowViewport()->Size.y/3, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##MinimapPosX", "gMinimapPosX", ImGui::GetWindowViewport()->Size.x*-1, ImGui::GetWindowViewport()->Size.x/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Minimap", "gMinimap"); + DrawPositionsRadioBoxes("gMinimap", false); + DrawPositionSlider("gMinimap", (ImGui::GetWindowViewport()->Size.y/3)*-1, ImGui::GetWindowViewport()->Size.y/3, ImGui::GetWindowViewport()->Size.x*-1, ImGui::GetWindowViewport()->Size.x/2); + DrawScaleSlider("gMinimap",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Small Keys counter position")) { - if (ImGui::BeginTable("tablesmolekeys", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Small Keys counter settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablesmolekeys", 1, FlagsTable)) { + ImGui::TableSetupColumn("Small Keys counter settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Small Keys counter use margins", "gSKCUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gSKCPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gSKCPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gSKCPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gSKCPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gSKCPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##SKCPosY", "gSKCPosY", 0, ImGui::GetWindowViewport()->Size.y/3, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##SKCPosX", "gSKCPosX", -1, ImGui::GetWindowViewport()->Size.x/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Small Keys counter", "gSKC"); + DrawPositionsRadioBoxes("gSKC"); + DrawPositionSlider("gSKC", 0, ImGui::GetWindowViewport()->Size.y/3, -1, ImGui::GetWindowViewport()->Size.x/2); + DrawScaleSlider("gSKC",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Rupee counter position")) { - if (ImGui::BeginTable("tablerupeecount", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Rupee counter settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablerupeecount", 1, FlagsTable)) { + ImGui::TableSetupColumn("Rupee counter settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Rupee counter use margins", "gRCUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gRCPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gRCPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gRCPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gRCPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gRCPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##RCPosY", "gRCPosY", -2, ImGui::GetWindowViewport()->Size.y/3, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##RCPosX", "gRCPosX", -3, ImGui::GetWindowViewport()->Size.x/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Rupee counter", "gRC"); + DrawPositionsRadioBoxes("gRC"); + DrawPositionSlider("gRC", -2, ImGui::GetWindowViewport()->Size.y/3, -3, ImGui::GetWindowViewport()->Size.x/2); + DrawScaleSlider("gRC",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Carrots position")) { - if (ImGui::BeginTable("tableCarrots", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Carrots settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableCarrots", 1, FlagsTable)) { + ImGui::TableSetupColumn("Carrots settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Carrots use margins", "gCarrotsUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gCarrotsPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gCarrotsPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gCarrotsPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gCarrotsPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gCarrotsPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##CarrotsPosY", "gCarrotsPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##CarrotsPosX", "gCarrotsPosX", -50, ImGui::GetWindowViewport()->Size.x/2+25, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Carrots", "gCarrots"); + DrawPositionsRadioBoxes("gCarrots"); + DrawPositionSlider("gCarrots", 0, ImGui::GetWindowViewport()->Size.y/2, -50, ImGui::GetWindowViewport()->Size.x/2+25); + DrawScaleSlider("gCarrots",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Timers position")) { - if (ImGui::BeginTable("tabletimers", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Timers settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tabletimers", 1, FlagsTable)) { + ImGui::TableSetupColumn("Timers settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Timers use margins", "gTimersUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gTimersPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gTimersPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gTimersPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gTimersPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gTimersPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##TimersPosY", "gTimersPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##TimersPosX", "gTimersPosX", -50, ImGui::GetWindowViewport()->Size.x/2-50, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Timers", "gTimers"); + DrawPositionsRadioBoxes("gTimers"); + DrawPositionSlider("gTimers", 0, ImGui::GetWindowViewport()->Size.y/2, -50, ImGui::GetWindowViewport()->Size.x/2-50); + DrawScaleSlider("gTimers",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Archery Scores position")) { - if (ImGui::BeginTable("tablearchery", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Archery Scores settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tablearchery", 1, FlagsTable)) { + ImGui::TableSetupColumn("Archery Scores settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Archery Scores use margins", "gASUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gASPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gASPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gASPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - //SohImGui::EnhancementRadioButton("No anchors", "gASPosType", 3); //currently bugged - //SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gASPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##ASPosY", "gASPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##ASPosX", "gASPosX", -50, ImGui::GetWindowViewport()->Size.x/2-50, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Archery scores", "gAS"); + DrawPositionsRadioBoxes("gAS", false); + DrawPositionSlider("gAS", 0, ImGui::GetWindowViewport()->Size.y/2, -50, ImGui::GetWindowViewport()->Size.x/2-50); + DrawScaleSlider("gAS",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Title cards (Maps) position")) { - if (ImGui::BeginTable("tabletcmaps", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Titlecard maps settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tabletcmaps", 1, FlagsTable)) { + ImGui::TableSetupColumn("Titlecard maps settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Title cards (Maps) use margins", "gTCMUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gTCMPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gTCMPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gTCMPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gTCMPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gTCMPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##TCMPosY", "gTCMPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##TCMPosX", "gTCMPosX", -50, ImGui::GetWindowViewport()->Size.x/2+10, ""), true; - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Title cards (overworld)", "gTCM"); + DrawPositionsRadioBoxes("gTCM"); + DrawPositionSlider("gTCM", 0, ImGui::GetWindowViewport()->Size.y/2, -50, ImGui::GetWindowViewport()->Size.x/2+10); + DrawScaleSlider("gTCM",1.0f); ImGui::NewLine(); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Title cards (Bosses) position")) { - if (ImGui::BeginTable("tabletcbosses", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Title cards (Bosses) settings", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tabletcbosses", 1, FlagsTable)) { + ImGui::TableSetupColumn("Title cards (Bosses) settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - SohImGui::EnhancementCheckbox("Title cards (Bosses) use margins", "gTCBUseMargins"); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Original position", "gTCBPosType", 0); - SohImGui::Tooltip("This will use original intended elements position."); - SohImGui::EnhancementRadioButton("Anchor to the left", "gTCBPosType", 1); - SohImGui::Tooltip("This will make your elements follow the left side of your game window."); - SohImGui::EnhancementRadioButton("Anchor to the right", "gTCBPosType", 2); - SohImGui::Tooltip("This will make your elements follow the right side of your game window."); - SohImGui::EnhancementRadioButton("No anchors", "gTCBPosType", 3); - SohImGui::Tooltip("This will make your elements to not follow any side\nBetter used for center elements."); - SohImGui::EnhancementRadioButton("Hidden", "gTCBPosType", 4); - SohImGui::Tooltip("This will make your elements hidden"); - SohImGui::EnhancementSliderInt("Up <-> Down : %d", "##TCBPosY", "gTCBPosY", 0, ImGui::GetWindowViewport()->Size.y/2, "", 0, true); - SohImGui::Tooltip("This slider is used to move Up and Down your elements."); - SohImGui::EnhancementSliderInt("Left <-> Right : %d", "##TCBPosX", "gTCBPosX", -50, ImGui::GetWindowViewport()->Size.x/2+10, "", 0, true); - SohImGui::Tooltip("This slider is used to move Left and Right your elements."); + DrawUseMarginsSlider("Title cards (Bosses)", "gTCB"); + DrawPositionsRadioBoxes("gTCB"); + DrawPositionSlider("gTCB", 0, ImGui::GetWindowViewport()->Size.y/2, -50, ImGui::GetWindowViewport()->Size.x/2+10); + DrawScaleSlider("gTCB",1.0f); ImGui::NewLine(); ImGui::EndTable(); } @@ -946,67 +752,53 @@ void Draw_Placements(){ } void Draw_HUDButtons(){ if (CVar_GetS32("gHudColors",0) ==2 ){ + DrawRandomizeResetButton("every buttons", Buttons_section, SECTION_SIZE(Buttons_section)); if (ImGui::CollapsingHeader("A Button colors & A Cursors")) { - if (ImGui::BeginTable("tableBTN_A", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("A Button colors", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableBTN_A", 1, FlagsTable)) { + ImGui::TableSetupColumn("A Button colors", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - Draw_HelpIcon("Affects the A button colors (and various cursors that use the same theme)", false); - SohImGui::EnhancementColor("A Buttons", "gCCABtnPrim", a_btn_colors, ImVec4(0, 200, 50, 255), true, false, true); + DrawColorSection(A_Btn_section, SECTION_SIZE(A_Btn_section)); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("B Button color")) { - if (ImGui::BeginTable("tableBTN_B", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("B button color", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableBTN_B", 1, FlagsTable)) { + ImGui::TableSetupColumn("B button color", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - Draw_HelpIcon("Affects the B button color", false); - SohImGui::EnhancementColor("B Button", "gCCBBtnPrim", b_btn_colors, ImVec4(255, 30, 30, 255), true, false, true); + DrawColorSection(B_Btn_section, SECTION_SIZE(B_Btn_section)); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("C-Buttons & C Cursor")) { - if (ImGui::BeginTable("tableBTN_C", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Button C colors & C Cursor colors", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableBTN_C", 1, FlagsTable)) { + ImGui::TableSetupColumn("Button C colors & C Cursor colors", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - Draw_HelpIcon("Affects the C Buttons' color (if not using separate colors)\nAnd various cursor that use C-Buttons colors", false); - SohImGui::EnhancementColor("C-Buttons", "gCCCBtnPrim", c_btn_colors, ImVec4(255, 160, 0, 255), true, false, true); + DrawColorSection(C_Btn_Unified_section, SECTION_SIZE(C_Btn_Unified_section)); ImGui::EndTable(); } SohImGui::EnhancementCheckbox("C-Buttons use separate colors", "gCCparated"); if (CVar_GetS32("gCCparated",0) && ImGui::CollapsingHeader("C Button individual colors")) { - if (ImGui::BeginTable("tableBTN_CSep", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("C-Buttons individual colors", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableBTN_CSep", 1, FlagsTable)) { + ImGui::TableSetupColumn("C-Buttons individual colors", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - Draw_HelpIcon("Affects C-Buttons Up colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top"); - SohImGui::EnhancementColor("C Buttons Up", "gCCCUBtnPrim", c_btn_u_colors, ImVec4(255,160,0,255)); - Table_NextLine(); - Draw_HelpIcon("Affects C-Buttons Down colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top"); - SohImGui::EnhancementColor("C Buttons Down", "gCCCDBtnPrim", c_btn_d_colors, ImVec4(255,160,0,255)); - Table_NextLine(); - Draw_HelpIcon("Affects C-Buttons Left colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top"); - SohImGui::EnhancementColor("C Buttons Left", "gCCCLBtnPrim", c_btn_l_colors, ImVec4(255,160,0,255)); - Table_NextLine(); - Draw_HelpIcon("Affects C-Buttons Right colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top"); - SohImGui::EnhancementColor("C Buttons Right", "gCCCRBtnPrim", c_btn_r_colors, ImVec4(255,160,0,255)); + DrawColorSection(C_Btn_Separated_section, SECTION_SIZE(C_Btn_Separated_section)); ImGui::EndTable(); } } } if (ImGui::CollapsingHeader("Start button colors")) { - if (ImGui::BeginTable("tableBTN_Start", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Start button colors", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableBTN_Start", 1, FlagsTable)) { + ImGui::TableSetupColumn("Start button colors", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - Draw_HelpIcon("Affects the Start button color", false); - SohImGui::EnhancementColor("Start Buttons", "gCCStartBtnPrim", start_btn_colors, ImVec4(200, 0, 0, 255), true, false, true); + DrawColorSection(Start_Btn_section, SECTION_SIZE(Start_Btn_section)); ImGui::EndTable(); } } if (CVar_GetS32("gDpadEquips",0) && ImGui::CollapsingHeader("DPad colors")) { - if (ImGui::BeginTable("tableDpadHud", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("DPad color", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableDpadHud", 1, FlagsTable)) { + ImGui::TableSetupColumn("DPad color", FlagsCell, TablesCellsWidth); Table_InitHeader(false); - Draw_HelpIcon("DPad background color, White is the default value"); - SohImGui::EnhancementColor("DPad background color", "gCCDpadPrim", dpad_colors, ImVec4(255, 255, 255, 255)); + DrawColorSection(DPad_section, SECTION_SIZE(DPad_section)); ImGui::EndTable(); } } @@ -1015,10 +807,11 @@ void Draw_HUDButtons(){ } } void Draw_General(){ - if (ImGui::BeginTable("tableScheme", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV | ImGuiTableFlags_Hideable)) { - ImGui::TableSetupColumn("N64 Scheme", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); - ImGui::TableSetupColumn("GameCube Scheme", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); - ImGui::TableSetupColumn("Custom Schemes", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + DrawRandomizeResetButton("all cosmetics", Everything_Section, SECTION_SIZE(Everything_Section), true); + if (ImGui::BeginTable("tableScheme", 3, FlagsTable | ImGuiTableFlags_Hideable)) { + ImGui::TableSetupColumn("N64 Scheme", FlagsCell, TablesCellsWidth); + ImGui::TableSetupColumn("GameCube Scheme", FlagsCell, TablesCellsWidth); + ImGui::TableSetupColumn("Custom Schemes", FlagsCell, TablesCellsWidth); Table_InitHeader(); Draw_HelpIcon("Change interface color to N64 style"); SohImGui::EnhancementRadioButton("N64 Colors", "gHudColors", 0); @@ -1031,86 +824,83 @@ void Draw_General(){ ImGui::EndTable(); } if (CVar_GetS32("gHudColors",0) ==2 ){ + DrawRandomizeResetButton("interface (excluding buttons)", Misc_Interface_section, SECTION_SIZE(Misc_Interface_section)); if (ImGui::CollapsingHeader("Hearts colors")) { SohImGui::Tooltip("Hearts colors in general\nDD stand for Double Defense"); - if (ImGui::BeginTable("tableHearts", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV | ImGuiTableFlags_Hideable)) { + if (ImGui::BeginTable("tableHearts", 3, FlagsTable | ImGuiTableFlags_Hideable)) { ImGui::TableSetupColumn("Hearts (normal)", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable, TablesCellsWidth/3); ImGui::TableSetupColumn("Hearts (DD)", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable, TablesCellsWidth/3); ImGui::TableSetupColumn("Hearts Outline (DD)", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable, TablesCellsWidth/3); Table_InitHeader(); - Draw_HelpIcon("Affects the inner color", false); - SohImGui::EnhancementColor("Inner normal", "gCCHeartsPrim", hearts_colors, ImVec4(255,70,50,255), true, false, true); - Table_NextCol(); - Draw_HelpIcon("Affects the inner color", false); - SohImGui::EnhancementColor("Inner DD", "gCCDDHeartsPrim", hearts_ddi_colors, ImVec4(255,70,50,255), true, false, true); - Table_NextCol(); - Draw_HelpIcon("Affects the outline color of hearts when you have Double Defense\nWhite is the default value", false); - SohImGui::EnhancementColor("Outline DD", "gDDCCHeartsPrim", hearts_dd_colors, ImVec4(255,255,255,255), true, false, true); + DrawColorSection(Hearts_section, SECTION_SIZE(Hearts_section)); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Magic Meter colors")) { - if (ImGui::BeginTable("tableMagicmeter", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV | ImGuiTableFlags_Hideable)) { - ImGui::TableSetupColumn("Magic meter", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Magic meter in use", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (ImGui::BeginTable("tableMagicmeter", 2, FlagsTable | ImGuiTableFlags_Hideable)) { + ImGui::TableSetupColumn("Magic meter", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Magic meter in use", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Affects the border of the magic meter\nWhite is the default value, color change only when used one time"); - SohImGui::EnhancementColor("Borders", "gCCMagicBorderNormPrim", magic_bordern_colors, ImVec4(255,255,255,255), false); - Table_NextCol(); - Draw_HelpIcon("Affects the border of the magic meter when being used\nWhite is the default value"); - SohImGui::EnhancementColor("Borders in use", "gCCMagicBorderPrim", magic_border_colors, ImVec4(255,255,255,255), false); - Table_NextLine(); - Draw_HelpIcon("Affects the magic meter color\nGreen is the default value"); - SohImGui::EnhancementColor("Main color", "gCCMagicPrim", magic_remaining_colors, ImVec4(0,200,0,255)); - Table_NextCol(); - Draw_HelpIcon("Affects the magic meter when being used\nYellow is the default value"); - SohImGui::EnhancementColor("Main color in use", "gCCMagicUsePrim", magic_use_colors, ImVec4(250,250,0,255)); + DrawColorSection(Magic_Meter_section, SECTION_SIZE(Magic_Meter_section)); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Minimap and compass colors")) { - if (ImGui::BeginTable("tableMinimapCol", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { - ImGui::TableSetupColumn("Minimap color", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableMinimapCol", 1, FlagsTable)) { + ImGui::TableSetupColumn("Minimap color", FlagsCell, TablesCellsWidth); Table_InitHeader(); - Draw_HelpIcon("Affects the Overworld minimaps"); - SohImGui::EnhancementColor("Overworlds", "gCCMinimapPrim", minimap_colors, ImVec4(0, 255, 255, 255)); - Table_NextLine(); - Draw_HelpIcon("Affects the Dungeon minimaps"); - SohImGui::EnhancementColor("Dungeons", "gCCMinimapDGNPrim", dgn_minimap_colors, ImVec4(100, 255, 255, 255)); - Table_NextLine(); - Draw_HelpIcon("Affects the current position arrow on the minimap\nYellow is the default value"); - SohImGui::EnhancementColor("Current position arrow", "gCCMinimapCPPrim", cp_minimap_colors, ImVec4(200, 255, 0, 255)); - Table_NextLine(); - Draw_HelpIcon("Affects the last entrance position arrow on the minimap\nRed is the default value"); - SohImGui::EnhancementColor("Last entrance arrow", "gCCMinimapLEPrim", le_minimap_colors, ImVec4(200, 0, 0, 255)); + DrawColorSection(Minimap_section, SECTION_SIZE(Minimap_section)); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Title cards colors")) { - if (ImGui::BeginTable("tableTitleCards", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV | ImGuiTableFlags_Hideable)) { - ImGui::TableSetupColumn("Title cards Overworld", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); - ImGui::TableSetupColumn("Title cards Bosses", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2); + if (ImGui::BeginTable("tableTitleCards", 2, FlagsTable | ImGuiTableFlags_Hideable)) { + ImGui::TableSetupColumn("Title cards Overworld", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Title cards Bosses", FlagsCell, TablesCellsWidth/2); Table_InitHeader(); - Draw_HelpIcon("Affects all the overworld title cards color, white is the default value"); - SohImGui::EnhancementColor("Main color", "gCCTC_OW_U_Prim", tc_ou_colors, ImVec4(255, 255, 255, 255), false); - Table_NextCol(); - Draw_HelpIcon("Affects all the bosses title cards color, white is the default value"); - SohImGui::EnhancementColor("Main color", "gCCTC_B_U_Prim", tc_bu_colors, ImVec4(255, 255, 255, 255), false); + DrawColorSection(TitleCards_section, SECTION_SIZE(TitleCards_section)); ImGui::EndTable(); } } if (ImGui::CollapsingHeader("Misc. interface colors")) { - if (ImGui::BeginTable("tableMiscHudCol", 1, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV | ImGuiTableFlags_Hideable)) { - ImGui::TableSetupColumn("Misc HUD colors", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth); + if (ImGui::BeginTable("tableMiscHudCol", 1, FlagsTable | ImGuiTableFlags_Hideable)) { + ImGui::TableSetupColumn("Misc HUD colors", FlagsCell, TablesCellsWidth); Table_InitHeader(); - Draw_HelpIcon("Affects the Rupee icon on interface\nGreen is the default value"); - SohImGui::EnhancementColor("Rupee icon", "gCCRupeePrim", rupee_colors, ImVec4(200, 255, 100, 255)); + DrawColorSection(Misc_section, SECTION_SIZE(Misc_section)); + ImGui::EndTable(); + } + } + if (ImGui::CollapsingHeader("Scenes transitions")) { + if (ImGui::BeginTable("tabletransitionotherCol", 2, FlagsTable | ImGuiTableFlags_Hideable)) { + ImGui::TableSetupColumn("transitionother1", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("transitionother2", FlagsCell, TablesCellsWidth/2); + Table_InitHeader(false); + SohImGui::EnhancementRadioButton("Originals", "gSceneTransitions", 255); + SohImGui::Tooltip("This will make the game use original scenes transitions"); + Table_NextCol(); + SohImGui::EnhancementRadioButton("None", "gSceneTransitions", 11); + SohImGui::Tooltip("This will make the game use no any scenes transitions"); Table_NextLine(); - Draw_HelpIcon("Affects the Small keys icon on interface\nGray is the default value"); - SohImGui::EnhancementColor("Small Keys icon", "gCCKeysPrim", smolekey_colors, ImVec4(200, 230, 255, 255)); + SohImGui::EnhancementRadioButton("Desert mode (persistant)", "gSceneTransitions", 14); + SohImGui::Tooltip("This will make the game use the sand storm scenes transitions that will persist in map"); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Desert mode (non persistant)", "gSceneTransitions", 15); + SohImGui::Tooltip("This will make the game use the sand storm scenes transitions"); Table_NextLine(); - Draw_HelpIcon("Affects the Stone of Agony icon on interface\nWhite is the default value"); - SohImGui::EnhancementColor("Stone of agony icon", "gCCVSOAPrim", visualagony_colors, ImVec4(255, 255, 255, 255)); + SohImGui::EnhancementRadioButton("Normal fade (green)", "gSceneTransitions", 18); + SohImGui::Tooltip("This will make the game use a greenish fade in/out scenes transitions"); + Table_NextCol(); + SohImGui::EnhancementRadioButton("Normal fade (blue)", "gSceneTransitions", 19); + SohImGui::Tooltip("This will make the game use a blue fade in/out scenes transitions"); + Table_NextLine(); + SohImGui::EnhancementRadioButton("Triforce", "gSceneTransitions", 1); + ImGui::EndTable(); + } + if (ImGui::BeginTable("tabletransitionCol", 2, FlagsTable | ImGuiTableFlags_Hideable)) { + ImGui::TableSetupColumn("White color", FlagsCell, TablesCellsWidth/2); + ImGui::TableSetupColumn("Black color", FlagsCell, TablesCellsWidth/2); + Table_InitHeader(); + DrawTransitions("gSceneTransitions"); ImGui::EndTable(); } } @@ -1123,7 +913,8 @@ void DrawCosmeticsEditor(bool& open) { CVar_SetS32("gCosmeticsEditorEnabled", 0); return; } - ImGui::SetNextWindowSize(ImVec2(465, 430), ImGuiCond_FirstUseEver); + + ImGui::SetNextWindowSize(ImVec2(620, 430), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Cosmetics Editor", &open)) { ImGui::End(); return; @@ -1150,7 +941,7 @@ void DrawCosmeticsEditor(bool& open) { Draw_Menus(); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Placements")) { + if (ImGui::BeginTabItem("Placements & Scale")) { Draw_Placements(); ImGui::EndTabItem(); } @@ -1165,4 +956,4 @@ void InitCosmeticsEditor() { SohImGui::AddWindow("Enhancements", "Rainbowfunction", LoadRainbowColor, true, true); //Draw the bar in the menu. SohImGui::AddWindow("Enhancements", "Cosmetics Editor", DrawCosmeticsEditor); -} +} \ No newline at end of file diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h index 9bfeee91d..4b6ea249b 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h @@ -1,4 +1,407 @@ #pragma once +#include "../libultraship/ImGuiImpl.h" +#define SECTION_SIZE(arr) (s32)(sizeof(arr) / sizeof(arr[0])) +#define RANDOMIZE_32(Max) GetRandomValue(Max); +#define CATEGORY_NPC 0 +#define CATEGORY_ITEMS 1 +#define CATEGORY_MENU 2 +#define CATEGORY_HUD 3 +#define CATEGORY_MISC 4 + +typedef struct { + const std::string Name; + const std::string ToolTip; + const std::string CvarName; + ImVec4 ModifiedColor; + ImVec4 DefaultColor; + bool canRainbow; + bool hasAlpha; + bool sameLine; +} CosmeticsColorIndividual; + +typedef struct { + CosmeticsColorIndividual* Element; + bool Nextcol; + bool NextLine; +} CosmeticsColorSection; + +static float TablesCellsWidth = 300.0f; +static ImGuiTableColumnFlags FlagsTable = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; +static ImGuiTableColumnFlags FlagsCell = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; +static ImVec4 hearts_colors; static ImVec4 hearts_dd_colors; static ImVec4 hearts_ddi_colors; +static ImVec4 a_btn_colors; static ImVec4 b_btn_colors; static ImVec4 c_btn_colors; static ImVec4 start_btn_colors; +static ImVec4 c_btn_u_colors; static ImVec4 c_btn_l_colors; static ImVec4 c_btn_d_colors; static ImVec4 c_btn_r_colors; +static ImVec4 magic_border_colors; static ImVec4 magic_remaining_colors; static ImVec4 magic_use_colors; +static ImVec4 minimap_colors; static ImVec4 dgn_minimap_colors; +static ImVec4 cp_minimap_colors; static ImVec4 le_minimap_colors; +static ImVec4 rupee_colors; static ImVec4 smolekey_colors; static ImVec4 magic_bordern_colors; +static ImVec4 fileselect_colors; static ImVec4 fileselect_text_colors; +static ImVec4 kokiri_col; static ImVec4 goron_col; static ImVec4 zora_col; +static ImVec4 navi_idle_i_col; static ImVec4 navi_idle_o_col; +static ImVec4 navi_npc_i_col; static ImVec4 navi_npc_o_col; +static ImVec4 navi_enemy_i_col; static ImVec4 navi_enemy_o_col; +static ImVec4 navi_prop_i_col; static ImVec4 navi_prop_o_col; +static ImVec4 trailscol; +static ImVec4 crtfilter; +static ImVec4 firearrow_col; static ImVec4 icearrow_col; static ImVec4 lightarrow_col; +static ImVec4 firearrow_colenv; static ImVec4 icearrow_colenv; static ImVec4 lightarrow_colenv; +static ImVec4 charged1_col; static ImVec4 charged2_col; +static ImVec4 charged1_colenv; static ImVec4 charged2_colenv; +static ImVec4 Keese1_primcol; static ImVec4 Keese2_primcol; +static ImVec4 Keese1_envcol; static ImVec4 Keese2_envcol; +static ImVec4 doggo1col; static ImVec4 doggo2col; +static ImVec4 df_col; static ImVec4 df_colenv; +static ImVec4 nl_diam_col; static ImVec4 nl_diam_colenv; +static ImVec4 nl_orb_col; static ImVec4 nl_orb_colenv; +static ImVec4 tc_ou_colors; static ImVec4 tc_bu_colors; +static ImVec4 dpad_colors; +static ImVec4 visualagony_colors; +static ImVec4 tc_fire_colors; static ImVec4 tc_fire_colors_env; +/*ImVec4 menu_equips_colors; +ImVec4 menu_items_colors; +ImVec4 menu_map_colors; +ImVec4 menu_quest_colors; +ImVec4 menu_save_colors; +ImVec4 menu_gameover_colors;*/ + +//Navi +static CosmeticsColorIndividual Navi_Idle_Inner = { "Navi Idle (Primary)", "Inner color for Navi (idle flying around)", "gNavi_Idle_Inner_", navi_idle_i_col, ImVec4(255, 255, 255, 255), false, false, false }; +static CosmeticsColorIndividual Navi_Idle_Outer = { "Navi Idle (Secondary)", "Outer color for Navi (idle flying around)", "gNavi_Idle_Outer_", navi_idle_o_col, ImVec4(0, 0, 255, 255), false, false, false }; +static CosmeticsColorIndividual Navi_Npc_Inner = { "Navi NPC (Primary)", "Inner color for Navi (when Navi fly around NPCs)", "gNavi_NPC_Inner_", navi_npc_i_col, ImVec4(150, 150, 255, 255), false, false, false }; +static CosmeticsColorIndividual Navi_Npc_Outer = { "Navi NPC (Secondary)", "Outer color for Navi (when Navi fly around NPCs)", "gNavi_NPC_Outer_", navi_npc_o_col, ImVec4(150, 150, 255, 255), false, false, false }; +static CosmeticsColorIndividual Navi_Enemy_Inner = { "Navi Enemy (Primary)", "Inner color for Navi (when Navi fly around Enemies or Bosses)", "gNavi_Enemy_Inner_", navi_enemy_i_col, ImVec4(255, 255, 0, 255), false, false, false }; +static CosmeticsColorIndividual Navi_Enemy_Outer = { "Navi Enemy (Secondary)", "Outer color for Navi (when Navi fly around Enemies or Bosses)", "gNavi_Enemy_Outer_", navi_enemy_o_col, ImVec4(220, 155, 0, 255), false, false, false }; +static CosmeticsColorIndividual Navi_Prop_Inner = { "Navi Enemy (Primary)", "Inner color for Navi (when Navi fly around props (signs etc))", "gNavi_Prop_Inner_", navi_prop_i_col, ImVec4(0, 255, 0, 255), false, false, false }; +static CosmeticsColorIndividual Navi_Prop_Outer = { "Navi Enemy (Secondary)", "Outer color for Navi (when Navi fly around props (signs etc))", "gNavi_Prop_Outer_", navi_prop_o_col, ImVec4(0, 255, 0, 255), false, false, false }; + +//Keese +static CosmeticsColorIndividual Keese1_prim = { "Fire Primary color", "Affects the primary color of the Fire itself of the Keese", "gKeese1_Ef_Prim", Keese1_primcol, ImVec4(255, 255, 100, 255), true, false, false }; +static CosmeticsColorIndividual Keese2_prim = { "Ice Primary color", "Affects the primary color of the Ice itself of the Keese", "gKeese2_Ef_Prim", Keese2_primcol, ImVec4(100, 200, 255, 255), true, false, false }; +static CosmeticsColorIndividual Keese1_env = { "Fire Secondary color", "Affects the secondary color of the Fire itself of the Keese", "gKeese1_Ef_Env", Keese1_envcol, ImVec4(255, 50, 0, 255), true, false, false }; +static CosmeticsColorIndividual Keese2_env = { "Ice Secondary color", "Affects the secondary color of the Ice itself of the Keese", "gKeese2_Ef_Env", Keese2_envcol, ImVec4(0, 0, 255, 255), true, false, false }; + +//Good old Dogs, we all love them +static CosmeticsColorIndividual DogN1 = { "Dog white", "Affects the colors of the white dog", "gDog1Col", doggo1col, ImVec4(255,255,200,255), true, false, true }; +static CosmeticsColorIndividual DogN2 = { "Dog brown", "Affects the colors of the brown dog", "gDog2Col", doggo2col, ImVec4(150,100,50,255), true, false, true }; + +//Tunics colors +static CosmeticsColorIndividual KokiriTunic = { "Kokiri Tunic", "Affects Kokiri Tunic color", "gTunic_Kokiri", kokiri_col, ImVec4(30, 105, 27, 255), true, false, true }; +static CosmeticsColorIndividual GoronTunic = { "Goron Tunic", "Affects Goron Tunic color", "gTunic_Goron", goron_col, ImVec4(100, 20, 0, 255), true, false, true }; +static CosmeticsColorIndividual ZoraTunic = { "Zora Tunic", "Affects Zora Tunic color", "gTunic_Zora", zora_col, ImVec4(0, 60, 100, 255), true, false, true }; + +//Arrows (Fire -> Ice -> Light) +static CosmeticsColorIndividual Fire_Arrow_Prim = { "Fire Arrows (primary)", "Affects Primary color", "gFireArrowCol", firearrow_col, ImVec4(255,200,0,255), true, false, false }; +static CosmeticsColorIndividual Fire_Arrow_Env = { "Fire Arrows (Secondary)", "Affects Secondary color", "gFireArrowColEnv", firearrow_colenv, ImVec4(255,0,0,255), true, false, false }; +static CosmeticsColorIndividual Ice_Arrow_Prim = { "Ice Arrows (Primary)", "Affects Primary color", "gIceArrowCol", icearrow_col, ImVec4(170,255,255,255), true, false, false }; +static CosmeticsColorIndividual Ice_Arrow_Env = { "Ice Arrows (Secondary)", "Affects Secondary color", "gIceArrowColEnv", icearrow_colenv, ImVec4(0,0,255,255), true, false, false }; +static CosmeticsColorIndividual Light_Arrow_Prim = { "Light Arrows (Primary)", "Affects Primary color", "gLightArrowCol", lightarrow_col, ImVec4(255,255,170,255), true, false, false }; +static CosmeticsColorIndividual Light_Arrow_Env = { "Light Arrows (Secondary)", "Affects Secondary color", "gLightArrowColEnv", lightarrow_colenv, ImVec4(255,255,0,255), true, false, false }; + +//Spells +static CosmeticsColorIndividual Din_Fire_Prim = { "Din's Fire (primary)", "Affects Primary color", "gDF_Col", df_col, ImVec4(255,200,0,255), true, false, false }; +static CosmeticsColorIndividual Din_Fire_Env = { "Din's Fire (Secondary)", "Affects Secondary color", "gDF_Env", df_colenv, ImVec4(255,0,0,255), true, false, false }; +static CosmeticsColorIndividual Nayru_Diamond_Prim = { "Nayru's Love Diamond (primary)", "Affects Primary color", "gNL_Diamond_Col", nl_diam_col, ImVec4(170,255,255,255), true, false, false }; +static CosmeticsColorIndividual Nayru_Diamond_Env = { "Nayru's Love Diamond (Secondary)", "Affects Secondary color", "gNL_Diamond_Env", nl_diam_colenv, ImVec4(100,255,128,255), true, false, false }; +static CosmeticsColorIndividual Nayru_Orb_Prim = { "Nayru's Love Orb (primary)", "Affects Primary color", "gNL_Orb_Col", nl_orb_col, ImVec4(170,255,255,255), true, false, false }; +static CosmeticsColorIndividual Nayru_Orb_Env = { "Nayru's Love Orb (Secondary)", "Affects Secondary color", "gNL_Orb_Env", nl_orb_colenv, ImVec4(150,255,255,255), true, false, false }; + +//Spin attacks colors +static CosmeticsColorIndividual Spin_Lv1_Prim = { "Level 1 (primary)", "Affects Primary color", "gCharged1Col", charged1_col, ImVec4(170,255,255,255), true, false, false }; +static CosmeticsColorIndividual Spin_Lv1_Env = { "Level 1 (Secondary)", "Affects Secondary color", "gCharged1ColEnv", charged1_colenv, ImVec4(0,100,255,255), true, false, false }; +static CosmeticsColorIndividual Spin_Lv2_Prim = { "Level 2 (primary)", "Affects Primary color", "gCharged2Col", charged2_col, ImVec4(255,255,170,255), true, false, false }; +static CosmeticsColorIndividual Spin_Lv2_Env = { "Level 2 (Secondary)", "Affects Secondary color", "gCharged2ColEnv", charged2_colenv, ImVec4(255,100,0,255), true, false, false }; + +//Trails +static CosmeticsColorIndividual Trails_col = { "Trails color", "Affects Swords slash, boomerang and Bombchu trails color", "gTrailCol", trailscol, ImVec4(255,255,255,255), true, false, false }; + +//Menus - File Choose +static CosmeticsColorIndividual FileChoose_Background = { "Main menu color", "Affects the File Select menu background.", "gCCFileChoosePrim", fileselect_colors, ImVec4(100, 150, 255, 255), true, false, false }; +static CosmeticsColorIndividual FileChoose_BottomText = { "Bottom texts color", "Affects the File Select texts.", "gCCFileChooseTextPrim", fileselect_text_colors, ImVec4(100, 255, 255, 255), true, false, false }; + +//Hud Stuff (Dpad, Buttons etc) +static CosmeticsColorIndividual A_Btn = { "A Button", "Affects the A button colors (and various cursors that use the same theme)", "gCCABtnPrim", a_btn_colors, ImVec4(0, 200, 50, 255), true, false, false }; +static CosmeticsColorIndividual B_Btn = { "B Button", "Affects the B button color", "gCCBBtnPrim", b_btn_colors, ImVec4(255, 30, 30, 255), true, false, false }; +static CosmeticsColorIndividual C_Btn = { "C-Buttons", "Affects the C Buttons' color (if not using separate colors)\nAnd various cursor that use C-Buttons colors", "gCCCBtnPrim", c_btn_colors, ImVec4(255, 160, 0, 255), true, false, false }; +static CosmeticsColorIndividual C_Btn_U = { "C-Buttons Up", "Affects C-Buttons Up colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCUBtnPrim", c_btn_u_colors, ImVec4(255,160,0,255), true, false, false }; +static CosmeticsColorIndividual C_Btn_D = { "C-Buttons Down", "Affects C-Buttons Down colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCDBtnPrim", c_btn_d_colors, ImVec4(255,160,0,255), true, false, false }; +static CosmeticsColorIndividual C_Btn_L = { "C-Buttons Left", "Affects C-Buttons Left colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCLBtnPrim", c_btn_l_colors, ImVec4(255,160,0,255), true, false, false }; +static CosmeticsColorIndividual C_Btn_R = { "C-Buttons Right", "Affects C-Buttons Right colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCRBtnPrim", c_btn_r_colors, ImVec4(255,160,0,255), true, false, false }; +static CosmeticsColorIndividual Start_btn = { "Start Button", "Affects the Start button color", "gCCStartBtnPrim", start_btn_colors, ImVec4(200, 0, 0, 255), true, false, false }; +static CosmeticsColorIndividual DPad_Items = { "DPad background", "DPad background color, White is the default value", "gCCDpadPrim", dpad_colors, ImVec4(255, 255, 255, 255), true, false, false }; + +//Hearts colors +static CosmeticsColorIndividual Hearts_NInner = { "Inner (Normal)", "Affects the inner color", "gCCHeartsPrim", hearts_colors, ImVec4(255,70,50,255), true, false, false }; +static CosmeticsColorIndividual Hearts_DDInner = { "Inner (Double defense)", "Affects the inner color", "gCCDDHeartsPrim", hearts_ddi_colors, ImVec4(255,70,50,255), true, false, false }; +static CosmeticsColorIndividual Hearts_DDOutline = { "Outline (Double defense)", "Affects the outline color of hearts when you have Double Defense\nWhite is the default value", "gDDCCHeartsPrim", hearts_dd_colors, ImVec4(255,255,255,255), true, false, false }; + +//Magic Meter colors +static CosmeticsColorIndividual Magic_Borders = { "Borders", "Affects the border of the magic meter\nWhite is the default value, color change only when used one time", "gCCMagicBorderNormPrim", magic_bordern_colors, ImVec4(255,255,255,255), false, false, false }; +static CosmeticsColorIndividual Magic_InUse_Borders = { "Borders in use", "Affects the border of the magic meter when being used\nWhite is the default value", "gCCMagicBorderPrim", magic_border_colors, ImVec4(255,255,255,255), false, false, false }; +static CosmeticsColorIndividual Magic_Meter = { "Main color", "Affects the magic meter color\nGreen is the default value", "gCCMagicPrim", magic_remaining_colors, ImVec4(0,200,0,255), true, false, false }; +static CosmeticsColorIndividual Magic_InUse_Meter = { "Main color in use", "Affects the magic meter when being used\nYellow is the default value", "gCCMagicUsePrim", magic_use_colors, ImVec4(250,250,0,255), true, false, false }; + +//Minimap and it's arrow colors +static CosmeticsColorIndividual Minimap_OW = { "Overworlds", "Affects the Overworld minimaps", "gCCMinimapPrim", minimap_colors, ImVec4(0, 255, 255, 255), true, false, false }; +static CosmeticsColorIndividual Minimap_DG = { "Dungeons", "Affects the Dungeon minimaps", "gCCMinimapDGNPrim", dgn_minimap_colors, ImVec4(100, 255, 255, 255), true, false, false }; +static CosmeticsColorIndividual Minimap_CP = { "Current position arrow", "Affects the current position arrow on the minimap\nYellow is the default value", "gCCMinimapCPPrim", cp_minimap_colors, ImVec4(200, 255, 0, 255), true, false, false }; +static CosmeticsColorIndividual Minimap_LE = { "Last entrance arrow", "Affects the last entrance position arrow on the minimap\nRed is the default value", "gCCMinimapLEPrim", le_minimap_colors, ImVec4(200, 0, 0, 255), true, false, false }; + +//Title Cards colors +static CosmeticsColorIndividual TitleCards_OW = { "Main color (Overworld)", "Affects all the overworld title cards color, white is the default value", "gCCTC_OW_U_Prim", tc_ou_colors, ImVec4(255, 255, 255, 255), false, false, false }; +static CosmeticsColorIndividual TitleCards_DG = { "Main color (Dungeon)", "Affects all the bosses title cards color, white is the default value", "gCCTC_B_U_Prim", tc_bu_colors, ImVec4(255, 255, 255, 255), false, false, false }; + +//Misc. colors, the one I have no clue where to put nor that aren't that important +#ifdef MASTER_QUEST +static CosmeticsColorIndividual TitleScreen_fire_Prim = { "Opening logo fire (Primary)", "Affects the fire behind the title screen logo", "gCCTCFirePrim", tc_fire_colors, ImVec4(170, 255, 255, 255), false, false, false }; +static CosmeticsColorIndividual TitleScreen_fire_Env = { "Opening logo fire (Secondary)", "Affects the fire behind the title screen logo", "gCCTCFireEnv", tc_fire_colors_env, ImVec4(200, 255, 0, 255), false, false, false }; +#else +static CosmeticsColorIndividual TitleScreen_fire_Prim = { "Opening logo fire (Primary)", "Affects the fire behind the title screen logo", "gCCTCFirePrim", tc_fire_colors, ImVec4(255, 255, 170, 255), false, false, false }; +static CosmeticsColorIndividual TitleScreen_fire_Env = { "Opening logo fire (Secondary)", "Affects the fire behind the title screen logo", "gCCTCFireEnv", tc_fire_colors_env, ImVec4(255, 100, 0, 255), false, false, false }; +#endif +static CosmeticsColorIndividual Rupee_Icon = { "Rupee icon", "Affects the Rupee icon on interface\nGreen is the default value", "gCCRupeePrim", rupee_colors, ImVec4(200, 255, 100, 255), true, false, false }; +static CosmeticsColorIndividual SmallKeys_Icon = { "Small Keys icon", "Affects the Small keys icon on interface\nGray is the default value", "gCCKeysPrim", smolekey_colors, ImVec4(200, 230, 255, 255), true, false, false }; +static CosmeticsColorIndividual VSOA_Icon = { "Visual Stone of agony icon", "Affects the Stone of Agony icon on interface\nWhite is the default value\nRequire room reload or activation", "gCCVSOAPrim", visualagony_colors, ImVec4(255, 255, 255, 255), true, false, false }; + +//Sections creation, here I regroup them in some sort of a Theme, all navi stuff together etc. It will be used to create the menu. +static CosmeticsColorSection Navi_Section[] = { + { &Navi_Idle_Inner, false, false }, + { &Navi_Idle_Outer, true, false }, + { &Navi_Npc_Inner, false, true }, + { &Navi_Npc_Outer, true, false }, + { &Navi_Enemy_Inner, false, true }, + { &Navi_Enemy_Outer, true, false }, + { &Navi_Prop_Inner, false, true }, + { &Navi_Prop_Outer, true, false } +}; +static CosmeticsColorSection Keese_Section[] = { + { &Keese1_prim, false, false }, + { &Keese2_prim, true, false }, + { &Keese1_env, false, true }, + { &Keese2_env, true, false } +}; +static CosmeticsColorSection Dogs_Section[] = { + { &DogN1, false, false }, + { &DogN2, true, false } +}; +static CosmeticsColorSection Tunics_Section[] = { + { &KokiriTunic, false, false }, + { &GoronTunic, true, false }, + { &ZoraTunic, true, false } +}; +static CosmeticsColorSection Arrows_section[] = { + { &Fire_Arrow_Prim, false, false }, + { &Fire_Arrow_Env, true, false }, + { &Ice_Arrow_Prim, false, true }, + { &Ice_Arrow_Env, true, false }, + { &Light_Arrow_Prim, false, true }, + { &Light_Arrow_Env, true, false } +}; +static CosmeticsColorSection Spells_section[] = { + { &Din_Fire_Prim, false, false }, + { &Din_Fire_Env, true, false }, + { &Nayru_Diamond_Prim, false, true }, + { &Nayru_Diamond_Env, true, false }, + { &Nayru_Orb_Prim, false, true }, + { &Nayru_Orb_Env, true, false } +}; +static CosmeticsColorSection SpinAtk_section[] = { + { &Spin_Lv1_Prim, false, false }, + { &Spin_Lv1_Env, true, false }, + { &Spin_Lv2_Prim, false, true }, + { &Spin_Lv2_Env, true, false } +}; +static CosmeticsColorSection Trails_section[] = { + { &Trails_col, false, false } +}; +static CosmeticsColorSection FileChoose_section[] = { + { &FileChoose_Background, false, false }, + { &FileChoose_BottomText, true, false } +}; +static CosmeticsColorSection A_Btn_section[] = { + { &A_Btn, false, false } +}; +static CosmeticsColorSection B_Btn_section[] = { + { &B_Btn, false, false } +}; +static CosmeticsColorSection C_Btn_Unified_section[] = { + { &C_Btn, false, false } +}; +static CosmeticsColorSection C_Btn_Separated_section[] = { + { &C_Btn_U, false, false }, + { &C_Btn_D, false, true }, + { &C_Btn_L, false, true }, + { &C_Btn_R, false, true } +}; +static CosmeticsColorSection Start_Btn_section[] = { + { &Start_btn, false, false } +}; +static CosmeticsColorSection DPad_section[] = { + { &DPad_Items, false, false } +}; +static CosmeticsColorSection Hearts_section[] = { + { &Hearts_NInner, false, false }, + { &Hearts_DDInner, true, false }, + { &Hearts_DDOutline, true, false } +}; +static CosmeticsColorSection Magic_Meter_section[] = { + { &Magic_Borders, false, false }, + { &Magic_InUse_Borders, true, false }, + { &Magic_Meter, false, true }, + { &Magic_InUse_Meter, true, false } +}; +static CosmeticsColorSection Minimap_section[] = { + { &Minimap_OW, false, false }, + { &Minimap_DG, false, true }, + { &Minimap_CP, false, true }, + { &Minimap_LE, false, true } +}; +static CosmeticsColorSection TitleCards_section[] = { + { &TitleCards_OW, false, false }, + { &TitleCards_DG, true, false } +}; +static CosmeticsColorSection Misc_section[] = { + { &Rupee_Icon, false, false }, + { &SmallKeys_Icon, false, true }, + { &VSOA_Icon, false, true }, + { &TitleScreen_fire_Prim, false, true }, + { &TitleScreen_fire_Env, false, true } +}; + +//Randomizer specific stuff (by randomizer I mean within cosmetics, these section are there just for the purpose of randomizing their colors) +static CosmeticsColorSection Everything_Section[] = { + { &TitleScreen_fire_Prim, false, true }, + { &TitleScreen_fire_Env, false, true }, + { &Navi_Idle_Inner, false, false }, + { &Navi_Idle_Outer, true, false }, + { &Navi_Npc_Inner, false, true }, + { &Navi_Npc_Outer, true, false }, + { &Navi_Enemy_Inner, false, true }, + { &Navi_Enemy_Outer, true, false }, + { &Navi_Prop_Inner, false, true }, + { &Navi_Prop_Outer, true, false }, + { &Keese1_prim, false, false }, + { &Keese2_prim, true, false }, + { &Keese1_env, false, true }, + { &Keese2_env, true, false }, + { &DogN1, false, false }, + { &DogN2, true, false }, + { &KokiriTunic, false, false }, + { &GoronTunic, true, false }, + { &ZoraTunic, true, false }, + { &Fire_Arrow_Prim, false, false }, + { &Fire_Arrow_Env, true, false }, + { &Ice_Arrow_Prim, false, true }, + { &Ice_Arrow_Env, true, false }, + { &Light_Arrow_Prim, false, true }, + { &Light_Arrow_Env, true, false }, + { &Din_Fire_Prim, false, false }, + { &Din_Fire_Env, true, false }, + { &Nayru_Diamond_Prim, false, true }, + { &Nayru_Diamond_Env, true, false }, + { &Nayru_Orb_Prim, false, true }, + { &Nayru_Orb_Env, true, false }, + { &Spin_Lv1_Prim, false, false }, + { &Spin_Lv1_Env, true, false }, + { &Spin_Lv2_Prim, false, true }, + { &Spin_Lv2_Env, true, false }, + { &Trails_col, false, false }, + { &FileChoose_Background, false, false }, + { &FileChoose_BottomText, true, false }, + { &A_Btn, false, false }, + { &B_Btn, false, false }, + { &C_Btn, false, false }, + { &C_Btn_U, false, false }, + { &C_Btn_D, false, true }, + { &C_Btn_L, false, true }, + { &C_Btn_R, false, true }, + { &Start_btn, false, false }, + { &DPad_Items, false, false }, + { &Hearts_NInner, false, false }, + { &Hearts_DDInner, true, false }, + { &Hearts_DDOutline, true, false }, + { &Magic_Borders, false, false }, + { &Magic_InUse_Borders, true, false }, + { &Magic_Meter, false, true }, + { &Magic_InUse_Meter, true, false }, + { &Minimap_OW, false, false }, + { &Minimap_DG, false, true }, + { &Minimap_CP, false, true }, + { &Minimap_LE, false, true }, + { &TitleCards_OW, false, false }, + { &TitleCards_DG, true, false }, + { &Rupee_Icon, false, false }, + { &SmallKeys_Icon, false, true }, + { &VSOA_Icon, false, true } +}; +static CosmeticsColorSection Buttons_section[]{ + { &DPad_Items, false, false }, + { &C_Btn_U, false, false }, + { &C_Btn_D, false, true }, + { &C_Btn_L, false, true }, + { &C_Btn_R, false, true }, + { &C_Btn, false, false }, + { &B_Btn, false, false }, + { &A_Btn, false, false }, + { &Start_btn, false, false } +}; +static CosmeticsColorSection Misc_Interface_section[]{ + { &Hearts_NInner, false, false }, + { &Hearts_DDInner, true, false }, + { &Hearts_DDOutline, true, false }, + { &Magic_Borders, false, false }, + { &Magic_InUse_Borders, true, false }, + { &Magic_Meter, false, true }, + { &Magic_InUse_Meter, true, false }, + { &Minimap_OW, false, false }, + { &Minimap_DG, false, true }, + { &Minimap_CP, false, true }, + { &Minimap_LE, false, true }, + { &TitleCards_OW, false, false }, + { &TitleCards_DG, true, false }, + { &Rupee_Icon, false, false }, + { &SmallKeys_Icon, false, true }, + { &VSOA_Icon, false, true }, + { &TitleScreen_fire_Prim, false, true }, + { &TitleScreen_fire_Env, false, true } +}; +static CosmeticsColorSection NPCs_section[]{ + { &Navi_Idle_Inner, false, false }, + { &Navi_Idle_Outer, true, false }, + { &Navi_Npc_Inner, false, true }, + { &Navi_Npc_Outer, true, false }, + { &Navi_Enemy_Inner, false, true }, + { &Navi_Enemy_Outer, true, false }, + { &Navi_Prop_Inner, false, true }, + { &Navi_Prop_Outer, true, false }, + { &Keese1_prim, false, false }, + { &Keese2_prim, true, false }, + { &Keese1_env, false, true }, + { &Keese2_env, true, false }, + { &DogN1, false, false }, + { &DogN2, true, false } +}; +static CosmeticsColorSection AllItemsSkills_section[]{ + { &KokiriTunic, false, false }, + { &GoronTunic, true, false }, + { &ZoraTunic, true, false }, + { &Fire_Arrow_Prim, false, false }, + { &Fire_Arrow_Env, true, false }, + { &Ice_Arrow_Prim, false, true }, + { &Ice_Arrow_Env, true, false }, + { &Light_Arrow_Prim, false, true }, + { &Light_Arrow_Env, true, false }, + { &Din_Fire_Prim, false, false }, + { &Din_Fire_Env, true, false }, + { &Nayru_Diamond_Prim, false, true }, + { &Nayru_Diamond_Env, true, false }, + { &Nayru_Orb_Prim, false, true }, + { &Nayru_Orb_Env, true, false }, + { &Spin_Lv1_Prim, false, false }, + { &Spin_Lv1_Env, true, false }, + { &Spin_Lv2_Prim, false, true }, + { &Spin_Lv2_Env, true, false }, + { &Trails_col, false, false } +}; void InitCosmeticsEditor();//Init the menu itself void LoadRainbowColor(); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index f419426a7..7b230a8ee 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1009,20 +1009,15 @@ void TitleCard_InitPlaceName(GlobalContext* globalCtx, TitleCardContext* titleCt } void TitleCard_Update(GlobalContext* globalCtx, TitleCardContext* titleCtx) { - s16* TitleCard_Colors[3] = {255,255,255}; - if (titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) {//Bosses cards. - TitleCard_Colors[0] = CVar_GetS32("gCCTC_B_U_PrimR", 255); - TitleCard_Colors[1] = CVar_GetS32("gCCTC_B_U_PrimG", 255); - TitleCard_Colors[2] = CVar_GetS32("gCCTC_B_U_PrimB", 255); - } else if (!titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) { - TitleCard_Colors[0] = CVar_GetS32("gCCTC_OW_U_PrimR", 255); - TitleCard_Colors[1] = CVar_GetS32("gCCTC_OW_U_PrimG", 255); - TitleCard_Colors[2] = CVar_GetS32("gCCTC_OW_U_PrimB", 255); - } else { - TitleCard_Colors[0] = 255; - TitleCard_Colors[1] = 255; - TitleCard_Colors[2] = 255; - } + const Color_RGB8 TitleCard_Colors_ori = {255,255,255}; + Color_RGB8 TitleCard_Colors = {255,255,255}; + if (titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) {//Bosses cards. + TitleCard_Colors = CVar_GetRGB("gCCTC_B_U_Prim", TitleCard_Colors_ori); + } else if (!titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) { + TitleCard_Colors = CVar_GetRGB("gCCTC_OW_U_Prim", TitleCard_Colors_ori); + } else { + TitleCard_Colors = TitleCard_Colors_ori; + } if (DECR(titleCtx->delayTimer) == 0) { if (DECR(titleCtx->durationTimer) == 0) { @@ -1032,9 +1027,9 @@ void TitleCard_Update(GlobalContext* globalCtx, TitleCardContext* titleCtx) { Math_StepToS(&titleCtx->intensityB, 0, 70); } else { Math_StepToS(&titleCtx->alpha, 255, 10); - Math_StepToS(&titleCtx->intensityR, TitleCard_Colors[0], 20); - Math_StepToS(&titleCtx->intensityG, TitleCard_Colors[1], 20); - Math_StepToS(&titleCtx->intensityB, TitleCard_Colors[2], 20); + Math_StepToS(&titleCtx->intensityR, TitleCard_Colors.r, 20); + Math_StepToS(&titleCtx->intensityG, TitleCard_Colors.g, 20); + Math_StepToS(&titleCtx->intensityB, TitleCard_Colors.b, 20); } } } diff --git a/soh/src/code/z_eff_blure.c b/soh/src/code/z_eff_blure.c index 47477f787..31efc7993 100644 --- a/soh/src/code/z_eff_blure.c +++ b/soh/src/code/z_eff_blure.c @@ -3,6 +3,8 @@ #include "soh/frame_interpolation.h" +const Color_RGB8 Trails_Color_ori = {255,255,255}; + void EffectBlure_AddVertex(EffectBlure* this, Vec3f* p1, Vec3f* p2) { EffectBlureElement* elem; s32 numElements; @@ -198,6 +200,7 @@ s32 EffectBlure_Update(void* thisx) { s16 GreenColor; s16 BlueColor; s16 TrailDuration; + Color_RGB8 Trails_col = CVar_GetRGB("gTrailCol", Trails_Color_ori); if (this == NULL) { return 0; @@ -208,16 +211,17 @@ s32 EffectBlure_Update(void* thisx) { } if (CVar_GetS32("gUseTrailsCol", 0) !=0) { - RedColor = CVar_GetS32("gTrailColR",255); - GreenColor = CVar_GetS32("gTrailColG",255); - BlueColor = CVar_GetS32("gTrailColB",255); - TrailDuration = 4.0f*CVar_GetS32("gTrailDurantion",1); + RedColor = Trails_col.r; + GreenColor = Trails_col.g; + BlueColor = Trails_col.b; + TrailDuration = 4.0f * CVar_GetS32("gTrailDurantion",1); } else { - RedColor = 255; - GreenColor = 255; - BlueColor = 255; + RedColor = Trails_Color_ori.r; + GreenColor = Trails_Color_ori.g; + BlueColor = Trails_Color_ori.b; TrailDuration=4.0f; } + this->p1StartColor.r = RedColor; this->p2StartColor.r = RedColor; this->p1EndColor.r = RedColor; diff --git a/soh/src/code/z_lifemeter.c b/soh/src/code/z_lifemeter.c index 3c402a58b..04e70159a 100644 --- a/soh/src/code/z_lifemeter.c +++ b/soh/src/code/z_lifemeter.c @@ -112,9 +112,12 @@ static s16 sHeartsDDEnvFactors[3][3] = { }; // Current colors for the double defense hearts -s16 HeartInner[3] = {HEARTS_PRIM_R,HEARTS_PRIM_G,HEARTS_PRIM_B}; -s16 HeartDDOutline[3] = {HEARTS_DD_PRIM_R,HEARTS_DD_PRIM_G,HEARTS_DD_PRIM_B}; -s16 HeartDDInner[3] = {HEARTS_DD_ENV_R,HEARTS_DD_ENV_G,HEARTS_DD_ENV_B}; +Color_RGB8 HeartInner_ori = {HEARTS_PRIM_R,HEARTS_PRIM_G,HEARTS_PRIM_B}; +Color_RGB8 HeartDDOutline_ori = {HEARTS_DD_PRIM_R,HEARTS_DD_PRIM_G,HEARTS_DD_PRIM_B}; +Color_RGB8 HeartDDInner_ori = {HEARTS_DD_ENV_R,HEARTS_DD_ENV_G,HEARTS_DD_ENV_B}; +Color_RGB8 HeartInner; +Color_RGB8 HeartDDOutline; +Color_RGB8 HeartDDInner; s16 sBeatingHeartsDDPrim[3]; s16 sBeatingHeartsDDEnv[3]; s16 sHeartsDDPrim[2][3]; @@ -123,19 +126,13 @@ s16 sHeartsDDEnv[2][3]; void HealthMeter_Init(GlobalContext* globalCtx) { InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; if (CVar_GetS32("gHudColors", 1) == 2) { - HeartInner[0] = CVar_GetS32("gCCHeartsPrimR", 90); - HeartInner[1] = CVar_GetS32("gCCHeartsPrimG", 90); - HeartInner[2] = CVar_GetS32("gCCHeartsPrimB", 90); - HeartDDOutline[0] = CVar_GetS32("gDDCCHeartsPrimR", 90); - HeartDDOutline[1] = CVar_GetS32("gDDCCHeartsPrimG", 90); - HeartDDOutline[2] = CVar_GetS32("gDDCCHeartsPrimB", 90); + HeartInner = CVar_GetRGB("gCCHeartsPrim", HeartInner_ori); + HeartDDInner = CVar_GetRGB("gCCDDHeartsPrim", HeartDDInner_ori); + HeartDDOutline = CVar_GetRGB("gDDCCHeartsPrim", HeartDDOutline_ori); } else { - HeartInner[0] = HEARTS_PRIM_R; - HeartInner[1] = HEARTS_PRIM_G; - HeartInner[2] = HEARTS_PRIM_B; - HeartDDOutline[0] = HEARTS_DD_PRIM_R; - HeartDDOutline[1] = HEARTS_DD_PRIM_G; - HeartDDOutline[2] = HEARTS_DD_PRIM_B; + HeartInner = HeartInner_ori; + HeartDDInner = HeartDDInner_ori; + HeartDDOutline = HeartDDOutline_ori; } interfaceCtx->unk_228 = 0x140; @@ -143,33 +140,33 @@ void HealthMeter_Init(GlobalContext* globalCtx) { interfaceCtx->unk_22A = interfaceCtx->unk_1FE = 0; interfaceCtx->unk_22C = interfaceCtx->unk_200 = 0; - interfaceCtx->heartsPrimR[0] = HeartInner[0]; - interfaceCtx->heartsPrimG[0] = HeartInner[1]; - interfaceCtx->heartsPrimB[0] = HeartInner[2]; + interfaceCtx->heartsPrimR[0] = HeartInner.r; + interfaceCtx->heartsPrimG[0] = HeartInner.g; + interfaceCtx->heartsPrimB[0] = HeartInner.b; interfaceCtx->heartsEnvR[0] = HEARTS_ENV_R; interfaceCtx->heartsEnvG[0] = HEARTS_ENV_G; interfaceCtx->heartsEnvB[0] = HEARTS_ENV_B; - interfaceCtx->heartsPrimR[1] = HeartInner[0]; - interfaceCtx->heartsPrimG[1] = HeartInner[1]; - interfaceCtx->heartsPrimB[1] = HeartInner[2]; + interfaceCtx->heartsPrimR[1] = HeartInner.r; + interfaceCtx->heartsPrimG[1] = HeartInner.g; + interfaceCtx->heartsPrimB[1] = HeartInner.b; interfaceCtx->heartsEnvR[1] = HEARTS_ENV_R; interfaceCtx->heartsEnvG[1] = HEARTS_ENV_G; interfaceCtx->heartsEnvB[1] = HEARTS_ENV_B; - sHeartsDDPrim[0][0] = sHeartsDDPrim[1][0] = HeartDDOutline[0]; - sHeartsDDPrim[0][1] = sHeartsDDPrim[1][1] = HeartDDOutline[1]; - sHeartsDDPrim[0][2] = sHeartsDDPrim[1][2] = HeartDDOutline[2]; + sHeartsDDPrim[0][0] = sHeartsDDPrim[1][0] = HeartDDOutline.r; + sHeartsDDPrim[0][1] = sHeartsDDPrim[1][1] = HeartDDOutline.b; + sHeartsDDPrim[0][2] = sHeartsDDPrim[1][2] = HeartDDOutline.b; // sHeartsDDPrim[2][0] = HeartInner[0]; // sHeartsDDPrim[2][1] = HeartInner[1]; // sHeartsDDPrim[2][2] = HeartInner[2]; - sHeartsDDEnv[0][0] = sHeartsDDEnv[1][0] = HeartDDInner[0]; - sHeartsDDEnv[0][1] = sHeartsDDEnv[1][1] = HeartDDInner[1]; - sHeartsDDEnv[0][2] = sHeartsDDEnv[1][2] = HeartDDInner[2]; + sHeartsDDEnv[0][0] = sHeartsDDEnv[1][0] = HeartDDInner.r; + sHeartsDDEnv[0][1] = sHeartsDDEnv[1][1] = HeartDDInner.g; + sHeartsDDEnv[0][2] = sHeartsDDEnv[1][2] = HeartDDInner.b; } void HealthMeter_Update(GlobalContext* globalCtx) { @@ -188,19 +185,13 @@ void HealthMeter_Update(GlobalContext* globalCtx) { Bottom_LM_Margin = CVar_GetS32("gHUDMargin_B", 0); if (CVar_GetS32("gHudColors", 1) == 2) { - HeartInner[0] = CVar_GetS32("gCCHeartsPrimR", sHeartsPrimColors[0][0]); - HeartInner[1] = CVar_GetS32("gCCHeartsPrimG", sHeartsPrimColors[0][1]); - HeartInner[2] = CVar_GetS32("gCCHeartsPrimB", sHeartsPrimColors[0][2]); - HeartDDOutline[0] = CVar_GetS32("gDDCCHeartsPrimR", sHeartsDDPrim[0][0]); - HeartDDOutline[1] = CVar_GetS32("gDDCCHeartsPrimG", sHeartsDDPrim[0][1]); - HeartDDOutline[2] = CVar_GetS32("gDDCCHeartsPrimB", sHeartsDDPrim[0][2]); + HeartInner = CVar_GetRGB("gCCHeartsPrim", HeartInner_ori); + HeartDDInner = CVar_GetRGB("gCCDDHeartsPrim", HeartDDInner_ori); + HeartDDOutline = CVar_GetRGB("gDDCCHeartsPrim", HeartDDOutline_ori); } else { - HeartInner[0] = HEARTS_PRIM_R; - HeartInner[1] = HEARTS_PRIM_G; - HeartInner[2] = HEARTS_PRIM_B; - HeartDDOutline[0] = HEARTS_DD_PRIM_R; - HeartDDOutline[1] = HEARTS_DD_PRIM_G; - HeartDDOutline[2] = HEARTS_DD_PRIM_B; + HeartInner = HeartInner_ori; + HeartDDInner = HeartDDInner_ori; + HeartDDOutline = HeartDDOutline_ori; } if (interfaceCtx->unk_200 != 0) { @@ -219,18 +210,18 @@ void HealthMeter_Update(GlobalContext* globalCtx) { ddFactor = factor; - interfaceCtx->heartsPrimR[0] = HeartInner[0]; - interfaceCtx->heartsPrimG[0] = HeartInner[1]; - interfaceCtx->heartsPrimB[0] = HeartInner[2]; + interfaceCtx->heartsPrimR[0] = HeartInner.r; + interfaceCtx->heartsPrimG[0] = HeartInner.g; + interfaceCtx->heartsPrimB[0] = HeartInner.b; interfaceCtx->heartsEnvR[0] = HEARTS_ENV_R; interfaceCtx->heartsEnvG[0] = HEARTS_ENV_G; interfaceCtx->heartsEnvB[0] = HEARTS_ENV_B; if (CVar_GetS32("gHudColors", 1) == 2) { - interfaceCtx->heartsPrimR[1] = HeartInner[0]; - interfaceCtx->heartsPrimG[1] = HeartInner[1]; - interfaceCtx->heartsPrimB[1] = HeartInner[2]; + interfaceCtx->heartsPrimR[1] = HeartInner.r; + interfaceCtx->heartsPrimG[1] = HeartInner.g; + interfaceCtx->heartsPrimB[1] = HeartInner.b; } else { interfaceCtx->heartsPrimR[1] = sHeartsPrimColors[type][0]; interfaceCtx->heartsPrimG[1] = sHeartsPrimColors[type][1]; @@ -245,9 +236,9 @@ void HealthMeter_Update(GlobalContext* globalCtx) { gFactor = sHeartsPrimFactors[0][1] * factor; bFactor = sHeartsPrimFactors[0][2] * factor; - interfaceCtx->beatingHeartPrim[0] = (u8)(rFactor + HeartInner[0]) & 0xFF; - interfaceCtx->beatingHeartPrim[1] = (u8)(gFactor + HeartInner[1]) & 0xFF; - interfaceCtx->beatingHeartPrim[2] = (u8)(bFactor + HeartInner[2]) & 0xFF; + interfaceCtx->beatingHeartPrim[0] = (u8)(rFactor + HeartInner.r) & 0xFF; + interfaceCtx->beatingHeartPrim[1] = (u8)(gFactor + HeartInner.g) & 0xFF; + interfaceCtx->beatingHeartPrim[2] = (u8)(bFactor + HeartInner.b) & 0xFF; rFactor = sHeartsEnvFactors[0][0] * factor; gFactor = sHeartsEnvFactors[0][1] * factor; @@ -259,50 +250,48 @@ void HealthMeter_Update(GlobalContext* globalCtx) { ddType = type; - sHeartsDDPrim[0][0] = HeartDDOutline[0]; - sHeartsDDPrim[0][1] = HeartDDOutline[1]; - sHeartsDDPrim[0][2] = HeartDDOutline[2]; + sHeartsDDPrim[0][0] = HeartDDOutline.r; + sHeartsDDPrim[0][1] = HeartDDOutline.g; + sHeartsDDPrim[0][2] = HeartDDOutline.b; - sHeartsDDEnv[0][0] = HeartDDInner[0]; - sHeartsDDEnv[0][1] = HeartDDInner[1]; - sHeartsDDEnv[0][2] = HeartDDInner[2]; + sHeartsDDEnv[0][0] = HeartDDInner.r; + sHeartsDDEnv[0][1] = HeartDDInner.g; + sHeartsDDEnv[0][2] = HeartDDInner.b; if (CVar_GetS32("gHudColors", 1) == 2) { - sHeartsDDPrim[2][0] = CVar_GetS32("gCCDDHeartsPrimR", 255); - sHeartsDDPrim[2][1] = CVar_GetS32("gCCDDHeartsPrimG", 70); - sHeartsDDPrim[2][2] = CVar_GetS32("gCCDDHeartsPrimB", 50); + sHeartsDDPrim[2][0] = HeartDDInner.r; + sHeartsDDPrim[2][1] = HeartDDInner.g; + sHeartsDDPrim[2][2] = HeartDDInner.b; - sHeartsDDPrim[1][0] = HeartDDOutline[0]; - sHeartsDDPrim[1][1] = HeartDDOutline[1]; - sHeartsDDPrim[1][2] = HeartDDOutline[2]; + sHeartsDDPrim[1][0] = HeartDDOutline.r; + sHeartsDDPrim[1][1] = HeartDDOutline.g; + sHeartsDDPrim[1][2] = HeartDDOutline.b; - sHeartsDDEnv[1][0] = CVar_GetS32("gCCDDHeartsPrimR", 255); - sHeartsDDEnv[1][1] = CVar_GetS32("gCCDDHeartsPrimG", 70); - sHeartsDDEnv[1][2] = CVar_GetS32("gCCDDHeartsPrimB", 50); + sHeartsDDEnv[1][0] = HeartDDInner.r; + sHeartsDDEnv[1][1] = HeartDDInner.g; + sHeartsDDEnv[1][2] = HeartDDInner.b; - HeartDDInner[0] = CVar_GetS32("gCCDDHeartsPrimR", 255); - HeartDDInner[1] = CVar_GetS32("gCCDDHeartsPrimG", 70); - HeartDDInner[2] = CVar_GetS32("gCCDDHeartsPrimB", 50); + HeartDDInner = CVar_GetRGB("gCCDDHeartsPrim", HeartDDInner_ori); - sHeartsDDEnv[0][0] = CVar_GetS32("gCCDDHeartsPrimR", 255); - sHeartsDDEnv[0][1] = CVar_GetS32("gCCDDHeartsPrimG", 70); - sHeartsDDEnv[0][2] = CVar_GetS32("gCCDDHeartsPrimB", 0); + sHeartsDDEnv[0][0] = HeartDDInner.r; + sHeartsDDEnv[0][1] = HeartDDInner.g; + sHeartsDDEnv[0][2] = HeartDDInner.b; rFactor = sHeartsDDPrimFactors[ddType][0] * ddFactor; gFactor = sHeartsDDPrimFactors[ddType][1] * ddFactor; bFactor = sHeartsDDPrimFactors[ddType][2] * ddFactor; - sBeatingHeartsDDPrim[0] = (u8)(rFactor + HeartDDOutline[0]) & 0xFF; - sBeatingHeartsDDPrim[1] = (u8)(gFactor + HeartDDOutline[1]) & 0xFF; - sBeatingHeartsDDPrim[2] = (u8)(bFactor + HeartDDOutline[2]) & 0xFF; + sBeatingHeartsDDPrim[0] = (u8)(rFactor + HeartDDOutline.r) & 0xFF; + sBeatingHeartsDDPrim[1] = (u8)(gFactor + HeartDDOutline.g) & 0xFF; + sBeatingHeartsDDPrim[2] = (u8)(bFactor + HeartDDOutline.b) & 0xFF; rFactor = sHeartsDDEnvFactors[ddType][0] * ddFactor; gFactor = sHeartsDDEnvFactors[ddType][1] * ddFactor; bFactor = sHeartsDDEnvFactors[ddType][2] * ddFactor; - sBeatingHeartsDDEnv[0] = (u8)(rFactor + HeartDDInner[0]) & 0xFF; - sBeatingHeartsDDEnv[1] = (u8)(gFactor + HeartDDInner[1]) & 0xFF; - sBeatingHeartsDDEnv[2] = (u8)(bFactor + HeartDDInner[2]) & 0xFF; + sBeatingHeartsDDEnv[0] = (u8)(rFactor + HeartDDInner.r) & 0xFF; + sBeatingHeartsDDEnv[1] = (u8)(gFactor + HeartDDInner.g) & 0xFF; + sBeatingHeartsDDEnv[2] = (u8)(bFactor + HeartDDInner.b) & 0xFF; } else { sHeartsDDPrim[0][0] = HEARTS_DD_PRIM_R; sHeartsDDPrim[0][1] = HEARTS_DD_PRIM_G; @@ -413,6 +402,12 @@ void HealthMeter_Draw(GlobalContext* globalCtx) { s32 curCombineModeSet = 0; u8* curBgImgLoaded = NULL; s32 ddHeartCountMinusOne = gSaveContext.inventory.defenseHearts - 1; + float HeartsScale = 0.7f; + if (CVar_GetS32("gHeartsCountPosType", 0) != 0) { + HeartsScale = CVar_GetFloat("gHeartsCountScale", 0.7f); + } + static u32 epoch = 0; + epoch++; OPEN_DISPS(gfxCtx); @@ -433,14 +428,14 @@ void HealthMeter_Draw(GlobalContext* globalCtx) { s16 PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins; s16 PosY_original = 0.0f+Y_Margins; if (CVar_GetS32("gHeartsCountPosType", 0) != 0) { - offsetY = CVar_GetS32("gHeartsPosY", 0)+Y_Margins; + offsetY = CVar_GetS32("gHeartsCountPosY", 0)+Y_Margins+(HeartsScale*15); if (CVar_GetS32("gHeartsCountPosType", 0) == 1) {//Anchor Left - offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); + offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f); } else if (CVar_GetS32("gHeartsCountPosType", 0) == 2) {//Anchor Right X_Margins = Right_LM_Margin; - offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); + offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f); } else if (CVar_GetS32("gHeartsCountPosType", 0) == 3) {//Anchor None - offsetX = CVar_GetS32("gHeartsPosX", 0); + offsetX = CVar_GetS32("gHeartsCountPosX", 0)+70.0f; } else if (CVar_GetS32("gHeartsCountPosType", 0) == 4) {//Hidden offsetX = -9999; } @@ -568,16 +563,27 @@ void HealthMeter_Draw(GlobalContext* globalCtx) { } } - temp3 = 26.0f + offsetY; - temp2 = 30.0f + offsetX; - temp4 = 1.0f; - temp4 /= 0.68f; + temp3 = offsetY; + temp2 = offsetX; + temp4 = 1.0f;//Heart texture size + temp4 /= 0.68f; //Hearts Scaled size temp4 *= 1 << 10; temp1 = 8.0f; temp1 *= 0.68f; - gSPWideTextureRectangle(OVERLAY_DISP++, (s32)((temp2 - temp1) * 4), (s32)((temp3 - temp1) * 4), + /*gSPWideTextureRectangle(OVERLAY_DISP++, (s32)((temp2 - temp1) * 4), (s32)((temp3 - temp1) * 4), (s32)((temp2 + temp1) * 4), (s32)((temp3 + temp1) * 4), G_TX_RENDERTILE, 0, 0, - (s32)temp4, (s32)temp4); + (s32)temp4, (s32)temp4);*/ + Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx)); + Matrix_SetTranslateScaleMtx2(matrix, + HeartsScale, //Scale X + HeartsScale, //Scale Y + HeartsScale, //Scale Z + -130+offsetX, //Pos X + (-94+offsetY) *-1, //Pos Y + 0.0f); //Pos Z + gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD); + gSPVertex(OVERLAY_DISP++, sp154, 4, 0); + gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); } else { if ((ddHeartCountMinusOne < 0) || (i > ddHeartCountMinusOne)) { if (curCombineModeSet != 2) { @@ -597,28 +603,33 @@ void HealthMeter_Draw(GlobalContext* globalCtx) { { Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx)); - Matrix_SetTranslateScaleMtx2(matrix, 1.0f - (0.32f * sp144), 1.0f - (0.32f * sp144), - 1.0f - (0.32f * sp144), -130.0f + offsetX, - 94.5f - offsetY, 0.0f); + Matrix_SetTranslateScaleMtx2(matrix, + HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), + HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), + HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), + -130+offsetX, //Pos X + (-94+offsetY) *-1, //Pos Y + 0.0f); gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD); gSPVertex(OVERLAY_DISP++, sp154, 4, 0); gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); } } - offsetX += 10.0f; + //offsetX += 10.0f; + offsetX += (HeartsScale*14.5f); if (i == 9) { PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins; - PosY_original = 10.0f+Y_Margins; + PosY_original = (HeartsScale*15)+Y_Margins; if (CVar_GetS32("gHeartsCountPosType", 0) != 0) { - offsetY = CVar_GetS32("gHeartsPosY", 0)+Y_Margins+10.0f; + offsetY = CVar_GetS32("gHeartsCountPosY", 0)+((HeartsScale*15)*2)+Y_Margins; if (CVar_GetS32("gHeartsCountPosType", 0) == 1) {//Anchor Left - offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); + offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f); } else if (CVar_GetS32("gHeartsCountPosType", 0) == 2) {//Anchor Right X_Margins = Right_LM_Margin; - offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); + offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f); } else if (CVar_GetS32("gHeartsCountPosType", 0) == 3) {//Anchor None - offsetX = CVar_GetS32("gHeartsPosX", 0); + offsetX = CVar_GetS32("gHeartsCountPosX", 0)+70.0f; } else if (CVar_GetS32("gHeartsCountPosType", 0) == 4) {//Hidden offsetX = -9999; } diff --git a/soh/src/code/z_map_exp.c b/soh/src/code/z_map_exp.c index c9b927730..0866b5332 100644 --- a/soh/src/code/z_map_exp.c +++ b/soh/src/code/z_map_exp.c @@ -601,6 +601,8 @@ void Minimap_DrawCompassIcons(GlobalContext* globalCtx) { s32 pad; Player* player = GET_PLAYER(globalCtx); s16 tempX, tempZ; + const Color_RGB8 LastEntrance_arrow = { 200, 0, 0 }; + const Color_RGB8 CurrentPosition_arrow = { 200, 255, 0 }; s16 X_Margins_Minimap; s16 Y_Margins_Minimap; if (CVar_GetS32("gMinimapUseMargins", 0) != 0) { @@ -658,9 +660,9 @@ void Minimap_DrawCompassIcons(GlobalContext* globalCtx) { G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetS32("gCCMinimapCPPrimR", 200), CVar_GetS32("gCCMinimapCPPrimG", 255), CVar_GetS32("gCCMinimapCPPrimB", 0), 255); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetRGB("gCCMinimapCPPrim", CurrentPosition_arrow).r, CVar_GetRGB("gCCMinimapCPPrim", CurrentPosition_arrow).g, CVar_GetRGB("gCCMinimapCPPrim", CurrentPosition_arrow).b, 255); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, 200, 255, 0, 255); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CurrentPosition_arrow.r, CurrentPosition_arrow.g, CurrentPosition_arrow.b, 255); } gSPDisplayList(OVERLAY_DISP++, gCompassArrowDL); @@ -699,9 +701,9 @@ void Minimap_DrawCompassIcons(GlobalContext* globalCtx) { G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetS32("gCCMinimapLEPrimR", 200), CVar_GetS32("gCCMinimapLEPrimG", 0), CVar_GetS32("gCCMinimapLEPrimB", 0), 255); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetRGB("gCCMinimapLEPrim", LastEntrance_arrow).r,CVar_GetRGB("gCCMinimapLEPrim", LastEntrance_arrow).g,CVar_GetRGB("gCCMinimapLEPrim", LastEntrance_arrow).b, 255); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, 200, 0, 0, 255); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, LastEntrance_arrow.r, LastEntrance_arrow.g, LastEntrance_arrow.b, 255); } gSPDisplayList(OVERLAY_DISP++, gCompassArrowDL); } @@ -713,6 +715,8 @@ void Minimap_Draw(GlobalContext* globalCtx) { s32 pad[2]; InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; s32 mapIndex = gSaveContext.mapIndex; + const Color_RGB8 Dungeon_minimap = {100, 255, 255}; + const Color_RGB8 Overworld_minimap = {R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1), R_MINIMAP_COLOR(2)}; OPEN_DISPS(globalCtx->state.gfxCtx); @@ -751,9 +755,9 @@ void Minimap_Draw(GlobalContext* globalCtx) { if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, mapIndex)) { if (CVar_GetS32("gHudColors", 1) == 2) { //Dungeon minimap - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCMinimapDGNPrimR", R_MINIMAP_COLOR(0)), CVar_GetS32("gCCMinimapDGNPrimG", R_MINIMAP_COLOR(1)), CVar_GetS32("gCCMinimapDGNPrimB", R_MINIMAP_COLOR(2)), interfaceCtx->minimapAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCMinimapDGNPrim", Dungeon_minimap).r,CVar_GetRGB("gCCMinimapDGNPrim", Dungeon_minimap).g,CVar_GetRGB("gCCMinimapDGNPrim", Dungeon_minimap).b, interfaceCtx->minimapAlpha); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 255, 255, interfaceCtx->minimapAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Dungeon_minimap.r, Dungeon_minimap.g, Dungeon_minimap.b, interfaceCtx->minimapAlpha); } gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->mapSegment); @@ -826,9 +830,9 @@ void Minimap_Draw(GlobalContext* globalCtx) { gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (CVar_GetS32("gHudColors", 1) == 2) {//Overworld minimap - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCMinimapPrimR", R_MINIMAP_COLOR(0)), CVar_GetS32("gCCMinimapPrimG", R_MINIMAP_COLOR(1)), CVar_GetS32("gCCMinimapPrimB", R_MINIMAP_COLOR(2)), interfaceCtx->minimapAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCMinimapPrim", Overworld_minimap).r,CVar_GetRGB("gCCMinimapPrim", Overworld_minimap).g,CVar_GetRGB("gCCMinimapPrim", Overworld_minimap).b, interfaceCtx->minimapAlpha); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1), R_MINIMAP_COLOR(2), interfaceCtx->minimapAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Overworld_minimap.r, Overworld_minimap.g, Overworld_minimap.b, interfaceCtx->minimapAlpha); } gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_IA, @@ -858,7 +862,7 @@ void Minimap_Draw(GlobalContext* globalCtx) { 0, 1 << 10, 1 << 10); if (CVar_GetS32("gHudColors", 1) != 2) {//This need to be added else it will color dungeon entrance icon too. (it re-init prim color to default color) - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1), R_MINIMAP_COLOR(2), interfaceCtx->minimapAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Overworld_minimap.r, Overworld_minimap.g, Overworld_minimap.b, interfaceCtx->minimapAlpha); } if (((globalCtx->sceneNum != SCENE_SPOT01) && (globalCtx->sceneNum != SCENE_SPOT04) && diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 28ec93b73..6d83555be 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -165,9 +165,8 @@ static u16 sCUpTimer = 0; s16 gSpoilingItems[] = { ITEM_ODD_MUSHROOM, ITEM_FROG, ITEM_EYEDROPS }; s16 gSpoilingItemReverts[] = { ITEM_COJIRO, ITEM_PRESCRIPTION, ITEM_PRESCRIPTION }; -static s16 sMagicBorderR = 255; -static s16 sMagicBorderG = 255; -static s16 sMagicBorderB = 255; +static Color_RGB8 sMagicBorder = {255,255,255}; +static Color_RGB8 sMagicBorder_ori = {255,255,255}; static s16 sExtraItemBases[] = { ITEM_STICK, ITEM_STICK, ITEM_NUT, ITEM_NUT, ITEM_BOMB, ITEM_BOMB, ITEM_BOMB, ITEM_BOMB, ITEM_BOW, @@ -2868,23 +2867,27 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) { { 255, 255, 150 }, { 255, 255, 50 }, }; + Color_RGB8 MagicBorder_0 = { 255, 255, 255 }; + Color_RGB8 MagicBorder_1 = { 150, 150, 150 }; + Color_RGB8 MagicBorder_2 = { 255, 255, 150 }; + Color_RGB8 MagicBorder_3 = { 255, 255, 50 }; if (CVar_GetS32("gHudColors", 1) == 2) { //This will make custom color based on users selected colors. - sMagicBorderColors[0][0] = CVar_GetS32("gCCMagicBorderPrimR", 255); - sMagicBorderColors[0][1] = CVar_GetS32("gCCMagicBorderPrimG", 255); - sMagicBorderColors[0][2] = CVar_GetS32("gCCMagicBorderPrimB", 255); + sMagicBorderColors[0][0] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_0).r; + sMagicBorderColors[0][1] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_0).g; + sMagicBorderColors[0][2] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_0).b; - sMagicBorderColors[1][0] = CVar_GetS32("gCCMagicBorderPrimR", 255)/2; - sMagicBorderColors[1][1] = CVar_GetS32("gCCMagicBorderPrimG", 255)/2; - sMagicBorderColors[1][2] = CVar_GetS32("gCCMagicBorderPrimB", 255)/2; + sMagicBorderColors[1][0] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_1).r/2; + sMagicBorderColors[1][1] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_1).g/2; + sMagicBorderColors[1][2] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_1).b/2; - sMagicBorderColors[2][0] = CVar_GetS32("gCCMagicBorderPrimR", 255)/3; - sMagicBorderColors[2][1] = CVar_GetS32("gCCMagicBorderPrimG", 255)/3; - sMagicBorderColors[2][2] = CVar_GetS32("gCCMagicBorderPrimB", 255)/3; + sMagicBorderColors[2][0] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_2).r/2.5; + sMagicBorderColors[2][1] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_2).g/2.5; + sMagicBorderColors[2][2] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_2).b/2.5; - sMagicBorderColors[3][0] = CVar_GetS32("gCCMagicBorderPrimR", 255)/2; - sMagicBorderColors[3][1] = CVar_GetS32("gCCMagicBorderPrimG", 255)/2; - sMagicBorderColors[3][2] = CVar_GetS32("gCCMagicBorderPrimB", 255)/2; + sMagicBorderColors[3][0] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_3).r/3; + sMagicBorderColors[3][1] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_3).g/3; + sMagicBorderColors[3][2] = CVar_GetRGB("gCCMagicBorderPrim", MagicBorder_3).b/3; } static s16 sMagicBorderIndexes[] = { 0, 1, 1, 0 }; @@ -2945,53 +2948,49 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) { gSaveContext.magic = 0; gSaveContext.unk_13F0 = 3; if (CVar_GetS32("gHudColors", 1) == 2) { - sMagicBorderR = CVar_GetS32("gCCMagicBorderNormPrimR", 255); - sMagicBorderG = CVar_GetS32("gCCMagicBorderNormPrimG", 255); - sMagicBorderB = CVar_GetS32("gCCMagicBorderNormPrimB", 255); + sMagicBorder = CVar_GetRGB("gCCMagicBorderNormPrim", sMagicBorder_ori); } else { - sMagicBorderR = sMagicBorderG = sMagicBorderB = 255; + sMagicBorder = sMagicBorder_ori; } } else if (gSaveContext.magic == gSaveContext.unk_13F8) { gSaveContext.unk_13F0 = 3; if (CVar_GetS32("gHudColors", 1) == 2) { - sMagicBorderR = CVar_GetS32("gCCMagicBorderNormPrimR", 255); - sMagicBorderG = CVar_GetS32("gCCMagicBorderNormPrimG", 255); - sMagicBorderB = CVar_GetS32("gCCMagicBorderNormPrimB", 255); + sMagicBorder = CVar_GetRGB("gCCMagicBorderNormPrim", sMagicBorder_ori); } else { - sMagicBorderR = sMagicBorderG = sMagicBorderB = 255; + sMagicBorder = sMagicBorder_ori; } } case 3: case 4: case 6: temp = sMagicBorderIndexes[sMagicBorderStep]; - borderChangeR = ABS(sMagicBorderR - sMagicBorderColors[temp][0]) / sMagicBorderRatio; - borderChangeG = ABS(sMagicBorderG - sMagicBorderColors[temp][1]) / sMagicBorderRatio; - borderChangeB = ABS(sMagicBorderB - sMagicBorderColors[temp][2]) / sMagicBorderRatio; + borderChangeR = ABS(sMagicBorder.r - sMagicBorderColors[temp][0]) / sMagicBorderRatio; + borderChangeG = ABS(sMagicBorder.g - sMagicBorderColors[temp][1]) / sMagicBorderRatio; + borderChangeB = ABS(sMagicBorder.b - sMagicBorderColors[temp][2]) / sMagicBorderRatio; - if (sMagicBorderR >= sMagicBorderColors[temp][0]) { - sMagicBorderR -= borderChangeR; + if (sMagicBorder.r >= sMagicBorderColors[temp][0]) { + sMagicBorder.r -= borderChangeR; } else { - sMagicBorderR += borderChangeR; + sMagicBorder.r += borderChangeR; } - if (sMagicBorderG >= sMagicBorderColors[temp][1]) { - sMagicBorderG -= borderChangeG; + if (sMagicBorder.g >= sMagicBorderColors[temp][1]) { + sMagicBorder.g -= borderChangeG; } else { - sMagicBorderG += borderChangeG; + sMagicBorder.g += borderChangeG; } - if (sMagicBorderB >= sMagicBorderColors[temp][2]) { - sMagicBorderB -= borderChangeB; + if (sMagicBorder.b >= sMagicBorderColors[temp][2]) { + sMagicBorder.b -= borderChangeB; } else { - sMagicBorderB += borderChangeB; + sMagicBorder.b += borderChangeB; } sMagicBorderRatio--; if (sMagicBorderRatio == 0) { - sMagicBorderR = sMagicBorderColors[temp][0]; - sMagicBorderG = sMagicBorderColors[temp][1]; - sMagicBorderB = sMagicBorderColors[temp][2]; + sMagicBorder.r = sMagicBorderColors[temp][0]; + sMagicBorder.g = sMagicBorderColors[temp][1]; + sMagicBorder.b = sMagicBorderColors[temp][2]; sMagicBorderRatio = YREG(40 + sMagicBorderStep); sMagicBorderStep++; if (sMagicBorderStep >= 4) { @@ -3002,11 +3001,9 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) { case 5: if (CVar_GetS32("gHudColors", 1) == 2) { - sMagicBorderR = CVar_GetS32("gCCMagicBorderNormPrimR", 255); - sMagicBorderG = CVar_GetS32("gCCMagicBorderNormPrimG", 255); - sMagicBorderB = CVar_GetS32("gCCMagicBorderNormPrimB", 255); + sMagicBorder = CVar_GetRGB("gCCMagicBorderNormPrim", sMagicBorder_ori); } else { - sMagicBorderR = sMagicBorderG = sMagicBorderB = 255; + sMagicBorder = sMagicBorder_ori; } gSaveContext.unk_13F0 = 0; break; @@ -3030,11 +3027,9 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) { &D_801333E8); gSaveContext.unk_13F0 = 0; if (CVar_GetS32("gHudColors", 1) == 2) { - sMagicBorderR = CVar_GetS32("gCCMagicBorderNormPrimR", 255); - sMagicBorderG = CVar_GetS32("gCCMagicBorderNormPrimG", 255); - sMagicBorderB = CVar_GetS32("gCCMagicBorderNormPrimB", 255); + sMagicBorder = CVar_GetRGB("gCCMagicBorderNormPrim", sMagicBorder_ori); } else { - sMagicBorderR = sMagicBorderG = sMagicBorderB = 255; + sMagicBorder = sMagicBorder_ori; } break; } @@ -3047,33 +3042,33 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) { } temp = sMagicBorderIndexes[sMagicBorderStep]; - borderChangeR = ABS(sMagicBorderR - sMagicBorderColors[temp][0]) / sMagicBorderRatio; - borderChangeG = ABS(sMagicBorderG - sMagicBorderColors[temp][1]) / sMagicBorderRatio; - borderChangeB = ABS(sMagicBorderB - sMagicBorderColors[temp][2]) / sMagicBorderRatio; + borderChangeR = ABS(sMagicBorder.r - sMagicBorderColors[temp][0]) / sMagicBorderRatio; + borderChangeG = ABS(sMagicBorder.g - sMagicBorderColors[temp][1]) / sMagicBorderRatio; + borderChangeB = ABS(sMagicBorder.b - sMagicBorderColors[temp][2]) / sMagicBorderRatio; - if (sMagicBorderR >= sMagicBorderColors[temp][0]) { - sMagicBorderR -= borderChangeR; + if (sMagicBorder.r >= sMagicBorderColors[temp][0]) { + sMagicBorder.r -= borderChangeR; } else { - sMagicBorderR += borderChangeR; + sMagicBorder.r += borderChangeR; } - if (sMagicBorderG >= sMagicBorderColors[temp][1]) { - sMagicBorderG -= borderChangeG; + if (sMagicBorder.g >= sMagicBorderColors[temp][1]) { + sMagicBorder.g -= borderChangeG; } else { - sMagicBorderG += borderChangeG; + sMagicBorder.g += borderChangeG; } - if (sMagicBorderB >= sMagicBorderColors[temp][2]) { - sMagicBorderB -= borderChangeB; + if (sMagicBorder.b >= sMagicBorderColors[temp][2]) { + sMagicBorder.b -= borderChangeB; } else { - sMagicBorderB += borderChangeB; + sMagicBorder.b += borderChangeB; } sMagicBorderRatio--; if (sMagicBorderRatio == 0) { - sMagicBorderR = sMagicBorderColors[temp][0]; - sMagicBorderG = sMagicBorderColors[temp][1]; - sMagicBorderB = sMagicBorderColors[temp][2]; + sMagicBorder.r = sMagicBorderColors[temp][0]; + sMagicBorder.g = sMagicBorderColors[temp][1]; + sMagicBorder.b = sMagicBorderColors[temp][2]; sMagicBorderRatio = YREG(40 + sMagicBorderStep); sMagicBorderStep++; if (sMagicBorderStep >= 4) { @@ -3101,6 +3096,8 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) { void Interface_DrawMagicBar(GlobalContext* globalCtx) { InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; s16 magicBarY; + Color_RGB8 magicbar_yellow = {250,250,0}; //Magic bar being used + Color_RGB8 magicbar_green = {R_MAGIC_FILL_COLOR(0),R_MAGIC_FILL_COLOR(1),R_MAGIC_FILL_COLOR(2)}; //Magic bar fill OPEN_DISPS(globalCtx->state.gfxCtx); @@ -3169,7 +3166,7 @@ void Interface_DrawMagicBar(GlobalContext* globalCtx) { } else { gDPSetEnvColor(OVERLAY_DISP++, 100, 50, 50, 255); } - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sMagicBorderR, sMagicBorderG, sMagicBorderB, interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sMagicBorder.r, sMagicBorder.g, sMagicBorder.b, interfaceCtx->magicAlpha); OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gMagicBarEndTex, 8, 16, PosX_Start, magicBarY, 8, 16, 1 << 10, 1 << 10); @@ -3190,9 +3187,9 @@ void Interface_DrawMagicBar(GlobalContext* globalCtx) { if (gSaveContext.unk_13F0 == 4) { // Yellow part of the bar indicating the amount of magic to be subtracted if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCMagicUsePrimR", 250), CVar_GetS32("gCCMagicUsePrimG", 250), CVar_GetS32("gCCMagicUsePrimB", 0), interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCMagicUsePrim", magicbar_yellow).r, CVar_GetRGB("gCCMagicUsePrim", magicbar_yellow).g, CVar_GetRGB("gCCMagicUsePrim", magicbar_yellow).b, interfaceCtx->magicAlpha); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 250, 250, 0, interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_yellow.r, magicbar_yellow.g, magicbar_yellow.b, interfaceCtx->magicAlpha); } gDPLoadMultiBlock_4b(OVERLAY_DISP++, gMagicBarFillTex, 0, G_TX_RENDERTILE, G_IM_FMT_I, 16, 16, 0, @@ -3206,9 +3203,9 @@ void Interface_DrawMagicBar(GlobalContext* globalCtx) { // Fill the rest of the bar with the normal magic color gDPPipeSync(OVERLAY_DISP++); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCMagicPrimR", 0), CVar_GetS32("gCCMagicPrimG", 200), CVar_GetS32("gCCMagicPrimB", 0), interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCMagicPrim", magicbar_green).r, CVar_GetRGB("gCCMagicPrim", magicbar_green).g, CVar_GetRGB("gCCMagicPrim", magicbar_green).b, interfaceCtx->magicAlpha); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_MAGIC_FILL_COLOR(0), R_MAGIC_FILL_COLOR(1), R_MAGIC_FILL_COLOR(2), interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_green.r, magicbar_green.g, magicbar_green.b, interfaceCtx->magicAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, rMagicFillX << 2, (magicBarY + 3) << 2, @@ -3217,9 +3214,9 @@ void Interface_DrawMagicBar(GlobalContext* globalCtx) { } else { // Fill the whole bar with the normal magic color if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCMagicPrimR", 0), CVar_GetS32("gCCMagicPrimG", 200), CVar_GetS32("gCCMagicPrimB", 0), interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCMagicPrim", magicbar_green).r, CVar_GetRGB("gCCMagicPrim", magicbar_green).g, CVar_GetRGB("gCCMagicPrim", magicbar_green).b, interfaceCtx->magicAlpha); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_MAGIC_FILL_COLOR(0), R_MAGIC_FILL_COLOR(1), R_MAGIC_FILL_COLOR(2), interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_green.r, magicbar_green.g, magicbar_green.b, interfaceCtx->magicAlpha); } gDPLoadMultiBlock_4b(OVERLAY_DISP++, gMagicBarFillTex, 0, G_TX_RENDERTILE, G_IM_FMT_I, 16, 16, 0, @@ -3293,10 +3290,28 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { s16 dxdy; s16 width; s16 height; + Color_RGB8 A_button_ori = {R_A_BTN_COLOR(0), R_A_BTN_COLOR(1), R_A_BTN_COLOR(2)}; + Color_RGB8 A_button = CVar_GetRGB("gCCABtnPrim", A_button_ori); + Color_RGB8 B_button_ori = {R_B_BTN_COLOR(0), R_B_BTN_COLOR(1), R_B_BTN_COLOR(2)}; + Color_RGB8 B_button = CVar_GetRGB("gCCBBtnPrim", B_button_ori); + Color_RGB8 Start_button_ori = {120, 120, 120}; + Color_RGB8 Start_button = CVar_GetRGB("gCCStartBtnPrim", Start_button_ori); + Color_RGB8 C_button_ori = {R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2)}; + Color_RGB8 C_button_uni = CVar_GetRGB("gCCCBtnPrim", C_button_ori); + Color_RGB8 C_button_U = CVar_GetRGB("gCCCUBtnPrim", C_button_ori); + Color_RGB8 C_button_D = CVar_GetRGB("gCCCDBtnPrim", C_button_ori); + Color_RGB8 C_button_L = CVar_GetRGB("gCCCLBtnPrim", C_button_ori); + Color_RGB8 C_button_R = CVar_GetRGB("gCCCRBtnPrim", C_button_ori); //B Button s16 X_Margins_BtnB; s16 Y_Margins_BtnB; + s16 BBtn_Size = 32; + int BBtnScaled = BBtn_Size * 0.95f; + if (CVar_GetS32("gBBtnPosType", 0) != 0) { + BBtnScaled = BBtn_Size * CVar_GetFloat("gBBtnScale", 0.95f); + } + int BBtn_factor = (1 << 10) * BBtn_Size / BBtnScaled; if (CVar_GetS32("gBBtnUseMargins", 0) != 0) { if (CVar_GetS32("gBBtnPosType", 0) == 0) {X_Margins_BtnB = Right_HUD_Margin;}; Y_Margins_BtnB = (Top_HUD_Margin*-1); @@ -3339,49 +3354,40 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { } s16 StartBtn_Icon_H = 32; s16 StartBtn_Icon_W = 32; - int StartBTN_H_Scaled = StartBtn_Icon_H * 0.75f; - int StartBTN_W_Scaled = StartBtn_Icon_W * 0.75f; + float Start_BTN_Scale = 0.75f; + if (CVar_GetS32("gStartBtnPosType", 0) != 0) { + Start_BTN_Scale = CVar_GetFloat("gStartBtnScale", 0.75f); + } + int StartBTN_H_Scaled = StartBtn_Icon_H * Start_BTN_Scale; + int StartBTN_W_Scaled = StartBtn_Icon_W * Start_BTN_Scale; int StartBTN_W_factor = (1 << 10) * StartBtn_Icon_W / StartBTN_W_Scaled; int StartBTN_H_factor = (1 << 10) * StartBtn_Icon_H / StartBTN_H_Scaled; - const s16 rStartLabelX_ori = OTRGetRectDimensionFromRightEdge(R_START_LABEL_X(gSaveContext.language)+X_Margins_StartBtn); - const s16 rStartLabelY_ori = R_START_LABEL_Y(gSaveContext.language)+Y_Margins_StartBtn; const s16 PosX_StartBtn_ori = OTRGetRectDimensionFromRightEdge(startButtonLeftPos[gSaveContext.language]+X_Margins_StartBtn); const s16 PosY_StartBtn_ori = 16+Y_Margins_StartBtn; s16 StartBTN_Label_W = DO_ACTION_TEX_WIDTH(); s16 StartBTN_Label_H = DO_ACTION_TEX_HEIGHT(); - int StartBTN_Label_H_Scaled = StartBTN_Label_H * 1.0f; - int StartBTN_Label_W_Scaled = StartBTN_Label_W * 1.0f; - int StartBTN_Label_W_factor = (1 << 10) * StartBTN_Label_W / StartBTN_Label_W_Scaled; - int StartBTN_Label_H_factor = (1 << 10) * StartBTN_Label_H / StartBTN_Label_H_Scaled; - const s16 StartBtn_Label_W_ori = StartBTN_Label_W / (R_START_LABEL_DD(gSaveContext.language) / 100.0f); - const s16 StartBtn_Label_H_ori = StartBTN_Label_H / (R_START_LABEL_DD(gSaveContext.language) / 100.0f); s16 PosX_StartBtn; s16 PosY_StartBtn; - s16 rStartLabelX; - s16 rStartLabelY; if (CVar_GetS32("gStartBtnPosType", 0) != 0) { - PosY_StartBtn = CVar_GetS32("gStartBtnPosY", 0)+Y_Margins_StartBtn; - rStartLabelY = CVar_GetS32("gStartBtnPosY", 0)+Y_Margins_StartBtn+3; + PosY_StartBtn = CVar_GetS32("gStartBtnPosY", 0)-(Start_BTN_Scale*13)+Y_Margins_StartBtn; if (CVar_GetS32("gStartBtnPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gStartBtnUseMargins", 0) != 0) {X_Margins_StartBtn = Left_HUD_Margin;}; - PosX_StartBtn = OTRGetDimensionFromLeftEdge(CVar_GetS32("gStartBtnPosX", 0)+X_Margins_StartBtn); - rStartLabelX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gStartBtnPosX", 0)+X_Margins_StartBtn-12); + PosX_StartBtn = OTRGetDimensionFromLeftEdge(CVar_GetS32("gStartBtnPosX", 0)-(Start_BTN_Scale*13)+X_Margins_StartBtn); } else if (CVar_GetS32("gStartBtnPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gStartBtnUseMargins", 0) != 0) {X_Margins_StartBtn = Right_HUD_Margin;}; - PosX_StartBtn = OTRGetDimensionFromRightEdge(CVar_GetS32("gStartBtnPosX", 0)+X_Margins_StartBtn); - rStartLabelX = OTRGetDimensionFromRightEdge(CVar_GetS32("gStartBtnPosX", 0)+X_Margins_StartBtn-12); + PosX_StartBtn = OTRGetDimensionFromRightEdge(CVar_GetS32("gStartBtnPosX", 0)-(Start_BTN_Scale*13)+X_Margins_StartBtn); } else if (CVar_GetS32("gStartBtnPosType", 0) == 3) {//Anchor None PosX_StartBtn = CVar_GetS32("gStartBtnPosX", 0); - rStartLabelX = CVar_GetS32("gStartBtnPosX", 0)-12; } else if (CVar_GetS32("gStartBtnPosType", 0) == 4) {//Hidden PosX_StartBtn = -9999; - rStartLabelX = -9999; } } else { + StartBTN_H_Scaled = StartBtn_Icon_H * 0.75f; + StartBTN_W_Scaled = StartBtn_Icon_W * 0.75f; + StartBTN_W_factor = (1 << 10) * StartBtn_Icon_W / StartBTN_W_Scaled; + StartBTN_H_factor = (1 << 10) * StartBtn_Icon_H / StartBTN_H_Scaled; PosY_StartBtn = PosY_StartBtn_ori; PosX_StartBtn = PosX_StartBtn_ori; - rStartLabelY = rStartLabelY_ori; - rStartLabelX = rStartLabelX_ori; } //C Buttons position s16 X_Margins_CL; @@ -3431,6 +3437,13 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { s16 C_Up_BTN_Pos[2]; s16 C_Down_BTN_Pos[2]; //C button Left + s16 C_Left_BTN_Size = 32; + float CLeftScale = CVar_GetFloat("gCBtnLScale", 0.87f); + int CLeftScaled = C_Left_BTN_Size * 0.87f; + if (CVar_GetS32("gCBtnLPosType", 0) != 0) { + CLeftScaled = C_Left_BTN_Size * CLeftScale; + } + int CLeft_factor = (1 << 10) * C_Left_BTN_Size / CLeftScaled; if (CVar_GetS32("gCBtnLPosType", 0) != 0) { C_Left_BTN_Pos[1] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL; if (CVar_GetS32("gCBtnLPosType", 0) == 1) {//Anchor Left @@ -3449,6 +3462,13 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { C_Left_BTN_Pos[0] = OTRGetRectDimensionFromRightEdge(C_Left_BTN_Pos_ori[0]); } //C button Right + s16 C_Right_BTN_Size = 32; + float CRightScale = CVar_GetFloat("gCBtnRScale", 0.87f); + int CRightScaled = C_Right_BTN_Size * 0.87f; + if (CVar_GetS32("gCBtnRPosType", 0) != 0) { + CRightScaled = C_Right_BTN_Size * CRightScale; + } + int CRight_factor = (1 << 10) * C_Right_BTN_Size / CRightScaled; if (CVar_GetS32("gCBtnRPosType", 0) != 0) { C_Right_BTN_Pos[1] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR; if (CVar_GetS32("gCBtnRPosType", 0) == 1) {//Anchor Left @@ -3467,16 +3487,23 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { C_Right_BTN_Pos[0] = OTRGetRectDimensionFromRightEdge(C_Right_BTN_Pos_ori[0]); } //C Button Up + s16 C_Up_BTN_Size = 32; + int CUpScaled = C_Up_BTN_Size * 0.5f; + float CUpScale = CVar_GetFloat("gCBtnUScale", 0.5f); if (CVar_GetS32("gCBtnUPosType", 0) != 0) { - C_Up_BTN_Pos[1] = CVar_GetS32("gCBtnUPosY", 0)+Y_Margins_CU; + CUpScaled = C_Up_BTN_Size * CUpScale; + } + int CUp_factor = (1 << 10) * C_Up_BTN_Size / CUpScaled; + if (CVar_GetS32("gCBtnUPosType", 0) != 0) { + C_Up_BTN_Pos[1] = CVar_GetS32("gCBtnUPosY", 0)-(CUpScale*13)+Y_Margins_CU; if (CVar_GetS32("gCBtnUPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnUUseMargins", 0) != 0) {X_Margins_CU = Left_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnUPosX", 0)+X_Margins_CU); + C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13)+X_Margins_CU); } else if (CVar_GetS32("gCBtnUPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnUUseMargins", 0) != 0) {X_Margins_CU = Right_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnUPosX", 0)+X_Margins_CU); + C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13)+X_Margins_CU); } else if (CVar_GetS32("gCBtnUPosType", 0) == 3) {//Anchor None - C_Up_BTN_Pos[0] = CVar_GetS32("gCBtnUPosX", 0); + C_Up_BTN_Pos[0] = CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13); } else if (CVar_GetS32("gCBtnUPosType", 0) == 4) {//Hidden C_Up_BTN_Pos[0] = -9999; } @@ -3485,16 +3512,24 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { C_Up_BTN_Pos[0] = OTRGetRectDimensionFromRightEdge(C_Up_BTN_Pos_ori[0]); } //C Button down + s16 C_Down_BTN_Size = 32; + float CDownScale = CVar_GetFloat("gCBtnDScale", 0.87f); + if (CVar_GetS32("gCBtnDPosType", 0) == 0) { + CDownScale = 0.87f; + } + int CDownScaled = C_Down_BTN_Size * CDownScale; + int CDown_factor = (1 << 10) * C_Down_BTN_Size / CDownScaled; + int PositionAdjustment = CDownScaled/2; if (CVar_GetS32("gCBtnDPosType", 0) != 0) { - C_Down_BTN_Pos[1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; + C_Down_BTN_Pos[1] = CVar_GetS32("gCBtnDPosY", 0)-PositionAdjustment+Y_Margins_CD; if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + C_Down_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None - C_Down_BTN_Pos[0] = CVar_GetS32("gCBtnDPosX", 0); + C_Down_BTN_Pos[0] = CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment; } else if (CVar_GetS32("gCBtnDPosType", 0) == 4) {//Hidden C_Down_BTN_Pos[0] = -9999; } @@ -3512,59 +3547,59 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { if (CVar_GetS32("gHudColors", 1) == 0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 150, 0, interfaceCtx->bAlpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_B_BTN_COLOR(0), R_B_BTN_COLOR(1), R_B_BTN_COLOR(2), interfaceCtx->bAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, B_button_ori.r,B_button_ori.g,B_button_ori.b, interfaceCtx->bAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCBBtnPrimR", R_B_BTN_COLOR(0)), CVar_GetS32("gCCBBtnPrimG", R_B_BTN_COLOR(1)), CVar_GetS32("gCCBBtnPrimB", R_B_BTN_COLOR(2)), interfaceCtx->bAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, B_button.r,B_button.g,B_button.b, interfaceCtx->bAlpha); } gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); - OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gButtonBackgroundTex, 32, 32, PosX_BtnB, PosY_BtnB, R_ITEM_BTN_WIDTH(0), R_ITEM_BTN_WIDTH(0), R_ITEM_BTN_DD(0) << 1, R_ITEM_BTN_DD(0) << 1); + OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gButtonBackgroundTex, BBtn_Size, BBtn_Size, PosX_BtnB, PosY_BtnB, BBtnScaled, BBtnScaled, BBtn_factor, BBtn_factor); // C-Left Button Color & Texture gDPPipeSync(OVERLAY_DISP++); if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), interfaceCtx->cLeftAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cLeftAlpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), interfaceCtx->cLeftAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cLeftAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCBtnPrimB", R_C_BTN_COLOR(2)), interfaceCtx->cLeftAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, interfaceCtx->cLeftAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCLBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCLBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCLBtnPrimB", R_C_BTN_COLOR(2)), interfaceCtx->cLeftAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, interfaceCtx->cLeftAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Left_BTN_Pos[0] << 2, C_Left_BTN_Pos[1] << 2, - (C_Left_BTN_Pos[0] + R_ITEM_BTN_WIDTH(1)) << 2, - (C_Left_BTN_Pos[1] + R_ITEM_BTN_WIDTH(1)) << 2, - G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(1) << 1, R_ITEM_BTN_DD(1) << 1); + (C_Left_BTN_Pos[0] + CLeftScaled) << 2, + (C_Left_BTN_Pos[1] + CLeftScaled) << 2, + G_TX_RENDERTILE, 0, 0, CLeft_factor, CLeft_factor); // C-Down Button Color & Texture if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), interfaceCtx->cDownAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cDownAlpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), interfaceCtx->cDownAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cDownAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCBtnPrimB", R_C_BTN_COLOR(2)), interfaceCtx->cDownAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, interfaceCtx->cDownAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCDBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCDBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCDBtnPrimB", R_C_BTN_COLOR(2)), interfaceCtx->cDownAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, interfaceCtx->cDownAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Down_BTN_Pos[0] << 2, C_Down_BTN_Pos[1] << 2, - (C_Down_BTN_Pos[0] + R_ITEM_BTN_WIDTH(2)) << 2, - (C_Down_BTN_Pos[1] + R_ITEM_BTN_WIDTH(2)) << 2, - G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(2) << 1, R_ITEM_BTN_DD(2) << 1); + (C_Down_BTN_Pos[0] + CDownScaled) << 2, + (C_Down_BTN_Pos[1] + CDownScaled) << 2, + G_TX_RENDERTILE, 0, 0, CDown_factor, CDown_factor); // C-Right Button Color & Texture if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), interfaceCtx->cRightAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cRightAlpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), interfaceCtx->cRightAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cRightAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCBtnPrimB", R_C_BTN_COLOR(2)), interfaceCtx->cRightAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, interfaceCtx->cRightAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCRBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCRBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCRBtnPrimB", R_C_BTN_COLOR(2)), interfaceCtx->cRightAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, interfaceCtx->cRightAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Right_BTN_Pos[0] << 2, C_Right_BTN_Pos[1] << 2, - (C_Right_BTN_Pos[0] + R_ITEM_BTN_WIDTH(3)) << 2, - (C_Right_BTN_Pos[1] + R_ITEM_BTN_WIDTH(3)) << 2, - G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(3) << 1, R_ITEM_BTN_DD(3) << 1); + (C_Right_BTN_Pos[0] + CRightScaled) << 2, + (C_Right_BTN_Pos[1] + CRightScaled) << 2, + G_TX_RENDERTILE, 0, 0, CRight_factor, CRight_factor); if ((pauseCtx->state < 8) || (pauseCtx->state >= 18)) { if ((globalCtx->pauseCtx.state != 0) || (globalCtx->pauseCtx.debugState != 0)) { @@ -3574,9 +3609,9 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { if (CVar_GetS32("gHudColors", 1) == 0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 0, 0, interfaceCtx->startAlpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 120, 120, interfaceCtx->startAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Start_button_ori.r, Start_button_ori.g, Start_button_ori.b, interfaceCtx->startAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCStartBtnPrimR", 120), CVar_GetS32("gCCStartBtnPrimG", 120), CVar_GetS32("gCCStartBtnPrimB", 120), interfaceCtx->startAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Start_button.r, Start_button.g, Start_button.b, interfaceCtx->startAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, PosX_StartBtn << 2, PosY_StartBtn << 2, (PosX_StartBtn + StartBTN_W_Scaled) << 2, (PosY_StartBtn + StartBTN_H_Scaled) << 2, @@ -3611,11 +3646,19 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_HEIGHT(), 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - //const s16 rStartLabelX = OTRGetRectDimensionFromRightEdge(R_START_LABEL_X(gSaveContext.language)+Right_HUD_Margin); - gSPWideTextureRectangle( - OVERLAY_DISP++, rStartLabelX << 2, rStartLabelY << 2, - (rStartLabelX + StartBTN_Label_W) << 2, - (rStartLabelY + StartBTN_Label_H) << 2, G_TX_RENDERTILE, 0, 0, StartBTN_Label_W_factor, StartBTN_Label_H_factor); + gDPPipeSync(OVERLAY_DISP++); + gSPSetGeometryMode(OVERLAY_DISP++, G_CULL_BACK); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->startAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); + Matrix_Translate(PosX_StartBtn-160+((Start_BTN_Scale+Start_BTN_Scale/3)*11.5f), (PosY_StartBtn-120+((Start_BTN_Scale+Start_BTN_Scale/3)*11.5f)) * -1, 1.0f, MTXMODE_NEW); + Matrix_Scale(Start_BTN_Scale+(Start_BTN_Scale/3), Start_BTN_Scale+(Start_BTN_Scale/3), Start_BTN_Scale+(Start_BTN_Scale/3), MTXMODE_APPLY); + gSPMatrix(OVERLAY_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), + G_MTX_MODELVIEW | G_MTX_LOAD); + gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[4], 4, 0); + Interface_DrawActionLabel(globalCtx->state.gfxCtx, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2); + gDPPipeSync(OVERLAY_DISP++); } } @@ -3635,13 +3678,13 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { } if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), temp); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, temp); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), temp); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, temp); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCBtnPrimB", R_C_BTN_COLOR(2)), temp); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, temp); } else if (CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated",0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCUBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCUBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCUBtnPrimB", R_C_BTN_COLOR(2)), temp); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_U.r, C_button_U.g, C_button_U.b, temp); } gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gSPWideTextureRectangle(OVERLAY_DISP++, C_Up_BTN_Pos[0] << 2, C_Up_BTN_Pos[1] << 2, (C_Up_BTN_Pos[0] + 16) << 2, @@ -3700,6 +3743,11 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { X_Margins_CD = 0; Y_Margins_CD = 0; } + const s16 ItemIconWidthFactor[3][2] = { + { CLeftScaled, CLeft_factor }, + { CDownScaled, CDown_factor }, + { CRightScaled, CRight_factor }, + }; const s16 ItemIconPos_ori[3][2] = { { R_ITEM_ICON_X(1)+X_Margins_CL, R_ITEM_ICON_Y(1)+Y_Margins_CL }, { R_ITEM_ICON_X(2)+X_Margins_CD, R_ITEM_ICON_Y(2)+Y_Margins_CD }, @@ -3762,40 +3810,34 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { } if (temp == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), - interfaceCtx->cLeftAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cLeftAlpha); } else if (temp == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), - interfaceCtx->cDownAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cDownAlpha); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), - interfaceCtx->cRightAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, interfaceCtx->cRightAlpha); } if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCBtnPrimB", R_C_BTN_COLOR(2)), interfaceCtx->cRightAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, interfaceCtx->cRightAlpha); } else if (temp == 1 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCLBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCLBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCLBtnPrimB", R_C_BTN_COLOR(2)), - interfaceCtx->cLeftAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, interfaceCtx->cLeftAlpha); } else if (temp == 2 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCDBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCDBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCDBtnPrimB", R_C_BTN_COLOR(2)), - interfaceCtx->cDownAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, interfaceCtx->cDownAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCCRBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCRBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCRBtnPrimB", R_C_BTN_COLOR(2)), - interfaceCtx->cRightAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, interfaceCtx->cRightAlpha); } OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, ((u8*)gButtonBackgroundTex), 32, 32, - ItemIconPos[temp-1][0], ItemIconPos[temp-1][1], R_ITEM_BTN_WIDTH(temp), - R_ITEM_BTN_WIDTH(temp), R_ITEM_BTN_DD(temp) << 1, R_ITEM_BTN_DD(temp) << 1); + ItemIconPos[temp-1][0], ItemIconPos[temp-1][1], ItemIconWidthFactor[temp-1][0], + ItemIconWidthFactor[temp-1][0], ItemIconWidthFactor[temp-1][1], ItemIconWidthFactor[temp-1][1]); const char* cButtonIcons[] = { gButtonBackgroundTex, gEquippedItemOutlineTex, gEmptyCLeftArrowTex, gEmptyCDownArrowTex, gEmptyCRightArrowTex }; OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, cButtonIcons[(temp + 1)], 32, 32, - ItemIconPos[temp-1][0], ItemIconPos[temp-1][1], R_ITEM_BTN_WIDTH(temp), - R_ITEM_BTN_WIDTH(temp), R_ITEM_BTN_DD(temp) << 1, R_ITEM_BTN_DD(temp) << 1); + ItemIconPos[temp-1][0], ItemIconPos[temp-1][1], ItemIconWidthFactor[temp-1][0], + ItemIconWidthFactor[temp-1][0], ItemIconWidthFactor[temp-1][1], ItemIconWidthFactor[temp-1][1]); } } @@ -3807,6 +3849,8 @@ int16_t gItemIconDD[] = { 550, 680, 680, 680, 1024, 1024, 1024, 1024 }; void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 button) { OPEN_DISPS(globalCtx->state.gfxCtx); + GraphicsContext* gfxCtx = globalCtx->state.gfxCtx; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; s16 X_Margins_CL; s16 X_Margins_CR; s16 X_Margins_CD; @@ -3852,15 +3896,52 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 X_Margins_DPad_Items = 0; Y_Margins_DPad_Items = 0; } + const float ItemsScale_offset[8][2] = { + // Y X + { 104.0f, 144.0f }, //B + { 108.0f, 148.0f }, //C L + { 108.0f, 148.0f }, //C D + { 108.0f, 148.0f }, //C R + { 112.0f, 152.0f }, //Dpad ^ + { 112.0f, 152.0f }, //Dpad V + { 112.0f, 152.0f }, //Dpad < + { 112.0f, 152.0f } //Dpad > + }; + float ItemScale_ori[8] = { + 1.0f, //B BTN + 0.87f, 0.87f, 0.87f, //C BTNs L / D / R + 0.6f, 0.6f, 0.6f, 0.6f //Dpad U/D/L/R + }; const s16 ItemIconPos_ori[8][2] = { - { B_BUTTON_X+X_Margins_BtnB, B_BUTTON_Y+Y_Margins_BtnB }, - { C_LEFT_BUTTON_X+X_Margins_CL, C_LEFT_BUTTON_Y+Y_Margins_CL }, - { C_DOWN_BUTTON_X+X_Margins_CD, C_DOWN_BUTTON_Y+Y_Margins_CD }, - { C_RIGHT_BUTTON_X+X_Margins_CR, C_RIGHT_BUTTON_Y+Y_Margins_CR }, - { DPAD_UP_X+X_Margins_DPad_Items, DPAD_UP_Y+Y_Margins_DPad_Items }, - { DPAD_DOWN_X+X_Margins_DPad_Items, DPAD_DOWN_Y+Y_Margins_DPad_Items }, - { DPAD_LEFT_X+X_Margins_DPad_Items, DPAD_LEFT_Y+Y_Margins_DPad_Items }, - { DPAD_RIGHT_X+X_Margins_DPad_Items, DPAD_RIGHT_Y+Y_Margins_DPad_Items } + { B_BUTTON_X+X_Margins_BtnB-ItemsScale_offset[0][1], B_BUTTON_Y+Y_Margins_BtnB-ItemsScale_offset[0][0] }, + { C_LEFT_BUTTON_X+X_Margins_CL-ItemsScale_offset[1][1], C_LEFT_BUTTON_Y+Y_Margins_CL-ItemsScale_offset[1][0] }, + { C_DOWN_BUTTON_X+X_Margins_CD-ItemsScale_offset[2][1], C_DOWN_BUTTON_Y+Y_Margins_CD-ItemsScale_offset[2][0] }, + { C_RIGHT_BUTTON_X+X_Margins_CR-ItemsScale_offset[3][1], C_RIGHT_BUTTON_Y+Y_Margins_CR-ItemsScale_offset[3][0] }, + { DPAD_UP_X+X_Margins_DPad_Items-ItemsScale_offset[4][1], DPAD_UP_Y+Y_Margins_DPad_Items-ItemsScale_offset[4][0] }, + { DPAD_DOWN_X+X_Margins_DPad_Items-ItemsScale_offset[5][1], DPAD_DOWN_Y+Y_Margins_DPad_Items-ItemsScale_offset[5][0] }, + { DPAD_LEFT_X+X_Margins_DPad_Items-ItemsScale_offset[6][1], DPAD_LEFT_Y+Y_Margins_DPad_Items-ItemsScale_offset[6][0] }, + { DPAD_RIGHT_X+X_Margins_DPad_Items-ItemsScale_offset[7][1], DPAD_RIGHT_Y+Y_Margins_DPad_Items-ItemsScale_offset[7][0] } + }; + float ItemScale[8] = { + CVar_GetFloat("gBBtnScale", 1.0f), + CVar_GetFloat("gCBtnLScale", 0.87f), + CVar_GetFloat("gCBtnDScale", 0.87f), + CVar_GetFloat("gCBtnRScale", 0.87f), + CVar_GetFloat("gDPadScale", 0.425f), + CVar_GetFloat("gDPadScale", 0.425f), + CVar_GetFloat("gDPadScale", 0.425f), + CVar_GetFloat("gDPadScale", 0.425f), + }; + float ItemScaleCurrent[8]; //Hold the array with modified scale + u16 ItemsSlotsAlpha[8] = { + interfaceCtx->bAlpha, + interfaceCtx->cLeftAlpha, + interfaceCtx->cRightAlpha, + interfaceCtx->cDownAlpha, + interfaceCtx->dpadUpAlpha, + interfaceCtx->dpadDownAlpha, + interfaceCtx->dpadLeftAlpha, + interfaceCtx->dpadRightAlpha }; s16 DPad_ItemsOffset[4][2] = { { 7,-8},//Up @@ -3871,6 +3952,10 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 s16 ItemIconPos[8][2]; //(X,Y) //DPadItems if (CVar_GetS32("gDPadPosType", 0) != 0) { + ItemScaleCurrent[4] = ItemScale[4]; + ItemScaleCurrent[5] = ItemScale[5]; + ItemScaleCurrent[6] = ItemScale[6]; + ItemScaleCurrent[7] = ItemScale[7]; ItemIconPos[4][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up ItemIconPos[5][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down ItemIconPos[6][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left @@ -3899,6 +3984,10 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 ItemIconPos[7][0] = -9999; } } else { + ItemScaleCurrent[4] = ItemScale_ori[4]; + ItemScaleCurrent[5] = ItemScale_ori[5]; + ItemScaleCurrent[6] = ItemScale_ori[6]; + ItemScaleCurrent[7] = ItemScale_ori[7]; ItemIconPos[4][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[4][0]); ItemIconPos[5][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[5][0]); ItemIconPos[6][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[6][0]); @@ -3910,73 +3999,81 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 } //B Button if (CVar_GetS32("gBBtnPosType", 0) != 0) { - ItemIconPos[0][1] = CVar_GetS32("gBBtnPosY", 0)+Y_Margins_BtnB; + ItemScaleCurrent[0] = ItemScale[0]; + ItemIconPos[0][1] = CVar_GetS32("gBBtnPosY", 0)+Y_Margins_BtnB-ItemsScale_offset[0][0]; if (CVar_GetS32("gBBtnPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gBBtnUseMargins", 0) != 0) {X_Margins_BtnB = Left_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB); + ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB-ItemsScale_offset[0][1]); } else if (CVar_GetS32("gBBtnPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gBBtnUseMargins", 0) != 0) {X_Margins_BtnB = Right_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB); + ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB-ItemsScale_offset[0][1]); } else if (CVar_GetS32("gBBtnPosType", 0) == 3) {//Anchor None - ItemIconPos[0][0] = CVar_GetS32("gBBtnPosX", 0); + ItemIconPos[0][0] = CVar_GetS32("gBBtnPosX", 0)-ItemsScale_offset[0][1]; } else if (CVar_GetS32("gBBtnPosType", 0) == 4) {//Hidden ItemIconPos[0][0] = -9999; } } else { + ItemScaleCurrent[0] = ItemScale_ori[0]; ItemIconPos[0][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[0][0]); ItemIconPos[0][1] = ItemIconPos_ori[0][1]; } //C button Left if (CVar_GetS32("gCBtnLPosType", 0) != 0) { - ItemIconPos[1][1] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL; + ItemScaleCurrent[1] = ItemScale[1]; + ItemIconPos[1][1] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL-ItemsScale_offset[1][0]; if (CVar_GetS32("gCBtnLPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); + ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL-ItemsScale_offset[1][1]); } else if (CVar_GetS32("gCBtnLPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); + ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL-ItemsScale_offset[1][1]); } else if (CVar_GetS32("gCBtnLPosType", 0) == 3) {//Anchor None - ItemIconPos[1][0] = CVar_GetS32("gCBtnLPosX", 0); + ItemIconPos[1][0] = CVar_GetS32("gCBtnLPosX", 0)-ItemsScale_offset[1][1]; } else if (CVar_GetS32("gCBtnLPosType", 0) == 4) {//Hidden ItemIconPos[1][0] = -9999; } } else { + ItemScaleCurrent[1] = ItemScale_ori[1]; ItemIconPos[1][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[1][0]); ItemIconPos[1][1] = ItemIconPos_ori[1][1]; } //C Button down if (CVar_GetS32("gCBtnDPosType", 0) != 0) { - ItemIconPos[2][1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; + ItemScaleCurrent[2] = ItemScale[2]; + ItemIconPos[2][1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD-ItemsScale_offset[2][0]; if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD-ItemsScale_offset[2][1]); } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD-ItemsScale_offset[2][1]); } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None - ItemIconPos[2][0] = CVar_GetS32("gCBtnDPosX", 0); + ItemIconPos[2][0] = CVar_GetS32("gCBtnDPosX", 0)-ItemsScale_offset[2][1]; } else if (CVar_GetS32("gCBtnDPosType", 0) == 4) {//Hidden ItemIconPos[2][0] = -9999; } } else { + ItemScaleCurrent[2] = ItemScale_ori[2]; ItemIconPos[2][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[2][0]); ItemIconPos[2][1] = ItemIconPos_ori[2][1]; } //C button Right if (CVar_GetS32("gCBtnRPosType", 0) != 0) { - ItemIconPos[3][1] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR; + ItemScaleCurrent[3] = ItemScale[3]; + ItemIconPos[3][1] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR-ItemsScale_offset[3][0]; if (CVar_GetS32("gCBtnRPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); + ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR-ItemsScale_offset[3][1]); } else if (CVar_GetS32("gCBtnRPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); + ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR-ItemsScale_offset[3][1]); } else if (CVar_GetS32("gCBtnRPosType", 0) == 3) {//Anchor None - ItemIconPos[3][0] = CVar_GetS32("gCBtnRPosX", 0); + ItemIconPos[3][0] = CVar_GetS32("gCBtnRPosX", 0)-ItemsScale_offset[3][1]; } else if (CVar_GetS32("gCBtnRPosType", 0) == 4) {//Hidden ItemIconPos[3][0] = -9999; } } else { + ItemScaleCurrent[3] = ItemScale_ori[3]; ItemIconPos[3][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[3][0]); ItemIconPos[3][1] = ItemIconPos_ori[3][1]; } @@ -3984,10 +4081,23 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 gDPLoadTextureBlock(OVERLAY_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPWideTextureRectangle(OVERLAY_DISP++, ItemIconPos[button][0] << 2, ItemIconPos[button][1] << 2, - (ItemIconPos[button][0] + gItemIconWidth[button]) << 2, - (ItemIconPos[button][1] + gItemIconWidth[button]) << 2, G_TX_RENDERTILE, 0, 0, - gItemIconDD[button] << 1, gItemIconDD[button] << 1); + gDPPipeSync(OVERLAY_DISP++); + gSPSetGeometryMode(OVERLAY_DISP++, G_CULL_BACK); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, ItemsSlotsAlpha[button]); + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); + Matrix_Translate( + ItemIconPos[button][0], + ItemIconPos[button][1] * -1, 1.0f, MTXMODE_NEW); + + Matrix_Scale( + ItemScaleCurrent[button]/1, + ItemScaleCurrent[button]/1, + ItemScaleCurrent[button]/1, MTXMODE_APPLY); + gSPMatrix(OVERLAY_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[0], 4, 0); + gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); + gDPPipeSync(OVERLAY_DISP++); CLOSE_DISPS(globalCtx->state.gfxCtx); } @@ -4399,7 +4509,12 @@ void Interface_Draw(GlobalContext* globalCtx) { { 0x82, 0x82, 0xFF }, // Adult's Wallet (Blue) { 0xFF, 0x64, 0x64 }, // Giant's Wallet (Red) }; - s16 rColor[3] = { 200, 255, 100 }; + Color_RGB8 rColor_ori = { 200, 255, 100 }; + Color_RGB8 rColor; + Color_RGB8 keyColor_ori = { 200, 230, 255 }; + Color_RGB8 keyColor; + Color_RGB8 DPad_colors_ori = {255, 255, 255}; + Color_RGB8 DPad_colors = CVar_GetRGB("gCCDpadPrim", DPad_colors_ori); static s16 spoilingItemEntrances[] = { 0x01AD, 0x0153, 0x0153 }; static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused static s16 D_80125B5C[] = { 91, 91 }; // unused @@ -4446,25 +4561,23 @@ void Interface_Draw(GlobalContext* globalCtx) { //Custom Color is on but check if Dynamic Wallet is on. if (CVar_GetS32("gDynamicWalletIcon", 0) != 0) { //if on let's use Dynamic Colors - rColor[0] = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][0]; - rColor[1] = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][1]; - rColor[2] = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][2]; + rColor.r = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][0]; + rColor.g = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][1]; + rColor.b = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][2]; } else { //else use our custom color - rColor[0] = CVar_GetS32("gCCRupeePrimR", &rupeeWalletColors[0][0]); - rColor[1] = CVar_GetS32("gCCRupeePrimG", &rupeeWalletColors[0][1]); - rColor[2] = CVar_GetS32("gCCRupeePrimB", &rupeeWalletColors[0][2]); + rColor = CVar_GetRGB("gCCRupeePrim", rColor_ori); } } else { //Custom colors is off so check if Dynamic Wallet is on. if (CVar_GetS32("gDynamicWalletIcon", 0) != 0) { - rColor[0] = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][0]; - rColor[1] = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][1]; - rColor[2] = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][2]; + rColor.r = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][0]; + rColor.g = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][1]; + rColor.b = rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)][2]; } else { - rColor[0] = rupeeWalletColors[0][0]; - rColor[1] = rupeeWalletColors[0][1]; - rColor[2] = rupeeWalletColors[0][2]; + rColor.r = rupeeWalletColors[0][0]; + rColor.g = rupeeWalletColors[0][1]; + rColor.b = rupeeWalletColors[0][2]; } } if (CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gDynamicWalletIcon", 0) != 1) { @@ -4502,7 +4615,7 @@ void Interface_Draw(GlobalContext* globalCtx) { PosY_RC = PosY_RC_ori; PosX_RC = PosX_RC_ori; } - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, rColor[0], rColor[1], rColor[2], interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, rColor.r, rColor.g, rColor.b, interfaceCtx->magicAlpha); OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, PosX_RC, PosY_RC, 16, 16, 1 << 10, 1 << 10); switch (globalCtx->sceneNum) { @@ -4555,10 +4668,10 @@ void Interface_Draw(GlobalContext* globalCtx) { gDPPipeSync(OVERLAY_DISP++); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCKeysPrimR", 200), CVar_GetS32("gCCKeysPrimG", 230), CVar_GetS32("gCCKeysPrimB", 255), interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCKeysPrim", keyColor_ori).r,CVar_GetRGB("gCCKeysPrim", keyColor_ori).g,CVar_GetRGB("gCCKeysPrim", keyColor_ori).b, interfaceCtx->magicAlpha); gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); //We reset this here so it match user color :) } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 230, 255, interfaceCtx->magicAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, keyColor_ori.r, keyColor_ori.g, keyColor_ori.b, interfaceCtx->magicAlpha); gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 20, 255); } OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gSmallKeyCounterIconTex, 16, 16, PosX_SKC, PosY_SKC, 16, 16, @@ -4813,9 +4926,9 @@ void Interface_Draw(GlobalContext* globalCtx) { gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCDpadPrimR", 255), CVar_GetS32("gCCDpadPrimG", 255), CVar_GetS32("gCCDpadPrimB", 255), dpadAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, DPad_colors.r,DPad_colors.g,DPad_colors.b, dpadAlpha); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, dpadAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, DPad_colors_ori.r,DPad_colors_ori.g,DPad_colors_ori.b, dpadAlpha); } if (fullUi) { gDPLoadTextureBlock(OVERLAY_DISP++, ResourceMgr_LoadFileRaw("assets/ship_of_harkinian/buttons/dpad.bin"), @@ -4873,6 +4986,7 @@ void Interface_Draw(GlobalContext* globalCtx) { // A Button func_80094A14(globalCtx->state.gfxCtx); + const Color_RGB8 A_Button_Colors = {R_A_BTN_COLOR(0), R_A_BTN_COLOR(1), R_A_BTN_COLOR(2)}; s16 X_Margins_BtnA; s16 Y_Margins_BtnA; if (CVar_GetS32("gABtnUseMargins", 0) != 0) { @@ -4919,9 +5033,9 @@ void Interface_Draw(GlobalContext* globalCtx) { if (CVar_GetS32("gHudColors", 1) == 0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 90, 90, 255, interfaceCtx->aAlpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_A_BTN_COLOR(0), R_A_BTN_COLOR(1), R_A_BTN_COLOR(2), interfaceCtx->aAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, A_Button_Colors.r, A_Button_Colors.g, A_Button_Colors.b, interfaceCtx->aAlpha); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", R_A_BTN_COLOR(0)), CVar_GetS32("gCCABtnPrimG", R_A_BTN_COLOR(1)), CVar_GetS32("gCCABtnPrimB", R_A_BTN_COLOR(2)), interfaceCtx->aAlpha); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCABtnPrim", A_Button_Colors).r,CVar_GetRGB("gCCABtnPrim", A_Button_Colors).g,CVar_GetRGB("gCCABtnPrim", A_Button_Colors).b, interfaceCtx->aAlpha); } if (fullUi) { Interface_DrawActionButton(globalCtx, PosX_BtnA, PosY_BtnA); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 03a977581..7ab9905a7 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -415,6 +415,13 @@ void Gameplay_Init(GameState* thisx) { PreRender_SetValues(&globalCtx->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); gTrnsnUnkState = 0; globalCtx->transitionMode = 0; + + if (CVar_GetS32("gSceneTransitions", 255)!= 255){ + globalCtx->transitionMode = CVar_GetS32("gSceneTransitions", 0); + gSaveContext.nextTransition = CVar_GetS32("gSceneTransitions", 0); + globalCtx->fadeTransition = CVar_GetS32("gSceneTransitions", 0); + } + FrameAdvance_Init(&globalCtx->frameAdvCtx); Rand_Seed((u32)osGetTime()); Matrix_Init(&globalCtx->state); diff --git a/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c b/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c index 3674167d5..e6bf1026a 100644 --- a/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c +++ b/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c @@ -194,6 +194,10 @@ void ArrowFire_Draw(Actor* thisx, GlobalContext* globalCtx2) { u32 stateFrames; EnArrow* arrow; Actor* tranform; + Color_RGB8 Arrow_env_ori = {255,0,0}; + Color_RGB8 Arrow_col_ori = {255,200,0}; + Color_RGB8 Arrow_env = CVar_GetRGB("gFireArrowColEnv", Arrow_env_ori); + Color_RGB8 Arrow_col = CVar_GetRGB("gFireArrowCol", Arrow_col_ori); stateFrames = globalCtx->state.frames; arrow = (EnArrow*)this->actor.parent; @@ -214,9 +218,9 @@ void ArrowFire_Draw(Actor* thisx, GlobalContext* globalCtx2) { POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP); if (CVar_GetS32("gUseArrowsCol", 0)) { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, - (s32)(CVar_GetS32("gFireArrowColEnvR", 40) * this->unk_15C) & 0xFF, - (s32)(CVar_GetS32("gFireArrowColEnvG", 0) * this->unk_15C) & 0xFF, - (s32)(CVar_GetS32("gFireArrowColEnvB", 0) * this->unk_15C) & 0xFF, + (s32)(Arrow_env.r * this->unk_15C) & 0xFF, + (s32)(Arrow_env.g * this->unk_15C) & 0xFF, + (s32)(Arrow_env.b * this->unk_15C) & 0xFF, (s32)(30.0f * this->unk_15C) & 0xFF); //Intentionnally made Alpha lower. } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(40.0f * this->unk_15C) & 0xFF, 0, 0, @@ -230,11 +234,11 @@ void ArrowFire_Draw(Actor* thisx, GlobalContext* globalCtx2) { // Draw fire on the arrow func_80093D84(globalCtx->state.gfxCtx); if (CVar_GetS32("gUseArrowsCol", 0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, CVar_GetS32("gFireArrowColR", 255), CVar_GetS32("gFireArrowColG", 200), CVar_GetS32("gFireArrowColB", 0), this->alpha); - gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gFireArrowColEnvR", 255), CVar_GetS32("gFireArrowColEnvG", 0), CVar_GetS32("gFireArrowColEnvB", 0), 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col.r, Arrow_col.g, Arrow_col.b, this->alpha); + gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env.r, Arrow_env.g, Arrow_env.b, 128); } else { - gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, this->alpha); - gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col_ori.r, Arrow_col_ori.g, Arrow_col_ori.b, this->alpha); + gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env_ori.r, Arrow_env_ori.g, Arrow_env_ori.b, 128); } Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY); if (this->timer != 0) { diff --git a/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c b/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c index 1af27f3ec..a55a4ac4a 100644 --- a/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c +++ b/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c @@ -195,6 +195,10 @@ void ArrowIce_Draw(Actor* thisx, GlobalContext* globalCtx) { Actor* tranform; u32 stateFrames = globalCtx->state.frames; EnArrow* arrow = (EnArrow*)this->actor.parent; + Color_RGB8 Arrow_env_ori = {0,0,255}; + Color_RGB8 Arrow_col_ori = {170, 255, 255}; + Color_RGB8 Arrow_env = CVar_GetRGB("gIceArrowColEnv", Arrow_env_ori); + Color_RGB8 Arrow_col = CVar_GetRGB("gIceArrowCol", Arrow_col_ori); if ((arrow != NULL) && (arrow->actor.update != NULL) && (this->timer < 255)) { tranform = (arrow->hitFlags & 2) ? &this->actor : &arrow->actor; @@ -212,9 +216,9 @@ void ArrowIce_Draw(Actor* thisx, GlobalContext* globalCtx) { POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP); if (CVar_GetS32("gUseArrowsCol", 0)) { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, - (s32)(CVar_GetS32("gIceArrowColEnvR", 0) * this->unk_164) & 0xFF, - (s32)(CVar_GetS32("gIceArrowColEnvG", 10) * this->unk_164) & 0xFF, - (s32)(CVar_GetS32("gIceArrowColEnvB", 50) * this->unk_164) & 0xFF, + (s32)(Arrow_env.r * this->unk_164) & 0xFF, + (s32)(Arrow_env.g * this->unk_164) & 0xFF, + (s32)(Arrow_env.b * this->unk_164) & 0xFF, (s32)(30.0f * this->unk_164) & 0xFF); //Intentionnally made Alpha lower. } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(10.0f * this->unk_164) & 0xFF, @@ -228,11 +232,11 @@ void ArrowIce_Draw(Actor* thisx, GlobalContext* globalCtx) { // Draw ice on the arrow func_80093D84(globalCtx->state.gfxCtx); if (CVar_GetS32("gUseArrowsCol", 0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, CVar_GetS32("gIceArrowColR", 170), CVar_GetS32("gIceArrowColG", 255), CVar_GetS32("gIceArrowColB", 255), this->alpha); - gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gIceArrowColEnvR", 0), CVar_GetS32("gIceArrowColEnvG", 0), CVar_GetS32("gIceArrowColEnvB", 255), 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col.r, Arrow_col.g, Arrow_col.b, this->alpha); + gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env.r, Arrow_env.g, Arrow_env.b, 128); } else { - gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 170, 255, 255, this->alpha); - gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col_ori.r, Arrow_col_ori.g, Arrow_col_ori.b, this->alpha); + gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env_ori.r, Arrow_env_ori.g, Arrow_env_ori.b, 128); } Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY); if (this->timer != 0) { diff --git a/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c b/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c index f756b4544..093cef89e 100644 --- a/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c +++ b/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c @@ -193,6 +193,10 @@ void ArrowLight_Draw(Actor* thisx, GlobalContext* globalCtx) { u32 stateFrames = globalCtx->state.frames; EnArrow* arrow = (EnArrow*)this->actor.parent; Actor* tranform; + Color_RGB8 Arrow_env_ori = {255, 255, 0}; + Color_RGB8 Arrow_col_ori = {255, 255, 170}; + Color_RGB8 Arrow_env = CVar_GetRGB("gLightArrowColEnv", Arrow_env_ori); + Color_RGB8 Arrow_col = CVar_GetRGB("gLightArrowCol", Arrow_col_ori); if ((arrow != NULL) && (arrow->actor.update != NULL) && (this->timer < 255)) { tranform = (arrow->hitFlags & 2) ? &this->actor : &arrow->actor; @@ -210,9 +214,9 @@ void ArrowLight_Draw(Actor* thisx, GlobalContext* globalCtx) { POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP); if (CVar_GetS32("gUseArrowsCol", 0)) { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, - (s32)(CVar_GetS32("gLightArrowColEnvR", 30) * this->unk_164) & 0xFF, - (s32)(CVar_GetS32("gLightArrowColEnvG", 40) * this->unk_164) & 0xFF, - (s32)(CVar_GetS32("gLightArrowColEnvB", 0) * this->unk_164) & 0xFF, + (s32)(Arrow_env.r * this->unk_164) & 0xFF, + (s32)(Arrow_env.g * this->unk_164) & 0xFF, + (s32)(Arrow_env.b * this->unk_164) & 0xFF, (s32)(30.0f * this->unk_164) & 0xFF); //Intentionnally made Alpha lower. } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(30.0f * this->unk_164) & 0xFF, @@ -226,11 +230,11 @@ void ArrowLight_Draw(Actor* thisx, GlobalContext* globalCtx) { // Draw light on the arrow func_80093D84(globalCtx->state.gfxCtx); if (CVar_GetS32("gUseArrowsCol", 0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, CVar_GetS32("gLightArrowColR", 255), CVar_GetS32("gLightArrowColG", 255), CVar_GetS32("gLightArrowColB", 170), this->alpha); - gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gLightArrowColEnvR", 255), CVar_GetS32("gLightArrowColEnvG", 255), CVar_GetS32("gLightArrowColEnvB", 0), 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col.r, Arrow_col.g, Arrow_col.b, this->alpha); + gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env.r, Arrow_env.g, Arrow_env.b, 128); } else { - gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 170, this->alpha); - gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col_ori.r, Arrow_col_ori.g, Arrow_col_ori.b, this->alpha); + gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env_ori.r, Arrow_env_ori.g, Arrow_env_ori.b, 128); } Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY); if (this->timer != 0) { diff --git a/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c b/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c index 77d2a2db0..199e8cafd 100644 --- a/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c +++ b/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c @@ -472,6 +472,10 @@ void EnDog_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Ve void EnDog_Draw(Actor* thisx, GlobalContext* globalCtx) { EnDog* this = (EnDog*)thisx; Color_RGBA8 colors[] = { { 255, 255, 200, 0 }, { 150, 100, 50, 0 } }; + Color_RGB8 Dog1_ori = {colors[0].r, colors[0].g, colors[0].b}; + Color_RGB8 Dog2_ori = {colors[1].r, colors[1].g, colors[1].b}; + Color_RGB8 Dog1 = CVar_GetRGB("gDog1Col", Dog1_ori); + Color_RGB8 Dog2 = CVar_GetRGB("gDog2Col", Dog2_ori); OPEN_DISPS(globalCtx->state.gfxCtx); @@ -479,19 +483,19 @@ void EnDog_Draw(Actor* thisx, GlobalContext* globalCtx) { gDPPipeSync(POLY_OPA_DISP++); if (CVar_GetS32("gUseDogsCol",0)) { - colors[0].r = CVar_GetS32("gDog1ColR", 255); - colors[0].g = CVar_GetS32("gDog1ColG", 255); - colors[0].b = CVar_GetS32("gDog1ColB", 200); - colors[1].r = CVar_GetS32("gDog2ColR", 150); - colors[1].g = CVar_GetS32("gDog2ColG", 100); - colors[1].b = CVar_GetS32("gDog2ColB", 50); + colors[0].r = Dog1.r; + colors[0].g = Dog1.g; + colors[0].b = Dog1.b; + colors[1].r = Dog2.r; + colors[1].g = Dog2.g; + colors[1].b = Dog2.b; } else { - colors[0].r = 255; - colors[0].g = 255; - colors[0].b = 200; - colors[1].r = 150; - colors[1].g = 100; - colors[1].b = 50; + colors[0].r = Dog1_ori.r; + colors[0].g = Dog1_ori.g; + colors[0].b = Dog1_ori.b; + colors[1].r = Dog2_ori.r; + colors[1].g = Dog2_ori.g; + colors[1].b = Dog2_ori.b; } gDPSetEnvColor(POLY_OPA_DISP++, colors[this->actor.params & 0xF].r, colors[this->actor.params & 0xF].g, colors[this->actor.params & 0xF].b, colors[this->actor.params & 0xF].a); diff --git a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c index 1e0b4a4b2..65f16bc3c 100644 --- a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c +++ b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c @@ -735,6 +735,11 @@ void EnFirefly_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList static Color_RGBA8 fireAuraEnvColor = { 255, 50, 0, 0 }; static Color_RGBA8 iceAuraPrimColor = { 100, 200, 255, 255 }; static Color_RGBA8 iceAuraEnvColor = { 0, 0, 255, 0 }; + static Color_RGB8 fireAuraPrimColor_ori = { 255, 255, 100 }; + static Color_RGB8 fireAuraEnvColor_ori = { 255, 50, 0 }; + static Color_RGB8 iceAuraPrimColor_ori = { 100, 200, 255 }; + static Color_RGB8 iceAuraEnvColor_ori = { 0, 0, 255 }; + static Vec3f effVelocity = { 0.0f, 0.5f, 0.0f }; static Vec3f effAccel = { 0.0f, 0.5f, 0.0f }; static Vec3f limbSrc = { 0.0f, 0.0f, 0.0f }; @@ -747,20 +752,20 @@ void EnFirefly_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList s16 effLife; EnFirefly* this = (EnFirefly*)thisx; if (CVar_GetS32("gUseKeeseCol", 0)) { - Color_RGBA8 fireAuraPrimColor_custom = { CVar_GetS32("gKeese1_Ef_PrimR", 255), CVar_GetS32("gKeese1_Ef_PrimG", 255), CVar_GetS32("gKeese1_Ef_PrimB", 100), 255 }; - Color_RGBA8 fireAuraEnvColor_custom = { CVar_GetS32("gKeese1_Ef_EnvR", 255), CVar_GetS32("gKeese1_Ef_Env", 50), CVar_GetS32("gKeese1_Ef_EnvB", 0), 0 }; - Color_RGBA8 iceAuraPrimColor_custom = { CVar_GetS32("gKeese2_Ef_PrimR", 100), CVar_GetS32("gKeese2_Ef_PrimG", 200), CVar_GetS32("gKeese2_Ef_PrimB", 255), 255 }; - Color_RGBA8 iceAuraEnvColor_custom = { CVar_GetS32("gKeese2_Ef_EnvR", 0), CVar_GetS32("gKeese2_Ef_Env", 0), CVar_GetS32("gKeese2_Ef_EnvB", 255), 0 }; + Color_RGBA8 fireAuraPrimColor_custom = { CVar_GetRGB("gKeese1_Ef_Prim", fireAuraPrimColor_ori).r,CVar_GetRGB("gKeese1_Ef_Prim", fireAuraPrimColor_ori).g,CVar_GetRGB("gKeese1_Ef_Prim", fireAuraPrimColor_ori).b, 255 }; + Color_RGBA8 fireAuraEnvColor_custom = { CVar_GetRGB("gKeese1_Ef_Env", fireAuraEnvColor_ori).r,CVar_GetRGB("gKeese1_Ef_Env", fireAuraEnvColor_ori).g,CVar_GetRGB("gKeese1_Ef_Env", fireAuraEnvColor_ori).b, 0 }; + Color_RGBA8 iceAuraPrimColor_custom = { CVar_GetRGB("gKeese2_Ef_Prim", iceAuraPrimColor_ori).r,CVar_GetRGB("gKeese2_Ef_Prim", iceAuraPrimColor_ori).g,CVar_GetRGB("gKeese2_Ef_Prim", iceAuraPrimColor_ori).b, 255 }; + Color_RGBA8 iceAuraEnvColor_custom = { CVar_GetRGB("gKeese2_Ef_Env", iceAuraEnvColor_ori).r,CVar_GetRGB("gKeese2_Ef_Env", iceAuraEnvColor_ori).g,CVar_GetRGB("gKeese2_Ef_Env", iceAuraEnvColor_ori).b, 0 }; fireAuraPrimColor = fireAuraPrimColor_custom; fireAuraEnvColor = fireAuraEnvColor_custom; iceAuraPrimColor = iceAuraPrimColor_custom; iceAuraEnvColor = iceAuraEnvColor_custom; } else { //Original colors are back there - Color_RGBA8 fireAuraPrimColor_custom = { 255, 255, 100, 255 }; - Color_RGBA8 fireAuraEnvColor_custom = { 255, 50, 0, 0 }; - Color_RGBA8 iceAuraPrimColor_custom = { 100, 200, 255, 255 }; - Color_RGBA8 iceAuraEnvColor_custom = { 0, 0, 255, 0 }; + Color_RGBA8 fireAuraPrimColor_custom = { fireAuraPrimColor_ori.r, fireAuraPrimColor_ori.g, fireAuraPrimColor_ori.b, 255 }; + Color_RGBA8 fireAuraEnvColor_custom = { fireAuraEnvColor_ori.r, fireAuraEnvColor_ori.g, fireAuraEnvColor_ori.b, 0 }; + Color_RGBA8 iceAuraPrimColor_custom = { iceAuraPrimColor_ori.r, iceAuraPrimColor_ori.g, iceAuraPrimColor_ori.b, 255 }; + Color_RGBA8 iceAuraEnvColor_custom = { iceAuraEnvColor_ori.r, iceAuraEnvColor_ori.g, iceAuraEnvColor_ori.b, 0 }; fireAuraPrimColor = fireAuraPrimColor_custom; fireAuraEnvColor = fireAuraEnvColor_custom; iceAuraPrimColor = iceAuraPrimColor_custom; diff --git a/soh/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c b/soh/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c index 84b5fd654..4d7880dc1 100644 --- a/soh/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c +++ b/soh/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c @@ -341,7 +341,8 @@ void EnMThunder_Draw(Actor* thisx, GlobalContext* globalCtx2) { switch (this->unk_1C6) { case 0: if (CVar_GetS32("gUseChargedCol",0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetS32("gCharged2ColR",255), CVar_GetS32("gCharged2ColG",255), CVar_GetS32("gCharged2ColB",170), (u8)(this->unk_1B0 * 255)); + Color_RGB8 SpinColor = {255, 255, 170}; + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetRGB("gCharged2Col", SpinColor).r, CVar_GetRGB("gCharged2Col", SpinColor).g, CVar_GetRGB("gCharged2Col", SpinColor).b, (u8)(this->unk_1B0 * 255)); } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 170, (u8)(this->unk_1B0 * 255)); } @@ -350,7 +351,8 @@ void EnMThunder_Draw(Actor* thisx, GlobalContext* globalCtx2) { break; case 1: if (CVar_GetS32("gUseChargedCol",0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetS32("gCharged1ColR",170), CVar_GetS32("gCharged1ColG",255), CVar_GetS32("gCharged1ColB",255), (u8)(this->unk_1B0 * 255)); + Color_RGB8 SpinColor = {255, 255, 170}; + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetRGB("gCharged1Col", SpinColor).r, CVar_GetRGB("gCharged1Col", SpinColor).g, CVar_GetRGB("gCharged1Col", SpinColor).b, (u8)(this->unk_1B0 * 255)); } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 170, 255, 255, (u8)(this->unk_1B0 * 255)); } @@ -382,8 +384,10 @@ void EnMThunder_Draw(Actor* thisx, GlobalContext* globalCtx2) { if (this->unk_1B8 >= 0.85f) { phi_f14 = (D_80AA046C[(globalCtx->gameplayFrames & 7)] * 6.0f) + 1.0f; if (CVar_GetS32("gUseChargedCol",0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetS32("gCharged2ColR",255), CVar_GetS32("gCharged2ColG",255), CVar_GetS32("gCharged2ColB",170), this->unk_1C8); - gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gCharged2ColEnvR",255), CVar_GetS32("gCharged2ColEnvG",100), CVar_GetS32("gCharged2ColEnvB",0), 128); + Color_RGB8 SpinColor1 = {255, 255, 170}; + Color_RGB8 SpinColor2 = {255, 100, 0}; + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetRGB("gCharged2Col", SpinColor1).r, CVar_GetRGB("gCharged2Col", SpinColor1).g, CVar_GetRGB("gCharged2Col", SpinColor1).b, this->unk_1C8); + gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetRGB("gCharged2ColEnv", SpinColor2).r, CVar_GetRGB("gCharged2ColEnv", SpinColor2).g, CVar_GetRGB("gCharged2ColEnv", SpinColor2).b, 128); } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 170, this->unk_1C8); gDPSetEnvColor(POLY_XLU_DISP++, 255, 100, 0, 128); @@ -393,8 +397,10 @@ void EnMThunder_Draw(Actor* thisx, GlobalContext* globalCtx2) { } else { phi_f14 = (D_80AA046C[globalCtx->gameplayFrames & 7] * 2.0f) + 1.0f; if (CVar_GetS32("gUseChargedCol",0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetS32("gCharged1ColR",170), CVar_GetS32("gCharged1ColG",255), CVar_GetS32("gCharged1ColB",255), this->unk_1C8); - gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gCharged1ColEnvR",0), CVar_GetS32("gCharged1ColEnvG",100), CVar_GetS32("gCharged1ColEnvB",255), 128); + Color_RGB8 SpinColor1 = {170, 255, 255}; + Color_RGB8 SpinColor2 = {20, 100, 255}; + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetRGB("gCharged1Col", SpinColor1).r, CVar_GetRGB("gCharged1Col", SpinColor1).g, CVar_GetRGB("gCharged1Col", SpinColor1).b, this->unk_1C8); + gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetRGB("gCharged1ColEnv", SpinColor2).r, CVar_GetRGB("gCharged1ColEnv", SpinColor2).g, CVar_GetRGB("gCharged1ColEnv", SpinColor2).b, 128); } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 170, 255, 255, this->unk_1C8); gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, 128); diff --git a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c index c42020435..88fff9caa 100644 --- a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c +++ b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c @@ -101,6 +101,8 @@ void EnMag_Init(Actor* thisx, GlobalContext* globalCtx) { #else void EnMag_Init(Actor* thisx, GlobalContext* globalCtx) { EnMag* this = (EnMag*)thisx; + Color_RGB8 Original_Prim = { 255, 255, 170 }; + Color_RGB8 Original_Env = { 255, 100, 0 }; YREG(1) = 63; YREG(3) = 80; @@ -127,12 +129,21 @@ void EnMag_Init(Actor* thisx, GlobalContext* globalCtx) { this->effectScroll = 0; this->unk_E30C = 0; - this->effectPrimColor[0] = 0.0f; - this->effectPrimColor[1] = 100.0f; - this->effectPrimColor[2] = 170.0f; - this->effectEnvColor[0] = 0.0f; - this->effectEnvColor[1] = 100.0f; - this->effectEnvColor[2] = 0.0f; + if (CVar_GetS32("gHudColors",0) == 2 ){ + this->effectPrimColor[0] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).r; + this->effectPrimColor[1] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).g; + this->effectPrimColor[2] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).b; + this->effectEnvColor[0] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).r; + this->effectEnvColor[1] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).g; + this->effectEnvColor[2] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).b; + } else { + this->effectPrimColor[0] = 0.0f; + this->effectPrimColor[1] = 100.0f; + this->effectPrimColor[2] = 170.0f; + this->effectEnvColor[0] = 0.0f; + this->effectEnvColor[1] = 100.0f; + this->effectEnvColor[2] = 0.0f; + } this->effectFadeInTimer = 40; @@ -147,11 +158,21 @@ void EnMag_Init(Actor* thisx, GlobalContext* globalCtx) { this->effectPrimLodFrac = 128.0f; this->effectAlpha = 255.0f; - this->effectPrimColor[0] = 255.0f; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 170; - this->effectEnvColor[0] = 255.0f; - this->effectEnvColor[1] = 100; + if (CVar_GetS32("gHudColors",0) == 2 ){ + this->effectPrimColor[0] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).r; + this->effectPrimColor[1] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).g; + this->effectPrimColor[2] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).b; + this->effectEnvColor[0] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).r; + this->effectEnvColor[1] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).g; + this->effectEnvColor[2] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).b; + } else { + this->effectPrimColor[0] = (float)Original_Prim.r; + this->effectPrimColor[1] = (float)Original_Prim.g; + this->effectPrimColor[2] = (float)Original_Prim.b; + this->effectEnvColor[0] = (float)Original_Env.r; + this->effectEnvColor[1] = (float)Original_Env.g; + this->effectEnvColor[2] = (float)Original_Env.b; + } gSaveContext.unk_13E7 = 0; this->globalState = MAG_STATE_DISPLAY; @@ -336,6 +357,8 @@ void EnMag_Update(Actor* thisx, GlobalContext* globalCtx) { void EnMag_Update(Actor* thisx, GlobalContext* globalCtx) { s32 pad[2]; EnMag* this = (EnMag*)thisx; + Color_RGB8 Original_Prim = { 255, 255, 170 }; + Color_RGB8 Original_Env = { 255, 100, 0 }; if (gSaveContext.fileNum != 0xFEDC) { if (this->globalState < MAG_STATE_DISPLAY) { @@ -352,11 +375,21 @@ void EnMag_Update(Actor* thisx, GlobalContext* globalCtx) { this->effectPrimLodFrac = 128.0f; this->effectAlpha = 255.0f; - this->effectPrimColor[0] = 255.0f; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 170; - this->effectEnvColor[0] = 255.0f; - this->effectEnvColor[1] = 100; + if (CVar_GetS32("gHudColors",0) == 2 ){ + this->effectPrimColor[0] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).r; + this->effectPrimColor[1] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).g; + this->effectPrimColor[2] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).b; + this->effectEnvColor[0] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).r; + this->effectEnvColor[1] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).g; + this->effectEnvColor[2] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).b; + } else { + this->effectPrimColor[0] = (float)Original_Prim.r; + this->effectPrimColor[1] = (float)Original_Prim.g; + this->effectPrimColor[2] = (float)Original_Prim.b; + this->effectEnvColor[0] = (float)Original_Env.r; + this->effectEnvColor[1] = (float)Original_Env.g; + this->effectEnvColor[2] = (float)Original_Env.b; + } this->globalState = MAG_STATE_DISPLAY; sDelayTimer = 20; @@ -395,11 +428,13 @@ void EnMag_Update(Actor* thisx, GlobalContext* globalCtx) { this->effectAlpha += 6.375f; this->effectPrimLodFrac += 0.8f; - this->effectPrimColor[0] += 6.375f; - this->effectPrimColor[1] += 3.875f; - this->effectPrimColor[2] += 2.125f; - this->effectEnvColor[0] += 6.375f; - this->effectEnvColor[1] += 3.875f; + if (CVar_GetS32("gHudColors",0) != 2 ){ + this->effectPrimColor[0] += 6.375f; + this->effectPrimColor[1] += 3.875f; + this->effectPrimColor[2] += 2.125f; + this->effectEnvColor[0] += 6.375f; + this->effectEnvColor[1] += 3.875f; + } this->effectFadeInTimer--; @@ -407,18 +442,22 @@ void EnMag_Update(Actor* thisx, GlobalContext* globalCtx) { this->effectPrimLodFrac = 32.0f; this->effectAlpha = 255.0f; - this->effectPrimColor[0] = 255.0f; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 255.0f; - this->effectEnvColor[0] = 255.0f; - this->effectEnvColor[1] = 255.0f; + if (CVar_GetS32("gHudColors",0) != 2 ){ + this->effectPrimColor[0] = 255.0f; + this->effectPrimColor[1] = 255.0f; + this->effectPrimColor[2] = 255.0f; + this->effectEnvColor[0] = 255.0f; + this->effectEnvColor[1] = 255.0f; + } this->effectFadeInTimer = 40; this->effectFadeInState = 1; } } else if (this->effectFadeInState == 1) { - this->effectPrimColor[2] += -2.125f; - this->effectEnvColor[1] += -3.875f; + if (CVar_GetS32("gHudColors",0) != 2 ){ + this->effectPrimColor[2] += -2.125f; + this->effectEnvColor[1] += -3.875f; + } this->effectPrimLodFrac += 2.4f; @@ -427,8 +466,17 @@ void EnMag_Update(Actor* thisx, GlobalContext* globalCtx) { if (this->effectFadeInTimer == 0) { this->effectPrimLodFrac = 128.0f; - this->effectPrimColor[2] = 170.0f; - this->effectEnvColor[1] = 100.0f; + if (CVar_GetS32("gHudColors",0) == 2 ){ + this->effectPrimColor[0] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).r; + this->effectPrimColor[1] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).g; + this->effectPrimColor[2] = (float)CVar_GetRGB("gCCTCFirePrim", Original_Prim).b; + this->effectEnvColor[0] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).r; + this->effectEnvColor[1] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).g; + this->effectEnvColor[2] = (float)CVar_GetRGB("gCCTCFireEnv", Original_Env).b; + } else { + this->effectPrimColor[2] = 170.0f; + this->effectEnvColor[1] = 100.0f; + } this->effectFadeInTimer = 32; this->effectFadeInState = 2; 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 79a2d7010..1e154ef3b 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 @@ -1875,6 +1875,8 @@ void EnOssan_UpdateItemSelectedProperty(EnOssan* this) { } void EnOssan_UpdateCursorAnim(EnOssan* this) { + Color_RGB8 A_button_ori = {0,255,80}; + Color_RGB8 A_button = CVar_GetRGB("gCCABtnPrim", A_button_ori); f32 t; t = this->cursorAnimTween; @@ -1896,13 +1898,13 @@ void EnOssan_UpdateCursorAnim(EnOssan* this) { this->cursorColorG = ColChanMix(80, 80.0f, t); this->cursorColorB = ColChanMix(255, 0.0f, t); } else if (CVar_GetS32("gHudColors", 1) == 1) { - this->cursorColorR = ColChanMix(0, 0.0f, t); - this->cursorColorG = ColChanMix(255, 80.0f, t); - this->cursorColorB = ColChanMix(80, 0.0f, t); + this->cursorColorR = ColChanMix(A_button_ori.r, 0.0f, t); + this->cursorColorG = ColChanMix(A_button_ori.b, 80.0f, t); + this->cursorColorB = ColChanMix(A_button_ori.r, 0.0f, t); } else if (CVar_GetS32("gHudColors", 1) == 2) { - this->cursorColorR = ColChanMix(CVar_GetS32("gCCABtnPrimR", 90), ((CVar_GetS32("gCCABtnPrimR", 90)/255)*100), t); - this->cursorColorG = ColChanMix(CVar_GetS32("gCCABtnPrimG", 90), ((CVar_GetS32("gCCABtnPrimG", 90)/255)*100), t); - this->cursorColorB = ColChanMix(CVar_GetS32("gCCABtnPrimB", 90), ((CVar_GetS32("gCCABtnPrimB", 90)/255)*100), t); + this->cursorColorR = ColChanMix(A_button.r, ((A_button.r/255)*100), t); + this->cursorColorG = ColChanMix(A_button.g, ((A_button.g/255)*100), t); + this->cursorColorB = ColChanMix(A_button.b, ((A_button.b/255)*100), t); } this->cursorColorA = ColChanMix(255, 0.0f, t); this->cursorAnimTween = t; diff --git a/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c b/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c index 3ae6cbfa1..374cecea1 100644 --- a/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c +++ b/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c @@ -198,6 +198,10 @@ void MagicDark_DiamondDraw(Actor* thisx, GlobalContext* globalCtx) { MagicDark* this = (MagicDark*)thisx; s32 pad; u16 gameplayFrames = globalCtx->gameplayFrames; + Color_RGB8 Spell_env_ori = {0, 100, 255}; + Color_RGB8 Spell_col_ori = {170, 255, 255}; + Color_RGB8 Spell_env = CVar_GetRGB("gNL_Diamond_Env", Spell_env_ori); + Color_RGB8 Spell_col = CVar_GetRGB("gNL_Diamond_Col", Spell_col_ori); OPEN_DISPS(globalCtx->state.gfxCtx); @@ -221,8 +225,8 @@ void MagicDark_DiamondDraw(Actor* thisx, GlobalContext* globalCtx) { gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if (CVar_GetS32("gUseSpellsCol",0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetS32("gNL_Diamond_ColR",170), CVar_GetS32("gNL_Diamond_ColG",255), CVar_GetS32("gNL_Diamond_ColB",255), (s32)(this->primAlpha * 0.6f) & 0xFF); - gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gNL_Diamond_EnvR",100), CVar_GetS32("gNL_Diamond_EnvG",100), CVar_GetS32("gNL_Diamond_EnvB",255), 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, Spell_col.r, Spell_col.g, Spell_col.b, (s32)(this->primAlpha * 0.6f) & 0xFF); + gDPSetEnvColor(POLY_XLU_DISP++, Spell_env.r, Spell_env.g, Spell_env.b, 128); } else { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 170, 255, 255, (s32)(this->primAlpha * 0.6f) & 0xFF); gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, 128); diff --git a/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c b/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c index 279d88f8f..7fbd62cdd 100644 --- a/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c +++ b/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c @@ -216,7 +216,11 @@ void MagicFire_Draw(Actor* thisx, GlobalContext* globalCtx) { s32 pad2; s32 i; u8 alpha; - + Color_RGB8 Spell_env_ori = {255, 0, 0}; + Color_RGB8 Spell_col_ori = {255, 200, 0}; + Color_RGB8 Spell_env = CVar_GetRGB("gDF_Env", Spell_env_ori); + Color_RGB8 Spell_col = CVar_GetRGB("gDF_Col", Spell_col_ori); + if (this->action > 0) { OPEN_DISPS(globalCtx->state.gfxCtx); POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP); @@ -228,11 +232,11 @@ void MagicFire_Draw(Actor* thisx, GlobalContext* globalCtx) { gDPFillRectangle(POLY_XLU_DISP++, 0, 0, 319, 239); func_80093D84(globalCtx->state.gfxCtx); if (CVar_GetS32("gUseSpellsCol",0)) { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, CVar_GetS32("gDF_ColR",255), CVar_GetS32("gDF_ColG",200), CVar_GetS32("gDF_ColB",0), (u8)(this->alphaMultiplier * 255)); - gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gDF_EnvR",255), CVar_GetS32("gDF_EnvG",0), CVar_GetS32("gDF_EnvB",0), (u8)(this->alphaMultiplier * 255)); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, Spell_col.r, Spell_col.g, Spell_col.b, (u8)(this->alphaMultiplier * 255)); + gDPSetEnvColor(POLY_XLU_DISP++, Spell_env.r, Spell_env.g, Spell_env.b, (u8)(this->alphaMultiplier * 255)); } else { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 128, 255, 200, 0, (u8)(this->alphaMultiplier * 255)); - gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, (u8)(this->alphaMultiplier * 255)); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, Spell_col_ori.r, Spell_col_ori.g, Spell_col_ori.b, (u8)(this->alphaMultiplier * 255)); + gDPSetEnvColor(POLY_XLU_DISP++, Spell_env_ori.r, Spell_env_ori.g, Spell_env_ori.b, (u8)(this->alphaMultiplier * 255)); } Matrix_Scale(0.15f, 0.15f, 0.15f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 6cc1f2255..cd2950d65 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10370,6 +10370,7 @@ void func_80848EF8(Player* this, GlobalContext* globalCtx) { /*Prevent it on horse, while jumping and on title screen. If you fly around no stone of agony for you! */ + Color_RGB8 StoneOfAgony_ori = { 255, 255, 255 }; if (CVar_GetS32("gVisualAgony", 0) !=0 && !this->stateFlags1) { s16 Top_Margins = (CVar_GetS32("gHUDMargin_T", 0)*-1); s16 Left_Margins = CVar_GetS32("gHUDMargin_L", 0); @@ -10415,30 +10416,34 @@ void func_80848EF8(Player* this, GlobalContext* globalCtx) { gDPPipeSync(OVERLAY_DISP++); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCVSOAPrimR", 255), CVar_GetS32("gCCVSOAPrimG", 255), CVar_GetS32("gCCVSOAPrimB", 255), DefaultIconA); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).r,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).g,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).b, DefaultIconA); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, StoneOfAgony_ori.r, StoneOfAgony_ori.g, StoneOfAgony_ori.b, DefaultIconA); } gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); if (this->unk_6A0 > 4000000.0f) { if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCVSOAPrimR", 255), CVar_GetS32("gCCVSOAPrimG", 255), CVar_GetS32("gCCVSOAPrimB", 255), 255); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).r,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).g,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).b, 255); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, StoneOfAgony_ori.r, StoneOfAgony_ori.g, StoneOfAgony_ori.b, 255); } } else { if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCVSOAPrimR", 255), CVar_GetS32("gCCVSOAPrimG", 255), CVar_GetS32("gCCVSOAPrimB", 255), DefaultIconA); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).r,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).g,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).b, DefaultIconA); } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, StoneOfAgony_ori.r, StoneOfAgony_ori.g, StoneOfAgony_ori.b, DefaultIconA); } } if (temp == 0 || temp <= 0.1f) { - /*Fail check, it is used to draw off the icon when - link is standing out range but do not refresh unk_6A0. - Also used to make a default value in my case.*/ - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA); + /*Fail check, it is used to draw off the icon when + link is standing out range but do not refresh unk_6A0. + Also used to make a default value in my case.*/ + if (CVar_GetS32("gHudColors", 1) == 2) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).r,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).g,CVar_GetRGB("gCCVSOAPrim", StoneOfAgony_ori).b, DefaultIconA); + } else { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, StoneOfAgony_ori.r, StoneOfAgony_ori.g, StoneOfAgony_ori.b, DefaultIconA); + } } gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); gDPSetOtherMode(OVERLAY_DISP++, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_IA16 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PRIM | G_RM_XLU_SURF | G_RM_XLU_SURF2); diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 2aef4bc64..75cc7ca27 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -1155,6 +1155,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { s16 quadVtxIndex; s16 isActive; s16 pad; + Color_RGB8 Background_Color = { this->windowColor[0], this->windowColor[1], this->windowColor[2] }; OPEN_DISPS(this->state.gfxCtx); @@ -1187,11 +1188,9 @@ void FileChoose_DrawWindowContents(GameState* thisx) { gDPPipeSync(POLY_OPA_DISP++); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->fileInfoAlpha[fileIndex]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->fileInfoAlpha[fileIndex]); } else { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], - this->fileInfoAlpha[fileIndex]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, Background_Color.r, Background_Color.g, Background_Color.b, this->fileInfoAlpha[fileIndex]); } gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[temp], 20, 0); @@ -1210,8 +1209,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { isActive = 0; if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->fileButtonAlpha[i]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->fileButtonAlpha[i]); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[isActive][0], sWindowContentColors[isActive][1], sWindowContentColors[isActive][2], this->fileButtonAlpha[i]); @@ -1224,8 +1222,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { // draw file name box if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->nameBoxAlpha[i]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->nameBoxAlpha[i]); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[isActive][0], sWindowContentColors[isActive][1], sWindowContentColors[isActive][2], this->nameBoxAlpha[i]); @@ -1239,9 +1236,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { // draw disk label for 64DD if (Save_GetSaveMetaInfo(i)->randoSave) { if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), - CVar_GetS32("gCCFileChoosePrimG", 150), CVar_GetS32("gCCFileChoosePrimB", 255), - this->nameAlpha[i]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->nameAlpha[i]); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[isActive][0], sWindowContentColors[isActive][1], sWindowContentColors[isActive][2], @@ -1255,9 +1250,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { // draw connectors if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), - CVar_GetS32("gCCFileChoosePrimG", 150), CVar_GetS32("gCCFileChoosePrimB", 255), - this->connectorAlpha[i]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->connectorAlpha[i]); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[isActive][0], sWindowContentColors[isActive][1], sWindowContentColors[isActive][2], this->connectorAlpha[i]); @@ -1289,8 +1282,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { gDPPipeSync(POLY_OPA_DISP++); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->actionButtonAlpha[i]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->actionButtonAlpha[i]); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], this->actionButtonAlpha[i]); @@ -1308,8 +1300,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { temp = this->confirmButtonTexIndices[i]; if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->confirmButtonAlpha[i]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->confirmButtonAlpha[i]); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], this->confirmButtonAlpha[i]); @@ -1324,8 +1315,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { gDPPipeSync(POLY_OPA_DISP++); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->optionButtonAlpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->optionButtonAlpha); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], this->optionButtonAlpha); @@ -1346,9 +1336,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { PRIMITIVE, 0); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 155), - CVar_GetS32("gCCFileChoosePrimG", 255), CVar_GetS32("gCCFileChoosePrimB", 255), - this->highlightColor[3]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->highlightColor[3]); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->highlightColor[0], this->highlightColor[1], this->highlightColor[2], this->highlightColor[3]); @@ -1383,6 +1371,7 @@ void FileChoose_ConfigModeDraw(GameState* thisx) { f32 eyeX; f32 eyeY; f32 eyeZ; + Color_RGB8 Background_Color = {this->windowColor[0], this->windowColor[1], this->windowColor[2]}; OPEN_DISPS(this->state.gfxCtx); gDPPipeSync(POLY_OPA_DISP++); @@ -1409,8 +1398,7 @@ void FileChoose_ConfigModeDraw(GameState* thisx) { gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->windowAlpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->windowAlpha); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], this->windowAlpha); @@ -1447,8 +1435,7 @@ void FileChoose_ConfigModeDraw(GameState* thisx) { gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->windowAlpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->windowAlpha); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], this->windowAlpha); @@ -1481,8 +1468,7 @@ void FileChoose_ConfigModeDraw(GameState* thisx) { gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->windowAlpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->windowAlpha); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], this->windowAlpha); @@ -1819,6 +1805,7 @@ void FileChoose_SelectModeDraw(GameState* thisx) { f32 eyeX; f32 eyeY; f32 eyeZ; + Color_RGB8 Background_Color = { this->windowColor[0], this->windowColor[1], this->windowColor[2] }; OPEN_DISPS(this->state.gfxCtx); @@ -1842,8 +1829,7 @@ void FileChoose_SelectModeDraw(GameState* thisx) { gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChoosePrimR", 100), CVar_GetS32("gCCFileChoosePrimG", 150), - CVar_GetS32("gCCFileChoosePrimB", 255), this->windowAlpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChoosePrim", Background_Color).r, CVar_GetRGB("gCCFileChoosePrim", Background_Color).g, CVar_GetRGB("gCCFileChoosePrim", Background_Color).b, this->windowAlpha); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], this->windowAlpha); @@ -1892,6 +1878,7 @@ void FileChoose_Main(GameState* thisx) { gFileSelControlsGERTex, gFileSelControlsFRATex, }; + Color_RGB8 Text_Color = { 100, 255, 255 }; FileChooseContext* this = (FileChooseContext*)thisx; Input* input = &this->state.input[0]; @@ -2028,11 +2015,9 @@ void FileChoose_Main(GameState* thisx) { PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetS32("gCCFileChooseTextPrimR", 100), - CVar_GetS32("gCCFileChooseTextPrimG", 255), CVar_GetS32("gCCFileChooseTextPrimB", 255), - this->controlsAlpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, CVar_GetRGB("gCCFileChooseTextPrim", Text_Color).r, CVar_GetRGB("gCCFileChooseTextPrim", Text_Color).g, CVar_GetRGB("gCCFileChooseTextPrim", Text_Color).b, this->controlsAlpha); } else { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 100, 255, 255, this->controlsAlpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, Text_Color.r, Text_Color.g, Text_Color.b, this->controlsAlpha); } gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); gDPLoadTextureBlock(POLY_OPA_DISP++, controlsTextures[gSaveContext.language], G_IM_FMT_IA, G_IM_SIZ_8b, 144, 16, diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c index 163f8c5e4..db0c10360 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c @@ -5,6 +5,14 @@ extern const char* digitTextures[]; void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfxCtx) { + Color_RGB8 A_button_ori = {80, 255, 150}; + Color_RGB8 A_button = CVar_GetRGB("gCCABtnPrim", A_button_ori); + Color_RGB8 C_button_ori = {255, 255, 50}; + Color_RGB8 C_button_uni = CVar_GetRGB("gCCCBtnPrim", C_button_ori); + Color_RGB8 C_button_U = CVar_GetRGB("gCCCUBtnPrim", C_button_ori); + Color_RGB8 C_button_D = CVar_GetRGB("gCCCDBtnPrim", C_button_ori); + Color_RGB8 C_button_L = CVar_GetRGB("gCCCLBtnPrim", C_button_ori); + Color_RGB8 C_button_R = CVar_GetRGB("gCCCRBtnPrim", C_button_ori); static s16 D_8082A070[][4] = { { 255, 0, 0, 255 }, { 255, 70, 0, 150 }, @@ -493,29 +501,30 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx gDPPipeSync(POLY_KAL_DISP++); + s16 Notes_alpha = D_8082A150[sp218]; if (D_8082A124[sp218] == 0) { if (CVar_GetS32("gHudColors", 1) == 0) { // A Button notes - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 150, 255, D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 150, 255, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 255, 150, D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button_ori.r, A_button_ori.g, A_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", 80), CVar_GetS32("gCCABtnPrimG", 255), CVar_GetS32("gCCABtnPrimB", 150), D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button.r, A_button.g, A_button.b, Notes_alpha); } } else { if (CVar_GetS32("gHudColors", 1) == 0) { // C Buttons notes - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 50, D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 50, D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", 255), CVar_GetS32("gCCCBtnPrimG", 160), CVar_GetS32("gCCCBtnPrimB", 0), D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, Notes_alpha); } else if (D_8082A124[sp218] == OCARINA_NOTE_D5 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCUBtnPrimR", 255), CVar_GetS32("gCCCUBtnPrimG", 160), CVar_GetS32("gCCCUBtnPrimB", 0), D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_U.r, C_button_U.g, C_button_U.b, Notes_alpha); } else if (D_8082A124[sp218] == OCARINA_NOTE_B4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCLBtnPrimR", 255), CVar_GetS32("gCCCLBtnPrimG", 160), CVar_GetS32("gCCCLBtnPrimB", 0), D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, Notes_alpha); } else if (D_8082A124[sp218] == OCARINA_NOTE_A4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCRBtnPrimR", 255), CVar_GetS32("gCCCRBtnPrimG", 160), CVar_GetS32("gCCCRBtnPrimB", 0), D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, Notes_alpha); } else if (D_8082A124[sp218] == OCARINA_NOTE_F4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCDBtnPrimR", 255), CVar_GetS32("gCCCDBtnPrimG", 160), CVar_GetS32("gCCCDBtnPrimB", 0), D_8082A150[sp218]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, Notes_alpha); } } @@ -543,29 +552,30 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx gDPPipeSync(POLY_KAL_DISP++); if (pauseCtx->unk_1E4 == 8) { + s16 Notes_alpha = 200; if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == 0) { - if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 150, 255, 200); + if (CVar_GetS32("gHudColors", 1) == 0) { // A Button notes + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 150, 255, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 255, 150, 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button_ori.r, A_button_ori.g, A_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", 80), CVar_GetS32("gCCABtnPrimG", 255), CVar_GetS32("gCCABtnPrimB", 150), 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button.r, A_button.g, A_button.b, Notes_alpha); } } else { - if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 50, 200); + if (CVar_GetS32("gHudColors", 1) == 0) { // C Buttons notes + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 50, 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", 255), CVar_GetS32("gCCCBtnPrimG", 160), CVar_GetS32("gCCCBtnPrimB", 0), 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_D5 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCUBtnPrimR", 255), CVar_GetS32("gCCCUBtnPrimG", 160), CVar_GetS32("gCCCUBtnPrimB", 0), 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_U.r, C_button_U.g, C_button_U.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_B4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCLBtnPrimR", 255), CVar_GetS32("gCCCLBtnPrimG", 160), CVar_GetS32("gCCCLBtnPrimB", 0), 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_A4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCRBtnPrimR", 255), CVar_GetS32("gCCCRBtnPrimG", 160), CVar_GetS32("gCCCRBtnPrimB", 0), 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_F4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCDBtnPrimR", 255), CVar_GetS32("gCCCDBtnPrimG", 160), CVar_GetS32("gCCCDBtnPrimB", 0), 200); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, Notes_alpha); } } } else { @@ -618,27 +628,28 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx gDPPipeSync(POLY_KAL_DISP++); + s16 Notes_alpha = D_8082A150[phi_s3]; if (D_8082A124[phi_s3] == 0) { - if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 150, 255, 200); + if (CVar_GetS32("gHudColors", 1) == 0) { // A Button notes + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 150, 255, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 80, 255, 150, D_8082A150[phi_s3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button_ori.r, A_button_ori.g, A_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", 80), CVar_GetS32("gCCABtnPrimG", 255), CVar_GetS32("gCCABtnPrimB", 150), D_8082A150[phi_s3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button.r, A_button.g, A_button.b, Notes_alpha); } } else { - if (CVar_GetS32("gHudColors", 1) == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 50, 200); + if (CVar_GetS32("gHudColors", 1) == 0) { // C Buttons notes + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, Notes_alpha); + } else if (CVar_GetS32("gHudColors", 1) == 1) { + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, Notes_alpha); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", 255), CVar_GetS32("gCCCBtnPrimG", 255), CVar_GetS32("gCCCBtnPrimB", 0), D_8082A150[phi_s3]); - } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_D5 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCUBtnPrimR", 255), CVar_GetS32("gCCCUBtnPrimG", 255), CVar_GetS32("gCCCUBtnPrimB", 0), D_8082A150[phi_s3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_B4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCLBtnPrimR", 255), CVar_GetS32("gCCCLBtnPrimG", 255), CVar_GetS32("gCCCLBtnPrimB", 0), D_8082A150[phi_s3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_A4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCRBtnPrimR", 255), CVar_GetS32("gCCCRBtnPrimG", 255), CVar_GetS32("gCCCRBtnPrimB", 0), D_8082A150[phi_s3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_F4 && CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCDBtnPrimR", 255), CVar_GetS32("gCCCDBtnPrimG", 255), CVar_GetS32("gCCCDBtnPrimB", 0), D_8082A150[phi_s3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, Notes_alpha); } } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index e3e093129..923dafba7 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -761,6 +761,13 @@ static s16 sCursorColors[][3] = { { 0, 255, 50 }, }; +const Color_RGB8 Cursor_ABTN_ori = {0, 255, 50}; +const Color_RGB8 Cursor_ABTNN64_ori = {0, 50, 255}; +const Color_RGB8 Cursor_CBTN_ori = {255, 255, 0}; +const Color_RGB8 Cursor_StartBTN_ori = {255, 255, 255}; +Color_RGB8 Cursor_ABTN; +Color_RGB8 Cursor_CBTN; + static void* sSavePromptTexs[] = { gPauseSavePromptENGTex, gPauseSavePromptGERTex, @@ -987,26 +994,27 @@ void KaleidoScope_DrawCursor(GlobalContext* globalCtx, u16 pageIndex) { temp = pauseCtx->unk_1E4; if (CVar_GetS32("gHudColors", 1) == 0) { - sCursorColors[1][0] = 255; - sCursorColors[1][1] = 255; - sCursorColors[1][2] = 0; - sCursorColors[2][0] = 0; - sCursorColors[2][1] = 50; - sCursorColors[2][2] = 255; + //Will be converted to ColorRGB later. + sCursorColors[1][0] = Cursor_CBTN_ori.r; + sCursorColors[1][1] = Cursor_CBTN_ori.g; + sCursorColors[1][2] = Cursor_CBTN_ori.b; + sCursorColors[2][0] = Cursor_ABTNN64_ori.r; + sCursorColors[2][1] = Cursor_ABTNN64_ori.g; + sCursorColors[2][2] = Cursor_ABTNN64_ori.b; } else if (CVar_GetS32("gHudColors", 1) == 1) { - sCursorColors[1][0] = 255; - sCursorColors[1][1] = 255; - sCursorColors[1][2] = 0; - sCursorColors[2][0] = 0; - sCursorColors[2][1] = 255; - sCursorColors[2][2] = 50; + sCursorColors[1][0] = Cursor_CBTN_ori.r; + sCursorColors[1][1] = Cursor_CBTN_ori.g; + sCursorColors[1][2] = Cursor_CBTN_ori.b; + sCursorColors[2][0] = Cursor_ABTN_ori.r; + sCursorColors[2][1] = Cursor_ABTN_ori.g; + sCursorColors[2][2] = Cursor_ABTN_ori.b; } else if (CVar_GetS32("gHudColors", 1) == 2) { - sCursorColors[1][0] = CVar_GetS32("gCCCBtnPrimR", 255); - sCursorColors[1][1] = CVar_GetS32("gCCCBtnPrimG", 255); - sCursorColors[1][2] = CVar_GetS32("gCCCBtnPrimB", 0); - sCursorColors[2][0] = CVar_GetS32("gCCABtnPrimR", 0); - sCursorColors[2][1] = CVar_GetS32("gCCABtnPrimG", 255); - sCursorColors[2][2] = CVar_GetS32("gCCABtnPrimB", 50); + sCursorColors[1][0] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).r; + sCursorColors[1][1] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).g; + sCursorColors[1][2] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).b; + sCursorColors[2][0] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).r; + sCursorColors[2][1] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).g; + sCursorColors[2][2] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).b; } if ((((pauseCtx->unk_1E4 == 0) || (temp == 8)) && (pauseCtx->state == 6)) || @@ -1079,45 +1087,46 @@ void KaleidoScope_DrawPages(GlobalContext* globalCtx, GraphicsContext* gfxCtx) { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 255, 255, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 255, 255, 0 }, { 0, 255, 50 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 255, 50 }, }; + const Color_RGB8 A_BTN_ori = {100, 255, 100}; if (CVar_GetS32("gHudColors", 1) == 0) { - D_8082ACF4[4][0] = 255; - D_8082ACF4[4][1] = 255; - D_8082ACF4[4][2] = 0; - D_8082ACF4[7][0] = 255; - D_8082ACF4[7][1] = 255; - D_8082ACF4[7][2] = 0; - D_8082ACF4[8][0] = 0; - D_8082ACF4[8][1] = 50; - D_8082ACF4[8][2] = 255; - D_8082ACF4[11][0] = 0; - D_8082ACF4[11][1] = 50; - D_8082ACF4[11][2] = 255; + D_8082ACF4[4][0] = Cursor_CBTN_ori.r; + D_8082ACF4[4][1] = Cursor_CBTN_ori.g; + D_8082ACF4[4][2] = Cursor_CBTN_ori.b; + D_8082ACF4[7][0] = Cursor_CBTN_ori.r; + D_8082ACF4[7][1] = Cursor_CBTN_ori.g; + D_8082ACF4[7][2] = Cursor_CBTN_ori.b; + D_8082ACF4[8][0] = Cursor_ABTNN64_ori.r; + D_8082ACF4[8][1] = Cursor_ABTNN64_ori.g; + D_8082ACF4[8][2] = Cursor_ABTNN64_ori.b; + D_8082ACF4[11][0] = Cursor_ABTNN64_ori.r; + D_8082ACF4[11][1] = Cursor_ABTNN64_ori.g; + D_8082ACF4[11][2] = Cursor_ABTNN64_ori.b; } else if (CVar_GetS32("gHudColors", 1) == 1) { - D_8082ACF4[4][0] = 255; - D_8082ACF4[4][1] = 255; - D_8082ACF4[4][2] = 0; - D_8082ACF4[7][0] = 255; - D_8082ACF4[7][1] = 255; - D_8082ACF4[7][2] = 0; - D_8082ACF4[8][0] = 0; - D_8082ACF4[8][1] = 255; - D_8082ACF4[8][2] = 50; - D_8082ACF4[11][0] = 0; - D_8082ACF4[11][1] = 255; - D_8082ACF4[11][2] = 50; + D_8082ACF4[4][0] = Cursor_CBTN_ori.r; + D_8082ACF4[4][1] = Cursor_CBTN_ori.g; + D_8082ACF4[4][2] = Cursor_CBTN_ori.b; + D_8082ACF4[7][0] = Cursor_CBTN_ori.r; + D_8082ACF4[7][1] = Cursor_CBTN_ori.g; + D_8082ACF4[7][2] = Cursor_CBTN_ori.b; + D_8082ACF4[8][0] = Cursor_ABTN_ori.r; + D_8082ACF4[8][1] = Cursor_ABTN_ori.g; + D_8082ACF4[8][2] = Cursor_ABTN_ori.b; + D_8082ACF4[11][0] = Cursor_ABTN_ori.r; + D_8082ACF4[11][1] = Cursor_ABTN_ori.g; + D_8082ACF4[11][2] = Cursor_ABTN_ori.b; } else if (CVar_GetS32("gHudColors", 1) == 2) { - D_8082ACF4[4][0] = CVar_GetS32("gCCCBtnPrimR", 255); - D_8082ACF4[4][1] = CVar_GetS32("gCCCBtnPrimG", 255); - D_8082ACF4[4][2] = CVar_GetS32("gCCCBtnPrimB", 0); - D_8082ACF4[7][0] = CVar_GetS32("gCCCBtnPrimR", 255); - D_8082ACF4[7][1] = CVar_GetS32("gCCCBtnPrimG", 255); - D_8082ACF4[7][2] = CVar_GetS32("gCCCBtnPrimB", 0); - D_8082ACF4[8][0] = CVar_GetS32("gCCABtnPrimR", 0); - D_8082ACF4[8][1] = CVar_GetS32("gCCABtnPrimG", 255); - D_8082ACF4[8][2] = CVar_GetS32("gCCABtnPrimB", 50); - D_8082ACF4[11][0] = CVar_GetS32("gCCABtnPrimR", 0); - D_8082ACF4[11][1] = CVar_GetS32("gCCABtnPrimG", 255); - D_8082ACF4[11][2] = CVar_GetS32("gCCABtnPrimB", 50); + D_8082ACF4[4][0] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).r; + D_8082ACF4[4][1] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).g; + D_8082ACF4[4][2] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).b; + D_8082ACF4[7][0] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).r; + D_8082ACF4[7][1] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).g; + D_8082ACF4[7][2] = CVar_GetRGB("gCCCBtnPrim", Cursor_CBTN_ori).b; + D_8082ACF4[8][0] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).r; + D_8082ACF4[8][1] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).g; + D_8082ACF4[8][2] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).b; + D_8082ACF4[11][0] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).r; + D_8082ACF4[11][1] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).g; + D_8082ACF4[11][2] = CVar_GetRGB("gCCABtnPrim", Cursor_ABTN_ori).b; } static s16 D_8082AD3C = 20; static s16 D_8082AD40 = 0; @@ -1499,7 +1508,7 @@ void KaleidoScope_DrawPages(GlobalContext* globalCtx, GraphicsContext* gfxCtx) { } else if (CVar_GetS32("gHudColors", 1) == 1) { gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 100, 255, 100, VREG(61)); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", 100), CVar_GetS32("gCCABtnPrimG", 255), CVar_GetS32("gCCABtnPrimB", 100), VREG(61)); //Save prompt cursor colour + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetRGB("gCCABtnPrim", A_BTN_ori).r, CVar_GetRGB("gCCABtnPrim", A_BTN_ori).g, CVar_GetRGB("gCCABtnPrim", A_BTN_ori).b, VREG(61)); //Save prompt cursor colour } if (pauseCtx->promptChoice == 0) { @@ -1563,6 +1572,14 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { { 0, 255, 100, 255 },//Gamecube { 0, 100, 255, 255 },//Original N64 }; + Color_RGB8 A_button_ori = {gABtnTexColour[0][0],gABtnTexColour[0][1],gABtnTexColour[0][2]}; + Color_RGB8 A_button = CVar_GetRGB("gCCABtnPrim", A_button_ori); + Color_RGB8 C_button_ori = {R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2)}; + Color_RGB8 C_button_uni = CVar_GetRGB("gCCCBtnPrim", C_button_ori); + Color_RGB8 C_button_U = CVar_GetRGB("gCCCUBtnPrim", C_button_ori); + Color_RGB8 C_button_D = CVar_GetRGB("gCCCDBtnPrim", C_button_ori); + Color_RGB8 C_button_L = CVar_GetRGB("gCCCLBtnPrim", C_button_ori); + Color_RGB8 C_button_R = CVar_GetRGB("gCCCRBtnPrim", C_button_ori); static const void* sToEquipTextures[3] = { gPauseToEquipENGTex, gPauseToEquipGERTex, @@ -1889,11 +1906,11 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = D_8082ADE0[gSaveContext.language] << 5; if (CVar_GetS32("gHudColors", 1) == 0) {//A icon to decide in save prompt - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, gABtnTexColour[1][0], gABtnTexColour[1][1], gABtnTexColour[1][2], gABtnTexColour[1][3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, gABtnTexColour[1][0], gABtnTexColour[1][1], gABtnTexColour[1][2], gABtnTexColour[1][3]); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, gABtnTexColour[0][0], gABtnTexColour[0][1], gABtnTexColour[0][2], gABtnTexColour[0][3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, gABtnTexColour[0][0], gABtnTexColour[0][1], gABtnTexColour[0][2], gABtnTexColour[0][3]); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", gABtnTexColour[0][0]), CVar_GetS32("gCCABtnPrimG", gABtnTexColour[0][1]), CVar_GetS32("gCCABtnPrimB", gABtnTexColour[0][2]), gABtnTexColour[0][3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button.r, A_button.g, A_button.b, gABtnTexColour[0][3]); } //gSPDisplayList(POLY_KAL_DISP++, gAButtonIconDL);//This is changed to load the texture only so we can prim color it. gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); @@ -1962,17 +1979,17 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { int height_factor = (1 << 10) * icon_h / height; int width_factor = (1 << 10) * icon_w / width; if (CVar_GetS32("gHudColors", 1) == 2 && CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCBtnPrimB", R_C_BTN_COLOR(2)), 255); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, 255); for (s16 i=0; i < 3; i++) { if (i == 0) { icon_x_offset = width_crop*3-3; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCRBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCRBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCRBtnPrimB", R_C_BTN_COLOR(2)), 255); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, 255); } else if (i == 1) { icon_x_offset = width_crop*2-3; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCDBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCDBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCDBtnPrimB", R_C_BTN_COLOR(2)), 255); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, 255); } else if (i == 2) { icon_x_offset = width_crop; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCLBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCLBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCLBtnPrimB", R_C_BTN_COLOR(2)), 255); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, 255); } gDPLoadTextureBlock(POLY_KAL_DISP++, gCBtnSymbolsTex, G_IM_FMT_IA, G_IM_SIZ_8b, icon_w, icon_h, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); //gSPScisTextureRectangle(POLY_KAL_DISP++,PosX << 2, PosY << 2, (PosX + icon_x_offset) << 2, (PosY + height) << 2, G_TX_RENDERTILE, 0, 0, width_factor, height_factor); @@ -1980,11 +1997,11 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { } } else { if (CVar_GetS32("gHudColors", 1) == 0) {//To equip text C button icon - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), 255); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, 255); } else if (CVar_GetS32("gHudColors", 1) == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), 255); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_ori.r, C_button_ori.g, C_button_ori.b, 255); } else if (CVar_GetS32("gHudColors", 1) == 2 && !CVar_GetS32("gCCparated", 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCCBtnPrimR", R_C_BTN_COLOR(0)), CVar_GetS32("gCCCBtnPrimG", R_C_BTN_COLOR(1)), CVar_GetS32("gCCCBtnPrimB", R_C_BTN_COLOR(2)), 255); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, C_button_uni.r, C_button_uni.g, C_button_uni.b, 255); } gDPLoadTextureBlock(POLY_KAL_DISP++, gCBtnSymbolsTex, G_IM_FMT_IA, G_IM_SIZ_8b, icon_w, icon_h, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSPWideTextureRectangle(POLY_KAL_DISP++, PosX << 2, PosY << 2, (PosX + width) << 2, (PosY + height) << 2, G_TX_RENDERTILE, 0, 0, width_factor, height_factor); @@ -2025,7 +2042,7 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { } else if (CVar_GetS32("gHudColors", 1) == 1) { gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, gABtnTexColour[0][0], gABtnTexColour[0][1], gABtnTexColour[0][2], gABtnTexColour[0][3]); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", gABtnTexColour[0][0]), CVar_GetS32("gCCABtnPrimG", gABtnTexColour[0][1]), CVar_GetS32("gCCABtnPrimB", gABtnTexColour[0][2]), gABtnTexColour[0][3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button.r, A_button.g, A_button.b, gABtnTexColour[0][3]); } //gSPDisplayList(POLY_KAL_DISP++, gAButtonIconDL); gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); @@ -2065,7 +2082,7 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { } else if (CVar_GetS32("gHudColors", 1) == 1) { gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, gABtnTexColour[0][0], gABtnTexColour[0][1], gABtnTexColour[0][2], gABtnTexColour[0][3]); } else if (CVar_GetS32("gHudColors", 1) == 2) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, CVar_GetS32("gCCABtnPrimR", gABtnTexColour[0][0]), CVar_GetS32("gCCABtnPrimG", gABtnTexColour[0][1]), CVar_GetS32("gCCABtnPrimB", gABtnTexColour[0][2]), gABtnTexColour[0][3]); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, A_button.r, A_button.g, A_button.b, gABtnTexColour[0][3]); } gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); From 927ffd0b8b782cd3b4151ff1dc43dae98aeddabc Mon Sep 17 00:00:00 2001 From: Jake Edvenson <77412657+JakeEdvenson@users.noreply.github.com> Date: Tue, 23 Aug 2022 18:30:06 -0600 Subject: [PATCH 183/212] Enhancement: Scarecrow song skip (#1183) * Added Skip Scarecrow Song Added in the option for if the user has the time saver for Scarecrow song enabled and has their Ocarina pulled out in range of Pierre. Added Skip Scarecrow Song New enhancement under time-savers that allows the user to only pull out their ocarina to summon Pierre. * Added Default for Scarecrow summon The scarecrow summon option now defaults to 0 and can be turned on individually. I haven't included it in any other presets so people don't feel like they're cheating. * Checks if scarecrow song is in possession * Fixed positional Scarecrow logic * Fixed style --- libultraship/libultraship/ImGuiImpl.cpp | 4 ++++ soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 79dbef375..6b04209ba 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1301,6 +1301,8 @@ namespace SohImGui { Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); PaddedEnhancementCheckbox("Fast Ocarina Playback", "gFastOcarinaPlayback", true, false); Tooltip("Skip the part where the Ocarina playback is called when you play a song"); + PaddedEnhancementCheckbox("Skip Scarecrow Song", "gSkipScarecrow", true, false); + Tooltip("Pierre appears when Ocarina is pulled out. Requires learning scarecrow song."); PaddedEnhancementCheckbox("Instant Putaway", "gInstantPutaway", true, false); Tooltip("Allow Link to put items away without having to wait around"); PaddedEnhancementCheckbox("Instant Boomerang Recall", "gFastBoomerang", true, false); @@ -2479,6 +2481,8 @@ namespace SohImGui { CVar_SetS32("gVisualAgony", 1); // Pull grave during the day CVar_SetS32("gDayGravePull", 1); + // Pull out Ocarina to Summon Scarecrow + CVar_SetS32("gSkipScarecrow", 0); // Pause link animation (0 to 16) CVar_SetS32("gPauseLiveLink", 16); diff --git a/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c b/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c index 3469d4d6b..a7be7866d 100644 --- a/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c +++ b/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c @@ -118,9 +118,10 @@ void func_80A90264(EnKakasi2* this, GlobalContext* globalCtx) { this->unk_194++; - if ((BREG(1) != 0) && (this->actor.xzDistToPlayer < this->maxSpawnDistance.x) && - (fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < this->maxSpawnDistance.y)) { - + if (((BREG(1) != 0) || ((CVar_GetS32("gSkipScarecrow", 0) != 0) && + (globalCtx->msgCtx.ocarinaAction == OCARINA_ACTION_FREE_PLAY) && gSaveContext.scarecrowSpawnSongSet)) && + (this->actor.xzDistToPlayer < this->maxSpawnDistance.x) && + (fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < this->maxSpawnDistance.y)){ this->actor.draw = func_80A90948; Collider_InitCylinder(globalCtx, &this->collider); Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit); From 3792b03a7d2d6520219dd29066822cc39e0d718a Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 23 Aug 2022 20:00:24 -0400 Subject: [PATCH 184/212] Cleans up InputEditor class. --- libultraship/libultraship/ImGuiImpl.cpp | 16 +++++++++++++--- libultraship/libultraship/InputEditor.cpp | 14 +++++++++++++- libultraship/libultraship/InputEditor.h | 12 ++++++++---- libultraship/libultraship/Window.cpp | 2 +- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 6b04209ba..ed3287a5c 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -165,8 +165,14 @@ namespace SohImGui { } else { console->Close(); } - SohImGui::controller->Opened = CVar_GetS32("gControllerConfigurationEnabled", 0); - UpdateAudio(); + + if (CVar_GetS32("gControllerConfigurationEnabled", 0)) { + controller->Open(); + } else { + controller->Close(); + } + + UpdateAudio(); }); } @@ -1096,7 +1102,11 @@ namespace SohImGui { bool currentValue = CVar_GetS32("gControllerConfigurationEnabled", 0); CVar_SetS32("gControllerConfigurationEnabled", !currentValue); needs_save = true; - controller->Opened = CVar_GetS32("gControllerConfigurationEnabled", 0); + if (CVar_GetS32("gControllerConfigurationEnabled", 0)) { + controller->Open(); + } else { + controller->Close(); + } } ImGui::PopStyleColor(1); ImGui::PopStyleVar(3); diff --git a/libultraship/libultraship/InputEditor.cpp b/libultraship/libultraship/InputEditor.cpp index a6754045f..156eafae3 100644 --- a/libultraship/libultraship/InputEditor.cpp +++ b/libultraship/libultraship/InputEditor.cpp @@ -20,7 +20,7 @@ namespace Ship { return controlDeck->GetPhysicalDeviceFromVirtualSlot(slot); } - void InputEditor::DrawButton(const char* label, int n64Btn) { + void InputEditor::DrawButton(const char* label, int32_t n64Btn) { const std::shared_ptr backend = GetControllerPerSlot(CurrentPort); float size = 40; @@ -357,4 +357,16 @@ namespace Ship { ImGui::End(); } + + bool InputEditor::IsOpened() { + return Opened; + } + + void InputEditor::Open() { + Opened = true; + } + + void InputEditor::Close() { + Opened = false; + } } diff --git a/libultraship/libultraship/InputEditor.h b/libultraship/libultraship/InputEditor.h index 81b1997ec..50b059e2d 100644 --- a/libultraship/libultraship/InputEditor.h +++ b/libultraship/libultraship/InputEditor.h @@ -1,18 +1,22 @@ #pragma once +#include "stdint.h" #include "Lib/ImGui/imgui.h" namespace Ship { class InputEditor { - int CurrentPort = 0; - int BtnReading = -1; - public: + int32_t CurrentPort = 0; + int32_t BtnReading = -1; bool Opened = false; + public: void Init(); - void DrawButton(const char* label, int n64Btn); + void DrawButton(const char* label, int32_t n64Btn); void DrawVirtualStick(const char* label, ImVec2 stick); void DrawControllerSchema(); void DrawHud(); + bool IsOpened(); + void Open(); + void Close(); }; } diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 81ccb68cc..666c1e0c0 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -86,7 +86,7 @@ extern "C" { pad->gyro_x = 0; pad->gyro_y = 0; - if (SohImGui::controller->Opened) return; + if (SohImGui::controller->IsOpened()) return; Ship::Window::GetInstance()->GetControlDeck()->WriteToPad(pad); Ship::ExecuteHooks(pad); From b774252f0c138eaafdf337957c23460a40e70a45 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 23 Aug 2022 20:07:14 -0400 Subject: [PATCH 185/212] ResourceMgr now decreases priority of load messages to trace. --- libultraship/libultraship/ResourceMgr.cpp | 66 ++++++++++------------- libultraship/libultraship/ResourceMgr.h | 2 +- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/libultraship/libultraship/ResourceMgr.cpp b/libultraship/libultraship/ResourceMgr.cpp index 58f1a8a83..6c6a0175f 100644 --- a/libultraship/libultraship/ResourceMgr.cpp +++ b/libultraship/libultraship/ResourceMgr.cpp @@ -14,8 +14,9 @@ namespace Ship { gameVersion = OOT_UNKNOWN; - if (OTR->IsMainMPQValid()) + if (OTR->IsMainMPQValid()) { Start(); + } } ResourceMgr::~ResourceMgr() { @@ -87,10 +88,11 @@ namespace Ship { OTR->LoadFile(ToLoad->path, true, ToLoad); - if (!ToLoad->bHasLoadError) + if (!ToLoad->bHasLoadError) { FileCache[ToLoad->path] = ToLoad->bIsLoaded && !ToLoad->bHasLoadError ? ToLoad : nullptr; + } - SPDLOG_DEBUG("Loaded File {} on ResourceMgr thread", ToLoad->path); + SPDLOG_TRACE("Loaded File {} on ResourceMgr thread", ToLoad->path); ToLoad->FileLoadNotifier.notify_all(); } @@ -123,12 +125,10 @@ namespace Ship { } } - if (!ToLoad->file->bHasLoadError) - { + if (!ToLoad->file->bHasLoadError) { auto UnmanagedRes = ResourceLoader::LoadResource(ToLoad->file); - if (UnmanagedRes != nullptr) - { + if (UnmanagedRes != nullptr) { UnmanagedRes->resMgr = this; auto Res = std::shared_ptr(UnmanagedRes); @@ -142,17 +142,14 @@ namespace Ship { SPDLOG_DEBUG("Loaded Resource {} on ResourceMgr thread", ToLoad->file->path); Res->file = nullptr; - } - else { + } else { ToLoad->bHasResourceLoaded = false; ToLoad->resource = nullptr; SPDLOG_ERROR("Resource load FAILED {} on ResourceMgr thread", ToLoad->file->path); } } - } - else - { + } else { ToLoad->bHasResourceLoaded = false; ToLoad->resource = nullptr; } @@ -163,13 +160,11 @@ namespace Ship { SPDLOG_INFO("Resource Manager LoadResourceThread ended"); } - uint32_t ResourceMgr::GetGameVersion() - { + uint32_t ResourceMgr::GetGameVersion() { return gameVersion; } - void ResourceMgr::SetGameVersion(uint32_t newGameVersion) - { + void ResourceMgr::SetGameVersion(uint32_t newGameVersion) { gameVersion = newGameVersion; } @@ -206,24 +201,23 @@ namespace Ship { auto resCacheFind = ResourceCache.find(FilePath); if (resCacheFind != ResourceCache.end() && - resCacheFind->second.use_count() > 0) - { + resCacheFind->second.use_count() > 0) { return resCacheFind->second; - } - else + } else { return nullptr; + } } std::shared_ptr ResourceMgr::LoadResource(const char* FilePath) { auto Res = LoadResourceAsync(FilePath); - if (std::holds_alternative>(Res)) + if (std::holds_alternative>(Res)) { return std::get>(Res); + } auto& Promise = std::get>(Res); - if (!Promise->bHasResourceLoaded) - { + if (!Promise->bHasResourceLoaded) { std::unique_lock Lock(Promise->resourceLoadMutex); while (!Promise->bHasResourceLoaded) { Promise->resourceLoadNotifier.wait(Lock); @@ -234,8 +228,9 @@ namespace Ship { } std::variant, std::shared_ptr> ResourceMgr::LoadResourceAsync(const char* FilePath) { - if (FilePath[0] == '_' && FilePath[1] == '_' && FilePath[2] == 'O' && FilePath[3] == 'T' && FilePath[4] == 'R' && FilePath[5] == '_' && FilePath[6] == '_') + if (FilePath[0] == '_' && FilePath[1] == '_' && FilePath[2] == 'O' && FilePath[3] == 'T' && FilePath[4] == 'R' && FilePath[5] == '_' && FilePath[6] == '_') { FilePath += 7; + } const std::lock_guard ResLock(ResourceLoadMutex); auto resCacheFind = ResourceCache.find(FilePath); @@ -248,21 +243,16 @@ namespace Ship { std::shared_ptr FileData = LoadFile(FilePath); Promise->file = FileData; - if (Promise->file->bHasLoadError) - { + if (Promise->file->bHasLoadError) { Promise->bHasResourceLoaded = true; - } - else - { + } else { Promise->bHasResourceLoaded = false; ResourceLoadQueue.push(Promise); ResourceLoadNotifier.notify_all(); } return Promise; - } - else - { + } else { return resCacheFind->second; } } @@ -273,8 +263,7 @@ namespace Ship { for (DWORD i = 0; i < fileList.size(); i++) { auto resource = LoadResourceAsync(fileList.operator[](i).cFileName); - if (std::holds_alternative>(resource)) - { + if (std::holds_alternative>(resource)) { auto promise = std::make_shared(); promise->bHasResourceLoaded = true; promise->resource = std::get>(resource); @@ -304,8 +293,7 @@ namespace Ship { return LoadedList; } - std::shared_ptr>> ResourceMgr::DirtyDirectory(std::string SearchMask) - { + std::shared_ptr>> ResourceMgr::DirtyDirectory(std::string& SearchMask) { auto PromiseList = CacheDirectoryAsync(SearchMask); auto LoadedList = std::make_shared>>(); @@ -317,8 +305,9 @@ namespace Ship { Promise->resourceLoadNotifier.wait(Lock); } - if (Promise->resource != nullptr) + if (Promise->resource != nullptr) { Promise->resource->isDirty = true; + } LoadedList->push_back(Promise->resource); } @@ -326,8 +315,7 @@ namespace Ship { return LoadedList; } - std::shared_ptr> ResourceMgr::ListFiles(std::string SearchMask) - { + std::shared_ptr> ResourceMgr::ListFiles(std::string SearchMask) { auto result = std::make_shared>(); auto fileList = OTR->ListFiles(SearchMask); diff --git a/libultraship/libultraship/ResourceMgr.h b/libultraship/libultraship/ResourceMgr.h index 0d9f40f86..404933ceb 100644 --- a/libultraship/libultraship/ResourceMgr.h +++ b/libultraship/libultraship/ResourceMgr.h @@ -40,7 +40,7 @@ namespace Ship { std::variant, std::shared_ptr> LoadResourceAsync(const char* FilePath); std::shared_ptr>> CacheDirectory(const std::string& SearchMask); std::shared_ptr>> CacheDirectoryAsync(const std::string& SearchMask); - std::shared_ptr>> DirtyDirectory(std::string SearchMask); + std::shared_ptr>> DirtyDirectory(std::string& SearchMask); std::shared_ptr> ListFiles(std::string SearchMask); protected: From 0573a1b2ac31b55bc2c5d50e50da1421643cf7d8 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 23 Aug 2022 20:22:33 -0400 Subject: [PATCH 186/212] Adds const to DirtyDirectory std::string --- libultraship/libultraship/ResourceMgr.cpp | 2 +- libultraship/libultraship/ResourceMgr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ResourceMgr.cpp b/libultraship/libultraship/ResourceMgr.cpp index 6c6a0175f..4ca77708a 100644 --- a/libultraship/libultraship/ResourceMgr.cpp +++ b/libultraship/libultraship/ResourceMgr.cpp @@ -293,7 +293,7 @@ namespace Ship { return LoadedList; } - std::shared_ptr>> ResourceMgr::DirtyDirectory(std::string& SearchMask) { + std::shared_ptr>> ResourceMgr::DirtyDirectory(const std::string& SearchMask) { auto PromiseList = CacheDirectoryAsync(SearchMask); auto LoadedList = std::make_shared>>(); diff --git a/libultraship/libultraship/ResourceMgr.h b/libultraship/libultraship/ResourceMgr.h index 404933ceb..e0b0c07cf 100644 --- a/libultraship/libultraship/ResourceMgr.h +++ b/libultraship/libultraship/ResourceMgr.h @@ -40,7 +40,7 @@ namespace Ship { std::variant, std::shared_ptr> LoadResourceAsync(const char* FilePath); std::shared_ptr>> CacheDirectory(const std::string& SearchMask); std::shared_ptr>> CacheDirectoryAsync(const std::string& SearchMask); - std::shared_ptr>> DirtyDirectory(std::string& SearchMask); + std::shared_ptr>> DirtyDirectory(const std::string& SearchMask); std::shared_ptr> ListFiles(std::string SearchMask); protected: From 28afbec341619dc9e996a75c25456313e37b7266 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 23 Aug 2022 21:12:21 -0400 Subject: [PATCH 187/212] Adds support for custom drawing functions, and adds one for Small Keys and Boss Keys. --- soh/CMakeLists.txt | 2 + .../Enhancements/item-tables/ItemTableTypes.h | 17 ++- soh/soh/Enhancements/randomizer/draw.cpp | 114 ++++++++++++++++++ soh/soh/Enhancements/randomizer/draw.h | 12 ++ .../Enhancements/randomizer/randomizer.cpp | 6 + soh/src/code/z_en_item00.c | 12 +- soh/src/code/z_player_lib.c | 6 +- 7 files changed, 162 insertions(+), 7 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/draw.cpp create mode 100644 soh/soh/Enhancements/randomizer/draw.h diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index a8693eb35..67308ec1a 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -181,6 +181,7 @@ set(Header_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer_item_tracker.h" "soh/Enhancements/randomizer/adult_trade_shuffle.h" "soh/Enhancements/randomizer/randomizer_check_objects.h" + "soh/Enhancements/randomizer/draw.h" ) source_group("Header Files\\soh\\Enhancements\\randomizer" FILES ${Header_Files__soh__Enhancements__randomizer}) @@ -288,6 +289,7 @@ set(Source_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer_item_tracker.cpp" "soh/Enhancements/randomizer/adult_trade_shuffle.c" "soh/Enhancements/randomizer/randomizer_check_objects.cpp" + "soh/Enhancements/randomizer/draw.cpp" ) source_group("Source Files\\soh\\Enhancements\\randomizer" FILES ${Source_Files__soh__Enhancements__randomizer}) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 7e5f1a9a3..f10d94dc2 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -7,12 +7,20 @@ #define CHEST_ANIM_LONG 1 #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true } + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, NULL } #define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false } + { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false, NULL } -typedef struct { +#define GET_ITEM_CUSTOM_DRAW(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId, drawFunc) \ + { itemId, field (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, drawFunc } + +typedef struct GlobalContext GlobalContext; +typedef struct GetItemEntry GetItemEntry; + +typedef void (*CustomDrawFunc)(GlobalContext* globalCtx, GetItemEntry* getItemEntry); + +typedef struct GetItemEntry { /* 0x00 */ uint16_t itemId; /* 0x01 */ uint16_t field; // various bit-packed data /* 0x02 */ int16_t gi; // defines the draw id and chest opening animation @@ -22,4 +30,5 @@ typedef struct { /* 0x08 */ int16_t getItemId; /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. -} GetItemEntry; // size = 0x0F + CustomDrawFunc drawFunc; +}; // size = 0x0F diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp new file mode 100644 index 000000000..fbf97c671 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -0,0 +1,114 @@ +#include "draw.h" +#include "z64.h" +#include "macros.h" +#include "functions.h" +#include "randomizerTypes.h" +#include +#include "objects/object_gi_key/object_gi_key.h" +#include "objects/object_gi_bosskey/object_gi_bosskey.h" + +extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry) { + s32 pad; + + std::array color; + switch(getItemEntry->getItemId) { + case RG_FOREST_TEMPLE_SMALL_KEY: + color = {4, 195, 46}; + break; + case RG_FIRE_TEMPLE_SMALL_KEY: + color = {237, 95, 95}; + break; + case RG_WATER_TEMPLE_SMALL_KEY: + color = {85, 180, 223}; + break; + case RG_SPIRIT_TEMPLE_SMALL_KEY: + color = {222, 158, 47}; + break; + case RG_SHADOW_TEMPLE_SMALL_KEY: + color = {126, 16, 177}; + break; + case RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY: + color = {221, 212, 60}; + break; + case RG_BOTTOM_OF_THE_WELL_SMALL_KEY: + color = {227, 110, 255}; + break; + case RG_GANONS_CASTLE_SMALL_KEY: + color = {80, 80, 80}; + break; + } + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_80093D18(globalCtx->state.gfxCtx); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gsDPSetGrayscaleColor(POLY_OPA_DISP++, color[0], color[1], color[2], 255); + gsSPGrayscale(POLY_OPA_DISP++, true); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); + + gsSPGrayscale(POLY_OPA_DISP++, false); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry) { + s32 pad; + s16 color_slot; + color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_BOSS_KEY; + s16 colors[6][3] = { + { 4, 195, 46 }, // Forest Temple + { 237, 95, 95 }, // Fire Temple + { 85, 180, 223 }, // Water Temple + { 222, 158, 47 }, // Spirit Temple + { 126, 16, 177 }, // Shadow Temple + { 210, 0, 0 } // Ganon's Castle + }; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_80093D18(globalCtx->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + if (color_slot == 5) { // Ganon's Boss Key + gsDPSetGrayscaleColor(POLY_OPA_DISP++, 80, 80, 80, 255); + gsSPGrayscale(POLY_OPA_DISP++, true); + } + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBossKeyDL); + + if (color_slot == 5) { // Ganon's Boss Key + gsSPGrayscale(POLY_OPA_DISP++, false); + } + + func_80093D84(globalCtx->state.gfxCtx); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + if (color_slot >= 0) { + gsDPSetGrayscaleColor(POLY_XLU_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], + 255); + gsSPGrayscale(POLY_XLU_DISP++, true); + } + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL); + + if (color_slot >= 0) { + gsSPGrayscale(POLY_XLU_DISP++, false); + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h new file mode 100644 index 000000000..a703fb600 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -0,0 +1,12 @@ +#ifndef RANDODRAW_H +#define RANDODRAW_H +#pragma once + +#include "../item-tables/ItemTableTypes.h" + +typedef struct GlobalContext GlobalContext; + +extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry); +extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry); + +#endif \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 60c198ed4..dbb441702 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -20,6 +20,7 @@ #include #include "randomizer_check_objects.h" #include +#include "draw.h" using json = nlohmann::json; using namespace std::literals::string_literals; @@ -3889,6 +3890,11 @@ void InitRandoItemTable() { ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, extendedVanillaGetItemTable[i].getItemId, extendedVanillaGetItemTable[i]); } for (int i = 0; i < ARRAY_COUNT(randoGetItemTable); i++) { + if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_SMALL_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_SMALL_KEY) { + randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawSmallKey; + } else if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_BOSS_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_BOSS_KEY) { + randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawBossKey; + } ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); } } diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index a50c74e87..60e33b0bd 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1360,7 +1360,11 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, randoGetItemEntry.gid); + if (randoGetItemEntry.drawFunc != NULL) { + randoGetItemEntry.drawFunc(globalCtx, &randoGetItemEntry); + } else { + GetItem_Draw(globalCtx, randoGetItemEntry.gid); + } } else { s32 texIndex = this->actor.params - 3; @@ -1419,7 +1423,11 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, randoGetItemEntry.gid); + if (randoGetItemEntry.drawFunc != NULL) { + randoGetItemEntry.drawFunc(globalCtx, &randoGetItemEntry); + } else { + GetItem_Draw(globalCtx, randoGetItemEntry.gid); + } } else { s32 pad; diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 99425bd8d..f30c493da 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1170,7 +1170,11 @@ void Player_DrawGetItemImpl(GlobalContext* globalCtx, Player* this, Vec3f* refPo Matrix_RotateZYX(0, globalCtx->gameplayFrames * 1000, 0, MTXMODE_APPLY); Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); - GetItem_Draw(globalCtx, drawIdPlusOne - 1); + if(this->getItemEntry.drawFunc != NULL) { + this->getItemEntry.drawFunc(globalCtx, &this->getItemEntry); + } else { + GetItem_Draw(globalCtx, drawIdPlusOne - 1); + } CLOSE_DISPS(globalCtx->state.gfxCtx); } From a8def1fca835243348fd474b92c922aea1269c5b Mon Sep 17 00:00:00 2001 From: briaguya Date: Tue, 23 Aug 2022 21:13:47 -0400 Subject: [PATCH 188/212] fix old reference to GlobalCtx2 --- soh/soh/Enhancements/randomizer/3drando/rando_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index 9cd4b5315..da91fcd9b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -19,7 +19,7 @@ void RandoMain::GenerateRando(std::unordered_map cvarS // std::string settingsFileName = "./randomizer/latest_settings.json"; // CVar_SetString("gLoadedPreset", settingsFileName.c_str()); - std::string fileName = Ship::GlobalCtx2::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings, excludedLocations).c_str()); + std::string fileName = Ship::Window::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings, excludedLocations).c_str()); CVar_SetString("gSpoilerLog", fileName.c_str()); CVar_Save(); From c7b998b33b034270a29e21861984a9df4d2964bc Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 23 Aug 2022 23:48:14 -0400 Subject: [PATCH 189/212] Implements better way to use new draw functions and adds Double Defense colors. --- soh/include/functions.h | 1 + soh/soh/Enhancements/randomizer/draw.cpp | 74 ++++++++++--------- soh/soh/Enhancements/randomizer/draw.h | 1 + .../Enhancements/randomizer/randomizer.cpp | 2 + soh/src/code/z_draw.c | 12 +++ soh/src/code/z_en_item00.c | 18 ++--- .../actors/ovl_Demo_Effect/z_demo_effect.c | 4 + .../actors/ovl_En_Ex_Item/z_en_ex_item.c | 4 +- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 2 +- .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 4 +- .../ovl_Item_Etcetera/z_item_etcetera.c | 7 +- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 2 +- 12 files changed, 75 insertions(+), 56 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index a458505e7..d3c5cfe2b 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -859,6 +859,7 @@ void Cutscene_HandleEntranceTriggers(GlobalContext* globalCtx); void Cutscene_HandleConditionalTriggers(GlobalContext* globalCtx); void Cutscene_SetSegment(GlobalContext* globalCtx, void* segment); void GetItem_Draw(GlobalContext* globalCtx, s16 drawId); +void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry); void SoundSource_InitAll(GlobalContext* globalCtx); void SoundSource_UpdateAll(GlobalContext* globalCtx); void SoundSource_PlaySfxAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* pos, s32 duration, u16 sfxId); diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index fbf97c671..05cbe0165 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -6,49 +6,31 @@ #include #include "objects/object_gi_key/object_gi_key.h" #include "objects/object_gi_bosskey/object_gi_bosskey.h" +#include "objects/object_gi_hearts/object_gi_hearts.h" extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry) { s32 pad; - - std::array color; - switch(getItemEntry->getItemId) { - case RG_FOREST_TEMPLE_SMALL_KEY: - color = {4, 195, 46}; - break; - case RG_FIRE_TEMPLE_SMALL_KEY: - color = {237, 95, 95}; - break; - case RG_WATER_TEMPLE_SMALL_KEY: - color = {85, 180, 223}; - break; - case RG_SPIRIT_TEMPLE_SMALL_KEY: - color = {222, 158, 47}; - break; - case RG_SHADOW_TEMPLE_SMALL_KEY: - color = {126, 16, 177}; - break; - case RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY: - color = {221, 212, 60}; - break; - case RG_BOTTOM_OF_THE_WELL_SMALL_KEY: - color = {227, 110, 255}; - break; - case RG_GANONS_CASTLE_SMALL_KEY: - color = {80, 80, 80}; - break; - } + + s16 color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_SMALL_KEY; + s16 colors[8][3] = { + { 4, 195, 46 }, // Forest Temple + { 237, 95, 95 }, // Fire Temple + { 85, 180, 223 }, // Water Temple + { 222, 158, 47 }, // Spirit Temple + { 126, 16, 177 }, // Shadow Temple + { 221, 212, 60 }, // Gerudo Training Grounds + { 227, 110, 255 }, // Bottom of the Well + { 80, 80, 80 } // Ganon's Castle + }; OPEN_DISPS(globalCtx->state.gfxCtx); func_80093D18(globalCtx->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - gsDPSetGrayscaleColor(POLY_OPA_DISP++, color[0], color[1], color[2], 255); + gsDPSetGrayscaleColor(POLY_OPA_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); gsSPGrayscale(POLY_OPA_DISP++, true); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); @@ -74,8 +56,6 @@ extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* g OPEN_DISPS(globalCtx->state.gfxCtx); func_80093D18(globalCtx->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); @@ -92,8 +72,6 @@ extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* g } func_80093D84(globalCtx->state.gfxCtx); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); @@ -110,5 +88,29 @@ extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* g gsSPGrayscale(POLY_XLU_DISP++, false); } + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEntry getItemEntry) { + s32 pad; + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_80093D84(globalCtx->state.gfxCtx); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + // if (drawId == doubleDef) { + gsDPSetGrayscaleColor(POLY_XLU_DISP++, 255, 255, 255, 255); + gsSPGrayscale(POLY_XLU_DISP++, true); + // } + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartBorderDL); + + // if (drawId == doubleDef) { + gsSPGrayscale(POLY_XLU_DISP++, false); + // } + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartContainerDL); + CLOSE_DISPS(globalCtx->state.gfxCtx); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index a703fb600..a38e99589 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -8,5 +8,6 @@ typedef struct GlobalContext GlobalContext; extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry); extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry); +extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEntry getItemEntry); #endif \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index dbb441702..aa0427d7f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3894,6 +3894,8 @@ void InitRandoItemTable() { randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawSmallKey; } else if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_BOSS_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_BOSS_KEY) { randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawBossKey; + } else if (randoGetItemTable[i].itemId == RG_DOUBLE_DEFENSE) { + randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawDoubleDefense; } ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); } diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index 60c3a7ee4..d85521efa 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -395,6 +395,18 @@ void GetItem_Draw(GlobalContext* globalCtx, s16 drawId) { sDrawItemTable[drawId].drawFunc(globalCtx, drawId); } +/** + * Draw "Get Item" Model from a `GetItemEntry` + * Uses the Custom Draw Function if it exists, or just calls `GetItem_Draw` + */ +void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry) { + if (getItemEntry.drawFunc != NULL) { + getItemEntry.drawFunc(globalCtx, &getItemEntry); + } else { + GetItem_Draw(globalCtx, getItemEntry.gid); + } +} + // All remaining functions in this file are draw functions referenced in the table and called by the function above /* 0x0178 */ u8 primXluColor[3]; diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 60e33b0bd..7843583c2 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1272,7 +1272,7 @@ void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetI color_slot = 0; break; case RG_DOUBLE_DEFENSE: - color_slot = 1; + color_slot = 8; break; default: return; @@ -1284,14 +1284,14 @@ void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetI s16* colors[9][3] = { { 34, 255, 76 }, // Minuet and Magic Upgrades Colors - { 177, 35, 35 }, // Bolero and Double Defense Colors + { 177, 35, 35 }, // Bolero Colors { 115, 251, 253 }, // Serenade Color { 177, 122, 35 }, // Requiem Color { 177, 28, 212 }, // Nocturne Color { 255, 255, 92 }, // Prelude Color { 31, 152, 49 }, // Stick Upgrade Color { 222, 182, 20 }, // Nut Upgrade Color - { 255, 255, 255 } // White Color placeholder + { 255, 255, 255 } // Double Defense Color }; s16* colorsEnv[9][3] = { @@ -1360,11 +1360,7 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - if (randoGetItemEntry.drawFunc != NULL) { - randoGetItemEntry.drawFunc(globalCtx, &randoGetItemEntry); - } else { - GetItem_Draw(globalCtx, randoGetItemEntry.gid); - } + GetItemEntry_Draw(globalCtx, randoGetItemEntry); } else { s32 texIndex = this->actor.params - 3; @@ -1423,11 +1419,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - if (randoGetItemEntry.drawFunc != NULL) { - randoGetItemEntry.drawFunc(globalCtx, &randoGetItemEntry); - } else { - GetItem_Draw(globalCtx, randoGetItemEntry.gid); - } + GetItemEntry_Draw(globalCtx, randoGetItemEntry); } else { s32 pad; diff --git a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index 8d81b41c4..12c42358b 100644 --- a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -2089,6 +2089,10 @@ void DemoEffect_DrawGetItem(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_BARINADE, RG_ZORA_SAPPHIRE); this->getItem.drawId = getItemEntry.gid; + func_8002EBCC(thisx, globalCtx, 0); + func_8002ED80(thisx, globalCtx, 0); + GetItemEntry_Draw(globalCtx, getItemEntry); + return; } func_8002EBCC(thisx, globalCtx, 0); func_8002ED80(thisx, globalCtx, 0); diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 0cbc370af..495f80270 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -524,6 +524,8 @@ void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx) { } EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + GetItemEntry_Draw(globalCtx, randoGetItem); + return; } GetItem_Draw(globalCtx, this->giDrawId); @@ -536,7 +538,7 @@ void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx) { GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - GetItem_Draw(globalCtx, randoGetItem.gid); + GetItemEntry_Draw(globalCtx, randoGetItem); } else { GetItem_Draw(globalCtx, GID_HEART_PIECE); } diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index a9c3cb258..36fc46abb 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -184,7 +184,7 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { f32 mtxScale = 1.5f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); } - GetItem_Draw(globalCtx, getItem.gid); + GetItemEntry_Draw(globalCtx, getItem); } } diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index 304c3053d..f4181146a 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -99,8 +99,8 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) { } if (gSaveContext.n64ddFlag) { - GetItem_Draw(globalCtx, Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, - this->actor.id,this->actor.params, globalCtx->sceneNum).gid); + GetItemEntry_Draw(globalCtx, Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, + this->actor.id,this->actor.params, globalCtx->sceneNum)); } else { if (flag) { func_80093D84(globalCtx->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index eb6efef7b..c8e57237f 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -233,7 +233,7 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, GlobalContext* globalCtx) { GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, globalCtx); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); if (randoGetItem.itemId != ITEM_NONE) { - GetItem_Draw(globalCtx, randoGetItem.gid); + GetItemEntry_Draw(globalCtx, randoGetItem); return; } } @@ -257,7 +257,10 @@ void ItemEtcetera_Draw(Actor* thisx, GlobalContext* globalCtx) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); if (randoGetItem.itemId != RG_NONE) { - this->giDrawId = randoGetItem.gid; + func_8002EBCC(&this->actor, globalCtx, 0); + func_8002ED80(&this->actor, globalCtx, 0); + GetItemEntry_Draw(globalCtx, randoGetItem); + return; } } diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index a8db425da..1cc8752cb 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -218,7 +218,7 @@ void ItemOcarina_Draw(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - GetItem_Draw(globalCtx, randoGetItem.gid); + GetItemEntry_Draw(globalCtx, randoGetItem); return; } From 6561073c7b98289e59397e7c3dd4819b621bd2cb Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 24 Aug 2022 00:07:16 -0400 Subject: [PATCH 190/212] Implements ImGui Checkbox to enable or disable color-coded-keys. --- libultraship/libultraship/ImGuiImpl.cpp | 3 +++ soh/src/code/z_draw.c | 2 +- soh/src/code/z_player_lib.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index cac675a93..8ba847ea3 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1903,6 +1903,9 @@ namespace SohImGui { "(medallions/stones/songs). Note that these fanfares\n" "are longer than usual." ); + PaddedEnhancementCheckbox("Key Colors Match Dungeon", "gRandoMatchKeyColors", true, false); + Tooltip( + "Matches the color of small keys and boss keys to the dungeon they belong to. This helps identify keys from afar and adds a little bit of flair."); ImGui::EndMenu(); } diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index d85521efa..2751f4716 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -400,7 +400,7 @@ void GetItem_Draw(GlobalContext* globalCtx, s16 drawId) { * Uses the Custom Draw Function if it exists, or just calls `GetItem_Draw` */ void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry) { - if (getItemEntry.drawFunc != NULL) { + if (getItemEntry.drawFunc != NULL && CVar_GetS32("gRandoMatchKeyColors", 0)) { getItemEntry.drawFunc(globalCtx, &getItemEntry); } else { GetItem_Draw(globalCtx, getItemEntry.gid); diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index f30c493da..203585331 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1170,7 +1170,7 @@ void Player_DrawGetItemImpl(GlobalContext* globalCtx, Player* this, Vec3f* refPo Matrix_RotateZYX(0, globalCtx->gameplayFrames * 1000, 0, MTXMODE_APPLY); Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); - if(this->getItemEntry.drawFunc != NULL) { + if (this->getItemEntry.drawFunc != NULL && CVar_GetS32("gRandoMatchKeyColors", 0)) { this->getItemEntry.drawFunc(globalCtx, &this->getItemEntry); } else { GetItem_Draw(globalCtx, drawIdPlusOne - 1); From e3ae302a64fc33abffda83736eb6b26da1dd1c69 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 24 Aug 2022 00:17:47 -0400 Subject: [PATCH 191/212] Adds padding to a few checkboxes in rando menu that were missing it --- libultraship/libultraship/ImGuiImpl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 9b10e7a6d..e46e29aac 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -2000,13 +2000,13 @@ namespace SohImGui { if (ImGui::BeginMenu("Rando Enhancements")) { - EnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares"); + PaddedEnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares"); Tooltip( "Play unique fanfares when obtaining quest items\n" "(medallions/stones/songs). Note that these fanfares\n" "are longer than usual." ); - EnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi"); + PaddedEnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi"); Tooltip( "Replace Navi's overworld quest hints with rando-\n" "related gameplay hints.\n" From 684cd862f136b0c06285271a016ff731e71d3587 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 24 Aug 2022 15:29:45 +0200 Subject: [PATCH 192/212] Renamed function --- soh/soh/Enhancements/randomizer/randomizer.cpp | 8 ++++---- soh/soh/Enhancements/randomizer/randomizer.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a0d7a42d4..cbfd6eeab 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4670,7 +4670,7 @@ void CreateRupeeMessages() { } } -std::string Randomizer::InsertRupeeName(std::string message, int language) { +std::string Randomizer::RandomizeRupeeName(std::string message, int language) { int randomIndex; std::string replaceWith; switch (language) { @@ -4698,9 +4698,9 @@ std::string Randomizer::InsertRupeeName(std::string message, int language) { CustomMessageEntry Randomizer::GetRupeeMessage(u16 rupeeTextId) { CustomMessageEntry messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); - messageEntry.english = Randomizer::InsertRupeeName(messageEntry.english, LANGUAGE_ENG); - messageEntry.german = Randomizer::InsertRupeeName(messageEntry.german, LANGUAGE_GER); - messageEntry.french = Randomizer::InsertRupeeName(messageEntry.french, LANGUAGE_FRA); + messageEntry.english = Randomizer::RandomizeRupeeName(messageEntry.english, LANGUAGE_ENG); + messageEntry.german = Randomizer::RandomizeRupeeName(messageEntry.german, LANGUAGE_GER); + messageEntry.french = Randomizer::RandomizeRupeeName(messageEntry.french, LANGUAGE_FRA); return messageEntry; } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 645c47bc5..978048f65 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -48,7 +48,7 @@ class Randomizer { GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); static void CreateCustomMessages(); - static std::string InsertRupeeName(std::string message, int language); + static std::string RandomizeRupeeName(std::string message, int language); static CustomMessageEntry GetRupeeMessage(u16 rupeeTextId); }; From bfc524c6ef2c9d774df6a7de417dc7c74c47ccae Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 24 Aug 2022 15:57:54 +0200 Subject: [PATCH 193/212] Merge fix, tooltip tweak --- libultraship/libultraship/ImGuiImpl.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index a98ab9027..a68b4fc61 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -2003,17 +2003,16 @@ namespace SohImGui { { EnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares"); Tooltip( - "Play unique fanfares when obtaining quest items" - "(medallions/stones/songs). Note that these fanfares" - "are longer than usual." + "Play unique fanfares when obtaining quest items " + "(medallions/stones/songs). Note that these fanfares are longer than usual." ); PaddedEnhancementCheckbox("Random Rupee Names", "gRandomizeRupeeNames", true, false); Tooltip( "When obtaining rupees, randomize what the rupee is called in the textbox." + ); PaddedEnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi", true, false); Tooltip( - "Replace Navi's overworld quest hints with rando-" - "related gameplay hints." + "Replace Navi's overworld quest hints with rando-related gameplay hints." ); ImGui::EndMenu(); } From 69a7012b5a6030b039e955d9fe8e51d01d68af34 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 24 Aug 2022 10:45:39 -0400 Subject: [PATCH 194/212] Fixes grass-chest bug I inadvertently introduced. --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 619627651..cb23a1b89 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6165,7 +6165,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { - if (this->getItemId != GI_NONE || this->getItemEntry.objectId != OBJECT_INVALID) { + if (this->getItemId != GI_NONE && this->getItemEntry.objectId != OBJECT_INVALID) { GetItemEntry giEntry; if (this->getItemEntry.objectId == OBJECT_INVALID) { giEntry = ItemTable_Retrieve(-this->getItemId); @@ -9687,8 +9687,8 @@ void func_808473D4(GlobalContext* globalCtx, Player* this) { else if ((!(this->stateFlags1 & PLAYER_STATE1_11) || (heldActor == NULL)) && (interactRangeActor != NULL) && ((!sp1C && (this->getItemId == GI_NONE)) || - ((this->getItemId < 0 || this->getItemEntry.getItemId < 0) && !(this->stateFlags1 & PLAYER_STATE1_27)))) { - if (this->getItemId < 0 || this->getItemEntry.getItemId < 0) { + ((this->getItemId < 0 && this->getItemEntry.getItemId < 0) && !(this->stateFlags1 & PLAYER_STATE1_27)))) { + if (this->getItemId < 0 && this->getItemEntry.getItemId < 0) { doAction = DO_ACTION_OPEN; } else if ((interactRangeActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT) { doAction = DO_ACTION_DROP; @@ -9744,7 +9744,7 @@ void func_808473D4(GlobalContext* globalCtx, Player* this) { } } else if (!(this->stateFlags1 & PLAYER_STATE1_27) && func_8083A0D4(this) && - ((!gSaveContext.n64ddFlag && this->getItemId < GI_MAX) || (gSaveContext.n64ddFlag && this->getItemEntry.getItemId < RG_MAX))) { + (this->getItemId < GI_MAX)) { doAction = DO_ACTION_GRAB; } else if (this->stateFlags2 & PLAYER_STATE2_11) { From 821c7948d6584aa2278d098bc56c3a77d20b7311 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 24 Aug 2022 13:06:48 -0400 Subject: [PATCH 195/212] Cleanup --- soh/soh/Enhancements/randomizer/draw.cpp | 18 +++++------------- soh/soh/Enhancements/randomizer/draw.h | 2 +- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 05cbe0165..e7b75ecd1 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -76,17 +76,13 @@ extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* g gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - if (color_slot >= 0) { - gsDPSetGrayscaleColor(POLY_XLU_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], - 255); - gsSPGrayscale(POLY_XLU_DISP++, true); - } + gsDPSetGrayscaleColor(POLY_XLU_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], + 255); + gsSPGrayscale(POLY_XLU_DISP++, true); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL); - if (color_slot >= 0) { - gsSPGrayscale(POLY_XLU_DISP++, false); - } + gsSPGrayscale(POLY_XLU_DISP++, false); CLOSE_DISPS(globalCtx->state.gfxCtx); } @@ -99,18 +95,14 @@ extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEn gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - // if (drawId == doubleDef) { gsDPSetGrayscaleColor(POLY_XLU_DISP++, 255, 255, 255, 255); gsSPGrayscale(POLY_XLU_DISP++, true); - // } gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartBorderDL); - // if (drawId == doubleDef) { gsSPGrayscale(POLY_XLU_DISP++, false); - // } gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartContainerDL); CLOSE_DISPS(globalCtx->state.gfxCtx); -} \ No newline at end of file +} diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index a38e99589..b1a93bd92 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -10,4 +10,4 @@ extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry); extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEntry getItemEntry); -#endif \ No newline at end of file +#endif From 02a8ba8bb9647d4f4b3932aaebe9af5ae8e7ec46 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 24 Aug 2022 13:16:14 -0400 Subject: [PATCH 196/212] Fixes incorrect key order in DrawSmallKeys. --- soh/soh/Enhancements/randomizer/draw.cpp | 5 +++-- soh/soh/Enhancements/randomizer/randomizer.cpp | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index e7b75ecd1..8e276d1a1 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -12,14 +12,15 @@ extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* s32 pad; s16 color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_SMALL_KEY; - s16 colors[8][3] = { + s16 colors[9][3] = { { 4, 195, 46 }, // Forest Temple { 237, 95, 95 }, // Fire Temple { 85, 180, 223 }, // Water Temple { 222, 158, 47 }, // Spirit Temple { 126, 16, 177 }, // Shadow Temple - { 221, 212, 60 }, // Gerudo Training Grounds { 227, 110, 255 }, // Bottom of the Well + { 221, 212, 60 }, // Gerudo Training Grounds + { 255, 255, 255 }, // Theive's Hideout (unused) { 80, 80, 80 } // Ganon's Castle }; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 15523de07..e59b6f771 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4050,7 +4050,8 @@ void InitRandoItemTable() { ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, extendedVanillaGetItemTable[i].getItemId, extendedVanillaGetItemTable[i]); } for (int i = 0; i < ARRAY_COUNT(randoGetItemTable); i++) { - if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_SMALL_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_SMALL_KEY) { + if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_SMALL_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_SMALL_KEY + && randoGetItemTable[i].itemId != RG_GERUDO_FORTRESS_SMALL_KEY) { randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawSmallKey; } else if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_BOSS_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_BOSS_KEY) { randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawBossKey; From 37fe5491b2cd92665410077adafe6979b5051f2f Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 24 Aug 2022 13:55:03 -0400 Subject: [PATCH 197/212] Always color in Double Defense --- soh/src/code/z_draw.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index 2751f4716..c2af2b8a9 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -400,7 +400,9 @@ void GetItem_Draw(GlobalContext* globalCtx, s16 drawId) { * Uses the Custom Draw Function if it exists, or just calls `GetItem_Draw` */ void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry) { - if (getItemEntry.drawFunc != NULL && CVar_GetS32("gRandoMatchKeyColors", 0)) { + // RANDOTODO: Make this more flexible for easier toggling of individual item recolors in the future. + if (getItemEntry.drawFunc != NULL && + (CVar_GetS32("gRandoMatchKeyColors", 0) || getItemEntry.getItemId == RG_DOUBLE_DEFENSE)) { getItemEntry.drawFunc(globalCtx, &getItemEntry); } else { GetItem_Draw(globalCtx, getItemEntry.gid); From 29509341f9346bb55d796312e1d654090b687848 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Wed, 24 Aug 2022 13:15:00 -0500 Subject: [PATCH 198/212] Support hiding compasses and maps, move combo button behind floating window condition, add padding to windows mode --- .../randomizer/randomizer_item_tracker.cpp | 100 +++++++++++++----- 1 file changed, 76 insertions(+), 24 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 95c7a4f4d..304f22d8d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -76,7 +76,36 @@ std::vector songItems = { ITEM_TRACKER_ITEM(QUEST_SONG_REQUIEM, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_NOCTURNE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_PRELUDE, 0, DrawSong), }; -std::vector itemTrackerDungeons = { +std::vector itemTrackerDungeonsWithMapsHorizontal = { + { SCENE_YDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_DDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_BDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, + // { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, // We're adding this manually for space +}; + +std::vector itemTrackerDungeonsHorizontal = { + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, + // { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, // We're adding this manually for space +}; + + +std::vector itemTrackerDungeonsWithMapsCompact = { { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, @@ -92,6 +121,18 @@ std::vector itemTrackerDungeons = { // { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, // We're adding this manually for space }; +std::vector itemTrackerDungeonsCompact = { + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, + { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, +}; + std::map itemTrackerDungeonShortNames = { { SCENE_BMORI1, "FRST" }, { SCENE_HIDAN, "FIRE" }, @@ -491,6 +532,7 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { } if (!CVar_GetS32("gItemTrackerWindowType", 0)) { + ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; if (!CVar_GetS32("gItemTrackerHudEditMode", 0)) { @@ -516,11 +558,12 @@ void EndFloatingWindows() { void DrawItemsInRows(std::vector items, int columns = 6) { int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + int topPadding = CVar_GetS32("gItemTrackerWindowType", 0) ? 20 : 0; for (int i = 0; i < items.size(); i++) { int row = i / columns; int column = i % columns; - ImGui::SetCursorPos(ImVec2((column * (iconSize + iconSpacing) + 8), (row * (iconSize + iconSpacing)) + 8)); + ImGui::SetCursorPos(ImVec2((column * (iconSize + iconSpacing) + 8), (row * (iconSize + iconSpacing)) + 8 + topPadding)); items[i].drawFunc(items[i]); } } @@ -555,13 +598,12 @@ std::vector GetDungeonItemsVector(std::vector dungeonItems = {}; - // if (!CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { - // dungeons.erase(std::remove_if(dungeons.begin(), dungeons.end(), [](ItemTrackerDungeon d) { - // return (d.id == SCENE_YDAN || d.id == SCENE_DDAN || d.id == SCENE_BDAN || d.id == SCENE_ICE_DOUKUTO); - // }), dungeons.end()); - // } + int rowCount = 0; + for (int i = 0; i < dungeons.size(); i++) { + if (dungeons[i].items.size() > rowCount) rowCount = dungeons[i].items.size(); + } - for (int i = 0; i < dungeons[i].items.size(); i++) { + for (int i = 0; i < rowCount; i++) { for (int j = 0; j < MIN(dungeons.size(), columns); j++) { if (dungeons[j].items.size() > i) { switch (dungeons[j].items[i]) { @@ -640,11 +682,20 @@ void UpdateVectors() { dungeonItems.clear(); if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1) && CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { - dungeonItems = GetDungeonItemsVector(itemTrackerDungeons, 12); - dungeonItems[23] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsHorizontal, 12); + dungeonItems[23] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } else { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsHorizontal, 8); + dungeonItems[15] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } } else { - dungeonItems = GetDungeonItemsVector(itemTrackerDungeons); - dungeonItems[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsCompact); + dungeonItems[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } else { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsCompact); + } } mainWindowItems.clear(); @@ -693,7 +744,7 @@ void DrawItemTracker(bool& open) { bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; bool isPaused = CVar_GetS32("gItemTrackerShowOnlyPaused", 0) == 0 || gGlobalCtx != nullptr && gGlobalCtx->pauseCtx.state > 0; - if (isPaused && (CVar_GetS32("gItemTrackerDisplayType", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : comboButtonsHeld)) { + if (CVar_GetS32("gItemTrackerWindowType", 0) == 1 || isPaused && (CVar_GetS32("gItemTrackerDisplayType", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : comboButtonsHeld)) { if ( (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) || (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) || @@ -754,7 +805,11 @@ void DrawItemTracker(bool& open) { if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { BeginFloatingWindows("Dungeon Items Tracker"); if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1)) { - DrawItemsInRows(dungeonItems, 12); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { + DrawItemsInRows(dungeonItems, 12); + } else { + DrawItemsInRows(dungeonItems, 8); + } } else { DrawItemsInRows(dungeonItems); } @@ -789,15 +844,7 @@ void DrawItemTrackerOptions(bool& open) { ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::TableHeadersRow(); ImGui::TableNextRow(); - ImGui::TableNextColumn(); - LabeledComboBoxRightAligned("Display Mode", "gItemTrackerDisplayType", { "Always", "Combo Button Hold" }, 0); - if (CVar_GetS32("gItemTrackerDisplayType", 0) > 0) { - LabeledComboBoxRightAligned("Combo Button 1", "gItemTrackerComboButton1", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 6); - LabeledComboBoxRightAligned("Combo Button 2", "gItemTrackerComboButton2", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 8); - } - PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerShowOnlyPaused", 0); - PaddedSeparator(); ImGui::Text("BG Color"); ImGui::SameLine(); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); @@ -814,6 +861,12 @@ void DrawItemTrackerOptions(bool& open) { if (CVar_GetS32("gItemTrackerWindowType", 0) == 0) { PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode", 0); + PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerShowOnlyPaused", 0); + LabeledComboBoxRightAligned("Display Mode", "gItemTrackerDisplayType", { "Always", "Combo Button Hold" }, 0); + if (CVar_GetS32("gItemTrackerDisplayType", 0) > 0) { + LabeledComboBoxRightAligned("Combo Button 1", "gItemTrackerComboButton1", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 6); + LabeledComboBoxRightAligned("Combo Button 2", "gItemTrackerComboButton2", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 8); + } } PaddedSeparator(); SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 36, true); @@ -838,8 +891,7 @@ void DrawItemTrackerOptions(bool& open) { if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", 1); } - // TODO: Re-add this, kinda complicated - // PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); + PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); } if (CVar_GetS32("gItemTrackerDisplayType", 0) != 1) { From b70ad81f5761ada61173b00fa2d1025979533d7e Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Wed, 24 Aug 2022 21:02:20 +0100 Subject: [PATCH 199/212] Add platform specific OTR instructions to readme (#1291) --- README.md | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 48faf9d07..374acdccc 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,10 @@ Congratulations, you are now sailing with the Ship of Harkinian! Have fun! The Ship of Harkinian uses a proprietary versioning system consisting of a sci-fi film character followed by a phonetic alphabet code word. The film character represents a major release version which increments with the addition of many new features and bug fixes. The code word represents a minor release version which increments with small updates mainly comprised of bug fixes. For example, `DECKARD ALFA`. -### The Extraction Tool +### Windows Rom Extraction -* Open a rom to initiate generating the `oot.otr` archive file. -* If a second button exists then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error. +* Open OTRGui.exe, and select one of the supported roms listed above, to generate the `oot.otr` archive file. +* If a second button already exits then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error. * When the process completes, place `oot.otr` beside `soh.exe` if it is not already. This packaging process can take up to **5 minutes**. @@ -42,6 +42,37 @@ This packaging process can take up to **5 minutes**. Close the OTRGui when the `Done!` message appears. If you get another message, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum. +### Linux Rom Extraction + +* Place one of the supported roms in the same folder as the appimage. +* When you run the soh appimage, it should begin generating the `oot.otr` archive file. +* When the process completes, place `oot.otr` in the same folder as the appimage, if it is not already, then run the appimage. + +The packaging process can take up to **5 minutes**. + +If you get any errors, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum. + +### MacOS Rom Extraction + +* Run `soh.app`, and when prompted, select one of the supported roms listed above. +* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start. + +The packing process can take up to **5 minutes**. + +If you get an error saying `Incompatible ROM hash`, you have selected the wrong rom, make sure the checksum matches one of the ones listed above. + +### Nintendo Switch Rom Extraction + +* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform. +* Place the `.nro` and the `oot.otr` archive into a folder called `soh` in your Switch folder on your Switch + +### Nintendo Wii U Rom Extraction + +* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform. +* Copy the `.rpx` and the `oot.otr` archive to `wiiu/apps/soh` + +--- + If you still cannot get the tool to work, join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the `#support` text channel. Keep-in-mind that we do not condone piracy in any way. ### Running The Ship of Harkinian From d5074c3e77f6a374c3623d08f71bbaa1c772ed6c Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 24 Aug 2022 22:18:24 +0200 Subject: [PATCH 200/212] Fixes double def and split second wrong colors --- soh/src/code/z_player_lib.c | 3 ++- soh/src/overlays/actors/ovl_player_actor/z_player.c | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 203585331..cfc1dc6f4 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1170,7 +1170,8 @@ void Player_DrawGetItemImpl(GlobalContext* globalCtx, Player* this, Vec3f* refPo Matrix_RotateZYX(0, globalCtx->gameplayFrames * 1000, 0, MTXMODE_APPLY); Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); - if (this->getItemEntry.drawFunc != NULL && CVar_GetS32("gRandoMatchKeyColors", 0)) { + if (this->getItemEntry.drawFunc != NULL && + (CVar_GetS32("gRandoMatchKeyColors", 0) || this->getItemEntry.getItemId == RG_DOUBLE_DEFENSE)) { this->getItemEntry.drawFunc(globalCtx, &this->getItemEntry); } else { GetItem_Draw(globalCtx, drawIdPlusOne - 1); diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index cb23a1b89..a3ad987be 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12667,6 +12667,14 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { this->stateFlags1 &= ~PLAYER_STATE1_29; func_80852FFC(globalCtx, NULL, 8); } + + // Set unk_862 to 0 early to not have the game draw non-custom colored models for a split second. + // This unk is what the game normally uses to decide what item to draw when holding up an item above Link's head. + // Only do this when the item actually has a custom draw function. + if (this->getItemEntry.drawFunc != NULL) { + this->unk_862 = 0; + } + this->getItemId = GI_NONE; this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } From 179c432ee1482221edd1239968250890cd55a788 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 24 Aug 2022 22:20:20 +0200 Subject: [PATCH 201/212] Comment --- soh/src/code/z_player_lib.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index cfc1dc6f4..bd33748e2 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1170,6 +1170,7 @@ void Player_DrawGetItemImpl(GlobalContext* globalCtx, Player* this, Vec3f* refPo Matrix_RotateZYX(0, globalCtx->gameplayFrames * 1000, 0, MTXMODE_APPLY); Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); + // RANDOTODO: Make this more flexible for easier toggling of individual item recolors in the future. if (this->getItemEntry.drawFunc != NULL && (CVar_GetS32("gRandoMatchKeyColors", 0) || this->getItemEntry.getItemId == RG_DOUBLE_DEFENSE)) { this->getItemEntry.drawFunc(globalCtx, &this->getItemEntry); From 27ced1fecabcb7261d70199bae68c3f503e3ec00 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Wed, 24 Aug 2022 15:52:19 -0500 Subject: [PATCH 202/212] Move some comments around --- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 304f22d8d..fc8a55a3a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -89,7 +89,6 @@ std::vector itemTrackerDungeonsWithMapsHorizontal = { { SCENE_HAKADANCH, { ITEM_KEY_SMALL, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, - // { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, // We're adding this manually for space }; std::vector itemTrackerDungeonsHorizontal = { @@ -101,7 +100,6 @@ std::vector itemTrackerDungeonsHorizontal = { { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, - // { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, // We're adding this manually for space }; @@ -118,7 +116,6 @@ std::vector itemTrackerDungeonsWithMapsCompact = { { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, - // { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, // We're adding this manually for space }; std::vector itemTrackerDungeonsCompact = { @@ -684,14 +681,17 @@ void UpdateVectors() { if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1) && CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsHorizontal, 12); + // Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item dungeonItems[23] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); } else { + // Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsHorizontal, 8); dungeonItems[15] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); } } else { if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsCompact); + // Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item dungeonItems[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); } else { dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsCompact); From a48ac717621982c8a1942612226a26a31a09b631 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 24 Aug 2022 23:02:48 +0200 Subject: [PATCH 203/212] Fixed lost woods target crash --- soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 495f80270..80cf97b32 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -521,6 +521,9 @@ void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx) { case EXITEM_BOMBCHUS_COUNTER: randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); break; + case EXITEM_BULLET_BAG: + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + break; } EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); From c0b9171f989ad1583f128b6dbf5e188b0c6ea5ae Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Thu, 25 Aug 2022 01:28:27 +0200 Subject: [PATCH 204/212] Cosmetics Editor Fixes (#1287) --- libultraship/libultraship/Cvar.cpp | 6 +- .../cosmetics/CosmeticsEditor.cpp | 5 +- soh/src/code/z_parameter.c | 146 +++++---------- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 168 +++++++++++++++++- 4 files changed, 216 insertions(+), 109 deletions(-) diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index 42be25619..9ebaac6f5 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -251,9 +251,9 @@ extern "C" void CVar_Save() auto keyStr = key.c_str(); Color_RGBA8 clr = cvar.second->value.valueRGBA; pConf->setUInt(StringHelper::Sprintf("%s.R", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.r); + pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.g); + pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.b); + pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.a); pConf->setString(StringHelper::Sprintf("%s.Type", keyStr), mercuryRGBAObjectType); } } diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index b8bae4d17..b04f30e35 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -26,7 +26,7 @@ const char* RainbowColorCvarList[] = { "gCCMapsPrim", "gCCQuestsPrim", "gCCSavePrim", "gCCGameoverPrim" }; const char* MarginCvarList[] { - "gHearts", "gMagicBar", "gVSOA", "gBBtn", "gABtn", "gStartBtn", + "gHearts", "gHeartsCount", "gMagicBar", "gVSOA", "gBBtn", "gABtn", "gStartBtn", "gCBtnU", "gCBtnD", "gCBtnL", "gCBtnR", "gDPad", "gMinimap", "gSKC", "gRC", "gCarrots", "gTimers", "gAS", "gTCM", "gTCB" }; @@ -44,7 +44,6 @@ ImVec4 GetRandomValue(int MaximumPossible){ return NewColor; } void GetRandomColorRGB(CosmeticsColorSection* ColorSection, int SectionSize){ - //std::random_shuffle(ColorSection, ColorSection + SectionSize); for (int i = 0; i < SectionSize; i++){ CosmeticsColorIndividual* Element = ColorSection[i].Element; ImVec4 colors = Element->ModifiedColor; @@ -477,7 +476,7 @@ void Draw_Placements(){ Table_InitHeader(false); DrawUseMarginsSlider("Hearts counts", "gHearts"); DrawPositionsRadioBoxes("gHeartsCount"); - DrawPositionSlider("gHeartsCount",-22,ImGui::GetWindowViewport()->Size.y,-25,ImGui::GetWindowViewport()->Size.x); + DrawPositionSlider("gHeartsCount",-22,ImGui::GetWindowViewport()->Size.y,-125,ImGui::GetWindowViewport()->Size.x); DrawScaleSlider("gHeartsCount",0.7f); ImGui::NewLine(); ImGui::EndTable(); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 6d83555be..cc954feed 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -3495,15 +3495,15 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { } int CUp_factor = (1 << 10) * C_Up_BTN_Size / CUpScaled; if (CVar_GetS32("gCBtnUPosType", 0) != 0) { - C_Up_BTN_Pos[1] = CVar_GetS32("gCBtnUPosY", 0)-(CUpScale*13)+Y_Margins_CU; + C_Up_BTN_Pos[1] = CVar_GetS32("gCBtnUPosY", 0)+Y_Margins_CU; if (CVar_GetS32("gCBtnUPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnUUseMargins", 0) != 0) {X_Margins_CU = Left_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13)+X_Margins_CU); + C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnUPosX", 0)+X_Margins_CU); } else if (CVar_GetS32("gCBtnUPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnUUseMargins", 0) != 0) {X_Margins_CU = Right_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13)+X_Margins_CU); + C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnUPosX", 0)+X_Margins_CU); } else if (CVar_GetS32("gCBtnUPosType", 0) == 3) {//Anchor None - C_Up_BTN_Pos[0] = CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13); + C_Up_BTN_Pos[0] = CVar_GetS32("gCBtnUPosX", 0); } else if (CVar_GetS32("gCBtnUPosType", 0) == 4) {//Hidden C_Up_BTN_Pos[0] = -9999; } @@ -3521,15 +3521,15 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { int CDown_factor = (1 << 10) * C_Down_BTN_Size / CDownScaled; int PositionAdjustment = CDownScaled/2; if (CVar_GetS32("gCBtnDPosType", 0) != 0) { - C_Down_BTN_Pos[1] = CVar_GetS32("gCBtnDPosY", 0)-PositionAdjustment+Y_Margins_CD; + C_Down_BTN_Pos[1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment+X_Margins_CD); + C_Down_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment+X_Margins_CD); + C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None - C_Down_BTN_Pos[0] = CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment; + C_Down_BTN_Pos[0] = CVar_GetS32("gCBtnDPosX", 0); } else if (CVar_GetS32("gCBtnDPosType", 0) == 4) {//Hidden C_Down_BTN_Pos[0] = -9999; } @@ -3567,9 +3567,9 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, interfaceCtx->cLeftAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Left_BTN_Pos[0] << 2, C_Left_BTN_Pos[1] << 2, - (C_Left_BTN_Pos[0] + CLeftScaled) << 2, - (C_Left_BTN_Pos[1] + CLeftScaled) << 2, - G_TX_RENDERTILE, 0, 0, CLeft_factor, CLeft_factor); + (C_Left_BTN_Pos[0] + R_ITEM_BTN_WIDTH(1)) << 2, + (C_Left_BTN_Pos[1] + R_ITEM_BTN_WIDTH(1)) << 2, + G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(1) << 1, R_ITEM_BTN_DD(1) << 1); // C-Down Button Color & Texture if (CVar_GetS32("gHudColors", 1) == 0) { @@ -3582,9 +3582,9 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, interfaceCtx->cDownAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Down_BTN_Pos[0] << 2, C_Down_BTN_Pos[1] << 2, - (C_Down_BTN_Pos[0] + CDownScaled) << 2, - (C_Down_BTN_Pos[1] + CDownScaled) << 2, - G_TX_RENDERTILE, 0, 0, CDown_factor, CDown_factor); + (C_Down_BTN_Pos[0] + R_ITEM_BTN_WIDTH(2)) << 2, + (C_Down_BTN_Pos[1] + R_ITEM_BTN_WIDTH(2)) << 2, + G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(2) << 1, R_ITEM_BTN_DD(2) << 1); // C-Right Button Color & Texture if (CVar_GetS32("gHudColors", 1) == 0) { @@ -3597,9 +3597,9 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, interfaceCtx->cRightAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Right_BTN_Pos[0] << 2, C_Right_BTN_Pos[1] << 2, - (C_Right_BTN_Pos[0] + CRightScaled) << 2, - (C_Right_BTN_Pos[1] + CRightScaled) << 2, - G_TX_RENDERTILE, 0, 0, CRight_factor, CRight_factor); + (C_Right_BTN_Pos[0] + R_ITEM_BTN_WIDTH(3)) << 2, + (C_Right_BTN_Pos[1] + R_ITEM_BTN_WIDTH(3)) << 2, + G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(3) << 1, R_ITEM_BTN_DD(3) << 1); if ((pauseCtx->state < 8) || (pauseCtx->state >= 18)) { if ((globalCtx->pauseCtx.state != 0) || (globalCtx->pauseCtx.debugState != 0)) { @@ -3896,43 +3896,16 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 X_Margins_DPad_Items = 0; Y_Margins_DPad_Items = 0; } - const float ItemsScale_offset[8][2] = { - // Y X - { 104.0f, 144.0f }, //B - { 108.0f, 148.0f }, //C L - { 108.0f, 148.0f }, //C D - { 108.0f, 148.0f }, //C R - { 112.0f, 152.0f }, //Dpad ^ - { 112.0f, 152.0f }, //Dpad V - { 112.0f, 152.0f }, //Dpad < - { 112.0f, 152.0f } //Dpad > - }; - float ItemScale_ori[8] = { - 1.0f, //B BTN - 0.87f, 0.87f, 0.87f, //C BTNs L / D / R - 0.6f, 0.6f, 0.6f, 0.6f //Dpad U/D/L/R - }; const s16 ItemIconPos_ori[8][2] = { - { B_BUTTON_X+X_Margins_BtnB-ItemsScale_offset[0][1], B_BUTTON_Y+Y_Margins_BtnB-ItemsScale_offset[0][0] }, - { C_LEFT_BUTTON_X+X_Margins_CL-ItemsScale_offset[1][1], C_LEFT_BUTTON_Y+Y_Margins_CL-ItemsScale_offset[1][0] }, - { C_DOWN_BUTTON_X+X_Margins_CD-ItemsScale_offset[2][1], C_DOWN_BUTTON_Y+Y_Margins_CD-ItemsScale_offset[2][0] }, - { C_RIGHT_BUTTON_X+X_Margins_CR-ItemsScale_offset[3][1], C_RIGHT_BUTTON_Y+Y_Margins_CR-ItemsScale_offset[3][0] }, - { DPAD_UP_X+X_Margins_DPad_Items-ItemsScale_offset[4][1], DPAD_UP_Y+Y_Margins_DPad_Items-ItemsScale_offset[4][0] }, - { DPAD_DOWN_X+X_Margins_DPad_Items-ItemsScale_offset[5][1], DPAD_DOWN_Y+Y_Margins_DPad_Items-ItemsScale_offset[5][0] }, - { DPAD_LEFT_X+X_Margins_DPad_Items-ItemsScale_offset[6][1], DPAD_LEFT_Y+Y_Margins_DPad_Items-ItemsScale_offset[6][0] }, - { DPAD_RIGHT_X+X_Margins_DPad_Items-ItemsScale_offset[7][1], DPAD_RIGHT_Y+Y_Margins_DPad_Items-ItemsScale_offset[7][0] } + { B_BUTTON_X+X_Margins_BtnB, B_BUTTON_Y+Y_Margins_BtnB }, + { C_LEFT_BUTTON_X+X_Margins_CL, C_LEFT_BUTTON_Y+Y_Margins_CL }, + { C_DOWN_BUTTON_X+X_Margins_CD, C_DOWN_BUTTON_Y+Y_Margins_CD }, + { C_RIGHT_BUTTON_X+X_Margins_CR, C_RIGHT_BUTTON_Y+Y_Margins_CR }, + { DPAD_UP_X+X_Margins_DPad_Items, DPAD_UP_Y+Y_Margins_DPad_Items }, + { DPAD_DOWN_X+X_Margins_DPad_Items, DPAD_DOWN_Y+Y_Margins_DPad_Items }, + { DPAD_LEFT_X+X_Margins_DPad_Items, DPAD_LEFT_Y+Y_Margins_DPad_Items }, + { DPAD_RIGHT_X+X_Margins_DPad_Items, DPAD_RIGHT_Y+Y_Margins_DPad_Items } }; - float ItemScale[8] = { - CVar_GetFloat("gBBtnScale", 1.0f), - CVar_GetFloat("gCBtnLScale", 0.87f), - CVar_GetFloat("gCBtnDScale", 0.87f), - CVar_GetFloat("gCBtnRScale", 0.87f), - CVar_GetFloat("gDPadScale", 0.425f), - CVar_GetFloat("gDPadScale", 0.425f), - CVar_GetFloat("gDPadScale", 0.425f), - CVar_GetFloat("gDPadScale", 0.425f), - }; - float ItemScaleCurrent[8]; //Hold the array with modified scale u16 ItemsSlotsAlpha[8] = { interfaceCtx->bAlpha, interfaceCtx->cLeftAlpha, @@ -3952,10 +3925,6 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 s16 ItemIconPos[8][2]; //(X,Y) //DPadItems if (CVar_GetS32("gDPadPosType", 0) != 0) { - ItemScaleCurrent[4] = ItemScale[4]; - ItemScaleCurrent[5] = ItemScale[5]; - ItemScaleCurrent[6] = ItemScale[6]; - ItemScaleCurrent[7] = ItemScale[7]; ItemIconPos[4][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up ItemIconPos[5][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down ItemIconPos[6][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left @@ -3984,10 +3953,6 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 ItemIconPos[7][0] = -9999; } } else { - ItemScaleCurrent[4] = ItemScale_ori[4]; - ItemScaleCurrent[5] = ItemScale_ori[5]; - ItemScaleCurrent[6] = ItemScale_ori[6]; - ItemScaleCurrent[7] = ItemScale_ori[7]; ItemIconPos[4][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[4][0]); ItemIconPos[5][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[5][0]); ItemIconPos[6][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[6][0]); @@ -3999,81 +3964,73 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 } //B Button if (CVar_GetS32("gBBtnPosType", 0) != 0) { - ItemScaleCurrent[0] = ItemScale[0]; - ItemIconPos[0][1] = CVar_GetS32("gBBtnPosY", 0)+Y_Margins_BtnB-ItemsScale_offset[0][0]; + ItemIconPos[0][1] = CVar_GetS32("gBBtnPosY", 0)+Y_Margins_BtnB; if (CVar_GetS32("gBBtnPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gBBtnUseMargins", 0) != 0) {X_Margins_BtnB = Left_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB-ItemsScale_offset[0][1]); + ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB); } else if (CVar_GetS32("gBBtnPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gBBtnUseMargins", 0) != 0) {X_Margins_BtnB = Right_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB-ItemsScale_offset[0][1]); + ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB); } else if (CVar_GetS32("gBBtnPosType", 0) == 3) {//Anchor None - ItemIconPos[0][0] = CVar_GetS32("gBBtnPosX", 0)-ItemsScale_offset[0][1]; + ItemIconPos[0][0] = CVar_GetS32("gBBtnPosX", 0); } else if (CVar_GetS32("gBBtnPosType", 0) == 4) {//Hidden ItemIconPos[0][0] = -9999; } } else { - ItemScaleCurrent[0] = ItemScale_ori[0]; ItemIconPos[0][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[0][0]); ItemIconPos[0][1] = ItemIconPos_ori[0][1]; } //C button Left if (CVar_GetS32("gCBtnLPosType", 0) != 0) { - ItemScaleCurrent[1] = ItemScale[1]; - ItemIconPos[1][1] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL-ItemsScale_offset[1][0]; + ItemIconPos[1][1] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL; if (CVar_GetS32("gCBtnLPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL-ItemsScale_offset[1][1]); + ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); } else if (CVar_GetS32("gCBtnLPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL-ItemsScale_offset[1][1]); + ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); } else if (CVar_GetS32("gCBtnLPosType", 0) == 3) {//Anchor None - ItemIconPos[1][0] = CVar_GetS32("gCBtnLPosX", 0)-ItemsScale_offset[1][1]; + ItemIconPos[1][0] = CVar_GetS32("gCBtnLPosX", 0); } else if (CVar_GetS32("gCBtnLPosType", 0) == 4) {//Hidden ItemIconPos[1][0] = -9999; } } else { - ItemScaleCurrent[1] = ItemScale_ori[1]; ItemIconPos[1][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[1][0]); ItemIconPos[1][1] = ItemIconPos_ori[1][1]; } //C Button down if (CVar_GetS32("gCBtnDPosType", 0) != 0) { - ItemScaleCurrent[2] = ItemScale[2]; - ItemIconPos[2][1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD-ItemsScale_offset[2][0]; + ItemIconPos[2][1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD-ItemsScale_offset[2][1]); + ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD-ItemsScale_offset[2][1]); + ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None - ItemIconPos[2][0] = CVar_GetS32("gCBtnDPosX", 0)-ItemsScale_offset[2][1]; + ItemIconPos[2][0] = CVar_GetS32("gCBtnDPosX", 0); } else if (CVar_GetS32("gCBtnDPosType", 0) == 4) {//Hidden ItemIconPos[2][0] = -9999; } } else { - ItemScaleCurrent[2] = ItemScale_ori[2]; ItemIconPos[2][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[2][0]); ItemIconPos[2][1] = ItemIconPos_ori[2][1]; } //C button Right if (CVar_GetS32("gCBtnRPosType", 0) != 0) { - ItemScaleCurrent[3] = ItemScale[3]; - ItemIconPos[3][1] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR-ItemsScale_offset[3][0]; + ItemIconPos[3][1] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR; if (CVar_GetS32("gCBtnRPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR-ItemsScale_offset[3][1]); + ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); } else if (CVar_GetS32("gCBtnRPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR-ItemsScale_offset[3][1]); + ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); } else if (CVar_GetS32("gCBtnRPosType", 0) == 3) {//Anchor None - ItemIconPos[3][0] = CVar_GetS32("gCBtnRPosX", 0)-ItemsScale_offset[3][1]; + ItemIconPos[3][0] = CVar_GetS32("gCBtnRPosX", 0); } else if (CVar_GetS32("gCBtnRPosType", 0) == 4) {//Hidden ItemIconPos[3][0] = -9999; } } else { - ItemScaleCurrent[3] = ItemScale_ori[3]; ItemIconPos[3][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[3][0]); ItemIconPos[3][1] = ItemIconPos_ori[3][1]; } @@ -4081,23 +4038,10 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 gDPLoadTextureBlock(OVERLAY_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gDPPipeSync(OVERLAY_DISP++); - gSPSetGeometryMode(OVERLAY_DISP++, G_CULL_BACK); - gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, ItemsSlotsAlpha[button]); - gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); - Matrix_Translate( - ItemIconPos[button][0], - ItemIconPos[button][1] * -1, 1.0f, MTXMODE_NEW); - - Matrix_Scale( - ItemScaleCurrent[button]/1, - ItemScaleCurrent[button]/1, - ItemScaleCurrent[button]/1, MTXMODE_APPLY); - gSPMatrix(OVERLAY_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); - gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[0], 4, 0); - gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); - gDPPipeSync(OVERLAY_DISP++); + gSPWideTextureRectangle(OVERLAY_DISP++, ItemIconPos[button][0] << 2, ItemIconPos[button][1] << 2, + (ItemIconPos[button][0] + gItemIconWidth[button]) << 2, + (ItemIconPos[button][1] + gItemIconWidth[button]) << 2, G_TX_RENDERTILE, 0, 0, + gItemIconDD[button] << 1, gItemIconDD[button] << 1); CLOSE_DISPS(globalCtx->state.gfxCtx); } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 675fc1191..e5d816d67 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -568,6 +568,170 @@ void KaleidoScope_UpdateItemEquip(GlobalContext* globalCtx) { u16 offsetX; u16 offsetY; + s16 Top_HUD_Margin = CVar_GetS32("gHUDMargin_T", 0); + s16 Left_HUD_Margin = CVar_GetS32("gHUDMargin_L", 0); + s16 Right_HUD_Margin = CVar_GetS32("gHUDMargin_R", 0); + s16 Bottom_HUD_Margin = CVar_GetS32("gHUDMargin_B", 0); + + s16 X_Margins_CL; + s16 X_Margins_CR; + s16 X_Margins_CD; + s16 Y_Margins_CL; + s16 Y_Margins_CR; + s16 Y_Margins_CD; + s16 X_Margins_BtnB; + s16 Y_Margins_BtnB; + s16 X_Margins_DPad_Items; + s16 Y_Margins_DPad_Items; + if (CVar_GetS32("gBBtnUseMargins", 0) != 0) { + if (CVar_GetS32("gBBtnPosType", 0) == 0) {X_Margins_BtnB = Right_HUD_Margin;}; + Y_Margins_BtnB = (Top_HUD_Margin*-1); + } else { + X_Margins_BtnB = 0; + Y_Margins_BtnB = 0; + } + if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) { + if (CVar_GetS32("gCBtnLPosType", 0) == 0) {X_Margins_CL = Right_HUD_Margin;}; + Y_Margins_CL = (Top_HUD_Margin*-1); + } else { + X_Margins_CL = 0; + Y_Margins_CL = 0; + } + if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) { + if (CVar_GetS32("gCBtnRPosType", 0) == 0) {X_Margins_CR = Right_HUD_Margin;}; + Y_Margins_CR = (Top_HUD_Margin*-1); + } else { + X_Margins_CR = 0; + Y_Margins_CR = 0; + } + if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) { + if (CVar_GetS32("gCBtnDPosType", 0) == 0) {X_Margins_CD = Right_HUD_Margin;}; + Y_Margins_CD = (Top_HUD_Margin*-1); + } else { + X_Margins_CD = 0; + Y_Margins_CD = 0; + } + if (CVar_GetS32("gDPadUseMargins", 0) != 0) { + if (CVar_GetS32("gDPadPosType", 0) == 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; + Y_Margins_DPad_Items = (Top_HUD_Margin*-1); + } else { + X_Margins_DPad_Items = 0; + Y_Margins_DPad_Items = 0; + } + const s16 ItemIconPos_ori[7][2] = { + { C_LEFT_BUTTON_X+X_Margins_CL, C_LEFT_BUTTON_Y+Y_Margins_CL }, + { C_DOWN_BUTTON_X+X_Margins_CD, C_DOWN_BUTTON_Y+Y_Margins_CD }, + { C_RIGHT_BUTTON_X+X_Margins_CR, C_RIGHT_BUTTON_Y+Y_Margins_CR }, + { DPAD_UP_X+X_Margins_DPad_Items, DPAD_UP_Y+Y_Margins_DPad_Items }, + { DPAD_DOWN_X+X_Margins_DPad_Items, DPAD_DOWN_Y+Y_Margins_DPad_Items }, + { DPAD_LEFT_X+X_Margins_DPad_Items, DPAD_LEFT_Y+Y_Margins_DPad_Items }, + { DPAD_RIGHT_X+X_Margins_DPad_Items, DPAD_RIGHT_Y+Y_Margins_DPad_Items } + }; + s16 DPad_ItemsOffset[4][2] = { + { 7,-8},//Up + { 7,24},//Down + {-9, 8},//Left + {23, 8},//Right + }; //(X,Y) Used with custom position to place it properly. + + //DPadItems + if (CVar_GetS32("gDPadPosType", 0) != 0) { + sCButtonPosY[3] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up + sCButtonPosY[4] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down + sCButtonPosY[5] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left + sCButtonPosY[6] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[3][1];//Right + if (CVar_GetS32("gDPadPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gDPadUseMargins", 0) != 0) {X_Margins_DPad_Items = Left_HUD_Margin;}; + sCButtonPosX[3] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); + sCButtonPosX[4] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); + sCButtonPosX[5] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); + sCButtonPosX[6] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); + } else if (CVar_GetS32("gDPadPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gDPadUseMargins", 0) != 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; + sCButtonPosX[3] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); + sCButtonPosX[4] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); + sCButtonPosX[5] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); + sCButtonPosX[6] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); + } else if (CVar_GetS32("gDPadPosType", 0) == 3) {//Anchor None + sCButtonPosX[3] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[0][0]; + sCButtonPosX[4] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[1][0]; + sCButtonPosX[5] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[2][0]; + sCButtonPosX[6] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[3][0]; + } + } else { + sCButtonPosX[3] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[3][0]); + sCButtonPosX[4] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[4][0]); + sCButtonPosX[5] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[5][0]); + sCButtonPosX[6] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[6][0]); + sCButtonPosY[3] = ItemIconPos_ori[3][1]; + sCButtonPosY[4] = ItemIconPos_ori[4][1]; + sCButtonPosY[5] = ItemIconPos_ori[5][1]; + sCButtonPosY[6] = ItemIconPos_ori[6][1]; + } + //C button Left + if (CVar_GetS32("gCBtnLPosType", 0) != 0) { + sCButtonPosY[0] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL; + if (CVar_GetS32("gCBtnLPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; + sCButtonPosX[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); + } else if (CVar_GetS32("gCBtnLPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; + sCButtonPosX[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); + } else if (CVar_GetS32("gCBtnLPosType", 0) == 3) {//Anchor None + sCButtonPosX[0] = CVar_GetS32("gCBtnLPosX", 0); + } + } else { + sCButtonPosX[0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[0][0]); + sCButtonPosY[0] = ItemIconPos_ori[0][1]; + } + //C Button down + if (CVar_GetS32("gCBtnDPosType", 0) != 0) { + sCButtonPosY[1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; + if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; + sCButtonPosX[1] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; + sCButtonPosX[1] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None + sCButtonPosX[1] = CVar_GetS32("gCBtnDPosX", 0); + } + } else { + sCButtonPosX[1] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[1][0]); + sCButtonPosY[1] = ItemIconPos_ori[1][1]; + } + //C button Right + if (CVar_GetS32("gCBtnRPosType", 0) != 0) { + sCButtonPosY[2] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR; + if (CVar_GetS32("gCBtnRPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; + sCButtonPosX[2] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); + } else if (CVar_GetS32("gCBtnRPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; + sCButtonPosX[2] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); + } else if (CVar_GetS32("gCBtnRPosType", 0) == 3) {//Anchor None + sCButtonPosX[2] = CVar_GetS32("gCBtnRPosX", 0); + } + } else { + sCButtonPosX[2] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[2][0]); + sCButtonPosY[2] = ItemIconPos_ori[2][1]; + } + + sCButtonPosX[0] = sCButtonPosX[0] - 160; + sCButtonPosY[0] = 120 - sCButtonPosY[0]; + sCButtonPosX[1] = sCButtonPosX[1] - 160; + sCButtonPosY[1] = 120 - sCButtonPosY[1]; + sCButtonPosX[2] = sCButtonPosX[2] - 160; + sCButtonPosY[2] = 120 - sCButtonPosY[2]; + sCButtonPosX[3] = sCButtonPosX[3] - 160; + sCButtonPosY[3] = 120 - sCButtonPosY[3]; + sCButtonPosX[4] = sCButtonPosX[4] - 160; + sCButtonPosY[4] = 120 - sCButtonPosY[4]; + sCButtonPosX[5] = sCButtonPosX[5] - 160; + sCButtonPosY[5] = 120 - sCButtonPosY[5]; + sCButtonPosX[6] = sCButtonPosX[6] - 160; + sCButtonPosY[6] = 120 - sCButtonPosY[6]; + if (sEquipState == 0) { pauseCtx->equipAnimAlpha += 14; if (pauseCtx->equipAnimAlpha > 255) { @@ -598,7 +762,7 @@ void KaleidoScope_UpdateItemEquip(GlobalContext* globalCtx) { offsetX = ABS(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sEquipMoveTimer; offsetY = ABS(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sEquipMoveTimer; } else { - offsetX = ABS(pauseCtx->equipAnimX - OTRGetRectDimensionFromRightEdge(sCButtonPosX[pauseCtx->equipTargetCBtn]) * 10) / sEquipMoveTimer; + offsetX = ABS(pauseCtx->equipAnimX - sCButtonPosX[pauseCtx->equipTargetCBtn] * 10) / sEquipMoveTimer; offsetY = ABS(pauseCtx->equipAnimY - sCButtonPosY[pauseCtx->equipTargetCBtn] * 10) / sEquipMoveTimer; } @@ -628,7 +792,7 @@ void KaleidoScope_UpdateItemEquip(GlobalContext* globalCtx) { pauseCtx->equipAnimY += offsetY; } } else { - if (pauseCtx->equipAnimX >= OTRGetRectDimensionFromRightEdge(sCButtonPosX[pauseCtx->equipTargetCBtn]) * 10) { + if (pauseCtx->equipAnimX >= sCButtonPosX[pauseCtx->equipTargetCBtn] * 10) { pauseCtx->equipAnimX -= offsetX; } else { pauseCtx->equipAnimX += offsetX; From 050a9db01d0366a1f882497b8d0c4b33b5ad1679 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 25 Aug 2022 08:38:42 +0200 Subject: [PATCH 205/212] Fix BGS dupe check --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index e59b6f771..2a8328970 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1144,7 +1144,7 @@ s16 Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) { case RG_GIANTS_KNIFE: return GI_SWORD_KNIFE; case RG_BIGGORON_SWORD: - return !CHECK_OWNED_EQUIP(EQUIP_SWORD, 2) ? GI_SWORD_BGS : GI_RUPEE_BLUE; + return !gSaveContext.bgsFlag ? GI_SWORD_BGS : GI_RUPEE_BLUE; case RG_DEKU_SHIELD: return GI_SHIELD_DEKU; From 954a96baeb9f25c80e1b9fd77ca57b7fac8f8f77 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 25 Aug 2022 10:27:04 +0200 Subject: [PATCH 206/212] tha fix --- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index fc8a55a3a..d8e805348 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -605,7 +605,11 @@ std::vector GetDungeonItemsVector(std::vector i) { switch (dungeons[j].items[i]) { case ITEM_KEY_SMALL: - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[j].id, DrawDungeonItem)); + if (dungeons[j].id == SCENE_GANON) { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GANONTIKA, DrawDungeonItem)); + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[j].id, DrawDungeonItem)); + } break; case ITEM_KEY_BOSS: dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, dungeons[j].id, DrawDungeonItem)); From 6fd22f50abe6fa0a0c4da89c8bcd5fd7e9e033b6 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 25 Aug 2022 10:35:04 +0200 Subject: [PATCH 207/212] Swapped logic to boss key --- .../randomizer/randomizer_item_tracker.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index d8e805348..48494d0f7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -85,7 +85,7 @@ std::vector itemTrackerDungeonsWithMapsHorizontal = { { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADANCH, { ITEM_KEY_SMALL, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, @@ -97,7 +97,7 @@ std::vector itemTrackerDungeonsHorizontal = { { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, }; @@ -114,7 +114,7 @@ std::vector itemTrackerDungeonsWithMapsCompact = { { SCENE_DDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_BDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, }; @@ -124,7 +124,7 @@ std::vector itemTrackerDungeonsCompact = { { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, @@ -141,7 +141,7 @@ std::map itemTrackerDungeonShortNames = { { SCENE_DDAN, "DCVN" }, { SCENE_BDAN, "JABU" }, { SCENE_ICE_DOUKUTO, "ICE" }, - { SCENE_GANON, "GANON" }, + { SCENE_GANONTIKA, "GANON" }, { SCENE_MEN, "GTG" }, { SCENE_GERUDOWAY, "HIDE" }, }; @@ -288,7 +288,7 @@ ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { case SCENE_HAKADANCH: result.y = 3; break; - case SCENE_GANON: + case SCENE_GANONTIKA: result.y = 2; break; case SCENE_MEN: @@ -605,14 +605,14 @@ std::vector GetDungeonItemsVector(std::vector i) { switch (dungeons[j].items[i]) { case ITEM_KEY_SMALL: - if (dungeons[j].id == SCENE_GANON) { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GANONTIKA, DrawDungeonItem)); - } else { - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[j].id, DrawDungeonItem)); - } + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[j].id, DrawDungeonItem)); break; case ITEM_KEY_BOSS: - dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, dungeons[j].id, DrawDungeonItem)); + if (dungeons[j].id == SCENE_GANONTIKA) { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, SCENE_GANON, DrawDungeonItem)); + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, dungeons[j].id, DrawDungeonItem)); + } break; case ITEM_DUNGEON_MAP: dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_DUNGEON_MAP, dungeons[j].id, DrawDungeonItem)); From c41de36c46eab2f443b9f34b8a719484132d6b62 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 25 Aug 2022 10:36:28 +0200 Subject: [PATCH 208/212] Comment --- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 48494d0f7..8cede9a66 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -608,6 +608,7 @@ std::vector GetDungeonItemsVector(std::vector Date: Thu, 25 Aug 2022 11:11:24 +0200 Subject: [PATCH 209/212] Rando menu tweaks --- libultraship/libultraship/ImGuiImpl.cpp | 14 ++++++------- .../Enhancements/randomizer/randomizer.cpp | 21 ++++++++++++------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index aa56ee1d1..d430bc769 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -2001,22 +2001,22 @@ namespace SohImGui { if (ImGui::BeginMenu("Rando Enhancements")) { - EnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares"); + EnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi"); Tooltip( - "Play unique fanfares when obtaining quest items " - "(medallions/stones/songs). Note that these fanfares are longer than usual." + "Replace Navi's overworld quest hints with rando-related gameplay hints." ); PaddedEnhancementCheckbox("Random Rupee Names", "gRandomizeRupeeNames", true, false); Tooltip( "When obtaining rupees, randomize what the rupee is called in the textbox." ); - PaddedEnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi", true, false); - Tooltip( - "Replace Navi's overworld quest hints with rando-related gameplay hints." - ); PaddedEnhancementCheckbox("Key Colors Match Dungeon", "gRandoMatchKeyColors", true, false); Tooltip( "Matches the color of small keys and boss keys to the dungeon they belong to. This helps identify keys from afar and adds a little bit of flair."); + PaddedEnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares", true, false); + Tooltip( + "Play unique fanfares when obtaining quest items " + "(medallions/stones/songs). Note that these fanfares are longer than usual." + ); ImGui::EndMenu(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index e59b6f771..7f01b2cf0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3327,8 +3327,8 @@ void DrawRandoEditor(bool& open) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (ImGui::BeginTable("tableRandoOther", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { ImGui::TableSetupColumn("Timesavers", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Hint Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Item Pool Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("World Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Hint & Item Pool Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); ImGui::TableHeadersRow(); ImGui::PopItemFlag(); @@ -3400,7 +3400,15 @@ void DrawRandoEditor(bool& open) { "The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. " "These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise."); - // COLUMN 2 - HINT SETTINGS + // COLUMN 2 - WORLD SETTINGS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::PushItemWidth(-FLT_MIN); + ImGui::Text("Coming soon"); + + ImGui::PopItemWidth(); + + // COLUMN 3 - HINT & ITEM POOL SETTINGS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::PushItemWidth(-FLT_MIN); @@ -3453,12 +3461,9 @@ void DrawRandoEditor(bool& open) { SohImGui::EnhancementCombobox("gRandomizeHintDistribution", randoHintDistribution, 4, 1); ImGui::Unindent(); } - ImGui::PopItemWidth(); - // COLUMN 3 - ITEM POOL SETTINGS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::PushItemWidth(-FLT_MIN); + PaddedSeparator(); + ImGui::Text(Settings::ItemPoolValue.GetName().c_str()); InsertHelpHoverText("Sets how many major items appear in the item pool.\n" "\n" From 9787f9d4f241987d0dbb27e296ab9e99ce0dea8d Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 25 Aug 2022 16:34:48 +0200 Subject: [PATCH 210/212] Swap hints & item pool --- .../Enhancements/randomizer/randomizer.cpp | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 7f01b2cf0..3ba5a8571 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3328,7 +3328,7 @@ void DrawRandoEditor(bool& open) { if (ImGui::BeginTable("tableRandoOther", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { ImGui::TableSetupColumn("Timesavers", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::TableSetupColumn("World Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Hint & Item Pool Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Item Pool & Hint Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); ImGui::TableHeadersRow(); ImGui::PopItemFlag(); @@ -3408,11 +3408,42 @@ void DrawRandoEditor(bool& open) { ImGui::PopItemWidth(); - // COLUMN 3 - HINT & ITEM POOL SETTINGS + // COLUMN 3 - ITEM POOL & HINT SETTINGS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::PushItemWidth(-FLT_MIN); + ImGui::Text(Settings::ItemPoolValue.GetName().c_str()); + InsertHelpHoverText("Sets how many major items appear in the item pool.\n" + "\n" + "Plentiful - Extra major items are added to the pool.\n" + "\n" + "Balanced - Original item pool.\n" + "\n" + "Scarce - Some excess items are removed, including health upgrades.\n" + "\n" + "Minimal - Most excess items are removed."); + SohImGui::EnhancementCombobox("gRandomizeItemPool", randoItemPool, 4, 1); + PaddedSeparator(); + + // Ice Traps + ImGui::Text(Settings::IceTrapValue.GetName().c_str()); + InsertHelpHoverText("Sets how many items are replaced by ice traps.\n" + "\n" + "Off - No ice traps.\n" + "\n" + "Normal - Only Ice Traps from the base item pool are shuffled in.\n" + "\n" + "Extra - Chance to replace added junk items with additional ice traps.\n" + "\n" + "Mayhem - All added junk items will be Ice Traps.\n" + "\n" + "Onslaught - All junk items will be replaced by Ice Traps, even those " + "in the base pool."); + SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1); + + PaddedSeparator(); + // Gossip Stone Hints ImGui::Text(Settings::GossipStoneHints.GetName().c_str()); InsertHelpHoverText( @@ -3462,36 +3493,6 @@ void DrawRandoEditor(bool& open) { ImGui::Unindent(); } - PaddedSeparator(); - - ImGui::Text(Settings::ItemPoolValue.GetName().c_str()); - InsertHelpHoverText("Sets how many major items appear in the item pool.\n" - "\n" - "Plentiful - Extra major items are added to the pool.\n" - "\n" - "Balanced - Original item pool.\n" - "\n" - "Scarce - Some excess items are removed, including health upgrades.\n" - "\n" - "Minimal - Most excess items are removed."); - SohImGui::EnhancementCombobox("gRandomizeItemPool", randoItemPool, 4, 1); - PaddedSeparator(); - - // Ice Traps - ImGui::Text(Settings::IceTrapValue.GetName().c_str()); - InsertHelpHoverText("Sets how many items are replaced by ice traps.\n" - "\n" - "Off - No ice traps.\n" - "\n" - "Normal - Only Ice Traps from the base item pool are shuffled in.\n" - "\n" - "Extra - Chance to replace added junk items with additional ice traps.\n" - "\n" - "Mayhem - All added junk items will be Ice Traps.\n" - "\n" - "Onslaught - All junk items will be replaced by Ice Traps, even those " - "in the base pool."); - SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1); ImGui::PopItemWidth(); ImGui::EndTable(); } From 95372718a3d0328c652362c7870fa88f3258d34d Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Thu, 25 Aug 2022 10:27:31 -0500 Subject: [PATCH 211/212] Transition a few things to randomizerInf flags --- soh/CMakeLists.txt | 1 + soh/include/functions.h | 3 ++ soh/include/z64player.h | 2 +- soh/include/z64save.h | 5 ++- .../Enhancements/randomizer/randomizer_inf.h | 35 +++++++++++++++++++ soh/soh/SaveManager.cpp | 33 ++++------------- soh/src/code/z_actor.c | 14 ++++++++ soh/src/code/z_sram.c | 17 +++------ .../ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c | 16 ++++----- .../z_bg_spot06_objects.c | 2 +- .../actors/ovl_Demo_Kekkai/z_demo_kekkai.c | 24 ++++++------- .../actors/ovl_Door_Warp1/z_door_warp1.c | 16 ++++----- soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c | 30 ++++++++-------- soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h | 2 +- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 2 +- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 18 +++++----- soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 2 +- soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 4 +-- .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 2 +- .../actors/ovl_player_actor/z_player.c | 4 +-- 20 files changed, 127 insertions(+), 105 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/randomizer_inf.h diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index ce9260275..96aef33df 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -181,6 +181,7 @@ source_group("Header Files\\soh\\Enhancements\\debugger" FILES ${Header_Files__s set(Header_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer.h" + "soh/Enhancements/randomizer/randomizer_inf.h" "soh/Enhancements/randomizer/randomizer_item_tracker.h" "soh/Enhancements/randomizer/adult_trade_shuffle.h" "soh/Enhancements/randomizer/randomizer_check_objects.h" diff --git a/soh/include/functions.h b/soh/include/functions.h index d3c5cfe2b..9047b6d3f 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -11,6 +11,7 @@ extern "C" #include "../../libultraship/libultraship/luslog.h" #include +#include #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) @@ -558,6 +559,8 @@ s32 Flags_GetEventChkInf(s32 flag); void Flags_SetEventChkInf(s32 flag); s32 Flags_GetInfTable(s32 flag); void Flags_SetInfTable(s32 flag); +s32 Flags_GetRandomizerInf(RandomizerInf flag); +void Flags_SetRandomizerInf(RandomizerInf flag); u16 func_80037C30(GlobalContext* globalCtx, s16 arg1); s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3); s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4); diff --git a/soh/include/z64player.h b/soh/include/z64player.h index b910ce3e2..cbee1b440 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -368,7 +368,7 @@ typedef enum { FLAG_SCENE_CLEAR, FLAG_SCENE_COLLECTIBLE, FLAG_EVENT_CHECK_INF, - FLAG_COW_MILKED + FLAG_RANDOMIZER_INF } FlagType; typedef struct { diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 9da18f72e..14da6a2fc 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -5,6 +5,7 @@ #include "z64math.h" #include "z64audio.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" +#include "soh/Enhancements/randomizer/randomizer_inf.h" typedef struct { /* 0x00 */ u8 buttonItems[8]; @@ -182,9 +183,7 @@ typedef struct { char ganonHintText[150]; char ganonText[250]; u8 seedIcons[5]; - u8 dungeonsDone[8]; - u8 trialsDone[6]; - u8 cowsMilked[10]; + u16 randomizerInf[2]; u8 temporaryWeapon; u16 adultTradeItems; } SaveContext; // size = 0x1428 diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h new file mode 100644 index 000000000..e5f41a5d3 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -0,0 +1,35 @@ +#pragma once + +typedef enum { + RAND_INF_DUNGEONS_DONE_DEKU_TREE, + RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN, + RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY, + RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE, + RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE, + RAND_INF_DUNGEONS_DONE_WATER_TEMPLE, + RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, + RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, + + RAND_INF_TRIALS_DONE_LIGHT_TRIAL, + RAND_INF_TRIALS_DONE_FOREST_TRIAL, + RAND_INF_TRIALS_DONE_FIRE_TRIAL, + RAND_INF_TRIALS_DONE_WATER_TRIAL, + RAND_INF_TRIALS_DONE_SPIRIT_TRIAL, + RAND_INF_TRIALS_DONE_SHADOW_TRIAL, + + RAND_INF_COWS_MILKED_LINKS_HOUSE_COW, + RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, + RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, + RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, + RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, + RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, + RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, + RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, + RAND_INF_COWS_MILKED_GV_COW, + RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, + RAND_INF_COWS_MILKED_HF_COW_GROTTO_GOSSIP_STONE, + + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) + + RAND_INF_MAX, +} RandomizerInf; diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index e8f73d0c5..8d8e7cd77 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -758,15 +758,8 @@ void SaveManager::LoadBaseVersion1() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); }); } @@ -922,15 +915,8 @@ void SaveManager::LoadBaseVersion2() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); }); } @@ -1082,15 +1068,8 @@ void SaveManager::SaveBase() { SaveManager::Instance->SaveData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->SaveArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->SaveArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->SaveData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->SaveArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->SaveArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->SaveData("", gSaveContext.randomizerInf[i]); }); } diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index bf34412cb..5d7add53a 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -4705,6 +4705,20 @@ void Flags_SetInfTable(s32 flag) { gSaveContext.infTable[flag >> 4] |= (1 << (flag & 0xF)); } +/** + * Tests if "randomizerInf" flag is set. + */ +s32 Flags_GetRandomizerInf(RandomizerInf flag) { + return gSaveContext.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); +} + +/** + * Sets "randomizerInf" flag. + */ +void Flags_SetRandomizerInf(RandomizerInf flag) { + gSaveContext.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); +} + u32 func_80035BFC(GlobalContext* globalCtx, s16 arg1) { u16 retTextId = 0; diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 8d23e42eb..f99df9cc1 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -3,6 +3,7 @@ #include #include +#include #define NUM_DUNGEONS 8 #define NUM_TRIALS 6 @@ -702,19 +703,9 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { fileChooseCtx->n64ddFlag = 1; gSaveContext.n64ddFlag = 1; - // Sets all the dungeons to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/82 - for (u8 i = 0; i < NUM_DUNGEONS; i++) { - gSaveContext.dungeonsDone[i] = 0; - } - - // Sets all Ganon's Trials to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/131 - for (u8 i = 0; i < NUM_TRIALS; i++) { - gSaveContext.trialsDone[i] = 0; - } - - // Sets all cows to unmilked when generating a rando save. - for (u8 i = 0; i < NUM_COWS; i++) { - gSaveContext.cowsMilked[i] = 0; + // Sets all rando flags to false + for (s32 i = 0; i < RAND_INF_MAX; i++) { + gSaveContext.randomizerInf[i] = 0; } // Set Cutscene flags to skip them diff --git a/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c b/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c index 9e46c39ef..e3539aaf7 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c +++ b/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c @@ -132,35 +132,35 @@ u8 CheckMedallionCount() { u8 CheckDungeonCount() { u8 dungeonCount = 0; - if (gSaveContext.dungeonsDone[0] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[1] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[2] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[3] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[4] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[5] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[6] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[7] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) { dungeonCount++; } diff --git a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c index 5c20fa602..713314002 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c @@ -152,7 +152,7 @@ void BgSpot06Objects_Init(Actor* thisx, GlobalContext* globalCtx) { if (LINK_IS_ADULT && ((!gSaveContext.n64ddFlag && !(gSaveContext.eventChkInf[6] & 0x200)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[5]))) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)))) { if (gSaveContext.sceneSetupIndex < 4) { this->lakeHyliaWaterLevel = -681.0f; globalCtx->colCtx.colHeader->waterBoxes[LHWB_GERUDO_VALLEY_RIVER_LOWER].ySurface = diff --git a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c index 46ecf5979..adc534a2d 100644 --- a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c +++ b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c @@ -76,27 +76,27 @@ s32 DemoKekkai_CheckEventFlag(s32 params) { u32 TrialsDoneCount() { u8 trialCount = 0; - if (gSaveContext.trialsDone[0] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[1] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[2] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[3] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[4] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[5] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL)) { trialCount++; } @@ -249,22 +249,22 @@ void DemoKekkai_TrialBarrierDispel(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { switch (thisx->params) { case KEKKAI_WATER: - gSaveContext.trialsDone[2] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL); break; case KEKKAI_LIGHT: - gSaveContext.trialsDone[5] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL); break; case KEKKAI_FIRE: - gSaveContext.trialsDone[1] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL); break; case KEKKAI_SHADOW: - gSaveContext.trialsDone[3] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL); break; case KEKKAI_SPIRIT: - gSaveContext.trialsDone[4] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL); break; case KEKKAI_FOREST: - gSaveContext.trialsDone[0] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL); break; } Flags_SetEventChkInf(eventFlags[thisx->params]); diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 5130f1ca8..e372d3291 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -546,7 +546,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum == SCENE_DDAN_BOSS) { if (!Flags_GetEventChkInf(0x25)) { Flags_SetEventChkInf(0x25); - gSaveContext.dungeonsDone[0] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x47A; gSaveContext.nextCutsceneIndex = 0; @@ -563,7 +563,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (!Flags_GetEventChkInf(7) || gSaveContext.n64ddFlag) { Flags_SetEventChkInf(7); Flags_SetEventChkInf(9); - gSaveContext.dungeonsDone[1] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x0457; gSaveContext.nextCutsceneIndex = 0; @@ -671,7 +671,7 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF) { gSaveContext.eventChkInf[3] |= 0x80; - gSaveContext.dungeonsDone[2] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x10E; @@ -785,7 +785,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum == SCENE_MORIBOSSROOM) { if (!(gSaveContext.eventChkInf[4] & 0x100)) { gSaveContext.eventChkInf[4] |= 0x100; - gSaveContext.dungeonsDone[3] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x608; @@ -807,7 +807,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } else if (globalCtx->sceneNum == SCENE_FIRE_BS) { if (!(gSaveContext.eventChkInf[4] & 0x200)) { gSaveContext.eventChkInf[4] |= 0x200; - gSaveContext.dungeonsDone[4] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x564; @@ -828,7 +828,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } else if (globalCtx->sceneNum == SCENE_MIZUSIN_BS) { if (!(gSaveContext.eventChkInf[4] & 0x400)) { gSaveContext.eventChkInf[4] |= 0x400; - gSaveContext.dungeonsDone[5] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x60C; @@ -849,7 +849,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } } else if (globalCtx->sceneNum == SCENE_JYASINBOSS) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) || gSaveContext.n64ddFlag) { - gSaveContext.dungeonsDone[6] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x610; @@ -870,7 +870,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } } else if (globalCtx->sceneNum == SCENE_HAKADAN_BS) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) || gSaveContext.n64ddFlag) { - gSaveContext.dungeonsDone[7] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x580; diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c index 3a687f41d..3572de01c 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -218,51 +218,51 @@ void func_809DF730(EnCow* this, GlobalContext* globalCtx) { CowInfo EnCow_GetInfo(EnCow* this, GlobalContext* globalCtx) { struct CowInfo cowInfo; - cowInfo.cowId = -1; + cowInfo.randomizerInf = -1; cowInfo.randomizerCheck = RC_UNKNOWN_CHECK; switch (globalCtx->sceneNum) { case SCENE_SOUKO: // Lon Lon Tower if (this->actor.world.pos.x == -229 && this->actor.world.pos.z == 157) { - cowInfo.cowId = 0; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW; cowInfo.randomizerCheck = RC_LLR_TOWER_LEFT_COW; } else if (this->actor.world.pos.x == -142 && this->actor.world.pos.z == -140) { - cowInfo.cowId = 1; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW; cowInfo.randomizerCheck = RC_LLR_TOWER_RIGHT_COW; } break; case SCENE_MALON_STABLE: if (this->actor.world.pos.x == 116 && this->actor.world.pos.z == -254) { - cowInfo.cowId = 2; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW; cowInfo.randomizerCheck = RC_LLR_STABLES_RIGHT_COW; } else if (this->actor.world.pos.x == -122 && this->actor.world.pos.z == -254) { - cowInfo.cowId = 3; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW; cowInfo.randomizerCheck = RC_LLR_STABLES_LEFT_COW; } break; case SCENE_KAKUSIANA: // Grotto if (this->actor.world.pos.x == 2444 && this->actor.world.pos.z == -471) { - cowInfo.cowId = 4; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW; cowInfo.randomizerCheck = RC_DMT_COW_GROTTO_COW; } else if (this->actor.world.pos.x == 3485 && this->actor.world.pos.z == -291) { - cowInfo.cowId = 5; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW; cowInfo.randomizerCheck = RC_HF_COW_GROTTO_COW; } break; case SCENE_LINK_HOME: - cowInfo.cowId = 6; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LINKS_HOUSE_COW; cowInfo.randomizerCheck = RC_KF_LINKS_HOUSE_COW; break; case SCENE_LABO: // Impa's house - cowInfo.cowId = 7; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW; cowInfo.randomizerCheck = RC_KAK_IMPAS_HOUSE_COW; break; case SCENE_SPOT09: // Gerudo Valley - cowInfo.cowId = 8; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_GV_COW; cowInfo.randomizerCheck = RC_GV_COW; break; - case SCENE_SPOT08: // Jabu's Belly - cowInfo.cowId = 9; + case SCENE_BDAN: // Jabu's Belly + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW; cowInfo.randomizerCheck = RC_JABU_JABUS_BELLY_MQ_COW; break; } @@ -290,8 +290,8 @@ void EnCow_MoveForRandomizer(EnCow* this, GlobalContext* globalCtx) { void EnCow_SetCowMilked(EnCow* this, GlobalContext* globalCtx) { CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); Player* player = GET_PLAYER(globalCtx); - player->pendingFlag.flagID = cowInfo.cowId; - player->pendingFlag.flagType = FLAG_COW_MILKED; + player->pendingFlag.flagID = cowInfo.randomizerInf; + player->pendingFlag.flagType = FLAG_RANDOMIZER_INF; } void func_809DF778(EnCow* this, GlobalContext* globalCtx) { @@ -337,7 +337,7 @@ void func_809DF8FC(EnCow* this, GlobalContext* globalCtx) { bool EnCow_HasBeenMilked(EnCow* this, GlobalContext* globalCtx) { CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); - return gSaveContext.cowsMilked[cowInfo.cowId]; + return Flags_GetRandomizerInf(cowInfo.randomizerInf); } void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h index a5c66f1da..7367f470c 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h @@ -22,7 +22,7 @@ typedef struct EnCow { } EnCow; // size = 0x0280 typedef struct CowInfo { - int cowId; + RandomizerInf randomizerInf; RandomizerCheck randomizerCheck; } CowInfo; diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index 389b1b145..58124ef23 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -114,7 +114,7 @@ u16 EnGo_GetTextID(GlobalContext* globalCtx, Actor* thisx) { } case 0x00: if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) { if (gSaveContext.infTable[16] & 0x8000) { return 0x3042; } else { diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 175335a0d..9f6ff147e 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -416,10 +416,10 @@ s16 EnGo2_GetStateGoronDmtRollingSmall(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.eventChkInf[2] & 0x8 ? 0x3021 : gSaveContext.infTable[14] & 0x1 ? 0x302A : 0x3008; @@ -439,10 +439,10 @@ s16 EnGo2_GetStateGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityEntrance(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.infTable[15] & 0x1 ? 0x3015 : 0x3014; @@ -462,10 +462,10 @@ s16 EnGo2_GetStateGoronCityEntrance(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityIsland(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.infTable[15] & 0x10 ? 0x3017 : 0x3016; @@ -485,10 +485,10 @@ s16 EnGo2_GetStateGoronCityIsland(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityLowestFloor(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return CUR_UPG_VALUE(UPG_STRENGTH) != 0 ? 0x302C @@ -1589,7 +1589,7 @@ void EnGo2_Init(Actor* thisx, GlobalContext* globalCtx) { case GORON_CITY_STAIRWELL: case GORON_CITY_LOST_WOODS: if (((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { Actor_Kill(&this->actor); } this->actionFunc = EnGo2_CurledUp; diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index da73fd634..96aebbef6 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -73,7 +73,7 @@ static AnimationInfo sAnimationInfo[] = { u16 EnKz_GetTextNoMaskChild(GlobalContext* globalCtx, EnKz* this) { Player* player = GET_PLAYER(globalCtx); - if ((gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[2]) || + if ((gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) || (!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE))) { return 0x402B; } else if (gSaveContext.eventChkInf[3] & 8) { diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index ffb02e8d2..83252a27e 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -373,7 +373,7 @@ u16 EnMd_GetTextKokiriForest(GlobalContext* globalCtx, EnMd* this) { this->unk_209 = TEXT_STATE_NONE; if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[1])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE))) { return 0x1045; } @@ -486,7 +486,7 @@ u8 EnMd_ShouldSpawn(EnMd* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { // if we have beaten deku tree or have open forest turned on // or have already shown mido we have an equipped sword/shield - if (gSaveContext.dungeonsDone[1] || + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE) || Randomizer_GetSettingValue(RSK_FOREST) == 1 || gSaveContext.eventChkInf[0] & 0x10) { return 0; 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 1e154ef3b..2ba2a1478 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 @@ -518,7 +518,7 @@ void EnOssan_TalkGoronShopkeeper(GlobalContext* globalCtx) { Message_ContinueTextbox(globalCtx, 0x300F); } } else if ((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[4])) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) { Message_ContinueTextbox(globalCtx, 0x3057); } else { Message_ContinueTextbox(globalCtx, 0x305B); diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index a3ad987be..2631e39b9 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6083,8 +6083,8 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { case FLAG_SCENE_TREASURE: Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); break; - case FLAG_COW_MILKED: - gSaveContext.cowsMilked[this->pendingFlag.flagID] = 1; + case FLAG_RANDOMIZER_INF: + Flags_SetRandomizerInf(this->pendingFlag.flagID); break; case FLAG_EVENT_CHECK_INF: Flags_SetEventChkInf(this->pendingFlag.flagID); From 5e9d1d61f1f609d22e8e146aead3c3280f7d541c Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Thu, 25 Aug 2022 10:34:39 -0500 Subject: [PATCH 212/212] Fix minor thing in sram --- soh/src/code/z_sram.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index f99df9cc1..b7c260a23 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -704,7 +704,7 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { gSaveContext.n64ddFlag = 1; // Sets all rando flags to false - for (s32 i = 0; i < RAND_INF_MAX; i++) { + for (s32 i = 0; i < ARRAY_COUNT(gSaveContext.randomizerInf); i++) { gSaveContext.randomizerInf[i] = 0; }