ordon freestanding rupees

This commit is contained in:
gymnast86
2026-04-22 03:47:14 -07:00
parent c801cb2a84
commit 89f1c6c71f
7 changed files with 396 additions and 182 deletions
+102 -43
View File
@@ -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);
+4 -1
View File
@@ -12,6 +12,8 @@
#include <cmath>
#include <cstring>
#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<u8>(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;
+62 -56
View File
@@ -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>();
u8 flag = metaData[0]["Flag"].as<u8>();
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<std::string>();
@@ -147,68 +155,66 @@ namespace dusk {
for (const auto& roomNode : stageNode.second) {
const auto& roomStr = roomNode.first.as<std::string>();
u8 roomNo = roomStr.back() - '0';
for (const auto& layerNode : roomNode.second) {
const auto& layerStr = layerNode.first.as<std::string>();
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<std::string>();
strncpy(actor.name, actorName.c_str(), 8);
actor.base.parameters = toPlatform(target, actorNode["parameters"].as<u32>());
actor.base.position.x = toPlatform(target, actorNode["position"]["x"].as<f32>());
actor.base.position.y = toPlatform(target, actorNode["position"]["y"].as<f32>());
actor.base.position.z = toPlatform(target, actorNode["position"]["z"].as<f32>());
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<std::string>();
strncpy(actor.name, actorName.c_str(), 8);
actor.base.parameters = toPlatform(target, actorNode["parameters"].as<u32>());
actor.base.position.x = toPlatform(target, actorNode["position"]["x"].as<f32>());
actor.base.position.y = toPlatform(target, actorNode["position"]["y"].as<f32>());
actor.base.position.z = toPlatform(target, actorNode["position"]["z"].as<f32>());
// 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<s16>(actorNode["angle"]["x"].as<u16>()));
actor.base.angle.y = toPlatform(target, static_cast<s16>(actorNode["angle"]["y"].as<u16>()));
actor.base.angle.z = toPlatform(target, static_cast<s16>(actorNode["angle"]["z"].as<u16>()));
// 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<u32>());
}
if (auto patchPosition = patchNode["position"]) {
if (patchPosition["x"]) {
actor.base.position.x = toPlatform(target, patchPosition["x"].as<f32>());
}
if (patchPosition["y"]) {
actor.base.position.y = toPlatform(target, patchPosition["y"].as<f32>());
}
if (patchPosition["z"]) {
actor.base.position.z = toPlatform(target, patchPosition["z"].as<f32>());
}
}
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<s16>(actorNode["angle"]["x"].as<u16>()));
actor.base.angle.y = toPlatform(target, static_cast<s16>(actorNode["angle"]["y"].as<u16>()));
actor.base.angle.z = toPlatform(target, static_cast<s16>(actorNode["angle"]["z"].as<u16>()));
// 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<u32>());
if (patchAngle["x"]) {
actor.base.angle.x = toPlatform(target, static_cast<s16>(patchAngle["x"].as<u16>()));
}
if (auto patchPosition = patchNode["position"]) {
if (patchPosition["x"]) {
actor.base.position.x = toPlatform(target, patchPosition["x"].as<f32>());
}
if (patchPosition["y"]) {
actor.base.position.y = toPlatform(target, patchPosition["y"].as<f32>());
}
if (patchPosition["z"]) {
actor.base.position.z = toPlatform(target, patchPosition["z"].as<f32>());
}
if (patchAngle["y"]) {
actor.base.angle.y = toPlatform(target, static_cast<s16>(patchAngle["y"].as<u16>()));
}
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<s16>(patchAngle["x"].as<u16>()));
}
if (patchAngle["y"]) {
actor.base.angle.y = toPlatform(target, static_cast<s16>(patchAngle["y"].as<u16>()));
}
if (patchAngle["z"]) {
actor.base.angle.z = toPlatform(target, static_cast<s16>(patchAngle["z"].as<u16>()));
}
if (patchAngle["z"]) {
actor.base.angle.z = toPlatform(target, static_cast<s16>(patchAngle["z"].as<u16>()));
}
}
// Insert the actor patch into the context with our crc32 as the key and the
// raw actor patch data as the value
std::array<u8, RandomizerContext::ACTOR_CRC_SIZE> 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<u8, RandomizerContext::ACTOR_CRC_SIZE> patchedActorData{};
std::memcpy(patchedActorData.data(), &actor, RandomizerContext::ACTOR_CRC_SIZE);
for (const auto& layerNode : actorNode["layers"]) {
u8 layerNo = layerNode.as<u8>();
// 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;
}
}
@@ -55,6 +55,12 @@ std::optional<std::string> RandomizerContext::WriteToFile() {
}
}
for (const auto& [stageIdx, itemOverride] : this->mFreestandingItemOverrides) {
for (const auto& [flag, itemId] : itemOverride) {
out["mFreestandingItemOverrides"][static_cast<u16>(stageIdx)][static_cast<u16>(flag)] = static_cast<u16>(itemId);
}
}
out["mItemLocations"] = this->mItemLocations;
out["mStartHour"] = static_cast<u16>(this->mStartHour);
@@ -116,6 +122,21 @@ std::optional<std::string> RandomizerContext::LoadFromHash(const std::string& ha
}
}
// Freestanding overrides
for (const auto& stageNode : in["mFreestandingItemOverrides"]) {
const auto& stageIdx = stageNode.first.as<u8>();
// 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<u8>();
} else {
for (const auto& flagItemPair : stageNode.second) {
auto flag = flagItemPair.first.as<u8>();
auto itemId = flagItemPair.second.as<u8>();
this->mFreestandingItemOverrides[stageIdx][flag] = itemId;
}
}
}
// Items For Present Demos
for (const auto& locationNode : in["mItemLocations"]) {
const auto& locationName = locationNode.first.as<std::string>();
@@ -26,6 +26,7 @@ public:
std::list<u8> mStartingInventory{};
std::unordered_map<std::string, std::unordered_map<u8, u8>> mTreasureChestOverrides{};
std::unordered_map<std::string, std::unordered_map<u8, u8>> mPoeOverrides{};
std::unordered_map<u8, std::unordered_map<u8, u8>> mFreestandingItemOverrides{};
std::unordered_map<std::string, int> mItemLocations{};
u8 mStartHour{0};
u8 mMapBits{};
@@ -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
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
+103 -52
View File
@@ -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