From 6abacc1024dd2c9684cf2fcaaab6ffa674a2b990 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 25 Mar 2025 13:12:50 -0400 Subject: [PATCH 01/12] Fix the player state flag that Tailparasan checks for for Damage Effect (#5211) * Fix the player state flag that Tailparasan checks for * Updated comment for accuracy --- soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c b/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c index 20966eac4..33449e4a0 100644 --- a/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c +++ b/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c @@ -657,7 +657,7 @@ void EnTp_Update(Actor* thisx, PlayState* play) { Player* player = GET_PLAYER(play); s16 yawToWall; - if (player->stateFlags1 & PLAYER_STATE1_SHIELDING) { // Shielding + if (player->stateFlags1 & PLAYER_STATE1_DAMAGED) { // Damaged this->damageEffect = TAILPASARAN_DMGEFF_NONE; } From 2fd3825569c7fc0d74d2658b3b347a1352e56dc5 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 25 Mar 2025 10:41:25 -0700 Subject: [PATCH 02/12] Fix warning from popped, minimized menu. (#5212) * Fix warning from popped, minimized menu. * Pre-empt another possible missing Pop. --- soh/soh/SohGui/Menu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index 63fdca5a9..6bb4698d5 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -527,6 +527,7 @@ void Menu::DrawElement() { if (!popout) { ImGui::PopStyleVar(); } + ImGui::PopStyleColor(); ImGui::End(); return; } @@ -537,6 +538,7 @@ void Menu::DrawElement() { if (!popout) { ImGui::PopStyleVar(); } + ImGui::PopStyleColor(); CVarSetInteger(CVAR_SETTING("Menu.Popout"), popped); CVarSetFloat(CVAR_SETTING("Menu.PoppedWidth"), poppedSize.x); CVarSetFloat(CVAR_SETTING("Menu.PoppedHeight"), poppedSize.y); From 364fec4d297016c9ad6b35e37a229142281a4d04 Mon Sep 17 00:00:00 2001 From: Extloga <141232749+Extloga@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:55:53 +0100 Subject: [PATCH 03/12] Additions and fixes for the German translation in several files (#5173) * Additions and fixes for the German translation in item_list.cpp * Additions and fixes for the German translation in hint_list_exclude_dungeon.cpp * Additions and fixes for the German translation in hint_list_exclude_overworld.cpp * Additions and fixes for the German translation in hint_list_item.cpp * Additions and fixes for the German translation in randomizer.cpp * Additions and fixes for the German translation in randomizer.cpp * Fix for the French translation in item_list.cpp * Additions and fixes for the German translation in hint_list_exclude_dungeon.cpp * Fixes for the English text in settings.cpp * Fixes for the English text in SohMenuEnhancements.cpp * Fixes for the English text in SohMenuDevTools.cpp * Fixes for the English text in SohMenuRandomizer.cpp * Fixes for the English text in ResolutionEditor.cpp * Fixes for the English text in enemyrandomizer.cpp * Fixes for the English text in gameplaystats.cpp * Fixes for the English text in savefile.cpp * Fixes for the English text in enemyrandomizer.cpp * Fix for the English text in SohMenuEnhancements.cpp Co-authored-by: aMannus --------- Co-authored-by: aMannus --- soh/soh/Enhancements/enemyrandomizer.cpp | 70 +++---- soh/soh/Enhancements/gameplaystats.cpp | 16 +- .../hint_list/hint_list_exclude_dungeon.cpp | 107 ++++++----- .../hint_list/hint_list_exclude_overworld.cpp | 32 ++-- .../3drando/hint_list/hint_list_item.cpp | 21 +- soh/soh/Enhancements/randomizer/item_list.cpp | 55 +++--- .../Enhancements/randomizer/randomizer.cpp | 85 ++++++--- soh/soh/Enhancements/randomizer/savefile.cpp | 46 ++--- soh/soh/Enhancements/randomizer/settings.cpp | 68 +++---- soh/soh/SohGui/ResolutionEditor.cpp | 12 +- soh/soh/SohGui/SohMenuDevTools.cpp | 18 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 180 +++++++++--------- soh/soh/SohGui/SohMenuRandomizer.cpp | 6 +- 13 files changed, 370 insertions(+), 346 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 326a4a78d..0b73af41a 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -42,18 +42,18 @@ const char* enemyCVarList[] = { }; const char* enemyNameList[] = { - "Armos", "Arwing", "Baby Dodongo", "Bari", - "Beamos", "Big Skulltula", "Stalchild (Big)", "Biri", - "Iron Knuckle (Black)", "Blue Tektite", "Bubble", "Club Moblin", - "Dark Link", "Dinolfos", "Dodongo", "Fire Keese", - "Floor Tile", "Floormaster", "Flying Peahat", "Flying Pot", - "Freezard", "Gibdo", "Gohma Larva", "Guay", - "Ice Keese", "Invisible Skulltula", "Keese", "Large Deku Baba", - "Like-Like", "Lizalfos", "Mad Scrub", "Wolfos (Normal)", - "Peahat Larva", "Redead", "Red Tektite", "Shabom", - "ShellBlade", "Skulltula", "Small Deku Baba", "Stalchild (Small)", - "Spike", "Stalfos", "Stinger", "Tailparasan", - "Torch Slug", "Wallmaster", "Iron Knuckle (White)", "Wolfos (White)", + "Armos", "Arwing", "Baby Dodongo", "Bari", + "Beamos", "Big Skulltula", "Stalchild (Big)", "Biri", + "Iron Knuckle (Black)", "Blue Tektite", "Bubble", "Club Moblin", + "Dark Link", "Dinolfos", "Dodongo", "Fire Keese", + "Floor Tile", "Floormaster", "Flying Peahat", "Flying Pot", + "Freezard", "Gibdo", "Gohma Larva", "Guay", + "Ice Keese", "Invisible Skulltula", "Keese", "Large Deku Baba", + "Like-Like", "Lizalfos", "Mad Scrub", "Wolfos (Normal)", + "Peahat Larva", "Redead", "Red Tektite", "Shabom", + "Shell Blade", "Skulltula", "Small Deku Baba", "Stalchild (Small)", + "Spike", "Stalfos", "Stinger", "Tailpasaran", + "Torch Slug", "Wallmaster", "Iron Knuckle (White)", "Wolfos (White)", "Withered Deku Baba", }; @@ -80,7 +80,7 @@ static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { ACTOR_EN_TUBO_TRAP, 0 }, // Flying pot { ACTOR_EN_FZ, 0 }, // Freezard { ACTOR_EN_RD, 32766 }, // Gibdo (standing) - { ACTOR_EN_GOMA, 7 }, // Gohma larva (non-gohma rooms) + { ACTOR_EN_GOMA, 7 }, // Gohma Larva (Non-Gohma rooms) { ACTOR_EN_CROW, 0 }, // Guay { ACTOR_EN_FIREFLY, 4 }, // Ice Keese { ACTOR_EN_ST, 2 }, // Skulltula (invisible) @@ -102,7 +102,7 @@ static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { ACTOR_EN_NY, 0 }, // Spike (rolling enemy) { ACTOR_EN_TEST, 2 }, // Stalfos { ACTOR_EN_EIYER, 10 }, // Stinger (land) (One in formation, sink under floor and do not activate) - { ACTOR_EN_TP, -1 }, // Electric Tailparasan + { ACTOR_EN_TP, -1 }, // Electric Tailpasaran { ACTOR_EN_BW, 0 }, // Torch Slug { ACTOR_EN_WALLMAS, 1 }, // Wallmaster { ACTOR_EN_WF, 1 }, // Wolfos (white) @@ -120,19 +120,19 @@ static int enemiesToRandomize[] = { ACTOR_EN_FIREFLY, // Keese (including fire/ice) ACTOR_EN_TEST, // Stalfos ACTOR_EN_TITE, // Tektite - ACTOR_EN_POH, // Poe (normal, blue rupee, composers + ACTOR_EN_POH, // Poe (normal, blue rupee, composers) ACTOR_EN_OKUTA, // Octorok ACTOR_EN_WALLMAS, // Wallmaster ACTOR_EN_DODONGO, // Dodongo // ACTOR_EN_REEBA, // Leever (reliant on spawner (z_e_encount1.c) ACTOR_EN_PEEHAT, // Flying Peahat, big one spawning larva, larva - ACTOR_EN_ZF, // Lizalfos, dinolfos - ACTOR_EN_GOMA, // Gohma larva (normal, eggs, gohma eggs) + ACTOR_EN_ZF, // Lizalfos, Dinolfos + ACTOR_EN_GOMA, // Gohma Larva (normal, eggs, gohma eggs) ACTOR_EN_BUBBLE, // Shabom (bubble) ACTOR_EN_DODOJR, // Baby Dodongo ACTOR_EN_TORCH2, // Dark Link ACTOR_EN_BILI, // Biri (small jellyfish) - ACTOR_EN_TP, // Electric Tailparasan + ACTOR_EN_TP, // Electric Tailpasaran ACTOR_EN_ST, // Skulltula (normal, big, invisible) ACTOR_EN_BW, // Torch Slug ACTOR_EN_EIYER, // Stinger (land) @@ -147,7 +147,7 @@ static int enemiesToRandomize[] = { ACTOR_EN_FLOORMAS, // Floormaster ACTOR_EN_RD, // Redead, Gibdo ACTOR_EN_SW, // Skullwalltula - // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations means it atleast shows up in the game + // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations means it at least shows up in the game) ACTOR_EN_SB, // Shell Blade ACTOR_EN_KAREBABA, // Withered Deku Baba ACTOR_EN_RR, // Like-Like @@ -156,7 +156,7 @@ static int enemiesToRandomize[] = { ACTOR_EN_TUBO_TRAP, // Flying pot ACTOR_EN_FZ, // Freezard ACTOR_EN_WEIYER, // Stinger (Water) - ACTOR_EN_HINTNUTS, // Hint deku scrubs + ACTOR_EN_HINTNUTS, // Hint Deku Scrubs ACTOR_EN_WF, // Wolfos ACTOR_EN_SKB, // Stalchild ACTOR_EN_CROW // Guay @@ -169,8 +169,8 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po // Hack to remove enemies that wrongfully spawn because of bypassing object dependency with enemy randomizer on. // This should probably be handled on OTR generation in the future when object dependency is fully removed. - // Remove bats and skulltulas from graveyard. - // Remove octorok in lost woods. + // Remove bats and Skulltulas from graveyard. + // Remove Octorok in Lost Woods. if (((*actorId == ACTOR_EN_FIREFLY || (*actorId == ACTOR_EN_SW && *params == 0)) && play->sceneNum == SCENE_GRAVEYARD) || (*actorId == ACTOR_EN_OKUTA && play->sceneNum == SCENE_LOST_WOODS)) { return 0; @@ -251,13 +251,13 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po case ACTOR_EN_VALI: *posY = *posY + 300; break; - // Spawn peahat off the ground, otherwise it kills itself by colliding with the ground. + // Spawn Peahat off the ground, otherwise it kills itself by colliding with the ground. case ACTOR_EN_PEEHAT: if (*params == 1) { *posY = *posY + 100; } break; - // Spawn skulltulas off the ground. + // Spawn Skulltulas off the ground. case ACTOR_EN_ST: *posY = *posY + 200; break; @@ -327,14 +327,14 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, // Only randomize the main component of Electric Tailparasans, not the tail segments they spawn. case ACTOR_EN_TP: return (params == -1); - // Only randomize the initial deku scrub actor (single and triple attack), not the flower they spawn. + // Only randomize the initial Deku Scrub actor (single and triple attack), not the flower they spawn. case ACTOR_EN_DEKUNUTS: return (params == -256 || params == 768); - // Don't randomize the OoB wallmaster in the silver rupee room because it's only there to + // Don't randomize the OoB wallmaster in the Silver Rupee room because it's only there to // not trigger unlocking the door after killing the other wallmaster in authentic gameplay. case ACTOR_EN_WALLMAS: return (!(!isMQ && sceneNum == SCENE_GERUDO_TRAINING_GROUND && roomNum == 2 && posX == -2345)); - // Only randomize initial floormaster actor (it can split and does some spawning on init). + // Only randomize initial Floormaster actor (it can split and does some spawning on init). case ACTOR_EN_FLOORMAS: return (params == 0 || params == -32768); // Only randomize the initial eggs, not the enemies that spawn from them. @@ -348,10 +348,10 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, // break the thrones in the room to access a button. case ACTOR_EN_IK: return (params != 1280 && !(isMQ && sceneNum == SCENE_INSIDE_GANONS_CASTLE && roomNum == 17)); - // Only randomize the intitial spawn of the huge jellyfish. It spawns another copy when hit with a sword. + // Only randomize the initial spawn of the huge jellyfish. It spawns another copy when hit with a sword. case ACTOR_EN_VALI: return (params == -1); - // Don't randomize lizalfos in Doodong's Cavern because the gates won't work correctly otherwise. + // Don't randomize Lizalfos in Dodongo's Cavern because the gates won't work correctly otherwise. case ACTOR_EN_ZF: return (params != 1280 && params != 1281 && params != 1536 && params != 1537); // Don't randomize the Wolfos in SFM because it's needed to open the gate. @@ -363,7 +363,7 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, case ACTOR_EN_TEST: return (params != 1 && !(sceneNum == SCENE_SHADOW_TEMPLE && roomNum == 21)); // Only randomize the enemy variant of Armos Statue. - // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a button + // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a button. case ACTOR_EN_AM: return ((params == -1 || params == 255) && !(sceneNum == SCENE_SPIRIT_TEMPLE && posX == 2141)); // Don't randomize Shell Blades and Spikes in the underwater portion in Water Temple as it's impossible to kill @@ -385,9 +385,9 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { uint32_t isMQ = ResourceMgr_IsSceneMasterQuest(sceneNum); - // Freezard - Child Link can only kill this with jump slash deku sticks or other equipment like bombs. + // Freezard - Child Link can only kill this with jump slash Deku Sticks or other equipment like bombs. // Beamos - Needs bombs. - // Shell Blade & Spike - Child link can't kill these with sword or deku stick. + // Shell Blade & Spike - Child Link can't kill these with sword or Deku Stick. // Arwing & Dark Link - Both go out of bounds way too easily, softlocking the player. // Wallmaster - Not easily visible, often makes players think they're softlocked and that there's no enemies left. // Club Moblin - Many issues with them falling or placing out of bounds. Maybe fixable in the future? @@ -454,7 +454,7 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { !(!isMQ && enemiesToExcludeClearRooms && (roomNum == 3 || roomNum == 5 || roomNum == 10)) && !(isMQ && enemiesToExcludeTimedRooms && (roomNum == 1 || roomNum == 3 || roomNum == 5 || roomNum == 7)) && !(isMQ && enemiesToExcludeClearRooms && roomNum == 10)); - // Don't allow certain enemies in Ganon's Tower because they would spawn up on the ceilling, + // Don't allow certain enemies in Ganon's Tower because they would spawn up on the ceiling, // becoming impossible to kill. // Ganon's Tower. case SCENE_GANONS_TOWER: @@ -462,8 +462,8 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { // Ganon's Tower Escape. case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: return (!((enemiesToExcludeTimedRooms || (enemy.id == ACTOR_EN_ZF && enemy.params == -1)) && roomNum == 1)); - // Don't allow big stalchildren, big peahats and the large Bari (jellyfish) during the Gohma fight because they can clip into Gohma - // and it crashes the game. Likely because Gohma on the ceilling can't handle collision with other enemies. + // Don't allow big Stalchildren, big Peahats and the large Bari (jellyfish) during the Gohma fight because they can clip into Gohma + // and it crashes the game. Likely because Gohma on the ceiling can't handle collision with other enemies. case SCENE_DEKU_TREE_BOSS: return (!enemiesToExcludeTimedRooms && !(enemy.id == ACTOR_EN_SKB && enemy.params == 20) && !(enemy.id == ACTOR_EN_PEEHAT && enemy.params == -1)); diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index 51144dd20..e939fa18c 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -35,7 +35,7 @@ const char* const sceneMappings[] = { "Ice Cavern", "Ganon's Tower", "Gerudo Training Ground", - "Theives' Hideout", + "Thieves' Hideout", "Inside Ganon's Castle", "Tower Collapse", "Castle Collapse", @@ -189,7 +189,7 @@ const char* const countMappings[] = { "Poe Sisters:", "Redead:", "Shabom:", - "Shellblade:", + "Shell Blade:", "Skull Kid:", "Skulltula:", "Skulltula (Big):", @@ -251,8 +251,8 @@ typedef struct { }TimestampInfo; // Timestamps are an array of structs, each with a name, time, and color -// Names and colors are set up at the bottom of this file -// Times are stored in gSaveContext.ship.stats.itemTimestamp +// Names and colors are set up at the bottom of this file. +// Times are stored in gSaveContext.ship.stats.itemTimestamp. TimestampInfo itemTimestampDisplay[TIMESTAMP_MAX]; TimestampInfo sceneTimestampDisplay[8191]; //std::vector sceneTimestampDisplay; @@ -427,7 +427,7 @@ const char* ResolveSceneID(int sceneID, int roomID){ return "Big Skulltula Grotto"; }; } else if (sceneID == SCENE_WINDMILL_AND_DAMPES_GRAVE) { - //Only the last room of Dampe's Grave (rm 6) is considered the windmill + //Only the last room of Dampe's Grave (rm 6) is considered the windmill. return roomID == 6 ? "Windmill" : "Dampe's Grave"; } else if (sceneID < SCENE_ID_MAX) { return sceneMappings[sceneID]; @@ -625,7 +625,7 @@ void DrawGameplayStatsOptionsTab() { UIWidgets::CheckboxOptions() .Tooltip("Timestamps are relative to starting timestamp rather than in game time, " "usually necessary for races/speedruns.\n\n" - "Starting timestamp is on first non-c-up input after intro cutscene.\n\n" + "Starting timestamp is on first non-C-up input after intro cutscene.\n\n" "NOTE: THIS NEEDS TO BE SET BEFORE CREATING A FILE TO TAKE EFFECT") .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Show additional detail timers", CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), @@ -869,9 +869,9 @@ void GameplayStatsWindow::InitElement() { SetupDisplayColors(); SaveManager::Instance->AddLoadFunction("sohStats", 1, LoadStatsVersion1); - // Add main section save, no parent + // Add main section save, no parent. SaveManager::Instance->AddSaveFunction("sohStats", 1, SaveStats, true, SECTION_PARENT_NONE); - // Add subsections, parent of "sohStats". Not sure how to do this without the redundant references to "SaveStats" + // Add subsections, parent of "sohStats". Not sure how to do this without the redundant references to "SaveStats". SaveManager::Instance->AddSaveFunction("entrances", 1, SaveStats, false, SECTION_ID_STATS); SaveManager::Instance->AddSaveFunction("scenes", 1, SaveStats, false, SECTION_ID_STATS); SaveManager::Instance->AddInitFunction(InitStats); diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 152239f5b..81612ddb2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -120,13 +120,13 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# vende #[[1]]#. hintTextTable[RHT_DEKU_TREE_HEART] = HintText(CustomMessage("They say that a #heart in the Deku Tree# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Deku-Baum# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ -hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", + hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", /*german*/ "Man erzählt sich, daß #auf König Dodongo# #[[1]]# läge.", /*french*/ "Selon moi, #par dessus le Roi Dodongo# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #sobre el Rey Dodongo# yace #[[1]]#. @@ -282,19 +282,19 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. hintTextTable[RHT_POT_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #pot in Dodongo's Cavern# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Dodongos Höhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_HEART] = HintText(CustomMessage("They say that a #heart in Dodongo's Cavern# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz in Dodongos Höhle# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur# dans la Caverne Dodongo# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer un air pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer un air orageux pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); @@ -446,22 +446,21 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #deku dentro de cierta deidad# vende #[[1]]#. hintTextTable[RHT_POT_JABU_JABUS_BELLY] = HintText(CustomMessage("They say that a #pot in Jabu Jabu's Belly# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Jabu-Jabus Bauch# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_JABU_JABU_RUPEE] = HintText(CustomMessage("They say that #underwater in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unter Wasser in Jabu-Jabus Bauch# #[[1]]# läge.", /*french*/ "Selon moi, #[[1]]# se trouve #sous l'eau dans le Ventre de Jabu Jabu#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_JABU_JABU_HEART] = HintText(CustomMessage("They say that near a #central lift in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich #nahe des zentralen Lifts in Jabu-Jabus Bauch# #[[1]]# befände.", /*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FOREST TEMPLE | ---------------------------*/ - hintTextTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", + hintTextTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Baum im Waldtempel# #[[1]]# unterstütze.", /*french*/ "Selon moi, sur l'#arbre dans le Temple de la Forêt# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, sobre un #árbol del Templo del Bosque# yace #[[1]]#. @@ -681,17 +680,17 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, #vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #pot in Forest Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Waldtempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FIRE TEMPLE | ---------------------------*/ -hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", + hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. @@ -877,11 +876,11 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_POT_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #pot in Fire Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Feuertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Fire Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Feuertempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple du Feu# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", @@ -1020,11 +1019,11 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. hintTextTable[RHT_POT_WATER_TEMPLE] = HintText(CustomMessage("They say that a #pot in Water Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Wassertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_HEART] = HintText(CustomMessage("They say that in a #river in the Water Temple# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in einem #Fluß im Wassertempel# #[[1]]# läge.", /*french*/ "Selon moi, une #rivière dans le Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun atop a small pillar before a duel with one's shadow# reveals #[[1]]#.", @@ -1273,7 +1272,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #pot in Spirit Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Geistertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.", @@ -1287,7 +1286,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ -hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", + hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# eine Halle der Gesichter durchdränge und #[[1]]# offenbaren würde.", /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubrirá un pasillo de facetas con #[[1]]#. @@ -1528,11 +1527,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_POT_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #pot in Shadow Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Schattentempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Shadow Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Schattentempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain for a sentry guarding a house of the dead# reveals #[[1]]#.", @@ -1666,27 +1665,27 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. hintTextTable[RHT_POT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("They say that a #pot in Bottom of the Well# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf dem Grund des Brunnens# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Puits# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_HEART] = HintText(CustomMessage("They say that a #heart within the well# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Brunnen# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# in the well leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #versteckter Pfad durch den Grund# im Brunnen zu #[[1]]# führe.", /*french*/ "Selon moi, un #passage caché sous le sol# dans le puits mène à #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun in an empty cell# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer leeren Zelle# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une cellule vide# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); @@ -1764,19 +1763,19 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. hintTextTable[RHT_POT_ICE_CAVERN] = HintText(CustomMessage("They say that a #pot in Ice Cavern# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Eiskaverne# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Polaire# contient #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einer #gefrorenen Säule# #[[1]]# läge.", /*french*/ "Selon moi, ", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Rubin in einer gefrorenen Kaverne# #[[1]]# verstecke.", /*french*/ "Selon moi, un #rubis dans la Caverne Polaire# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to a frozen cave# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens in der Nähe des Eingangs zu einer gefrorenen Kaverne# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie près de l’entrée d’une grotte gelée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. @@ -1784,27 +1783,27 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | Gerudo Training Ground | ---------------------------*/ hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Ground# drops #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", + /*german*/ "Man erzählt sich, daß ein #erblindetes Auge auf dem Gerudo-Trainingsgelände# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Ground# drops #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", + /*german*/ "Man erzählt sich, daß ein #erblindetes Auge auf dem Gerudo-Trainingsgelände# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Ground protect #[[1]]#.", - /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schützen würden.", + /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# auf dem Gerudo-Trainingsgelände #[[1]]# schützen würden.", /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Ground reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthülle.", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# auf dem Gerudo-Trainingsgelände #[[1]]# enthülle.", /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. @@ -1824,17 +1823,17 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# auf dem Gerudo-Trainingsgelände zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# auf dem Gerudo-Trainingsgelände zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #feurige Feinde# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #limaces de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. @@ -1878,12 +1877,12 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Grounds# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Ground# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens in der Nähe des Eingangs zum Gerudo-Trainingsgelände #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie près de l’entrée du Gymnase Gerudo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# auf dem Gerudo-Trainingsgelände zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. @@ -1898,7 +1897,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. @@ -1918,12 +1917,12 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #feurige Feinde# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #ennemis de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Ground protect #[[1]]#.", - /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schützen würden.", + /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# auf dem Gerudo-Trainingsgelände #[[1]]# schützen würden.", /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. @@ -1953,7 +1952,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Ground reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthülle.", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# auf dem Gerudo-Trainingsgelände #[[1]]# enthülle.", /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. @@ -1962,9 +1961,9 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinalfos# is #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, dans #une épreuve avec un Dinalfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinolfos# is #[[1]]#.", + /*german*/ "Man erzählt sich, daß das Sehen einer #Prüfung mit Dinodorus# #[[1]]# enthülle.", + /*french*/ "Selon moi, dans #une épreuve avec un Dinolfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | GANONS CASTLE | @@ -2050,11 +2049,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for a sentry in the test of the sands# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne für eine Wache in einer Prüfung der Sande# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil pour une sentinelle dans l’épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_SCRUBS_FAIRY] = HintText(CustomMessage("They say that within a #sanctuary before the final trial# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb eines #Heiligtum vor der finalen Prüfung# #[[1]]# ruhe.", /*french*/ "Selon moi, #dans un sanctuaire avant l’épreuve finale# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", @@ -2168,11 +2167,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_POT_GANONS_CASTLE] = HintText(CustomMessage("They say that a #pot in Ganon's Castle# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Ganons Schloß# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Château de Ganon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_HEART] = HintText(CustomMessage("They say that a #heart in Ganon's Castle# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz in Ganons Schloß# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN})); // clang-format on diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index efbb24d10..9bbb1e4af 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1493,67 +1493,67 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_POT_KOKIRI_FOREST] = HintText(CustomMessage("They say that a #pot in Kokiri Forest# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Kokiri-Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Fôret Kokiri# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GERUDO_FORTRESS] = HintText(CustomMessage("They say that a #pot in Gerudo Fortress# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Gerudo-Festung# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_WASTELAND] = HintText(CustomMessage("They say that a #pot in Haunted Wasteland# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Gespensterwüste# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Désert Hanté# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_MARKET] = HintText(CustomMessage("They say that a #pot in Market# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf dem Markt# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Place du Marché# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_KAKARIKO] = HintText(CustomMessage("They say that a #pot in Kakariko Village# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Kakariko# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village de Cocorico# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GRAVEYARD] = HintText(CustomMessage("They say that a #pot in Graveyard# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf dem Friedhof# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GORON_CITY] = HintText(CustomMessage("They say that a #pot in Goron City# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Goronia# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village Goron# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #pot in Death Mountain Crater# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Todeskrater# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre sur le Mont du Péril# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_DOMAIN] = HintText(CustomMessage("They say that a #pot in Zora's Domain# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Zoras Reich# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Domaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_FOUNTAIN] = HintText(CustomMessage("They say that a #pot in Zora's Fountain# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Zoras Quelle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Fontaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_LON_LON_RANCH] = HintText(CustomMessage("They say that a #pot in Lon Lon Ranch# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf der Lon Lon-Farm# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ranch Lon Lon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_FIELD] = HintText(CustomMessage("They say that a #pot in Hyrule Field# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Hylianischen Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Plaine d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #pot in Hyrule Castle# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Schloß Hyrule# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Château d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KOKIRI_FOREST_RUPEE] = HintText(CustomMessage("They say that a rupee in a #tranquil forest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Rubin in einem #ruhigen Wald# #[[1]]# verstecke.", /*french*/ "Selon moi, un rubis dans une #forêt tranquille# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_KOKIRI_FOREST_HEART] = HintText(CustomMessage("They say that a heart in a #tranquil forest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Herz in einem #ruhigen Wald# #[[1]]# verstecke.", /*french*/ "Selon moi, un cœur dans une #forêt tranquille# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_SARIAS_HOUSE_HEART] = HintText(CustomMessage("They say that a heart in a #dear friend's home# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Herz #im Heim eines lieben Freundes# #[[1]]# verstecke.", /*french*/ "Selon moi, un cœur dans la #maison d'une amie chère# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.", diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index 8b441c66e..9f4a0026a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -2080,14 +2080,14 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(un aimant à poisson)")}); // /*spanish*/(caña de pescar) - hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("Bombchu Bag", /*german*/"!!!", /*french*/"un Sac de Missiles Teigneux"), + hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("a Bombchu Bag", /*german*/"eine Krabbelminentasche", /*french*/"un Sac de Missiles Teigneux"), { CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs"), // /*spanish*/un montón de explosivos CustomMessage("something that can remove boulders", /*german*/"etwas, das Geröll entfernen kann", /*french*/"une chose qui enlève les rochers") // /*spanish*/algo que pueda quitar rocas }, { - CustomMessage("sack of mice", /*german*/"!!!", /*french*/"un Sac rempli de souris")}); + CustomMessage("sack of mice", /*german*/"ein Sack Mäuse", /*french*/"un Sac rempli de souris")}); hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "ein Universalschlüssel", /*french*/ "une Clé Squelette"), // /*spanish*/una Llave Maestra @@ -2097,49 +2097,50 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a master unlocker", /*german*/ "ein Meisterentsperrer", /*french*/ "un Kit de Déverrouillage") }); // /*spanish*/un desbloqueador maestro - hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"!!!", /*french*/"un Carquois Infini"), + + hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"ein unendlicher Köcher", /*french*/"un Carquois Infini"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"!!!", /*french*/"un Sac de Bombe sans fond"), + hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"eine unendliche Bombentasche", /*french*/"un Sac de Bombe sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"!!!", /*french*/"un Sac de Graine sans fond"), + hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"eine unendliche Samentasche", /*french*/"un Sac de Graine sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"!!!", /*french*/" des Bâtons Mojo illimités"), + hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"unendliche Deku-Stäbe", /*french*/"des Bâtons Mojo illimités"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nut", /*german*/"!!!", /*french*/"des Noix Mojo illimitées"), + hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nuts", /*german*/"unendliche Deku-Nüsse", /*french*/"des Noix Mojo illimitées"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"!!!", /*french*/"de la Magie infinie"), + hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"unendliche Magie", /*french*/"de la Magie infinie"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"!!!", /*french*/"des Missiles Teigneux illimités"), + hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"unendliche Krabbelminen", /*french*/"des Missiles Teigneux illimités"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"!!!", /*french*/"une Bourse sans fond"), + hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"eine unendliche Geldbörse", /*french*/"une Bourse sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 5fb2a401c..d8113edd3 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -17,7 +17,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_NONE] = Item(RG_NONE, Text{ "No Item", "Rien", "Kein Artikel" }, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_NONE, 0, 0, 0, 0, 0, ITEM_CATEGORY_JUNK, MOD_NONE); // Randomizer Get Randomizer Get Name Text Type Get Item ID Adv. Logic Value Hint Text Key Item ID Object ID Draw ID Text ID field Chest Animation Item Category Mod Index itemTable[RG_KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{ "Kokiri Sword", "Épée Kokiri", "Kokiri-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_KOKIRI, true, LOGIC_KOKIRI_SWORD, RHT_KOKIRI_SWORD, ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{ "Master Sword", "Épée de Legende", "Master-Schwert"}, ITEMTYPE_EQUIP, 0xE0, true, LOGIC_MASTER_SWORD, RHT_MASTER_SWORD, ITEM_SWORD_MASTER, OBJECT_TOKI_OBJECTS, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{ "Master Sword", "Épée de Legende", "Master-Schwert" }, ITEMTYPE_EQUIP, 0xE0, true, LOGIC_MASTER_SWORD, RHT_MASTER_SWORD, ITEM_SWORD_MASTER, OBJECT_TOKI_OBJECTS, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MASTER_SWORD].SetCustomDrawFunc(Randomizer_DrawMasterSword); itemTable[RG_GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{ "Giant's Knife", "Lame des Géants", "Langschwert" }, ITEMTYPE_EQUIP, GI_SWORD_KNIFE, true, LOGIC_NONE, RHT_GIANTS_KNIFE, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{ "Biggoron's Sword", "Épée de Biggoron", "Biggoron-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_BGS, true, LOGIC_BIGGORON_SWORD, RHT_BIGGORON_SWORD, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -171,6 +171,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Kleiner Schlüssel für Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors", "Kleiner Schlüssel für das Truhenspiel" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE); + itemTable[RG_TREASURE_GAME_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "", "Schlüssel für das Haus der Wachen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GUARD_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "", "Schlüssel für den Basar des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); @@ -189,7 +190,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BOMBCHU_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "", "Schlüssel für das Haus von Richard" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_RICHARDS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gäßchenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gassenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_ALLEY_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "", "Schlüssel für den Basar von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_KAK_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); @@ -232,7 +233,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_SHADOW_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "Schlüsselbund für den Grund des Brunnens" }, ITEMTYPE_SMALLKEY, 0xDA, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_KEY_RING, RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund für das Gerudo-Trainingsgelände" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund für das Gerudo-Trainingsgelände" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "Schlüsselbund für die Gerudo-Festung" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_FORTRESS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); @@ -316,23 +317,23 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BUY_RED_POTION_40] = Item(RG_BUY_RED_POTION_40, Text{ "Buy Red Potion [40]", "Acheter: Potion Rouge [40]", "Rotes Elixier kaufen [40]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 40); itemTable[RG_BUY_RED_POTION_50] = Item(RG_BUY_RED_POTION_50, Text{ "Buy Red Potion [50]", "Acheter: Potion Rouge [50]", "Rotes Elixier kaufen [50]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); // Misc. - itemTable[RG_GOHMA_SOUL] = Item(RG_GOHMA_SOUL, Text{ "Gohma's Soul", "Âme de Gohma", "Gohmas Seele" }, ITEMTYPE_ITEM, 0xE0, true, LOGIC_CAN_SUMMON_GOHMA, RHT_GOHMA_SOUL, RG_GOHMA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GOHMA_SOUL] = Item(RG_GOHMA_SOUL, Text{ "Gohma's Soul", "Âme de Gohma", "Gohmas Seele" }, ITEMTYPE_ITEM, 0xE0, true, LOGIC_CAN_SUMMON_GOHMA, RHT_GOHMA_SOUL, RG_GOHMA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_GOHMA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_KING_DODONGO_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{ "King Dodongo's Soul", "Âme du Roi Dodongo", "König Dodongos Seele" }, ITEMTYPE_ITEM, 0xE1, true, LOGIC_CAN_SUMMON_KINGDODONGO, RHT_KING_DODONGO_SOUL, RG_KING_DODONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_KING_DODONGO_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{ "King Dodongo's Soul", "Âme du Roi Dodongo", "König Dodongos Seele" }, ITEMTYPE_ITEM, 0xE1, true, LOGIC_CAN_SUMMON_KINGDODONGO, RHT_KING_DODONGO_SOUL, RG_KING_DODONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_KING_DODONGO_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_BARINADE_SOUL] = Item(RG_BARINADE_SOUL, Text{ "Barinade's Soul", "Âme de Barinade", "Barinades Seele" }, ITEMTYPE_ITEM, 0xE2, true, LOGIC_CAN_SUMMON_BARINADE, RHT_BARINADE_SOUL, RG_BARINADE_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BARINADE_SOUL] = Item(RG_BARINADE_SOUL, Text{ "Barinade's Soul", "Âme de Barinade", "Barinades Seele" }, ITEMTYPE_ITEM, 0xE2, true, LOGIC_CAN_SUMMON_BARINADE, RHT_BARINADE_SOUL, RG_BARINADE_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BARINADE_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_PHANTOM_GANON_SOUL] = Item(RG_PHANTOM_GANON_SOUL, Text{ "Phantom Ganon's Soul", "Âme de Ganon Spectral", "Phantom-Ganons Seele" }, ITEMTYPE_ITEM, 0xE3, true, LOGIC_CAN_SUMMON_PHANTOMGANON, RHT_PHANTOM_GANON_SOUL, RG_PHANTOM_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_PHANTOM_GANON_SOUL] = Item(RG_PHANTOM_GANON_SOUL, Text{ "Phantom Ganon's Soul", "Âme de Ganon Spectral", "Phantom-Ganons Seele" }, ITEMTYPE_ITEM, 0xE3, true, LOGIC_CAN_SUMMON_PHANTOMGANON, RHT_PHANTOM_GANON_SOUL, RG_PHANTOM_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_PHANTOM_GANON_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_VOLVAGIA_SOUL] = Item(RG_VOLVAGIA_SOUL, Text{ "Volvagia's Soul", "Âme de Vulcania", "Volvagias Seele" }, ITEMTYPE_ITEM, 0xE4, true, LOGIC_CAN_SUMMON_VOLVAGIA, RHT_VOLVAGIA_SOUL, RG_VOLVAGIA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_VOLVAGIA_SOUL] = Item(RG_VOLVAGIA_SOUL, Text{ "Volvagia's Soul", "Âme de Volcania", "Volvagias Seele" }, ITEMTYPE_ITEM, 0xE4, true, LOGIC_CAN_SUMMON_VOLVAGIA, RHT_VOLVAGIA_SOUL, RG_VOLVAGIA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_VOLVAGIA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_MORPHA_SOUL] = Item(RG_MORPHA_SOUL, Text{ "Morpha's Soul", "Âme de Morpha", "Morphas Seele" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_MORPHA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MORPHA_SOUL] = Item(RG_MORPHA_SOUL, Text{ "Morpha's Soul", "Âme de Morpha", "Morphas Seele" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_MORPHA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MORPHA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_BONGO_BONGO_SOUL] = Item(RG_BONGO_BONGO_SOUL, Text{ "Bongo Bongo's Soul", "Âme de Bongo Bongo", "Bongo Bongos Seele" }, ITEMTYPE_ITEM, 0xE6, true, LOGIC_CAN_SUMMON_BONGOBONGO, RHT_BONGO_BONGO_SOUL, RG_BONGO_BONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BONGO_BONGO_SOUL] = Item(RG_BONGO_BONGO_SOUL, Text{ "Bongo Bongo's Soul", "Âme de Bongo Bongo", "Bongo Bongos Seele" }, ITEMTYPE_ITEM, 0xE6, true, LOGIC_CAN_SUMMON_BONGOBONGO, RHT_BONGO_BONGO_SOUL, RG_BONGO_BONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BONGO_BONGO_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_TWINROVA_SOUL] = Item(RG_TWINROVA_SOUL, Text{ "Twinrova's Soul", "Âme du Duo Maléfique", "Twinrovas Seele" }, ITEMTYPE_ITEM, 0xE7, true, LOGIC_CAN_SUMMON_TWINROVA, RHT_TWINROVA_SOUL, RG_TWINROVA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_TWINROVA_SOUL] = Item(RG_TWINROVA_SOUL, Text{ "Twinrova's Soul", "Âme du Duo Maléfique", "Twinrovas Seele" }, ITEMTYPE_ITEM, 0xE7, true, LOGIC_CAN_SUMMON_TWINROVA, RHT_TWINROVA_SOUL, RG_TWINROVA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_TWINROVA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_GANON_SOUL] = Item(RG_GANON_SOUL, Text{ "Ganon's Soul", "Âme de Ganon", "Ganons Seele" }, ITEMTYPE_ITEM, 0xE8, true, LOGIC_CAN_SUMMON_GANON, RHT_GANON_SOUL, RG_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GANON_SOUL] = Item(RG_GANON_SOUL, Text{ "Ganon's Soul", "Âme de Ganon", "Ganons Seele" }, ITEMTYPE_ITEM, 0xE8, true, LOGIC_CAN_SUMMON_GANON, RHT_GANON_SOUL, RG_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_GANON_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); itemTable[RG_FISHING_POLE] = Item(RG_FISHING_POLE, Text{ "Fishing Pole", "Canne à Pêche", "Angelrute" }, ITEMTYPE_ITEM, RG_FISHING_POLE, true, LOGIC_FISHING_POLE, RHT_FISHING_POLE, RG_FISHING_POLE, OBJECT_GI_FISH, GID_FISHING_POLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_FISHING_POLE].SetCustomDrawFunc(Randomizer_DrawFishingPoleGI); @@ -348,28 +349,28 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "Taste C-Rechts der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_RIGHT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BRONZE_SCALE].SetCustomDrawFunc(Randomizer_DrawBronzeScale); - itemTable[RG_BOMBCHU_BAG] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "!!!", "Sac de Missiles Teigneux" }, ITEMTYPE_ITEM, RG_BOMBCHU_BAG, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_BAG, RG_BOMBCHU_BAG, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_BAG] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "Sac de Missiles Teigneux", "Krabbelminentasche" }, ITEMTYPE_ITEM, RG_BOMBCHU_BAG, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_BAG, RG_BOMBCHU_BAG, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BOMBCHU_BAG].SetCustomDrawFunc(Randomizer_DrawBombchuBag); - itemTable[RG_QUIVER_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Quiver", "Carquois Infini", "Unendlicher Köcher" }, ITEMTYPE_ITEM, RG_QUIVER_INF, true, LOGIC_PROGRESSIVE_BOW, RHT_QUIVER_INF, RG_QUIVER_INF, OBJECT_GI_ARROWCASE, GID_QUIVER_50, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BOMB_BAG_INF] = Item(RG_BOMB_BAG_INF, Text{ "Infinite Bomb Bag", "Sac de Bombes Infini", "Unendliche Bombentasche" }, ITEMTYPE_ITEM, RG_BOMB_BAG_INF, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG_INF, RG_BOMB_BAG_INF, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "Sac de Graines Infinis", "Unendliche Samentasche" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "Bâtons Mojo Infinis", "Unendliche Stab-Kapazität" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_NUT_UPGRADE_INF] = Item(RG_NUT_UPGRADE_INF, Text{ "Infinite Nut Capacity", "Noix Mojo Infinies", "Unendliche Nuß-Kapazität" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_MAGIC_INF] = Item(RG_MAGIC_INF, Text{ "Infinite Magic Meter", "Magie Infinie", "Unendliches Magisches Maß" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "Missiles Teigneux Infinis", "Unendliche Krabbelminen" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_QUIVER_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Quiver", "Carquois Infini", "Unendlicher Köcher" }, ITEMTYPE_ITEM, RG_QUIVER_INF, true, LOGIC_PROGRESSIVE_BOW, RHT_QUIVER_INF, RG_QUIVER_INF, OBJECT_GI_ARROWCASE, GID_QUIVER_50, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOMB_BAG_INF] = Item(RG_BOMB_BAG_INF, Text{ "Infinite Bomb Bag", "Sac de Bombes Infini", "Unendliche Bombentasche" }, ITEMTYPE_ITEM, RG_BOMB_BAG_INF, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG_INF, RG_BOMB_BAG_INF, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "Sac de Graines Infinis", "Unendliche Samentasche" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "Bâtons Mojo Infinis", "Unendliche Stab-Kapazität" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_NUT_UPGRADE_INF] = Item(RG_NUT_UPGRADE_INF, Text{ "Infinite Nut Capacity", "Noix Mojo Infinies", "Unendliche Nuß-Kapazität" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_MAGIC_INF] = Item(RG_MAGIC_INF, Text{ "Infinite Magic Meter", "Magie Infinie", "Unendliches Magisches Maß" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "Missiles Teigneux Infinis", "Unendliche Krabbelminen" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOMBCHU_INF].SetCustomDrawFunc(Randomizer_DrawBombchuBag); - itemTable[RG_WALLET_INF] = Item(RG_WALLET_INF, Text{ "Infinite Wallet", "Bourse Infinie", "Unendliche Geldbörse" }, ITEMTYPE_ITEM, RG_WALLET_INF, true, LOGIC_PROGRESSIVE_WALLET, RHT_WALLET_INF, RG_WALLET_INF, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WALLET_INF] = Item(RG_WALLET_INF, Text{ "Infinite Wallet", "Bourse Infinie", "Unendliche Geldbörse" }, ITEMTYPE_ITEM, RG_WALLET_INF, true, LOGIC_PROGRESSIVE_WALLET, RHT_WALLET_INF, RG_WALLET_INF, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_SKELETON_KEY] = Item(RG_SKELETON_KEY, Text{ "Skeleton Key", "Clé Squelette", "Skelettschlüssel" }, ITEMTYPE_ITEM, GI_STONE_OF_AGONY, true, LOGIC_SKELETON_KEY, RHT_SKELETON_KEY, RG_SKELETON_KEY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_SKELETON_KEY] = Item(RG_SKELETON_KEY, Text{ "Skeleton Key", "Clé Squelette", "Skelettschlüssel" }, ITEMTYPE_ITEM, GI_STONE_OF_AGONY, true, LOGIC_SKELETON_KEY, RHT_SKELETON_KEY, RG_SKELETON_KEY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_SKELETON_KEY].SetCustomDrawFunc(Randomizer_DrawSkeletonKey); - itemTable[RG_DEKU_STICK_BAG] = Item(RG_DEKU_STICK_BAG, Text{ "Deku Stick Bag", "Sac de Bâton Mojo", "Deku-Stab-Tasche" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_NONE, RG_DEKU_STICK_BAG, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_DEKU_STICK_BAG] = Item(RG_DEKU_STICK_BAG, Text{ "Deku Stick Bag", "Sac de Bâton Mojo", "Deku-Stab-Tasche" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_NONE, RG_DEKU_STICK_BAG, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_DEKU_NUT_BAG] = Item(RG_DEKU_NUT_BAG, Text{ "Deku Nut Bag", "Sac de Noix Mojo", "Deku-Nuß-Tasche" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NONE, RG_DEKU_NUT_BAG, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_DEKU_NUT_BAG] = Item(RG_DEKU_NUT_BAG, Text{ "Deku Nut Bag", "Sac de Noix Mojo", "Deku-Nuß-Tasche" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NONE, RG_DEKU_NUT_BAG, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, LOGIC_NONE, RHT_NONE); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, LOGIC_NONE, RHT_NONE); @@ -391,11 +392,11 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{ "Silver Gauntlets", "Gantelets d'argent", "Silberhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_SILVER, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_SILVER_GAUNTLETS, ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{ "Golden Gauntlets", "Gantelets d'or", "Goldhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_GOLD, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GOLDEN_GAUNTLETS, ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_SILVER_SCALE] = Item(RG_SILVER_SCALE, Text{ "Silver Scale", "Écaille d'argent", "Silberne Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_SCALE, RHT_SILVER_SCALE, ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Écaille d'or", "Goldene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_GOLDEN, true, LOGIC_PROGRESSIVE_SCALE, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Écaille d'or", "Goldene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_GOLDEN, true, LOGIC_PROGRESSIVE_SCALE, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{ "Adult Wallet", "Grande Bourse", "Erwachsenengeldbörse" }, ITEMTYPE_ITEM, GI_WALLET_ADULT, true, LOGIC_PROGRESSIVE_WALLET, RHT_ADULT_WALLET, ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{ "Giant Wallet", "Bourse de Géant", "Riesige Geldbörse" }, ITEMTYPE_ITEM, GI_WALLET_GIANT, true, LOGIC_PROGRESSIVE_WALLET, RHT_GIANT_WALLET, ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_TYCOON_WALLET] = Item(RG_TYCOON_WALLET, Text{ "Tycoon Wallet", "Bourse de Magnat", "Goldene Geldbörse" }, ITEMTYPE_ITEM, RG_TYCOON_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_TYCOON_WALLET, RG_TYCOON_WALLET, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_CHILD_WALLET] = Item(RG_CHILD_WALLET, Text{ "Child Wallet", "Petite Bourse", "Kindergeldbörse" }, ITEMTYPE_ITEM, RG_CHILD_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_CHILD_WALLET, RG_CHILD_WALLET, OBJECT_GI_PURSE, GID_WALLET_ADULT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_CHILD_WALLET] = Item(RG_CHILD_WALLET, Text{ "Child Wallet", "Petite Bourse", "Kindergeldbörse" }, ITEMTYPE_ITEM, RG_CHILD_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_CHILD_WALLET, RG_CHILD_WALLET, OBJECT_GI_PURSE, GID_WALLET_ADULT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_DEKU_NUT_CAPACITY_30] = Item(RG_DEKU_NUT_CAPACITY_30, Text{ "Deku Nut Capacity (30)", "Capacité de noix Mojo (30)", "Deku-Nuß-Kapazität (30)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_30, ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_NUT_CAPACITY_40] = Item(RG_DEKU_NUT_CAPACITY_40, Text{ "Deku Nut Capacity (40)", "Capacité de noix Mojo (40)", "Deku-Nuß-Kapazität (40)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_40, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_40, ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_STICK_CAPACITY_20] = Item(RG_DEKU_STICK_CAPACITY_20, Text{ "Deku Stick Capacity (20)", "Capacité de Bâtons Mojo (20)", "Deku-Stab-Kapazität (20)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_20, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_20, ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index fa2a3098e..4eac2e5bb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3460,8 +3460,8 @@ void Randomizer::CreateCustomMessages() { "Du erhältst einen %rkleinen&Schlüssel%w für den %pGrund des Brunnens%w!", "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %yGerudo Training &Grounds %wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!", + "You found a %yGerudo Training &Ground %wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %yGerudo-Trainingsgelände%w!", "Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rGanon's Castle &%wSmall Key!", @@ -3593,8 +3593,8 @@ void Randomizer::CreateCustomMessages() { "Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!", "Vous obtenez le trousseau de&clés du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, - "You found a %yGerudo Training&Grounds %wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für die %yGerudo-Trainingsarena%w!", + "You found a %yGerudo Training&Ground %wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für das %yGerudo-Trainingsgelände%w!", "Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rGanon's Castle&%wKeyring!", @@ -3602,7 +3602,7 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez le trousseau de&clés du %rChâteau de Ganon%w!"), GIMESSAGE(RG_TREASURE_GAME_KEY_RING, ITEM_KEY_SMALL, "You found a %rTreasure Chest Game&%wKeyring!", - "!!!", + "Du erhältst ein %rSchlüsselbund%w& für das %rSchatztruhen-Poker&%w!", "Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"), GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, @@ -3725,32 +3725,41 @@ void Randomizer::CreateCustomMessages() { "Du erhältst die %rKindergeldbörse%w!&Jetzt kannst Du bis&zu %y99 Rubine%w mit Dir führen!", "Vous obtenez la %rPetite Bourse%w!&Elle peut contenir jusqu'à %y99 rubis%w!"), - GIMESSAGE_NO_GERMAN(RG_GOHMA_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_GOHMA_SOUL, ITEM_BIG_POE, "You found the soul for %gGohma%w!", + "Du hast die Seele von %gGohma%w gefunden!", "Vous obtenez l'âme de %gGohma%w!"), - GIMESSAGE_NO_GERMAN(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, "You found the soul for %rKing&Dodongo%w!", + "Du hast die Seele von %rKönig&Dodongo%w gefunden!", "Vous obtenez l'âme du %rRoi Dodongo%w!"), - GIMESSAGE_NO_GERMAN(RG_BARINADE_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_BARINADE_SOUL, ITEM_BIG_POE, "You found the soul for %bBarinade%w!", + "Du hast die Seele von %bBarinade%w gefunden!", "Vous obtenez l'âme de %bBarinade%w!"), - GIMESSAGE_NO_GERMAN(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %gPhantom&Ganon%w!", + "Du hast die Seele von %gPhantom-&Ganon%w gefunden!", "Vous obtenez l'âme de %gGanon&Spectral%w!"), - GIMESSAGE_NO_GERMAN(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, "You found the soul for %rVolvagia%w!", - "Vous obtenez l'âme de %rVulcania%w!"), - GIMESSAGE_NO_GERMAN(RG_MORPHA_SOUL, ITEM_BIG_POE, + "Du hast die Seele von %rVolvagia%w gefunden!", + "Vous obtenez l'âme de %rVolcania%w!"), + GIMESSAGE(RG_MORPHA_SOUL, ITEM_BIG_POE, "You found the soul for %bMorpha%w!", + "Du hast die Seele von %bMorpha%w gefunden!", "Vous obtenez l'âme de %bMorpha%w!"), - GIMESSAGE_NO_GERMAN(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, "You found the soul for %pBongo&Bongo%w!", + "Du hast die Seele von %pBongo&Bongo%w gefunden!", "Vous obtenez l'âme de %pBongo&Bongo%w!"), - GIMESSAGE_NO_GERMAN(RG_TWINROVA_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_TWINROVA_SOUL, ITEM_BIG_POE, "You found the soul for %yTwinrova%w!", + "Du hast die Seele von %yTwinrova%w gefunden!", "Vous obtenez l'âme du %yDuo&Maléfique%w!"), - GIMESSAGE_NO_GERMAN(RG_GANON_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %cGanon%w!", + "Du hast die Seele von %cGanon%w gefunden!", "Vous obtenez l'âme de %cGanon%w!"), GIMESSAGE(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, @@ -3774,47 +3783,61 @@ void Randomizer::CreateCustomMessages() { "Der %y\xa6%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", "Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), - GIMESSAGE_NO_GERMAN(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, + GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!", + "Du hast die %rBronzene Schuppe%w erhalten!&Die Macht der Schwungkraft ist dein!", "Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"), - GIMESSAGE_NO_GERMAN(RG_FISHING_POLE, ITEM_FISHING_POLE, + GIMESSAGE(RG_FISHING_POLE, ITEM_FISHING_POLE, "You found a lost %rFishing Pole%w!&Time to hit the pond!", + "Du hast eine verlorene %rAngelrute%w gefunden!&Zeit, im Teich zu angeln!", "Vous obtenez une %rCanne à pêche%w&perdue!&Il est temps d'aller à %gl'étang%w!"), - GIMESSAGE_NO_GERMAN(RG_BOMBCHU_BAG, ITEM_BOMBCHU, + GIMESSAGE(RG_BOMBCHU_BAG, ITEM_BOMBCHU, "You found the %rBombchu Bag%w!", + "Du hast die %rKrabbelminentasche%w&gefunden!", "Vous obtenez un %rSac de Missiles&Teigneux%w!"), - GIMESSAGE_NO_GERMAN(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, + GIMESSAGE(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", + "Du hast eine %runendliche Bombentasche%w&gefunden! Nun hast Du &%yunendliche Bomben%w!", "Vous obtenez un %rSac de Bombes&sans fond%w!&Vous avez maintenant des %ybombes&en quantité illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_QUIVER_INF, ITEM_QUIVER_50, + GIMESSAGE(RG_QUIVER_INF, ITEM_QUIVER_50, "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", + "Du hast einen %runendlichen Köcher%w&gefunden! Nun hast Du &%yunendliche Pfeile%w!", "Vous obtenez un %rCarquois Infini%w!&Vous avez maintenant des %yflèches&de manière illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, + GIMESSAGE(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", + "Du hast eine %runendliche Samentasche%w&gefunden! Nun hast Du &%yunendliche Samen%w!", "Vous obtenez un %rSac de Graines&sans fond%w!&Vous avez maintenant des %ygraines&de lance-pierres à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_STICK_UPGRADE_INF, ITEM_STICK, + GIMESSAGE(RG_STICK_UPGRADE_INF, ITEM_STICK, "You now have %yinfinite%w %rDeku Sticks%w!", + "Du hast nun %yrunendliche%w %rDeku-Stäbe%w!", "Vous avez maintenant des %yBâtons&Mojo de manière illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_NUT_UPGRADE_INF, ITEM_NUT, + GIMESSAGE(RG_NUT_UPGRADE_INF, ITEM_NUT, "You now have %yinfinite%w %rDeku Nuts%w!", + "Du hast nun %yunendliche%w %rDeku-Nüsse%w!", "Vous avez maintenant des %yNoix&Mojo de manière illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_MAGIC_INF, ITEM_MAGIC_LARGE, + GIMESSAGE(RG_MAGIC_INF, ITEM_MAGIC_LARGE, "You now have %yinfinite%w %rMagic%w!", + "Du hast nun %yunendliche%w %rMagiew!", "Vous avez maintenant une quantité&de %ymagie illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_BOMBCHU_INF, ITEM_BOMBCHU, + GIMESSAGE(RG_BOMBCHU_INF, ITEM_BOMBCHU, "You now have %yinfinite%w %rBombchus%w!", + "Du hast nun %yunendliche%w %rKrabbelminen%w!", "Vous avez maintenant des %yMissiles&Teigneux en quantité illimités%w!"), - GIMESSAGE_NO_GERMAN(RG_WALLET_INF, ITEM_WALLET_GIANT, + GIMESSAGE(RG_WALLET_INF, ITEM_WALLET_GIANT, "You now have %yinfinite%w %rmoney%w!", + "Du hast nun %yunendliche%w %rRubinew!", "Vous avez maintenant des %yRubis en& quantité illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_SKELETON_KEY, ITEM_KEY_SMALL, + GIMESSAGE(RG_SKELETON_KEY, ITEM_KEY_SMALL, "You found the %rSkeleton Key%w!", + "Du hast den %rSkelettschlüssel%w gefunden!", "Vous avez trouvé la %rClé Squelette%w!"), - GIMESSAGE_NO_GERMAN(RG_DEKU_STICK_BAG, ITEM_STICK, - "You found the %rDeku Stick Bag%w!&You can now hold deku sticks!", + GIMESSAGE(RG_DEKU_STICK_BAG, ITEM_STICK, + "You found the %rDeku Stick Bag%w!&You can now hold Deku Sticks!", + "Du hast eine %rDeku-Stab-Tasche%w&gefunden! Nun kannst Du &%yDeku-Stäbe%w halten!", "Vous avez trouvé le %rSac de Bâtons&Mojo%w!&Vous pouvez maintenant porter des&Bâtons Mojo!"), - GIMESSAGE_NO_GERMAN(RG_DEKU_NUT_BAG, ITEM_NUT, - "You found the %rDeku Nut Bag%w!&You can now hold deku nuts!", + GIMESSAGE(RG_DEKU_NUT_BAG, ITEM_NUT, + "You found the %rDeku Nut Bag%w!&You can now hold Deku Nuts!", + "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-Nüsse%w halten!", "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), }}; CreateGetItemMessages(getItemMessages); diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index fba7c688b..f43fecf9e 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -32,9 +32,9 @@ void StartingItemGive(GetItemEntry getItemEntry, RandomizerCheck randomizerCheck } } -// RANDOTODO replace most of these GiveLink functions with calls to +// RANDOTODO: Replace most of these GiveLink functions with calls to // Item_Give in z_parameter, we'll need to update Item_Give to ensure -// nothing breaks when calling it without a valid play first +// nothing breaks when calling it without a valid play first. void GiveLinkRupees(int numOfRupees) { int maxRupeeCount = 0; if (CUR_UPG_VALUE(UPG_WALLET) == 0) { @@ -101,7 +101,7 @@ void GiveLinksPocketItem() { if (Randomizer_GetSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, (GetItemID)RG_NONE); StartingItemGive(getItemEntry, RC_LINKS_POCKET); - // If we re-add the above, we'll get the item on save creation, now it's given on first load + // If we re-add the above, we'll get the item on save creation, now it's given on first load. Flags_SetRandomizerInf(RAND_INF_LINKS_POCKET); } } @@ -194,9 +194,9 @@ void SetStartingItems() { // Logic cannot handle vanilla key layout in some dungeons // this is because vanilla expects the dungeon major item to be // locked behind the keys, which is not always true in rando. - // We can resolve this by starting with some extra keys + // We can resolve this by starting with some extra keys. if (ResourceMgr_IsSceneMasterQuest(SCENE_SPIRIT_TEMPLE)) { - // MQ Spirit needs 3 keys + // MQ Spirit needs 3 keys. gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; gSaveContext.ship.stats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; } @@ -222,10 +222,10 @@ extern "C" void Randomizer_InitSaveFile() { // Starts pending ice traps out at 0 before potentially incrementing them down the line. gSaveContext.ship.pendingIceTrapCount = 0; - // Reset triforce pieces collected + // Reset triforce pieces collected. gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected = 0; - // Set Cutscene flags and texts to skip them + // Set Cutscene flags and texts to skip them. Flags_SetEventChkInf(EVENTCHKINF_FIRST_SPOKE_TO_MIDO); Flags_SetInfTable(INFTABLE_SPOKE_TO_KAEPORA_IN_LAKE_HYLIA); Flags_SetEventChkInf(EVENTCHKINF_SHEIK_SPAWNED_AT_MASTER_SWORD_PEDESTAL); @@ -234,7 +234,7 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_NABOORU_IN_SPIRIT_TEMPLE); - // Go away ruto (water temple first cutscene) + // Go away Ruto (Water Temple first cutscene). gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x10); if (Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS) == RO_GENERIC_OFF) { @@ -260,7 +260,7 @@ extern "C" void Randomizer_InitSaveFile() { // Give Link's pocket item GiveLinksPocketItem(); - // remove One Time scrubs with scrubsanity off + // Remove One Time Scrubs with Scrubsanity off if (Randomizer_GetSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_OFF) { Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE); Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT); @@ -272,7 +272,7 @@ extern "C" void Randomizer_InitSaveFile() { case RO_AGE_ADULT: // Adult gSaveContext.linkAge = LINK_AGE_ADULT; gSaveContext.entranceIndex = ENTR_TEMPLE_OF_TIME_WARP_PAD; - gSaveContext.savedSceneNum = SCENE_LON_LON_RANCH; // Set scene num manually to ToT + gSaveContext.savedSceneNum = SCENE_LON_LON_RANCH; // Set scene num manually to ToT. break; case RO_AGE_CHILD: // Child gSaveContext.linkAge = LINK_AGE_CHILD; @@ -284,7 +284,7 @@ extern "C" void Randomizer_InitSaveFile() { if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS)) { // Override the spawn entrance so entrance rando can take control, - // and to prevent remember save location from breaking inital spawn + // and to prevent remember save location from breaking initial spawn. gSaveContext.entranceIndex = -1; } @@ -304,7 +304,7 @@ extern "C" void Randomizer_InitSaveFile() { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_SONG_FROM_IMPA, (GetItemID)RG_ZELDAS_LULLABY); StartingItemGive(getItemEntry, RC_SONG_FROM_IMPA); - // malon/talon back at ranch + // Malon/Talon back at ranch. Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_POCKET_EGG); Flags_SetEventChkInf(EVENTCHKINF_TALON_WOKEN_IN_CASTLE); Flags_SetEventChkInf(EVENTCHKINF_TALON_RETURNED_FROM_CASTLE); @@ -313,13 +313,13 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER); Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); - // Got item from impa + // Got item from Impa. Flags_SetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY); - gSaveContext.sceneFlags[SCENE_HYRULE_CASTLE].swch |= (1 << 0x4); // move milk crates in hyrule castle to moat + gSaveContext.sceneFlags[SCENE_HYRULE_CASTLE].swch |= (1 << 0x4); // Move milk crates in Hyrule Castle to moat. - // set this at the end to ensure we always start with the letter - // this is for the off chance we got the weird egg from impa (which should never happen) + // Set this at the end to ensure we always start with the letter. + // This is for the off chance, we got the Weird Egg from Impa (which should never happen). INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_LETTER_ZELDA; Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } @@ -336,8 +336,8 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetEventChkInf(EVENTCHKINF_EPONA_OBTAINED); } - // Open lowest Vanilla Fire Temple locked door (to prevent key logic lockouts) - // Not done on keysanity since this lockout is a non issue when Fire keys can be found outside the temple + // Open lowest Vanilla Fire Temple locked door (to prevent key logic lockouts). + // Not done on Keysanity since this lockout is a non-issue when Fire Keys can be found outside the temple. u8 keysanity = Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANYWHERE || Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_OVERWORLD || Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANY_DUNGEON; @@ -345,14 +345,14 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.sceneFlags[SCENE_FIRE_TEMPLE].swch |= (1 << 0x17); } - // Opens locked Water Temple door in vanilla to prevent softlocks - // West door on the middle level that leads to the water raising thing - // Happens in 3DS rando and N64 rando as well + // Opens locked Water Temple door in vanilla to prevent softlocks. + // West door on the middle level that leads to the water raising thing. + // Happens in 3DS rando and N64 rando as well. if (!ResourceMgr_IsSceneMasterQuest(SCENE_WATER_TEMPLE)) { gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x15); } - // Now handled on the fly + // Now handled on the fly. // int openForest = Randomizer_GetSettingValue(RSK_FOREST); // switch (openForest) { // case RO_CLOSED_FOREST_OFF: @@ -423,7 +423,7 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.itemGetInf[3] |= 0x100; // Sold Keaton Mask gSaveContext.itemGetInf[3] |= 0x200; // Sold Skull Mask gSaveContext.itemGetInf[3] |= 0x400; // Sold Spooky Mask - gSaveContext.itemGetInf[3] |= 0x800; // bunny hood related + gSaveContext.itemGetInf[3] |= 0x800; // Bunny Hood related gSaveContext.itemGetInf[3] |= 0x8000; // Obtained Mask of Truth } diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f001a7cb7..39f367a1e 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -344,20 +344,20 @@ void Settings::CreateOptions() { // OPT_TRICK(RT_GROUND_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Clip", "Enables locations requiring ground clips."); // OPT_TRICK(RT_GROUND_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Jump", "Enables locations requiring ground jumps."); // OPT_TRICK(RT_HESS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "HESS", "Enables locations requiring a Hyper Extended Super Slide."); - // OPT_TRICK(RT_HOOKSHOT_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Clip", "Enables locations requiring hookshot clips."); - // OPT_TRICK(RT_HOOKSHOT_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Jump", "Enables locations requiring hookshot jumps."); + // OPT_TRICK(RT_HOOKSHOT_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Clip", "Enables locations requiring Hookshot clips."); + // OPT_TRICK(RT_HOOKSHOT_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Jump", "Enables locations requiring Hookshot jumps."); // OPT_TRICK(RT_ISG, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "ISG", "Enables locations requiring use of the infinite sword glitch."); OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Pass Through Visible One-Way Collision", "Allows climbing through the platform to reach Impa's House Back as adult with no items and going through the Kakariko Village Gate as child when coming from the Mountain Trail side."); OPT_TRICK(RT_GROTTOS_WITHOUT_AGONY, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hidden Grottos without Stone of Agony", "Allows entering hidden grottos without the Stone of Agony."); - OPT_TRICK(RT_FEWER_TUNIC_REQUIREMENTS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Fewer Tunic Requirements", "Allows the following possible without Tunics:\n- Enter Water Temple. The area below the center pillar still requires Zora Tunic. Applies to MQ also.\n- Enter Fire Temple. Volvagia still requires Goron tunic. Applies to MQ also, and includes child access to first floor with dungeon shuffle."); + OPT_TRICK(RT_FEWER_TUNIC_REQUIREMENTS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Fewer Tunic Requirements", "Allows the following possible without Tunics:\n- Enter Water Temple. The area below the center pillar still requires Zora Tunic. Applies to MQ also.\n- Enter Fire Temple. Volvagia still requires Goron Tunic. Applies to MQ also, and includes child access to first floor with dungeon shuffle."); OPT_TRICK(RT_RUSTED_SWITCHES, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hammer Rusted Switches Through Walls", "Applies to:\n- Fire Temple Highest Goron Chest.\n- MQ Fire Temple Lizalfos Maze.\n- MQ Spirit Trial."); OPT_TRICK(RT_FLAMING_CHESTS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Flaming Chests", "The chests encircled in flames in Gerudo Training Ground and in Spirit Temple can be opened by running into the flames while Link is invincible after taking damage."); // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely decoupled from rando // OPT_TRICK(RT_BUNNY_HOOD_JUMPS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED}, "Bunny Hood Jumps", "Allows reaching locations using Bunny Hood's extended jumps."); OPT_TRICK(RT_DAMAGE_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple damage boosts", "Allows damage boosts in order to reach further locations. Can be combined with \"Simple hover boosts\" for reaching far distances."); OPT_TRICK(RT_HOVER_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple hover boosts", "Allows equipping of hover boots when link is moving at high speeds to extend distance covered. Can be combined with \"Simple damage boosts\" for greater uses."); - OPT_TRICK(RT_BOMBCHU_BEEHIVES, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Bombchu Beehives", "Allows exploding beehives with bombchus."); + OPT_TRICK(RT_BOMBCHU_BEEHIVES, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Bombchu Beehives", "Allows exploding beehives with Bombchus."); OPT_TRICK(RT_BLUE_FIRE_MUD_WALLS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Break Mud Walls with Blue Fire", "Use Blue Fire to break mud walls."); OPT_TRICK(RT_KF_ADULT_GS, RCQUEST_BOTH, RA_KOKIRI_FOREST, {Tricks::Tag::NOVICE}, "Adult Kokiri Forest GS with Hover Boots", "Can be obtained without Hookshot by using the Hover Boots off of one of the roots."); OPT_TRICK(RT_LW_BRIDGE, RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::EXPERT}, "Jump onto the Lost Woods Bridge as Adult with Nothing", "With very precise movement it's possible for adult to jump onto the bridge without needing Longshot, Hover Boots, or Bean."); @@ -383,8 +383,8 @@ void Settings::CreateOptions() { // disabled for now, only applies when trade quest is not shuffled so there's a timer (currently not considered in logic) // OPT_TRICK(RT_DMT_BOLERO_BIGGORON, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Deliver Eye Drops with Bolero of Fire", "Playing a warp song normally causes a trade item to spoil immediately, however, it is possible use Bolero to reach Biggoron and still deliver the Eye Drops before they spoil. If you do not wear the Goron Tunic, the heat timer inside the crater will override the trade item\'s timer. When you exit to Death Mountain Trail you will have one second to show the Eye Drops before they expire. You can get extra time to show the Eye Drops if you warp immediately upon receiving them. If you don't have many hearts, you may have to reset the heat timer by quickly dipping in and out of Darunia\'s chamber or quickly equipping and unequipping the Goron Tunic. This trick does not apply if \"Randomize Warp Song Destinations\" is enabled, or if the settings are such that trade items do not need to be delivered within a time limit."); OPT_TRICK(RT_GC_POT, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Spinning Pot PoH with Bombchu", "A Bombchu can be used to stop the spinning pot, but it can be quite finicky to get it to work."); - OPT_TRICK(RT_GC_POT_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Goron City Spinning Pot PoH with Strength", "Allows for stopping the Goron City Spinning Pot using a bomb flower alone, requiring strength in lieu of inventory explosives."); - OPT_TRICK(RT_GC_ROLLING_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Rolling Goron (Hot Rodder Goron) as Child with Strength", "Use the bombflower on the stairs or near Medigoron. Timing is tight, especially without backwalking."); + OPT_TRICK(RT_GC_POT_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Goron City Spinning Pot PoH with Strength", "Allows for stopping the Goron City Spinning Pot using a Bomb Flower alone, requiring strength in lieu of inventory explosives."); + OPT_TRICK(RT_GC_ROLLING_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Rolling Goron (Hot Rodder Goron) as Child with Strength", "Use the Bomb Flower on the stairs or near Medigoron. Timing is tight, especially without backwalking."); OPT_TRICK(RT_GC_LEFTMOST, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Maze Left Chest with Hover Boots", "A precise backwalk starting from on top of the crate and ending with a precisely-timed backflip can reach this chest without needing either the Hammer or Silver Gauntlets."); OPT_TRICK(RT_GC_GROTTO, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Grotto with Hookshot While Taking Damage", "It is possible to reach the Goron City Grotto by quickly using the Hookshot while in the midst of taking damage from the lava floor."); OPT_TRICK(RT_GC_LINK_GORON_DINS, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::NOVICE}, "Stop Link the Goron with Din\'s Fire", "The timing is quite awkward."); @@ -405,39 +405,39 @@ void Settings::CreateOptions() { OPT_TRICK(RT_GV_CRATE_HOVERS, RCQUEST_BOTH, RA_GERUDO_VALLEY, {Tricks::Tag::INTERMEDIATE}, "Gerudo Valley Crate PoH as Adult with Hover Boots", "From the far side of Gerudo Valley, a precise Hover Boots movement and jump-slash recoil can allow adult to reach the ledge with the crate PoH without needing Longshot. You will take fall damage."); OPT_TRICK(RT_GF_KITCHEN, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Thieves\' Hideout \"Kitchen\" with No Additional Items", "Allows passing through the kitchen by avoiding being seen by the guards. The logic normally guarantees Bow or Hookshot to stun them from a distance, or Hover Boots to cross the room without needing to deal with the guards."); OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Ledge Jumps", "Adult can jump onto the top roof of the fortress without going through the interior of the hideout."); - OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Warriors with Difficult Weapons", "Warriors can be defeated with slingshot or bombchus."); + OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Warriors with Difficult Weapons", "Warriors can be defeated with Slingshot or Bombchus."); // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely decoupled from rando // OPT_TRICK(RT_HW_BUNNY_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::NOVICE}, "Wasteland Crossing with Bunny Hood", "You can beat the quicksand by using the increased speed of the Bunny Hood. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); OPT_TRICK(RT_HW_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Wasteland Crossing without Hover Boots or Longshot", "You can beat the quicksand by backwalking across it in a specific way. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); OPT_TRICK(RT_LENS_HW, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Lensless Wasteland", "By memorizing the path, you can travel through the Wasteland without using the Lens of Truth to see the Poe. The equivalent trick for going in reverse through the Wasteland is \"Reverse Wasteland\"."); - OPT_TRICK(RT_HW_REVERSE, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Reverse Wasteland", "By memorizing the path, you can travel through the Wasteland in reverse. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash. The equivalent trick for going forward through the Wasteland is \"Lensless Wasteland\". To cross the river of sand with no additional items, be sure to also enable \"Wasteland Crossing without Hover Boots or Longshot\". Unless all overworld entrances are randomized, child Link will not be expected to do anything at Gerudo's Fortress."); + OPT_TRICK(RT_HW_REVERSE, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Reverse Wasteland", "By memorizing the path, you can travel through the Wasteland in reverse. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash. The equivalent trick for going forward through the Wasteland is \"Lensless Wasteland\". To cross the river of sand with no additional items, be sure to also enable \"Wasteland Crossing without Hover Boots or Longshot\". Unless all overworld entrances are randomized, Child Link will not be expected to do anything at Gerudo's Fortress."); OPT_TRICK(RT_COLOSSUS_GS, RCQUEST_BOTH, RA_DESERT_COLOSSUS, {Tricks::Tag::NOVICE}, "Colossus Hill GS with Hookshot", "Somewhat precise. If you kill enough Leevers you can get enough of a break to take some time to aim more carefully."); OPT_TRICK(RT_DEKU_BASEMENT_GS, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Vines GS with Jump Slash", "Can be defeated by doing a precise jump slash."); OPT_TRICK(RT_DEKU_B1_SKIP, RCQUEST_BOTH, RA_DEKU_TREE, {Tricks::Tag::INTERMEDIATE}, "Deku Tree Basement without Slingshot", "A precise jump can be used to skip needing to use the Slingshot to go around B1 of the Deku Tree. If used with the \"Closed Forest\" setting, a Slingshot will not be guaranteed to exist somewhere inside the Forest. This trick applies to both Vanilla and Master Quest."); OPT_TRICK(RT_DEKU_B1_BOW_WEBS, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Web to Gohma with Bow", "All spider web walls in the Deku Tree basement can be burnt as adult with just a bow by shooting through torches. This trick only applies to the circular web leading to Gohma; the two vertical webs are always in logic. Backflip onto the chest near the torch at the bottom of the vine wall. With precise positioning you can shoot through the torch to the right edge of the circular web. This allows completion of adult Deku Tree with no fire source."); - OPT_TRICK(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Backflip over Spiked Log", "Allows backflipping over the spiked log in the Deku Tree basement in vanilla. Only relevant if \"Shuffle Swim\" is enabled."); + OPT_TRICK(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Backflip over Spiked Log", "Allows backflipping over the spiked log in the Deku Tree basement in Vanilla. Only relevant if \"Shuffle Swim\" is enabled."); OPT_TRICK(RT_DEKU_MQ_COMPASS_GS, RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Compass Room GS Boulders with Just Hammer", "Climb to the top of the vines, then let go and jump slash immediately to destroy the boulders using the Hammer, without needing to spawn a Song of Time block."); OPT_TRICK(RT_DEKU_MQ_LOG, RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Roll Under the Spiked Log", "You can get past the spiked log by rolling to briefly shrink your hitbox. As adult, the timing is a bit more precise."); OPT_TRICK(RT_DC_SCARECROW_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Scarecrow GS with Armos Statue", "You can jump off an Armos Statue to reach the alcove with the Gold Skulltula. It takes quite a long time to pull the statue the entire way. The jump to the alcove can be a bit picky when done as child."); OPT_TRICK(RT_DC_VINES_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Vines GS from Below with Longshot", "The vines upon which this Skulltula rests are one-sided collision. You can use the Longshot to get it from below, by shooting it through the vines, bypassing the need to lower the staircase."); OPT_TRICK(RT_DC_STAIRCASE, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Staircase with Bow", "The Bow can be used to knock down the stairs with two well-timed shots."); OPT_TRICK(RT_DC_SLINGSHOT_SKIP, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern Child Slingshot Skips", "With precise platforming, child can cross the platforms while the flame circles are there. When enabling this trick, it's recommended that you also enable the Adult variant: \"Dodongo's Cavern Spike Trap Room Jump without Hover Boots\"."); - OPT_TRICK(RT_DC_SCRUB_ROOM, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Two Scrub Room with Strength", "With help from a conveniently-positioned block, Adult can quickly carry a bomb flower over to destroy the mud wall blocking the room with two Deku Scrubs."); - OPT_TRICK(RT_DC_JUMP, RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots", "The jump is adult Link only. Applies to both Vanilla and MQ."); + OPT_TRICK(RT_DC_SCRUB_ROOM, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Two Scrub Room with Strength", "With help from a conveniently-positioned block, Adult can quickly carry a Bomb Flower over to destroy the mud wall blocking the room with two Deku Scrubs."); + OPT_TRICK(RT_DC_JUMP, RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots", "The jump is Adult Link only. Applies to both Vanilla and MQ."); OPT_TRICK(RT_DC_HAMMER_FLOOR, RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Smash the Boss Lobby Floor", "The bombable floor before King Dodongo can be destroyed with Hammer if hit in the very center. This is only relevant with Shuffle Boss Entrances or if Dodongo's Cavern is MQ and either variant of \"Dodongo's Cavern MQ Light the Eyes with Strength\" is on."); OPT_TRICK(RT_DC_MQ_CHILD_BOMBS, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Early Bomb Bag Area as Child", "With a precise jump slash from above, you can reach the Bomb Bag area as only child without needing a Slingshot. You will take fall damage."); OPT_TRICK(RT_DC_MQ_CHILD_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Child", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes. To perform this trick as child is significantly more difficult than adult. The player is also expected to complete the DC back area without explosives, including getting past the Armos wall to the switch for the boss door."); OPT_TRICK(RT_DC_MQ_ADULT_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Adult", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes."); - OPT_TRICK(RT_JABU_ALCOVE_JUMP_DIVE, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Underwater Alcove as Adult with Jump Dive", "Standing above the underwater tunnel leading to the scrub, jump down and swim through the tunnel. This allows adult to access the alcove with no Scale or Iron Boots. In vanilla Jabu, this alcove has a business scrub. In MQ Jabu, it has the compass chest and a door switch for the main floor."); + OPT_TRICK(RT_JABU_ALCOVE_JUMP_DIVE, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Underwater Alcove as Adult with Jump Dive", "Standing above the underwater tunnel leading to the scrub, jump down and swim through the tunnel. This allows adult to access the alcove with no Scale or Iron Boots. In Vanilla Jabu, this alcove has a business scrub. In MQ Jabu, it has the compass chest and a door switch for the main floor."); OPT_TRICK(RT_JABU_BOSS_HOVER, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Room with Hover Boots", "A box for the blue switch can be carried over by backwalking with one while the elevator is at its peak. Alternatively, you can skip transporting a box by quickly rolling from the switch and opening the door before it closes. However, the timing for this is very tight."); - OPT_TRICK(RT_JABU_NEAR_BOSS_RANGED, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Near Boss Ceiling Switch/GS without Boomerang or Explosives", "Vanilla Jabu: From near the entrance into the room, you can hit the switch that opens the door to the boss room using a precisely-aimed use of the Slingshot, Bow, or Longshot. As well, if you climb to the top of the vines you can stand on the right edge of the platform and shoot around the glass. From this distance, even the Hookshot can reach the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled. MQ Jabu: A Gold Skulltula Token can be collected with the Hookshot or Longshot using the same methods as hitting the switch in vanilla. This MQ trick is not currently relevant in logic."); + OPT_TRICK(RT_JABU_NEAR_BOSS_RANGED, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Near Boss Ceiling Switch/GS without Boomerang or Explosives", "Vanilla Jabu: From near the entrance into the room, you can hit the switch that opens the door to the boss room using a precisely-aimed use of the Slingshot, Bow, or Longshot. As well, if you climb to the top of the vines you can stand on the right edge of the platform and shoot around the glass. From this distance, even the Hookshot can reach the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled. MQ Jabu: A Gold Skulltula Token can be collected with the Hookshot or Longshot using the same methods as hitting the switch in Vanilla. This MQ trick is not currently relevant in logic."); OPT_TRICK(RT_JABU_NEAR_BOSS_EXPLOSIVES, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Ceiling Switch with Explosives", "You can hit the switch that opens the door to the boss room using a precisely-aimed Bombchu. Also, using the Hover Boots, adult can throw a Bomb at the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled."); OPT_TRICK(RT_LENS_JABU_MQ, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Jabu MQ."); OPT_TRICK(RT_JABU_MQ_RANG_JUMP, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::ADVANCED}, "Jabu MQ Compass Chest with Boomerang", "Boomerang can reach the cow switch to spawn the chest by targeting the cow, jumping off of the ledge where the chest spawns, and throwing the Boomerang in midair."); OPT_TRICK(RT_JABU_MQ_SOT_GS, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu MQ Song of Time Block GS with Boomerang", "Allow the Boomerang to return to you through the Song of Time block to grab the token."); OPT_TRICK(RT_LENS_BOTW, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well without Lens of Truth", "Removes the requirements for the Lens of Truth in Bottom of the Well."); OPT_TRICK(RT_BOTW_CHILD_DEADHAND, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Child Dead Hand without Kokiri Sword", "Requires 9 sticks or 5 jump slashes."); - OPT_TRICK(RT_BOTW_BASEMENT, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well Map Chest with Strength & Sticks", "The chest in the basement can be reached with strength by doing a jump slash with a lit stick to access the bomb flowers."); + OPT_TRICK(RT_BOTW_BASEMENT, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well Map Chest with Strength & Sticks", "The chest in the basement can be reached with strength by doing a jump slash with a lit stick to access the Bomb Flowers."); OPT_TRICK(RT_BOTW_MQ_PITS, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Jump Over the Pits", "While the pits in Bottom of the Well don't allow you to jump just by running straight at them, you can still get over them by side-hopping or backflipping across. With explosives, this allows you to access the central areas without Zelda's Lullaby. With Zelda's Lullaby, it allows you to access the west inner room without explosives."); OPT_TRICK(RT_BOTW_MQ_DEADHAND_KEY, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Dead Hand Freestanding Key with Boomerang", "Boomerang can fish the item out of the rubble without needing explosives to blow it up."); OPT_TRICK(RT_FOREST_FIRST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple First Room GS with Difficult-to-Use Weapons", "Allows killing this Skulltula with Sword or Sticks by jump slashing it as you let go from the vines. You can avoid taking fall damage by recoiling onto the tree. Also allows killing it as Child with a Bomb throw. It's much more difficult to use a Bomb as child due to Child Link's shorter height."); @@ -445,14 +445,14 @@ void Settings::CreateOptions() { OPT_TRICK(RT_FOREST_VINES, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple East Courtyard Vines with Hookshot", "The vines in Forest Temple leading to where the well drain switch is in the standard form can be barely reached with just the Hookshot. Applies to MQ also."); OPT_TRICK(RT_FOREST_OUTDOORS_LEDGE, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple NE Outdoors Ledge with Hover Boots", "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In Vanilla, this can skip a Hookshot requirement in entrance randomizer."); OPT_TRICK(RT_FOREST_DOORFRAME, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple East Courtyard Door Frame with Hover Boots", "A precise Hover Boots movement from the upper balconies in this courtyard can be used to get on top of the door frame. Applies to both Vanilla and Master Quest. In Vanilla, from on top the door frame you can summon Pierre, allowing you to access the falling ceiling room early. In Master Quest, this allows you to obtain the GS on the door frame as adult without Hookshot or Song of Time."); - OPT_TRICK(RT_FOREST_OUTSIDE_BACKDOOR, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple Outside Backdoor with Jump Slash", "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west courtyard. This skips a potential Hover Boots requirement in vanilla, and it can sometimes apply in MQ as well. This trick can be performed as both ages."); + OPT_TRICK(RT_FOREST_OUTSIDE_BACKDOOR, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple Outside Backdoor with Jump Slash", "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west courtyard. This skips a potential Hover Boots requirement in Vanilla, and it can sometimes apply in MQ as well. This trick can be performed as both ages."); OPT_TRICK(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple Outside Hearts with Boomerang", "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, you can back away from the water while the boomerang is returning so the hearts land on the ground."); OPT_TRICK(RT_FOREST_MQ_WELL_SWIM, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Swim Through Forest Temple MQ Well with Hookshot", "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); OPT_TRICK(RT_FOREST_MQ_BLOCK_PUZZLE, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Skip Forest Temple MQ Block Puzzle with Bombchu", "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); //Child with hovers cannot do this from the lower floor, and most go to the upper floor which needs goron bracelet. Adult can do this with hammer and KSword, But child cannot. OPT_TRICK(RT_FOREST_MQ_JS_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple MQ Twisted Hallway Switch with Jump Slash", "The switch to twist the hallway can be hit with a jump slash through the glass block. To get in front of the switch, either use the Hover Boots or hit the shortcut switch at the top of the room and jump from the glass blocks that spawn. Sticks can be used as child, but the Kokiri Sword is too short to reach through the glass."); OPT_TRICK(RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Hookshot", "There's a very small gap between the glass block and the wall. Through that gap you can hookshot the target on the ceiling."); - OPT_TRICK(RT_FOREST_MQ_RANG_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Boomerang", "The Boomerang can return to Link through walls, allowing child to hit the hallway switch. This can be used to allow adult to pass through later, or in conjuction with \"Forest Temple Outside Backdoor with Jump Slash\"."); + OPT_TRICK(RT_FOREST_MQ_RANG_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Boomerang", "The Boomerang can return to Link through walls, allowing child to hit the hallway switch. This can be used to allow adult to pass through later, or in conjunction with \"Forest Temple Outside Backdoor with Jump Slash\"."); OPT_TRICK(RT_FIRE_BOSS_DOOR_JUMP, RCQUEST_BOTH, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple Boss Door without Hover Boots or Pillar", "The Fire Temple Boss Door can be reached as adult with a precise jump. You must be touching the side wall of the room so that Link will grab the ledge from farther away than is normally possible."); //Is also used in MQ logic, but has no practical effect there as of now OPT_TRICK(RT_FIRE_SOT, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Song of Time Room GS without Song of Time", "A precise jump can be used to reach this room."); @@ -461,7 +461,7 @@ void Settings::CreateOptions() { OPT_TRICK(RT_FIRE_FLAME_MAZE, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Flame Wall Maze Skip", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it without taking damage is more precise. Allows you to progress without needing either a Small Key or Hover Boots."); OPT_TRICK(RT_FIRE_MQ_NEAR_BOSS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Chest Near Boss without Breaking Crate", "The hitbox for the torch extends a bit outside of the crate. Shoot a flaming arrow at the side of the crate to light the torch without needing to get over there and break the crate."); OPT_TRICK(RT_FIRE_MQ_BLOCKED_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Big Lava Room Blocked Door without Hookshot", "There is a gap between the hitboxes of the flame wall in the big lava room. If you know where this gap is located, you can jump through it and skip needing to use the Hookshot. To do this without taking damage is more precise."); - OPT_TRICK(RT_FIRE_MQ_BK_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Boss Key Chest without Bow", "It is possible to light both of the timed torches to unbar the door to the boss key chest's room with just Din's Fire if you move very quickly between the two torches. It is also possible to unbar the door with just Din's by abusing an oversight in the way the game counts how many torches have been lit."); + OPT_TRICK(RT_FIRE_MQ_BK_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Boss Key Chest without Bow", "It is possible to light both of the timed torches to unbar the door to the boss key chest's room with just Din's Fire if you move very quickly between the two torches. It is also possible to unbar the door with just Din's Fire by abusing an oversight in the way the game counts how many torches have been lit."); OPT_TRICK(RT_FIRE_MQ_CLIMB, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Climb without Fire Source", "You can use the Hover Boots to hover around to the climbable wall, skipping the need to use a fire source and spawn a Hookshot target."); OPT_TRICK(RT_FIRE_MQ_MAZE_SIDE_ROOM, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lizalfos Maze Side Room without Box", "You can walk from the blue switch to the door and quickly open the door before the bars reclose. This skips needing to reach the upper sections of the maze to get a box to place on the switch."); OPT_TRICK(RT_FIRE_MQ_MAZE_HOVERS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots", "Use the Hover Boots off of a crate to climb to the upper maze without needing to spawn and use the Hookshot targets."); @@ -472,11 +472,11 @@ void Settings::CreateOptions() { OPT_TRICK(RT_WATER_CRACKED_WALL_HOVERS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Cracked Wall with Hover Boots", "With a midair side-hop while wearing the Hover Boots, you can reach the cracked wall without needing to raise the water up to the middle level."); OPT_TRICK(RT_WATER_CRACKED_WALL, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Cracked Wall with No Additional Items", "A precise jump slash (among other methods) will get you to the cracked wall without needing the Hover Boots or to raise the water to the middle level. This trick supersedes \"Water Temple Cracked Wall with Hover Boots\"."); OPT_TRICK(RT_WATER_BK_REGION, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Boss Key Region with Hover Boots", "With precise Hover Boots movement it is possible to reach the boss key chest's region without needing the Longshot. It is not necessary to take damage from the spikes. The Gold Skulltula Token in the following room can also be obtained with just the Hover Boots."); - OPT_TRICK(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP, RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple North Basement Ledge with Precise Jump", "In the northern basement there's a ledge from where, in vanilla Water Temple, boulders roll out into the room. Normally to jump directly to this ledge logically requires the Hover Boots, but with precise jump, it can be done without them. This trick applies to both Vanilla and Master Quest."); + OPT_TRICK(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP, RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple North Basement Ledge with Precise Jump", "In the northern basement there's a ledge from where, in Vanilla Water Temple, boulders roll out into the room. Normally to jump directly to this ledge logically requires the Hover Boots, but with precise jump, it can be done without them. This trick applies to both Vanilla and Master Quest."); OPT_TRICK(RT_WATER_BK_JUMP_DIVE, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Boss Key Jump Dive", "Stand on the very edge of the raised corridor leading from the push block room to the rolling boulder corridor. Face the Gold Skulltula on the waterfall and jump over the boulder corridor floor into the pool of water, swimming right once underwater. This allows access to the boss key room without Iron boots."); //Also used in MQ logic, but won't be relevent unless a way to enter tower without irons exists (likely a clip + swim) OPT_TRICK(RT_WATER_FW_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Farore\'s Wind", "If you set Farore's Wind inside the central pillar and then return to that warp point after raising the water to the highest level, you can obtain this Skulltula Token with Hookshot or Boomerang."); - OPT_TRICK(RT_WATER_IRONS_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Iron Boots", "After opening the middle water level door into the central pillar, the door will stay unbarred so long as you do not leave the room -- even if you were to raise the water up to the highest level. With the Iron Boots to go through the door after the water has been raised, you can obtain the Skulltula Token with the Hookshot."); + OPT_TRICK(RT_WATER_IRONS_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Iron Boots", "After opening the middle water level door into the central pillar, the door will stay unbarred so long as you do not leave the room, even if you were to raise the water up to the highest level. With the Iron Boots to go through the door after the water has been raised, you can obtain the Skulltula Token with the Hookshot."); OPT_TRICK(RT_WATER_CENTRAL_BOW, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::ADVANCED}, "Water Temple Central Bow Target without Longshot or Hover Boots", "A very precise Bow shot can hit the eye switch from the floor above. Then, you can jump down into the hallway and make through it before the gate closes. It can also be done as child, using the Slingshot instead of the Bow."); OPT_TRICK(RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Falling Platform Room GS with Hookshot", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Hookshot."); OPT_TRICK(RT_WATER_RANG_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Falling Platform Room GS with Boomerang", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Boomerang."); @@ -492,21 +492,21 @@ void Settings::CreateOptions() { OPT_TRICK(RT_SHADOW_UMBRELLA, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Stone Umbrella Skip", "A very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. Applies to both Vanilla and Master Quest."); OPT_TRICK(RT_SHADOW_UMBRELLA_GS, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Falling Spikes GS with Hover Boots", "After killing the Skulltula, a very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. From there, another very precise Hover Boots movement can be used to obtain the token without needing the Hookshot. Applies to both Vanilla and Master Quest. For obtaining the chests in this room with just Hover Boots, be sure to enable \"Shadow Temple Stone Umbrella Skip\"."); OPT_TRICK(RT_SHADOW_FREESTANDING_KEY, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Freestanding Key with Bombchu", "Release the Bombchu with good timing so that it explodes near the bottom of the pot."); - OPT_TRICK(RT_SHADOW_STATUE, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple River Statue with Bombchu", "By sending a Bombchu around the edge of the gorge, you can knock down the statue without needing a Bow. Applies in both vanilla and MQ Shadow."); + OPT_TRICK(RT_SHADOW_STATUE, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple River Statue with Bombchu", "By sending a Bombchu around the edge of the gorge, you can knock down the statue without needing a Bow. Applies in both Vanilla and MQ Shadow."); OPT_TRICK(RT_SHADOW_BONGO, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple Bongo Bongo without projectiles", "Using precise sword slashes, Bongo Bongo can be defeated without using projectiles. This is only relevant in conjunction with Shadow Temple dungeon shortcuts or shuffled boss entrances."); OPT_TRICK(RT_LENS_SHADOW_MQ, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ for most areas in the dungeon. See \"Shadow Temple MQ Invisible Moving Platform without Lens of Truth\", \"Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth\", \"Shadow Temple MQ 2nd Dead Hand without Lens of Truth\", and \"Shadow Temple Bongo Bongo without Lens of Truth\" for exceptions."); - OPT_TRICK(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth", "Removes the requirement for the Lens of Truth or Nayru's Love in Shadow Temple MQ for the Invisible Blades room silver rupee collection."); + OPT_TRICK(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth", "Removes the requirement for the Lens of Truth or Nayru's Love in Shadow Temple MQ for the Invisible Blades room Silver Rupee collection."); OPT_TRICK(RT_LENS_SHADOW_MQ_PLATFORM, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Moving Platform without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ to cross the invisible moving platform in the huge pit room in either direction."); OPT_TRICK(RT_LENS_SHADOW_MQ_DEADHAND, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ 2nd Dead Hand without Lens of Truth", "Dead Hand spawns in a random spot within the room. Having Lens removes the hassle of having to comb the room looking for his spawn location."); OPT_TRICK(RT_SHADOW_MQ_GAP, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Truth Spinner Gap with Longshot", "You can Longshot a torch and jump-slash recoil onto the tongue. It works best if you Longshot the right torch from the left side of the room."); - OPT_TRICK(RT_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Invisible Blades without Song of Time", "The Like Like can be used to boost you into the silver rupee or recovery hearts that normally require Song of Time. This cannot be performed on OHKO since the Like Like does not boost you high enough if you die."); + OPT_TRICK(RT_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Invisible Blades without Song of Time", "The Like Like can be used to boost you into the Silver Rupee or Recovery Hearts that normally require Song of Time. This cannot be performed on OHKO since the Like Like does not boost you high enough if you die."); OPT_TRICK(RT_SHADOW_MQ_HUGE_PIT, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Lower Huge Pit without Fire Source", "Normally a frozen eye switch spawns some platforms that you can use to climb down, but there's actually a small piece of ground that you can stand on that you can just jump down to."); OPT_TRICK(RT_SHADOW_MQ_WINDY_WALKWAY, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Windy Walkway Reverse without Hover Boots", "It is possible to jump from the alcove in the windy hallway to the middle platform. There are two methods: wait out the fan opposite the door and hold forward, or jump to the right to be pushed by the fan there towards the platform ledge. Note that jumps of this distance are inconsistent, but still possible."); OPT_TRICK(RT_LENS_SPIRIT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple."); OPT_TRICK(RT_SPIRIT_CHILD_CHU, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Child Side Bridge with Bombchu", "A carefully-timed Bombchu can hit the switch."); OPT_TRICK(RT_SPIRIT_LOBBY_GS, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Main Room GS with Boomerang", "Standing on the highest part of the arm of the statue, a precise Boomerang throw can kill and obtain this Gold Skulltula. You must throw the Boomerang slightly off to the side so that it curves into the Skulltula, as aiming directly at it will clank off of the wall in front."); OPT_TRICK(RT_SPIRIT_LOWER_ADULT_SWITCH, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::ADVANCED}, "Spirit Temple Lower Adult Switch with Bombs", "A bomb can be used to hit the switch on the ceiling, but it must be thrown from a particular distance away and with precise timing."); - OPT_TRICK(RT_SPIRIT_LOBBY_JUMP, RCQUEST_BOTH, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Jump from Hands to Upper Ledges", "A precise jump to obtain the following as adult without needing one of Hover Boots, or Hookshot (in vanilla) or Song of Time (in MQ): - Spirit Temple Statue Room Northeast Chest - Spirit Temple GS Lobby - Spirit Temple MQ Central Chamber Top Left Pot (Left) - Spirit Temple MQ Central Chamber Top Left Pot (Right)"); + OPT_TRICK(RT_SPIRIT_LOBBY_JUMP, RCQUEST_BOTH, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Jump from Hands to Upper Ledges", "A precise jump to obtain the following as adult without needing one of Hover Boots, or Hookshot (in Vanilla) or Song of Time (in MQ): - Spirit Temple Statue Room Northeast Chest - Spirit Temple GS Lobby - Spirit Temple MQ Central Chamber Top Left Pot (Left) - Spirit Temple MQ Central Chamber Top Left Pot (Right)"); // disabled since "Spirit Temple boss shortcuts" (pre-lowers the platform where you break the statues face) isn't a setting in ship // OPT_TRICK(RT_SPIRIT_PLATFORM_HOOKSHOT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Hookshot to Boss Platform", "Precise hookshot aiming at the platform chains can be used to reach the boss platform from the middle landings. Using a jump slash immediately after reaching a chain makes aiming more lenient. Relevant only when Spirit Temple boss shortcuts are on."); OPT_TRICK(RT_SPIRIT_MAP_CHEST, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Map Chest with Bow", "To get a line of sight from the upper torch to the map chest torches, you must pull an Armos statue all the way up the stairs."); @@ -515,17 +515,17 @@ void Settings::CreateOptions() { OPT_TRICK(RT_LENS_SPIRIT_MQ, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple MQ."); OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_SOT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room as Child without Song of Time", "While adult can easily jump directly to the switch that unbars the door to the sun block room, child Link cannot make the jump without spawning a Song of Time block to jump from. You can skip this by throwing the crate down onto the switch from above, which does unbar the door, however the crate immediately breaks, so you must move quickly to get through the door before it closes back up."); OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_GS, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room GS with Boomerang", "Throw the Boomerang in such a way that it curves through the side of the glass block to hit the Gold Skulltula."); - OPT_TRICK(RT_SPIRIT_MQ_LOWER_ADULT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Lower Adult without Fire Arrows", "By standing in a precise position it is possible to light two of the torches with a single use of Din\'s Fire. This saves enough time to be able to light all three torches with only Din\'s."); + OPT_TRICK(RT_SPIRIT_MQ_LOWER_ADULT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Lower Adult without Fire Arrows", "By standing in a precise position it is possible to light two of the torches with a single use of Din\'s Fire. This saves enough time to be able to light all three torches with only Din\'s Fire."); OPT_TRICK(RT_SPIRIT_MQ_FROZEN_EYE, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ Frozen Eye Switch without Fire", "You can melt the ice by shooting an arrow through a torch. The only way to find a line of sight for this shot is to first spawn a Song of Time block, and then stand on the very edge of it."); OPT_TRICK(RT_ICE_BLOCK_GS, RCQUEST_VANILLA, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern Block Room GS with Hover Boots", "The Hover Boots can be used to get in front of the Skulltula to kill it with a jump slash. Then, the Hover Boots can again be used to obtain the Token, all without Hookshot or Boomerang."); OPT_TRICK(RT_ICE_MQ_RED_ICE_GS, RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Red Ice GS without Song of Time", "If you side-hop into the perfect position, you can briefly stand on the platform with the red ice just long enough to dump some blue fire."); OPT_TRICK(RT_ICE_MQ_SCARECROW, RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Scarecrow GS with No Additional Items", "As adult a precise jump can be used to reach this alcove."); OPT_TRICK(RT_LENS_GTG, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground."); - OPT_TRICK(RT_GTG_WITHOUT_HOOKSHOT, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. Then, you must also reach the exit of the room without the use of the Hookshot. If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do so without taking damage is more precise."); + OPT_TRICK(RT_GTG_WITHOUT_HOOKSHOT, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground Left Side Silver Rupees without Hookshot", "After collecting the rest of the Silver Rupees in the room, you can reach the final Silver Rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. Then, you must also reach the exit of the room without the use of the Hookshot. If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do so without taking damage is more precise."); OPT_TRICK(RT_GTG_FAKE_WALL, RCQUEST_BOTH, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots", "A precise Hover Boots use from the top of the chest can allow you to grab the ledge without needing the usual requirements. In Master Quest, this always skips a Song of Time requirement. In Vanilla, this skips a Hookshot requirement, but is only relevant if \"Gerudo Training Ground Left Side Silver Rupees without Hookshot\" is enabled."); OPT_TRICK(RT_LENS_GTG_MQ, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground MQ."); - OPT_TRICK(RT_GTG_MQ_WITH_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot", "The highest silver rupee can be obtained by hookshotting the target and then immediately jump slashing toward the rupee."); - OPT_TRICK(RT_GTG_MQ_WIHTOUT_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. The Wallmaster will not track you to directly underneath the rupee. You should take the last step to be under the rupee after the Wallmaster has begun its attempt to grab you. Also included with this trick is that fact that the switch that unbars the door to the final chest of GTG can be hit without a projectile, using a precise jump slash. This trick supersedes \"Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot\"."); + OPT_TRICK(RT_GTG_MQ_WITH_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot", "The highest Silver Rupee can be obtained by hookshooting the target and then immediately jump slashing toward the Rupee."); + OPT_TRICK(RT_GTG_MQ_WIHTOUT_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot", "After collecting the rest of the Silver Rupees in the room, you can reach the final Silver Rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. The Wallmaster will not track you to directly underneath the rupee. You should take the last step to be under the rupee after the Wallmaster has begun its attempt to grab you. Also included with this trick is that fact that the switch that unbars the door to the final chest of GTG can be hit without a projectile, using a precise jump slash. This trick supersedes \"Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot\"."); OPT_TRICK(RT_LENS_GANON, RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle."); OPT_TRICK(RT_GANON_SPIRIT_TRIAL_HOOKSHOT, RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Spirit Trial without Hookshot", "The highest rupee can be obtained as either age by performing a precise jump and a well-timed jumpslash off of an Armos."); OPT_TRICK(RT_LENS_GANON_MQ, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle MQ."); @@ -1182,7 +1182,7 @@ void Settings::UpdateOptionProperties() { if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_ON) == RO_CLOSED_FOREST_ON || (CVarGetInteger(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_CLOSED) == RO_DOOROFTIME_CLOSED && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_OFF) == RO_GENERIC_OFF)) /* closed door of time with ocarina shuffle off */ { - mOptions[RSK_STARTING_AGE].Disable("This option is disabled due to other options making the game unbeatable"); + mOptions[RSK_STARTING_AGE].Disable("This option is disabled due to other options making the game unbeatable."); } else { mOptions[RSK_STARTING_AGE].Enable(); } @@ -1453,12 +1453,12 @@ void Settings::UpdateOptionProperties() { } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), 0)) { - mOptions[RSK_STARTING_STICKS].Disable("Disabled because Shuffle Deku Stick Bag is On"); + mOptions[RSK_STARTING_STICKS].Disable("Disabled because Shuffle Deku Stick Bag is on."); } else { mOptions[RSK_STARTING_STICKS].Enable(); } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), 0)) { - mOptions[RSK_STARTING_NUTS].Disable("Disabled because Shuffle Deku Nut Bag is On"); + mOptions[RSK_STARTING_NUTS].Disable("Disabled because Shuffle Deku Nut Bag is on."); } else { mOptions[RSK_STARTING_NUTS].Enable(); } @@ -1669,7 +1669,7 @@ void Settings::UpdateOptionProperties() { } // Shuffle 100 GS Reward - Force-Enabled if Ganon's Boss Key is on the 100 GS Reward if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_VANILLA) == RO_GANON_BOSS_KEY_KAK_TOKENS) { - mOptions[RSK_SHUFFLE_100_GS_REWARD].Disable("This option is force-enabled because \"Ganon's Boss Key\" is set to \"100 GS Reward.\""); + mOptions[RSK_SHUFFLE_100_GS_REWARD].Disable("This option is force-enabled because \"Ganon's Boss Key\" is set to \"100 GS Reward\"."); } else { mOptions[RSK_SHUFFLE_100_GS_REWARD].Enable(); } @@ -1822,17 +1822,17 @@ void Settings::UpdateOptionProperties() { if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), RO_GENERIC_OFF)) { mOptions[RSK_KAK_100_SKULLS_HINT].Enable(); } else { - mOptions[RSK_KAK_100_SKULLS_HINT].Disable("There is no point to hinting 100 skulls if it is not shuffled"); + mOptions[RSK_KAK_100_SKULLS_HINT].Disable("There is no point to hinting 100 skulls if it is not shuffled."); } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_OFF) == RO_FISHSANITY_HYRULE_LOACH) { mOptions[RSK_LOACH_HINT].Enable(); } else { - mOptions[RSK_LOACH_HINT].Disable("Loach hint is only avaliable with \"Fishsanity\" set to \"Shuffle only Hyrule Loach\"\nas that's the only setting where you present the loach to the fishing pond owner"); + mOptions[RSK_LOACH_HINT].Disable("Loach hint is only avaliable with \"Fishsanity\" set to \"Shuffle only Hyrule Loach\"\nas that's the only setting where you present the loach to the fishing pond owner."); } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 7) == 0) { - mOptions[RSK_CHICKENS_HINT].Disable("Anju will just give you the item instead with 0 chickens"); + mOptions[RSK_CHICKENS_HINT].Disable("Anju will just give you the item instead with 0 chickens."); } else { mOptions[RSK_CHICKENS_HINT].Enable(); } diff --git a/soh/soh/SohGui/ResolutionEditor.cpp b/soh/soh/SohGui/ResolutionEditor.cpp index 6b287fde5..f302104da 100644 --- a/soh/soh/SohGui/ResolutionEditor.cpp +++ b/soh/soh/SohGui/ResolutionEditor.cpp @@ -89,7 +89,7 @@ using namespace UIWidgets; void ResolutionCustomWidget(WidgetInfo& info) { ImGui::BeginDisabled(disabled_everything); // Vertical Resolution - UIWidgets::CVarCheckbox("Set fixed vertical resolution (disables Resolution slider)", CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", + UIWidgets::CVarCheckbox("Set fixed vertical resolution (disables resolution slider)", CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", UIWidgets::CheckboxOptions({ {.disabled = disabled_everything} }).Tooltip("Override the resolution scale slider and use the settings below, irrespective of window size.") .Color(THEME_COLOR)); //if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. @@ -161,7 +161,7 @@ void ResolutionCustomWidget(WidgetInfo& info) { ImGui::EndDisabled(); UIWidgets::PopStyleInput(); - // Integer scaling settings group (Pixel-perfect Mode) + // Integer scaling settings group (Pixel Perfect Mode) static const ImGuiTreeNodeFlags IntegerScalingResolvedImGuiFlag = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) ? ImGuiTreeNodeFlags_DefaultOpen : ImGuiTreeNodeFlags_None; @@ -169,8 +169,8 @@ void ResolutionCustomWidget(WidgetInfo& info) { if (ImGui::CollapsingHeader("Integer Scaling Settings", IntegerScalingResolvedImGuiFlag)) { const bool disabled_pixelPerfectMode = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything; - // Pixel-perfect Mode - UIWidgets::CVarCheckbox("Pixel-perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", + // Pixel Perfect Mode + UIWidgets::CVarCheckbox("Pixel Perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", UIWidgets::CheckboxOptions({{ .disabled = disabled_pixelCount || disabled_everything }}).Tooltip("Don't scale image to fill window.") .Color(THEME_COLOR)); if (disabled_pixelCount && CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0)) { @@ -181,7 +181,7 @@ void ResolutionCustomWidget(WidgetInfo& info) { // Integer Scaling UIWidgets::CVarSliderInt(fmt::format("Integer scale factor: {}", max_integerScaleFactor).c_str(), CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", UIWidgets::IntSliderOptions({ {.disabled = disabled_pixelPerfectMode || CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)} }) - .Min(1).Max(max_integerScaleFactor).DefaultValue(1).Tooltip("Integer scales the image. Only available in pixel-perfect mode.").Color(THEME_COLOR)); + .Min(1).Max(max_integerScaleFactor).DefaultValue(1).Tooltip("Integer scales the image. Only available in Pixel Perfect Mode.").Color(THEME_COLOR)); // Display warning if size is being clamped or if framebuffer is larger than viewport. if (!disabled_pixelPerfectMode && (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) && @@ -193,7 +193,7 @@ void ResolutionCustomWidget(WidgetInfo& info) { UIWidgets::CVarCheckbox("Automatically scale image to fit viewport", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", UIWidgets::CheckboxOptions({ {.disabled = disabled_pixelPerfectMode} }).DefaultValue(true).Color(THEME_COLOR) - .Tooltip("Automatically sets scale factor to fit window. Only available in pixel-perfect mode.")); + .Tooltip("Automatically sets scale factor to fit window. Only available in Pixel Perfect Mode.")); if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)) { // This is just here to update the value shown on the slider. // The function in LUS to handle this setting will ignore IntegerScaleFactor while active. diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index c8b3e96b7..e6a757f21 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -28,21 +28,21 @@ void SohMenu::AddMenuDevTools() { .CVar(CVAR_DEVELOPER_TOOLS("DebugSaveFileMode")) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); }) .Options(ComboboxOptions() - .Tooltip("Changes the behaviour of debug file select creation (creating a save file on slot 1 " - "with debug mode on)\n" - "- Off: The debug save file will be a normal savefile\n" - "- Vanilla: The debug save file will be the debug save file from the original game\n" - "- Maxed: The debug save file will be a save file with all of the items & upgrades") + .Tooltip("Changes the behavior of debug file select creation (creating a save file on slot 1 " + "with debug mode on):\n" + "- Off: The debug save file will be a normal savefile.\n" + "- Vanilla: The debug save file will be the debug save file from the original game.\n" + "- Maxed: The debug save file will be a save file with all of the items & upgrades.") .ComboMap(debugSaveFileModes)); AddWidget(path, "OoT Skulltula Debug", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("SkulltulaDebugEnabled")) .Options(CheckboxOptions().Tooltip("Enables Skulltula Debug, when moving the cursor in the menu above various " - "map icons (boss key, compass, map screen locations, etc) will set the GS " - "bits in that area.\nUSE WITH CAUTION AS IT DOES NOT UPDATE THE GS COUNT.")); + "map icons (boss key, compass, map screen locations, etc.) will set the GS " + "bits in that area.\nUSE WITH CAUTION AS IT DOES NOT UPDATE THE GS COUNT!")); AddWidget(path, "Better Debug Warp Screen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen")) .Options(CheckboxOptions().Tooltip( - "Optimized debug warp screen, with the added ability to chose entrances and time of day").DefaultValue(true)); + "Optimized Debug Warp Screen, with the added ability to chose entrances and time of day.").DefaultValue(true)); AddWidget(path, "Debug Warp Screen Translation", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation")) .Options(CheckboxOptions() @@ -50,7 +50,7 @@ void SohMenu::AddMenuDevTools() { .DefaultValue(true)); AddWidget(path, "Resource logging", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("ResourceLogging")) - .Options(CheckboxOptions().Tooltip("Logs some resources as XML when they're loaded in binary format")); + .Options(CheckboxOptions().Tooltip("Logs some resources as XML when they're loaded in binary format.")); AddWidget(path, "Frame Advance", WIDGET_CHECKBOX) .Options(CheckboxOptions().Tooltip( diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 3ad6b4064..c2f425898 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -103,7 +103,7 @@ void SohMenu::AddMenuEnhancements() { " - Junk items: Small brown chests\n" " - Small keys: Small silver chests\n" " - Boss keys: Vanilla size and texture\n" - " - Skulltula Tokens: Small skulltula chest\n" + " - Skulltula Tokens: Small Skulltula chest\n" "\n" "NOTE: Textures will not apply if you are using a mod pack with a custom chest model.")); AddWidget(path, "Chests of Agony", WIDGET_CVAR_CHECKBOX) @@ -158,7 +158,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Controls", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Answer Navi Prompt with L Button", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NaviOnL")) - .Options(CheckboxOptions().Tooltip("Speak to Navi with L but enter First-Person Camera with C-Up")); + .Options(CheckboxOptions().Tooltip("Speak to Navi with L but enter First-Person Camera with C-Up.")); AddWidget(path, "Don't Require Input for Credits Sequence", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NoInputForCredits")) .Options(CheckboxOptions().Tooltip( @@ -169,7 +169,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Typically, inputs that are held prior to the buffer window are not included in the buffer. This " "setting changes that behavior to include them. This may cause some inputs to be re-triggered " - "undesireably, for instance Z-Targetting something you might not want to.")); + "undesireably, for instance Z-Targeting something you might not want to.")); AddWidget(path, "Pause Buffer Input Window: %d frames", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("PauseBufferWindow")) .Options(IntSliderOptions() @@ -314,7 +314,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Exclude Glitch-Aiding Cutscenes", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding")) .Options(CheckboxOptions().Tooltip( - "Don't skip cutscenes that are associated wiht useful glitches. Currently, it is " + "Don't skip cutscenes that are associated with useful glitches. Currently, it is " "only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS, and the Box Skip One " "Point in Jabu.")); @@ -396,7 +396,7 @@ void SohMenu::AddMenuEnhancements() { "\"Skip Get Item Animation\" option within the randomizer enhancements instead."; }) .Options(CheckboxOptions().Tooltip( - "Stops the game from freezing the player when picking up Gold Skulltula Tokens. Does not" + "Stops the game from freezing the player when picking up Gold Skulltula Tokens. Does not " "apply in randomizer savefiles.")); AddWidget(path, "Skip Save Confirmation", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("SkipSaveConfirmation")) @@ -454,7 +454,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Animated Link in Pause Menu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("PauseMenuAnimatedLink")) .Options(CheckboxOptions().Tooltip( - "Turns the Static Image of Link in the Pause Menu's Equipment Subsceen " + "Turns the Static Image of Link in the Pause Menu's Equipment Subscreen " "into a model cycling through his idle animations." )); AddWidget(path, "Show Age-Dependent Equipment", WIDGET_CVAR_CHECKBOX) @@ -463,7 +463,7 @@ void SohMenu::AddMenuEnhancements() { UpdatePatchHand(); }) .Options(CheckboxOptions().Tooltip( - "Makes all equipment visible, regardless of Age." + "Makes all equipment visible, regardless of age." )); AddWidget(path, "Scale Adult Equipment as Child", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ScaleAdultEquipmentAsChild")) @@ -477,7 +477,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Show Gauntlets in First Person", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FirstPersonGauntlets")) .Options(CheckboxOptions().Tooltip( - "Renders Guantlets when using the Bow and Hookshot like in OoT3D." + "Renders Gauntlets when using the Bow and Hookshot like in OoT3D." )); AddWidget(path, "Show Chains on Both Sides of Locked Doors", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides")); @@ -518,7 +518,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Disable Black Bar Letterboxes", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DisableBlackBars")) .Options(CheckboxOptions().Tooltip( - "Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: there may be minor visual " + "Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: There may be minor visual " "glitches that were covered up by the black bars. Please disable this setting before reporting a bug.")); AddWidget(path, "Dynamic Wallet Icon", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DynamicWalletIcon")) @@ -550,7 +550,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Remove Spin Attack Darkness", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("RemoveSpinAttackDarkness")) .Options(CheckboxOptions().Tooltip( - "Remove the Darkness that appears when charging a Spin Attack" + "Remove the Darkness that appears when charging a Spin Attack." )); AddWidget(path, "Draw Distance", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Increase Actor Draw Distance: %dx", WIDGET_CVAR_SLIDER_INT) @@ -585,13 +585,13 @@ void SohMenu::AddMenuEnhancements() { "Exclude Actors that are useful for Glitches from the extended culling ranges. Some actors may still draw " "in the extended ranges, but will not \"update\" so that certain glitches that leverage the original " "culling requirements will still work.\n\nThe following actors are excluded:\n" - " - White clothed Gerudos\n" + " - White Clothed Gerudos\n" " - King Zora\n" " - Gossip Stones\n" " - Boulders\n" " - Blue Warps\n" " - Darunia\n" - " - Gold SKulltulas\n")); + " - Gold Skulltulas\n")); path.sidebarName = "Items"; AddSidebarEntry("Enhancements", path.sidebarName, 3); @@ -601,17 +601,17 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Equip Items on Dpad", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DpadEquips")) .Options(CheckboxOptions().Tooltip( - "Equip items and equipment on the D-Pad. If used with \"D-Pad on Pause Screen\", you must " - "hold C-Up to equip instead of navgiate.")); + "Equip items and equipment on the D-pad. If used with \"D-pad on Pause Screen\", you must " + "hold C-Up to equip instead of navigate.")); AddWidget(path, "Assignable Tunics and Boots", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("AssignableTunicsAndBoots")) - .Options(CheckboxOptions().Tooltip("Allows equipping the Tunics and Boots to C-Buttons/D-Pad.")); + .Options(CheckboxOptions().Tooltip("Allows equipping the Tunics and Boots to C-Buttons/D-pad.")); // TODO: Revist strength toggle, it's currently separate but should probably be locked behind the // Equipment toggle settings or be absorbed by it completely. AddWidget(path, "Equipment Toggle", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EquipmentCanBeRemoved")) .Options(CheckboxOptions().Tooltip( - "Allows equipment to be removed by toggling it off on\n the equipment subscreen.")); + "Allows equipment to be removed by toggling it on/off\n the equipment subscreen.")); AddWidget(path, "Allow Strength Equipment to be Toggled", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ToggleStrength")) .Callback([](WidgetInfo& info) { @@ -633,9 +633,9 @@ void SohMenu::AddMenuEnhancements() { .Tooltip("Introduces Options for unequipping Link's sword\n\n" "None: Only Biggoron's Sword/Giant's Knife can be toggled. Doing so will equip the " "Master Sword.\n\n" - "Child Toggle: This will allow for completely unequipping any sword as child link.\n\n" + "Child Toggle: This will allow for completely unequipping any sword as Child link.\n\n" "Both Ages: Any sword can be unequipped as either age. This may lead to swordless " - "glitches as Adult.")); + "glitches as adult.")); AddWidget(path, "Ask to Equip New Items", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("AskToEquip")) .Options(CheckboxOptions().Tooltip("Adds a prompt to equip newly-obtained Swords, Shields, and Tunics.")); @@ -659,7 +659,7 @@ void SohMenu::AddMenuEnhancements() { " - Obtained the Song of Time\n" " - Obtained the Master Sword\n" " - Not within range of a Time Block\n" - " - Not within range of Ocarina Playing spots.")); + " - Not within range of Ocarina Playing spots")); AddWidget(path, "Masks", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_COMBOBOX) @@ -676,10 +676,10 @@ void SohMenu::AddMenuEnhancements() { .Options( CheckboxOptions().Tooltip("Stops masks from automatically unequipping on certain situations:\n" "- When entering a new scene\n" - "- When not in any C button or the D-Pad\n" + "- When not in any C-Button or the D-pad\n" "- When saving and quitting\n" "- When dying\n" - "- When traveling thru time (if \"Masks Equippable as Adult\" is activated).")); + "- When traveling through time (if \"Masks Equippable as Adult\" is activated)")); AddWidget(path, "Invisible Bunny Hood", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("HideBunnyHood")) .Options(CheckboxOptions().Tooltip("Turns Bunny Hood Invisible while still maintaining its effects.")); @@ -687,14 +687,14 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("MaskSelect")) .Options(CheckboxOptions().Tooltip( "After completing the mask trading sub-quest, press A and any direction on the mask " - "slog to change masks")); + "slot to change masks.")); path.column = SECTION_COLUMN_2; AddWidget(path, "Explosives", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Deku Nuts Explode Bombs", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NutsExplodeBombs")) .Options(CheckboxOptions().Tooltip("Make Deku Nuts explode Bombs, similar to how they interact with Bombchus. " - "This does not affect Bombflowers.")); + "This does not affect Bomb Flowers.")); AddWidget(path, "Remove Explosive Limit", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("RemoveExplosiveLimit")) .Options(CheckboxOptions().Tooltip("Removes the cap of 3 active explosives being deployed at once.")); @@ -748,8 +748,8 @@ void SohMenu::AddMenuEnhancements() { "Allows Light Arrows to activate Sun Switches. May require a room reload if toggled during gameplay.")); AddWidget(path, "Bow and Child/Slingshot as Adult", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BowSlingshotAmmoFix")) - .Options(CheckboxOptions().Tooltip("Allows Child to use a Bow with Arrows.\n" - "Allows Adult to use a Slingshot with Seeds.\n\n" + .Options(CheckboxOptions().Tooltip("Allows Child Link to use a Bow with Arrows.\n" + "Allows Adult Link to use a Slingshot with Seeds.\n\n" "Requires glitches or the 'Timeless Equipment' cheat to equip.")); AddWidget(path, "Aiming Reticle for the Bow/Slingshot", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BowReticle")) @@ -761,12 +761,12 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Targetable Hookshot Reticle", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("HookshotableReticle")) .Options(CheckboxOptions().Tooltip( - "Makes the Hookshot Reticle use a different color when aiming at Hookshotable Collision.")); + "Makes the Hookshot Reticle use a different color when aiming at hookshotable collision.")); AddWidget(path, "Boomerang", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Instant Boomerang Recall", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FastBoomerang")) - .Options(CheckboxOptions().Tooltip("Instantly return the boomerang to Link by pressing its item button while " + .Options(CheckboxOptions().Tooltip("Instantly return the Boomerang to Link by pressing its item button while " "it's in the air.")); AddWidget(path, "Aim Boomerang in First-Person Mode", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) @@ -827,7 +827,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fix Enemies not Spawning Near Water", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes")) .Options(CheckboxOptions().Tooltip( - "Causes respanwing enemies, like Stalchildren, to appear on land near bodies of water. " + "Causes respawning enemies, like Stalchildren, to appear on land near bodies of water. " "Fixes an incorrect calculation that acted like water underneath ground was above it.")); AddWidget(path, "Fix Poacher's Saw Softlock", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixSawSoftlock")) @@ -898,7 +898,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Graphical Fixes", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Fix L&R Pause Menu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixMenuLR")) - .Options(CheckboxOptions().Tooltip("Makes the L and R buttons in the pause menu the same color")); + .Options(CheckboxOptions().Tooltip("Makes the L and R buttons in the pause menu the same color.")); AddWidget(path, "Fix Dungeon Entrances", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixDungeonMinimapIcon")) .Options(CheckboxOptions().Tooltip( @@ -916,7 +916,7 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("GerudoWarriorClothingFix")) .Options(CheckboxOptions().Tooltip( "Prevent the Gerudo Warrior's clothes changing color when changing Link's tunic or " - "using Bombs in front of her.")); + "using bombs in front of her.")); AddWidget(path, "Fix Out of Bounds Textures", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixTexturesOOB")) .Callback([](WidgetInfo& info) { ApplyAuthenticGfxPatches(); }) @@ -925,7 +925,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fix Link's Eyes Open while Sleeping", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping")) .Options(CheckboxOptions().Tooltip( - "Fixes Link's eyes being open in the openeing cutscene when he is supposed to be sleeping.")); + "Fixes Link's eyes being open in the opening cutscene when he is supposed to be sleeping.")); AddWidget(path, "Fix Hand Holding Hammer", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixHammerHand")) .Callback([](WidgetInfo& info) { UpdatePatchHand(); }) @@ -942,10 +942,10 @@ void SohMenu::AddMenuEnhancements() { ComboboxOptions() .ComboMap(zFightingOptions) .DefaultIndex(ZFIGHT_FIX_DISABLED) - .Tooltip("Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n" - "Consistent: Certain paths vanish the same way in all resolutions\n" - "No Vanish: Paths do not vanish, Link seems to sink in to some paths\n" - "This might affect other decal effects\n")); + .Tooltip("Disabled: Paths vanish more the higher the resolution (Z-Fighting is based on resolution).\n" + "Consistent: Certain paths vanish the same way in all resolutions.\n" + "No Vanish: Paths do not vanish, Link seems to sink in to some paths.\n" + "This might affect other decal effects.\n")); AddWidget(path, "Audio Fixes", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Fix Missing Jingle after 5 Silver Rupees", WIDGET_CVAR_CHECKBOX) @@ -983,13 +983,13 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fish while Hovering", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("HoverFishing")) .Options(CheckboxOptions().Tooltip( - "Restore a bug from NSTC 1.0 that allows casting the Fishing Rod while using the Hover Boots.")); + "Restore a bug from NTSC 1.0 that allows casting the Fishing Rod while using the Hover Boots.")); AddWidget(path, "N64 Weird Frames", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("N64WeirdFrames")) - .Options(CheckboxOptions().Tooltip("Restores N64 Weird Frames allwing weirdshots to behave the same as N64.")); + .Options(CheckboxOptions().Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64.")); AddWidget(path, "Bombchus Out of Bounds", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BombchusOOB")) - .Options(CheckboxOptions().Tooltip("Allows Bombchus to explode out of bounds. Similar to Gamecube and Wii VC")); + .Options(CheckboxOptions().Tooltip("Allows Bombchus to explode out of bounds. Similar to GameCube and Wii VC.")); AddWidget(path, "Quick Putaway", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("QuickPutaway")) .Options(CheckboxOptions().Tooltip( @@ -1012,7 +1012,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fix L&Z Page Switch in Pause Menu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NGCKaleidoSwitcher")) .Options(CheckboxOptions().Tooltip( - "Makes L and R switch pages like on the Gamecube. Z opens the Debug Menu instead.")); + "Makes L and R switch pages like on the GameCube. Z opens the Debug Menu instead.")); // Difficulty Options path.sidebarName = "Difficulty"; @@ -1035,15 +1035,15 @@ void SohMenu::AddMenuEnhancements() { .ComboMap(allPowers) .DefaultIndex(0) .Tooltip( - "Modifies all sources of damage not affected by other sliders\n" - "2x: Can survive all common attacks from the start of the game\n" - "4x: Dies in 1 hit to any substantial attack from the start of the game\n" - "8x: Can only survive trivial damage from the start of the game\n" - "16x: Can survive all common attacks with max health without double defense\n" - "32x: Can survive all common attacks with max health and double defense\n" - "64x: Can survive trivial damage with max health without double defense\n" - "128x: Can survive trivial damage with max health and double defense\n" - "256x: Cannot survive damage" + "Modifies all sources of damage not affected by other sliders:\n" + "2x: Can survive all common attacks from the start of the game.\n" + "4x: Dies in 1 hit to any substantial attack from the start of the game.\n" + "8x: Can only survive trivial damage from the start of the game.\n" + "16x: Can survive all common attacks with max health without double defense.\n" + "32x: Can survive all common attacks with max health and double defense.\n" + "64x: Can survive trivial damage with max health without double defense.\n" + "128x: Can survive trivial damage with max health and double defense.\n" + "256x: Cannot survive damage." ) ); AddWidget(path, "Fall Damage Multiplier", WIDGET_CVAR_COMBOBOX) @@ -1051,14 +1051,14 @@ void SohMenu::AddMenuEnhancements() { .Options(ComboboxOptions() .ComboMap(subPowers) .Tooltip( - "Modifies all fall damage\n" - "2x: Can survive all fall damage from the start of the game\n" - "4x: Can only survive short fall damage from the start of the game\n" - "8x: Cannot survive any fall damage from the start of the game\n" - "16x: Can survive all fall damage with max health without double defense\n" - "32x: Can survive all fall damage with max health and double defense\n" - "64x: Can survive short fall damage with double defense\n" - "128x: Cannot survive fall damage" + "Modifies all fall damage:\n" + "2x: Can survive all fall damage from the start of the game.\n" + "4x: Can only survive short fall damage from the start of the game.\n" + "8x: Cannot survive any fall damage from the start of the game.\n" + "16x: Can survive all fall damage with max health without double defense.\n" + "32x: Can survive all fall damage with max health and double defense.\n" + "64x: Can survive short fall damage with double defense.\n" + "128x: Cannot survive fall damage." ) ); AddWidget(path, "Void Damage Multiplier", WIDGET_CVAR_COMBOBOX) @@ -1067,13 +1067,13 @@ void SohMenu::AddMenuEnhancements() { .ComboMap(subSubPowers) .DefaultIndex(0) .Tooltip( - "Modifies damage taken after falling into a void\n" - "2x: Can survive void damage from the start of the game\n" - "4x: Cannot survive void damage from the start of the game\n" - "8x: Can survive void damage twice with max health without double defense\n" - "16x: Can survive void damage with max health without double defense\n" - "32x: Can survive void damage with max health and double defense\n" - "64x: Cannot survive void damage" + "Modifies damage taken after falling into a void:\n" + "2x: Can survive void damage from the start of the game.\n" + "4x: Cannot survive void damage from the start of the game.\n" + "8x: Can survive void damage twice with max health without double defense.\n" + "16x: Can survive void damage with max health without double defense.\n" + "32x: Can survive void damage with max health and double defense.\n" + "64x: Cannot survive void damage." ) ); AddWidget(path, "Bonk Damage Multiplier", WIDGET_CVAR_COMBOBOX) @@ -1126,7 +1126,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Dying will delete your file.\n\n" ICON_FA_EXCLAMATION_TRIANGLE " WARNING " ICON_FA_EXCLAMATION_TRIANGLE - "\nTHIS IS NOT REVERSABLE\nUSE AT YOUR OWN RISK!" + "\nTHIS IS NOT REVERSABLE!\nUSE AT YOUR OWN RISK!" )); AddWidget(path, "Always Win Goron Pot", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("GoronPot")) @@ -1188,11 +1188,11 @@ void SohMenu::AddMenuEnhancements() { }; AddWidget(path, "Customize Behavior##Shooting", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("CustomizeShootingGallery")) - .Options(CheckboxOptions().Tooltip("Turn on/off changes to the shooting gallery behavior")); + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the shooting gallery behavior.")); AddWidget(path, "Instant Win", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("InstantShootingGalleryWin")) .PreFunc(shootingGalleryDisabledFunc) - .Options(CheckboxOptions().Tooltip("Skips the Shooting Gallery minigame")); + .Options(CheckboxOptions().Tooltip("Skips the Shooting Gallery minigame.")); AddWidget(path, "No Rupee Randomization", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ConstantAdultGallery")) .PreFunc(shootingGalleryDisabledFunc) @@ -1223,7 +1223,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Bombchu Bowling behavior.")); auto bombchuBowlingDisabledFunc = [](WidgetInfo& info) { info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeBombchuBowling"), 0) == 0; - info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; }; AddWidget(path, "Remove Small Cucco", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoSmallCucco")) @@ -1264,7 +1264,7 @@ void SohMenu::AddMenuEnhancements() { info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), 0); info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off or " - "\"Unlimited Playback Time\" is on"; + "\"Unlimited Playback Time\" is on."; }) .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( "Adjusts the time allowed for playback before failing.")); @@ -1333,7 +1333,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fishing", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Customize Behavior##Fishing", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("CustomizeFishing")) - .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Fishing behavior")); + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Fishing behavior.")); auto fishingDisabledFunc = [](WidgetInfo& info) { info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) == 0; info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; @@ -1369,12 +1369,12 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("MinimumFishWeightChild")) .PreFunc(fishingDisabledFunc) .Options(IntSliderOptions().Min(3).Max(10).DefaultValue(10).Format("%d lbs.").Tooltip( - "The minimum weight for the unique Fishing Reward as a Child.")); + "The minimum weight for the unique Fishing Reward as a child.")); AddWidget(path, "Adult Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("MinimumFishWeightAdult")) .PreFunc(fishingDisabledFunc) .Options(IntSliderOptions().Min(6).Max(13).DefaultValue(13).Format("%d lbs.").Tooltip( - "The minimum weight for the unique fishing reward as an Adult.")); + "The minimum weight for the unique fishing reward as an adult.")); // Extra Modes path.sidebarName = "Extra Modes"; @@ -1392,15 +1392,15 @@ void SohMenu::AddMenuEnhancements() { .DefaultIndex(MIRRORED_WORLD_OFF) .ComboMap(mirroredWorldModes) .Tooltip( - "Mirrors the world horizontally\n\n" - " - Always: Always mirror the world\n" - " - Random: Randomly decide to mirror the world on each scene change\n" - " - Random (Seeded): Scenes are mirrored based on the current randomizer seed/file\n" - " - Dungeons: Mirror the world in Dungeons\n" - " - Dungeons (Vanilla): Mirror the world in vanilla Dungeons\n" - " - Dungeons (MQ): Mirror the world in MQ Dungeons\n" - " - Dungeons Random: Randomly decide to mirror the world in Dungeons\n" - " - Dungeons Random (Seeded): Dungeons are mirrored based on the current randomizer seed/file\n" + "Mirrors the world horizontally:\n\n" + " - Always: Always mirror the world.\n" + " - Random: Randomly decide to mirror the world on each scene change.\n" + " - Random (Seeded): Scenes are mirrored based on the current randomizer seed/file.\n" + " - Dungeons: Mirror the world in Dungeons.\n" + " - Dungeons (Vanilla): Mirror the world in Vanilla Dungeons.\n" + " - Dungeons (MQ): Mirror the world in MQ Dungeons.\n" + " - Dungeons Random: Randomly decide to mirror the world in Dungeons.\n" + " - Dungeons Random (Seeded): Dungeons are mirrored based on the current randomizer seed/file.\n" ) ); AddWidget(path, "Ivan the Fairy (Coop Mode)", WIDGET_CVAR_CHECKBOX) @@ -1528,10 +1528,10 @@ void SohMenu::AddMenuEnhancements() { .DefaultIndex(ENEMY_RANDOMIZER_OFF) .ComboMap(enemyRandomizerModes) .Tooltip( - "Replaces fixed enemies throughout the game with a random enemy. Bosses, mini-bosses and a few specific regular enemies are excluded.\n" - "Enemies that need more than Deku Nuts + either Deku Sticks or a sword to kill are excluded from spawning in \"clear enemy\" rooms.\n\n" - "- Random: Enemies are randomized every time you load a room\n" - "- Random (Seeded): Enemies are randomized based on the current randomizer seed/file\n" + "Replaces fixed enemies throughout the game with a random enemy. Bosses, Mini-Bosses and a few specific regular enemies are excluded.\n" + "Enemies that need more than Deku Nuts & either Deku Sticks or a sword to kill are excluded from spawning in \"clear enemy\" rooms.\n\n" + "- Random: Enemies are randomized every time you load a room.\n" + "- Random (Seeded): Enemies are randomized based on the current randomizer seed/file.\n" ) ); AddWidget(path, "Randomized Enemy Sizes", WIDGET_CVAR_CHECKBOX) @@ -1542,7 +1542,7 @@ void SohMenu::AddMenuEnhancements() { .PreFunc( [](WidgetInfo& info) { info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0); }) .Options(CheckboxOptions().Tooltip( - "Scales normal enemies Health with their randomized size. *This will NOT affect bosses*")); + "Scales normal enemies Health with their randomized size. *This will NOT affect Bosses!*")); AddWidget(path, "Enemy List", WIDGET_SEPARATOR_TEXT) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); @@ -1586,7 +1586,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Timeless Equipment", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("TimelessEquipment")) .Options(CheckboxOptions().Tooltip("Allows any item to be equipped, regardless of age.\n" - "Also allows Child to use Adult strength upgrades.")); + "Also allows child to use adult strength upgrades.")); AddWidget(path, "Unrestricted Items", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("NoRestrictItems")) .Options(CheckboxOptions().Tooltip("Allows you to use any item at any location")); @@ -1608,7 +1608,7 @@ void SohMenu::AddMenuEnhancements() { .Options(FloatSliderOptions().Format("%.2f").Min(0.1f).Max(5.0f).DefaultValue(1.0f)); AddWidget(path, "Hookshot Everything", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("HookshotEverything")) - .Options(CheckboxOptions().Tooltip("Makes every surface in the game hookshot-able.")); + .Options(CheckboxOptions().Tooltip("Makes every surface in the game hookshotable.")); AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_CHEAT("HookshotReachMultiplier")) .Options(FloatSliderOptions().Format("%.2f").Min(1.0f).Max(5.0f)); @@ -1667,7 +1667,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Time of Day", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Freeze Time", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("FreezeTime")) - .Options(CheckboxOptions().Tooltip("Freezes the time of day")); + .Options(CheckboxOptions().Tooltip("Freezes the time of day.")); AddWidget(path, "Time Sync", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("TimeSync")) .Options(CheckboxOptions().Tooltip("Syncs the in-game time with the real world time.")); @@ -1713,7 +1713,7 @@ void SohMenu::AddMenuEnhancements() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); }) .Options(CheckboxOptions().Tooltip( - "Turns on OoT Beta Quest. *WARNING* This will reset your game." + "Turns on OoT Beta Quest. *WARNING*: This will reset your game!" )); AddWidget(path, "Beta Quest World: %d", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_CHEAT("BetaQuestWorld")) @@ -1729,7 +1729,7 @@ void SohMenu::AddMenuEnhancements() { .Min(0) .Max(8) .Tooltip( - "Set the Beta Quest world to explore. *WARNING* Changing this will reset your game.\n" + "Set the Beta Quest world to explore. *WARNING*: Changing this will reset your game!\n" "Ctrl+Click to type in a value." )); diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp index 0d3b52b23..5c724ec1e 100644 --- a/soh/soh/SohGui/SohMenuRandomizer.cpp +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -45,8 +45,8 @@ void SohMenu::AddMenuRandomizer() { OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_VANILLA) && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) ); - info.options->disabledTooltip = "This setting is disabled because a savefile is loaded without the map & compass\n" - "shuffle settings set to \"Any Dungeon\", \"Overworld\" or \"Anywhere\""; + info.options->disabledTooltip = "This setting is disabled because a savefile is loaded without the map & compass.\n" + "Shuffle settings set to \"Any Dungeon\", \"Overworld\" or \"Anywhere\"."; }) .Options(CheckboxOptions().Tooltip( "Matches the color of maps & compasses to the dungeon they belong to. " @@ -88,7 +88,7 @@ void SohMenu::AddMenuRandomizer() { .Format("%.2f") .DefaultValue(10.0f) .Tooltip( - "The size of the item when it is picked up" + "The size of the item when it is picked up." )); // Plandomizer From 8832bcaf126dac93888c54c9778ad76a3a01bf18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Tue, 25 Mar 2025 19:00:32 +0000 Subject: [PATCH 04/12] Try make item pool size match location pool size (#5181) Also avoid putting random junk into the pool to begin with When smaller, add junk from pending junk items When larger, remove junk from the item pool This avoids issue where shuffles which add items to pool (souls, overworld keys, triforce pieces) would hit assert about item pool size exceeding location pool size --- .../randomizer/3drando/item_pool.cpp | 51 ++++++++----------- .../randomizer/3drando/item_pool.hpp | 1 - 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 43193a926..af52a6446 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -453,7 +453,7 @@ static void ReplaceMaxItem(const RandomizerGet itemToReplace, int max) { for (size_t i = 0; i < ItemPool.size(); i++) { if (ItemPool[i] == itemToReplace) { if (itemCount >= max) { - ItemPool[i] = GetJunkItem(); + ItemPool[i] = RG_NONE; } itemCount++; } @@ -703,19 +703,8 @@ void GenerateItemPool() { if (ctx->GetOption(RSK_SHUFFLE_BEEHIVES)) { //32 total beehive locations - AddItemToMainPool(RG_RED_RUPEE, 23); - AddItemToMainPool(RG_BLUE_RUPEE, 9); - } - - if (ctx->GetOption(RSK_SHUFFLE_COWS)) { - //9 total cow locations - for (uint8_t i = 0; i < 9; i++) { - AddItemToMainPool(GetJunkItem()); - } - //extra location for Jabu MQ - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { - AddItemToMainPool(GetJunkItem()); - } + AddItemToPool(PendingJunkPool, RG_RED_RUPEE, 23); + AddItemToPool(PendingJunkPool, RG_BLUE_RUPEE, 9); } // Shuffle Pots @@ -1335,6 +1324,7 @@ void GenerateItemPool() { } //Replace all junk items with ice traps for onslaught mode else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { + PendingJunkPool.clear(); for (uint8_t i = 0; i < JunkPoolItems.size() - 3; i++) { // -3 Omits Huge Rupees and Deku Nuts 10 ReplaceMaxItem(JunkPoolItems[i], 0); } @@ -1348,31 +1338,30 @@ void GenerateItemPool() { ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); } - //this feels ugly and there's probably a better way, but - //it replaces random junk with pending junk. - bool junkSet; - for (RandomizerGet pendingJunk : PendingJunkPool) { - junkSet = false; - for (RandomizerGet& item : ItemPool) { - for (RandomizerGet junk : JunkPoolItems) { - if (item == junk && item != RG_HUGE_RUPEE && item != RG_DEKU_NUTS_10) { - item = pendingJunk; - junkSet = true; + std::erase(ItemPool, RG_NONE); + + if (ItemPool.size() < ctx->allLocations.size()) { + Shuffle(PendingJunkPool); + size_t junkNeeded = std::min(PendingJunkPool.size(), ctx->allLocations.size() - ItemPool.size()); + ItemPool.insert(ItemPool.end(), PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + PendingJunkPool.erase(PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + } else if (ItemPool.size() > ctx->allLocations.size()) { + // RANDOTODO: all junk should be put in PendingJunkPool so this is never needed + size_t remove = ItemPool.size() - ctx->allLocations.size(); + for (size_t i = 0; remove > 0 && i < ItemPool.size(); i++) { + for (size_t j = 0; j < JunkPoolItems.size(); j++) { + if (ItemPool[i] == JunkPoolItems[j]) { + ItemPool[i] = RG_NONE; + remove--; break; } } - if (junkSet) break; } + std::erase(ItemPool, RG_NONE); } - PendingJunkPool.clear(); // RANDOTODO: Ideally this should be checking for equality, but that is not currently the case and has never been // the case, and isn't even currently the case in the 3drando repo we inherited this from years ago, so it may // be a large undertaking to fix. assert(ItemPool.size() <= ctx->allLocations.size() || !"Item Pool larger than Location Pool"); } - -void AddJunk() { - SPDLOG_DEBUG("HAD TO PLACE EXTRA JUNK "); - AddItemToMainPool(GetPendingJunkItem()); -} diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp index 4ef583001..095b417b4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp @@ -11,6 +11,5 @@ void AddItemToPool(std::vector& pool, const RandomizerGet item, s RandomizerGet GetJunkItem(); void PlaceJunkInExcludedLocation(const RandomizerCheck il); void GenerateItemPool(); -void AddJunk(); extern std::vector ItemPool; From c1ff45a240a2d1264140f66d4e7103102e129add Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 26 Mar 2025 11:07:26 +0100 Subject: [PATCH 05/12] More minor menu/cvar fixes (#5213) * Minor fixes * Hide unshuffled shop checks default fix --- soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp | 2 +- .../Enhancements/randomizer/randomizer_check_tracker.cpp | 2 +- soh/soh/SohGui/SohMenuSettings.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp index 2d750ab5d..7ecdc1f4b 100644 --- a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp +++ b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp @@ -117,7 +117,7 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD CLOSE_DISPS(titleContext->state.gfxCtx); } -#define CVAR_BOOTSEQUENCE_NAME CVAR_ENHANCEMENT("BootSequence") +#define CVAR_BOOTSEQUENCE_NAME CVAR_SETTING("BootSequence") #define CVAR_BOOTSEQUENCE_DEFAULT BOOTSEQUENCE_DEFAULT #define CVAR_BOOTSEQUENCE_VALUE CVarGetInteger(CVAR_BOOTSEQUENCE_NAME, CVAR_BOOTSEQUENCE_DEFAULT) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 62a4793e2..aa6b8b608 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -879,7 +879,7 @@ void CheckTrackerWindow::DrawElement() { mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); showLogicTooltip = CVarGetInteger(CVAR_TRACKER_CHECK("ShowLogic"), 0); - hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 1); + hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index eaa739afc..8e3cc5e19 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -354,7 +354,7 @@ void SohMenu::AddMenuSettings() { .Tooltip("Which corner of the screen notifications appear in.") .ComboMap(notificationPosition) .DefaultIndex(3)); - AddWidget(path, "Duration: %.0f seconds", WIDGET_CVAR_SLIDER_FLOAT) + AddWidget(path, "Duration (seconds):", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_SETTING("Notifications.Duration")) .Options(FloatSliderOptions() .Tooltip("How long notifications are displayed for.") @@ -363,13 +363,13 @@ void SohMenu::AddMenuSettings() { .Min(3.0f) .Max(30.0f) .DefaultValue(10.0f)); - AddWidget(path, "Background Opacity: %.0f%%", WIDGET_CVAR_SLIDER_FLOAT) + AddWidget(path, "Background Opacity", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_SETTING("Notifications.BgOpacity")) .Options(FloatSliderOptions() .Tooltip("How opaque the background of notifications is.") .DefaultValue(0.5f) .IsPercentage()); - AddWidget(path, "Size %.1f", WIDGET_CVAR_SLIDER_FLOAT) + AddWidget(path, "Size:", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_SETTING("Notifications.Size")) .Options(FloatSliderOptions() .Tooltip("How large notifications are.") From dd81af17bb70294dda93b31942bde56c276ba404 Mon Sep 17 00:00:00 2001 From: Varuuna Date: Wed, 26 Mar 2025 19:33:10 +0100 Subject: [PATCH 06/12] [Rando] Grassanity (#4889) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * * fixes softlock when talking to Mido without Kokiri Emerald after killing Gohma * * moved scene check to hook * moved vanilla conditioon into GameInteractor_Should * * corrected hook condition * removed 'this' * * reverted GameInteractor and hook_handlers * changed actor to use existing hook * * updated kokiri emerald conditions * * missed parentheses * * Overworld pretty much done. * Known issue with Market Night + 2 bushes in KF * Known issue with Adult bush in ZR * * fixed locations post-merge * * renamed option and types to 'GRASSANITY' * changed grassnity to be a combobox option * added first 5 deku tree locations * * color is a sickly green when containing a check * added ZR 14 (adult only bush on the platform, not the same?) * * forgot to rename the files to grassanity * updated draw method to fix regrowing grass * Removed old WIP locacc files * * removed comments in bush actor * added rest of Deku Tree plus MQ * Added DC + MQ * Fixed DC incorrect pos value on 1 loc * JJB done minus after big octo * Added BotW + MQ locs * WIP grottos * Grottos done * Workaround to allow market grass during night * Seperated the 2 KF bushes into 4 checks * Hints and additional formatting * Slightly less ghastly color * Corrected the 2 JJB locs * * Renaming and removal of some locs. * Restructure in z_en_kusa.c to leave vanilla code alone. * Formatting. * * see previous (forgot to stage woops) * * Clear grassIdentity on item drop * Added check for RC on RandoDraw function Results in no extra dupe drops, and instantly correct the color of the grass when cut instead of on collecting the item. * * fixed dupe location spoiler names which caused occasional crash when writing spoiler log * * reverse should * * fixed faulty locations * * corrected KAK location names and some formatting * * Fixed market bushes by tree not working at night * * merged ZR near PoH grass into a single loc * * Changed to ShipInit (might be missing something?) * Corrected Should in z_en_kusa.c to use original draw func when setting is Off * * Renaming to Shuffle Grass * * minor fix * * keyboard fail lol * * suggestions * * removed unused function * * move grass locations into ShuffleGrass * move grass GameInteractor into GIVanillaBehavior * minor fixes * * pre-removed locs from dungeon.cpp * * pre-remove from context.cpp * * re-added Grass to context * * added Dana's amazing custom bush models * using CSMC to display flowers based on "contents" * * added Dana's grass models * refactor to lessen the clutter in the switch * * removed fairy case * Added back missing Deku Tree locations * formatting * Update soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp Co-authored-by: Philip Dubé * re-added suggestion from previous * removed wrong line >.> --------- Co-authored-by: Philip Dubé --- .../gameplay_field_keep/BushTex.rgba16 | Bin 0 -> 2140 bytes .../gameplay_field_keep/LeafTex.rgba16 | Bin 0 -> 604 bytes .../flower_bosskey_tex.rgba16 | Bin 0 -> 604 bytes .../flower_bronze_tex.rgba16 | Bin 0 -> 604 bytes .../flower_fairy_tex.rgba16 | Bin 0 -> 604 bytes .../flower_gold_tex.rgba16 | Bin 0 -> 604 bytes .../flower_heart_tex.rgba16 | Bin 0 -> 604 bytes .../flower_mask_tex.rgba16 | Bin 0 -> 604 bytes .../flower_random_tex.rgba16 | Bin 0 -> 604 bytes .../flower_silver_tex.rgba16 | Bin 0 -> 604 bytes .../flower_token_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_field_keep/gFieldBushBossKeyDL | 14 + .../gFieldBushBossKeyDL_tri_0 | 8 + .../gFieldBushBossKeyDL_tri_1 | 134 +++++ .../gFieldBushBossKeyDL_tri_2 | 134 +++++ .../gFieldBushBossKeyDL_vtx_0 | 16 + .../gFieldBushBossKeyDL_vtx_1 | 268 +++++++++ .../gFieldBushBossKeyDL_vtx_2 | 268 +++++++++ .../gFieldBushBossKeyDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushFairyDL | 14 + .../gFieldBushFairyDL_tri_0 | 8 + .../gFieldBushFairyDL_tri_1 | 134 +++++ .../gFieldBushFairyDL_tri_2 | 134 +++++ .../gFieldBushFairyDL_vtx_0 | 16 + .../gFieldBushFairyDL_vtx_1 | 268 +++++++++ .../gFieldBushFairyDL_vtx_2 | 268 +++++++++ .../gFieldBushFairyDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushHeartDL | 14 + .../gFieldBushHeartDL_tri_0 | 8 + .../gFieldBushHeartDL_tri_1 | 134 +++++ .../gFieldBushHeartDL_tri_2 | 134 +++++ .../gFieldBushHeartDL_vtx_0 | 16 + .../gFieldBushHeartDL_vtx_1 | 268 +++++++++ .../gFieldBushHeartDL_vtx_2 | 268 +++++++++ .../gFieldBushHeartDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushJunkDL | 10 + .../gFieldBushJunkDL_tri_0 | 8 + .../gFieldBushJunkDL_vtx_0 | 16 + .../gFieldBushJunkDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushMajorDL | 14 + .../gFieldBushMajorDL_tri_0 | 8 + .../gFieldBushMajorDL_tri_1 | 134 +++++ .../gFieldBushMajorDL_tri_2 | 134 +++++ .../gFieldBushMajorDL_vtx_0 | 16 + .../gFieldBushMajorDL_vtx_1 | 268 +++++++++ .../gFieldBushMajorDL_vtx_2 | 268 +++++++++ .../gFieldBushMajorDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushMaskDL | 14 + .../gFieldBushMaskDL_tri_0 | 8 + .../gFieldBushMaskDL_tri_1 | 134 +++++ .../gFieldBushMaskDL_tri_2 | 134 +++++ .../gFieldBushMaskDL_vtx_0 | 16 + .../gFieldBushMaskDL_vtx_1 | 268 +++++++++ .../gFieldBushMaskDL_vtx_2 | 268 +++++++++ .../gFieldBushMaskDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushMinorDL | 14 + .../gFieldBushMinorDL_tri_0 | 8 + .../gFieldBushMinorDL_tri_1 | 134 +++++ .../gFieldBushMinorDL_tri_2 | 134 +++++ .../gFieldBushMinorDL_vtx_0 | 16 + .../gFieldBushMinorDL_vtx_1 | 268 +++++++++ .../gFieldBushMinorDL_vtx_2 | 268 +++++++++ .../gFieldBushMinorDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushRandomDL | 14 + .../gFieldBushRandomDL_tri_0 | 8 + .../gFieldBushRandomDL_tri_1 | 134 +++++ .../gFieldBushRandomDL_tri_2 | 134 +++++ .../gFieldBushRandomDL_vtx_0 | 16 + .../gFieldBushRandomDL_vtx_1 | 268 +++++++++ .../gFieldBushRandomDL_vtx_2 | 268 +++++++++ .../gFieldBushRandomDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushSmallKeyDL | 14 + .../gFieldBushSmallKeyDL_tri_0 | 8 + .../gFieldBushSmallKeyDL_tri_1 | 134 +++++ .../gFieldBushSmallKeyDL_tri_2 | 134 +++++ .../gFieldBushSmallKeyDL_vtx_0 | 16 + .../gFieldBushSmallKeyDL_vtx_1 | 268 +++++++++ .../gFieldBushSmallKeyDL_vtx_2 | 268 +++++++++ .../gFieldBushSmallKeyDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushTokenDL | 14 + .../gFieldBushTokenDL_tri_0 | 8 + .../gFieldBushTokenDL_tri_1 | 134 +++++ .../gFieldBushTokenDL_tri_2 | 134 +++++ .../gFieldBushTokenDL_vtx_0 | 16 + .../gFieldBushTokenDL_vtx_1 | 268 +++++++++ .../gFieldBushTokenDL_vtx_2 | 268 +++++++++ .../gFieldBushTokenDL_vtx_cull | 10 + ...gFieldBushBossKeyDL_f3dlite_flower_bosskey | 16 + .../mat_gFieldBushBossKeyDL_f3dlite_leaf | 16 + .../mat_gFieldBushBossKeyDL_f3dlite_shrubbery | 16 + ...mat_gFieldBushFairyDL_f3dlite_flower_fairy | 16 + .../mat_gFieldBushFairyDL_f3dlite_leaf | 16 + .../mat_gFieldBushFairyDL_f3dlite_shrubbery | 16 + ...mat_gFieldBushHeartDL_f3dlite_flower_heart | 16 + .../mat_gFieldBushHeartDL_f3dlite_leaf | 16 + .../mat_gFieldBushHeartDL_f3dlite_shrubbery | 16 + .../mat_gFieldBushJunkDL_f3dlite_shrubbery | 16 + .../mat_gFieldBushMajorDL_f3dlite_flower_gold | 16 + .../mat_gFieldBushMajorDL_f3dlite_leaf | 16 + .../mat_gFieldBushMajorDL_f3dlite_shrubbery | 16 + .../mat_gFieldBushMaskDL_f3dlite_flower_mask | 16 + .../mat_gFieldBushMaskDL_f3dlite_leaf | 16 + .../mat_gFieldBushMaskDL_f3dlite_shrubbery | 16 + ...at_gFieldBushMinorDL_f3dlite_flower_bronze | 16 + .../mat_gFieldBushMinorDL_f3dlite_leaf | 16 + .../mat_gFieldBushMinorDL_f3dlite_shrubbery | 16 + ...t_gFieldBushRandomDL_f3dlite_flower_random | 16 + .../mat_gFieldBushRandomDL_f3dlite_leaf | 16 + .../mat_gFieldBushRandomDL_f3dlite_shrubbery | 16 + ...gFieldBushSmallKeyDL_f3dlite_flower_silver | 16 + .../mat_gFieldBushSmallKeyDL_f3dlite_leaf | 16 + ...mat_gFieldBushSmallKeyDL_f3dlite_shrubbery | 16 + ...mat_gFieldBushTokenDL_f3dlite_flower_token | 16 + .../mat_gFieldBushTokenDL_f3dlite_leaf | 16 + .../mat_gFieldBushTokenDL_f3dlite_shrubbery | 16 + .../objects/gameplay_field_keep/model.xml | 10 + .../objects/gameplay_keep/LeafTex.rgba16 | Bin 0 -> 604 bytes .../objects/gameplay_keep/StemTex.rgba16 | Bin 0 -> 220 bytes .../gameplay_keep/flower_bosskey_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_bronze_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_fairy_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_gold_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_heart_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_mask_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_random_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_silver_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_token_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/gGrassBunchTex.rgba16 | Bin 0 -> 2140 bytes .../gRandoCuttableGrassBossKeyDL | 16 + .../gRandoCuttableGrassBossKeyDL_tri_0 | 16 + .../gRandoCuttableGrassBossKeyDL_tri_1 | 48 ++ .../gRandoCuttableGrassBossKeyDL_tri_2 | 48 ++ .../gRandoCuttableGrassBossKeyDL_tri_3 | 16 + .../gRandoCuttableGrassBossKeyDL_vtx_0 | 62 +++ .../gRandoCuttableGrassBossKeyDL_vtx_1 | 90 +++ .../gRandoCuttableGrassBossKeyDL_vtx_2 | 90 +++ .../gRandoCuttableGrassBossKeyDL_vtx_3 | 42 ++ .../gRandoCuttableGrassBossKeyDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassFairyDL | 16 + .../gRandoCuttableGrassFairyDL_tri_0 | 16 + .../gRandoCuttableGrassFairyDL_tri_1 | 48 ++ .../gRandoCuttableGrassFairyDL_tri_2 | 48 ++ .../gRandoCuttableGrassFairyDL_tri_3 | 16 + .../gRandoCuttableGrassFairyDL_vtx_0 | 62 +++ .../gRandoCuttableGrassFairyDL_vtx_1 | 90 +++ .../gRandoCuttableGrassFairyDL_vtx_2 | 90 +++ .../gRandoCuttableGrassFairyDL_vtx_3 | 42 ++ .../gRandoCuttableGrassFairyDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassHeartDL | 16 + .../gRandoCuttableGrassHeartDL_tri_0 | 16 + .../gRandoCuttableGrassHeartDL_tri_1 | 48 ++ .../gRandoCuttableGrassHeartDL_tri_2 | 48 ++ .../gRandoCuttableGrassHeartDL_tri_3 | 16 + .../gRandoCuttableGrassHeartDL_vtx_0 | 62 +++ .../gRandoCuttableGrassHeartDL_vtx_1 | 90 +++ .../gRandoCuttableGrassHeartDL_vtx_2 | 90 +++ .../gRandoCuttableGrassHeartDL_vtx_3 | 42 ++ .../gRandoCuttableGrassHeartDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassJunkDL | 10 + .../gRandoCuttableGrassJunkDL_tri_0 | 16 + .../gRandoCuttableGrassJunkDL_vtx_0 | 62 +++ .../gRandoCuttableGrassJunkDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassMajorDL | 16 + .../gRandoCuttableGrassMajorDL_tri_0 | 16 + .../gRandoCuttableGrassMajorDL_tri_1 | 48 ++ .../gRandoCuttableGrassMajorDL_tri_2 | 48 ++ .../gRandoCuttableGrassMajorDL_tri_3 | 16 + .../gRandoCuttableGrassMajorDL_vtx_0 | 62 +++ .../gRandoCuttableGrassMajorDL_vtx_1 | 90 +++ .../gRandoCuttableGrassMajorDL_vtx_2 | 90 +++ .../gRandoCuttableGrassMajorDL_vtx_3 | 42 ++ .../gRandoCuttableGrassMajorDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassMaskDL | 16 + .../gRandoCuttableGrassMaskDL_tri_0 | 16 + .../gRandoCuttableGrassMaskDL_tri_1 | 48 ++ .../gRandoCuttableGrassMaskDL_tri_2 | 48 ++ .../gRandoCuttableGrassMaskDL_tri_3 | 16 + .../gRandoCuttableGrassMaskDL_vtx_0 | 62 +++ .../gRandoCuttableGrassMaskDL_vtx_1 | 90 +++ .../gRandoCuttableGrassMaskDL_vtx_2 | 90 +++ .../gRandoCuttableGrassMaskDL_vtx_3 | 42 ++ .../gRandoCuttableGrassMaskDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassMinorDL | 16 + .../gRandoCuttableGrassMinorDL_tri_0 | 16 + .../gRandoCuttableGrassMinorDL_tri_1 | 48 ++ .../gRandoCuttableGrassMinorDL_tri_2 | 48 ++ .../gRandoCuttableGrassMinorDL_tri_3 | 16 + .../gRandoCuttableGrassMinorDL_vtx_0 | 62 +++ .../gRandoCuttableGrassMinorDL_vtx_1 | 90 +++ .../gRandoCuttableGrassMinorDL_vtx_2 | 90 +++ .../gRandoCuttableGrassMinorDL_vtx_3 | 42 ++ .../gRandoCuttableGrassMinorDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassRandomDL | 16 + .../gRandoCuttableGrassRandomDL_tri_0 | 16 + .../gRandoCuttableGrassRandomDL_tri_1 | 48 ++ .../gRandoCuttableGrassRandomDL_tri_2 | 48 ++ .../gRandoCuttableGrassRandomDL_tri_3 | 16 + .../gRandoCuttableGrassRandomDL_vtx_0 | 62 +++ .../gRandoCuttableGrassRandomDL_vtx_1 | 90 +++ .../gRandoCuttableGrassRandomDL_vtx_2 | 90 +++ .../gRandoCuttableGrassRandomDL_vtx_3 | 42 ++ .../gRandoCuttableGrassRandomDL_vtx_cull | 10 + .../gRandoCuttableGrassSmallKeyDL | 16 + .../gRandoCuttableGrassSmallKeyDL_tri_0 | 16 + .../gRandoCuttableGrassSmallKeyDL_tri_1 | 48 ++ .../gRandoCuttableGrassSmallKeyDL_tri_2 | 48 ++ .../gRandoCuttableGrassSmallKeyDL_tri_3 | 16 + .../gRandoCuttableGrassSmallKeyDL_vtx_0 | 62 +++ .../gRandoCuttableGrassSmallKeyDL_vtx_1 | 90 +++ .../gRandoCuttableGrassSmallKeyDL_vtx_2 | 90 +++ .../gRandoCuttableGrassSmallKeyDL_vtx_3 | 42 ++ .../gRandoCuttableGrassSmallKeyDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassTokenDL | 16 + .../gRandoCuttableGrassTokenDL_tri_0 | 16 + .../gRandoCuttableGrassTokenDL_tri_1 | 48 ++ .../gRandoCuttableGrassTokenDL_tri_2 | 48 ++ .../gRandoCuttableGrassTokenDL_tri_3 | 16 + .../gRandoCuttableGrassTokenDL_vtx_0 | 62 +++ .../gRandoCuttableGrassTokenDL_vtx_1 | 90 +++ .../gRandoCuttableGrassTokenDL_vtx_2 | 90 +++ .../gRandoCuttableGrassTokenDL_vtx_3 | 42 ++ .../gRandoCuttableGrassTokenDL_vtx_cull | 10 + ...gRandoCuttableGrassBossKeyDL_f3dlite_Grass | 16 + ...tableGrassBossKeyDL_f3dlite_flower_bosskey | 16 + ..._gRandoCuttableGrassBossKeyDL_f3dlite_leaf | 16 + ...ndoCuttableGrassBossKeyDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassFairyDL_f3dlite_Grass | 16 + ...oCuttableGrassFairyDL_f3dlite_flower_fairy | 16 + ...at_gRandoCuttableGrassFairyDL_f3dlite_leaf | 16 + ...RandoCuttableGrassFairyDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassHeartDL_f3dlite_Grass | 16 + ...oCuttableGrassHeartDL_f3dlite_flower_heart | 16 + ...at_gRandoCuttableGrassHeartDL_f3dlite_leaf | 16 + ...RandoCuttableGrassHeartDL_f3dlite_material | 16 + ...at_gRandoCuttableGrassJunkDL_f3dlite_Grass | 16 + ...t_gRandoCuttableGrassMajorDL_f3dlite_Grass | 16 + ...doCuttableGrassMajorDL_f3dlite_flower_gold | 16 + ...at_gRandoCuttableGrassMajorDL_f3dlite_leaf | 16 + ...RandoCuttableGrassMajorDL_f3dlite_material | 16 + ...at_gRandoCuttableGrassMaskDL_f3dlite_Grass | 16 + ...ndoCuttableGrassMaskDL_f3dlite_flower_mask | 16 + ...mat_gRandoCuttableGrassMaskDL_f3dlite_leaf | 16 + ...gRandoCuttableGrassMaskDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassMinorDL_f3dlite_Grass | 16 + ...CuttableGrassMinorDL_f3dlite_flower_bronze | 16 + ...at_gRandoCuttableGrassMinorDL_f3dlite_leaf | 16 + ...RandoCuttableGrassMinorDL_f3dlite_material | 16 + ..._gRandoCuttableGrassRandomDL_f3dlite_Grass | 16 + ...uttableGrassRandomDL_f3dlite_flower_random | 16 + ...t_gRandoCuttableGrassRandomDL_f3dlite_leaf | 16 + ...andoCuttableGrassRandomDL_f3dlite_material | 16 + ...RandoCuttableGrassSmallKeyDL_f3dlite_Grass | 16 + ...tableGrassSmallKeyDL_f3dlite_flower_silver | 16 + ...gRandoCuttableGrassSmallKeyDL_f3dlite_leaf | 16 + ...doCuttableGrassSmallKeyDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassTokenDL_f3dlite_Grass | 16 + ...oCuttableGrassTokenDL_f3dlite_flower_token | 16 + ...at_gRandoCuttableGrassTokenDL_f3dlite_leaf | 16 + ...RandoCuttableGrassTokenDL_f3dlite_material | 16 + .../custom/objects/gameplay_keep/model.xml | 10 + soh/assets/soh_assets.h | 60 ++ .../vanilla-behavior/GIVanillaBehavior.h | 16 + .../hint_list/hint_list_exclude_dungeon.cpp | 16 + .../hint_list/hint_list_exclude_overworld.cpp | 20 + .../Enhancements/randomizer/ShuffleGrass.cpp | 514 ++++++++++++++++++ .../Enhancements/randomizer/ShuffleGrass.h | 15 + soh/soh/Enhancements/randomizer/context.cpp | 7 +- soh/soh/Enhancements/randomizer/location.cpp | 7 + soh/soh/Enhancements/randomizer/location.h | 5 + .../dungeons/bottom_of_the_well.cpp | 44 +- .../location_access/dungeons/deku_tree.cpp | 141 ++++- .../dungeons/dodongos_cavern.cpp | 18 +- .../dungeons/jabujabus_belly.cpp | 30 +- .../overworld/castle_grounds.cpp | 2 + .../overworld/death_mountain_crater.cpp | 4 + .../overworld/death_mountain_trail.cpp | 6 + .../location_access/overworld/graveyard.cpp | 12 + .../overworld/hyrule_field.cpp | 62 +++ .../location_access/overworld/kakariko.cpp | 12 + .../overworld/kokiri_forest.cpp | 39 ++ .../location_access/overworld/lake_hylia.cpp | 42 ++ .../location_access/overworld/lost_woods.cpp | 13 + .../location_access/overworld/market.cpp | 12 +- .../location_access/overworld/zoras_river.cpp | 19 +- .../randomizer/option_descriptions.cpp | 11 + .../Enhancements/randomizer/randomizer.cpp | 412 ++++++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 1 + .../Enhancements/randomizer/randomizerTypes.h | 384 ++++++++++++- .../randomizer/randomizer_check_objects.cpp | 1 + .../randomizer/randomizer_check_tracker.cpp | 26 + .../Enhancements/randomizer/randomizer_inf.h | 351 ++++++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 2 + soh/soh/Enhancements/randomizer/static_data.h | 1 + .../overlays/actors/ovl_En_Kusa/z_en_kusa.c | 28 +- .../overlays/actors/ovl_En_Kusa/z_en_kusa.h | 1 + 295 files changed, 15086 insertions(+), 60 deletions(-) create mode 100644 soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/model.xml create mode 100644 soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/model.xml create mode 100644 soh/soh/Enhancements/randomizer/ShuffleGrass.cpp create mode 100644 soh/soh/Enhancements/randomizer/ShuffleGrass.h diff --git a/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..99a0fd4bdea6e8baa2aea9c8a5f25c8ae3f199b6 GIT binary patch literal 2140 zcma)6L2u$l6oy5VQj4v;5sK_prS;HDyf?UoLt(vyCR576Ra0boDW-dfZ|kEE>%a;{ zg`_k=Y=zwPLUQtvz13PoaD<{zC23ggR=X+c59nX$8xtBrnkZx0Gh@H+eQ&<^{9G=V z>zl+^X*bOOSmt|j!}8YS4p=@ozek{FpSfIce>mFR_PO|ty*u4qg z|K9x7deHjcv#lJrhW#7Sgs=E@^IJP-=WTSEhmIBNt+Rf9I;N}pxxJ?+ts%K=dGxjX zLb}VXs$%QRMpx~xzF}6iV6$Olnug`r|Ms`|G1t|q7H5AtvZiBn>?-c!4YyjX*JjnK zR$Dm+#do!3rlW1Pwg)?OEWEICRIboo%k`*_b<=U8;OH9LPtGHC;S3$=Aa`hFOhejW-MFXB2uWVJNqhELSh%-8$kON9!zJ!GE zbD82g*P|_Dp4FDK6fTK9(5)0rGCFu@3rTT}_kwy9_Fs>-<(FKuK@^uMnNl!VuZ6qd zK}VhNbEbe7)pR&{9e%K5g<5CYiANCfAuf?c^H% zTBrrBS_xKy(joGIO8;FftfF2eRjggl4mA}rB(u?Mh?r>;X1Wa?fSr!RS{K)}syah5 zj_&Y}1%LSQq%T{BdWQH-<53SV1Q{pD@fvxuRBd+Y0P?vn9Y75l7H4jc{!VfVQlWOP zHGI?~T!16B<@jKAvgaXlhJ?I=kK{((FeHKi%y$G$v?F*i1$?i@ag98nj&pjS94Nn@ z-;XAQl1x>Cq!U3e+l43e81p^!t9-EzjIUfSZ5=O!_ds{TALl!Kht_dYtx6TX6G>$K zn$w-O{?wMCqYbSP!T0l4i1!j^`6E&}5f3ViJfK3<%d~Mx6_F?6$@-0q@yXI5R{-B| z#<{)n3&2A(xg&yBzEDzGzfg)M9tsZy1pI6~;$_`J5@XgKP1G1E?ZgGPqd~f?X_(vL z1?ath7#Y$ta1ZYbr3iQ+nIsBCeaM6KsBeDpGMf0%)=fhT(y`o+R)|!Px}l_?c1sa2 z0yI<~IK>H$xVm$>uh8oY%ZZpa21 mPVJ0v1l6YXd+wXiF4xmz^B1DRc%0WSiDb-6R4huBzoGB%{eRQ$}-sqp_S4w^Zo|J}C literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..54bdc9fa7800263894ed3be2cb7107e492095b19 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukiw{ah*_jE2rrTa^d zKW{{bdmEn}?l~_N%cRV;H2Cs;M|AnA{7b!a0=Z2&39j(=Dyaw2~IR7FV~tCjTbi9`YA1$>??dwi%)I-K=MFACI+b;4GfV_Kec$mqBX${> q=zT|!8f@->sJPE~?%=V;b3nIahu0a8IqqZJhtn3IeB(C8tp@?cN-TN+ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..9d561d1ae10910dec3ec1e657a24175afbbca56c GIT binary patch literal 604 zcma)3v1-FW3_bM=`bR~W%z@G&zmd_IqAbCq$E2IbBV9b2CZNy`F?7jjNC$fiB)`z7 zIAEXKp(liN_oVkE&N=5Mqn9xuUUzTb=1Bj29#Hvs_qJ*NW&Dpel1Qh)ltj}=9t&~>9Ch*V;XRwKDuo{msWxuv) zcWQ1`1%oA+G2GbnDkwCFL!`UcTBD}c?xmj@Ln&tc*Di19sCy~+uOGFl7SB27AM%(7 A+W-In literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..b9d1f74e3622404781611de6157424b2db45417b GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixAE!8-Qo)uZc@GS z{$C|JJlgo~@Ri<$cULAJe7;%zojJPvmGgJK4_}-)cV*(mm!~qfXrjw6ygT#eBFTmG zS0*1^eoObz%BzK_DmJOEOkTNo=hB1AFTT9_`jPJL%x@@mY<_u4^W^fA%WuBE`TF78 zNBOsMk7y&C@Xmbm^Gn&cv~RwBr28oM(fUX0cRhbvjH=>{?xyFbvcaVrJ>8UkD;H>o?&?%be}1dHyZOl4*-v*ZKehU>Ho7lh_Iq@>)GlvqM&E6Z2#5$r2?*mdE> zNt7LpfPJ5NAcPQK-RHaH^?LX|*XHfNzZYh{-g_2p-h|+0-~$q#!RfWOITPnjMMFaN(hVC=uki*YR%SEXNARijz67 z>-M6^M2Y zc>z%Gg4UIs3poofmZI8GS^T(2xRZ0i@s*q_jxTWTyqKbjV#40K-KCqOA7_PD_ReTu zz&N8d=_aZhz^ZrWZccd}{J8L9r*Bm_x-X#S?FO3kHRo+gddlm%-Dq|ohwSdU$})_Q qL{q=Jt{SKYmnpl;DoelS0wJ0%m@T`@%yT#A7N!>BlTXc0)dv6&z9qN- literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..bf90c64fcc704c63c7b5917386809179f77dc695 GIT binary patch literal 604 zcma)&u};G<6h%!XhA6U1{>B^5Q0Zl;aDXA%$e1zRvcXVgh?w{VMi?1ELWse#EKjU_ z0{jBkP^!j8sJ?nilzZO0@nej!YH@yYfamAa{kt!`?tNw;k2dwwba~7e3dU*vnA?}t zAdECk+Al-BUVS{@E{a5q(vsL53U!B(E{u zl2c9v8Oo5A5IL{-$|~_>auyO%P^zkl_5;2Gq^Y9T*ZIM+Z0nkAs-?g z-?ImUIi9jAy2WNI+*1u^RnZK?4 A82|tP literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..52f4848b379f4950de39533db5eadc849b2dd635 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixA|DN&wcLKD*5Y- z-|t0-dmEoK_fD36&i$6BIOOg9N_6?DmzVLEiVH7ge#`S+=j+s5bb0CL%8QjBbH8MM z%d(Z%+UE1I&8R9=@|oXrzhyCGDdzdkYb{!xs{b6tj#^!r?>t*sw(|Vs`N?aoTB};w zyAj!h`<1QQs^+4WK)u$o)w+9Ct9{-d`;Mxjccaf*U30K(t*EtYIi@R*ZEe*KS!=Ui z7HE!ab;@c~H-JogzWdzPweNeDySz6wjWtI11-+z9n`U znCSCrkecV!Fg`kc-}2hmb6d}CMHh$ici*=>R=lrppCNYn=ezHlpWD1of9rby_9haR9{>KvmO1&jE80&Pvu=UatWMj7Jj7w5i>Qiy zYtrYf&c#WnEJ!qQAFuP~etE=Op^69$9~Wn_5yv=0y(D;_ArvgpSx`ihB>6osRTcmR zUK(h8D-cI#R01VlnnahT&nP0OI8+j{ZyaYyZVIO()NoJY=h=VhnqvN3ytjqma8r;~g7X=gA*e46#fQug< literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..436b8707145ced97e8cb5a75a86dbf0df3153ebb GIT binary patch literal 604 zcma)3F>b^l5X5OP-IkPGXO~;LiXxN(U2#o{JSP(3Ir&05#4qxN`$A?+u$82VR~WOi zJ2Q)oG3NF8VQR7&e50Et_MSC=%`x?HDH%aTwQ2qMORxIlo^%XLd}DNYRsNN*1@32 zD=LUF#JtXf|r1~?wvtDB?11sv_O4qT#SbxZS=IDPsmk;+RWFS40V=pMbb z>m4`Ya6{Rb^GsjEh(SN&hm59j9mbjuU#Lz^+fJ~yUd O?JsTIV9(*N0RIAMF@|LT literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL new file mode 100644 index 000000000..c0a32b3b0 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 new file mode 100644 index 000000000..bdb256c87 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 new file mode 100644 index 000000000..eab49e30d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 new file mode 100644 index 000000000..2fea2e4db --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL new file mode 100644 index 000000000..70e8240a4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 new file mode 100644 index 000000000..926fed879 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 new file mode 100644 index 000000000..74ccefada --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 new file mode 100644 index 000000000..08fdc08b9 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL new file mode 100644 index 000000000..046e04d33 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 new file mode 100644 index 000000000..dcc1da33a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 new file mode 100644 index 000000000..8475ba007 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 new file mode 100644 index 000000000..c20f0dc4d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL new file mode 100644 index 000000000..a27f05f47 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 new file mode 100644 index 000000000..be06a23a7 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL new file mode 100644 index 000000000..af43aa60c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 new file mode 100644 index 000000000..dd226cbc5 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 new file mode 100644 index 000000000..e00033c0f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 new file mode 100644 index 000000000..95c382ca0 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL new file mode 100644 index 000000000..b9e25ae70 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 new file mode 100644 index 000000000..874e7ffb8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 new file mode 100644 index 000000000..90b390218 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 new file mode 100644 index 000000000..b2c011f94 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL new file mode 100644 index 000000000..35d99afcd --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 new file mode 100644 index 000000000..6f519fbc8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 new file mode 100644 index 000000000..6d7a07c98 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 new file mode 100644 index 000000000..f85ac723f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL new file mode 100644 index 000000000..c04d7156e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 new file mode 100644 index 000000000..cb19e7c48 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 new file mode 100644 index 000000000..8cf916c22 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 new file mode 100644 index 000000000..cb5550f61 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL new file mode 100644 index 000000000..29371b448 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 new file mode 100644 index 000000000..a25ca5b55 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 new file mode 100644 index 000000000..cb9c707a8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 new file mode 100644 index 000000000..96023e0eb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL new file mode 100644 index 000000000..c8a98c94e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 new file mode 100644 index 000000000..e60691715 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 new file mode 100644 index 000000000..d20545643 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 new file mode 100644 index 000000000..72993605d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey new file mode 100644 index 000000000..0cad964b8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy new file mode 100644 index 000000000..740ca2da3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart new file mode 100644 index 000000000..e074ff279 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold new file mode 100644 index 000000000..42f481571 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask new file mode 100644 index 000000000..f19b26e56 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze new file mode 100644 index 000000000..de5aecac6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random new file mode 100644 index 000000000..36895a84b --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver new file mode 100644 index 000000000..227294911 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token new file mode 100644 index 000000000..6725b33e6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/model.xml b/soh/assets/custom/objects/gameplay_field_keep/model.xml new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..1d4f2db39ece723c81ed44213a4a5d5b8dd5e291 GIT binary patch literal 604 zcma)(v1)}d6o$2##HEgAOgG(bHZzoP2$zzfgLmlQcpt&>4huBzoGB%{eRQ$}-sqp_S4w^Zo|J}C literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..fa00a5606fd33519dace4b30dcbde5d16e72648c GIT binary patch literal 220 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTisFDMUA(|TO85kPu8-N@^N2x~R=9>O%%Z;0* K8U-Ec%?AMUia0U= literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..54bdc9fa7800263894ed3be2cb7107e492095b19 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukiw{ah*_jE2rrTa^d zKW{{bdmEn}?l~_N%cRV;H2Cs;M|AnA{7b!a0=Z2&39j(=Dyaw2~IR7FV~tCjTbi9`YA1$>??dwi%)I-K=MFACI+b;4GfV_Kec$mqBX${> q=zT|!8f@->sJPE~?%=V;b3nIahu0a8IqqZJhtn3IeB(C8tp@?cN-TN+ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..9d561d1ae10910dec3ec1e657a24175afbbca56c GIT binary patch literal 604 zcma)3v1-FW3_bM=`bR~W%z@G&zmd_IqAbCq$E2IbBV9b2CZNy`F?7jjNC$fiB)`z7 zIAEXKp(liN_oVkE&N=5Mqn9xuUUzTb=1Bj29#Hvs_qJ*NW&Dpel1Qh)ltj}=9t&~>9Ch*V;XRwKDuo{msWxuv) zcWQ1`1%oA+G2GbnDkwCFL!`UcTBD}c?xmj@Ln&tc*Di19sCy~+uOGFl7SB27AM%(7 A+W-In literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..b9d1f74e3622404781611de6157424b2db45417b GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixAE!8-Qo)uZc@GS z{$C|JJlgo~@Ri<$cULAJe7;%zojJPvmGgJK4_}-)cV*(mm!~qfXrjw6ygT#eBFTmG zS0*1^eoObz%BzK_DmJOEOkTNo=hB1AFTT9_`jPJL%x@@mY<_u4^W^fA%WuBE`TF78 zNBOsMk7y&C@Xmbm^Gn&cv~RwBr28oM(fUX0cRhbvjH=>{?xyFbvcaVrJ>8UkD;H>o?&?%be}1dHyZOl4*-v*ZKehU>Ho7lh_Iq@>)GlvqM&E6Z2#5$r2?*mdE> zNt7LpfPJ5NAcPQK-RHaH^?LX|*XHfNzZYh{-g_2p-h|+0-~$q#!RfWOITPnjMMFaN(hVC=uki*YR%SEXNARijz67 z>-M6^M2Y zc>z%Gg4UIs3poofmZI8GS^T(2xRZ0i@s*q_jxTWTyqKbjV#40K-KCqOA7_PD_ReTu zz&N8d=_aZhz^ZrWZccd}{J8L9r*Bm_x-X#S?FO3kHRo+gddlm%-Dq|ohwSdU$})_Q qL{q=Jt{SKYmnpl;DoelS0wJ0%m@T`@%yT#A7N!>BlTXc0)dv6&z9qN- literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..bf90c64fcc704c63c7b5917386809179f77dc695 GIT binary patch literal 604 zcma)&u};G<6h%!XhA6U1{>B^5Q0Zl;aDXA%$e1zRvcXVgh?w{VMi?1ELWse#EKjU_ z0{jBkP^!j8sJ?nilzZO0@nej!YH@yYfamAa{kt!`?tNw;k2dwwba~7e3dU*vnA?}t zAdECk+Al-BUVS{@E{a5q(vsL53U!B(E{u zl2c9v8Oo5A5IL{-$|~_>auyO%P^zkl_5;2Gq^Y9T*ZIM+Z0nkAs-?g z-?ImUIi9jAy2WNI+*1u^RnZK?4 A82|tP literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..52f4848b379f4950de39533db5eadc849b2dd635 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixA|DN&wcLKD*5Y- z-|t0-dmEoK_fD36&i$6BIOOg9N_6?DmzVLEiVH7ge#`S+=j+s5bb0CL%8QjBbH8MM z%d(Z%+UE1I&8R9=@|oXrzhyCGDdzdkYb{!xs{b6tj#^!r?>t*sw(|Vs`N?aoTB};w zyAj!h`<1QQs^+4WK)u$o)w+9Ct9{-d`;Mxjccaf*U30K(t*EtYIi@R*ZEe*KS!=Ui z7HE!ab;@c~H-JogzWdzPweNeDySz6wjWtI11-+z9n`U znCSCrkecV!Fg`kc-}2hmb6d}CMHh$ici*=>R=lrppCNYn=ezHlpWD1of9rby_9haR9{>KvmO1&jE80&Pvu=UatWMj7Jj7w5i>Qiy zYtrYf&c#WnEJ!qQAFuP~etE=Op^69$9~Wn_5yv=0y(D;_ArvgpSx`ihB>6osRTcmR zUK(h8D-cI#R01VlnnahT&nP0OI8+j{ZyaYyZVIO()NoJY=h=VhnqvN3ytjqma8r;~g7X=gA*e46#fQug< literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..436b8707145ced97e8cb5a75a86dbf0df3153ebb GIT binary patch literal 604 zcma)3F>b^l5X5OP-IkPGXO~;LiXxN(U2#o{JSP(3Ir&05#4qxN`$A?+u$82VR~WOi zJ2Q)oG3NF8VQR7&e50Et_MSC=%`x?HDH%aTwQ2qMORxIlo^%XLd}DNYRsNN*1@32 zD=LUF#JtXf|r1~?wvtDB?11sv_O4qT#SbxZS=IDPsmk;+RWFS40V=pMbb z>m4`Ya6{Rb^GsjEh(SN&hm59j9mbjuU#Lz^+fJ~yUd O?JsTIV9(*N0RIAMF@|LT literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..c59757c1d46f5999ba2894e433fbfc07f31e9e7a GIT binary patch literal 2140 zcma)7O^e%B6jfV>Gz=wHP3x+uP)%1}cG=k!24*py8iN%R8!e1^%eS<4)uIax!SIYB zmI#AKWKp!#QcHQMG8p8TWX24}%}?lG=(&<*&7|WrzC7tkdgtDAKP^d;)H!+9{0#Sh zX2IXIu>IuU=Q#P}c4eSHew8GwFSDnQUzzy$_x)c9$pjlQVV1J}{E!ub$CgLA>a@W>}d$P?(;5>reg$XQ)xD7Y47HiH; zI2A8H#N^L}P4NpLWmC?uHt^1E_&R!@^n+=%_9~aFeSW|yd}M++TWz~-KgV4+%i>k| zI{qo?C;eCr*TKbq@u}r4Yw~%EZJT9?Y?VDFt|ko9OSD*Zu5-@C9U5RAyn!IwR(Y`G zV??4s(GYGhjWsY}SUp5xQgA@T5>B3v2FsLr*(x(2jfQcSizWNra2jpM2l66XJMVJa zz%Oi_Q`BJDEb}EJiG2dl#eL_B!Q9Pqcu;^8-$*Ky*yafhsUQ! zI7^c5A00jV`LEiG+Ij7y_QLq;a)k)2DGJe=V(52R)7HszJ*Ac0d?~v@$+UbL~qsPC$^_6HH z7}1pcr#d9LT-iFZqwpp94v()Oh#vV*ex#l}X3d}r-W!TQtWp(lDi~cbQ{$@NDe5nsbJPV3OQ(JXhqU$!yj7;!i8k=O zmoUE@y|>cpD|BT2=e#2?P>JKbb5b7~gJp0*yn*f|edOFN`Y+c(x!?)%saxNeGA9j< zttSoPZhMc#n1qGrIX1gz94LyJ7g-N8Sof5qfAc3gx9WFkj^4)=Pt?oS*QQKUkHmy8 zh$`mSjh`^ezg5~lL9;lL4w|0!t4xReT-?T(U9sj@?sk1)_5Kd{QHn$)iGhvzOF5gV zcFTNn|Lj9gX&m1W2fm~^4lXkNdjuC|>7nxvy(1q`4>ZrQ&|lX~c;7yBa^E{*k^dji PoY;46|NB(K|KR=wVqj)U literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL new file mode 100644 index 000000000..4c7b1ab35 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 new file mode 100644 index 000000000..061362cd6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 new file mode 100644 index 000000000..16c026e42 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 new file mode 100644 index 000000000..0d0968586 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 new file mode 100644 index 000000000..d8fcf1fe1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL new file mode 100644 index 000000000..875f809dd --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 new file mode 100644 index 000000000..951dd58bb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 new file mode 100644 index 000000000..97fe8599c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 new file mode 100644 index 000000000..0d7b67f3c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 new file mode 100644 index 000000000..22c8ba3d8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL new file mode 100644 index 000000000..235dfdcf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 new file mode 100644 index 000000000..273e96ed4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 new file mode 100644 index 000000000..1b8a08eec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 new file mode 100644 index 000000000..889988611 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 new file mode 100644 index 000000000..45a3b48e1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL new file mode 100644 index 000000000..d4ab27bdb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 new file mode 100644 index 000000000..bcf6f69e6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull new file mode 100644 index 000000000..6444457b7 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL new file mode 100644 index 000000000..7ded8214f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 new file mode 100644 index 000000000..f8278cc0c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 new file mode 100644 index 000000000..64c020a98 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 new file mode 100644 index 000000000..13938b6d9 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 new file mode 100644 index 000000000..da60e69d2 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL new file mode 100644 index 000000000..94c93e453 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 new file mode 100644 index 000000000..d981594a9 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 new file mode 100644 index 000000000..ee5852695 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 new file mode 100644 index 000000000..1ed45fdcb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 new file mode 100644 index 000000000..94910ceb3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL new file mode 100644 index 000000000..e0ae6e48a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 new file mode 100644 index 000000000..7a5d4e3de --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 new file mode 100644 index 000000000..a24c28fa4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 new file mode 100644 index 000000000..5ef0b99cb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 new file mode 100644 index 000000000..d49e9b186 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL new file mode 100644 index 000000000..7ec87e807 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 new file mode 100644 index 000000000..94ccbe795 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 new file mode 100644 index 000000000..96e84046e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 new file mode 100644 index 000000000..db7142847 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 new file mode 100644 index 000000000..b1b8cb8c1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL new file mode 100644 index 000000000..f22094eba --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 new file mode 100644 index 000000000..2235b57ae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 new file mode 100644 index 000000000..93b101a86 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 new file mode 100644 index 000000000..2cf0ed524 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 new file mode 100644 index 000000000..653b2b7cb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL new file mode 100644 index 000000000..d1dff7095 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 new file mode 100644 index 000000000..dc2309657 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 new file mode 100644 index 000000000..f78444188 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 new file mode 100644 index 000000000..7de2d7943 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 new file mode 100644 index 000000000..e5c1fbd15 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey new file mode 100644 index 000000000..ee25715ae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy new file mode 100644 index 000000000..d3c0c44ec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart new file mode 100644 index 000000000..2864988e3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold new file mode 100644 index 000000000..6f451d12a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask new file mode 100644 index 000000000..a5bb3b8a4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze new file mode 100644 index 000000000..0102b9a5e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random new file mode 100644 index 000000000..f23e81a03 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver new file mode 100644 index 000000000..98dcfacb1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token new file mode 100644 index 000000000..63a739c30 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/model.xml b/soh/assets/custom/objects/gameplay_keep/model.xml new file mode 100644 index 000000000..6444457b7 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index ace158854..9e56e51bd 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -77,6 +77,66 @@ static const ALIGN_ASSET(2) char gBossSoulSkullDL[] = dgBossSoulSkullDL; #define dgRandoPotDL "__OTR__objects/gameplay_dangeon_keep/gRandoPotDL" static const ALIGN_ASSET(2) char gRandoPotDL[] = dgRandoPotDL; +#define dgRandoBushDL "__OTR__objects/gameplay_field_keep/gFieldBushRandomDL" +static const ALIGN_ASSET(2) char gRandoBushDL[] = dgRandoBushDL; + +#define dgRandoBushMinorDL "__OTR__objects/gameplay_field_keep/gFieldBushMinorDL" +static const ALIGN_ASSET(2) char gRandoBushMinorDL[] = dgRandoBushMinorDL; + +#define dgRandoBushMajorDL "__OTR__objects/gameplay_field_keep/gFieldBushMajorDL" +static const ALIGN_ASSET(2) char gRandoBushMajorDL[] = dgRandoBushMajorDL; + +#define dgRandoBushSmallKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushSmallKeyDL" +static const ALIGN_ASSET(2) char gRandoBushSmallKeyDL[] = dgRandoBushSmallKeyDL; + +#define dgRandoBushBossKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushBossKeyDL" +static const ALIGN_ASSET(2) char gRandoBushBossKeyDL[] = dgRandoBushBossKeyDL; + +#define dgRandoBushTokenDL "__OTR__objects/gameplay_field_keep/gFieldBushTokenDL" +static const ALIGN_ASSET(2) char gRandoBushTokenDL[] = dgRandoBushTokenDL; + +#define dgRandoBushMaskDL "__OTR__objects/gameplay_field_keep/gFieldBushMaskDL" +static const ALIGN_ASSET(2) char gRandoBushMaskDL[] = dgRandoBushMaskDL; + +#define dgRandoBushFairyDL "__OTR__objects/gameplay_field_keep/gFieldBushFairyDL" +static const ALIGN_ASSET(2) char gRandoBushFairyDL[] = dgRandoBushFairyDL; + +#define dgRandoBushHeartDL "__OTR__objects/gameplay_field_keep/gFieldBushHeartDL" +static const ALIGN_ASSET(2) char gRandoBushHeartDL[] = dgRandoBushHeartDL; + +#define dgRandoBushJunkDL "__OTR__objects/gameplay_field_keep/gFieldBushJunkDL" +static const ALIGN_ASSET(2) char gRandoBushJunkDL[] = dgRandoBushJunkDL; + +#define dgRandoCuttableGrassRandomDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassRandomDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassDL[] = dgRandoCuttableGrassRandomDL; + +#define dgRandoCuttableGrassMinorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMinorDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMinorDL[] = dgRandoCuttableGrassMinorDL; + +#define dgRandoCuttableGrassMajorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMajorDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMajorDL[] = dgRandoCuttableGrassMajorDL; + +#define dgRandoCuttableGrassSmallKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassSmallKeyDL[] = dgRandoCuttableGrassSmallKeyDL; + +#define dgRandoCuttableGrassBossKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassBossKeyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassBossKeyDL[] = dgRandoCuttableGrassBossKeyDL; + +#define dgRandoCuttableGrassTokenDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassTokenDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassTokenDL[] = dgRandoCuttableGrassTokenDL; + +#define dgRandoCuttableGrassMaskDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMaskDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMaskDL[] = dgRandoCuttableGrassMaskDL; + +#define dgRandoCuttableGrassFairyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassFairyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassFairyDL[] = dgRandoCuttableGrassFairyDL; + +#define dgRandoCuttableGrassHeartDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassHeartDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassHeartDL[] = dgRandoCuttableGrassHeartDL; + +#define dgRandoCuttableGrassJunkDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassJunkDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassJunkDL[] = dgRandoCuttableGrassJunkDL; + #define dgFishingPoleGiDL "__OTR__objects/object_gi_fishing_pole/gFishingPoleGiDL" static const ALIGN_ASSET(2) char gFishingPoleGiDL[] = dgFishingPoleGiDL; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 8aace9a90..b4990803f 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -974,6 +974,22 @@ typedef enum { // - `*EnDs` VB_GRANNY_TAKE_MONEY, + // ### `result` + // ```c + // false + // ``` + // ### `args` + // - `*EnKusa` + VB_GRASS_DROP_ITEM, + + // ### `result` + // ```c + // true + // ``` + // ### `args` + // - `*EnKusa` + VB_GRASS_SETUP_DRAW, + // #### `result` // ```c // Flags_GetSwitch(play, this->dyna.actor.params & 0x3F) diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 81612ddb2..6e6ec17d6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -123,6 +123,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß ein #Herz im Deku-Baum# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ @@ -297,6 +301,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer un air orageux pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", + /*german*/ "!!!", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | JABU JABUS BELLY | @@ -457,6 +465,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß sich #nahe des zentralen Lifts in Jabu-Jabus Bauch# #[[1]]# befände.", /*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | FOREST TEMPLE | ---------------------------*/ @@ -1688,6 +1700,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_GRASS] = HintText(CustomMessage("They say that some #grass in the Bottom of the Well# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | ICE CAVERN | diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 9bbb1e4af..2c28b154e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1955,6 +1955,26 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + // clang-format on } } diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp new file mode 100644 index 000000000..b14c816d7 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -0,0 +1,514 @@ +#include "ShuffleGrass.h" +#include "soh_assets.h" +#include "static_data.h" +#include "soh/Enhancements/enhancementTypes.h" + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_En_Kusa/z_en_kusa.h" +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/object_kusa/object_kusa.h" +extern PlayState* gPlayState; +} + +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +void DrawTypeOfGrass(EnKusa* grassActor, Gfx* bushDList, Gfx* grassDList, PlayState* play) { + // Actor params is -255 for regrowable grass. + if (grassActor->actor.params == -255) { + Gfx_DrawDListOpa(play, grassDList); + } else { + Gfx_DrawDListOpa(play, bushDList); + } +} + +extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { + //static Gfx* dLists[] = { (Gfx*)gRandoBushDL, (Gfx*)object_kusa_DL_000140, (Gfx*)object_kusa_DL_000140 }; + static Gfx* dLists[] = { (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, (Gfx*)gRandoCuttableGrassJunkDL }; + auto grassActor = ((EnKusa*)thisx); + + OPEN_DISPS(play->state.gfxCtx); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + if (grassActor->grassIdentity.randomizerCheck != RC_MAX && Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) { + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + + if (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) { + auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE); + GetItemCategory getItemCategory = itemEntry.getItemCategory; + + switch (getItemCategory) { + case ITEM_CATEGORY_JUNK: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, play); + break; + case ITEM_CATEGORY_LESSER: + switch (itemEntry.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL, play); + break; + default: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, play); + break; + } + break; + case ITEM_CATEGORY_BOSS_KEY: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushBossKeyDL, (Gfx*)gRandoCuttableGrassBossKeyDL, play); + break; + case ITEM_CATEGORY_SMALL_KEY: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushSmallKeyDL, (Gfx*)gRandoCuttableGrassSmallKeyDL, play); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushTokenDL, (Gfx*)gRandoCuttableGrassTokenDL, play); + break; + case ITEM_CATEGORY_MAJOR: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMajorDL, (Gfx*)gRandoCuttableGrassMajorDL, play); + break; + default: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play); + break; + } + } else { + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play); + } + } else if (grassActor->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { + Gfx_DrawDListOpa(play, (Gfx*)object_kusa_DL_0002E0); + } else { + Gfx_DrawDListOpa(play, dLists[thisx->params & 3]); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + +uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) { + if (grassActor->grassIdentity.randomizerCheck == RC_MAX) + return false; + + RandomizerCheck rc = grassActor->grassIdentity.randomizerCheck; + + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t grassSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_GRASS).Get(); + + // Don't pull randomized item if grass isn't randomized or is already checked + if (!IS_RANDO || (grassSetting == RO_SHUFFLE_GRASS_OVERWORLD && isDungeon) || + (grassSetting == RO_SHUFFLE_GRASS_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) || + grassActor->grassIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void EnKusa_RandomizerSpawnCollectible(EnKusa* grassActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &grassActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = grassActor->grassIdentity.randomizerInf; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void EnKusa_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + + if (actor->id != ACTOR_EN_KUSA) + return; + + EnKusa* grassActor = static_cast(actorRef); + s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); + + grassActor->grassIdentity = OTRGlobals::Instance->gRandomizer->IdentifyGrass( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, respawnData, gPlayState->linkAgeOnLoad); +} + +void RegisterShuffleGrass() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_GRASS); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_KUSA, shouldRegister, EnKusa_RandomizerInit); + + COND_VB_SHOULD(VB_GRASS_SETUP_DRAW, shouldRegister, { + EnKusa* grassActor = va_arg(args, EnKusa*); + if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) { + grassActor->actor.draw = (ActorFunc)EnKusa_RandomizerDraw; + *should = false; + } else { + *should = true; + } + }); + + COND_VB_SHOULD(VB_GRASS_DROP_ITEM, shouldRegister, { + EnKusa* grassActor = va_arg(args, EnKusa*); + if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) { + EnKusa_RandomizerSpawnCollectible(grassActor, gPlayState); + grassActor->grassIdentity.randomizerCheck = RC_MAX; + grassActor->grassIdentity.randomizerInf = RAND_INF_MAX; + *should = false; + } else { + *should = true; + } + }); +} + + +void Rando::StaticData::RegisterGrassLocations() { + // Overworld Grass + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1)); + locationTable[RC_KF_CHILD_GRASS_2] = Location::Grass(RC_KF_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(594, 542), "Child Grass 2", "Child Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_2)); + locationTable[RC_KF_CHILD_GRASS_3] = Location::Grass(RC_KF_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(572, 603), "Child Grass 3", "Child Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_3)); + locationTable[RC_KF_CHILD_GRASS_4] = Location::Grass(RC_KF_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(385, 643), "Child Grass 4", "Child Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_4)); + locationTable[RC_KF_CHILD_GRASS_5] = Location::Grass(RC_KF_CHILD_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "Child Grass 5", "Child Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_5)); + locationTable[RC_KF_CHILD_GRASS_6] = Location::Grass(RC_KF_CHILD_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "Child Grass 6", "Child Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_6)); + locationTable[RC_KF_CHILD_GRASS_7] = Location::Grass(RC_KF_CHILD_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-612, 737), "Child Grass 7", "Child Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_7)); + locationTable[RC_KF_CHILD_GRASS_8] = Location::Grass(RC_KF_CHILD_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-671, 671), "Child Grass 8", "Child Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_8)); + locationTable[RC_KF_CHILD_GRASS_9] = Location::Grass(RC_KF_CHILD_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-748, 632), "Child Grass 9", "Child Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_9)); + locationTable[RC_KF_CHILD_GRASS_10] = Location::Grass(RC_KF_CHILD_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-757, 708), "Child Grass 10", "Child Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_10)); + locationTable[RC_KF_CHILD_GRASS_11] = Location::Grass(RC_KF_CHILD_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-823, 666), "Child Grass 11", "Child Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_11)); + locationTable[RC_KF_CHILD_GRASS_12] = Location::Grass(RC_KF_CHILD_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-835, 605), "Child Grass 12", "Child Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_12)); + locationTable[RC_KF_CHILD_GRASS_MAZE_1] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-995, 1531), "Child Grass Maze 1", "Child Grass Maze 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_1)); + locationTable[RC_KF_CHILD_GRASS_MAZE_2] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-701, 1882), "Child Grass Maze 2", "Child Grass Maze 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_2)); + locationTable[RC_KF_CHILD_GRASS_MAZE_3] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-295, 2297), "Child Grass Maze 3", "Child Grass Maze 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_3)); + locationTable[RC_KF_ADULT_GRASS_1] = Location::Grass(RC_KF_ADULT_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(839, 685), "Adult Grass 1", "Adult Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_1)); + locationTable[RC_KF_ADULT_GRASS_2] = Location::Grass(RC_KF_ADULT_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(809, 722), "Adult Grass 2", "Adult Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_2)); + locationTable[RC_KF_ADULT_GRASS_3] = Location::Grass(RC_KF_ADULT_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(760, 714), "Adult Grass 3", "Adult Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_3)); + locationTable[RC_KF_ADULT_GRASS_4] = Location::Grass(RC_KF_ADULT_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 679), "Adult Grass 4", "Adult Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_4)); + locationTable[RC_KF_ADULT_GRASS_5] = Location::Grass(RC_KF_ADULT_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 606), "Adult Grass 5", "Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_5)); + locationTable[RC_KF_ADULT_GRASS_6] = Location::Grass(RC_KF_ADULT_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 563), "Adult Grass 6", "Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_6)); + locationTable[RC_KF_ADULT_GRASS_7] = Location::Grass(RC_KF_ADULT_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(868, 606), "Adult Grass 7", "Adult Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_7)); + locationTable[RC_KF_ADULT_GRASS_8] = Location::Grass(RC_KF_ADULT_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 663), "Adult Grass 8", "Adult Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_8)); + locationTable[RC_KF_ADULT_GRASS_9] = Location::Grass(RC_KF_ADULT_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(757, 649), "Adult Grass 9", "Adult Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_9)); + locationTable[RC_KF_ADULT_GRASS_10] = Location::Grass(RC_KF_ADULT_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(773, 610), "Adult Grass 10", "Adult Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_10)); + locationTable[RC_KF_ADULT_GRASS_11] = Location::Grass(RC_KF_ADULT_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(815, 607), "Adult Grass 11", "Adult Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_11)); + locationTable[RC_KF_ADULT_GRASS_12] = Location::Grass(RC_KF_ADULT_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(836, 636), "Adult Grass 12", "Adult Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_12)); + locationTable[RC_KF_ADULT_GRASS_13] = Location::Grass(RC_KF_ADULT_GRASS_13, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-772, 654), "Adult Grass 13", "Adult Grass 13", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_13)); + locationTable[RC_KF_ADULT_GRASS_14] = Location::Grass(RC_KF_ADULT_GRASS_14, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-785, 611), "Adult Grass 14", "Adult Grass 14", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_14)); + locationTable[RC_KF_ADULT_GRASS_15] = Location::Grass(RC_KF_ADULT_GRASS_15, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-805, 691), "Adult Grass 15", "Adult Grass 15", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_15)); + locationTable[RC_KF_ADULT_GRASS_16] = Location::Grass(RC_KF_ADULT_GRASS_16, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-822, 644), "Adult Grass 16", "Adult Grass 16", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_16)); + locationTable[RC_KF_ADULT_GRASS_17] = Location::Grass(RC_KF_ADULT_GRASS_17, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-842, 601), "Adult Grass 17", "Adult Grass 17", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_17)); + locationTable[RC_KF_ADULT_GRASS_18] = Location::Grass(RC_KF_ADULT_GRASS_18, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-867, 674), "Adult Grass 18", "Adult Grass 18", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_18)); + locationTable[RC_KF_ADULT_GRASS_19] = Location::Grass(RC_KF_ADULT_GRASS_19, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 0xFF), "Adult Grass 19", "Adult Grass 19", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_19)); + locationTable[RC_KF_ADULT_GRASS_20] = Location::Grass(RC_KF_ADULT_GRASS_20, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 0xFF), "Adult Grass 20", "Adult Grass 20", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_20)); + locationTable[RC_LW_GRASS_1] = Location::Grass(RC_LW_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(676, -651), "Near Shortcuts Grass 1", "Near Shortcuts Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_1)); + locationTable[RC_LW_GRASS_2] = Location::Grass(RC_LW_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(633, -676), "Near Shortcuts Grass 2", "Near Shortcuts Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_2)); + locationTable[RC_LW_GRASS_3] = Location::Grass(RC_LW_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(645, -638), "Near Shortcuts Grass 3", "Near Shortcuts Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_3)); + locationTable[RC_LW_GRASS_4] = Location::Grass(RC_LW_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1476, -2251), "After Mido Grass 1", "After Mido Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_4)); + locationTable[RC_LW_GRASS_5] = Location::Grass(RC_LW_GRASS_5, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1433, -2276), "After Mido Grass 2", "After Mido Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_5)); + locationTable[RC_LW_GRASS_6] = Location::Grass(RC_LW_GRASS_6, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1445, -2238), "After Mido Grass 3", "After Mido Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_6)); + locationTable[RC_LW_GRASS_7] = Location::Grass(RC_LW_GRASS_7, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(926, -2232), "Near SFM Grass 1", "Near SFM Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_7)); + locationTable[RC_LW_GRASS_8] = Location::Grass(RC_LW_GRASS_8, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(965, -2241), "Near SFM Grass 2", "Near SFM Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_8)); + locationTable[RC_LW_GRASS_9] = Location::Grass(RC_LW_GRASS_9, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(952, -2275), "Near SFM Grass 3", "Near SFM Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_9)); + locationTable[RC_MARKET_GRASS_1] = Location::Grass(RC_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-106, 277), "Market Grass 1", "Market Grass 1", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_1)); + locationTable[RC_MARKET_GRASS_2] = Location::Grass(RC_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-131, 225), "Market Grass 2", "Market Grass 2", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_2)); + locationTable[RC_MARKET_GRASS_3] = Location::Grass(RC_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(504, -546), "Market Grass 3", "Market Grass 3", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_3)); + locationTable[RC_MARKET_GRASS_4] = Location::Grass(RC_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(465, -548), "Market Grass 4", "Market Grass 4", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_4)); + locationTable[RC_MARKET_GRASS_5] = Location::Grass(RC_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(432, -548), "Market Grass 5", "Market Grass 5", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_5)); + locationTable[RC_MARKET_GRASS_6] = Location::Grass(RC_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(73, -428), "Market Grass 6", "Market Grass 6", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_6)); + locationTable[RC_MARKET_GRASS_7] = Location::Grass(RC_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(75, -310), "Market Grass 7", "Market Grass 7", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_7)); + locationTable[RC_MARKET_GRASS_8] = Location::Grass(RC_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(76, -190), "Market Grass 8", "Market Grass 8", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_8)); + locationTable[RC_HC_GRASS_1] = Location::Grass(RC_HC_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1035, 882), "Near Storms Grotto Grass 1", "Near Storms Grotto Grass 1", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_1)); + locationTable[RC_HC_GRASS_2] = Location::Grass(RC_HC_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(975, 919), "Near Storms Grotto Grass 2", "Near Storms Grotto Grass 2", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_2)); + locationTable[RC_KAK_GRASS_1] = Location::Grass(RC_KAK_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1116, 1581), "Near Graveyard Grass 1", "Near Graveyard Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_1)); + locationTable[RC_KAK_GRASS_2] = Location::Grass(RC_KAK_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1103, 1532), "Near Graveyard Grass 2", "Near Graveyard Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_2)); + locationTable[RC_KAK_GRASS_3] = Location::Grass(RC_KAK_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1072, 1592), "Near Graveyard Grass 3", "Near Graveyard Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_3)); + locationTable[RC_KAK_GRASS_4] = Location::Grass(RC_KAK_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-800, 521), "Tree Grass 1", "Tree Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_4)); + locationTable[RC_KAK_GRASS_5] = Location::Grass(RC_KAK_GRASS_5, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-826, 585), "Tree Grass 2", "Tree Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_5)); + locationTable[RC_KAK_GRASS_6] = Location::Grass(RC_KAK_GRASS_6, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-827, 465), "Tree Grass 3", "Tree Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_6)); + locationTable[RC_KAK_GRASS_7] = Location::Grass(RC_KAK_GRASS_7, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-883, 582), "Tree Grass 4", "Tree Grass 4", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_7)); + locationTable[RC_KAK_GRASS_8] = Location::Grass(RC_KAK_GRASS_8, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-887, 467), "Tree Grass 5", "Tree Grass 5", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_8)); + locationTable[RC_GY_GRASS_1] = Location::Grass(RC_GY_GRASS_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1059, 732), "Graveyard Grass 1", "Graveyard Grass 1", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_1)); + locationTable[RC_GY_GRASS_2] = Location::Grass(RC_GY_GRASS_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1089, 769), "Graveyard Grass 2", "Graveyard Grass 2", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_2)); + locationTable[RC_GY_GRASS_3] = Location::Grass(RC_GY_GRASS_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1138, 761), "Graveyard Grass 3", "Graveyard Grass 3", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_3)); + locationTable[RC_GY_GRASS_4] = Location::Grass(RC_GY_GRASS_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 726), "Graveyard Grass 4", "Graveyard Grass 4", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_4)); + locationTable[RC_GY_GRASS_5] = Location::Grass(RC_GY_GRASS_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 653), "Graveyard Grass 5", "Graveyard Grass 5", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_5)); + locationTable[RC_GY_GRASS_6] = Location::Grass(RC_GY_GRASS_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 610), "Graveyard Grass 6", "Graveyard Grass 6", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_6)); + locationTable[RC_GY_GRASS_7] = Location::Grass(RC_GY_GRASS_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1030, 653), "Graveyard Grass 7", "Graveyard Grass 7", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_7)); + locationTable[RC_GY_GRASS_8] = Location::Grass(RC_GY_GRASS_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 710), "Graveyard Grass 8", "Graveyard Grass 8", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_8)); + locationTable[RC_GY_GRASS_9] = Location::Grass(RC_GY_GRASS_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1141, 696), "Graveyard Grass 9", "Graveyard Grass 9", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_9)); + locationTable[RC_GY_GRASS_10] = Location::Grass(RC_GY_GRASS_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1125, 657), "Graveyard Grass 10", "Graveyard Grass 10", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_10)); + locationTable[RC_GY_GRASS_11] = Location::Grass(RC_GY_GRASS_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1083, 654), "Graveyard Grass 11", "Graveyard Grass 11", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_11)); + locationTable[RC_GY_GRASS_12] = Location::Grass(RC_GY_GRASS_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1062, 683), "Graveyard Grass 12", "Graveyard Grass 12", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_12)); + locationTable[RC_LH_GRASS_1] = Location::Grass(RC_LH_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1637, 2796), "LH Grass 1", "LH Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_1)); + locationTable[RC_LH_GRASS_2] = Location::Grass(RC_LH_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1667, 2833), "LH Grass 2", "LH Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_2)); + locationTable[RC_LH_GRASS_3] = Location::Grass(RC_LH_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1716, 2825), "LH Grass 3", "LH Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_3)); + locationTable[RC_LH_GRASS_4] = Location::Grass(RC_LH_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2790), "LH Grass 4", "LH Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_4)); + locationTable[RC_LH_GRASS_5] = Location::Grass(RC_LH_GRASS_5, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2717), "LH Grass 5", "LH Grass 5", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_5)); + locationTable[RC_LH_GRASS_6] = Location::Grass(RC_LH_GRASS_6, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2674), "LH Grass 6", "LH Grass 6", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_6)); + locationTable[RC_LH_GRASS_7] = Location::Grass(RC_LH_GRASS_7, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1608, 2717), "LH Grass 7", "LH Grass 7", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_7)); + locationTable[RC_LH_GRASS_8] = Location::Grass(RC_LH_GRASS_8, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2774), "LH Grass 8", "LH Grass 8", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_8)); + locationTable[RC_LH_GRASS_9] = Location::Grass(RC_LH_GRASS_9, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1719, 2760), "LH Grass 9", "LH Grass 9", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_9)); + locationTable[RC_LH_GRASS_10] = Location::Grass(RC_LH_GRASS_10, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1703, 2721), "LH Grass 10", "LH Grass 10", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_10)); + locationTable[RC_LH_GRASS_11] = Location::Grass(RC_LH_GRASS_11, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1661, 2718), "LH Grass 11", "LH Grass 11", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_11)); + locationTable[RC_LH_GRASS_12] = Location::Grass(RC_LH_GRASS_12, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1640, 2747), "LH Grass 12", "LH Grass 12", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_12)); + locationTable[RC_LH_GRASS_13] = Location::Grass(RC_LH_GRASS_13, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2028, 2542), "LH Grass 13", "LH Grass 13", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_13)); + locationTable[RC_LH_GRASS_14] = Location::Grass(RC_LH_GRASS_14, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2058, 2579), "LH Grass 14", "LH Grass 14", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_14)); + locationTable[RC_LH_GRASS_15] = Location::Grass(RC_LH_GRASS_15, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2107, 2571), "LH Grass 15", "LH Grass 15", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_15)); + locationTable[RC_LH_GRASS_16] = Location::Grass(RC_LH_GRASS_16, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2536), "LH Grass 16", "LH Grass 16", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_16)); + locationTable[RC_LH_GRASS_17] = Location::Grass(RC_LH_GRASS_17, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2463), "LH Grass 17", "LH Grass 17", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_17)); + locationTable[RC_LH_GRASS_18] = Location::Grass(RC_LH_GRASS_18, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2420), "LH Grass 18", "LH Grass 18", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_18)); + locationTable[RC_LH_GRASS_19] = Location::Grass(RC_LH_GRASS_19, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1999, 2463), "LH Grass 19", "LH Grass 19", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_19)); + locationTable[RC_LH_GRASS_20] = Location::Grass(RC_LH_GRASS_20, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2520), "LH Grass 20", "LH Grass 20", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_20)); + locationTable[RC_LH_GRASS_21] = Location::Grass(RC_LH_GRASS_21, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2110, 2506), "LH Grass 21", "LH Grass 21", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_21)); + locationTable[RC_LH_GRASS_22] = Location::Grass(RC_LH_GRASS_22, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2094, 2467), "LH Grass 22", "LH Grass 22", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_22)); + locationTable[RC_LH_GRASS_23] = Location::Grass(RC_LH_GRASS_23, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2052, 2464), "LH Grass 23", "LH Grass 23", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_23)); + locationTable[RC_LH_GRASS_24] = Location::Grass(RC_LH_GRASS_24, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2031, 2493), "LH Grass 24", "LH Grass 24", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_24)); + locationTable[RC_LH_GRASS_25] = Location::Grass(RC_LH_GRASS_25, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2204, 3050), "LH Grass 25", "LH Grass 25", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_25)); + locationTable[RC_LH_GRASS_26] = Location::Grass(RC_LH_GRASS_26, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2234, 3087), "LH Grass 26", "LH Grass 26", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_26)); + locationTable[RC_LH_GRASS_27] = Location::Grass(RC_LH_GRASS_27, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2283, 3079), "LH Grass 27", "LH Grass 27", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_27)); + locationTable[RC_LH_GRASS_28] = Location::Grass(RC_LH_GRASS_28, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 3044), "LH Grass 28", "LH Grass 28", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_28)); + locationTable[RC_LH_GRASS_29] = Location::Grass(RC_LH_GRASS_29, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 2971), "LH Grass 29", "LH Grass 29", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_29)); + locationTable[RC_LH_GRASS_30] = Location::Grass(RC_LH_GRASS_30, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 2928), "LH Grass 30", "LH Grass 30", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_30)); + locationTable[RC_LH_GRASS_31] = Location::Grass(RC_LH_GRASS_31, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2175, 2971), "LH Grass 31", "LH Grass 31", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_31)); + locationTable[RC_LH_GRASS_32] = Location::Grass(RC_LH_GRASS_32, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 3028), "LH Grass 32", "LH Grass 32", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_32)); + locationTable[RC_LH_GRASS_33] = Location::Grass(RC_LH_GRASS_33, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2286, 3014), "LH Grass 33", "LH Grass 33", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_33)); + locationTable[RC_LH_GRASS_34] = Location::Grass(RC_LH_GRASS_34, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2270, 2975), "LH Grass 34", "LH Grass 34", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_34)); + locationTable[RC_LH_GRASS_35] = Location::Grass(RC_LH_GRASS_35, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2228, 2972), "LH Grass 35", "LH Grass 35", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_35)); + locationTable[RC_LH_GRASS_36] = Location::Grass(RC_LH_GRASS_36, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2207, 3001), "LH Grass 36", "LH Grass 36", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_36)); + locationTable[RC_LH_CHILD_GRASS_1] = Location::Grass(RC_LH_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(13, 2735), "LH Child Grass 1", "LH Child Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_1)); + locationTable[RC_LH_CHILD_GRASS_2] = Location::Grass(RC_LH_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-77, 2891), "LH Child Grass 2", "LH Child Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_2)); + locationTable[RC_LH_CHILD_GRASS_3] = Location::Grass(RC_LH_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-222, 2888), "LH Child Grass 3", "LH Child Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_3)); + locationTable[RC_LH_CHILD_GRASS_4] = Location::Grass(RC_LH_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-295, 2973), "LH Child Grass 4", "LH Child Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_4)); + locationTable[RC_LH_WARP_PAD_GRASS_1] = Location::Grass(RC_LH_WARP_PAD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-613, 7369), "LH Warp Pad Grass 1", "LH Warp Pad Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_1)); + locationTable[RC_LH_WARP_PAD_GRASS_2] = Location::Grass(RC_LH_WARP_PAD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-662, 7352), "LH Warp Pad Grass 2", "LH Warp Pad Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_1] = Location::Grass(RC_HF_NEAR_KF_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3186, 7571), "Near KF Grass 1", "Near KF Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_1)); + locationTable[RC_HF_NEAR_KF_GRASS_2] = Location::Grass(RC_HF_NEAR_KF_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3156, 7608), "Near KF Grass 2", "Near KF Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_3] = Location::Grass(RC_HF_NEAR_KF_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3107, 7600), "Near KF Grass 3", "Near KF Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_3)); + locationTable[RC_HF_NEAR_KF_GRASS_4] = Location::Grass(RC_HF_NEAR_KF_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7565), "Near KF Grass 4", "Near KF Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_4)); + locationTable[RC_HF_NEAR_KF_GRASS_5] = Location::Grass(RC_HF_NEAR_KF_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7492), "Near KF Grass 5", "Near KF Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_5)); + locationTable[RC_HF_NEAR_KF_GRASS_6] = Location::Grass(RC_HF_NEAR_KF_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7449), "Near KF Grass 6", "Near KF Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_6)); + locationTable[RC_HF_NEAR_KF_GRASS_7] = Location::Grass(RC_HF_NEAR_KF_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3215, 7492), "Near KF Grass 7", "Near KF Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_7)); + locationTable[RC_HF_NEAR_KF_GRASS_8] = Location::Grass(RC_HF_NEAR_KF_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7549), "Near KF Grass 8", "Near KF Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_8)); + locationTable[RC_HF_NEAR_KF_GRASS_9] = Location::Grass(RC_HF_NEAR_KF_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3104, 7535), "Near KF Grass 9", "Near KF Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_9)); + locationTable[RC_HF_NEAR_KF_GRASS_10] = Location::Grass(RC_HF_NEAR_KF_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3120, 7496), "Near KF Grass 10", "Near KF Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_10)); + locationTable[RC_HF_NEAR_KF_GRASS_11] = Location::Grass(RC_HF_NEAR_KF_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3162, 7493), "Near KF Grass 11", "Near KF Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_11)); + locationTable[RC_HF_NEAR_KF_GRASS_12] = Location::Grass(RC_HF_NEAR_KF_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3183, 7522), "Near KF Grass 12", "Near KF Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_12)); + locationTable[RC_HF_NEAR_MARKET_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950, 3613), "Near Market Grass 1", "Near Market Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(920, 3650), "Near Market Grass 2", "Near Market Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(871, 3642), "Near Market Grass 3", "Near Market Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3607), "Near Market Grass 4", "Near Market Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GRASS_5] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3534), "Near Market Grass 5", "Near Market Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_5)); + locationTable[RC_HF_NEAR_MARKET_GRASS_6] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3491), "Near Market Grass 6", "Near Market Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_6)); + locationTable[RC_HF_NEAR_MARKET_GRASS_7] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(979, 3534), "Near Market Grass 7", "Near Market Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_7)); + locationTable[RC_HF_NEAR_MARKET_GRASS_8] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3591), "Near Market Grass 8", "Near Market Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_8)); + locationTable[RC_HF_NEAR_MARKET_GRASS_9] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(868, 3577), "Near Market Grass 9", "Near Market Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_9)); + locationTable[RC_HF_NEAR_MARKET_GRASS_10] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(884, 3538), "Near Market Grass 10", "Near Market Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_10)); + locationTable[RC_HF_NEAR_MARKET_GRASS_11] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(926, 3535), "Near Market Grass 11", "Near Market Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_11)); + locationTable[RC_HF_NEAR_MARKET_GRASS_12] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(947, 3564), "Near Market Grass 12", "Near Market Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_12)); + locationTable[RC_HF_SOUTH_GRASS_1] = Location::Grass(RC_HF_SOUTH_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-483, 11329), "South Grass 1", "South Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_1)); + locationTable[RC_HF_SOUTH_GRASS_2] = Location::Grass(RC_HF_SOUTH_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11294), "South Grass 2", "South Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_2)); + locationTable[RC_HF_SOUTH_GRASS_3] = Location::Grass(RC_HF_SOUTH_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11221), "South Grass 3", "South Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_3)); + locationTable[RC_HF_SOUTH_GRASS_4] = Location::Grass(RC_HF_SOUTH_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11178), "South Grass 4", "South Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_4)); + locationTable[RC_HF_SOUTH_GRASS_5] = Location::Grass(RC_HF_SOUTH_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-375, 11221), "South Grass 5", "South Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_5)); + locationTable[RC_HF_SOUTH_GRASS_6] = Location::Grass(RC_HF_SOUTH_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11278), "South Grass 6", "South Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_6)); + locationTable[RC_HF_SOUTH_GRASS_7] = Location::Grass(RC_HF_SOUTH_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-486, 11264), "South Grass 7", "South Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_7)); + locationTable[RC_HF_SOUTH_GRASS_8] = Location::Grass(RC_HF_SOUTH_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-470, 11225), "South Grass 8", "South Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_8)); + locationTable[RC_HF_SOUTH_GRASS_9] = Location::Grass(RC_HF_SOUTH_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-428, 11222), "South Grass 9", "South Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_9)); + locationTable[RC_HF_SOUTH_GRASS_10] = Location::Grass(RC_HF_SOUTH_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-407, 11251), "South Grass 10", "South Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_10)); + locationTable[RC_HF_SOUTH_GRASS_11] = Location::Grass(RC_HF_SOUTH_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-404, 11300), "South Grass 11", "South Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_11)); + locationTable[RC_HF_SOUTH_GRASS_12] = Location::Grass(RC_HF_SOUTH_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-434, 11337), "South Grass 12", "South Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_12)); + locationTable[RC_HF_CENTRAL_GRASS_1] = Location::Grass(RC_HF_CENTRAL_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-948, 9981), "Central Grass 1", "Central Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_1)); + locationTable[RC_HF_CENTRAL_GRASS_2] = Location::Grass(RC_HF_CENTRAL_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-978, 10018), "Central Grass 2", "Central Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_2)); + locationTable[RC_HF_CENTRAL_GRASS_3] = Location::Grass(RC_HF_CENTRAL_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1027, 10010), "Central Grass 3", "Central Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_3)); + locationTable[RC_HF_CENTRAL_GRASS_4] = Location::Grass(RC_HF_CENTRAL_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9975), "Central Grass 4", "Central Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_4)); + locationTable[RC_HF_CENTRAL_GRASS_5] = Location::Grass(RC_HF_CENTRAL_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9902), "Central Grass 5", "Central Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_5)); + locationTable[RC_HF_CENTRAL_GRASS_6] = Location::Grass(RC_HF_CENTRAL_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9859), "Central Grass 6", "Central Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_6)); + locationTable[RC_HF_CENTRAL_GRASS_7] = Location::Grass(RC_HF_CENTRAL_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-919, 9902), "Central Grass 7", "Central Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_7)); + locationTable[RC_HF_CENTRAL_GRASS_8] = Location::Grass(RC_HF_CENTRAL_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9959), "Central Grass 8", "Central Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_8)); + locationTable[RC_HF_CENTRAL_GRASS_9] = Location::Grass(RC_HF_CENTRAL_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1030, 9945), "Central Grass 9", "Central Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_9)); + locationTable[RC_HF_CENTRAL_GRASS_10] = Location::Grass(RC_HF_CENTRAL_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1014, 9906), "Central Grass 10", "Central Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_10)); + locationTable[RC_HF_CENTRAL_GRASS_11] = Location::Grass(RC_HF_CENTRAL_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-972, 9903), "Central Grass 11", "Central Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_11)); + locationTable[RC_HF_CENTRAL_GRASS_12] = Location::Grass(RC_HF_CENTRAL_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-951, 9932), "Central Grass 12", "Central Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_12)); + locationTable[RC_ZR_GRASS_1] = Location::Grass(RC_ZR_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1495, 1022), "Near Tree Grass 1", "Near Tree Grass 1", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_1)); + locationTable[RC_ZR_GRASS_2] = Location::Grass(RC_ZR_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1465, 985), "Near Tree Grass 2", "Near Tree Grass 2", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_2)); + locationTable[RC_ZR_GRASS_3] = Location::Grass(RC_ZR_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1544, 1014), "Near Tree Grass 3", "Near Tree Grass 3", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_3)); + locationTable[RC_ZR_GRASS_4] = Location::Grass(RC_ZR_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 979), "Near Tree Grass 4", "Near Tree Grass 4", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_4)); + locationTable[RC_ZR_GRASS_5] = Location::Grass(RC_ZR_GRASS_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 906), "Near Tree Grass 5", "Near Tree Grass 5", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_5)); + locationTable[RC_ZR_GRASS_6] = Location::Grass(RC_ZR_GRASS_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 863), "Near Tree Grass 6", "Near Tree Grass 6", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_6)); + locationTable[RC_ZR_GRASS_7] = Location::Grass(RC_ZR_GRASS_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 963), "Near Tree Grass 7", "Near Tree Grass 7", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_7)); + locationTable[RC_ZR_GRASS_8] = Location::Grass(RC_ZR_GRASS_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1547, 949), "Near Tree Grass 8", "Near Tree Grass 8", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_8)); + locationTable[RC_ZR_GRASS_9] = Location::Grass(RC_ZR_GRASS_9, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1531, 910), "Near Tree Grass 9", "Near Tree Grass 9", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_9)); + locationTable[RC_ZR_GRASS_10] = Location::Grass(RC_ZR_GRASS_10, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1489, 907), "Near Tree Grass 10", "Near Tree Grass 10", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_10)); + locationTable[RC_ZR_GRASS_11] = Location::Grass(RC_ZR_GRASS_11, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1468, 936), "Near Tree Grass 11", "Near Tree Grass 11", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_11)); + locationTable[RC_ZR_GRASS_12] = Location::Grass(RC_ZR_GRASS_12, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1436, 906), "Near Tree Grass 12", "Near Tree Grass 12", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_12)); + locationTable[RC_ZR_NEAR_FREESTANDING_POH_GRASS] = Location::Grass(RC_ZR_NEAR_FREESTANDING_POH_GRASS, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(231, -1478), "Near Freestanding PoH Grass", "Near Freestanding PoH Grass", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS)); + // Grotto Grass + locationTable[RC_KF_STORMS_GROTTO_GRASS_1] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x2C), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_1)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_2] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x2C), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_2)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_3] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x2C), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_3)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_4] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x2C), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_4)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x14), "Near Shortcuts Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x14), "Near Shortcuts Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x14), "Near Shortcuts Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x14), "Near Shortcuts Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_1] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x00), "Near Market Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_2] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x00), "Near Market Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_3] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x00), "Near Market Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_4] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x00), "Near Market Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_1] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x03), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_1)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_2] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x03), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_2)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_3] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x03), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_3)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_4] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x03), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_4)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_1] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x22), "Southeast Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_2] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x22), "Southeast Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_3] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x22), "Southeast Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_4] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x22), "Southeast Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4)); + locationTable[RC_HF_COW_GROTTO_GRASS_1] = Location::Base(RC_HF_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3419, 0xE4), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_1)); + locationTable[RC_HF_COW_GROTTO_GRASS_2] = Location::Base(RC_HF_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3518, 0xE4), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_1] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x28), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_1)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_2] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x28), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_3] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x28), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_3)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_4] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x28), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_4)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_1] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x57), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_1)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_2] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x57), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_2)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_3] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x57), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_3)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_4] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x57), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_4)); + locationTable[RC_DMT_COW_GROTTO_GRASS_1] = Location::Base(RC_DMT_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2443, 0xF8), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_1)); + locationTable[RC_DMT_COW_GROTTO_GRASS_2] = Location::Base(RC_DMT_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2494, 0xF8), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_1] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x7A), "Upper Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_1)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_2] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x7A), "Upper Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_3] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x7A), "Upper Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_3)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_4] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x7A), "Upper Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_4)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_1] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x29), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_1)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_2] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x29), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_2)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_3] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x29), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_3)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_4] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x29), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_4)); + // Dungeon Grass + locationTable[RC_DEKU_TREE_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(391, -156), "Deku Tree Lobby Grass 1", "Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(355, -233), "Deku Tree Lobby Grass 2", "Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(307, -289), "Deku Tree Lobby Grass 3", "Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, -414), "Deku Tree Lobby Grass 4", "Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_5, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(142, -399), "Deku Tree Lobby Grass 5", "Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1018, 1263), "Deku Tree Slingshot Grass 1", "Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1005, 1216), "Deku Tree Slingshot Grass 2", "Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1280, 1026), "Deku Tree Slingshot Grass 3", "Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1229, 1006), "Deku Tree Slingshot Grass 4", "Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1444, 169), "Deku Tree Compass Grass 1", "Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1516, 142), "Deku Tree Compass Grass 2", "Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 130), "Deku Tree Basement Grass 1", "Deku Tree Basement Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 187), "Deku Tree Basement Grass 2", "Deku Tree Basement Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-228, 792), "Deku Tree Eye Switch Grass 1", "Deku Tree Eye Switch Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-202, 751), "Deku Tree Eye Switch Grass 2", "Deku Tree Eye Switch Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(79, 794), "Deku Tree Eye Switch Grass 3", "Deku Tree Eye Switch Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(49, 752), "Deku Tree Eye Switch Grass 4", "Deku Tree Eye Switch Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1310, 840), "Deku Tree Spike Roller Grass 1", "Deku Tree Spike Roller Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1361, 840), "Deku Tree Spike Roller Grass 2", "Deku Tree Spike Roller Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1796, 821), "Deku Tree Torches Grass 1", "Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1919, 820), "Deku Tree Torches Grass 2", "Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1955, -296), "Deku Tree Larvae Grass 1", "Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2025, -301), "Deku Tree Larvae Grass 2", "Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -515), "Deku Tree Before Boss Grass 1", "Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -577), "Deku Tree Before Boss Grass 2", "Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-269, -643), "Deku Tree Before Boss Grass 3", "Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-760, -465), "Dodongo's Cavern First Bridge Grass", "Dodongo's Cavern First Bridge Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BLADE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BLADE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1713, -1246), "Dodongo's Cavern Blade Room Grass", "Dodongo's Cavern Blade Room Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3189, -485), "Dodongo's Cavern Single Eye Grass", "Dodongo's Cavern Single Eye Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-249, -2519), "Dodongo's Cavern Before Boss Grass", "Dodongo's Cavern Before Boss Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-858, -1330), "Bottom of the Well Basement Behind Rocks Grass 1", "Bottom of the Well Basement Behind Rocks Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-870, -1021), "Bottom of the Well Basement Behind Rocks Grass 2", "Bottom of the Well Basement Behind Rocks Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-872, -1383), "Bottom of the Well Basement Behind Rocks Grass 3", "Bottom of the Well Basement Behind Rocks Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-874, -1447), "Bottom of the Well Basement Behind Rocks Grass 4", "Bottom of the Well Basement Behind Rocks Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-886, -1263), "Bottom of the Well Basement Behind Rocks Grass 5", "Bottom of the Well Basement Behind Rocks Grass 5", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-918, -1131), "Bottom of the Well Basement Behind Rocks Grass 6", "Bottom of the Well Basement Behind Rocks Grass 6", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-943, -1316), "Bottom of the Well Basement Behind Rocks Grass 7", "Bottom of the Well Basement Behind Rocks Grass 7", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1377), "Bottom of the Well Basement Behind Rocks Grass 8", "Bottom of the Well Basement Behind Rocks Grass 8", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1463), "Bottom of the Well Basement Behind Rocks Grass 9", "Bottom of the Well Basement Behind Rocks Grass 9", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-619, -627), "Bottom of the Well Basement Grass 1", "Bottom of the Well Basement Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-565, -654), "Bottom of the Well Basement Grass 2", "Bottom of the Well Basement Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-552, -711), "Bottom of the Well Basement Grass 3", "Bottom of the Well Basement Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3)); + // MQ Dungeon Grass + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(392, -158), "MQ Deku Tree Lobby Grass 1", "MQ Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(356, -235), "MQ Deku Tree Lobby Grass 2", "MQ Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(308, -291), "MQ Deku Tree Lobby Grass 3", "MQ Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(81, -416), "MQ Deku Tree Lobby Grass 4", "MQ Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(143, -401), "MQ Deku Tree Lobby Grass 5", "MQ Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-11, -344), "MQ Deku Tree Lobby Grass 6", "MQ Deku Tree Lobby Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-159, -302), "MQ Deku Tree Lobby Grass 7", "MQ Deku Tree Lobby Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-636, 161), "MQ Deku Tree Slingshot Grass 1", "MQ Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-693, 182), "MQ Deku Tree Slingshot Grass 2", "MQ Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1443, 167), "MQ Deku Tree Slingshot Grass 3", "MQ Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1515, 140), "MQ Deku Tree Slingshot Grass 4", "MQ Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-753, 614), "MQ Deku Tree Before Compass Grass 1", "MQ Deku Tree Before Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-736, 795), "MQ Deku Tree Before Compass Grass 2", "MQ Deku Tree Before Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-575, 627), "MQ Deku Tree Before Compass Grass 3", "MQ Deku Tree Before Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-572, 727), "MQ Deku Tree Before Compass Grass 4", "MQ Deku Tree Before Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-788, 702), "MQ Deku Tree Before Compass Grass 5", "MQ Deku Tree Before Compass Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-654, 582), "MQ Deku Tree Before Compass Grass 6", "MQ Deku Tree Before Compass Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-643, 798), "MQ Deku Tree Before Compass Grass 7", "MQ Deku Tree Before Compass Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1279, 1024), "MQ Deku Tree Compass Grass 1", "MQ Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1228, 1004), "MQ Deku Tree Compass Grass 2", "MQ Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1017, 1261), "MQ Deku Tree Compass Grass 3", "MQ Deku Tree Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1004, 1214), "MQ Deku Tree Compass Grass 4", "MQ Deku Tree Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-15, -261), "MQ Deku Tree Basement Lower Grass 1", "MQ Deku Tree Basement Lower Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-7, -328), "MQ Deku Tree Basement Lower Grass 2", "MQ Deku Tree Basement Lower Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(5, 119), "MQ Deku Tree Basement Lower Grass 3", "MQ Deku Tree Basement Lower Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-39, 118), "MQ Deku Tree Basement Lower Grass 4", "MQ Deku Tree Basement Lower Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-807, -228), "MQ Deku Tree Basement Upper Grass 1", "MQ Deku Tree Basement Upper Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-764, 280), "MQ Deku Tree Basement Upper Grass 2", "MQ Deku Tree Basement Upper Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, 237), "MQ Deku Tree Basement Upper Grass 3", "MQ Deku Tree Basement Upper Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-466, 865), "MQ Deku Tree Spike Roller Front Grass 1", "MQ Deku Tree Spike Roller Front Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-495, 906), "MQ Deku Tree Spike Roller Front Grass 2", "MQ Deku Tree Spike Roller Front Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-538, 907), "MQ Deku Tree Spike Roller Front Grass 3", "MQ Deku Tree Spike Roller Front Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1360, 838), "MQ Deku Tree Spike Roller Back Grass 1", "MQ Deku Tree Spike Roller Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1309, 838), "MQ Deku Tree Spike Roller Back Grass 2", "MQ Deku Tree Spike Roller Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-227, 790), "MQ Deku Tree Torches Grass 1", "MQ Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-201, 749), "MQ Deku Tree Torches Grass 2", "MQ Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(50, 750), "MQ Deku Tree Torches Grass 3", "MQ Deku Tree Torches Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, 792), "MQ Deku Tree Torches Grass 4", "MQ Deku Tree Torches Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1795, 819), "MQ Deku Tree Larvae Grass 1", "MQ Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1918, 818), "MQ Deku Tree Larvae Grass 2", "MQ Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1678, -120), "MQ Deku Tree Graves Grass 1", "MQ Deku Tree Graves Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1700, 196), "MQ Deku Tree Graves Grass 2", "MQ Deku Tree Graves Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2165, 350), "MQ Deku Tree Graves Grass 3", "MQ Deku Tree Graves Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2215, 56), "MQ Deku Tree Graves Grass 4", "MQ Deku Tree Graves Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1901, 604), "MQ Deku Tree Graves Grass 5", "MQ Deku Tree Graves Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2708, -522), "MQ Deku Tree Back Grass 1", "MQ Deku Tree Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2395, -587), "MQ Deku Tree Back Grass 2", "MQ Deku Tree Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2553, -433), "MQ Deku Tree Back Grass 3", "MQ Deku Tree Back Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -517), "MQ Deku Tree Before Boss Grass 1", "MQ Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -579), "MQ Deku Tree Before Boss Grass 2", "MQ Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-268, -645), "MQ Deku Tree Before Boss Grass 3", "MQ Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1721, -579), "MQ Dodongo's Cavern Compass Grass 1", "MQ Dodongo's Cavern Compass Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1731, -45), "MQ Dodongo's Cavern Compass Grass 2", "MQ Dodongo's Cavern Compass Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2218, -56), "MQ Dodongo's Cavern Compass Grass 3", "MQ Dodongo's Cavern Compass Grass 3", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2230, -556), "MQ Dodongo's Cavern Compass Grass 4", "MQ Dodongo's Cavern Compass Grass 4", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1765, -3940), "MQ Dodongo's Cavern Armos Grass", "MQ Dodongo's Cavern Armos Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1285, -4693), "MQ Dodongo's Cavern Back Poe Grass", "MQ Dodongo's Cavern Back Poe Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2644, -3368), "MQ Dodongo's Cavern Scrub Grass 1", "MQ Dodongo's Cavern Scrub Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2614, -3387), "MQ Dodongo's Cavern Scrub Grass 2", "MQ Dodongo's Cavern Scrub Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-219, -61), "MQ Jabu Jabu's Belly First Grass 1", "MQ Jabu Jabu's Belly First Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(213, -398), "MQ Jabu Jabu's Belly First Grass 2", "MQ Jabu Jabu's Belly First Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-192, -3209), "MQ Jabu Jabu's Belly Pit Grass 1", "MQ Jabu Jabu's Belly Pit Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(350, -3534), "MQ Jabu Jabu's Belly Pit Grass 2", "MQ Jabu Jabu's Belly Pit Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-91, -2815), "MQ Jabu Jabu's Belly Basement Grass 1", "MQ Jabu Jabu's Belly Basement Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(231, -3575), "MQ Jabu Jabu's Belly Basement Grass 2", "MQ Jabu Jabu's Belly Basement Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(305, -3481), "MQ Jabu Jabu's Belly Basement Grass 3", "MQ Jabu Jabu's Belly Basement Grass 3", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1089, -1489), "MQ Jabu Jabu's Belly Wigglers Grass", "MQ Jabu Jabu's Belly Wigglers Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(652, -5687), "MQ Jabu Jabu's Belly Like Like Grass", "MQ Jabu Jabu's Belly Like Like Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1228, -2647), "MQ Jabu Jabu's Belly Basement Boomerang Grass", "MQ Jabu Jabu's Belly Basement Boomerang Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1360, -3606), "MQ Jabu Jabu's Belly After Big Octo Grass 1", "MQ Jabu Jabu's Belly After Big Octo Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1086, -3346), "MQ Jabu Jabu's Belly After Big Octo Grass 2", "MQ Jabu Jabu's Belly After Big Octo Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1477, -1366), "MQ Jabu Jabu's Belly Before Boss Grass 1", "MQ Jabu Jabu's Belly Before Boss Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1691, -1576), "MQ Jabu Jabu's Belly Before Boss Grass 2", "MQ Jabu Jabu's Belly Before Boss Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1604, 3), "MQ Bottom of the Well Dead Hand Grass 1", "MQ Bottom of the Well Dead Hand Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1529, 2), "MQ Bottom of the Well Dead Hand Grass 2", "MQ Bottom of the Well Dead Hand Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1492, -49), "MQ Bottom of the Well Dead Hand Grass 3", "MQ Bottom of the Well Dead Hand Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1458, -130), "MQ Bottom of the Well Dead Hand Grass 4", "MQ Bottom of the Well Dead Hand Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4)); + // Shared Dungeon Grass + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(545, -75), "Deku Tree Queen Gohma Grass 1", "Deku Tree Queen Gohma Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(525, -375), "Deku Tree Queen Gohma Grass 2", "Deku Tree Queen Gohma Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-646, 108), "Deku Tree Queen Gohma Grass 3", "Deku Tree Queen Gohma Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-444, 323), "Deku Tree Queen Gohma Grass 4", "Deku Tree Queen Gohma Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-848, -166), "Deku Tree Queen Gohma Grass 5", "Deku Tree Queen Gohma Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-855, -596), "Deku Tree Queen Gohma Grass 6", "Deku Tree Queen Gohma Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Deku Tree Queen Gohma Grass 7", "Deku Tree Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Deku Tree Queen Gohma Grass 8", "Deku Tree Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)); + // End Grass +} + +static RegisterShipInitFunc registerShuffleGrass(RegisterShuffleGrass, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleGrassLocations(Rando::StaticData::RegisterGrassLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.h b/soh/soh/Enhancements/randomizer/ShuffleGrass.h new file mode 100644 index 000000000..e666f107e --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.h @@ -0,0 +1,15 @@ +#ifndef SHUFFLEGRASS_H +#define SHUFFLEGRASS_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void EnKusa_RandomizerInit(void* actorRef); +#ifdef __cplusplus +}; +#endif + +#endif //SHUFFLEGRASS_H diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 221e2176c..77f67873e 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -179,6 +179,7 @@ void Context::GenerateLocationPool() { (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || @@ -189,7 +190,8 @@ void Context::GenerateLocationPool() { // Skip stuff that is shuffled to dungeon only, i.e. tokens, pots, etc., or other checks that // should not have a shuffled item. if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || - (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS))) { + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -201,7 +203,8 @@ void Context::GenerateLocationPool() { if (location.GetQuest() == RCQUEST_BOTH || (location.GetQuest() == RCQUEST_MQ) == dungeon->IsMQ()) { if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || - (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD))) { + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD))) { continue; } // also add to that dungeon's location list. diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index b6f332927..7b5f98f4b 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -392,3 +392,10 @@ Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, false, collectionCheck}; } + +Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + std::string&& spoilerName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false, collectionCheck }; +} diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index b4fb6482a..3806160c8 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -199,6 +199,11 @@ class Location { RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 2a913f4a9..4ec6b6773 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -131,20 +131,32 @@ void RegionTable_Init_BottomOfTheWell() { areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, logic->CanCutShrubs() && logic->BlastOrSmash()), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM, []{return logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), @@ -235,6 +247,10 @@ void RegionTable_Init_BottomOfTheWell() { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DEAD_HAND)), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, logic->HasExplosives() || (ctx->GetTrickOption(RT_BOTW_MQ_DEADHAND_KEY) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, logic->CanCutShrubs()), }, { //Exits //This assumes we spawned in dead hand's room, if whatever trick made this relevant instead puts us in the previous room, remove the kill Dead Hand check. diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 21a7151da..129a842ef 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -25,6 +25,11 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MAP_CHEST, true), LOCATION(RC_DEKU_TREE_LOBBY_LOWER_HEART, true), LOCATION(RC_DEKU_TREE_LOBBY_UPPER_HEART, logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_5, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}), @@ -45,6 +50,10 @@ void RegionTable_Init_DekuTree() { //Locations LOCATION(RC_DEKU_TREE_SLINGSHOT_CHEST, true), LOCATION(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, true), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_1, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_2, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_3, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_4, logic->CanCutShrubs() && logic->CanReflectNuts()), }, { //Exits Entrance(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), @@ -59,6 +68,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_COMPASS_CHEST, true), LOCATION(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, true), LOCATION(RC_DEKU_TREE_GS_COMPASS_ROOM, logic->CanAttack()), + LOCATION(RC_DEKU_TREE_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_COMPASS_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}), @@ -74,6 +85,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_BASEMENT_CHEST, true), LOCATION(RC_DEKU_TREE_GS_BASEMENT_GATE, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)), LOCATION(RC_DEKU_TREE_GS_BASEMENT_VINES, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) ? ED_SHORT_JUMPSLASH : ED_BOMB_THROW)), + LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return true;}), @@ -82,7 +95,13 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return false;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + //Location + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_LOWER, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanHitEyeTargets();});}), @@ -94,7 +113,11 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}), }); - areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}), Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}), @@ -104,7 +127,11 @@ void RegionTable_Init_DekuTree() { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), @@ -114,7 +141,11 @@ void RegionTable_Init_DekuTree() { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), - }, {}, { + }, { + //Location + LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_BACK_ROOM, []{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}) && Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->BlastOrSmash();});}), @@ -142,9 +173,12 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Region("Deku Tree Outside Boss Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_UPPER, []{return true;}), @@ -159,7 +193,14 @@ void RegionTable_Init_DekuTree() { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanKillEnemy(RE_WITHERED_DEKU_BABA);}), EventAccess(&logic->BrokeDeku1FWeb, []{return logic->HasFireSource();}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}), //may need canAvoid logic with enemy shuffle @@ -173,9 +214,11 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_2F] = Region("Deku Tree MQ 2F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true), - LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), - LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -195,6 +238,10 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, logic->CanKillEnemy(RE_DEKU_BABA)), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, logic->HasFireSourceWithTorch() || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), @@ -205,7 +252,14 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_EYE_TARGET_ROOM] = Region("Deku Tree MQ Eye Target Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return Here(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanHitEyeTargets();});}), @@ -214,7 +268,11 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Region("Deku Tree MQ Compass Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), @@ -236,7 +294,11 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -250,7 +312,13 @@ void RegionTable_Init_DekuTree() { //Events //Implies CanKillEnemy(RE_GOHMA_LARVA) EventAccess(&logic->ClearedMQDekuSERoom, []{return logic->CanKillEnemy(RE_MAD_SCRUB);}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasFireSource();}), Entrance(RR_DEKU_TREE_MQ_BASEMENT, []{return logic->ClearedMQDekuSERoom;}), @@ -262,7 +330,10 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->MQDekuWaterRoomTorches, []{return logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_STICKS) && (ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield())));}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS));}), @@ -276,14 +347,20 @@ void RegionTable_Init_DekuTree() { }, { //Locations //it blocks the chest while stunned unless you stun it from afar while it's slightly off the ground - LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->MQDekuWaterRoomTorches && logic->CanPassEnemy(RE_BIG_SKULLTULA, logic->CanUse(RG_SONG_OF_TIME) ? ED_CLOSE : ED_SHORT_JUMPSLASH);}), Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)));}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()), + }, { //Exits //both imply CanKillEnemy(RE_GOHMA_LARVA) Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->CanKillEnemy(RE_MAD_SCRUB) && logic->CanKillEnemy(RE_KEESE);});}), @@ -297,6 +374,11 @@ void RegionTable_Init_DekuTree() { }, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG))), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->IsChild && Here(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), @@ -308,6 +390,9 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Region("Deku Tree MQ Basement Back Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return true;}), @@ -318,7 +403,10 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->PushedDekuBasementBlock, []{return true;}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()), + LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->IsChild;}), @@ -333,6 +421,9 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}), @@ -354,8 +445,16 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || logic->CanKillEnemy(RE_GOHMA);}), }, { // Locations - LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear), + LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, logic->DekuTreeClear && logic->CanCutShrubs()), }, { // Exits Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index 738368117..bea5801e5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -153,6 +153,8 @@ void RegionTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, true), LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), + LOCATION(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_BLADE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, []{return true;}), @@ -174,6 +176,7 @@ void RegionTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}), @@ -226,7 +229,10 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Region("Dodongos Cavern Boss Region", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), - }, {}, { + }, { + //Location + LOCATION(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_BACK_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOSS_AREA, []{return logic->CanBreakMudWalls();});}), @@ -346,7 +352,11 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS, []{return true;}), @@ -472,6 +482,8 @@ void RegionTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) + LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);});}), @@ -497,6 +509,7 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, true), //pulling the grave isn't required, as you can open the chest through it LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return logic->CanAttack();}), @@ -513,6 +526,7 @@ void RegionTable_Init_DodongosCavern() { Here(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) /* || bunny jumps*/);})), LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index 8e3c8a8d4..ed28e8672 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -173,6 +173,8 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return true;}), @@ -220,6 +222,11 @@ void RegionTable_Init_JabuJabusBelly() { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, logic->CanCutShrubs() && logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, logic->CanCutShrubs() && logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return true;}), @@ -233,10 +240,11 @@ void RegionTable_Init_JabuJabusBelly() { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, true), //Implies logic->CanKillEnemy(RE_LIKE_LIKE) && logic->CanKillEnemy(RE_STINGER). Without swim, jump from the song of time block to the vines. - LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, logic->CanCutShrubs()), }, { //Exits //without swim, jump from rang chest to the other side @@ -254,6 +262,7 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanUse(RG_BOOMERANG);}), @@ -298,7 +307,10 @@ void RegionTable_Init_JabuJabusBelly() { EventAccess(&logic->LoweredJabuPath, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), @@ -320,9 +332,11 @@ void RegionTable_Init_JabuJabusBelly() { EventAccess(&logic->FairyPot, []{return true;}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index 33022e270..bdcdf9a4c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -29,6 +29,8 @@ void RegionTable_Init_CastleGrounds() { LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_MALON_GOSSIP_STONE, true), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true), + LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_CASTLE_GROUNDS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index 48863c695..cc5601fcb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -114,6 +114,10 @@ void RegionTable_Init_DeathMountainCrater() { LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DMC_UPPER_LOCAL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index 750fbf140..b9fab96e0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -73,6 +73,8 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true), LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true), LOCATION(RC_DMT_COW_GROTTO_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_DMT_COW_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMT_COW_GROTTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), @@ -87,6 +89,10 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 6a3fb41f5..694d0e3ee 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -19,6 +19,18 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->IsAdult || logic->AtNight;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index f6c9d1c40..add3a2f86 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -13,6 +13,54 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_HF_CENTRAL_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_BRIDGE, []{return true;}), @@ -41,6 +89,10 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -55,6 +107,10 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -89,6 +145,8 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_COW_GROTTO_POT_1, logic->CanBreakPots()), LOCATION(RC_HF_COW_GROTTO_POT_2, logic->CanBreakPots()), + LOCATION(RC_HF_COW_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_COW_GROTTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HF_COW_GROTTO, []{return true;}), @@ -103,6 +161,10 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 846e55203..7fffa5d72 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -31,6 +31,14 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -224,6 +232,10 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_KAK_BACKYARD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp index cdd43b042..80df2bb91 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -40,6 +40,41 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild), LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild), LOCATION(RC_KF_GOSSIP_STONE, true), + LOCATION(RC_KF_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_9, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_10, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_11, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_12, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_1, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_2, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_3, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_4, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_5, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_6, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_7, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_8, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_9, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_10, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_11, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_12, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_13, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_14, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_15, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_16, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_17, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_19, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_20, logic->IsAdult && logic->CanCutShrubs()), }, { //Exits Entrance(RR_KF_LINKS_HOUSE, []{return true;}), @@ -146,6 +181,10 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index d4b950d78..04ae5fe85 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -39,6 +39,48 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), + LOCATION(RC_LH_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_13, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_14, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_15, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_16, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_17, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_18, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_19, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_20, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_21, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_22, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_23, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_24, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_25, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_26, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_27, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_28, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_29, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_30, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_31, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_32, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_33, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_34, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_35, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_36, logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_WARP_PAD_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LH_WARP_PAD_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp index fb146ec54..812b33a55 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -49,6 +49,9 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_SHORTCUT_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), + LOCATION(RC_LW_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_FOREST_EXIT, []{return true;}), @@ -72,6 +75,12 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_9, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_FOREST_EXIT, []{return true;}), @@ -90,6 +99,10 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_THE_LOST_WOODS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 3924c858a..02dea3b56 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -12,7 +12,17 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_GUARD_HOUSE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }); - areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), Entrance(RR_TOT_ENTRANCE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index 3a252edb0..3fbf8bdbd 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -7,7 +7,19 @@ void RegionTable_Init_ZoraRiver() { // clang-format off areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), + LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), + LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZORAS_RIVER, []{return logic->IsAdult || logic->BlastOrSmash();}), @@ -48,6 +60,7 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), + LOCATION(RC_ZR_NEAR_FREESTANDING_POH_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZR_FRONT, []{return true;}), @@ -73,6 +86,10 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZORAS_RIVER, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index a3184765f..576e8c334 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -449,6 +449,17 @@ void Settings::CreateOptionDescriptions() { "All Items - Shuffle all freestanding rupees & hearts."; mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = "Shuffle fairy locations."; + mOptionDescriptions[RSK_SHUFFLE_GRASS] = + "Grass/Bushes will drop a randomized item the first time they're cut and collected. " + "Grass/Bushes will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Grass/Bushes will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle grass/bushes that are within dungeons.\n" + "\n" + "Overworld - Only shuffle grass/bushes that are outside of dungeons.\n" + "\n" + "All Grass/Bushes - Shuffle all grass/bushes."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of Spiritual Stones and medallions.\n" "Vanilla - Spiritual Stones and medallions will be given from their respective boss.\n" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4eac2e5bb..f99a38ba3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1007,6 +1007,356 @@ std::map rcToRandomizerInf = { { RC_ZD_FISH_3, RAND_INF_ZD_FISH_3 }, { RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 }, { RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 }, + // Grass + { RC_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_1 }, + { RC_KF_CHILD_GRASS_2, RAND_INF_KF_CHILD_GRASS_2 }, + { RC_KF_CHILD_GRASS_3, RAND_INF_KF_CHILD_GRASS_3 }, + { RC_KF_CHILD_GRASS_4, RAND_INF_KF_CHILD_GRASS_4 }, + { RC_KF_CHILD_GRASS_5, RAND_INF_KF_CHILD_GRASS_5 }, + { RC_KF_CHILD_GRASS_6, RAND_INF_KF_CHILD_GRASS_6 }, + { RC_KF_CHILD_GRASS_7, RAND_INF_KF_CHILD_GRASS_7 }, + { RC_KF_CHILD_GRASS_8, RAND_INF_KF_CHILD_GRASS_8 }, + { RC_KF_CHILD_GRASS_9, RAND_INF_KF_CHILD_GRASS_9 }, + { RC_KF_CHILD_GRASS_10, RAND_INF_KF_CHILD_GRASS_10 }, + { RC_KF_CHILD_GRASS_11, RAND_INF_KF_CHILD_GRASS_11 }, + { RC_KF_CHILD_GRASS_12, RAND_INF_KF_CHILD_GRASS_12 }, + { RC_KF_CHILD_GRASS_MAZE_1, RAND_INF_KF_CHILD_GRASS_MAZE_1 }, + { RC_KF_CHILD_GRASS_MAZE_2, RAND_INF_KF_CHILD_GRASS_MAZE_2 }, + { RC_KF_CHILD_GRASS_MAZE_3, RAND_INF_KF_CHILD_GRASS_MAZE_3 }, + { RC_KF_ADULT_GRASS_1, RAND_INF_KF_ADULT_GRASS_1 }, + { RC_KF_ADULT_GRASS_2, RAND_INF_KF_ADULT_GRASS_2 }, + { RC_KF_ADULT_GRASS_3, RAND_INF_KF_ADULT_GRASS_3 }, + { RC_KF_ADULT_GRASS_4, RAND_INF_KF_ADULT_GRASS_4 }, + { RC_KF_ADULT_GRASS_5, RAND_INF_KF_ADULT_GRASS_5 }, + { RC_KF_ADULT_GRASS_6, RAND_INF_KF_ADULT_GRASS_6 }, + { RC_KF_ADULT_GRASS_7, RAND_INF_KF_ADULT_GRASS_7 }, + { RC_KF_ADULT_GRASS_8, RAND_INF_KF_ADULT_GRASS_8 }, + { RC_KF_ADULT_GRASS_9, RAND_INF_KF_ADULT_GRASS_9 }, + { RC_KF_ADULT_GRASS_10, RAND_INF_KF_ADULT_GRASS_10 }, + { RC_KF_ADULT_GRASS_11, RAND_INF_KF_ADULT_GRASS_11 }, + { RC_KF_ADULT_GRASS_12, RAND_INF_KF_ADULT_GRASS_12 }, + { RC_KF_ADULT_GRASS_13, RAND_INF_KF_ADULT_GRASS_13 }, + { RC_KF_ADULT_GRASS_14, RAND_INF_KF_ADULT_GRASS_14 }, + { RC_KF_ADULT_GRASS_15, RAND_INF_KF_ADULT_GRASS_15 }, + { RC_KF_ADULT_GRASS_16, RAND_INF_KF_ADULT_GRASS_16 }, + { RC_KF_ADULT_GRASS_17, RAND_INF_KF_ADULT_GRASS_17 }, + { RC_KF_ADULT_GRASS_18, RAND_INF_KF_ADULT_GRASS_18 }, + { RC_KF_ADULT_GRASS_19, RAND_INF_KF_ADULT_GRASS_19 }, + { RC_KF_ADULT_GRASS_20, RAND_INF_KF_ADULT_GRASS_20 }, + { RC_LW_GRASS_1, RAND_INF_LW_GRASS_1 }, + { RC_LW_GRASS_2, RAND_INF_LW_GRASS_2 }, + { RC_LW_GRASS_3, RAND_INF_LW_GRASS_3 }, + { RC_LW_GRASS_4, RAND_INF_LW_GRASS_4 }, + { RC_LW_GRASS_5, RAND_INF_LW_GRASS_5 }, + { RC_LW_GRASS_6, RAND_INF_LW_GRASS_6 }, + { RC_LW_GRASS_7, RAND_INF_LW_GRASS_7 }, + { RC_LW_GRASS_8, RAND_INF_LW_GRASS_8 }, + { RC_LW_GRASS_9, RAND_INF_LW_GRASS_9 }, + { RC_MARKET_GRASS_1, RAND_INF_MARKET_GRASS_1 }, + { RC_MARKET_GRASS_2, RAND_INF_MARKET_GRASS_2 }, + { RC_MARKET_GRASS_3, RAND_INF_MARKET_GRASS_3 }, + { RC_MARKET_GRASS_4, RAND_INF_MARKET_GRASS_4 }, + { RC_MARKET_GRASS_5, RAND_INF_MARKET_GRASS_5 }, + { RC_MARKET_GRASS_6, RAND_INF_MARKET_GRASS_6 }, + { RC_MARKET_GRASS_7, RAND_INF_MARKET_GRASS_7 }, + { RC_MARKET_GRASS_8, RAND_INF_MARKET_GRASS_8 }, + { RC_HC_GRASS_1, RAND_INF_HC_GRASS_1 }, + { RC_HC_GRASS_2, RAND_INF_HC_GRASS_2 }, + { RC_KAK_GRASS_1, RAND_INF_KAK_GRASS_1 }, + { RC_KAK_GRASS_2, RAND_INF_KAK_GRASS_2 }, + { RC_KAK_GRASS_3, RAND_INF_KAK_GRASS_3 }, + { RC_KAK_GRASS_4, RAND_INF_KAK_GRASS_4 }, + { RC_KAK_GRASS_5, RAND_INF_KAK_GRASS_5 }, + { RC_KAK_GRASS_6, RAND_INF_KAK_GRASS_6 }, + { RC_KAK_GRASS_7, RAND_INF_KAK_GRASS_7 }, + { RC_KAK_GRASS_8, RAND_INF_KAK_GRASS_8 }, + { RC_GY_GRASS_1, RAND_INF_GY_GRASS_1 }, + { RC_GY_GRASS_2, RAND_INF_GY_GRASS_2 }, + { RC_GY_GRASS_3, RAND_INF_GY_GRASS_3 }, + { RC_GY_GRASS_4, RAND_INF_GY_GRASS_4 }, + { RC_GY_GRASS_5, RAND_INF_GY_GRASS_5 }, + { RC_GY_GRASS_6, RAND_INF_GY_GRASS_6 }, + { RC_GY_GRASS_7, RAND_INF_GY_GRASS_7 }, + { RC_GY_GRASS_8, RAND_INF_GY_GRASS_8 }, + { RC_GY_GRASS_9, RAND_INF_GY_GRASS_9 }, + { RC_GY_GRASS_10, RAND_INF_GY_GRASS_10 }, + { RC_GY_GRASS_11, RAND_INF_GY_GRASS_11 }, + { RC_GY_GRASS_12, RAND_INF_GY_GRASS_12 }, + { RC_LH_GRASS_1, RAND_INF_LH_GRASS_1 }, + { RC_LH_GRASS_2, RAND_INF_LH_GRASS_2 }, + { RC_LH_GRASS_3, RAND_INF_LH_GRASS_3 }, + { RC_LH_GRASS_4, RAND_INF_LH_GRASS_4 }, + { RC_LH_GRASS_5, RAND_INF_LH_GRASS_5 }, + { RC_LH_GRASS_6, RAND_INF_LH_GRASS_6 }, + { RC_LH_GRASS_7, RAND_INF_LH_GRASS_7 }, + { RC_LH_GRASS_8, RAND_INF_LH_GRASS_8 }, + { RC_LH_GRASS_9, RAND_INF_LH_GRASS_9 }, + { RC_LH_GRASS_10, RAND_INF_LH_GRASS_10 }, + { RC_LH_GRASS_11, RAND_INF_LH_GRASS_11 }, + { RC_LH_GRASS_12, RAND_INF_LH_GRASS_12 }, + { RC_LH_GRASS_13, RAND_INF_LH_GRASS_13 }, + { RC_LH_GRASS_14, RAND_INF_LH_GRASS_14 }, + { RC_LH_GRASS_15, RAND_INF_LH_GRASS_15 }, + { RC_LH_GRASS_16, RAND_INF_LH_GRASS_16 }, + { RC_LH_GRASS_17, RAND_INF_LH_GRASS_17 }, + { RC_LH_GRASS_18, RAND_INF_LH_GRASS_18 }, + { RC_LH_GRASS_19, RAND_INF_LH_GRASS_19 }, + { RC_LH_GRASS_20, RAND_INF_LH_GRASS_20 }, + { RC_LH_GRASS_21, RAND_INF_LH_GRASS_21 }, + { RC_LH_GRASS_22, RAND_INF_LH_GRASS_22 }, + { RC_LH_GRASS_23, RAND_INF_LH_GRASS_23 }, + { RC_LH_GRASS_24, RAND_INF_LH_GRASS_24 }, + { RC_LH_GRASS_25, RAND_INF_LH_GRASS_25 }, + { RC_LH_GRASS_26, RAND_INF_LH_GRASS_26 }, + { RC_LH_GRASS_27, RAND_INF_LH_GRASS_27 }, + { RC_LH_GRASS_28, RAND_INF_LH_GRASS_28 }, + { RC_LH_GRASS_29, RAND_INF_LH_GRASS_29 }, + { RC_LH_GRASS_30, RAND_INF_LH_GRASS_30 }, + { RC_LH_GRASS_31, RAND_INF_LH_GRASS_31 }, + { RC_LH_GRASS_32, RAND_INF_LH_GRASS_32 }, + { RC_LH_GRASS_33, RAND_INF_LH_GRASS_33 }, + { RC_LH_GRASS_34, RAND_INF_LH_GRASS_34 }, + { RC_LH_GRASS_35, RAND_INF_LH_GRASS_35 }, + { RC_LH_GRASS_36, RAND_INF_LH_GRASS_36 }, + { RC_LH_CHILD_GRASS_1, RAND_INF_LH_CHILD_GRASS_1 }, + { RC_LH_CHILD_GRASS_2, RAND_INF_LH_CHILD_GRASS_2 }, + { RC_LH_CHILD_GRASS_3, RAND_INF_LH_CHILD_GRASS_3 }, + { RC_LH_CHILD_GRASS_4, RAND_INF_LH_CHILD_GRASS_4 }, + { RC_LH_WARP_PAD_GRASS_1, RAND_INF_LH_WARP_PAD_GRASS_1 }, + { RC_LH_WARP_PAD_GRASS_2, RAND_INF_LH_WARP_PAD_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_1, RAND_INF_HF_NEAR_KF_GRASS_1 }, + { RC_HF_NEAR_KF_GRASS_2, RAND_INF_HF_NEAR_KF_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_3, RAND_INF_HF_NEAR_KF_GRASS_3 }, + { RC_HF_NEAR_KF_GRASS_4, RAND_INF_HF_NEAR_KF_GRASS_4 }, + { RC_HF_NEAR_KF_GRASS_5, RAND_INF_HF_NEAR_KF_GRASS_5 }, + { RC_HF_NEAR_KF_GRASS_6, RAND_INF_HF_NEAR_KF_GRASS_6 }, + { RC_HF_NEAR_KF_GRASS_7, RAND_INF_HF_NEAR_KF_GRASS_7 }, + { RC_HF_NEAR_KF_GRASS_8, RAND_INF_HF_NEAR_KF_GRASS_8 }, + { RC_HF_NEAR_KF_GRASS_9, RAND_INF_HF_NEAR_KF_GRASS_9 }, + { RC_HF_NEAR_KF_GRASS_10, RAND_INF_HF_NEAR_KF_GRASS_10 }, + { RC_HF_NEAR_KF_GRASS_11, RAND_INF_HF_NEAR_KF_GRASS_11 }, + { RC_HF_NEAR_KF_GRASS_12, RAND_INF_HF_NEAR_KF_GRASS_12 }, + { RC_HF_NEAR_MARKET_GRASS_1, RAND_INF_HF_NEAR_MARKET_GRASS_1 }, + { RC_HF_NEAR_MARKET_GRASS_2, RAND_INF_HF_NEAR_MARKET_GRASS_2 }, + { RC_HF_NEAR_MARKET_GRASS_3, RAND_INF_HF_NEAR_MARKET_GRASS_3 }, + { RC_HF_NEAR_MARKET_GRASS_4, RAND_INF_HF_NEAR_MARKET_GRASS_4 }, + { RC_HF_NEAR_MARKET_GRASS_5, RAND_INF_HF_NEAR_MARKET_GRASS_5 }, + { RC_HF_NEAR_MARKET_GRASS_6, RAND_INF_HF_NEAR_MARKET_GRASS_6 }, + { RC_HF_NEAR_MARKET_GRASS_7, RAND_INF_HF_NEAR_MARKET_GRASS_7 }, + { RC_HF_NEAR_MARKET_GRASS_8, RAND_INF_HF_NEAR_MARKET_GRASS_8 }, + { RC_HF_NEAR_MARKET_GRASS_9, RAND_INF_HF_NEAR_MARKET_GRASS_9 }, + { RC_HF_NEAR_MARKET_GRASS_10, RAND_INF_HF_NEAR_MARKET_GRASS_10 }, + { RC_HF_NEAR_MARKET_GRASS_11, RAND_INF_HF_NEAR_MARKET_GRASS_11 }, + { RC_HF_NEAR_MARKET_GRASS_12, RAND_INF_HF_NEAR_MARKET_GRASS_12 }, + { RC_HF_SOUTH_GRASS_1, RAND_INF_HF_SOUTH_GRASS_1 }, + { RC_HF_SOUTH_GRASS_2, RAND_INF_HF_SOUTH_GRASS_2 }, + { RC_HF_SOUTH_GRASS_3, RAND_INF_HF_SOUTH_GRASS_3 }, + { RC_HF_SOUTH_GRASS_4, RAND_INF_HF_SOUTH_GRASS_4 }, + { RC_HF_SOUTH_GRASS_5, RAND_INF_HF_SOUTH_GRASS_5 }, + { RC_HF_SOUTH_GRASS_6, RAND_INF_HF_SOUTH_GRASS_6 }, + { RC_HF_SOUTH_GRASS_7, RAND_INF_HF_SOUTH_GRASS_7 }, + { RC_HF_SOUTH_GRASS_8, RAND_INF_HF_SOUTH_GRASS_8 }, + { RC_HF_SOUTH_GRASS_9, RAND_INF_HF_SOUTH_GRASS_9 }, + { RC_HF_SOUTH_GRASS_10, RAND_INF_HF_SOUTH_GRASS_10 }, + { RC_HF_SOUTH_GRASS_11, RAND_INF_HF_SOUTH_GRASS_11 }, + { RC_HF_SOUTH_GRASS_12, RAND_INF_HF_SOUTH_GRASS_12 }, + { RC_HF_CENTRAL_GRASS_1, RAND_INF_HF_CENTRAL_GRASS_1 }, + { RC_HF_CENTRAL_GRASS_2, RAND_INF_HF_CENTRAL_GRASS_2 }, + { RC_HF_CENTRAL_GRASS_3, RAND_INF_HF_CENTRAL_GRASS_3 }, + { RC_HF_CENTRAL_GRASS_4, RAND_INF_HF_CENTRAL_GRASS_4 }, + { RC_HF_CENTRAL_GRASS_5, RAND_INF_HF_CENTRAL_GRASS_5 }, + { RC_HF_CENTRAL_GRASS_6, RAND_INF_HF_CENTRAL_GRASS_6 }, + { RC_HF_CENTRAL_GRASS_7, RAND_INF_HF_CENTRAL_GRASS_7 }, + { RC_HF_CENTRAL_GRASS_8, RAND_INF_HF_CENTRAL_GRASS_8 }, + { RC_HF_CENTRAL_GRASS_9, RAND_INF_HF_CENTRAL_GRASS_9 }, + { RC_HF_CENTRAL_GRASS_10, RAND_INF_HF_CENTRAL_GRASS_10 }, + { RC_HF_CENTRAL_GRASS_11, RAND_INF_HF_CENTRAL_GRASS_11 }, + { RC_HF_CENTRAL_GRASS_12, RAND_INF_HF_CENTRAL_GRASS_12 }, + { RC_ZR_GRASS_1, RAND_INF_ZR_GRASS_1 }, + { RC_ZR_GRASS_2, RAND_INF_ZR_GRASS_2 }, + { RC_ZR_GRASS_3, RAND_INF_ZR_GRASS_3 }, + { RC_ZR_GRASS_4, RAND_INF_ZR_GRASS_4 }, + { RC_ZR_GRASS_5, RAND_INF_ZR_GRASS_5 }, + { RC_ZR_GRASS_6, RAND_INF_ZR_GRASS_6 }, + { RC_ZR_GRASS_7, RAND_INF_ZR_GRASS_7 }, + { RC_ZR_GRASS_8, RAND_INF_ZR_GRASS_8 }, + { RC_ZR_GRASS_9, RAND_INF_ZR_GRASS_9 }, + { RC_ZR_GRASS_10, RAND_INF_ZR_GRASS_10 }, + { RC_ZR_GRASS_11, RAND_INF_ZR_GRASS_11 }, + { RC_ZR_GRASS_12, RAND_INF_ZR_GRASS_12 }, + { RC_ZR_NEAR_FREESTANDING_POH_GRASS, RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS }, + // Grotto Grass + { RC_KF_STORMS_GROTTO_GRASS_1, RAND_INF_KF_STORMS_GROTTO_GRASS_1 }, + { RC_KF_STORMS_GROTTO_GRASS_2, RAND_INF_KF_STORMS_GROTTO_GRASS_2 }, + { RC_KF_STORMS_GROTTO_GRASS_3, RAND_INF_KF_STORMS_GROTTO_GRASS_3 }, + { RC_KF_STORMS_GROTTO_GRASS_4, RAND_INF_KF_STORMS_GROTTO_GRASS_4 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4 }, + { RC_HF_OPEN_GROTTO_GRASS_1, RAND_INF_HF_OPEN_GROTTO_GRASS_1 }, + { RC_HF_OPEN_GROTTO_GRASS_2, RAND_INF_HF_OPEN_GROTTO_GRASS_2 }, + { RC_HF_OPEN_GROTTO_GRASS_3, RAND_INF_HF_OPEN_GROTTO_GRASS_3 }, + { RC_HF_OPEN_GROTTO_GRASS_4, RAND_INF_HF_OPEN_GROTTO_GRASS_4 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_1, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_2, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_3, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_4, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4 }, + { RC_HF_COW_GROTTO_GRASS_1, RAND_INF_HF_COW_GROTTO_GRASS_1 }, + { RC_HF_COW_GROTTO_GRASS_2, RAND_INF_HF_COW_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_1, RAND_INF_KAK_OPEN_GROTTO_GRASS_1 }, + { RC_KAK_OPEN_GROTTO_GRASS_2, RAND_INF_KAK_OPEN_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_3, RAND_INF_KAK_OPEN_GROTTO_GRASS_3 }, + { RC_KAK_OPEN_GROTTO_GRASS_4, RAND_INF_KAK_OPEN_GROTTO_GRASS_4 }, + { RC_DMT_STORMS_GROTTO_GRASS_1, RAND_INF_DMT_STORMS_GROTTO_GRASS_1 }, + { RC_DMT_STORMS_GROTTO_GRASS_2, RAND_INF_DMT_STORMS_GROTTO_GRASS_2 }, + { RC_DMT_STORMS_GROTTO_GRASS_3, RAND_INF_DMT_STORMS_GROTTO_GRASS_3 }, + { RC_DMT_STORMS_GROTTO_GRASS_4, RAND_INF_DMT_STORMS_GROTTO_GRASS_4 }, + { RC_DMT_COW_GROTTO_GRASS_1, RAND_INF_DMT_COW_GROTTO_GRASS_1 }, + { RC_DMT_COW_GROTTO_GRASS_2, RAND_INF_DMT_COW_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_1, RAND_INF_DMC_UPPER_GROTTO_GRASS_1 }, + { RC_DMC_UPPER_GROTTO_GRASS_2, RAND_INF_DMC_UPPER_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_3, RAND_INF_DMC_UPPER_GROTTO_GRASS_3 }, + { RC_DMC_UPPER_GROTTO_GRASS_4, RAND_INF_DMC_UPPER_GROTTO_GRASS_4 }, + { RC_ZR_OPEN_GROTTO_GRASS_1, RAND_INF_ZR_OPEN_GROTTO_GRASS_1 }, + { RC_ZR_OPEN_GROTTO_GRASS_2, RAND_INF_ZR_OPEN_GROTTO_GRASS_2 }, + { RC_ZR_OPEN_GROTTO_GRASS_3, RAND_INF_ZR_OPEN_GROTTO_GRASS_3 }, + { RC_ZR_OPEN_GROTTO_GRASS_4, RAND_INF_ZR_OPEN_GROTTO_GRASS_4 }, + // Dungeon Grass + { RC_DEKU_TREE_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS }, + { RC_DODONGOS_CAVERN_BLADE_GRASS, RAND_INF_DODONGOS_CAVERN_BLADE_GRASS }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS }, + { RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3 }, + // MQ Dungeon Grass + { RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS }, + { RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3 }, + { RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4 }, + // Shared Dungeon Grass + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8 }, + // End Grass { RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT }, { RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 }, @@ -1836,6 +2186,68 @@ FishIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) { return fishIdentity; } +GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge) { + struct GrassIdentity grassIdentity; + + grassIdentity.randomizerInf = RAND_INF_MAX; + grassIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + if (sceneNum == SCENE_GROTTOS) { + respawnData = TWO_ACTOR_PARAMS(posX, respawnData); + } else { + // We'll just pretend it's always daytime for our market bushes. + if (sceneNum == SCENE_MARKET_NIGHT) { + sceneNum = SCENE_MARKET_DAY; + + /* + The two bushes by the tree are not in the same spot + between night and day. We'll assume the coordinates + of the daytime bushes so that we can count them as + the same locations. + */ + if (posX == -74) { + posX = -106; + posZ = 277; + } + if (posX == -87) { + posX = -131; + posZ = 225; + } + } + + /* + Same as with Market. ZR has a bush slightly off pos + between Child and Adult. This is to merge them into + a single location. + */ + if (sceneNum == SCENE_ZORAS_RIVER) { + if (posX == 233) { + posX = 231; + posZ = -1478; + } + } + + // The two bushes behind the sign in KF should be separate + // locations between Child and Adult. + if (sceneNum == SCENE_KOKIRI_FOREST && linkAge == 0) { + if (posX == -498 || posX == -523) { + posZ = 0xFF; + } + } + + respawnData = TWO_ACTOR_PARAMS(posX, posZ); + } + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_KUSA, sceneNum, respawnData); + + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + grassIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + grassIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return grassIdentity; +} + u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 76bde6a4f..13718dac4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -54,6 +54,7 @@ class Randomizer { CowIdentity IdentifyCow(s32 sceneNum, s32 posX, s32 posZ); PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ); FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams); + GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true); ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2c97c50c0..9851f614b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -294,6 +294,7 @@ typedef enum { RCTYPE_FISH, // Fishes RCTYPE_FREESTANDING, // Freestanding rupees and hearts RCTYPE_FAIRY, // Fairies + RCTYPE_GRASS, // Grass } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -2848,6 +2849,358 @@ typedef enum { RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + + // Overworld Grass + RC_KF_CHILD_GRASS_1, + RC_KF_CHILD_GRASS_2, + RC_KF_CHILD_GRASS_3, + RC_KF_CHILD_GRASS_4, + RC_KF_CHILD_GRASS_5, + RC_KF_CHILD_GRASS_6, + RC_KF_CHILD_GRASS_7, + RC_KF_CHILD_GRASS_8, + RC_KF_CHILD_GRASS_9, + RC_KF_CHILD_GRASS_10, + RC_KF_CHILD_GRASS_11, + RC_KF_CHILD_GRASS_12, + RC_KF_CHILD_GRASS_MAZE_1, + RC_KF_CHILD_GRASS_MAZE_2, + RC_KF_CHILD_GRASS_MAZE_3, + RC_KF_ADULT_GRASS_1, + RC_KF_ADULT_GRASS_2, + RC_KF_ADULT_GRASS_3, + RC_KF_ADULT_GRASS_4, + RC_KF_ADULT_GRASS_5, + RC_KF_ADULT_GRASS_6, + RC_KF_ADULT_GRASS_7, + RC_KF_ADULT_GRASS_8, + RC_KF_ADULT_GRASS_9, + RC_KF_ADULT_GRASS_10, + RC_KF_ADULT_GRASS_11, + RC_KF_ADULT_GRASS_12, + RC_KF_ADULT_GRASS_13, + RC_KF_ADULT_GRASS_14, + RC_KF_ADULT_GRASS_15, + RC_KF_ADULT_GRASS_16, + RC_KF_ADULT_GRASS_17, + RC_KF_ADULT_GRASS_18, + RC_KF_ADULT_GRASS_19, + RC_KF_ADULT_GRASS_20, + RC_LW_GRASS_1, + RC_LW_GRASS_2, + RC_LW_GRASS_3, + RC_LW_GRASS_4, + RC_LW_GRASS_5, + RC_LW_GRASS_6, + RC_LW_GRASS_7, + RC_LW_GRASS_8, + RC_LW_GRASS_9, + RC_MARKET_GRASS_1, + RC_MARKET_GRASS_2, + RC_MARKET_GRASS_3, + RC_MARKET_GRASS_4, + RC_MARKET_GRASS_5, + RC_MARKET_GRASS_6, + RC_MARKET_GRASS_7, + RC_MARKET_GRASS_8, + RC_HC_GRASS_1, + RC_HC_GRASS_2, + RC_KAK_GRASS_1, + RC_KAK_GRASS_2, + RC_KAK_GRASS_3, + RC_KAK_GRASS_4, + RC_KAK_GRASS_5, + RC_KAK_GRASS_6, + RC_KAK_GRASS_7, + RC_KAK_GRASS_8, + RC_GY_GRASS_1, + RC_GY_GRASS_2, + RC_GY_GRASS_3, + RC_GY_GRASS_4, + RC_GY_GRASS_5, + RC_GY_GRASS_6, + RC_GY_GRASS_7, + RC_GY_GRASS_8, + RC_GY_GRASS_9, + RC_GY_GRASS_10, + RC_GY_GRASS_11, + RC_GY_GRASS_12, + RC_LH_GRASS_1, + RC_LH_GRASS_2, + RC_LH_GRASS_3, + RC_LH_GRASS_4, + RC_LH_GRASS_5, + RC_LH_GRASS_6, + RC_LH_GRASS_7, + RC_LH_GRASS_8, + RC_LH_GRASS_9, + RC_LH_GRASS_10, + RC_LH_GRASS_11, + RC_LH_GRASS_12, + RC_LH_GRASS_13, + RC_LH_GRASS_14, + RC_LH_GRASS_15, + RC_LH_GRASS_16, + RC_LH_GRASS_17, + RC_LH_GRASS_18, + RC_LH_GRASS_19, + RC_LH_GRASS_20, + RC_LH_GRASS_21, + RC_LH_GRASS_22, + RC_LH_GRASS_23, + RC_LH_GRASS_24, + RC_LH_GRASS_25, + RC_LH_GRASS_26, + RC_LH_GRASS_27, + RC_LH_GRASS_28, + RC_LH_GRASS_29, + RC_LH_GRASS_30, + RC_LH_GRASS_31, + RC_LH_GRASS_32, + RC_LH_GRASS_33, + RC_LH_GRASS_34, + RC_LH_GRASS_35, + RC_LH_GRASS_36, + RC_LH_CHILD_GRASS_1, + RC_LH_CHILD_GRASS_2, + RC_LH_CHILD_GRASS_3, + RC_LH_CHILD_GRASS_4, + RC_LH_WARP_PAD_GRASS_1, + RC_LH_WARP_PAD_GRASS_2, + RC_HF_NEAR_KF_GRASS_1, + RC_HF_NEAR_KF_GRASS_2, + RC_HF_NEAR_KF_GRASS_3, + RC_HF_NEAR_KF_GRASS_4, + RC_HF_NEAR_KF_GRASS_5, + RC_HF_NEAR_KF_GRASS_6, + RC_HF_NEAR_KF_GRASS_7, + RC_HF_NEAR_KF_GRASS_8, + RC_HF_NEAR_KF_GRASS_9, + RC_HF_NEAR_KF_GRASS_10, + RC_HF_NEAR_KF_GRASS_11, + RC_HF_NEAR_KF_GRASS_12, + RC_HF_NEAR_MARKET_GRASS_1, + RC_HF_NEAR_MARKET_GRASS_2, + RC_HF_NEAR_MARKET_GRASS_3, + RC_HF_NEAR_MARKET_GRASS_4, + RC_HF_NEAR_MARKET_GRASS_5, + RC_HF_NEAR_MARKET_GRASS_6, + RC_HF_NEAR_MARKET_GRASS_7, + RC_HF_NEAR_MARKET_GRASS_8, + RC_HF_NEAR_MARKET_GRASS_9, + RC_HF_NEAR_MARKET_GRASS_10, + RC_HF_NEAR_MARKET_GRASS_11, + RC_HF_NEAR_MARKET_GRASS_12, + RC_HF_SOUTH_GRASS_1, + RC_HF_SOUTH_GRASS_2, + RC_HF_SOUTH_GRASS_3, + RC_HF_SOUTH_GRASS_4, + RC_HF_SOUTH_GRASS_5, + RC_HF_SOUTH_GRASS_6, + RC_HF_SOUTH_GRASS_7, + RC_HF_SOUTH_GRASS_8, + RC_HF_SOUTH_GRASS_9, + RC_HF_SOUTH_GRASS_10, + RC_HF_SOUTH_GRASS_11, + RC_HF_SOUTH_GRASS_12, + RC_HF_CENTRAL_GRASS_1, + RC_HF_CENTRAL_GRASS_2, + RC_HF_CENTRAL_GRASS_3, + RC_HF_CENTRAL_GRASS_4, + RC_HF_CENTRAL_GRASS_5, + RC_HF_CENTRAL_GRASS_6, + RC_HF_CENTRAL_GRASS_7, + RC_HF_CENTRAL_GRASS_8, + RC_HF_CENTRAL_GRASS_9, + RC_HF_CENTRAL_GRASS_10, + RC_HF_CENTRAL_GRASS_11, + RC_HF_CENTRAL_GRASS_12, + RC_ZR_GRASS_1, + RC_ZR_GRASS_2, + RC_ZR_GRASS_3, + RC_ZR_GRASS_4, + RC_ZR_GRASS_5, + RC_ZR_GRASS_6, + RC_ZR_GRASS_7, + RC_ZR_GRASS_8, + RC_ZR_GRASS_9, + RC_ZR_GRASS_10, + RC_ZR_GRASS_11, + RC_ZR_GRASS_12, + RC_ZR_NEAR_FREESTANDING_POH_GRASS, + // Grotto Grass + RC_KF_STORMS_GROTTO_GRASS_1, + RC_KF_STORMS_GROTTO_GRASS_2, + RC_KF_STORMS_GROTTO_GRASS_3, + RC_KF_STORMS_GROTTO_GRASS_4, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, + RC_HF_NEAR_MARKET_GROTTO_GRASS_1, + RC_HF_NEAR_MARKET_GROTTO_GRASS_2, + RC_HF_NEAR_MARKET_GROTTO_GRASS_3, + RC_HF_NEAR_MARKET_GROTTO_GRASS_4, + RC_HF_OPEN_GROTTO_GRASS_1, + RC_HF_OPEN_GROTTO_GRASS_2, + RC_HF_OPEN_GROTTO_GRASS_3, + RC_HF_OPEN_GROTTO_GRASS_4, + RC_HF_SOUTHEAST_GROTTO_GRASS_1, + RC_HF_SOUTHEAST_GROTTO_GRASS_2, + RC_HF_SOUTHEAST_GROTTO_GRASS_3, + RC_HF_SOUTHEAST_GROTTO_GRASS_4, + RC_HF_COW_GROTTO_GRASS_1, + RC_HF_COW_GROTTO_GRASS_2, + RC_KAK_OPEN_GROTTO_GRASS_1, + RC_KAK_OPEN_GROTTO_GRASS_2, + RC_KAK_OPEN_GROTTO_GRASS_3, + RC_KAK_OPEN_GROTTO_GRASS_4, + RC_DMT_STORMS_GROTTO_GRASS_1, + RC_DMT_STORMS_GROTTO_GRASS_2, + RC_DMT_STORMS_GROTTO_GRASS_3, + RC_DMT_STORMS_GROTTO_GRASS_4, + RC_DMT_COW_GROTTO_GRASS_1, + RC_DMT_COW_GROTTO_GRASS_2, + RC_DMC_UPPER_GROTTO_GRASS_1, + RC_DMC_UPPER_GROTTO_GRASS_2, + RC_DMC_UPPER_GROTTO_GRASS_3, + RC_DMC_UPPER_GROTTO_GRASS_4, + RC_ZR_OPEN_GROTTO_GRASS_1, + RC_ZR_OPEN_GROTTO_GRASS_2, + RC_ZR_OPEN_GROTTO_GRASS_3, + RC_ZR_OPEN_GROTTO_GRASS_4, + // Dungeon Grass + RC_DEKU_TREE_LOBBY_GRASS_1, + RC_DEKU_TREE_LOBBY_GRASS_2, + RC_DEKU_TREE_LOBBY_GRASS_3, + RC_DEKU_TREE_LOBBY_GRASS_4, + RC_DEKU_TREE_LOBBY_GRASS_5, + RC_DEKU_TREE_SLINGSHOT_GRASS_1, + RC_DEKU_TREE_SLINGSHOT_GRASS_2, + RC_DEKU_TREE_SLINGSHOT_GRASS_3, + RC_DEKU_TREE_SLINGSHOT_GRASS_4, + RC_DEKU_TREE_COMPASS_GRASS_1, + RC_DEKU_TREE_COMPASS_GRASS_2, + RC_DEKU_TREE_BASEMENT_GRASS_1, + RC_DEKU_TREE_BASEMENT_GRASS_2, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, + RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, + RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, + RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, + RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, + RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, + RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, + RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, + RC_DODONGOS_CAVERN_BLADE_GRASS, + RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, + RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, + // MQ Dungeon Grass + RC_DEKU_TREE_MQ_LOBBY_GRASS_1, + RC_DEKU_TREE_MQ_LOBBY_GRASS_2, + RC_DEKU_TREE_MQ_LOBBY_GRASS_3, + RC_DEKU_TREE_MQ_LOBBY_GRASS_4, + RC_DEKU_TREE_MQ_LOBBY_GRASS_5, + RC_DEKU_TREE_MQ_LOBBY_GRASS_6, + RC_DEKU_TREE_MQ_LOBBY_GRASS_7, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, + RC_DEKU_TREE_MQ_COMPASS_GRASS_1, + RC_DEKU_TREE_MQ_COMPASS_GRASS_2, + RC_DEKU_TREE_MQ_COMPASS_GRASS_3, + RC_DEKU_TREE_MQ_COMPASS_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, + RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, + RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, + RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, + RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, + RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, + RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, + RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, + // Shared Dungeon Grass + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, + // End Grass + RC_MAX } RandomizerCheck; @@ -4931,8 +5284,23 @@ typedef enum { RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + // GRASS + RHT_KF_GRASS, + RHT_LW_GRASS, + RHT_MARKET_GRASS, + RHT_HC_GRASS, + RHT_KAK_GRASS, + RHT_GY_GRASS, + RHT_LH_GRASS, + RHT_HF_GRASS, + RHT_ZR_GRASS, + RHT_GROTTO_GRASS, + RHT_DEKU_TREE_GRASS, + RHT_DODONGOS_CAVERN_GRASS, + RHT_BOTTOM_OF_THE_WELL_GRASS, + RHT_JABU_JABUS_BELLY_GRASS, // MAX - RHT_MAX + RHT_MAX, } RandomizerHintTextKey; @@ -5223,6 +5591,7 @@ typedef enum { RSK_SHUFFLE_FREESTANDING, RSK_SHUFFLE_FAIRIES, RSK_LOCK_OVERWORLD_DOORS, + RSK_SHUFFLE_GRASS, RSK_MAX } RandomizerSettingKey; @@ -5569,6 +5938,14 @@ typedef enum { RO_SHUFFLE_POTS_ALL, } RandoOptionShufflePots; +// Shuffle Grass settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_GRASS_OFF, + RO_SHUFFLE_GRASS_DUNGEONS, + RO_SHUFFLE_GRASS_OVERWORLD, + RO_SHUFFLE_GRASS_ALL, +} RandoOptionShuffleGrass; + //Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, @@ -5664,6 +6041,11 @@ typedef struct FishIdentity { RandomizerCheck randomizerCheck; } FishIdentity; +typedef struct GrassIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} GrassIdentity; + typedef enum { TRACKER_WINDOW_FLOATING, TRACKER_WINDOW_WINDOW, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index b8d435fd8..9333913a4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -172,6 +172,7 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRCType() != RCTYPE_BEEHIVE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index aa6b8b608..7d531cb24 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -59,6 +59,8 @@ bool showWeirdEgg; bool showGerudoCard; bool showOverworldPots; bool showDungeonPots; +bool showOverworldGrass; +bool showDungeonGrass; bool showFrogSongRupees; bool showFairies; bool showStartingMapsCompasses; @@ -1269,11 +1271,32 @@ void LoadSettings() { showDungeonPots = false; break; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GRASS)) { + case RO_SHUFFLE_GRASS_ALL: + showOverworldGrass = true; + showDungeonGrass = true; + break; + case RO_SHUFFLE_GRASS_OVERWORLD: + showOverworldGrass = true; + showDungeonGrass = false; + break; + case RO_SHUFFLE_GRASS_DUNGEONS: + showOverworldGrass = false; + showDungeonGrass = true; + break; + default: + showOverworldGrass = false; + showDungeonGrass = false; + break; + } } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; showOverworldPots = false; showDungeonPots = false; + showOverworldGrass = false; + showDungeonGrass = false; } fortressFast = false; @@ -1354,6 +1377,9 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_POT || (showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_GRASS || + (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_COW || showCows) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 8c4d05a4f..f061be660 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1349,6 +1349,357 @@ typedef enum { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, + + // Overworld Grass + RAND_INF_KF_CHILD_GRASS_1, + RAND_INF_KF_CHILD_GRASS_2, + RAND_INF_KF_CHILD_GRASS_3, + RAND_INF_KF_CHILD_GRASS_4, + RAND_INF_KF_CHILD_GRASS_5, + RAND_INF_KF_CHILD_GRASS_6, + RAND_INF_KF_CHILD_GRASS_7, + RAND_INF_KF_CHILD_GRASS_8, + RAND_INF_KF_CHILD_GRASS_9, + RAND_INF_KF_CHILD_GRASS_10, + RAND_INF_KF_CHILD_GRASS_11, + RAND_INF_KF_CHILD_GRASS_12, + RAND_INF_KF_CHILD_GRASS_MAZE_1, + RAND_INF_KF_CHILD_GRASS_MAZE_2, + RAND_INF_KF_CHILD_GRASS_MAZE_3, + RAND_INF_KF_ADULT_GRASS_1, + RAND_INF_KF_ADULT_GRASS_2, + RAND_INF_KF_ADULT_GRASS_3, + RAND_INF_KF_ADULT_GRASS_4, + RAND_INF_KF_ADULT_GRASS_5, + RAND_INF_KF_ADULT_GRASS_6, + RAND_INF_KF_ADULT_GRASS_7, + RAND_INF_KF_ADULT_GRASS_8, + RAND_INF_KF_ADULT_GRASS_9, + RAND_INF_KF_ADULT_GRASS_10, + RAND_INF_KF_ADULT_GRASS_11, + RAND_INF_KF_ADULT_GRASS_12, + RAND_INF_KF_ADULT_GRASS_13, + RAND_INF_KF_ADULT_GRASS_14, + RAND_INF_KF_ADULT_GRASS_15, + RAND_INF_KF_ADULT_GRASS_16, + RAND_INF_KF_ADULT_GRASS_17, + RAND_INF_KF_ADULT_GRASS_18, + RAND_INF_KF_ADULT_GRASS_19, + RAND_INF_KF_ADULT_GRASS_20, + RAND_INF_LW_GRASS_1, + RAND_INF_LW_GRASS_2, + RAND_INF_LW_GRASS_3, + RAND_INF_LW_GRASS_4, + RAND_INF_LW_GRASS_5, + RAND_INF_LW_GRASS_6, + RAND_INF_LW_GRASS_7, + RAND_INF_LW_GRASS_8, + RAND_INF_LW_GRASS_9, + RAND_INF_MARKET_GRASS_1, + RAND_INF_MARKET_GRASS_2, + RAND_INF_MARKET_GRASS_3, + RAND_INF_MARKET_GRASS_4, + RAND_INF_MARKET_GRASS_5, + RAND_INF_MARKET_GRASS_6, + RAND_INF_MARKET_GRASS_7, + RAND_INF_MARKET_GRASS_8, + RAND_INF_HC_GRASS_1, + RAND_INF_HC_GRASS_2, + RAND_INF_KAK_GRASS_1, + RAND_INF_KAK_GRASS_2, + RAND_INF_KAK_GRASS_3, + RAND_INF_KAK_GRASS_4, + RAND_INF_KAK_GRASS_5, + RAND_INF_KAK_GRASS_6, + RAND_INF_KAK_GRASS_7, + RAND_INF_KAK_GRASS_8, + RAND_INF_GY_GRASS_1, + RAND_INF_GY_GRASS_2, + RAND_INF_GY_GRASS_3, + RAND_INF_GY_GRASS_4, + RAND_INF_GY_GRASS_5, + RAND_INF_GY_GRASS_6, + RAND_INF_GY_GRASS_7, + RAND_INF_GY_GRASS_8, + RAND_INF_GY_GRASS_9, + RAND_INF_GY_GRASS_10, + RAND_INF_GY_GRASS_11, + RAND_INF_GY_GRASS_12, + RAND_INF_LH_GRASS_1, + RAND_INF_LH_GRASS_2, + RAND_INF_LH_GRASS_3, + RAND_INF_LH_GRASS_4, + RAND_INF_LH_GRASS_5, + RAND_INF_LH_GRASS_6, + RAND_INF_LH_GRASS_7, + RAND_INF_LH_GRASS_8, + RAND_INF_LH_GRASS_9, + RAND_INF_LH_GRASS_10, + RAND_INF_LH_GRASS_11, + RAND_INF_LH_GRASS_12, + RAND_INF_LH_GRASS_13, + RAND_INF_LH_GRASS_14, + RAND_INF_LH_GRASS_15, + RAND_INF_LH_GRASS_16, + RAND_INF_LH_GRASS_17, + RAND_INF_LH_GRASS_18, + RAND_INF_LH_GRASS_19, + RAND_INF_LH_GRASS_20, + RAND_INF_LH_GRASS_21, + RAND_INF_LH_GRASS_22, + RAND_INF_LH_GRASS_23, + RAND_INF_LH_GRASS_24, + RAND_INF_LH_GRASS_25, + RAND_INF_LH_GRASS_26, + RAND_INF_LH_GRASS_27, + RAND_INF_LH_GRASS_28, + RAND_INF_LH_GRASS_29, + RAND_INF_LH_GRASS_30, + RAND_INF_LH_GRASS_31, + RAND_INF_LH_GRASS_32, + RAND_INF_LH_GRASS_33, + RAND_INF_LH_GRASS_34, + RAND_INF_LH_GRASS_35, + RAND_INF_LH_GRASS_36, + RAND_INF_LH_CHILD_GRASS_1, + RAND_INF_LH_CHILD_GRASS_2, + RAND_INF_LH_CHILD_GRASS_3, + RAND_INF_LH_CHILD_GRASS_4, + RAND_INF_LH_WARP_PAD_GRASS_1, + RAND_INF_LH_WARP_PAD_GRASS_2, + RAND_INF_HF_NEAR_KF_GRASS_1, + RAND_INF_HF_NEAR_KF_GRASS_2, + RAND_INF_HF_NEAR_KF_GRASS_3, + RAND_INF_HF_NEAR_KF_GRASS_4, + RAND_INF_HF_NEAR_KF_GRASS_5, + RAND_INF_HF_NEAR_KF_GRASS_6, + RAND_INF_HF_NEAR_KF_GRASS_7, + RAND_INF_HF_NEAR_KF_GRASS_8, + RAND_INF_HF_NEAR_KF_GRASS_9, + RAND_INF_HF_NEAR_KF_GRASS_10, + RAND_INF_HF_NEAR_KF_GRASS_11, + RAND_INF_HF_NEAR_KF_GRASS_12, + RAND_INF_HF_NEAR_MARKET_GRASS_1, + RAND_INF_HF_NEAR_MARKET_GRASS_2, + RAND_INF_HF_NEAR_MARKET_GRASS_3, + RAND_INF_HF_NEAR_MARKET_GRASS_4, + RAND_INF_HF_NEAR_MARKET_GRASS_5, + RAND_INF_HF_NEAR_MARKET_GRASS_6, + RAND_INF_HF_NEAR_MARKET_GRASS_7, + RAND_INF_HF_NEAR_MARKET_GRASS_8, + RAND_INF_HF_NEAR_MARKET_GRASS_9, + RAND_INF_HF_NEAR_MARKET_GRASS_10, + RAND_INF_HF_NEAR_MARKET_GRASS_11, + RAND_INF_HF_NEAR_MARKET_GRASS_12, + RAND_INF_HF_SOUTH_GRASS_1, + RAND_INF_HF_SOUTH_GRASS_2, + RAND_INF_HF_SOUTH_GRASS_3, + RAND_INF_HF_SOUTH_GRASS_4, + RAND_INF_HF_SOUTH_GRASS_5, + RAND_INF_HF_SOUTH_GRASS_6, + RAND_INF_HF_SOUTH_GRASS_7, + RAND_INF_HF_SOUTH_GRASS_8, + RAND_INF_HF_SOUTH_GRASS_9, + RAND_INF_HF_SOUTH_GRASS_10, + RAND_INF_HF_SOUTH_GRASS_11, + RAND_INF_HF_SOUTH_GRASS_12, + RAND_INF_HF_CENTRAL_GRASS_1, + RAND_INF_HF_CENTRAL_GRASS_2, + RAND_INF_HF_CENTRAL_GRASS_3, + RAND_INF_HF_CENTRAL_GRASS_4, + RAND_INF_HF_CENTRAL_GRASS_5, + RAND_INF_HF_CENTRAL_GRASS_6, + RAND_INF_HF_CENTRAL_GRASS_7, + RAND_INF_HF_CENTRAL_GRASS_8, + RAND_INF_HF_CENTRAL_GRASS_9, + RAND_INF_HF_CENTRAL_GRASS_10, + RAND_INF_HF_CENTRAL_GRASS_11, + RAND_INF_HF_CENTRAL_GRASS_12, + RAND_INF_ZR_GRASS_1, + RAND_INF_ZR_GRASS_2, + RAND_INF_ZR_GRASS_3, + RAND_INF_ZR_GRASS_4, + RAND_INF_ZR_GRASS_5, + RAND_INF_ZR_GRASS_6, + RAND_INF_ZR_GRASS_7, + RAND_INF_ZR_GRASS_8, + RAND_INF_ZR_GRASS_9, + RAND_INF_ZR_GRASS_10, + RAND_INF_ZR_GRASS_11, + RAND_INF_ZR_GRASS_12, + RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS, + // Grotto Grass + RAND_INF_KF_STORMS_GROTTO_GRASS_1, + RAND_INF_KF_STORMS_GROTTO_GRASS_2, + RAND_INF_KF_STORMS_GROTTO_GRASS_3, + RAND_INF_KF_STORMS_GROTTO_GRASS_4, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4, + RAND_INF_HF_OPEN_GROTTO_GRASS_1, + RAND_INF_HF_OPEN_GROTTO_GRASS_2, + RAND_INF_HF_OPEN_GROTTO_GRASS_3, + RAND_INF_HF_OPEN_GROTTO_GRASS_4, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4, + RAND_INF_HF_COW_GROTTO_GRASS_1, + RAND_INF_HF_COW_GROTTO_GRASS_2, + RAND_INF_KAK_OPEN_GROTTO_GRASS_1, + RAND_INF_KAK_OPEN_GROTTO_GRASS_2, + RAND_INF_KAK_OPEN_GROTTO_GRASS_3, + RAND_INF_KAK_OPEN_GROTTO_GRASS_4, + RAND_INF_DMT_STORMS_GROTTO_GRASS_1, + RAND_INF_DMT_STORMS_GROTTO_GRASS_2, + RAND_INF_DMT_STORMS_GROTTO_GRASS_3, + RAND_INF_DMT_STORMS_GROTTO_GRASS_4, + RAND_INF_DMT_COW_GROTTO_GRASS_1, + RAND_INF_DMT_COW_GROTTO_GRASS_2, + RAND_INF_DMC_UPPER_GROTTO_GRASS_1, + RAND_INF_DMC_UPPER_GROTTO_GRASS_2, + RAND_INF_DMC_UPPER_GROTTO_GRASS_3, + RAND_INF_DMC_UPPER_GROTTO_GRASS_4, + RAND_INF_ZR_OPEN_GROTTO_GRASS_1, + RAND_INF_ZR_OPEN_GROTTO_GRASS_2, + RAND_INF_ZR_OPEN_GROTTO_GRASS_3, + RAND_INF_ZR_OPEN_GROTTO_GRASS_4, + // Dungeon Grass + RAND_INF_DEKU_TREE_LOBBY_GRASS_1, + RAND_INF_DEKU_TREE_LOBBY_GRASS_2, + RAND_INF_DEKU_TREE_LOBBY_GRASS_3, + RAND_INF_DEKU_TREE_LOBBY_GRASS_4, + RAND_INF_DEKU_TREE_LOBBY_GRASS_5, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4, + RAND_INF_DEKU_TREE_COMPASS_GRASS_1, + RAND_INF_DEKU_TREE_COMPASS_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, + RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, + RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1, + RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2, + RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3, + RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, + RAND_INF_DODONGOS_CAVERN_BLADE_GRASS, + RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS, + RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, + // MQ Dungeon Grass + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, + RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, + RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS, + RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, + RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, + RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, + RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, + RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, + RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, + // Shared Dungeon Grass + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8, + // End Grass // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 39f367a1e..ba049b32c 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -209,6 +209,7 @@ void Settings::CreateOptions() { OPT_BOOL(RSK_SHUFFLE_WEIRD_EGG, "Shuffle Weird Egg", CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), mOptionDescriptions[RSK_SHUFFLE_WEIRD_EGG]); OPT_BOOL(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, "Shuffle Gerudo Membership Card", CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]); OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF); + OPT_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_OFF); OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); OPT_U8(RSK_SHUFFLE_MERCHANTS, "Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE); OPT_U8(RSK_MERCHANT_PRICES, "Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); @@ -677,6 +678,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_100_GS_REWARD], &mOptions[RSK_SHUFFLE_BOSS_SOULS], &mOptions[RSK_SHUFFLE_FAIRIES], + &mOptions[RSK_SHUFFLE_GRASS], }, WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index a456089a3..1ce04687c 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -51,6 +51,7 @@ class StaticData { static void RegisterFairyLocations(); static void RegisterPotLocations(); static void RegisterFreestandingLocations(); + static void RegisterGrassLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 49623c850..23146f376 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -10,6 +10,7 @@ #include "objects/gameplay_field_keep/gameplay_field_keep.h" #include "objects/object_kusa/object_kusa.h" #include "vt.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_THROW_ONLY) @@ -126,6 +127,10 @@ s32 EnKusa_SnapToFloor(EnKusa* this, PlayState* play, f32 yOffset) { void EnKusa_DropCollectible(EnKusa* this, PlayState* play) { s16 dropParams; + if (!GameInteractor_Should(VB_GRASS_DROP_ITEM, true, this)) { + return; + } + switch (this->actor.params & 3) { case ENKUSA_TYPE_0: case ENKUSA_TYPE_2: @@ -138,11 +143,9 @@ void EnKusa_DropCollectible(EnKusa* this, PlayState* play) { break; case ENKUSA_TYPE_1: if (CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) { - } - else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) { + } else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) { Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS); - } - else if (Rand_ZeroOne() < 0.5f) { + } else if (Rand_ZeroOne() < 0.5f) { Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS); } else { Item_DropCollectible(play, &this->actor.world.pos, ITEM00_HEART); @@ -193,8 +196,8 @@ void EnKusa_SpawnFragments(EnKusa* this, PlayState* play) { scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) & 7; - EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, - 80, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubStalkDL); + EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, 80, + KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubStalkDL); pos.x = this->actor.world.pos.x + (dir->x * this->actor.scale.x * 40.0f); pos.y = this->actor.world.pos.y + (dir->y * this->actor.scale.y * 40.0f) + 10.0f; @@ -206,8 +209,8 @@ void EnKusa_SpawnFragments(EnKusa* this, PlayState* play) { scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) % 7; - EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, - 80, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubTipDL); + EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, 80, + KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubTipDL); } } @@ -215,8 +218,9 @@ void EnKusa_SpawnBugs(EnKusa* this, PlayState* play) { s32 i; for (i = 0; i < 3; i++) { - Actor* bug = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x, - this->actor.world.pos.y, this->actor.world.pos.z, 0, Rand_ZeroOne() * 0xFFFF, 0, 1, true); + Actor* bug = + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x, this->actor.world.pos.y, + this->actor.world.pos.z, 0, Rand_ZeroOne() * 0xFFFF, 0, 1, true); if (bug == NULL) { break; @@ -288,6 +292,10 @@ void EnKusa_WaitObject(EnKusa* this, PlayState* play) { EnKusa_SetupMain(this); } + if (!GameInteractor_Should(VB_GRASS_SETUP_DRAW, true, this)) { + return; + } + this->actor.draw = EnKusa_Draw; this->actor.objBankIndex = this->objBankIndex; this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h index f1e9f24d7..6db50aa28 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h @@ -20,6 +20,7 @@ typedef struct EnKusa { /* 0x0150 */ ColliderCylinder collider; /* 0x019C */ s16 timer; /* 0x019E */ s8 objBankIndex; + /* */ GrassIdentity grassIdentity; } EnKusa; // size = 0x01A0 #endif From 540aad67156abd539986036e713cccd9c1f155b7 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 26 Mar 2025 14:40:03 -0400 Subject: [PATCH 07/12] Don't place GBK into the pool for Triforce Hunt (#5218) --- .../randomizer/3drando/item_pool.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index af52a6446..8a27f8106 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1286,14 +1286,16 @@ void GenerateItemPool() { AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { - ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_GANONS_CASTLE_BOSS_KEY); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA) { - ctx->PlaceItemInLocation(RC_TOT_LIGHT_ARROWS_CUTSCENE, RG_GANONS_CASTLE_BOSS_KEY); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { - ctx->PlaceItemInLocation(RC_GANONS_TOWER_BOSS_KEY_CHEST, RG_GANONS_CASTLE_BOSS_KEY); - } else { - AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); + if (!ctx->GetOption(RSK_TRIFORCE_HUNT)) { // Don't add GBK to the pool at all for Triforce Hunt. + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { + ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_GANONS_CASTLE_BOSS_KEY); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA) { + ctx->PlaceItemInLocation(RC_TOT_LIGHT_ARROWS_CUTSCENE, RG_GANONS_CASTLE_BOSS_KEY); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { + ctx->PlaceItemInLocation(RC_GANONS_TOWER_BOSS_KEY_CHEST, RG_GANONS_CASTLE_BOSS_KEY); + } else { + AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); + } } if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { From b2ba5a6481e1f296f430257884393c2c68ecee62 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 26 Mar 2025 19:59:43 +0100 Subject: [PATCH 08/12] Add clang format off to shuffle grass (#5219) --- soh/soh/Enhancements/randomizer/ShuffleGrass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index b14c816d7..37d407fb3 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -157,6 +157,7 @@ void RegisterShuffleGrass() { void Rando::StaticData::RegisterGrassLocations() { + // clang-format off // Overworld Grass // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1)); @@ -508,6 +509,7 @@ void Rando::StaticData::RegisterGrassLocations() { locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Deku Tree Queen Gohma Grass 7", "Deku Tree Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7)); locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Deku Tree Queen Gohma Grass 8", "Deku Tree Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)); // End Grass + // clang-format on } static RegisterShipInitFunc registerShuffleGrass(RegisterShuffleGrass, { "IS_RANDO" }); From f1a45cf2ecf8a87b03e3a209153fd7d779065d76 Mon Sep 17 00:00:00 2001 From: Archez Date: Wed, 26 Mar 2025 15:05:06 -0400 Subject: [PATCH 09/12] Fix Tektite texture body break parts for custom skeletons (#5214) * Fix Tektite body break parts for custom skeletons * explicit null check --- soh/src/overlays/actors/ovl_En_Part/z_en_part.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c index 0a91e0e88..02afa040e 100644 --- a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c +++ b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c @@ -299,11 +299,17 @@ void EnPart_Draw(Actor* thisx, PlayState* play) { gSPSegment(POLY_OPA_DISP++, 0x08, func_80ACEAC0(play->state.gfxCtx, 255, 255, 255, 180, 180, 180)); gSPSegment(POLY_OPA_DISP++, 0x09, func_80ACEAC0(play->state.gfxCtx, 225, 205, 115, 25, 20, 0)); gSPSegment(POLY_OPA_DISP++, 0x0A, func_80ACEAC0(play->state.gfxCtx, 225, 205, 115, 25, 20, 0)); - } else if ((thisx->params == 9) && (strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0)) { + // #region SOH [Port] DL references are stored as resource paths so we need to use string comparison to check + // for equality. Additionally, we added a fallback for checking the parent actor ID to account for mods the + // override the Tektite skelton + } else if ((thisx->params == 9) && ((strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0) || + (thisx->parent != NULL && thisx->parent->id == ACTOR_EN_TITE))) { gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001300); gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001700); gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_001900); - } else if ((thisx->params == 10) && (strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0)) { + } else if ((thisx->params == 10) && ((strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0) || + (thisx->parent != NULL && thisx->parent->id == ACTOR_EN_TITE))) { + // #endregion gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001B00); gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001F00); gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_002100); From 9ff49403a86c6c3b31dfc71a67e9f15d119459ed Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:07:54 -0400 Subject: [PATCH 10/12] shipinit (r)ba (#5025) * RBA and BA * move rba to shipinit * make the vanilla condition actually a vanilla condition * update should docs * move ba to shipinit * don't pass things * try a different readability strategy * remove option/preset entries --------- Co-authored-by: rozlette --- .../Enhancements/Presets/PresetEntries.cpp | 2 - .../Restorations/BottleAdventure.cpp | 452 ++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 17 + soh/soh/SohGui/SohMenuEnhancements.cpp | 3 - soh/src/code/z_parameter.c | 25 +- 5 files changed, 478 insertions(+), 21 deletions(-) create mode 100644 soh/soh/Enhancements/Restorations/BottleAdventure.cpp diff --git a/soh/soh/Enhancements/Presets/PresetEntries.cpp b/soh/soh/Enhancements/Presets/PresetEntries.cpp index 3b2167a2e..e09df2862 100644 --- a/soh/soh/Enhancements/Presets/PresetEntries.cpp +++ b/soh/soh/Enhancements/Presets/PresetEntries.cpp @@ -163,7 +163,6 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), // Difficulty @@ -297,7 +296,6 @@ const std::vector randomizerPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), // Difficulty diff --git a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp new file mode 100644 index 000000000..c581a325d --- /dev/null +++ b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp @@ -0,0 +1,452 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +} + +// gSaveContext.inventory.items +void HandleBAInventoryItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.items[itemOnCRight]; +} + +void HandleRBAInventoryItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.items[itemOnCRight] = itemToPutInBottle; +} + +// gSaveContext.inventory.ammo +void HandleBAInventoryAmmo() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY]; +} + +void HandleRBAInventoryAmmo(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY] = itemToPutInBottle; +} + +// gSaveContext.inventory.equipment +void HandleBAInventoryEquipment() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.equipment >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.equipment & 0xFF; + } +} + +void HandleRBAInventoryEquipment(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.inventory.equipment = (itemToPutInBottle << 8) | (gSaveContext.inventory.equipment & 0x00FF); + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.inventory.equipment = itemToPutInBottle | (gSaveContext.inventory.equipment & 0xFF00); + } +} + +// gSaveContext.inventory.upgrades +void HandleBAInventoryUpgrades() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.upgrades & 0xFF; + } +} + +void HandleRBAInventoryUpgrades(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 24) | (gSaveContext.inventory.upgrades & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 16) | (gSaveContext.inventory.upgrades & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 8) | (gSaveContext.inventory.upgrades & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.inventory.upgrades = itemToPutInBottle | (gSaveContext.inventory.upgrades & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.questItems +void HandleBAInventoryQuestItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.questItems & 0xFF; + } +} + +void HandleRBAInventoryQuestItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 24) | (gSaveContext.inventory.questItems & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 16) | (gSaveContext.inventory.questItems & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 8) | (gSaveContext.inventory.questItems & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.inventory.questItems = itemToPutInBottle | (gSaveContext.inventory.questItems & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.dungeonItems +void HandleBAInventoryDungeonItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION]; +} + +void HandleRBAInventoryDungeonItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION] = itemToPutInBottle; +} + +// gSaveContext.inventory.dungeonKeys +void HandleBAInventoryDungeonKeys() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40]; +} + +void HandleRBAInventoryDungeonKeys(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40] = itemToPutInBottle; +} + +// gSaveContext.inventory.defenseHearts +void HandleBAInventoryDefenseHearts() { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.defenseHearts; +} + +void HandleRBAInventoryDefenseHearts(uint8_t itemToPutInBottle) { + gSaveContext.inventory.defenseHearts = itemToPutInBottle; +} + +// gSaveContext.inventory.gsTokens +void HandleBAInventoryGSTokens() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.gsTokens >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.gsTokens & 0xFF; + } +} + +void HandleRBAInventoryGSTokens(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.inventory.gsTokens = (itemToPutInBottle << 8) | (gSaveContext.inventory.gsTokens & 0x00FF); + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.inventory.gsTokens = itemToPutInBottle | (gSaveContext.inventory.gsTokens & 0xFF00); + } +} + +// gSaveContext.sceneFlags +void HandleBASceneFlags() { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it pulls from + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 24) & 0xFF; + break; + case 1: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 16) & 0xFF; + break; + case 2: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 8) & 0xFF; + break; + case 3: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].chest & 0xFF; + break; + case 4: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 24) & 0xFF; + break; + case 5: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 16) & 0xFF; + break; + case 6: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 8) & 0xFF; + break; + case 7: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].swch & 0xFF; + break; + case 8: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 24) & 0xFF; + break; + case 9: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 16) & 0xFF; + break; + case 10: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 8) & 0xFF; + break; + case 11: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].clear & 0xFF; + break; + case 12: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 24) & 0xFF; + break; + case 13: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 16) & 0xFF; + break; + case 14: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 8) & 0xFF; + break; + case 15: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].collect & 0xFF; + break; + case 16: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 24) & 0xFF; + break; + case 17: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 16) & 0xFF; + break; + case 18: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 8) & 0xFF; + break; + case 19: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].unk & 0xFF; + break; + case 20: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 24) & 0xFF; + break; + case 21: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 16) & 0xFF; + break; + case 22: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 8) & 0xFF; + break; + case 23: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].rooms & 0xFF; + break; + case 24: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 24) & 0xFF; + break; + case 25: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 16) & 0xFF; + break; + case 26: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 8) & 0xFF; + break; + case 27: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].floors & 0xFF; + break; + } +} + +void HandleRBASceneFlags(uint8_t itemToPutInBottle) { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it sets + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].chest & 0x00FFFFFF); + break; + case 1: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].chest & 0xFF00FFFF); + break; + case 2: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].chest & 0xFFFF00FF); + break; + case 3: + gSaveContext.sceneFlags[scene].chest = itemToPutInBottle | (gSaveContext.sceneFlags[scene].chest & 0xFFFFFF00); + break; + case 4: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].swch & 0x00FFFFFF); + break; + case 5: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].swch & 0xFF00FFFF); + break; + case 6: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].swch & 0xFFFF00FF); + break; + case 7: + gSaveContext.sceneFlags[scene].swch = itemToPutInBottle | (gSaveContext.sceneFlags[scene].swch & 0xFFFFFF00); + break; + case 8: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].clear & 0x00FFFFFF); + break; + case 9: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].clear & 0xFF00FFFF); + break; + case 10: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].clear & 0xFFFF00FF); + break; + case 11: + gSaveContext.sceneFlags[scene].clear = itemToPutInBottle | (gSaveContext.sceneFlags[scene].clear & 0xFFFFFF00); + break; + case 12: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].collect & 0x00FFFFFF); + break; + case 13: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].collect & 0xFF00FFFF); + break; + case 14: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].collect & 0xFFFF00FF); + break; + case 15: + gSaveContext.sceneFlags[scene].collect = itemToPutInBottle | (gSaveContext.sceneFlags[scene].collect & 0xFFFFFF00); + break; + case 16: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].unk & 0x00FFFFFF); + break; + case 17: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].unk & 0xFF00FFFF); + break; + case 18: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].unk & 0xFFFF00FF); + break; + case 19: + gSaveContext.sceneFlags[scene].unk = itemToPutInBottle | (gSaveContext.sceneFlags[scene].unk & 0xFFFFFF00); + break; + case 20: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].rooms & 0x00FFFFFF); + break; + case 21: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].rooms & 0xFF00FFFF); + break; + case 22: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].rooms & 0xFFFF00FF); + break; + case 23: + gSaveContext.sceneFlags[scene].rooms = itemToPutInBottle | (gSaveContext.sceneFlags[scene].rooms & 0xFFFFFF00); + break; + case 24: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].floors & 0x00FFFFFF); + break; + case 25: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].floors & 0xFF00FFFF); + break; + case 26: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].floors & 0xFFFF00FF); + break; + case 27: + gSaveContext.sceneFlags[scene].floors = itemToPutInBottle | (gSaveContext.sceneFlags[scene].floors & 0xFFFFFF00); + break; + } +} + +// padding bytes +void HandleBAPaddingBytes() { + // Reading from padding bytes is not implemented + gSaveContext.equips.buttonItems[0] = 0; +} + +void HandleRBAPaddingBytes() { + // Writing to padding bytes is not implemented +} + +// Bottle Adventure +void DoBA() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleBAInventoryItems(); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleBAInventoryAmmo(); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleBAInventoryEquipment(); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleBAInventoryUpgrades(); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleBAInventoryQuestItems(); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleBAInventoryDungeonItems(); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleBAInventoryDungeonKeys(); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleBAInventoryDefenseHearts(); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleBAInventoryGSTokens(); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleBASceneFlags(); + } +} + +// Reverse Bottle Adventure +void DoRBA(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleRBAInventoryItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleRBAInventoryAmmo(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleRBAInventoryEquipment(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleRBAInventoryUpgrades(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleRBAInventoryQuestItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleRBAInventoryDungeonItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleRBAInventoryDungeonKeys(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleRBAInventoryDefenseHearts(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleRBAInventoryGSTokens(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleRBASceneFlags(itemToPutInBottle); + } +} + +void RegisterBottleAdventure() { + REGISTER_VB_SHOULD(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, { + // if we aren't dealing with the b button, early return + auto button = static_cast(va_arg(args, int32_t)); + if (button != 0) { + return; + } + + *should = false; + DoBA(); + }); + + REGISTER_VB_SHOULD(VB_UPDATE_BOTTLE_ITEM, { + // if we aren't dealing with a bottle on b, early return + auto buttonBottleIsOn = static_cast(va_arg(args, int32_t)); + if (buttonBottleIsOn != 0) { + return; + } + + *should = false; + + auto itemToPutInBottle = static_cast(va_arg(args, int32_t)); + DoRBA(itemToPutInBottle); + }); +} + +static RegisterShipInitFunc initFunc(RegisterBottleAdventure); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index b4990803f..5ce3c2ea0 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1634,6 +1634,14 @@ typedef enum { // - `*EnRu1` VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `s16`) + VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, + // #### `result` // ```c // true @@ -1908,6 +1916,15 @@ typedef enum { // - `*PauseContext` VB_TRANSITION_TO_SAVE_SCREEN_ON_DEATH, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `u8`) + // - `int32_t` (item - promoted from `u8`) + VB_UPDATE_BOTTLE_ITEM, + // #### `result` // ```c // INV_CONTENT(ITEM_ODD_MUSHROOM) == ITEM_EYEDROPS diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index c2f425898..fbb2a8378 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -999,9 +999,6 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("QuickBongoKill")) .Options(CheckboxOptions().Tooltip( "Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him.")); - AddWidget(path, "Original RBA Values", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RestoreRBAValues")) - .Options(CheckboxOptions().Tooltip("Restores the original outcomes when performing Reverse Bottle Adventure.")); AddWidget(path, "Early Eyeball Frog", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EarlyEyeballFrog")) .Options(CheckboxOptions().Tooltip( diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 8c93b8a57..bf0ba6a1c 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1517,8 +1517,10 @@ void Rando_Inventory_SwapAgeEquipment(void) { (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { - gSaveContext.equips.buttonItems[i] = - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + if (GameInteractor_Should(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, true, i)) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } } } @@ -1674,8 +1676,10 @@ void Inventory_SwapAgeEquipment(void) { ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); - gSaveContext.equips.buttonItems[i] = - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + if (GameInteractor_Should(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, true, i)) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } } } @@ -2703,13 +2707,6 @@ s32 Inventory_HasSpecificBottle(u8 bottleItem) { } } -void byteSwapInventory() { - gSaveContext.inventory.equipment = BE16SWAP(gSaveContext.inventory.equipment); - gSaveContext.inventory.upgrades = BE32SWAP(gSaveContext.inventory.upgrades); - gSaveContext.inventory.questItems = BE32SWAP(gSaveContext.inventory.questItems); - gSaveContext.inventory.gsTokens = BE16SWAP(gSaveContext.inventory.gsTokens); -} - void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { osSyncPrintf("item_no=%x, c_no=%x, Pt=%x Item_Register=%x\n", item, button, gSaveContext.equips.cButtonSlots[button - 1], @@ -2721,11 +2718,7 @@ void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { item = ITEM_MILK_HALF; } - if (CVarGetInteger(CVAR_ENHANCEMENT("RestoreRBAValues"),0)) { - byteSwapInventory(); - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; - byteSwapInventory(); - } else { + if (GameInteractor_Should(VB_UPDATE_BOTTLE_ITEM, true, button, item)) { gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; } From 47c653a0e539559dab449a81a6bf2c95e8280890 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:32:32 -0400 Subject: [PATCH 11/12] [Rando] Shuffle Crates (#5017) * location list + enums * add identity function * add new files + hook handlers + settings + crate struct * add dungeon struct + large crate locations * fix wasteland name + add overworld hints * add dungeon hints * add to item pool * opt desc + check tracker + overworld locs * add VB funcs + fix fire locs + dmc crate + shuffle crates not pots again * fix crate option def * fix gy crate area * add ow locs * context + more location_list * fix kak crate * add gv child crates + make exceptions for OOB GF crates + fix GF rht name * finish adding gv crates + align GF child crates + fix adult GF locs * fix VB draw + adjust color * begin logic * add child archery crate + overworld logic * deku + dc + rename dc locs * gtg + spirit * fire temple logic * start water temple + some renaming * finish water temple + renames * fix dmc crate * remove child GV + GF crates :( + simplify hints + french * fix dungeon hint + add french attempt * cleanup * smol crate loc list + enums * setup small crates * fix fire temple fairy hints * add logic * fix small crates + locs * align GF crates without moving * add child GV-GF crates for No Logic * convert to shipinit * whitespace * remove old comments * assets * proper cap * better comments on not-shuffled crates * update for context changes * update for rest of context changes * cleanup * fix shadow hint RHT * more cleanup * count to three * child gf logic * gv cow crate * loc list spacing * remove redundant small crates * remove left over vb funcs * split out location list * fix van spawns * move NL crates to new type * rm whitespace * more whitespacing * more more whitespace * update VB * restore support for custom models * prep dungeon for develop * update context for location changes * finish context post-develop merge * add heart crates to CSMC * update loc list + logic fix * update breakroom crates to adult only * newline to make github happy * revise vbshoulds * formatting sheesh * update vb info * BRACKET * whitespacent * ws finalfinal --- .../objects/object_kibako/bosskey_crate_top | Bin 0 -> 8284 bytes .../object_kibako/gSmallBossKeyCrateDL | 14 + .../object_kibako/gSmallBossKeyCrateDL_tri_0 | 11 + .../object_kibako/gSmallBossKeyCrateDL_vtx_0 | 26 + .../gSmallBossKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallHeartCrateDL | 14 + .../object_kibako/gSmallHeartCrateDL_tri_0 | 11 + .../object_kibako/gSmallHeartCrateDL_vtx_0 | 26 + .../object_kibako/gSmallHeartCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallJunkCrateDL | 14 + .../object_kibako/gSmallJunkCrateDL_tri_0 | 11 + .../object_kibako/gSmallJunkCrateDL_vtx_0 | 26 + .../object_kibako/gSmallJunkCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallMajorCrateDL | 14 + .../object_kibako/gSmallMajorCrateDL_tri_0 | 11 + .../object_kibako/gSmallMajorCrateDL_vtx_0 | 26 + .../object_kibako/gSmallMajorCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallMinorCrateDL | 14 + .../object_kibako/gSmallMinorCrateDL_tri_0 | 11 + .../object_kibako/gSmallMinorCrateDL_vtx_0 | 26 + .../object_kibako/gSmallMinorCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallRandoCrateDL | 14 + .../object_kibako/gSmallRandoCrateDL_tri_0 | 11 + .../object_kibako/gSmallRandoCrateDL_vtx_0 | 26 + .../object_kibako/gSmallRandoCrateDL_vtx_cull | 10 + .../object_kibako/gSmallSmallKeyCrateDL | 14 + .../object_kibako/gSmallSmallKeyCrateDL_tri_0 | 11 + .../object_kibako/gSmallSmallKeyCrateDL_vtx_0 | 26 + .../gSmallSmallKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallTokenCrateDL | 14 + .../object_kibako/gSmallTokenCrateDL_tri_0 | 11 + .../object_kibako/gSmallTokenCrateDL_vtx_0 | 26 + .../object_kibako/gSmallTokenCrateDL_vtx_cull | 10 + .../objects/object_kibako/heart_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/junk_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/major_crate_top | Bin 0 -> 8284 bytes ...lBossKeyCrateDL_f3dlite_smallcrate_bosskey | 21 + ...SmallHeartCrateDL_f3dlite_smallcrate_heart | 21 + ..._gSmallJunkCrateDL_f3dlite_smallcrate_junk | 21 + ...SmallMajorCrateDL_f3dlite_smallcrate_major | 21 + ...SmallMinorCrateDL_f3dlite_smallcrate_minor | 21 + ...SmallRandoCrateDL_f3dlite_smallcrate_rando | 21 + ...mallKeyCrateDL_f3dlite_smallcrate_smallkey | 21 + ...SmallTokenCrateDL_f3dlite_smallcrate_token | 21 + .../objects/object_kibako/minor_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/rando_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/smallkey_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/token_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/bosskey_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/bosskey_crate_top | Bin 0 -> 8284 bytes .../object_kibako2/gLargeBossKeyCrateDL | 16 + .../object_kibako2/gLargeBossKeyCrateDL_tri_0 | 6 + .../object_kibako2/gLargeBossKeyCrateDL_tri_1 | 9 + .../object_kibako2/gLargeBossKeyCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeBossKeyCrateDL_vtx_1 | 18 + .../gLargeBossKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeHeartCrateDL | 16 + .../object_kibako2/gLargeHeartCrateDL_tri_0 | 6 + .../object_kibako2/gLargeHeartCrateDL_tri_1 | 9 + .../object_kibako2/gLargeHeartCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeHeartCrateDL_vtx_1 | 18 + .../gLargeHeartCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeJunkCrateDL | 16 + .../object_kibako2/gLargeJunkCrateDL_tri_0 | 6 + .../object_kibako2/gLargeJunkCrateDL_tri_1 | 9 + .../object_kibako2/gLargeJunkCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeJunkCrateDL_vtx_1 | 18 + .../object_kibako2/gLargeJunkCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeMajorCrateDL | 16 + .../object_kibako2/gLargeMajorCrateDL_tri_0 | 6 + .../object_kibako2/gLargeMajorCrateDL_tri_1 | 9 + .../object_kibako2/gLargeMajorCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeMajorCrateDL_vtx_1 | 18 + .../gLargeMajorCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeMinorCrateDL | 16 + .../object_kibako2/gLargeMinorCrateDL_tri_0 | 6 + .../object_kibako2/gLargeMinorCrateDL_tri_1 | 9 + .../object_kibako2/gLargeMinorCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeMinorCrateDL_vtx_1 | 18 + .../gLargeMinorCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeRandoCrateDL | 16 + .../object_kibako2/gLargeRandoCrateDL_tri_0 | 6 + .../object_kibako2/gLargeRandoCrateDL_tri_1 | 9 + .../object_kibako2/gLargeRandoCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeRandoCrateDL_vtx_1 | 18 + .../gLargeRandoCrateDL_vtx_cull | 10 + .../object_kibako2/gLargeSmallKeyCrateDL | 16 + .../gLargeSmallKeyCrateDL_tri_0 | 6 + .../gLargeSmallKeyCrateDL_tri_1 | 9 + .../gLargeSmallKeyCrateDL_vtx_0 | 6 + .../gLargeSmallKeyCrateDL_vtx_1 | 18 + .../gLargeSmallKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeTokenCrateDL | 16 + .../object_kibako2/gLargeTokenCrateDL_tri_0 | 6 + .../object_kibako2/gLargeTokenCrateDL_tri_1 | 9 + .../object_kibako2/gLargeTokenCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeTokenCrateDL_vtx_1 | 18 + .../gLargeTokenCrateDL_vtx_cull | 10 + .../objects/object_kibako2/heart_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/heart_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/junk_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/junk_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/major_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/major_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/mask_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/mask_crate_top | Bin 0 -> 8284 bytes ...eBossKeyCrateDL_f3dlite_crate_side_bosskey | 21 + ...geBossKeyCrateDL_f3dlite_crate_top_bosskey | 21 + ...LargeHeartCrateDL_f3dlite_crate_side_heart | 21 + ...gLargeHeartCrateDL_f3dlite_crate_top_heart | 21 + ..._gLargeJunkCrateDL_f3dlite_crate_side_junk | 21 + ...t_gLargeJunkCrateDL_f3dlite_crate_top_junk | 21 + ...LargeMajorCrateDL_f3dlite_crate_side_major | 21 + ...gLargeMajorCrateDL_f3dlite_crate_top_major | 21 + ...LargeMinorCrateDL_f3dlite_crate_side_minor | 21 + ...gLargeMinorCrateDL_f3dlite_crate_top_minor | 21 + ...LargeRandoCrateDL_f3dlite_crate_side_rando | 21 + ...gLargeRandoCrateDL_f3dlite_crate_top_rando | 21 + ...mallKeyCrateDL_f3dlite_crate_side_smallkey | 21 + ...SmallKeyCrateDL_f3dlite_crate_top_smallkey | 21 + ...LargeTokenCrateDL_f3dlite_crate_side_token | 21 + ...gLargeTokenCrateDL_f3dlite_crate_top_token | 21 + .../objects/object_kibako2/minor_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/minor_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/rando_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/rando_crate_top | Bin 0 -> 8284 bytes .../object_kibako2/smallkey_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/smallkey_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/token_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/token_crate_top | Bin 0 -> 8284 bytes soh/assets/soh_assets.h | 48 ++ .../vanilla-behavior/GIVanillaBehavior.h | 32 + .../hint_list/hint_list_exclude_dungeon.cpp | 37 +- .../hint_list/hint_list_exclude_overworld.cpp | 40 ++ .../randomizer/3drando/item_pool.cpp | 12 + .../Enhancements/randomizer/ShuffleCrates.cpp | 548 ++++++++++++++++++ .../Enhancements/randomizer/ShuffleCrates.h | 16 + soh/soh/Enhancements/randomizer/context.cpp | 15 +- soh/soh/Enhancements/randomizer/location.cpp | 24 + soh/soh/Enhancements/randomizer/location.h | 15 + .../location_access/dungeons/deku_tree.cpp | 3 + .../dungeons/dodongos_cavern.cpp | 50 +- .../location_access/dungeons/fire_temple.cpp | 59 +- .../dungeons/forest_temple.cpp | 9 +- .../dungeons/gerudo_training_ground.cpp | 6 +- .../dungeons/jabujabus_belly.cpp | 10 +- .../dungeons/shadow_temple.cpp | 10 +- .../dungeons/spirit_temple.cpp | 33 +- .../location_access/dungeons/water_temple.cpp | 186 +++++- .../location_access/gerudo_fortress.cpp | 36 ++ .../overworld/death_mountain_crater.cpp | 4 +- .../overworld/gerudo_valley.cpp | 8 +- .../location_access/overworld/goron_city.cpp | 2 + .../location_access/overworld/graveyard.cpp | 3 +- .../overworld/haunted_wasteland.cpp | 17 +- .../location_access/overworld/kakariko.cpp | 70 ++- .../location_access/overworld/lake_hylia.cpp | 3 +- .../overworld/lon_lon_ranch.cpp | 1 + .../location_access/overworld/market.cpp | 28 +- soh/soh/Enhancements/randomizer/logic.cpp | 8 + soh/soh/Enhancements/randomizer/logic.h | 2 + .../randomizer/option_descriptions.cpp | 10 + .../Enhancements/randomizer/randomizer.cpp | 311 ++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 2 + .../Enhancements/randomizer/randomizerTypes.h | 305 ++++++++++ .../randomizer/randomizer_check_objects.cpp | 3 + .../randomizer/randomizer_check_tracker.cpp | 34 ++ .../Enhancements/randomizer/randomizer_inf.h | 254 ++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 3 + soh/soh/Enhancements/randomizer/static_data.h | 1 + .../actors/ovl_Obj_Kibako/z_obj_kibako.c | 7 +- .../actors/ovl_Obj_Kibako/z_obj_kibako.h | 1 + .../actors/ovl_Obj_Kibako2/z_obj_kibako2.c | 7 +- .../actors/ovl_Obj_Kibako2/z_obj_kibako2.h | 1 + 174 files changed, 3667 insertions(+), 119 deletions(-) create mode 100644 soh/assets/custom/objects/object_kibako/bosskey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/heart_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/junk_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/major_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token create mode 100644 soh/assets/custom/objects/object_kibako/minor_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/rando_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/smallkey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/token_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/bosskey_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/bosskey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/heart_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/heart_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/junk_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/junk_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/major_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/major_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/mask_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/mask_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token create mode 100644 soh/assets/custom/objects/object_kibako2/minor_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/minor_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/rando_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/rando_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/smallkey_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/smallkey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/token_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/token_crate_top create mode 100644 soh/soh/Enhancements/randomizer/ShuffleCrates.cpp create mode 100644 soh/soh/Enhancements/randomizer/ShuffleCrates.h diff --git a/soh/assets/custom/objects/object_kibako/bosskey_crate_top b/soh/assets/custom/objects/object_kibako/bosskey_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..4b055671e4805a8800f673465022fcc70335858d GIT binary patch literal 8284 zcmd^EPiPxw7I*d%8xd+FmW?nWI|x%mSQdK^3%cyqCX{Fprk*vsWe{c=j46{+g58@A zyF?~*BVmFigwqHiJHlj>A%u45Nx4PFl**VA31ea-d z>ehJXFmo_nRmvQgHJPDu6JB-s&;WtNNok}`BU76-gA$_VN^=jv= zoSh@0+jkoHfCG*qeu%&|bzOO4lT*$bBrAszc#7G0F5j4gRVtb4>HG-)%zTc{95{{Z z$(0GGL1Z%#${+B`6@yhH)CH&R)bVS<#<$$-@0=YxjnFP}4pDH0ESM3_X>bM6RCOik zo~%r`Cz)zGt{Mn+79oZbV|IwC$XI0ocMZAL-9Gh5&V+l;BBJ1PEuDi=C;Zq8s_p#Z z$^<`lZn_Hm9yBmd`>Q@N513qoI3QdF2S|FS>){R8<;r|>hV0znGq(?k`_#)cBu-oT zrThftcN&yFZP9N?w0WR6kzXWJDTD*T1>#DQ>j8mJMKb;h?vR`qX;@X*bK$9h zQ4RNGnS4Ud{33LnwCvRW*oa|{?j%OQeS>nRt;zk=UTP0qfl_-@&`sI`2O34V(uPWo zAi2<(O}i*E^$zZAXmKuxJC$HgG#P4T`2>>Ar}h#tqcplRdTZ$1|2GZK1hhH~`h_m^ z-Rkg7ju`^sTgF9K9r0gRjts{0dr-&W8Z%gRb$BK*qGXtCyQJWE z4A120**9YtHzp(XiWxgf;6`{Do{=?7nID7yo0I!fV`=((g?Rc}=%= z#jR(0o_F-FootwOTqg_qee5bkcua+|C@heb4Lu)OtZ`|K9sl{R6s#o>F_7 zX$_N_XD!Gtt$+jKuOywinSh;k((wQv(U;oO{)ts`a^JD;J@>zC9e@rypHKtP7Hr-5 z-1FMYo@bA{#~q*2`ycrqwJM#*<(H^rv>tp!{9p8MWLc%D`@*(Xey73u>C|bfNPc7q z;+qNWQKsUV?~Chx&EIHMTZhoVV`BPV_s!9p&JBFNYA+N0=xwXw&jP>Nd9q>;zNE^Zh8PC$?Zq-@21x1jRE_w z(SAmW8l(^9<1I+<&w5#ZwpD?RH~bC%uV1f!U3rv!WP0!UmG))7%D4V(JK1zq`?LV^ z<{tb{YKsvQ-xm)M|4XuW6D=eEI+6SrcPIDJhcV9~n}MqNORdA!3qR|b-Uw;yi_P1c z=EirM7dEq-rAM(x*X}<9?cCq>V(nzXK~`t()Xa!_5BZ`0i@WeQ=|Mzx_#Qh-^n2)h z;lU>=KdTb*UC{57yUf9IzjpcFVL4m8R{XH|;q5Q}X$Eu~-?#r|-oAEo_2#piJ2!WV zv*mgk85a@E=oLz#*I@h&UnL4WU%Y^sNOvFfG%FY8{|Fy`q1|-mpwR5xXdBSKN^fpt zL9-k0HP#y6HTM3!w)yS7tCXJJS8TA4k_-&bnL_+X{GS8<488n1a-UPb4&6ik96HaO z#oYydMgAxGN4nvPWWagbemaTFRssHb@BG#^pkDy~1zKREw7CZx?Bd;pXUDDM>3O2k z@=_g87ZNe8Kf_l?QGt;C(SHLU5^MgEdW0vD|J^dOw4itq)}nWMpLUkJkNtIez@weJ zCa{&DiOuX*?9sQriO5ejCnP&!E;BcINbM(r`Zu~WH3o^G_iTwBEB)BjWw;L--&xaQ{PaPzpJ?Yu+D`$h_>ol-(peMr$+Hp#B5=#0Yj7!A`^x z+e3bEK>X{-$q_#5kJSF@D($D4V8uX&eb;^;I)DbYzSy`e_@#}~mPGxt!_HFP;ZA~H z6YOSSKgb``{0r?@X>0CofD2U719mU03a9vq5yYQ#|JBeZpF4>d1Qqbi2EhmCbBus{*2aFA7BSS*+zHR=`fz?Z?w8}0>EZgj_^NF ze9>S<@)$S(AxC)L)5)WE-6yI8csybreiv(PJWaJ;J2`p^vl+cs;$Ll8g8YcTi@U71 z8qw4e@!1DRM}V9h=wIuPW}X0<=*;Ive4?SeBsul*!> zPOV9&2QNe(W&K6|8C@0I^e7E�DB>zxP+<{Aca3>01sa@&#-EWS5 zMm9h;^t1kY*X#KH>%t-|){`0IVq?gsCkUB?sWGiTi4poGKFEx`vm$(U1o`bye&jzZ zSc$9H+NCHLPQCc*>14-;A7-g}`2AL)X(59JGq~qROlek;+2d&|F(UQPG!v9tZAtl& zhnbHj;QgqGijOR1Lena>c&c)c=_1DOgiZ1h^XI0{^7)3%>&CQSrRL7n+O_XjN-A?a)(> zXcOswcIkhHsqcEPm-h|3JS`yW}2o zuK?d?y*zXB!;`G(YHB~|KeGBeYp3#wH~vqxlv`(~!A>eT z?_kWJznre30wMoM{3G_oQ@{b_$1Z?98Sg^>8(t+oJ)*EpQe3$Lm+17Gqc`YAiC^;9 z+LzmxJ4>C<@{Z&PMl~qp!KsJ%Mx=kS0Ps16HOOAz%7OgApQHRDZ=eNa2NJnq&L}niYF<28Y`~qj z$d6tCvW56FMpp5O3Sxyqx57@v!s#y0MVwmq4eU=1%(m9MZ;yUPXMkNvp-G9Pr-<^W zHIRRq*F|=TK{-`hU>`vHNBW;J%uJP55dw$wBCg3is9Y4bkN?lmodmFOk1%2D)VouL>bQFb4@b+yPW+jM@?jJczWH>;6Tv=5E-ZT;i|OoS$rc4-YUR{28fS+FLcFDpZ$(K9@?M#FLq}n z`n*zTdpv_=gGAg=o76ecVP#Y-)o*G~_a9gn_QcKz=T$__9I#Kt2d5u+win=YpEQC| zsC?W->Dd-*i`Eo5?b}P8o(@LmeR5KWUpV*520O44Prc(xh-KKm|w8=ilzhL!~$&s~LhGR9oQdL@!#r^cNde}}ub z@O%@Ji9Vn;eUE*WoDcFBy$R6=#;> zUM=_X|2f`;vrS|bb~eG=1b6h|JATVZ^%?Oe{%=fuh#Bn^2~Q)BlQGenSh+Wtf4C-A zwNH6aJou(|zu`(i)s^(yOemi^TJO0o-{Km0y!bsiv9;q2`_6DB&JKFgFcxH{%tN>OA3n6F zatd^4j63m=2jyR$D-Xm#Z_CwrWfc}W48HM;D=O(Tjyp@_G2}^Wi|#{3bE?Ay<$&C9 zuE-3XqHamXl#%cr%&zcVh{SuWZp-)xSNQ#fFX{~CGr+>!U^aCSo)9qCqn3w#1Z#ng zr&h?lpveqD#hqwVye5zvJCWcn(uCSc^^5W7PgEwY++qDD7s3g$z0`kH9nl7T1Kg5- z;X0w~3;&_~(87RE$au-;qFbpVtSEZ+A-*OY$jXYV|I?L`z}IKQ#GVbSiHG$<=|y(c WAFh-OtATfp(+{78qk`|i*Z%`M1f4Vh literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL new file mode 100644 index 000000000..c42484ebe --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 new file mode 100644 index 000000000..96b7903de --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL new file mode 100644 index 000000000..1fd3a1f8b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 new file mode 100644 index 000000000..bbcb5c4c9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL new file mode 100644 index 000000000..e0d09ffa4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 new file mode 100644 index 000000000..a0af63d7f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL new file mode 100644 index 000000000..9999462e6 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 new file mode 100644 index 000000000..6eea14d8c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL new file mode 100644 index 000000000..8237aa0e7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 new file mode 100644 index 000000000..c1c8d6cfc --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL new file mode 100644 index 000000000..17467a73b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 new file mode 100644 index 000000000..6df8755b2 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL new file mode 100644 index 000000000..e3cc0ebe1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 new file mode 100644 index 000000000..692fd7ec3 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL new file mode 100644 index 000000000..dc73b6089 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 new file mode 100644 index 000000000..88a23f0e7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/heart_crate_top b/soh/assets/custom/objects/object_kibako/heart_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..f5b47bd092e88a063328f34c17caf883277ded00 GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey new file mode 100644 index 000000000..4996f1054 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart new file mode 100644 index 000000000..f1df8a15c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk new file mode 100644 index 000000000..85a1aef61 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major new file mode 100644 index 000000000..ea7b5edf0 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor new file mode 100644 index 000000000..7a6580630 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando new file mode 100644 index 000000000..e8ff9db18 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey new file mode 100644 index 000000000..593bf9e54 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token new file mode 100644 index 000000000..f58840a2b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/minor_crate_top b/soh/assets/custom/objects/object_kibako/minor_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..830d8ff65b34ca91e71ff42f60422a1981d32a4e GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/token_crate_top b/soh/assets/custom/objects/object_kibako/token_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..d4d5442860fb49fe962d1b4ee6ac461ac1aee1a8 GIT binary patch literal 8284 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 UekcppDD}WOM?7$hj8NqN0{SG^yZ`_I literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/bosskey_crate_side b/soh/assets/custom/objects/object_kibako2/bosskey_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..d5ec9241ab3b5603a02ad3cfb4f7f8f050df50a7 GIT binary patch literal 8284 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�DB>zxP+<{Aca3>01sa@&#-EWS5 zMm9h;^t1kY*X#KH>%t-|){`0IVq?gsCkUB?sWGiTi4poGKFEx`vm$(U1o`bye&jzZ zSc$9H+NCHLPQCc*>14-;A7-g}`2AL)X(59JGq~qROlek;+2d&|F(UQPG!v9tZAtl& zhnbHj;QgqGijOR1Lena>c&c)c=_1DOgiZ1h^XI0{^7)3%>&CQSrRL7n+O_XjN-A?a)(> zXcOswcIkhHsqcEPm-h|3JS`yW}2o zuK?d?y*zXB!;`G(YHB~|KeGBeYp3#wH~vqxlv`(~!A>eT z?_kWJznre30wMoM{3G_oQ@{b_$1Z?98Sg^>8(t+oJ)*EpQe3$Lm+17Gqc`YAiC^;9 z+LzmxJ4>C<@{Z&PMl~qp!KsJ%Mx=kS0Ps16HOOAz%7OgApQHRDZ=eNa2NJnq&L}niYF<28Y`~qj z$d6tCvW56FMpp5O3Sxyqx57@v!s#y0MVwmq4eU=1%(m9MZ;yUPXMkNvp-G9Pr-<^W zHIRRq*F|=TK{-`hU>`vHNBW;J%uJP55dw$wBCg3is9Y4bkN?lmodmFOk1%2D)VouL>bQFb4@b+yPW+jM@?jJczWH>;6Tv=5E-ZT;i|OoS$rc4-YUR{28fS+FLcFDpZ$(K9@?M#FLq}n z`n*zTdpv_=gGAg=o76ecVP#Y-)o*G~_a9gn_QcKz=T$__9I#Kt2d5u+win=YpEQC| zsC?W->Dd-*i`Eo5?b}P8o(@LmeR5KWUpV*520O44Prc(xh-KKm|w8=ilzhL!~$&s~LhGR9oQdL@!#r^cNde}}ub z@O%@Ji9Vn;eUE*WoDcFBy$R6=#;> zUM=_X|2f`;vrS|bb~eG=1b6h|JATVZ^%?Oe{%=fuh#Bn^2~Q)BlQGenSh+Wtf4C-A zwNH6aJou(|zu`(i)s^(yOemi^TJO0o-{Km0y!bsiv9;q2`_6DB&JKFgFcxH{%tN>OA3n6F zatd^4j63m=2jyR$D-Xm#Z_CwrWfc}W48HM;D=O(Tjyp@_G2}^Wi|#{3bE?Ay<$&C9 zuE-3XqHamXl#%cr%&zcVh{SuWZp-)xSNQ#fFX{~CGr+>!U^aCSo)9qCqn3w#1Z#ng zr&h?lpveqD#hqwVye5zvJCWcn(uCSc^^5W7PgEwY++qDD7s3g$z0`kH9nl7T1Kg5- z;X0w~3;&_~(87RE$au-;qFbpVtSEZ+A-*OY$jXYV|I?L`z}IKQ#GVbSiHG$<=|y(c WAFh-OtATfp(+{78qk`|i*Z%`M1f4Vh literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL new file mode 100644 index 000000000..c59674884 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 new file mode 100644 index 000000000..f43cacd88 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 new file mode 100644 index 000000000..d877460d4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL new file mode 100644 index 000000000..ce8bcb69f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 new file mode 100644 index 000000000..64c96a3a3 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 new file mode 100644 index 000000000..ee780d50d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL new file mode 100644 index 000000000..2d9c5974c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 new file mode 100644 index 000000000..a3a46e621 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 new file mode 100644 index 000000000..041d794d9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL new file mode 100644 index 000000000..190005d99 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 new file mode 100644 index 000000000..867e166d7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 new file mode 100644 index 000000000..5ab5bf39b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL new file mode 100644 index 000000000..d093960d5 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 new file mode 100644 index 000000000..9ab4cdf9a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 new file mode 100644 index 000000000..8a22d508b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL new file mode 100644 index 000000000..b1c1ffd1f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 new file mode 100644 index 000000000..3e87c23b1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 new file mode 100644 index 000000000..296988ca1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL new file mode 100644 index 000000000..c4d711d10 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 new file mode 100644 index 000000000..126e0bde7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 new file mode 100644 index 000000000..908b646bb --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL new file mode 100644 index 000000000..b1b1269b9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 new file mode 100644 index 000000000..c02cd056d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 new file mode 100644 index 000000000..dd2c07c52 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/heart_crate_side b/soh/assets/custom/objects/object_kibako2/heart_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..d0d916c0788346102dec8cc08b1a9e2713d9f82e GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/junk_crate_top b/soh/assets/custom/objects/object_kibako2/junk_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..ef303867ccfd03e50cc146013a7ebf0ff58bfd2b GIT binary patch literal 8284 zcma)>EpubZ6^1oID`qp9t)QTwP*P5XNFY^KK+0wj6cjW`)ym9bGP9td;J^e%EP`e+ zG~B-sKYsSD(^vLX?R5Fx{y2T!^WCjGy?&>~QJI2uaq$d}8Y3kG63H{>gaq;~2{PwtT4^LY5wcOo} zwLUl2GKZ+m_fuM@uY8C%j?y$z0yf< zbVZBxP`e`uo}SLfo9oNbY}o(l&u!~{>o(SyX=y(9-P6u@xwNB}ivGnz+Tb`iex_vg zoC-=>c7FZtB879yi+#iX;5h8lMzhhZO9h5&P-O%iEi2(5#aB->(2l)t#nJtf6Af<= zb>br;72&PpEwhhj9cE3lffSxiBICN8ku23(&UMK z$62qp7?aazHaLQR@c^Z<-Hq_|kU9uH+LIZ{0_!2!V6$#zbpEz_SVc-oat#X%j&MtL zB!4_L$l~vZfBjne>k;^rhFvYgy|krg_WH)oc&6+>ID%LiyWNwm_pi@yhvoOfe^=t8 z|Kvm+vKE1KOJ)49y1KQ`NT?*SIaW`ck}L2Y9Px5npTJ)a_oKt|u>8+h`{R8okcg?t z_^a(>d1#QWVk0&{^JriC5Bs1|Ev>}QZ=Nlj2&>&;Y0eIg;|&$~H|`&mkO(AUfX4IjIa#R1_v&^abdw zQSXVr(G1(8JLdoqPi5xzgN>&1(tkQvUuvmpyrG}PLEjN=83xo`d>VN5_~EV`@Jz!1<^nFK~jpKL7$d7 z^8IjF-oH}eLC4zGK+iAz7<{6f98`DePtE{Npt3&^XRhh#c%rp@D$iesgQ7<@wiiU6tn(uaOoXUN*0}*6foj=OfN^Aa-kGcO0j+4{P z69^z;`Lemacq18BG|(b3D@B|9K~kF z!9@!C$X5Q*>al9})cf{@6PWW?dGHL>!RJ>XbvgQj-^DaWc?Q2EXrm+g=Zy^fu2%oi z%yIC&b>}Y9wSQ};Xl4~=M1xBr01Mbx8doD(&L8nZf&SQDe4hT&B>z%NjV0qN+=xHx zins05c_Lm<7&+>SBrSd`8D|cD$NoHHfANjoL^Pb$(Fj+9WVn*#%z!dh56MviY_$L~T z=S06Fp3MC6agN?RagRlke|%WWD6IGsA8C~X|66@lyWn&FPv=;M8NI{PW{;>zV}H(_ z)CC5*fkeUGjK;iWEwKef(oD4GH8eKAgd= zJR$$3`ivj_Ma>gA>sW(_W)RWG$#eCqG` zBd*H>aPiK7&r1L6OK)khAX1_S@ofFY65Koe1yM-yDKvsQAM^_UCRwOxxp2$?c0bOnnjiVte)*(SEyU#5&$$75kI_ z;|=`O9_jogj}-n-K#OngB7qUr_KdXLWbs6N#M{2|cpnv??+PFq{ovofaz|v$*Z=zc zJvp(4?0Q*Ut+de_O~ehhu|SNV4|Y!M@cqI22WMf+o(V+IZ1xdeN9PKjPQqiyme+yM2ew zce_@U6*1Xkw1{Mc)e39XLX&mnXmQ%U`NvGqLl4JL(uZ&8+?5zdo=~2@vvOKp+k97=a22sedZU#hzPuarC$1}B;H}{xSL~1%U5>%w| zUH!s|B=wG@>RI~ByB$~U4}Kv;|9C*I^$cFk#CFjO?L;fh=`jaQ=sayW$MgWY@mF>e QgISwALI=;RB}=-aI*CU-ngE0#2)aWWm-h;J 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_side b/soh/assets/custom/objects/object_kibako2/mask_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..634969f2ad117d3451b8c75b9cc8f9493ee6ae5a GIT binary patch literal 8284 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 Q#&X6$YPJAT7ShiD0o@t@O#lD@ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_top b/soh/assets/custom/objects/object_kibako2/mask_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..d8292e33fe439000e45629da4e2315ca18f16131 GIT binary patch literal 8284 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 gLL + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey new file mode 100644 index 000000000..6bbbe0408 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart new file mode 100644 index 000000000..e79a71e40 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart new file mode 100644 index 000000000..2e20008c7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk new file mode 100644 index 000000000..b7eee4eb1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk new file mode 100644 index 000000000..d59ca15f8 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major new file mode 100644 index 000000000..e930dced0 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major new file mode 100644 index 000000000..ee053858d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor new file mode 100644 index 000000000..c9b542226 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor new file mode 100644 index 000000000..619787be2 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando new file mode 100644 index 000000000..8e2e6bb46 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando new file mode 100644 index 000000000..ca00e4780 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey new file mode 100644 index 000000000..b4cb8d672 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey new file mode 100644 index 000000000..a0ea43499 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token new file mode 100644 index 000000000..d87ec4148 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token new file mode 100644 index 000000000..369b6a05a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_side b/soh/assets/custom/objects/object_kibako2/minor_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..27a62c8c4d9c0eb801f2c264e2180f5f2535604f GIT binary patch literal 8284 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 AVE_OC literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_top b/soh/assets/custom/objects/object_kibako2/minor_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..830d8ff65b34ca91e71ff42f60422a1981d32a4e GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/rando_crate_top b/soh/assets/custom/objects/object_kibako2/rando_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..2d211d61250cecc2530ca7829c1fe873e169ce9e GIT binary patch literal 8284 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 V4mDsu=t>#b7Gf{9h(#T@{s-5JmyrMf literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/smallkey_crate_top b/soh/assets/custom/objects/object_kibako2/smallkey_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..542dfb837df5dfe96fc88c97a1be4e27dcff6615 GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/token_crate_side b/soh/assets/custom/objects/object_kibako2/token_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..6de4f580f866bec141d9e660d032f519448f5ac8 GIT binary patch literal 8284 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 UekcppDD}WOM?7$hj8NqN0{SG^yZ`_I literal 0 HcmV?d00001 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 9e56e51bd..3778f4a70 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -149,6 +149,54 @@ static const ALIGN_ASSET(2) char gBombchuBagBodyDL[] = dgBombchuBagBodyDL; #define dgBombchuBagMaskDL "__OTR__objects/object_bombchubag/gBombchuBagMaskDL" static const ALIGN_ASSET(2) char gBombchuBagMaskDL[] = dgBombchuBagMaskDL; +#define dgLargeMajorCrateDL "__OTR__objects/object_kibako2/gLargeMajorCrateDL" +static const ALIGN_ASSET(2) char gLargeMajorCrateDL[] = dgLargeMajorCrateDL; + +#define dgLargeMinorCrateDL "__OTR__objects/object_kibako2/gLargeMinorCrateDL" +static const ALIGN_ASSET(2) char gLargeMinorCrateDL[] = dgLargeMinorCrateDL; + +#define dgLargeRandoCrateDL "__OTR__objects/object_kibako2/gLargeRandoCrateDL" +static const ALIGN_ASSET(2) char gLargeRandoCrateDL[] = dgLargeRandoCrateDL; + +#define dgLargeSmallKeyCrateDL "__OTR__objects/object_kibako2/gLargeSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeSmallKeyCrateDL[] = dgLargeSmallKeyCrateDL; + +#define dgLargeTokenCrateDL "__OTR__objects/object_kibako2/gLargeTokenCrateDL" +static const ALIGN_ASSET(2) char gLargeTokenCrateDL[] = dgLargeTokenCrateDL; + +#define dgLargeBossKeyCrateDL "__OTR__objects/object_kibako2/gLargeBossKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeBossKeyCrateDL[] = dgLargeBossKeyCrateDL; + +#define dgLargeHeartCrateDL "__OTR__objects/object_kibako2/gLargeHeartCrateDL" +static const ALIGN_ASSET(2) char gLargeHeartCrateDL[] = dgLargeHeartCrateDL; + +#define dgLargeJunkCrateDL "__OTR__objects/object_kibako2/gLargeJunkCrateDL" +static const ALIGN_ASSET(2) char gLargeJunkCrateDL[] = dgLargeJunkCrateDL; + +#define dgSmallMajorCrateDL "__OTR__objects/object_kibako/gSmallMajorCrateDL" +static const ALIGN_ASSET(2) char gSmallMajorCrateDL[] = dgSmallMajorCrateDL; + +#define dgSmallMinorCrateDL "__OTR__objects/object_kibako/gSmallMinorCrateDL" +static const ALIGN_ASSET(2) char gSmallMinorCrateDL[] = dgSmallMinorCrateDL; + +#define dgSmallRandoCrateDL "__OTR__objects/object_kibako/gSmallRandoCrateDL" +static const ALIGN_ASSET(2) char gSmallRandoCrateDL[] = dgSmallRandoCrateDL; + +#define dgSmallSmallKeyCrateDL "__OTR__objects/object_kibako/gSmallSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallSmallKeyCrateDL[] = dgSmallSmallKeyCrateDL; + +#define dgSmallTokenCrateDL "__OTR__objects/object_kibako/gSmallTokenCrateDL" +static const ALIGN_ASSET(2) char gSmallTokenCrateDL[] = dgSmallTokenCrateDL; + +#define dgSmallBossKeyCrateDL "__OTR__objects/object_kibako/gSmallBossKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallBossKeyCrateDL[] = dgSmallBossKeyCrateDL; + +#define dgSmallHeartCrateDL "__OTR__objects/object_kibako/gSmallHeartCrateDL" +static const ALIGN_ASSET(2) char gSmallHeartCrateDL[] = dgSmallHeartCrateDL; + +#define dgSmallJunkCrateDL "__OTR__objects/object_kibako/gSmallJunkCrateDL" +static const ALIGN_ASSET(2) char gSmallJunkCrateDL[] = dgSmallJunkCrateDL; + //boss keys #define dgBossKeyCustomDL "__OTR__objects/object_bosskey/gBossKeyCustomDL" static const ALIGN_ASSET(2) char gBossKeyCustomDL[] = dgBossKeyCustomDL; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 5ce3c2ea0..078d645b5 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -275,6 +275,22 @@ typedef enum { // #### `args` // - `*EnDoor` VB_CONSUME_SMALL_KEY, + + // #### `result` + // ```c + // itemDropped >= 0 && itemDropped < 0x1A + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_SETUP_DRAW, // #### `result` // ```c @@ -1728,6 +1744,22 @@ typedef enum { // - None VB_SHOW_TITLE_CARD, + // #### `result` + // ```c + // (collectible >= 0) && (collectible <= 0x19 + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_SETUP_DRAW, + // #### `result` // ```c // false diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 6e6ec17d6..a54de6b64 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -126,6 +126,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.", /*german*/ "", /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_DEKU_TREE] = HintText(CustomMessage("They say that a #crate in the Deku Tree# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans l'Arbre Mojo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | DODONGOS CAVERN | @@ -304,7 +308,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", /*german*/ "!!!", /*french*/ "", {QM_RED, QM_GREEN})); - + + hintTextTable[RHT_CRATE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #crate in Dodongo's Cavern# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | JABU JABUS BELLY | @@ -468,6 +475,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", /*german*/ "", /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_JABU_JABU] = HintText(CustomMessage("They say that a #crate in Jabu Jabu's Belly# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FOREST TEMPLE | @@ -699,6 +710,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #crate in Forest Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | FIRE TEMPLE | ---------------------------*/ @@ -903,6 +918,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil derrière le trône d’un chevalier dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #crate in Fire Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -1050,6 +1069,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_WATER_TEMPLE] = HintText(CustomMessage("They say that a #crate in Water Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1295,6 +1318,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "", /*french*/ "Selon moi, protégé par un #cercle de flammes# dans le Temple de l'Esprit se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #crate in Spirit Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1558,6 +1585,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil près d’un coffre invisible gardé par les morts# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #crate in Shadow Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1981,6 +2012,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das Sehen einer #Prüfung mit Dinodorus# #[[1]]# enthülle.", /*french*/ "Selon moi, dans #une épreuve avec un Dinolfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("They say that a #crate in Gerudo Training Ground# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Gymnase Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | GANONS CASTLE | ---------------------------*/ diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 2c28b154e..6d5242a5d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1974,6 +1974,46 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GERUDO_VALLEY] = HintText(CustomMessage("They say that a #crate in Gerudo Valley# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans une vallée# a #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GERUDOS_FORTRESS] = HintText(CustomMessage("They say that a #crate in Gerudo Fortress# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Forteresse Gerudo# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_WASTELAND] = HintText(CustomMessage("They say that a #crate in Haunted Wasteland# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Désert Hanté# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_MARKET] = HintText(CustomMessage("They say that a #crate in the Market# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Place du Marché# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that a #crate in Kakariko Village# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Village de Cocorico# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GRAVEYARD] = HintText(CustomMessage("They say that a #crate in the Graveyard# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Cimetière# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GORON_CITY] = HintText(CustomMessage("They say that a #crate in Goron City# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Village Goron# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #crate in Death Mountain Crater# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse sur le Mont du Péril# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_LON_LON_RANCH] = HintText(CustomMessage("They say that a #crate in Lon Lon Ranch# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Ranch Lon Lon# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_LAKESIDE_LABORATORY] = HintText(CustomMessage("They say that a #crate in the Laboratory# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", { QM_RED, QM_GREEN })); // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 8a27f8106..aca9c49d3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -713,6 +713,18 @@ void GenerateItemPool() { bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); + + // Shuffle Crates + bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + bool overworldNLCratesActive = ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && + (ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL)); + bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); auto fsMode = ctx->GetOption(RSK_FISHSANITY); if (fsMode.IsNot(RO_FISHSANITY_OFF)) { diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp new file mode 100644 index 000000000..2106b4873 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -0,0 +1,548 @@ +#include "ShuffleCrates.h" +#include "soh_assets.h" +#include "static_data.h" +#include +#include "global.h" + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h" +#include "objects/object_kibako2/object_kibako2.h" +#include "overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h" +#include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" +#include "soh/Enhancements/enhancementTypes.h" +#include "soh/ResourceManagerHelpers.h" +extern PlayState* gPlayState; +} + +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto crateActor = ((ObjKibako2*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); + return; + } + + GetItemEntry crateItem = + Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + getItemCategory = crateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (crateItem.modIndex == MOD_NONE && + (crateItem.getItemId == GI_BOMBCHUS_5 || crateItem.getItemId == GI_BOMBCHUS_10 || + crateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && crateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (crateItem.modIndex == MOD_NONE && (crateItem.getItemId == GI_BOTTLE || crateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gLargeTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (crateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gLargeHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeJunkCrateDL); + break; + } +} + +extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto smallCrateActor = ((ObjKibako*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); + return; + } + + GetItemEntry smallCrateItem = Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + getItemCategory = smallCrateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (smallCrateItem.modIndex == MOD_NONE && + (smallCrateItem.getItemId == GI_BOMBCHUS_5 || smallCrateItem.getItemId == GI_BOMBCHUS_10 || smallCrateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && + smallCrateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (smallCrateItem.modIndex == MOD_NONE && (smallCrateItem.getItemId == GI_BOTTLE || smallCrateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gSmallTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (smallCrateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); + break; + } +} + +uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) { + RandomizerCheck rc = crateActor->crateIdentity.randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(crateActor->crateIdentity.randomizerInf) || + crateActor->crateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* play) { + RandomizerCheck rc = smallCrateActor->smallCrateIdentity.randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(smallCrateActor->smallCrateIdentity.randomizerInf) || + smallCrateActor->smallCrateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &crateActor->dyna.actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = crateActor->crateIdentity.randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void ObjKibako_RandomizerSpawnCollectible(ObjKibako* smallCrateActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &smallCrateActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = smallCrateActor->smallCrateIdentity.randomizerInf; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void ObjKibako2_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + uint8_t logicSetting = Rando::Context::GetInstance()->GetOption(RSK_LOGIC_RULES).Get(); + + // don't shuffle two OOB crates in GF and don't shuffle child GV/GF crates when not in no logic + if (actor->id != ACTOR_OBJ_KIBAKO2 || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4051 && (s16)actor->world.pos.z == -3429) || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4571 && (s16)actor->world.pos.z == -3429) || + (logicSetting != RO_LOGIC_NO_LOGIC && + ((gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == 3443 && (s16)actor->world.pos.z == -4876) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -764 && (s16)actor->world.pos.z == 148) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -125) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -150) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -90)))) + return; + + ObjKibako2* crateActor = static_cast(actorRef); + + crateActor->crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); +} + +void ObjKibako_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + + if (actor->id != ACTOR_OBJ_KIBAKO) return; + + ObjKibako* smallCrateActor = static_cast(actorRef); + + smallCrateActor->smallCrateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate(gPlayState->sceneNum, (s16)actor->home.pos.x, (s16)actor->home.pos.z); +} + +void RegisterShuffleCrates() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_CRATES); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO2, shouldRegister, ObjKibako2_RandomizerInit); + + COND_VB_SHOULD(VB_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + crateActor->dyna.actor.draw = (ActorFunc)ObjKibako2_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + ObjKibako2_RandomizerSpawnCollectible(crateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO, shouldRegister, ObjKibako_RandomizerInit); + + COND_VB_SHOULD(VB_SMALL_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + smallCrateActor->actor.draw = (ActorFunc)ObjKibako_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_SMALL_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + ObjKibako_RandomizerSpawnCollectible(smallCrateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); + +} + +void Rando::StaticData::RegisterCrateLocations() { + // clang-format off + // Overworld Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_GV_FREESTANDING_POH_CRATE] = Location::Crate(RC_GV_FREESTANDING_POH_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-350, 1480), "Freestanding PoH Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_FREESTANDING_POH_CRATE)); + locationTable[RC_GV_NEAR_COW_CRATE] = Location::Crate(RC_GV_NEAR_COW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-449, 123), "Near Cow Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_NEAR_COW_CRATE)); + locationTable[RC_GF_ABOVE_JAIL_CRATE] = Location::Crate(RC_GF_ABOVE_JAIL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(51, -2997), "Above Jail Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ABOVE_JAIL_CRATE)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1534), "Outside Center Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_1)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1594), "Outside Center Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_2)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_3] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1782), "Outside Center Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_3)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_4] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1842), "Outside Center Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_4)); + locationTable[RC_GF_OUTSIDE_LEFT_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-60, -2210), "Outside Left Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_1)); + locationTable[RC_GF_OUTSIDE_LEFT_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-120, -2210), "Outside Left Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_2)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1780), "Archery Range Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_2)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_3] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2020), "Archery Range Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_3)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_4] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2260), "Archery Range Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_4)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1540), "Archery Range Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_1)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_5] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2500), "Archery Range Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_5)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_6] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2740), "Archery Range Crate 6", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_6)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_7] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2980), "Archery Range Crate 7", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_7)); + locationTable[RC_GF_ARCHERY_START_CRATE_1] = Location::Crate(RC_GF_ARCHERY_START_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3727, -243), "Near Archery Start Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_1)); + locationTable[RC_GF_ARCHERY_START_CRATE_2] = Location::Crate(RC_GF_ARCHERY_START_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3667, -243), "Near Archery Start Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_2)); + locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3446, -4875), "Archery Left End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1)); + locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3303, -5018), "Archery Left End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2)); + locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3406, 414), "Archery Right End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1)); + locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3330, 406), "Archery Right End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2)); + locationTable[RC_GF_KITCHEN_CRATE_1] = Location::Crate(RC_GF_KITCHEN_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1251), "Kitchen Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_1)); + locationTable[RC_GF_KITCHEN_CRATE_2] = Location::Crate(RC_GF_KITCHEN_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1191), "Kitchen Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_2)); + locationTable[RC_GF_KITCHEN_CRATE_3] = Location::Crate(RC_GF_KITCHEN_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -847), "Kitchen Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_3)); + locationTable[RC_GF_KITCHEN_CRATE_4] = Location::Crate(RC_GF_KITCHEN_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -787), "Kitchen Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_4)); + locationTable[RC_GF_KITCHEN_CRATE_5] = Location::Crate(RC_GF_KITCHEN_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1610, -624), "Kitchen Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_5)); + locationTable[RC_GF_BREAK_ROOM_CRATE_1] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1260, -3155), "Break Room Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_1)); + locationTable[RC_GF_BREAK_ROOM_CRATE_4] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3550), "Break Room Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_4)); + locationTable[RC_GF_BREAK_ROOM_CRATE_2] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1360, -3325), "Break Room Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_2)); + locationTable[RC_GF_BREAK_ROOM_CRATE_3] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3502), "Break Room Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_3)); + locationTable[RC_GF_NORTH_F1_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F1_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-510, -2213), "North F1 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_CRATE)); + locationTable[RC_GF_NORTH_F3_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F3_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1090, -2210), "North F3 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F3_CARPENTER_CRATE)); + locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_1] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-49, 11), "South F2 Carpenter Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1)); + locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_2] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(11, 11), "South F2 Carpenter Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2)); + locationTable[RC_HW_BEFORE_QUICKSAND_CRATE] = Location::Crate(RC_HW_BEFORE_QUICKSAND_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3832, 2840), "Before Quicksand Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_BEFORE_QUICKSAND_CRATE)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_1] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3235, 2313), "After Quicksand Crate 1", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_2] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3125, 2459), "After Quicksand Crate 2", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_3] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3026, 2631), "After Quicksand Crate 3", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3)); + locationTable[RC_HW_NEAR_COLOSSUS_CRATE] = Location::Crate(RC_HW_NEAR_COLOSSUS_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(-1531, -976), "Near Colossus Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_NEAR_COLOSSUS_CRATE)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_1] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 338), "Near Bazaar Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_1)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_2] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 132), "Near Bazaar Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_2)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_1] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-150, -576), "Shooting Gallery Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_2] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-90, -576), "Shooting Gallery Crate 2", RHT_CRATE_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2)); + locationTable[RC_MK_LOST_DOG_HOUSE_CRATE] = Location::Crate(RC_MK_LOST_DOG_HOUSE_CRATE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_DOG_LADY_HOUSE, TWO_ACTOR_PARAMS(176, 170), "Lost Dog House Crate", RHT_CRATE_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_LOST_DOG_HOUSE_CRATE)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_1] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(76, -210), "Guard House Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_1)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_2] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -210), "Guard House Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_2)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_3] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 120), "Guard House Crate 3", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_3)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_4] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 168), "Guard House Crate 4", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_4)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_5] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 216), "Guard House Crate 5", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_5)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1039, 10), "Near Open Grotto Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1099, 10), "Near Open Grotto Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(506, -358), "Near Open Grotto Adult Crate 3", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(483, -302), "Near Open Grotto Adult Crate 4", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4)); + locationTable[RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(186, -758), "Near Potion Shop Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(185, 776), "Near Shooting Gallery Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(92, 348), "Near Boarding House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(32, 348), "Near Boarding House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1518), "Near Impas House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1470), "Near Impas House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-433, -401), "Near Bazaar Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2`", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); + locationTable[RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE] = Location::Crate(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-724, 871), "Behind GS House Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_GY_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_GY_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1732, 1366), "Near Graveyard Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GY_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_WINDMILL_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 601), "Near Windmill Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_FENCE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_FENCE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 111), "Near Fence Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-60, -46), "Near Boarding House Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BAZAAR_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-636, -478), "Near Bazaar Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE)); + locationTable[RC_GRAVEYARD_CRATE] = Location::Crate(RC_GRAVEYARD_CRATE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1050, -350), "Freestanding PoH Crate", RHT_CRATE_GRAVEYARD, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_CRATE)); + locationTable[RC_GC_MAZE_CRATE] = Location::Crate(RC_GC_MAZE_CRATE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1124, -1339), "Maze Crate", RHT_CRATE_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_CRATE)); + locationTable[RC_DMC_CRATE] = Location::Crate(RC_DMC_CRATE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-950, 1892), "Crate", RHT_CRATE_DEATH_MOUNTAIN_CRATER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CRATE)); + locationTable[RC_LLR_NEAR_TREE_CRATE] = Location::Crate(RC_LLR_NEAR_TREE_CRATE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(1160, -2376), "Near Tree Crate", RHT_CRATE_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_NEAR_TREE_CRATE)); + locationTable[RC_LH_LAB_CRATE] = Location::Crate(RC_LH_LAB_CRATE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(90, -119), "Lab Crate", RHT_CRATE_LAKESIDE_LABORATORY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_CRATE)); + + // No Logic Crates + locationTable[RC_GV_CRATE_BRIDGE_1] = Location::NLCrate(RC_GV_CRATE_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-764, 148), "Near Bridge Crate 1", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_1)); + locationTable[RC_GV_CRATE_BRIDGE_2] = Location::NLCrate(RC_GV_CRATE_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -125), "Near Bridge Crate 2", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_2)); + locationTable[RC_GV_CRATE_BRIDGE_3] = Location::NLCrate(RC_GV_CRATE_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -150), "Near Bridge Crate 3", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_3)); + locationTable[RC_GV_CRATE_BRIDGE_4] = Location::NLCrate(RC_GV_CRATE_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -90), "Near Bridge Crate 4", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_4)); + locationTable[RC_GF_ARCHERY_LEFT_END_CHILD_CRATE] = Location::NLCrate(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3443, -4876), "Archery Left End Child Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE)); + + // MQ Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DEKU_TREE_MQ_LOBBY_CRATE] = Location::Crate(RC_DEKU_TREE_MQ_LOBBY_CRATE, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(279, 333), "MQ Lobby Crate", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -62), "MQ Slingshot Room Crate 1", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -2), "MQ Slingshot Room Crate 2", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1886, -744), "MQ Poe Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1826, -744), "MQ Poe Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1391), "MQ Poe Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1451), "MQ Poe Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1824), "MQ Poe Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1884), "MQ Poe Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1161), "MQ Poe Room Crate 7", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1221), "MQ Poe Room Crate 8", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1730, -1836), "MQ Staircase Lower Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2190, -1835), "MQ Staircase Lower Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1510, -1837), "MQ Staircase Upper Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1511, -1084), "MQ Staircase Upper Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2410, -1084), "MQ Staircase Upper Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "MQ Staircase Upper Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3191, -897), "MQ Two Flames Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2776, -810), "MQ Two Flames Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1714), "MQ Larvae Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1774), "MQ Larvae Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1871, -1976), "MQ Larvae Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1811, -1976), "MQ Larvae Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1721), "MQ Larvae Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1781), "MQ Larvae Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 769), "MQ Outside Boss Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 709), "MQ Outside Boss Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1130, -654), "MQ Outside Boss Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1211, -775), "MQ Outside Boss Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -417), "MQ Outside Boss Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -534), "MQ Outside Boss Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2249, -56), "MQ Shortcut Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2189, -56), "MQ Shortcut Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2150, 55), "MQ Shortcut Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2135, -62), "MQ Shortcut Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2090, 55), "MQ Shortcut Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2030, 55), "MQ Shortcut Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1147), "MQ Lizalfos Maze Lower Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1195), "MQ Lizalfos Maze Lower Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2124, 1154), "MQ Lizalfos Maze Lower Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1817, 1330), "MQ Lizalfos Maze Upper Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1288), "MQ Lizalfos Maze Upper Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1336), "MQ Lizalfos Maze Upper Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1407, -756), "MQ Lava Torch Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(384, 351), "MQ Lava Torch Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1409, -1176), "MQ Lava Torch Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(999, -402), "MQ Lava Torch Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-150, -336), "MQ Central Pillar Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-210, -336), "MQ Central Pillar Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(299, 485), "MQ Central Pillar Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 486), "MQ Central Pillar Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(222, 204), "MQ Central Pillar Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 425), "MQ Central Pillar Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 365), "MQ Central Pillar Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 426), "MQ Central Pillar Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 366), "MQ Central Pillar Lower Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(162, 204), "MQ Central Pillar Lower Crate 8", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(31, 636), "MQ Central Pillar Lower Crate 9", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(151, 636), "MQ Central Pillar Lower Crate 10", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(102, 204), "MQ Central Pillar Lower Crate 11", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(91, 636), "MQ Central Pillar Lower Crate 12", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 522), "MQ Central Pillar Lower Crate 13", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 582), "MQ Central Pillar Lower Crate 14", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(698, 399), "MQ Lizalfos Hallway Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(437, 576), "MQ Lizalfos Hallway Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(270, 504), "MQ Lizalfos Hallway Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(686, 1016), "MQ Lizalfos Hallway Room Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 870), "MQ Lizalfos Hallway Room Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 810), "MQ Lizalfos Hallway Room Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(524, 839), "MQ Lizalfos Hallway Room Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(525, 954), "MQ Lizalfos Hallway Room Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 570), "MQ Lizalfos Hallway Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 510), "MQ Lizalfos Hallway Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -712), "MQ Storage Room A Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -821), "MQ Storage Room A Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -922), "MQ Storage Room A Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1434, -1036), "MQ Storage Room A Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1374, -1036), "MQ Storage Room A Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1265, -1036), "MQ Storage Room A Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1205, -1036), "MQ Storage Room A Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-892, -91), "MQ GS Storage Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1149, 173), "MQ GS Storage Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1157, -221), "MQ GS Storage Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-945, -315), "MQ GS Storage Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -141), "MQ GS Storage Room Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1103, -315), "MQ GS Storage Room Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-884, 65), "MQ GS Storage Room Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, 56), "MQ GS Storage Room Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1918), "MQ Dragon Room Torches Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1978), "MQ Dragon Room Torches Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1718, -2006), "MQ Dragon Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1778, -2006), "MQ Dragon Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1912), "MQ Dragon Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1972), "MQ Dragon Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1092, -1926), "MQ Dragon Room Door Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1153, -1926), "MQ Dragon Room Door Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1257, -1567), "MQ BK Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1289, -1205), "MQ BK Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-985, -1333), "MQ BK Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1297, -1300), "MQ BK Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1069, -1402), "MQ BK Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-11, -2075), "MQ Whirlpool Front Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-371, -2077), "MQ Whirlpool Front Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-455, -2394), "MQ Whirlpool Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-498, -2661), "MQ Whirlpool Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, -2737), "MQ Whirlpool Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-251, -2731), "MQ Whirlpool Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-119, -2481), "MQ Whirlpool Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(126, -2485), "MQ Whirlpool Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-7, -3126), "MQ Whirlpool Behind Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-87, -3126), "MQ Whirlpool Behind Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-303, -3126), "MQ Whirlpool Behind Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-390, -3126), "MQ Whirlpool Behind Gate Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-397, -3818), "MQ Dodongo Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(30, -3215), "MQ Dodongo Room Hall Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-85, -3460), "MQ Dodongo Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-271, -3826), "MQ Dodongo Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(36, -3700), "MQ Dodongo Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2766), "MQ Storage Room B Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2866), "MQ Storage Room B Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2926), "MQ Storage Room B Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1435, -2935), "MQ Storage Room B Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2875), "MQ Storage Room B Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-994, 744), "MQ Triple Torch Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-991, 976), "MQ Triple Torch Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1511, 975), "MQ Triple Torch Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 792), "MQ Triple Torch Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 975), "MQ Triple Torch Room Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 744), "MQ Triple Torch Room Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2183, 977), "MQ Triple Torch Room Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2260, 744), "MQ Triple Torch Room Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2200, 743), "MQ Triple Torch Room Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(510, -1558), "MQ Statue Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(570, -1558), "MQ Statue Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1138), "MQ Big Mirror Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1138), "MQ Big Mirror Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1186), "MQ Big Mirror Crate 3", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1186), "MQ Big Mirror Crate 4", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE] = Location::Crate(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-59, -1598), "MQ Maze Crate", RHT_CRATE_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE)); + + // Small Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-141, -1945), "Platform Room Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-189, -1925), "Platform Room Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2030, -1172), "After Hammer Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2072, -1135), "After Hammer Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-971, -940), "Before Child Climb Small Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -939), "Before Child Climb Small Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-512, -4592), "MQ Triple Hallway Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-666, -4671), "MQ Triple Hallway Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1599, -1322), "MQ Frozen Eye Switch Small Crate 1", RHT_CRATE_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "MQ Frozen Eye Switch Small Crate 2", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "MQ Frozen Eye Switch Small Crate 3", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1290), "MQ Lizalfos Maze Upper Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1332), "MQ Lizalfos Maze Upper Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(460, 370), "MQ Lava Torch Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1405, -975), "MQ Lava Torch Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(685, 183), "MQ Lava Torch Small Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Small Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1267, 200), "MQ Lava Torch Small Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1952), "MQ Dragon Room Torches Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1911), "MQ Dragon Room Torches Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1991), "MQ Dragon Room Torches Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1470, -622), "MQ Storage Room A Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1341, -621), "MQ Storage Room A Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1393, -621), "MQ Storage Room A Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1284, -621), "MQ Storage Room A Small Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1166, 97), "MQ GS Storage Room Lower Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-992, 382), "MQ GS Storage Room Upper Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(365, 52), "MQ Truth Spinner Small Crate 1", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -62), "MQ Truth Spinner Small Crate 2", RHT_CRATE_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -7), "MQ Truth Spinner Small Crate 3", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(366, 114), "MQ Truth Spinner Small Crate 4", RHT_CRATE_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-271, -983), "MQ Statue Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1382, 190), "MQ Beamos Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE)); + + // clang-format on +} + +static RegisterShipInitFunc initFunc(RegisterShuffleCrates, { "IS_RANDO" }); +static RegisterShipInitFunc locFunc(Rando::StaticData::RegisterCrateLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.h b/soh/soh/Enhancements/randomizer/ShuffleCrates.h new file mode 100644 index 000000000..60cd51dc2 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.h @@ -0,0 +1,16 @@ +#ifndef ShuffleCrates_H +#define ShuffleCrates_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void ObjKibako2_RandomizerInit(void* actorRef); +void ObjKibako_RandomizerInit(void* actorRef); +#ifdef __cplusplus +}; +#endif + +#endif //ShuffleCrates_H diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 77f67873e..1f50ad58d 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -45,6 +45,7 @@ Context::Context() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], @@ -180,6 +181,9 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || + (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || !mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || @@ -191,7 +195,11 @@ void Context::GenerateLocationPool() { // should not have a shuffled item. if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || - (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS))) { + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || + (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -204,7 +212,10 @@ void Context::GenerateLocationPool() { if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || - (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD))) { + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || + (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD))) { continue; } // also add to that dungeon's location list. diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 7b5f98f4b..da65ea681 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -382,6 +382,30 @@ Rando::Location Rando::Location::Pot(RandomizerCheck rc, RandomizerCheckQuest qu collectionCheck }; } +Rando::Location Rando::Location::Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_CRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + +Rando::Location Rando::Location::NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_NLCRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + +Rando::Location Rando::Location::SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_SMALL_CRATE, area_, ACTOR_OBJ_KIBAKO, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, false }; } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 3806160c8..e66fd58b9 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -204,6 +204,21 @@ class Location { RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + + static Location NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + + static Location SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 129a842ef..9febbd6d8 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -219,6 +219,7 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -242,6 +243,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index bea5801e5..8cd60f268 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -306,10 +306,12 @@ void RegionTable_Init_DodongosCavern() { //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), }, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), @@ -333,7 +335,11 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER] = Region("Dodongos Cavern MQ Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}), @@ -392,8 +398,14 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_LARVAE_ROOM] = Region("Dodongos Cavern MQ Larvae Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts - LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, true), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts + LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, logic->CanBreakCrates()), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER, []{return true;}), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts @@ -416,8 +428,10 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Before Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return true;}), @@ -467,11 +481,19 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);}) && //could be a seperate room if it gets busy logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), - }, { + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 1af91e7be..8888cdac9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -327,7 +327,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); @@ -430,7 +436,10 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM] = Region("Fire Temple MQ Near Boss Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations //If we're using the south torch as the initial torch, or using FAs, we either have to cross to the north to remove the crate, or use a trick to ignore it - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))) + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return true;}), @@ -450,9 +459,15 @@ void RegionTable_Init_FireTemple() { //Fairies cannot be used for this as it is time sensetive, and NL is only useful with sticks as it disables other magic while in use, so it's tunic or raw damage taking ability. //testing tells me you take 3 ticks of lava damage, which is 12 internal damage or 3/4 of a heart at x1 damage multiplier, performing this run //logic->EffectiveHealth() works in half hearts for whatever reason, meaning this needs a deeper refactor to be perfect, but it should be good enough for now - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return true;}), @@ -522,7 +537,10 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE_CRATE_CAGE] = Region("Fire Temple MQ Lower Maze Crate Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return true;}), @@ -544,7 +562,12 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE_BOX_CAGE] = Region("Fire Temple MQ Upper Maze Box Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), //Assumes maze access LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, logic->HasExplosives()), }, { @@ -563,7 +586,13 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE] = Region("Fire Temple MQ Maze Shortcut Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT, []{return logic->OpenedUpperFireShortcut;}), @@ -600,8 +629,18 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM] = Region("Fire Temple MQ High Torch Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 3e595c735..2f5ba96bf 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -530,7 +530,14 @@ void RegionTable_Init_ForestTemple() { }); //This room exists to show the actual map layout, and for when the crates get added to logic - areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE);}), Entrance(RR_FOREST_TEMPLE_MQ_BETH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index f95b32239..5466c598c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -152,7 +152,11 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Center", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQGTGMazeSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), - }, {}, { + }, + { //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index ed28e8672..3c45682ae 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -28,10 +28,12 @@ void RegionTable_Init_JabuJabusBelly() { EventAccess(&logic->JabuWestTentacle, []{return logic->JabuRutoIn1F && logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), + LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), //We can kill the Stingers with ruto - LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), - LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), + LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_BEGINNING, []{return true;}), @@ -263,6 +265,8 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanUse(RG_BOOMERANG);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 1ed814adb..3be1acac4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -126,7 +126,15 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}) && (logic->CanUse(RG_HOVER_BOOTS) || Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_FIRE_ARROWS);}) || (ctx->GetTrickOption(RT_SHADOW_MQ_GAP) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslashExceptHammer()));}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 7982f9ae5..701539ff1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -32,13 +32,15 @@ void RegionTable_Init_SpiritTemple() { EventAccess(&logic->NutCrate, []{return true;}), }, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), @@ -284,6 +286,10 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakSmallCrates();})), + }, { //Exits //we check possible adult access directly in MQSpiritSharedBrokenWallRoom, so this exit only covers Certain Access @@ -424,6 +430,7 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM] = Region("Spirit Temple MQ Four Beamos Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, logic->CanKillEnemy(RE_BEAMOS)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST, []{return logic->CanAvoidEnemy(RE_BEAMOS, true, 4) && logic->CanUse(RG_SONG_OF_TIME) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_HOOKSHOT);}), @@ -507,10 +514,14 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM] = Region("Spirit Temple MQ Big Mirror Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index ddf72fba0..0ae5ac289 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -427,7 +427,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH] = Region("Water Temple MQ Central Pillar High", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQWaterOpenedPillarB1, []{return ((logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_DINS_FIRE)) || (ctx->GetTrickOption(RT_WATER_MQ_CENTRAL_PILLAR) && logic->CanUse(RG_FIRE_ARROWS))) && (logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslash()));}), - }, {}, { + }, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_ZORA_TUNIC);}), }); @@ -443,15 +447,40 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, logic->CanBreakCrates()), }, {}); //Region exists to add crate/pot/box locations areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterLevel(WL_LOW_OR_MID) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8);}), @@ -459,9 +488,19 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_2F] = Region("Water Temple MQ Behind Blue Switch 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), @@ -479,9 +518,17 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY] = Region("Water Temple MQ Lizalfos Hallway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE, []{return logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_DINS_FIRE);}), @@ -497,9 +544,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE] = Region("Water Temple MQ Lizalfos Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); //This room exists to hold the wonderitems that drop from the emblems here. Specifically this assumes you are standing on the final ledge @@ -592,7 +641,15 @@ void RegionTable_Init_WaterTemple() { }); //This region assumes Iron boots to access - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}), @@ -602,13 +659,28 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE] = Region("Water Temple MQ Dragon Room Alcove", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQWaterDragonTorches, []{return true;}), - }, {}, { + }, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16;}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return logic->HasItem(RG_SILVER_SCALE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanUse(RG_HOOKSHOT);}), @@ -618,7 +690,8 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH] = Region("Water Temple MQ Boss Key Room Switch", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return true;}), @@ -627,7 +700,15 @@ void RegionTable_Init_WaterTemple() { }); //this exists for the crates in preparation for clips through the grate - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH, []{return logic->CanHitSwitch(ED_BOOMERANG);}), }); @@ -653,7 +734,17 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST, []{return logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_BRONZE_SCALE) && (logic->MQWaterLevel(WL_LOW) || logic->WaterTimer() >= 24);}) }); - areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && ((logic->MQWaterLevel(WL_LOW) && logic->HasItem(RG_GOLDEN_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT))));}), Entrance(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->CanUse(RG_FIRE_ARROWS) && ((logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (logic->CanUse(RG_LONGSHOT) && Here(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->ScarecrowsSong();})));}) @@ -661,14 +752,30 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE] = Region("Water Temple MQ Triangle Torch Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); - areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + + }, + { //Exits //we can backflip over the spikes, but land in water. Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && (logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE));}), @@ -683,9 +790,15 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_SINGLE_STALFOS_ROOM] = Region("Water Temple MQ Single Stalfos Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, true), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM, []{return logic->HasItem(RG_SILVER_SCALE) || (logic->IsChild && logic->HasItem(RG_BRONZE_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT)));}) @@ -699,8 +812,13 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_4_TORCH_ROOM, []{return (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && Here(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);});}), @@ -709,7 +827,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE] = Region("Water Temple MQ Basement Gated Areas", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, logic->CanBreakCrates()), }, { Entrance(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return true;}) }); diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp index 2dcdf71bb..6233b20ab 100644 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp @@ -43,6 +43,42 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, logic->CanBreakPots()), + LOCATION(RC_GF_ABOVE_JAIL_CRATE, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_3, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_4, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_5, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_6, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_7, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_START_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_START_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, logic->IsChild && logic->HasExplosives() && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_3, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_4, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_5, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_1, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_2, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_3, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_4, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_F1_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_F3_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, logic->CanBreakCrates()), + + //RANDOTODO doublecheck when GF isn't a blob LOCATION(RC_GF_KITCHEN_SUN_FAIRY, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_SUNS_SONG)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index cc5601fcb..b05b22c48 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -18,10 +18,12 @@ void RegionTable_Init_DeathMountainCrater() { }, { //Locations LOCATION(RC_DMC_WALL_FREESTANDING_POH, logic->FireTimer() >= 16 || logic->Hearts() >= 3), - LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack()), + LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack() && logic->CanBreakCrates()), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns() && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS) && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE, logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), + LOCATION(RC_DMC_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DMC_UPPER_NEARBY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 9141f4dcd..86cc1b060 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -36,6 +36,7 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_GV_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_GOSSIP_STONE, true), + LOCATION(RC_GV_NEAR_COW_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), @@ -57,7 +58,8 @@ void RegionTable_Init_GerudoValley() { areaTable[RR_GV_CRATE_LEDGE] = Region("GV Crate Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_GV_CRATE_FREESTANDING_POH, true), + LOCATION(RC_GV_CRATE_FREESTANDING_POH, logic->CanBreakCrates()), + LOCATION(RC_GV_FREESTANDING_POH_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), @@ -70,6 +72,10 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)), LOCATION(RC_GV_GS_BEHIND_TENT, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), LOCATION(RC_GV_GS_PILLAR, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_CRATE_BRIDGE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_4, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GERUDO_FORTRESS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index b39a389d2..8081757d2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -33,6 +33,8 @@ void RegionTable_Init_GoronCity() { LOCATION(RC_GC_UPPER_STAIRCASE_POT_1, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_2, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_GC_MAZE_CRATE, logic->BlastOrSmash() || (logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBreakCrates())), + }, { //Exits Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 694d0e3ee..012503d9a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -12,7 +12,7 @@ void RegionTable_Init_Graveyard() { EventAccess(&logic->BugRock, []{return true;}), }, { //Locations - LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtNight), //TODO: This needs to change LOCATION(RC_GRAVEYARD_GS_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->AtNight && logic->CanGetNightTimeGS()), LOCATION(RC_GRAVEYARD_GS_BEAN_PATCH, logic->CanSpawnSoilSkull() && logic->CanAttack()), @@ -31,6 +31,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()), LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()), LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_GRAVEYARD_CRATE, ((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->IsAdult || logic->AtNight;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp index 437f93a64..a9b238292 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -5,7 +5,12 @@ using namespace Rando; void RegionTable_Init_HauntedWasteland() { // clang-format off - areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_HW_BEFORE_QUICKSAND_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_GF_OUTSIDE_GATE, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), @@ -25,13 +30,21 @@ void RegionTable_Init_HauntedWasteland() { LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_3, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WASTELAND_NEAR_COLOSSUS, []{return ctx->GetTrickOption(RT_LENS_HW) || logic->CanUse(RG_LENS_OF_TRUTH);}), Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), }); - areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_HW_NEAR_COLOSSUS_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return ctx->GetTrickOption(RT_HW_REVERSE) || false;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 7fffa5d72..c0af2acde 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -12,33 +12,51 @@ void RegionTable_Init_Kakariko() { EventAccess(&logic->KakarikoVillageGateOpen, []{return logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER);}), }, { //Locations - LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), - LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), - LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), - LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), + LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), + LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), + LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), + LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), //Can kill lower kak skulls with pots - LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_GY_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 04ae5fe85..36d3ee1a3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -107,10 +107,11 @@ void RegionTable_Init_LakeHylia() { //Locations LOCATION(RC_LH_LAB_DIVE, logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->CanUse(RG_EYEBALL_FROG)), - LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->CanBreakCrates()), LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_LEFT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp index 00ce5a3ee..fae41664e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp @@ -23,6 +23,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_RAIN_SHED_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_NEAR_TREE_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 02dea3b56..368cbe2e3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -14,14 +14,18 @@ void RegionTable_Init_Market() { areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), @@ -107,6 +111,11 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_9, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_10, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_11, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_4, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_5, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), @@ -210,7 +219,8 @@ void RegionTable_Init_Market() { areaTable[RR_MARKET_DOG_LADY_HOUSE] = Region("Market Dog Lady House", "Market Dog Lady House", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MK_LOST_DOG_HOUSE_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 62c14e6ff..97d7630e8 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1054,6 +1054,14 @@ namespace Rando { return true; } + bool Logic::CanBreakCrates() { + return true; + } + + bool Logic::CanBreakSmallCrates() { + return true; + } + bool Logic::HasExplosives(){ return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index d8fa9864b..c976287a7 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -237,6 +237,8 @@ class Logic { bool CanBreakUpperBeehives(); bool CanBreakLowerBeehives(); bool CanBreakPots(); + bool CanBreakCrates(); + bool CanBreakSmallCrates(); bool HasFireSource(); bool HasFireSourceWithTorch(); bool TradeQuestStep(RandomizerGet rg); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 576e8c334..fed7e033f 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -271,6 +271,16 @@ void Settings::CreateOptionDescriptions() { "Overworld - Only shuffle pots that are outside of dungeons.\n" "\n" "All pots - Shuffle all pots."; + mOptionDescriptions[RSK_SHUFFLE_CRATES] = "Crates will drop a randomized item the first time they're broken and collected. " + "Crates will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Crates will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle crates that are within dungeons.\n" + "\n" + "Overworld - Only shuffle crates that are outside of dungeons.\n" + "\n" + "All Crates - Shuffle all crates."; mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" "\n" "The fishing pole is required to play the fishing pond minigame."; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f99a38ba3..8d09b6839 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1899,6 +1899,261 @@ std::map rcToRandomizerInf = { { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2 }, { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1 }, { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2 }, + // Crates + { RC_GV_FREESTANDING_POH_CRATE, RAND_INF_GV_FREESTANDING_POH_CRATE, }, + { RC_GV_NEAR_COW_CRATE, RAND_INF_GV_NEAR_COW_CRATE, }, + { RC_GV_CRATE_BRIDGE_1, RAND_INF_GV_CRATE_BRIDGE_1, }, + { RC_GV_CRATE_BRIDGE_2, RAND_INF_GV_CRATE_BRIDGE_2, }, + { RC_GV_CRATE_BRIDGE_3, RAND_INF_GV_CRATE_BRIDGE_3, }, + { RC_GV_CRATE_BRIDGE_4, RAND_INF_GV_CRATE_BRIDGE_4, }, + { RC_GF_ABOVE_JAIL_CRATE, RAND_INF_GF_ABOVE_JAIL_CRATE, }, + { RC_GF_OUTSIDE_CENTER_CRATE_1, RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, }, + { RC_GF_OUTSIDE_CENTER_CRATE_2, RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, }, + { RC_GF_OUTSIDE_CENTER_CRATE_3, RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, }, + { RC_GF_OUTSIDE_CENTER_CRATE_4, RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, }, + { RC_GF_OUTSIDE_LEFT_CRATE_1, RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, }, + { RC_GF_OUTSIDE_LEFT_CRATE_2, RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, }, + { RC_GF_ARCHERY_RANGE_CRATE_1, RAND_INF_GF_ARCHERY_RANGE_CRATE_1, }, + { RC_GF_ARCHERY_RANGE_CRATE_2, RAND_INF_GF_ARCHERY_RANGE_CRATE_2, }, + { RC_GF_ARCHERY_RANGE_CRATE_3, RAND_INF_GF_ARCHERY_RANGE_CRATE_3, }, + { RC_GF_ARCHERY_RANGE_CRATE_4, RAND_INF_GF_ARCHERY_RANGE_CRATE_4, }, + { RC_GF_ARCHERY_RANGE_CRATE_5, RAND_INF_GF_ARCHERY_RANGE_CRATE_5, }, + { RC_GF_ARCHERY_RANGE_CRATE_6, RAND_INF_GF_ARCHERY_RANGE_CRATE_6, }, + { RC_GF_ARCHERY_RANGE_CRATE_7, RAND_INF_GF_ARCHERY_RANGE_CRATE_7, }, + { RC_GF_ARCHERY_START_CRATE_1, RAND_INF_GF_ARCHERY_START_CRATE_1, }, + { RC_GF_ARCHERY_START_CRATE_2, RAND_INF_GF_ARCHERY_START_CRATE_2, }, + { RC_GF_ARCHERY_LEFT_END_CRATE_1, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, }, + { RC_GF_ARCHERY_LEFT_END_CRATE_2, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, }, + { RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, }, + { RC_GF_ARCHERY_RIGHT_END_CRATE_1, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, }, + { RC_GF_ARCHERY_RIGHT_END_CRATE_2, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, }, + { RC_GF_KITCHEN_CRATE_1, RAND_INF_GF_KITCHEN_CRATE_1, }, + { RC_GF_KITCHEN_CRATE_2, RAND_INF_GF_KITCHEN_CRATE_2, }, + { RC_GF_KITCHEN_CRATE_3, RAND_INF_GF_KITCHEN_CRATE_3, }, + { RC_GF_KITCHEN_CRATE_4, RAND_INF_GF_KITCHEN_CRATE_4, }, + { RC_GF_KITCHEN_CRATE_5, RAND_INF_GF_KITCHEN_CRATE_5, }, + { RC_GF_BREAK_ROOM_CRATE_1, RAND_INF_GF_BREAK_ROOM_CRATE_1, }, + { RC_GF_BREAK_ROOM_CRATE_2, RAND_INF_GF_BREAK_ROOM_CRATE_2, }, + { RC_GF_BREAK_ROOM_CRATE_3, RAND_INF_GF_BREAK_ROOM_CRATE_3, }, + { RC_GF_BREAK_ROOM_CRATE_4, RAND_INF_GF_BREAK_ROOM_CRATE_4, }, + { RC_GF_NORTH_F1_CARPENTER_CRATE, RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, }, + { RC_GF_NORTH_F3_CARPENTER_CRATE, RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, }, + { RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, }, + { RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, }, + { RC_HW_BEFORE_QUICKSAND_CRATE, RAND_INF_HW_BEFORE_QUICKSAND_CRATE, }, + { RC_HW_AFTER_QUICKSAND_CRATE_1, RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, }, + { RC_HW_AFTER_QUICKSAND_CRATE_2, RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, }, + { RC_HW_AFTER_QUICKSAND_CRATE_3, RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, }, + { RC_HW_NEAR_COLOSSUS_CRATE, RAND_INF_HW_NEAR_COLOSSUS_CRATE, }, + { RC_MK_NEAR_BAZAAR_CRATE_1, RAND_INF_MK_NEAR_BAZAAR_CRATE_1, }, + { RC_MK_NEAR_BAZAAR_CRATE_2, RAND_INF_MK_NEAR_BAZAAR_CRATE_2, }, + { RC_MK_SHOOTING_GALLERY_CRATE_1, RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, }, + { RC_MK_SHOOTING_GALLERY_CRATE_2, RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, }, + { RC_MK_LOST_DOG_HOUSE_CRATE, RAND_INF_MK_LOST_DOG_HOUSE_CRATE, }, + { RC_MK_GUARD_HOUSE_CRATE_1, RAND_INF_MK_GUARD_HOUSE_CRATE_1, }, + { RC_MK_GUARD_HOUSE_CRATE_2, RAND_INF_MK_GUARD_HOUSE_CRATE_2, }, + { RC_MK_GUARD_HOUSE_CRATE_3, RAND_INF_MK_GUARD_HOUSE_CRATE_3, }, + { RC_MK_GUARD_HOUSE_CRATE_4, RAND_INF_MK_GUARD_HOUSE_CRATE_4, }, + { RC_MK_GUARD_HOUSE_CRATE_5, RAND_INF_MK_GUARD_HOUSE_CRATE_5, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, }, + { RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, }, + { RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, }, + { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, }, + { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, }, + { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, }, + { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, }, + { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, }, + { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, }, + { RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, }, + { RC_KAK_NEAR_GY_CHILD_CRATE, RAND_INF_KAK_NEAR_GY_CHILD_CRATE, }, + { RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, }, + { RC_KAK_NEAR_FENCE_CHILD_CRATE, RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, }, + { RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, }, + { RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, }, + { RC_GRAVEYARD_CRATE, RAND_INF_GRAVEYARD_CRATE, }, + { RC_GC_MAZE_CRATE, RAND_INF_GC_MAZE_CRATE, }, + { RC_DMC_CRATE, RAND_INF_DMC_CRATE, }, + { RC_LLR_NEAR_TREE_CRATE, RAND_INF_LLR_NEAR_TREE_CRATE, }, + { RC_LH_LAB_CRATE, RAND_INF_LH_LAB_CRATE, }, + + { RC_DEKU_TREE_MQ_LOBBY_CRATE, RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, }, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, }, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, }, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, }, + + { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, }, + { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, }, + { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, }, + { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, }, + + { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, }, + { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, }, + { RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, }, }; BeehiveIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -2246,6 +2501,62 @@ GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 re } return grassIdentity; + +} + +CrateIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct CrateIdentity crateIdentity; + uint32_t crateSceneNum = sceneNum; + + // pretend night is day to align crates in market and align GF child/adult crates + if (sceneNum == SCENE_MARKET_NIGHT) { + crateSceneNum = SCENE_MARKET_DAY; + } else if (sceneNum == SCENE_GERUDOS_FORTRESS && gPlayState->linkAgeOnLoad == 1 && posX == 310) { + if (posZ == -1830) { + posZ = -1842.0f; + } else if (posZ == -1770) { + posZ = -1782.0f; + } + } + + crateIdentity.randomizerInf = RAND_INF_MAX; + crateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO2, crateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + crateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + crateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return crateIdentity; +} + +SmallCrateIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct SmallCrateIdentity smallCrateIdentity; + uint32_t smallCrateSceneNum = sceneNum; + + smallCrateIdentity.randomizerInf = RAND_INF_MAX; + smallCrateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO, smallCrateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + smallCrateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + smallCrateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return smallCrateIdentity; } u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 13718dac4..50bf6636c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -55,6 +55,8 @@ class Randomizer { PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ); FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams); GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); + CrateIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); + SmallCrateIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true); ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 9851f614b..8378f25fb 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -288,6 +288,9 @@ typedef enum { RCTYPE_SONG_LOCATION, // Song locations RCTYPE_BOSS_HEART_OR_OTHER_REWARD, // Boss heart container or lesser dungeon rewards (lens, ice arrow) RCTYPE_POT, // Pots + RCTYPE_CRATE, // Crates + RCTYPE_NLCRATE, // NL Crates + RCTYPE_SMALL_CRATE, // Small crates RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps) RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives @@ -2333,6 +2336,266 @@ typedef enum { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, // End Pots + + // Overworld Crates + RC_GV_FREESTANDING_POH_CRATE, + RC_GV_NEAR_COW_CRATE, + RC_GV_CRATE_BRIDGE_1, + RC_GV_CRATE_BRIDGE_2, + RC_GV_CRATE_BRIDGE_3, + RC_GV_CRATE_BRIDGE_4, + RC_GF_ABOVE_JAIL_CRATE, + RC_GF_OUTSIDE_CENTER_CRATE_1, + RC_GF_OUTSIDE_CENTER_CRATE_2, + RC_GF_OUTSIDE_CENTER_CRATE_3, + RC_GF_OUTSIDE_CENTER_CRATE_4, + RC_GF_OUTSIDE_LEFT_CRATE_1, + RC_GF_OUTSIDE_LEFT_CRATE_2, + RC_GF_ARCHERY_RANGE_CRATE_1, + RC_GF_ARCHERY_RANGE_CRATE_2, + RC_GF_ARCHERY_RANGE_CRATE_3, + RC_GF_ARCHERY_RANGE_CRATE_4, + RC_GF_ARCHERY_RANGE_CRATE_5, + RC_GF_ARCHERY_RANGE_CRATE_6, + RC_GF_ARCHERY_RANGE_CRATE_7, + RC_GF_ARCHERY_START_CRATE_1, + RC_GF_ARCHERY_START_CRATE_2, + RC_GF_ARCHERY_LEFT_END_CRATE_1, + RC_GF_ARCHERY_LEFT_END_CRATE_2, + RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RC_GF_ARCHERY_RIGHT_END_CRATE_1, + RC_GF_ARCHERY_RIGHT_END_CRATE_2, + RC_GF_KITCHEN_CRATE_1, + RC_GF_KITCHEN_CRATE_2, + RC_GF_KITCHEN_CRATE_3, + RC_GF_KITCHEN_CRATE_4, + RC_GF_KITCHEN_CRATE_5, + RC_GF_BREAK_ROOM_CRATE_1, + RC_GF_BREAK_ROOM_CRATE_2, + RC_GF_BREAK_ROOM_CRATE_3, + RC_GF_BREAK_ROOM_CRATE_4, + RC_GF_NORTH_F1_CARPENTER_CRATE, + RC_GF_NORTH_F3_CARPENTER_CRATE, + RC_GF_SOUTH_F2_CARPENTER_CRATE_1, + RC_GF_SOUTH_F2_CARPENTER_CRATE_2, + RC_HW_BEFORE_QUICKSAND_CRATE, + RC_HW_AFTER_QUICKSAND_CRATE_1, + RC_HW_AFTER_QUICKSAND_CRATE_2, + RC_HW_AFTER_QUICKSAND_CRATE_3, + RC_HW_NEAR_COLOSSUS_CRATE, + RC_MK_NEAR_BAZAAR_CRATE_1, + RC_MK_NEAR_BAZAAR_CRATE_2, + RC_MK_SHOOTING_GALLERY_CRATE_1, + RC_MK_SHOOTING_GALLERY_CRATE_2, + RC_MK_LOST_DOG_HOUSE_CRATE, + RC_MK_GUARD_HOUSE_CRATE_1, + RC_MK_GUARD_HOUSE_CRATE_2, + RC_MK_GUARD_HOUSE_CRATE_3, + RC_MK_GUARD_HOUSE_CRATE_4, + RC_MK_GUARD_HOUSE_CRATE_5, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RC_KAK_NEAR_GY_CHILD_CRATE, + RC_KAK_NEAR_WINDMILL_CHILD_CRATE, + RC_KAK_NEAR_FENCE_CHILD_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RC_KAK_NEAR_BAZAAR_CHILD_CRATE, + RC_GRAVEYARD_CRATE, + RC_GC_MAZE_CRATE, + RC_DMC_CRATE, + RC_LLR_NEAR_TREE_CRATE, + RC_LH_LAB_CRATE, + + // MQ Dungeon Crates + RC_DEKU_TREE_MQ_LOBBY_CRATE, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + + // Dungeon Small Crates + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + + // MQ Dungeon Small Crates + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + // End Crates RC_PIERRE, RC_DELIVER_RUTOS_LETTER, @@ -5120,6 +5383,29 @@ typedef enum { RHT_POT_GANONS_CASTLE, RHT_POT_BOTTOM_OF_THE_WELL, RHT_POT_ICE_CAVERN, + // Shuffle Crates + RHT_CRATE_GERUDO_VALLEY, + RHT_CRATE_GERUDOS_FORTRESS, + RHT_CRATE_THIEVES_HIDEOUT, + RHT_CRATE_WASTELAND, + RHT_CRATE_MARKET, + RHT_CRATE_DOG_LADY_HOUSE, + RHT_CRATE_MARKET_GUARD_HOUSE, + RHT_CRATE_KAKARIKO_VILLAGE, + RHT_CRATE_GRAVEYARD, + RHT_CRATE_GORON_CITY, + RHT_CRATE_DEATH_MOUNTAIN_CRATER, + RHT_CRATE_LON_LON_RANCH, + RHT_CRATE_LAKESIDE_LABORATORY, + RHT_CRATE_DEKU_TREE, + RHT_CRATE_DODONGOS_CAVERN, + RHT_CRATE_JABU_JABU, + RHT_CRATE_FOREST_TEMPLE, + RHT_CRATE_FIRE_TEMPLE, + RHT_CRATE_WATER_TEMPLE, + RHT_CRATE_SPIRIT_TEMPLE, + RHT_CRATE_SHADOW_TEMPLE, + RHT_CRATE_GERUDO_TRAINING_GROUND, // Ganon Line RHT_GANON_JOKE01, RHT_GANON_JOKE02, @@ -5458,6 +5744,7 @@ typedef enum { RSK_SHUFFLE_WEIRD_EGG, RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, RSK_SHUFFLE_POTS, + RSK_SHUFFLE_CRATES, RSK_SHUFFLE_FROG_SONG_RUPEES, RSK_ITEM_POOL, RSK_ICE_TRAPS, @@ -5946,6 +6233,14 @@ typedef enum { RO_SHUFFLE_GRASS_ALL, } RandoOptionShuffleGrass; +// Shuffle Crates settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_CRATES_OFF, + RO_SHUFFLE_CRATES_DUNGEONS, + RO_SHUFFLE_CRATES_OVERWORLD, + RO_SHUFFLE_CRATES_ALL, +} RandoOptionShuffleCrates; + //Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, @@ -6046,6 +6341,16 @@ typedef struct GrassIdentity { RandomizerCheck randomizerCheck; } GrassIdentity; +typedef struct CrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} CrateIdentity; + +typedef struct SmallCrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} SmallCrateIdentity; + typedef enum { TRACKER_WINDOW_FLOATING, TRACKER_WINDOW_WINDOW, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 9333913a4..55a8deaa7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -173,6 +173,9 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_NLCRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_SMALL_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 7d531cb24..0023204ef 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -61,6 +61,8 @@ bool showOverworldPots; bool showDungeonPots; bool showOverworldGrass; bool showDungeonGrass; +bool showOverworldCrates; +bool showDungeonCrates; bool showFrogSongRupees; bool showFairies; bool showStartingMapsCompasses; @@ -1290,6 +1292,25 @@ void LoadSettings() { showDungeonGrass = false; break; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_CRATES)) { + case RO_SHUFFLE_CRATES_ALL: + showOverworldCrates = true; + showDungeonCrates = true; + break; + case RO_SHUFFLE_CRATES_OVERWORLD: + showOverworldCrates = true; + showDungeonCrates = false; + break; + case RO_SHUFFLE_CRATES_DUNGEONS: + showOverworldCrates = false; + showDungeonCrates = true; + break; + default: + showOverworldCrates = false; + showDungeonCrates = false; + break; + } } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; @@ -1297,6 +1318,8 @@ void LoadSettings() { showDungeonPots = false; showOverworldGrass = false; showDungeonGrass = false; + showOverworldCrates = false; + showDungeonCrates = false; } fortressFast = false; @@ -1380,6 +1403,17 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_GRASS || (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_NLCRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea()) && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == + RO_LOGIC_NO_LOGIC) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_SMALL_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_COW || showCows) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index f061be660..70aa11c06 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -745,6 +745,260 @@ typedef enum { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, + RAND_INF_GV_FREESTANDING_POH_CRATE, + RAND_INF_GV_NEAR_COW_CRATE, + RAND_INF_GV_CRATE_BRIDGE_1, + RAND_INF_GV_CRATE_BRIDGE_2, + RAND_INF_GV_CRATE_BRIDGE_3, + RAND_INF_GV_CRATE_BRIDGE_4, + RAND_INF_GF_ABOVE_JAIL_CRATE, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, + RAND_INF_GF_ARCHERY_RANGE_CRATE_1, + RAND_INF_GF_ARCHERY_RANGE_CRATE_2, + RAND_INF_GF_ARCHERY_RANGE_CRATE_3, + RAND_INF_GF_ARCHERY_RANGE_CRATE_4, + RAND_INF_GF_ARCHERY_RANGE_CRATE_5, + RAND_INF_GF_ARCHERY_RANGE_CRATE_6, + RAND_INF_GF_ARCHERY_RANGE_CRATE_7, + RAND_INF_GF_ARCHERY_START_CRATE_1, + RAND_INF_GF_ARCHERY_START_CRATE_2, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, + RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, + RAND_INF_GF_KITCHEN_CRATE_1, + RAND_INF_GF_KITCHEN_CRATE_2, + RAND_INF_GF_KITCHEN_CRATE_3, + RAND_INF_GF_KITCHEN_CRATE_4, + RAND_INF_GF_KITCHEN_CRATE_5, + RAND_INF_GF_BREAK_ROOM_CRATE_1, + RAND_INF_GF_BREAK_ROOM_CRATE_2, + RAND_INF_GF_BREAK_ROOM_CRATE_3, + RAND_INF_GF_BREAK_ROOM_CRATE_4, + RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, + RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, + RAND_INF_HW_BEFORE_QUICKSAND_CRATE, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, + RAND_INF_HW_NEAR_COLOSSUS_CRATE, + RAND_INF_MK_NEAR_BAZAAR_CRATE_1, + RAND_INF_MK_NEAR_BAZAAR_CRATE_2, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, + RAND_INF_MK_LOST_DOG_HOUSE_CRATE, + RAND_INF_MK_GUARD_HOUSE_CRATE_1, + RAND_INF_MK_GUARD_HOUSE_CRATE_2, + RAND_INF_MK_GUARD_HOUSE_CRATE_3, + RAND_INF_MK_GUARD_HOUSE_CRATE_4, + RAND_INF_MK_GUARD_HOUSE_CRATE_5, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RAND_INF_KAK_NEAR_GY_CHILD_CRATE, + RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, + RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, + RAND_INF_GRAVEYARD_CRATE, + RAND_INF_GC_MAZE_CRATE, + RAND_INF_DMC_CRATE, + RAND_INF_LLR_NEAR_TREE_CRATE, + RAND_INF_LH_LAB_CRATE, + + RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_CAUGHT_LOACH, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index ba049b32c..8ade6a95a 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -210,6 +210,7 @@ void Settings::CreateOptions() { OPT_BOOL(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, "Shuffle Gerudo Membership Card", CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]); OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF); OPT_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_OFF); + OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WidgetType::Combobox, RO_SHUFFLE_CRATES_OFF); OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); OPT_U8(RSK_SHUFFLE_MERCHANTS, "Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE); OPT_U8(RSK_MERCHANT_PRICES, "Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); @@ -662,6 +663,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_MERCHANT_PRICES], &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], @@ -902,6 +904,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], &mOptions[RSK_SHUFFLE_OCARINA], &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 1ce04687c..fe2e6441b 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -52,6 +52,7 @@ class StaticData { static void RegisterPotLocations(); static void RegisterFreestandingLocations(); static void RegisterGrassLocations(); + static void RegisterCrateLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c index 16e27e39e..18218355f 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c +++ b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c @@ -7,6 +7,7 @@ #include "z_obj_kibako.h" #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_CAN_PRESS_SWITCHES) @@ -68,7 +69,7 @@ void ObjKibako_SpawnCollectible(ObjKibako* this, PlayState* play) { s16 collectible; collectible = this->actor.params & 0x1F; - if ((collectible >= 0) && (collectible <= 0x19)) { + if (GameInteractor_Should(VB_SMALL_CRATE_DROP_ITEM,(collectible >= 0) && (collectible <= 0x19), this)) { Item_DropCollectible(play, &this->actor.world.pos, collectible | (((this->actor.params >> 8) & 0x3F) << 8)); } @@ -284,5 +285,9 @@ void ObjKibako_Draw(Actor* thisx, PlayState* play) { s32 pad; ObjKibako* this = (ObjKibako*)thisx; + if (!GameInteractor_Should(VB_SMALL_CRATE_SETUP_DRAW, true, thisx)) { + return; + } + Gfx_DrawDListOpa(play, gSmallWoodenBoxDL); } diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h index 68e871c78..32a35563f 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h @@ -12,6 +12,7 @@ typedef struct ObjKibako { /* 0x0000 */ Actor actor; /* 0x014C */ ObjKibakoActionFunc actionFunc; /* 0x0150 */ ColliderCylinder collider; + /* */ SmallCrateIdentity smallCrateIdentity; } ObjKibako; // size = 0x019C #endif diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c index d6452d253..e4008ebed 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c +++ b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c @@ -7,6 +7,7 @@ #include "z_obj_kibako2.h" #include "objects/object_kibako2/object_kibako2.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -110,7 +111,7 @@ void ObjKibako2_SpawnCollectible(ObjKibako2* this, PlayState* play) { collectibleFlagTemp = this->collectibleFlag; itemDropped = this->dyna.actor.home.rot.x; - if (itemDropped >= 0 && itemDropped < 0x1A) { + if (GameInteractor_Should(VB_CRATE_DROP_ITEM,itemDropped >= 0 && itemDropped < 0x1A, this)) { Item_DropCollectible(play, &this->dyna.actor.world.pos, itemDropped | (collectibleFlagTemp << 8)); } } @@ -176,5 +177,9 @@ void ObjKibako2_Update(Actor* thisx, PlayState* play) { } void ObjKibako2_Draw(Actor* thisx, PlayState* play) { + if (!GameInteractor_Should(VB_CRATE_SETUP_DRAW, true, thisx)) { + return; + } + Gfx_DrawDListOpa(play, gLargeCrateDL); } diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h index 48c22154f..7629e6aa1 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h @@ -13,6 +13,7 @@ typedef struct ObjKibako2 { /* 0x0164 */ ColliderCylinder collider; /* 0x01B0 */ ObjKibako2ActionFunc actionFunc; /* 0x01B4 */ s16 collectibleFlag; + /* */ CrateIdentity crateIdentity; } ObjKibako2; // size = 0x01B8 #endif From 057434cdf34f38c8a087bf526bf62e67c8e713a3 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 26 Mar 2025 22:26:11 +0100 Subject: [PATCH 12/12] Update Dev Tools Windows (#5220) * Update dev tools windows * Review comments --- .../{sohConsole.cpp => SohConsoleWindow.cpp} | 2 +- .../{sohConsole.h => SohConsoleWindow.h} | 0 ...xDebugger.cpp => SohGfxDebuggerWindow.cpp} | 2 +- ...ohGfxDebugger.h => SohGfxDebuggerWindow.h} | 0 .../Enhancements/debugger/SohStatsWindow.cpp | 24 +++++++++++++++++++ .../Enhancements/debugger/SohStatsWindow.h | 17 +++++++++++++ soh/soh/SohGui/SohGui.cpp | 10 ++++---- soh/soh/SohGui/SohGui.hpp | 5 ++-- soh/soh/SohGui/SohMenuDevTools.cpp | 4 ++-- 9 files changed, 52 insertions(+), 12 deletions(-) rename soh/soh/Enhancements/debugger/{sohConsole.cpp => SohConsoleWindow.cpp} (97%) rename soh/soh/Enhancements/debugger/{sohConsole.h => SohConsoleWindow.h} (100%) rename soh/soh/Enhancements/debugger/{sohGfxDebugger.cpp => SohGfxDebuggerWindow.cpp} (91%) rename soh/soh/Enhancements/debugger/{sohGfxDebugger.h => SohGfxDebuggerWindow.h} (100%) create mode 100644 soh/soh/Enhancements/debugger/SohStatsWindow.cpp create mode 100644 soh/soh/Enhancements/debugger/SohStatsWindow.h diff --git a/soh/soh/Enhancements/debugger/sohConsole.cpp b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp similarity index 97% rename from soh/soh/Enhancements/debugger/sohConsole.cpp rename to soh/soh/Enhancements/debugger/SohConsoleWindow.cpp index 686152a1f..d5090e7e5 100644 --- a/soh/soh/Enhancements/debugger/sohConsole.cpp +++ b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp @@ -1,4 +1,4 @@ -#include "sohConsole.h" +#include "SohConsoleWindow.h" #include "soh/OTRGlobals.h" #include "soh/SohGui/UIWidgets.hpp" #include "soh/SohGui/SohGui.hpp" diff --git a/soh/soh/Enhancements/debugger/sohConsole.h b/soh/soh/Enhancements/debugger/SohConsoleWindow.h similarity index 100% rename from soh/soh/Enhancements/debugger/sohConsole.h rename to soh/soh/Enhancements/debugger/SohConsoleWindow.h diff --git a/soh/soh/Enhancements/debugger/sohGfxDebugger.cpp b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp similarity index 91% rename from soh/soh/Enhancements/debugger/sohGfxDebugger.cpp rename to soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp index 20b37ca93..06d81577d 100644 --- a/soh/soh/Enhancements/debugger/sohGfxDebugger.cpp +++ b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp @@ -1,4 +1,4 @@ -#include "sohGfxDebugger.h" +#include "SohGfxDebuggerWindow.h" #include "soh/OTRGlobals.h" void SohGfxDebuggerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/sohGfxDebugger.h b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.h similarity index 100% rename from soh/soh/Enhancements/debugger/sohGfxDebugger.h rename to soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.h diff --git a/soh/soh/Enhancements/debugger/SohStatsWindow.cpp b/soh/soh/Enhancements/debugger/SohStatsWindow.cpp new file mode 100644 index 000000000..56f81bee4 --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohStatsWindow.cpp @@ -0,0 +1,24 @@ +#include "SohStatsWindow.h" +#include "soh/OTRGlobals.h" + +void SohStatsWindow::DrawElement() { + const float framerate = ImGui::GetIO().Framerate; + const float deltatime = ImGui::GetIO().DeltaTime; + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + +#if defined(_WIN32) + ImGui::Text("Platform: Windows"); +#elif defined(__IOS__) + ImGui::Text("Platform: iOS"); +#elif defined(__APPLE__) + ImGui::Text("Platform: macOS"); +#elif defined(__linux__) + ImGui::Text("Platform: Linux"); +#else + ImGui::Text("Platform: Unknown"); +#endif + ImGui::Text("Status: %.3f ms/frame (%.1f FPS)", deltatime * 1000.0f, framerate); + ImGui::PopStyleColor(); + ImGui::PopFont(); +} diff --git a/soh/soh/Enhancements/debugger/SohStatsWindow.h b/soh/soh/Enhancements/debugger/SohStatsWindow.h new file mode 100644 index 000000000..d68953573 --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohStatsWindow.h @@ -0,0 +1,17 @@ +#ifndef SOH_STATS_H +#define SOH_STATS_H + +#include + +class SohStatsWindow : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; + ~SohStatsWindow() {}; + + protected: + void InitElement() override {}; + void DrawElement() override; + void UpdateElement() override {}; +}; + +#endif // SOH_STATS_H diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index 213efcfd4..87be00c98 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -68,7 +68,7 @@ namespace SohGui { std::shared_ptr mSohMenuBar; std::shared_ptr mConsoleWindow; - std::shared_ptr mStatsWindow; + std::shared_ptr mStatsWindow; std::shared_ptr mGfxDebuggerWindow; std::shared_ptr mInputEditorWindow; @@ -120,17 +120,15 @@ namespace SohGui { mSohMenu = std::make_shared(CVAR_WINDOW("Menu"), "Port Menu"); gui->SetMenu(mSohMenu); - mStatsWindow = gui->GetGuiWindow("Stats"); - if (mStatsWindow == nullptr) { - SPDLOG_ERROR("Could not find stats window"); - } - mConsoleWindow = std::make_shared(CVAR_WINDOW("SohConsole"), "Console##SoH", ImVec2(820, 630)); gui->AddGuiWindow(mConsoleWindow); mGfxDebuggerWindow = std::make_shared(CVAR_WINDOW("SohGfxDebugger"), "GfxDebugger##SoH", ImVec2(820, 630)); gui->AddGuiWindow(mGfxDebuggerWindow); + mStatsWindow = std::make_shared(CVAR_WINDOW("SohStats"), "Stats##Soh", ImVec2(400, 100)); + gui->AddGuiWindow(mStatsWindow); + mInputEditorWindow = gui->GetGuiWindow("Controller Configuration"); if (mInputEditorWindow == nullptr) { SPDLOG_ERROR("Could not find input editor window"); diff --git a/soh/soh/SohGui/SohGui.hpp b/soh/soh/SohGui/SohGui.hpp index 35c93b353..b1d278e06 100644 --- a/soh/soh/SohGui/SohGui.hpp +++ b/soh/soh/SohGui/SohGui.hpp @@ -18,8 +18,9 @@ #include "soh/Enhancements/debugger/debugSaveEditor.h" #include "soh/Enhancements/debugger/hookDebugger.h" #include "soh/Enhancements/debugger/dlViewer.h" -#include "soh/Enhancements/debugger/sohConsole.h" -#include "soh/Enhancements/debugger/sohGfxDebugger.h" +#include "soh/Enhancements/debugger/SohConsoleWindow.h" +#include "soh/Enhancements/debugger/SohGfxDebuggerWindow.h" +#include "soh/Enhancements/debugger/SohStatsWindow.h" #include "soh/Enhancements/debugger/valueViewer.h" #include "soh/Enhancements/gameplaystatswindow.h" #include "soh/Enhancements/randomizer/randomizer_check_tracker.h" diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index e6a757f21..3a769aea4 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -90,8 +90,8 @@ void SohMenu::AddMenuDevTools() { path.sidebarName = "Stats"; AddSidebarEntry("Dev Tools", path.sidebarName, 1); AddWidget(path, "Popout Stats Window", WIDGET_WINDOW_BUTTON) - .CVar(CVAR_WINDOW("Stats")) - .WindowName("Stats") + .CVar(CVAR_WINDOW("SohStats")) + .WindowName("Stats##Soh") .Options(WindowButtonOptions().Tooltip("Enables the separate Stats Window.")); // Console