From 89f1c6c71f93f01764e8e1f2a655041c54fe0c74 Mon Sep 17 00:00:00 2001 From: gymnast86 Date: Wed, 22 Apr 2026 03:47:14 -0700 Subject: [PATCH] ordon freestanding rupees --- src/d/actor/d_a_obj_item.cpp | 145 +++++++++++----- src/d/actor/d_a_tbox.cpp | 5 +- src/dusk/imgui/ImGuiMenuRandomizer.cpp | 118 ++++++------- .../randomizer/game/randomizer_context.cpp | 21 +++ .../randomizer/game/randomizer_context.hpp | 1 + .../generator/data/actor_patches.yaml | 133 +++++++++++---- .../randomizer/generator/data/locations.yaml | 155 ++++++++++++------ 7 files changed, 396 insertions(+), 182 deletions(-) diff --git a/src/d/actor/d_a_obj_item.cpp b/src/d/actor/d_a_obj_item.cpp index bf2865afa4..256de105f2 100644 --- a/src/d/actor/d_a_obj_item.cpp +++ b/src/d/actor/d_a_obj_item.cpp @@ -5,17 +5,22 @@ #include "d/dolzel.h" // IWYU pragma: keep -#include "d/actor/d_a_obj_item.h" #include "SSystem/SComponent/c_math.h" -#include "d/d_a_itembase_static.h" +#include "d/actor/d_a_obj_item.h" #include "d/actor/d_a_player.h" +#include "d/d_a_itembase_static.h" #include "d/d_com_inf_game.h" #include "d/d_item.h" #include "d/d_item_data.h" #include "d/d_s_play.h" +#include "dusk/randomizer/game/verify_item_functions.h" #include "f_op/f_op_camera_mng.h" #include "m_Do/m_Do_mtx.h" +#if TARGET_PC +#include "dusk/randomizer/game/tools.h" +#endif + static f32 Reflect(cXyz* i_vec, cBgS_PolyInfo const& i_polyinfo, f32 i_scale) { cM3dGPla plane; @@ -228,11 +233,7 @@ void daItem_c::CreateInit() { initBaseMtx(); animPlay(1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); -#if TARGET_PC - if (m_itemNo == dItemNo_BOOMERANG_e && !randomizer_IsActive()) { -#else - if (m_itemNo == dItemNo_BOOMERANG_e) { -#endif + if (m_itemNo == dItemNo_BOOMERANG_e IF_DUSK(&& !randomizer_IsActive())) { itemGetNextExecute(); } else if ((m_itemNo == dItemNo_ORANGE_RUPEE_e || m_itemNo == dItemNo_SILVER_RUPEE_e) && mSparkleEmtr.getEmitter() == NULL) @@ -293,6 +294,23 @@ int daItem_c::_daItem_create() { field_0x95d = true; } +#if TARGET_PC + if (randomizer_IsActive()) { + u32 params = fopAcM_GetParam(this); + u8 flag = daItem_prm::getItemBitNo(this); + u8 stageIdx = getStageID(); + const auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides; + // If we found an override for this freestanding item + if (freestandingOverrides.contains(stageIdx) && freestandingOverrides.at(stageIdx).contains(flag)) { + // Clear the itemId and set it to out new itemId + params &= 0xFFFFFF00; + u8 newItemId = freestandingOverrides.at(stageIdx).at(flag); + params |= verifyProgressiveItem(newItemId); + fopAcM_SetParam(this, params); + } + } +#endif + m_itemNo = daItem_prm::getItemNo(this); BOOL flag = dItem_data::chkFlag(m_itemNo, 2); @@ -835,49 +853,90 @@ void daItem_c::itemGetNextExecute() { setFlag(FLAG_INIT_GET_ITEM_e); BOOL haveItem = false; - switch (m_itemNo) { - case dItemNo_HEART_e: - case dItemNo_GREEN_RUPEE_e: - case dItemNo_ARROW_10_e: - case dItemNo_ARROW_20_e: - case dItemNo_ARROW_30_e: - case dItemNo_ARROW_1_e: - procInitSimpleGetDemo(); - itemGet(); - break; - case dItemNo_BLUE_RUPEE_e: - case dItemNo_YELLOW_RUPEE_e: - case dItemNo_RED_RUPEE_e: - case dItemNo_PURPLE_RUPEE_e: - case dItemNo_ORANGE_RUPEE_e: - case dItemNo_SILVER_RUPEE_e: - case dItemNo_PACHINKO_SHOT_e: - if (daPy_getPlayerActorClass()->checkCanoeRide() || - daPy_getPlayerActorClass()->checkHorseRide()) - { - if (checkItemGet(m_itemNo, 1)) { - haveItem = true; - } - procInitSimpleGetDemo(); - itemGet(); +#if TARGET_PC + // Randomizer specific stuff for choosing if to play a demo or not + // Just copying the whole switch statement here and modifying it + // is better than littering the original switch statement with #if TARGET_PC + if (randomizer_IsActive()) { + switch (m_itemNo) { + case dItemNo_BLUE_RUPEE_e: + case dItemNo_YELLOW_RUPEE_e: + case dItemNo_RED_RUPEE_e: + case dItemNo_PURPLE_RUPEE_e: + case dItemNo_ORANGE_RUPEE_e: + case dItemNo_SILVER_RUPEE_e: + case dItemNo_PACHINKO_SHOT_e: + if (daPy_getPlayerActorClass()->checkCanoeRide() || + daPy_getPlayerActorClass()->checkHorseRide()) + { + if (checkItemGet(m_itemNo, 1)) { + haveItem = true; + } + procInitSimpleGetDemo(); + itemGet(); - if (!haveItem) { - dComIfGs_offItemFirstBit(m_itemNo); + if (!haveItem) { + dComIfGs_offItemFirstBit(m_itemNo); + } + } else if (!checkItemGet(m_itemNo, 1)) { + procInitGetDemoEvent(); + } else { + procInitSimpleGetDemo(); + itemGet(); } - } else if (!checkItemGet(m_itemNo, 1)) { + break; + default: procInitGetDemoEvent(); - } else { + break; + } + } else { +#endif + switch (m_itemNo) { + case dItemNo_HEART_e: + case dItemNo_GREEN_RUPEE_e: + case dItemNo_ARROW_10_e: + case dItemNo_ARROW_20_e: + case dItemNo_ARROW_30_e: + case dItemNo_ARROW_1_e: procInitSimpleGetDemo(); itemGet(); + break; + case dItemNo_BLUE_RUPEE_e: + case dItemNo_YELLOW_RUPEE_e: + case dItemNo_RED_RUPEE_e: + case dItemNo_PURPLE_RUPEE_e: + case dItemNo_ORANGE_RUPEE_e: + case dItemNo_SILVER_RUPEE_e: + case dItemNo_PACHINKO_SHOT_e: + if (daPy_getPlayerActorClass()->checkCanoeRide() || + daPy_getPlayerActorClass()->checkHorseRide()) + { + if (checkItemGet(m_itemNo, 1)) { + haveItem = true; + } + procInitSimpleGetDemo(); + itemGet(); + + if (!haveItem) { + dComIfGs_offItemFirstBit(m_itemNo); + } + } else if (!checkItemGet(m_itemNo, 1)) { + procInitGetDemoEvent(); + } else { + procInitSimpleGetDemo(); + itemGet(); + } + break; + case dItemNo_BOOMERANG_e: + procInitGetDemoEvent(); + break; + default: + // "[daItem_c] Get process not defined[%d]\n" + OS_REPORT_ERROR("[daItem_c]ゲット処理が定義されていません[%d]\n", m_itemNo); } - break; - case dItemNo_BOOMERANG_e: - procInitGetDemoEvent(); - break; - default: - // "[daItem_c] Get process not defined[%d]\n" - OS_REPORT_ERROR("[daItem_c]ゲット処理が定義されていません[%d]\n", m_itemNo); +#if TARGET_PC } +#endif fopAcM_onItem(this, mItemBitNo); mCcCyl.SetTgType(0); diff --git a/src/d/actor/d_a_tbox.cpp b/src/d/actor/d_a_tbox.cpp index 6bf7ba2710..8df31ee9e1 100644 --- a/src/d/actor/d_a_tbox.cpp +++ b/src/d/actor/d_a_tbox.cpp @@ -12,6 +12,8 @@ #include #include +#include "dusk/randomizer/game/verify_item_functions.h" + static const f32 l_cull_size_box[6] = { -150.0f, -10.0f, -150.0f, 150.0f, 300.0f, 100.0f }; static const cM3dGCylS l_cyl_info[3] = { @@ -1791,7 +1793,8 @@ cPhs_Step daTbox_c::create1st() { home.angle.z &= ~0xFF00; auto stage = dComIfGp_getStartStageName(); auto tboxId = static_cast(getTboxNo()); - home.angle.z |= randomizer_GetContext().mTreasureChestOverrides[stage][tboxId] << 8; + u8 itemId = randomizer_GetContext().mTreasureChestOverrides[stage][tboxId]; + home.angle.z |= verifyProgressiveItem(itemId) << 8; } #endif field_0x982 = home.angle.z; diff --git a/src/dusk/imgui/ImGuiMenuRandomizer.cpp b/src/dusk/imgui/ImGuiMenuRandomizer.cpp index 7aae97f2a5..5debd32330 100644 --- a/src/dusk/imgui/ImGuiMenuRandomizer.cpp +++ b/src/dusk/imgui/ImGuiMenuRandomizer.cpp @@ -63,6 +63,14 @@ namespace dusk { randoData.mTreasureChestOverrides[stage][tboxId] = itemId; } + // Rupee Overrides + if (location->HasCategories("Rupee - Freestanding")) { + u8 stage = metaData[0]["Stage"].as(); + u8 flag = metaData[0]["Flag"].as(); + u8 itemId = location->GetCurrentItem()->GetID(); + randoData.mFreestandingItemOverrides[stage][flag] = itemId; + } + // Items that we lookup just by calling their location name if (location->HasCategories("Location Name Lookup")) { const auto& locationName = metaData.as(); @@ -147,68 +155,66 @@ namespace dusk { for (const auto& roomNode : stageNode.second) { const auto& roomStr = roomNode.first.as(); u8 roomNo = roomStr.back() - '0'; - for (const auto& layerNode : roomNode.second) { - const auto& layerStr = layerNode.first.as(); - u8 layerNo = layerStr.back() - '0'; - // Create key based off of stage index, room, and layer - u32 stageRoomLayerKey{}; - stageRoomLayerKey |= getStageID(stageName.c_str()) << 16; - stageRoomLayerKey |= roomNo << 8; - stageRoomLayerKey |= layerNo; - for (const auto& actorNode : layerNode.second) { - using namespace Utility::Endian; - // Get all the data for the actor (with endian shenanigans) - stage_actor_data_class actor{}; - const auto& actorName = actorNode["name"].as(); - strncpy(actor.name, actorName.c_str(), 8); - actor.base.parameters = toPlatform(target, actorNode["parameters"].as()); - actor.base.position.x = toPlatform(target, actorNode["position"]["x"].as()); - actor.base.position.y = toPlatform(target, actorNode["position"]["y"].as()); - actor.base.position.z = toPlatform(target, actorNode["position"]["z"].as()); + for (const auto& actorNode : roomNode.second) { + using namespace Utility::Endian; + // Get all the data for the actor (with endian shenanigans) + stage_actor_data_class actor{}; + const auto& actorName = actorNode["name"].as(); + strncpy(actor.name, actorName.c_str(), 8); + actor.base.parameters = toPlatform(target, actorNode["parameters"].as()); + actor.base.position.x = toPlatform(target, actorNode["position"]["x"].as()); + actor.base.position.y = toPlatform(target, actorNode["position"]["y"].as()); + actor.base.position.z = toPlatform(target, actorNode["position"]["z"].as()); + // Have to retrieve as u16 and then cast as s16 because otherwise yaml-cpp + // complains about values over 32767 not fitting in s16 + actor.base.angle.x = toPlatform(target, static_cast(actorNode["angle"]["x"].as())); + actor.base.angle.y = toPlatform(target, static_cast(actorNode["angle"]["y"].as())); + actor.base.angle.z = toPlatform(target, static_cast(actorNode["angle"]["z"].as())); + + // Create unique hash based off of actor data + u32 actorCRC32 = getActorCRC32(&actor); + + // Then override the actor with whatever parts are being patched + const auto& patchNode = actorNode["patch"]; + if (patchNode["parameters"]) { + actor.base.parameters = toPlatform(target, patchNode["parameters"].as()); + } + if (auto patchPosition = patchNode["position"]) { + if (patchPosition["x"]) { + actor.base.position.x = toPlatform(target, patchPosition["x"].as()); + } + if (patchPosition["y"]) { + actor.base.position.y = toPlatform(target, patchPosition["y"].as()); + } + if (patchPosition["z"]) { + actor.base.position.z = toPlatform(target, patchPosition["z"].as()); + } + } + if (auto patchAngle = patchNode["angle"]) { // Have to retrieve as u16 and then cast as s16 because otherwise yaml-cpp // complains about values over 32767 not fitting in s16 - actor.base.angle.x = toPlatform(target, static_cast(actorNode["angle"]["x"].as())); - actor.base.angle.y = toPlatform(target, static_cast(actorNode["angle"]["y"].as())); - actor.base.angle.z = toPlatform(target, static_cast(actorNode["angle"]["z"].as())); - - - // Create unique hash based off of actor data - u32 actorCRC32 = getActorCRC32(&actor); - - // Then override the actor with whatever parts are being patched - const auto& patchNode = actorNode["patch"]; - if (patchNode["parameters"]) { - actor.base.parameters = toPlatform(target, patchNode["parameters"].as()); + if (patchAngle["x"]) { + actor.base.angle.x = toPlatform(target, static_cast(patchAngle["x"].as())); } - if (auto patchPosition = patchNode["position"]) { - if (patchPosition["x"]) { - actor.base.position.x = toPlatform(target, patchPosition["x"].as()); - } - if (patchPosition["y"]) { - actor.base.position.y = toPlatform(target, patchPosition["y"].as()); - } - if (patchPosition["z"]) { - actor.base.position.z = toPlatform(target, patchPosition["z"].as()); - } + if (patchAngle["y"]) { + actor.base.angle.y = toPlatform(target, static_cast(patchAngle["y"].as())); } - if (auto patchAngle = patchNode["angle"]) { - // Have to retrieve as u16 and then cast as s16 because otherwise yaml-cpp - // complains about values over 32767 not fitting in s16 - if (patchAngle["x"]) { - actor.base.angle.x = toPlatform(target, static_cast(patchAngle["x"].as())); - } - if (patchAngle["y"]) { - actor.base.angle.y = toPlatform(target, static_cast(patchAngle["y"].as())); - } - if (patchAngle["z"]) { - actor.base.angle.z = toPlatform(target, static_cast(patchAngle["z"].as())); - } + if (patchAngle["z"]) { + actor.base.angle.z = toPlatform(target, static_cast(patchAngle["z"].as())); } + } - // Insert the actor patch into the context with our crc32 as the key and the - // raw actor patch data as the value - std::array patchedActorData{}; - std::memcpy(patchedActorData.data(), &actor, RandomizerContext::ACTOR_CRC_SIZE); + // Insert the actor patch into the context with our crc32 as the key and the + // raw actor patch data as the value + std::array patchedActorData{}; + std::memcpy(patchedActorData.data(), &actor, RandomizerContext::ACTOR_CRC_SIZE); + for (const auto& layerNode : actorNode["layers"]) { + u8 layerNo = layerNode.as(); + // Create key based off of stage index, room, and layer + u32 stageRoomLayerKey{}; + stageRoomLayerKey |= getStageID(stageName.c_str()) << 16; + stageRoomLayerKey |= roomNo << 8; + stageRoomLayerKey |= layerNo; randoData.mActorPatches[stageRoomLayerKey][actorCRC32] = patchedActorData; } } diff --git a/src/dusk/randomizer/game/randomizer_context.cpp b/src/dusk/randomizer/game/randomizer_context.cpp index f51033866e..fdcca75269 100644 --- a/src/dusk/randomizer/game/randomizer_context.cpp +++ b/src/dusk/randomizer/game/randomizer_context.cpp @@ -55,6 +55,12 @@ std::optional RandomizerContext::WriteToFile() { } } + for (const auto& [stageIdx, itemOverride] : this->mFreestandingItemOverrides) { + for (const auto& [flag, itemId] : itemOverride) { + out["mFreestandingItemOverrides"][static_cast(stageIdx)][static_cast(flag)] = static_cast(itemId); + } + } + out["mItemLocations"] = this->mItemLocations; out["mStartHour"] = static_cast(this->mStartHour); @@ -116,6 +122,21 @@ std::optional RandomizerContext::LoadFromHash(const std::string& ha } } + // Freestanding overrides + for (const auto& stageNode : in["mFreestandingItemOverrides"]) { + const auto& stageIdx = stageNode.first.as(); + // Single nodes with a zero in their key will get dumped as sequences + if (stageNode.second.IsSequence()) { + this->mFreestandingItemOverrides[stageIdx][0] = stageNode.second[0].as(); + } else { + for (const auto& flagItemPair : stageNode.second) { + auto flag = flagItemPair.first.as(); + auto itemId = flagItemPair.second.as(); + this->mFreestandingItemOverrides[stageIdx][flag] = itemId; + } + } + } + // Items For Present Demos for (const auto& locationNode : in["mItemLocations"]) { const auto& locationName = locationNode.first.as(); diff --git a/src/dusk/randomizer/game/randomizer_context.hpp b/src/dusk/randomizer/game/randomizer_context.hpp index 0ddaf7bf54..63829216cd 100644 --- a/src/dusk/randomizer/game/randomizer_context.hpp +++ b/src/dusk/randomizer/game/randomizer_context.hpp @@ -26,6 +26,7 @@ public: std::list mStartingInventory{}; std::unordered_map> mTreasureChestOverrides{}; std::unordered_map> mPoeOverrides{}; + std::unordered_map> mFreestandingItemOverrides{}; std::unordered_map mItemLocations{}; u8 mStartHour{0}; u8 mMapBits{}; diff --git a/src/dusk/randomizer/generator/data/actor_patches.yaml b/src/dusk/randomizer/generator/data/actor_patches.yaml index 6d8100f23d..1554eeaacb 100644 --- a/src/dusk/randomizer/generator/data/actor_patches.yaml +++ b/src/dusk/randomizer/generator/data/actor_patches.yaml @@ -4,35 +4,108 @@ # Ordon Village F_SP103: - Room 0: - Layer 0: - # Bo's House left Door - - name: kdoor - parameters: 0x88000627 - position: - x: 470.48294 - y: 500.19 - z: 5323.129 + Room 0: # Main Village + # Bo's House left Door + - name: kdoor + parameters: 0x88000627 + position: + x: 470.48294 + y: 500.19 + z: 5323.129 + angle: + x: 0x0191 + y: 0x3777 + z: 0xFFFF + patch: + # Set angle.x to -1 so the door isn't locked angle: - x: 0x0191 - y: 0x3777 - z: 0xFFFF - patch: - # Set angle.x to -1 so the door isn't locked - angle: - x: 0xFFFF - # Bo's House right door - - name: kdoor - parameters: 0x94000627 - position: - x: 500.71118 - y: 500.19 - z: 5172.267 + x: 0xFFFF + layers: + - 0 + + # Bo's House right door + - name: kdoor + parameters: 0x94000627 + position: + x: 500.71118 + y: 500.19 + z: 5172.267 + angle: + x: 0x0191 + y: 0xB778 + z: 0xFFFF + patch: + # Set angle.x to -1 so the door isn't locked angle: - x: 0x0191 - y: 0xB778 - z: 0xFFFF - patch: - # Set angle.x to -1 so the door isn't locked - angle: - x: 0xFFFF \ No newline at end of file + x: 0xFFFF + layers: + - 0 + + # Rupee on Rusl's House (they both share the same flag, this gives one a different flag) + - name: item + parameters: 0xF3FF8103 + position: + x: -4739.0400390625 + y: 1155.98303222656 + z: 2239.53588867187 + angle: + x: 0x0000 + y: 0x3333 + z: 0x003F + patch: + # Give this item a unique flag + parameters: 0xF3FF8403 + layers: + - 0 + - 5 + + # Rupee above Haunch's House (also flag sharing situation) + - name: item + parameters: 0xF3FF8701 + position: + x: -1819.2646484375 + y: 984.098937988281 + z: 1665.06237792969 + angle: + x: 0x0000 + y: 0x3333 + z: 0x003F + patch: + # Give this item a unique flag + parameters: 0xF3FF8501 + layers: + - 0 + + # Rupee by Bo's Window (also flag sharing situation) + - name: item + parameters: 0xF3FF8601 + position: + x: 590.097839355469 + y: 1158.02856445312 + z: 5215.7802734375 + angle: + x: 0x0000 + y: 0x3333 + z: 0x003F + patch: + # Give this item a unique flag + parameters: 0xF3FF8A01 + layers: + - 0 + + # Rupee in Ordon River (also flag sharing situation) + - name: item + parameters: 0x13FF9501 + position: + x: -4326.0654296875 + y: 28.7633323669434 + z: 4208.9892578125 + angle: + x: 0x0000 + y: 0x999A + z: 0x003F + patch: + # Give this item a unique flag + parameters: 0x13FF9101 + layers: + - 0 \ No newline at end of file diff --git a/src/dusk/randomizer/generator/data/locations.yaml b/src/dusk/randomizer/generator/data/locations.yaml index b4ff43956b..d7737b1161 100644 --- a/src/dusk/randomizer/generator/data/locations.yaml +++ b/src/dusk/randomizer/generator/data/locations.yaml @@ -82,7 +82,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x80 - Name: Ordon Bo Roof Rupee Original Item: Yellow Rupee @@ -91,7 +92,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x8B - Name: Ordon Bo Window Rupee 1 Original Item: Green Rupee @@ -100,7 +102,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x8A - Name: Ordon Bo Window Rupee 2 Original Item: Green Rupee @@ -109,7 +112,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x86 - Name: Ordon Hidden Rusl House Rupee Original Item: Orange Rupee @@ -118,7 +122,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x88 - Name: Ordon Rupee In Grass By Bo Original Item: Green Rupee @@ -127,7 +132,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x96 - Name: Ordon Rupee In River 1 Original Item: Green Rupee @@ -136,7 +142,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x95 - Name: Ordon Rupee In River 2 Original Item: Green Rupee @@ -145,7 +152,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x91 - Name: Ordon Rupee Under Bridge Original Item: Green Rupee @@ -154,7 +162,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x82 - Name: Ordon Rupee Under Tall Tree 1 Original Item: Green Rupee @@ -163,7 +172,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x87 - Name: Ordon Rupee Under Tall Tree 2 Original Item: Green Rupee @@ -172,7 +182,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x85 - Name: Ordon Rusl House Roof Rupee 1 Original Item: Yellow Rupee @@ -181,7 +192,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x84 - Name: Ordon Rusl House Roof Rupee 2 Original Item: Yellow Rupee @@ -190,7 +202,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x81 - Name: Ordon Shield House Ledge Grass Rupee Original Item: Purple Rupee @@ -199,7 +212,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x94 - Name: Ordon Tree Long Branch Rupee Original Item: Yellow Rupee @@ -208,7 +222,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x97 - Name: Ordon Tree Short Branch Rupee Original Item: Blue Rupee @@ -217,7 +232,8 @@ - Ordona Province - Rupee - Freestanding Metadata: - - None + - Stage: 43 + Flag: 0x89 - Name: Herding Goats Reward Original Item: Piece of Heart @@ -1365,7 +1381,8 @@ - Death Mountain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Death Mountain Volcano Ledge Rupee 2 Original Item: Yellow Rupee @@ -1374,7 +1391,8 @@ - Death Mountain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Death Mountain Volcano Ledge Rupee 3 Original Item: Yellow Rupee @@ -1383,7 +1401,8 @@ - Death Mountain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Death Mountain Volcano Pipe Ledge Rock Rupee Original Item: Yellow Rupee @@ -2863,7 +2882,8 @@ - Lake Hylia - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Lake Hylia Right Underwater Boulder Rupee Original Item: Green Rupee @@ -2881,7 +2901,8 @@ - Lake Hylia - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Lake Hylia Alcove Poe Original Item: Poe Soul @@ -3272,7 +3293,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Central Underwater Boulder Rupee Original Item: Blue Rupee @@ -3299,7 +3321,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Shortcut Lower Boulder Rupee Original Item: Blue Rupee @@ -3326,7 +3349,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Vine Ledge Rupee Original Item: Blue Rupee @@ -3335,7 +3359,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Waterfall Ledge Rupee Original Item: Blue Rupee @@ -3344,7 +3369,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Extinguish All Torches Chest Original Item: Purple Rupee @@ -3385,7 +3411,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Throne East Underwater Rupee Original Item: Yellow Rupee @@ -3394,7 +3421,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Throne Northwest Underwater Rupee Original Item: Yellow Rupee @@ -3403,7 +3431,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Throne South Underwater Rupee Original Item: Yellow Rupee @@ -3412,7 +3441,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Throne West Gate Underwater Rupee Original Item: Blue Rupee @@ -3421,7 +3451,8 @@ - Zoras Domain - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Zoras Domain Throne West Underwater Rupee Original Item: Yellow Rupee @@ -3429,10 +3460,11 @@ - Overworld - Zoras Domain - Rupee - Freestanding + Metadata: + - Stage: 0xFF + Flag: 0xFF # SNOWPEAK PROVINCE - Metadata: - - None - Name: Ashei Sketch Original Item: Asheis Sketch @@ -3533,7 +3565,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Bridge Ledge Middle Rupee Original Item: Green Rupee @@ -3542,7 +3575,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Bridge Ledge Upper Rupee Original Item: Green Rupee @@ -3551,7 +3585,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 1 Original Item: Green Rupee @@ -3560,7 +3595,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 2 Original Item: Green Rupee @@ -3569,7 +3605,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 3 Original Item: Green Rupee @@ -3578,7 +3615,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 4 Original Item: Green Rupee @@ -3587,7 +3625,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 5 Original Item: Red Rupee @@ -3596,7 +3635,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 6 Original Item: Green Rupee @@ -3605,7 +3645,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 7 Original Item: Green Rupee @@ -3614,7 +3655,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 8 Original Item: Green Rupee @@ -3623,7 +3665,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 9 Original Item: Green Rupee @@ -3632,7 +3675,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 10 Original Item: Green Rupee @@ -3641,7 +3685,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Shortcut Rupee 11 Original Item: Green Rupee @@ -3650,7 +3695,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Snowy Tree Top Rupee 1 Original Item: Blue Rupee @@ -3659,7 +3705,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Snowy Tree Top Rupee 2 Original Item: Red Rupee @@ -3668,7 +3715,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Snowy Tree Top Rupee 3 Original Item: Purple Rupee @@ -3677,7 +3725,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Top Left Rupee Original Item: Green Rupee @@ -3686,7 +3735,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF - Name: Snowboarding Top Right Rupee Original Item: Green Rupee @@ -3695,7 +3745,8 @@ - Snowpeak - Rupee - Freestanding Metadata: - - None + - Stage: 0xFF + Flag: 0xFF # DESERT PROVINCE