From 4a87ed709b43de81c5b2eee553cfb1dc5edaa84c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 31 Jul 2022 23:26:48 -0400 Subject: [PATCH 01/91] 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 02/91] 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 03/91] 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 04/91] 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 05/91] 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 06/91] 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 07/91] 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 08/91] 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 09/91] 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 10/91] 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 11/91] 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 12/91] 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 13/91] 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 14/91] 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 6e37897449b8a58751c2e16c414284c10d1fde2a Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 10 Aug 2022 20:28:44 -0400 Subject: [PATCH 15/91] 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 16/91] 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 17/91] 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 18/91] 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 19/91] 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 20/91] 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 21/91] 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 22/91] 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 23/91] 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 24/91] 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 25/91] 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 26/91] 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 27/91] 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 28/91] 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 29/91] 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 30/91] 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 31/91] 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 32/91] 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 33/91] 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 34/91] 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 35/91] 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 36/91] 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 37/91] 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 38/91] 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 39/91] 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 40/91] 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 41/91] 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 42/91] 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 43/91] 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 44/91] 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 45/91] 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 46/91] 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 47/91] 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 48/91] 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 49/91] 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 50/91] 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 51/91] 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 52/91] 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 53/91] 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 54/91] 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 55/91] 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 56/91] 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 57/91] 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 58/91] 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 59/91] 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 60/91] 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 61/91] 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 f8b55ea78ce5e9e479a7134b0129b046e397e1ae Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 22:46:52 -0400 Subject: [PATCH 62/91] 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 63/91] 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 64/91] 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 65/91] 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 66/91] 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 67/91] 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 68/91] 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 69/91] 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 70/91] 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 71/91] 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 72/91] 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 73/91] 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 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 74/91] 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 75/91] 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 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 76/91] 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 3db2ce708521a8fb2a2b5306474af0788ae91701 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 18 Aug 2022 22:06:28 -0400 Subject: [PATCH 77/91] 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 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 78/91] 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 a67c6b9e674a98dc8c4118c515e10a9fb46d7503 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 19 Aug 2022 19:36:44 -0400 Subject: [PATCH 79/91] 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 80/91] 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 81/91] 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 4dff1443a6c8cfcdafecb3a5d7595d84cb66a785 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 20 Aug 2022 18:00:44 -0400 Subject: [PATCH 82/91] 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 e1b403a31b1dde6ae190a2a8352d1f0fd69073dd Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 21 Aug 2022 15:14:50 -0400 Subject: [PATCH 83/91] 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 84/91] 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 85/91] 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 86/91] 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 de9465c22a9040b2b203361db1c36d4261411787 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 21 Aug 2022 21:48:01 -0400 Subject: [PATCH 87/91] 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 01dbfc71adbab509e756cf2082d47563e4b4c020 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 22 Aug 2022 19:32:42 -0400 Subject: [PATCH 88/91] 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 89/91] 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 90/91] 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 91/91] 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;