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 00000000000..4b055671e48
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/bosskey_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL
new file mode 100644
index 00000000000..c42484ebe6c
--- /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 00000000000..96b7903de90
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..1fd3a1f8b7d
--- /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 00000000000..bbcb5c4c97c
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..e0d09ffa485
--- /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 00000000000..a0af63d7fb3
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..9999462e6f0
--- /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 00000000000..6eea14d8ca3
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..8237aa0e73e
--- /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 00000000000..c1c8d6cfc89
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..17467a73bc8
--- /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 00000000000..6df8755b2f9
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..e3cc0ebe1de
--- /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 00000000000..692fd7ec322
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..dc73b60898b
--- /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 00000000000..88a23f0e7fb
--- /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 00000000000..1a288d21317
--- /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 00000000000..9b63c4a72de
--- /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 00000000000..f5b47bd092e
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/heart_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako/junk_crate_top b/soh/assets/custom/objects/object_kibako/junk_crate_top
new file mode 100644
index 00000000000..ef303867ccf
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/junk_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako/major_crate_top b/soh/assets/custom/objects/object_kibako/major_crate_top
new file mode 100644
index 00000000000..874104cf60a
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/major_crate_top differ
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 00000000000..4996f105484
--- /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 00000000000..f1df8a15cd0
--- /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 00000000000..85a1aef61af
--- /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 00000000000..ea7b5edf0bf
--- /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 00000000000..7a6580630e4
--- /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 00000000000..e8ff9db185d
--- /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 00000000000..593bf9e5483
--- /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 00000000000..f58840a2bcd
--- /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 00000000000..830d8ff65b3
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/minor_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako/rando_crate_top b/soh/assets/custom/objects/object_kibako/rando_crate_top
new file mode 100644
index 00000000000..2d211d61250
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/rando_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako/smallkey_crate_top b/soh/assets/custom/objects/object_kibako/smallkey_crate_top
new file mode 100644
index 00000000000..542dfb837df
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/smallkey_crate_top differ
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 00000000000..d4d5442860f
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/token_crate_top differ
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 00000000000..d5ec9241ab3
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/bosskey_crate_side differ
diff --git a/soh/assets/custom/objects/object_kibako2/bosskey_crate_top b/soh/assets/custom/objects/object_kibako2/bosskey_crate_top
new file mode 100644
index 00000000000..4b055671e48
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/bosskey_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL
new file mode 100644
index 00000000000..c5967488447
--- /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 00000000000..f43cacd886b
--- /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 00000000000..d877460d442
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..ce8bcb69fcc
--- /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 00000000000..64c96a3a348
--- /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 00000000000..ee780d50d5e
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..2d9c5974c18
--- /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 00000000000..a3a46e621f7
--- /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 00000000000..041d794d9f6
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..190005d99eb
--- /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 00000000000..867e166d7f6
--- /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 00000000000..5ab5bf39b95
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..d093960d59b
--- /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 00000000000..9ab4cdf9ae0
--- /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 00000000000..8a22d508b5d
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..b1c1ffd1fa4
--- /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 00000000000..3e87c23b19c
--- /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 00000000000..296988ca1b9
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..c4d711d10aa
--- /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 00000000000..126e0bde7c9
--- /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 00000000000..908b646bb75
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..b1b1269b91a
--- /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 00000000000..c02cd056d2a
--- /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 00000000000..dd2c07c5249
--- /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 00000000000..e769465866c
--- /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 00000000000..1c6430bd42c
--- /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 00000000000..42422b027ad
--- /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 00000000000..d0d916c0788
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/heart_crate_side differ
diff --git a/soh/assets/custom/objects/object_kibako2/heart_crate_top b/soh/assets/custom/objects/object_kibako2/heart_crate_top
new file mode 100644
index 00000000000..f5b47bd092e
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/heart_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako2/junk_crate_side b/soh/assets/custom/objects/object_kibako2/junk_crate_side
new file mode 100644
index 00000000000..08b491eb474
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/junk_crate_side differ
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 00000000000..ef303867ccf
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/junk_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako2/major_crate_side b/soh/assets/custom/objects/object_kibako2/major_crate_side
new file mode 100644
index 00000000000..a1fe6d8196a
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/major_crate_side differ
diff --git a/soh/assets/custom/objects/object_kibako2/major_crate_top b/soh/assets/custom/objects/object_kibako2/major_crate_top
new file mode 100644
index 00000000000..874104cf60a
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/major_crate_top differ
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 00000000000..634969f2ad1
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/mask_crate_side differ
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 00000000000..d8292e33fe4
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/mask_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey
new file mode 100644
index 00000000000..381376f7e71
--- /dev/null
+++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 00000000000..6bbbe040899
--- /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 00000000000..e79a71e4017
--- /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 00000000000..2e20008c7e0
--- /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 00000000000..b7eee4eb115
--- /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 00000000000..d59ca15f8a2
--- /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 00000000000..e930dced0f7
--- /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 00000000000..ee053858d87
--- /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 00000000000..c9b542226eb
--- /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 00000000000..619787be2ef
--- /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 00000000000..8e2e6bb4600
--- /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 00000000000..ca00e4780df
--- /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 00000000000..b4cb8d67249
--- /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 00000000000..a0ea4349908
--- /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 00000000000..d87ec41480b
--- /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 00000000000..369b6a05ae3
--- /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 00000000000..27a62c8c4d9
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/minor_crate_side differ
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 00000000000..830d8ff65b3
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/minor_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako2/rando_crate_side b/soh/assets/custom/objects/object_kibako2/rando_crate_side
new file mode 100644
index 00000000000..ea7c9e3b65e
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/rando_crate_side differ
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 00000000000..2d211d61250
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/rando_crate_top differ
diff --git a/soh/assets/custom/objects/object_kibako2/smallkey_crate_side b/soh/assets/custom/objects/object_kibako2/smallkey_crate_side
new file mode 100644
index 00000000000..23ada846e9d
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/smallkey_crate_side differ
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 00000000000..542dfb837df
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/smallkey_crate_top differ
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 00000000000..6de4f580f86
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/token_crate_side differ
diff --git a/soh/assets/custom/objects/object_kibako2/token_crate_top b/soh/assets/custom/objects/object_kibako2/token_crate_top
new file mode 100644
index 00000000000..d4d5442860f
Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/token_crate_top differ
diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h
index ace1588542a..fec18a83e6e 100644
--- a/soh/assets/soh_assets.h
+++ b/soh/assets/soh_assets.h
@@ -89,6 +89,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 a9118c77617..cc107bdde0b 100644
--- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
+++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
@@ -270,6 +270,22 @@ typedef enum {
// #### `args`
// - `*EnDoor`
VB_CONSUME_SMALL_KEY,
+
+ // #### `result`
+ // ```c
+ // itemDropped >= 0 && itemDropped < 0x1A
+ // ```
+ // #### `args`
+ // - `*ObjKibako2`
+ VB_CRATE_DROP_ITEM,
+
+ // #### `result`
+ // ```c
+ // false
+ // ```
+ // #### `args`
+ // - `*ObjKibako2`
+ VB_CRATE_SETUP_DRAW,
// #### `result`
// ```c
@@ -1653,6 +1669,22 @@ typedef enum {
// - None
VB_SHOW_TITLE_CARD,
+ // #### `result`
+ // ```c
+ // (collectible >= 0) && (collectible <= 0x19
+ // ```
+ // #### `args`
+ // - `*ObjKibako`
+ VB_SMALL_CRATE_DROP_ITEM,
+
+ // #### `result`
+ // ```c
+ // false
+ // ```
+ // #### `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 ed447fe3030..09eb9fa5c56 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
@@ -121,6 +121,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*german*/ "",
/*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {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 |
---------------------------*/
@@ -295,6 +299,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The
/*german*/ "!!!",
/*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_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 |
@@ -456,6 +464,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The
/*german*/ "",
/*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {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 |
---------------------------*/
@@ -686,6 +698,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The
/*german*/ "",
/*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 |
---------------------------*/
@@ -890,6 +906,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa
/*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 |
---------------------------*/
@@ -1037,6 +1057,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa
/*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 |
---------------------------*/
@@ -1282,6 +1306,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa
/*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 |
---------------------------*/
@@ -1545,6 +1573,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
/*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 |
---------------------------*/
@@ -1964,6 +1996,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
/*german*/ "",
/*french*/ "Selon moi, dans #une épreuve avec un Dinalfos# 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 a6c6b99f391..5f7555798cb 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
@@ -1954,5 +1954,44 @@ 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_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 }));
}
}
diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp
index ac79e860aac..ba041ff32b6 100644
--- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp
+++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp
@@ -722,6 +722,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 00000000000..df2b7cda002
--- /dev/null
+++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp
@@ -0,0 +1,549 @@
+#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;
+ } else {
+ *should = true;
+ }
+ });
+
+ 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;
+ } else {
+ *should = true;
+ }
+ });
+
+ 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() {
+ // Overworld Crates
+ // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler 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", "GV 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", "GV 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "GF 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", "HW 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", "HW 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", "HW 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", "HW 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", "HW 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", "MK 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", "MK 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", "MK 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", "MK 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", "MK 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", "MK 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", "MK 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", "MK 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", "MK 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", "MK 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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`", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "Kak 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", "GY 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", "GC 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", "DMC 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", "LLR 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", "LH 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", "GV 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", "GV 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", "GV 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", "GV 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", "GF 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 Spoiler 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", "Deku Tree 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", "Deku Tree 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", "Deku Tree 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Dodongos Cavern 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple MQ Lizalfos Maze Lower 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", "Fire Temple MQ Lizalfos Maze Lower 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", "Fire Temple MQ Lizalfos Maze Lower 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Spirit Temple 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", "Spirit Temple 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", "Spirit Temple 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", "Spirit Temple 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", "Spirit Temple 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", "Spirit Temple 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", "Gerudo Training Ground 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 Spoiler 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", "Jabu Jabus Belly 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", "Jabu Jabus Belly 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", "Fire Temple 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", "Fire Temple 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", "Spirit Temple 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", "Spirit Temple 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", "Jabu Jabus Belly 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", "Jabu Jabus Belly 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", "Forest Temple 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", "Forest Temple 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", "Forest Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Fire Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Water Temple 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", "Shadow Temple 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", "Shadow Temple 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", "Shadow Temple 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", "Shadow Temple 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", "Spirit Temple 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", "Spirit Temple MQ Beamos Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE));
+}
+
+static RegisterShipInitFunc initFunc(RegisterShuffleCrates, { "IS_RANDO" });
+static RegisterShipInitFunc locFunc(Rando::StaticData::RegisterCrateLocations);
\ No newline at end of file
diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.h b/soh/soh/Enhancements/randomizer/ShuffleCrates.h
new file mode 100644
index 00000000000..439fe716082
--- /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
\ No newline at end of file
diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp
index ba9ab6d2cfd..da0e47b875d 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],
@@ -188,6 +189,9 @@ void Context::GenerateLocationPool() {
)
)) ||
(location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_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)) ||
@@ -198,7 +202,10 @@ 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_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
@@ -209,7 +216,10 @@ 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_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 f5c78884bad..1d3b84817f5 100644
--- a/soh/soh/Enhancements/randomizer/location.cpp
+++ b/soh/soh/Enhancements/randomizer/location.cpp
@@ -383,6 +383,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_,
+ std::string&& spoilerName_, RandomizerHintTextKey hintKey,
+ RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) {
+ return {rc, quest_, RCTYPE_CRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false,
+ collectionCheck };
+}
+
+Rando::Location Rando::Location::NLCrate(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_NLCRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false,
+ collectionCheck };
+}
+
+Rando::Location Rando::Location::SmallCrate(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_SMALL_CRATE, area_, ACTOR_OBJ_KIBAKO, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), 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 bd96c3ae13f..0b87bd0a324 100644
--- a/soh/soh/Enhancements/randomizer/location.h
+++ b/soh/soh/Enhancements/randomizer/location.h
@@ -199,6 +199,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_, std::string&& spoilerName_,
+ RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
+ SpoilerCollectionCheck collectionCheck);
+
+ static Location NLCrate(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 SmallCrate(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/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp
index 9d3febe36c7..32d224aabd7 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp
@@ -175,6 +175,7 @@ void RegionTable_Init_DekuTree() {
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_CRATE, logic->CanBreakCrates()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}),
@@ -194,6 +195,8 @@ 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_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 e961a5c0856..3e55e590c06 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp
@@ -298,10 +298,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
//This is possible with sticks and shield, igniting a first flower by "touch" then very quickly crouch stabbing in a way that cuts the corner to light the 3rd bomb on the other side, but that's a trick
@@ -324,7 +326,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;}),
@@ -379,8 +385,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
@@ -403,8 +415,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;}),
@@ -454,11 +468,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_LOWER_RIGHT_SIDE, []{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 429d846677b..2ead7a5b0ee 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp
@@ -326,7 +326,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);}),
});
@@ -429,7 +435,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;}),
@@ -449,9 +458,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;}),
@@ -521,7 +536,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;}),
@@ -543,7 +561,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()),
}, {
@@ -562,7 +585,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;}),
@@ -599,8 +628,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 87f738b90d5..f39a9734b92 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp
@@ -529,7 +529,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 f0b9de5c3e5..0288b08f3d0 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
@@ -151,7 +151,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 fe043caa39d..466ea975e09 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;}),
@@ -254,6 +256,8 @@ 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_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 1267e240856..242be2c721f 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp
@@ -125,7 +125,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 3d8e26cd6b7..02d9b6026a7 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp
@@ -31,13 +31,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);}),
@@ -283,6 +285,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
@@ -423,6 +429,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);}),
@@ -506,10 +513,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 318a5eb6400..fb35efe2ebd 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp
@@ -426,7 +426,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);}),
});
@@ -442,15 +446,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);}),
@@ -458,9 +487,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;}),
@@ -478,9 +517,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);}),
@@ -496,9 +543,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
@@ -591,7 +640,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);}),
@@ -601,13 +658,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);}),
@@ -617,7 +689,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;}),
@@ -626,7 +699,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);}),
});
@@ -652,7 +733,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();})));})
@@ -660,14 +751,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));}),
@@ -682,9 +789,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)));})
@@ -698,8 +811,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);});}),
@@ -708,7 +826,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 6af0551e078..123ef2a4df2 100644
--- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp
@@ -42,6 +42,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->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->CanBreakCrates()),
+ LOCATION(RC_GF_BREAK_ROOM_CRATE_2, logic->CanBreakCrates()),
+ LOCATION(RC_GF_BREAK_ROOM_CRATE_3, (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->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 6ba8bfc6ed7..100b1c3e981 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
@@ -17,10 +17,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 1c4714e52f7..dfb73465283 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp
@@ -34,6 +34,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 true;}),
@@ -53,7 +54,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();}),
@@ -66,6 +68,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 722402ae9fc..5a68431df07 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp
@@ -32,6 +32,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 87a2e3b48df..c6abd43dd5e 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp
@@ -11,13 +11,15 @@ 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()),
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_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 abedcc571c9..195ddd0e2f0 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp
@@ -4,7 +4,12 @@
using namespace Rando;
void RegionTable_Init_HauntedWasteland() {
- 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);}),
@@ -24,13 +29,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 aff90914e1a..11688411ec5 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp
@@ -11,25 +11,43 @@ 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_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_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 447d039d258..2c4531011df 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp
@@ -64,10 +64,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 28315041557..38fd36a55a8 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
@@ -22,6 +22,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 0b010c8a713..b3806b8fb60 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp
@@ -11,7 +11,15 @@ 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_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;}),
Entrance(RR_TOT_ENTRANCE, []{return true;}),
@@ -96,6 +104,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;}),
@@ -199,7 +212,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/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp
index f005391d7b3..0220f4956c1 100644
--- a/soh/soh/Enhancements/randomizer/location_list.cpp
+++ b/soh/soh/Enhancements/randomizer/location_list.cpp
@@ -43,6 +43,37 @@ std::vector Rando::StaticData::GetOverworldPotLocations() {
return overworldPotLocations;
}
+std::vector Rando::StaticData::GetOverworldCrateLocations() {
+ std::vector overworldCrateLocations = {};
+ for (Location& location : locationTable) {
+ if (location.GetRCType() == RCTYPE_CRATE && location.IsOverworld() && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
+ overworldCrateLocations.push_back(location.GetRandomizerCheck());
+ }
+ }
+ return overworldCrateLocations;
+}
+
+std::vector Rando::StaticData::GetOverworldNLCrateLocations() {
+ std::vector overworldNLCrateLocations = {};
+ for (Location& location : locationTable) {
+ if (location.GetRCType() == RCTYPE_NLCRATE && location.IsOverworld() && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
+ overworldNLCrateLocations.push_back(location.GetRandomizerCheck());
+ }
+ }
+ return overworldNLCrateLocations;
+}
+
+std::vector Rando::StaticData::GetOverworldSmallCrateLocations() {
+ std::vector overworldSmallCrateLocations = {};
+ for (Location& location : locationTable) {
+ if (location.GetRCType() == RCTYPE_SMALL_CRATE && location.IsOverworld() &&
+ location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
+ overworldSmallCrateLocations.push_back(location.GetRandomizerCheck());
+ }
+ }
+ return overworldSmallCrateLocations;
+}
+
std::vector Rando::StaticData::GetStaticHintLocations() {
std::vector staticHintLocations = {};
for (Location& location : locationTable) {
@@ -114,6 +145,9 @@ std::vector Rando::StaticData::GetOverworldLocations() {
location.GetRandomizerCheck() != RC_TRIFORCE_COMPLETED && //not really an overworld check
location.GetRCType() != RCTYPE_FISH && // temp fix while locations are properly sorted out
location.GetRCType() != RCTYPE_POT && // Same as fish
+ location.GetRCType() != RCTYPE_CRATE && // Same as fish
+ location.GetRCType() != RCTYPE_NLCRATE && // Same as fish
+ location.GetRCType() != RCTYPE_SMALL_CRATE && // Same as fish
location.GetRCType() != RCTYPE_CHEST_GAME && //this is supposed to be excluded
(ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || location.GetRCType() != RCTYPE_ADULT_TRADE) && //trade is handled elsewhere in location pool
location.GetRCType() != RCTYPE_STATIC_HINT &&
diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp
index fa9c8d8e591..1ec32d94609 100644
--- a/soh/soh/Enhancements/randomizer/logic.cpp
+++ b/soh/soh/Enhancements/randomizer/logic.cpp
@@ -1029,6 +1029,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 ea9d5180159..5d01a7575f4 100644
--- a/soh/soh/Enhancements/randomizer/logic.h
+++ b/soh/soh/Enhancements/randomizer/logic.h
@@ -238,6 +238,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 a3184765f1f..15b725915d1 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 44831c7c045..16bdc67d3d4 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer.cpp
@@ -1549,6 +1549,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) {
@@ -1837,6 +2092,61 @@ FishIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) {
return fishIdentity;
}
+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) {
return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get();
}
diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h
index 76bde6a4fbe..53c76a74ad6 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.h
+++ b/soh/soh/Enhancements/randomizer/randomizer.h
@@ -54,6 +54,8 @@ class Randomizer {
CowIdentity IdentifyCow(s32 sceneNum, s32 posX, s32 posZ);
PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ);
FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams);
+ 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 550f2b1af0c..67e26c01d01 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
@@ -2332,6 +2335,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,
@@ -4765,6 +5028,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,
@@ -5088,6 +5374,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,
@@ -5568,6 +5855,14 @@ typedef enum {
RO_SHUFFLE_POTS_ALL,
} RandoOptionShufflePots;
+// 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,
@@ -5663,6 +5958,16 @@ typedef struct FishIdentity {
RandomizerCheck randomizerCheck;
} FishIdentity;
+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 b8d435fd8dc..d2cc5b86555 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp
@@ -172,6 +172,9 @@ 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_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 e3b07b672b3..d23b914d043 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
@@ -58,6 +58,8 @@ bool showWeirdEgg;
bool showGerudoCard;
bool showOverworldPots;
bool showDungeonPots;
+bool showOverworldCrates;
+bool showDungeonCrates;
bool showFrogSongRupees;
bool showFairies;
bool showStartingMapsCompasses;
@@ -1230,11 +1232,32 @@ void LoadSettings() {
showDungeonPots = 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;
showOverworldPots = false;
showDungeonPots = false;
+ showOverworldCrates = false;
+ showDungeonCrates = false;
}
fortressFast = false;
@@ -1315,6 +1338,17 @@ bool IsCheckShuffled(RandomizerCheck rc) {
(loc->GetRCType() != RCTYPE_POT ||
(showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(showDungeonPots && 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 e43acf57c6f..4138e030465 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 cf1acdd7fa3..d6d2a0ee698 100644
--- a/soh/soh/Enhancements/randomizer/settings.cpp
+++ b/soh/soh/Enhancements/randomizer/settings.cpp
@@ -209,7 +209,8 @@ 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_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]);
+ 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);
OPT_U8(RSK_MERCHANT_PRICES_FIXED_PRICE, "Merchant Fixed Price", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantFixedPrice"), mOptionDescriptions[RSK_MERCHANT_PRICES_FIXED_PRICE], WidgetType::Slider, 10, true);
@@ -661,6 +662,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],
@@ -900,6 +902,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 852fe38415e..90331134890 100644
--- a/soh/soh/Enhancements/randomizer/static_data.h
+++ b/soh/soh/Enhancements/randomizer/static_data.h
@@ -47,11 +47,15 @@ class StaticData {
static std::vector GetPondFishLocations();
static std::vector GetOverworldFishLocations();
static std::vector GetOverworldPotLocations();
+ static std::vector GetOverworldCrateLocations();
+ static std::vector GetOverworldNLCrateLocations();
+ static std::vector GetOverworldSmallCrateLocations();
static std::vector GetOverworldFairyLocations();
static void RegisterFishLocations();
static void RegisterFairyLocations();
static void RegisterPotLocations();
static void RegisterFreestandingLocations();
+ 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 16e27e39ed9..400d238ec81 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,7 @@ void ObjKibako_Draw(Actor* thisx, PlayState* play) {
s32 pad;
ObjKibako* this = (ObjKibako*)thisx;
+ if (!GameInteractor_Should(VB_SMALL_CRATE_SETUP_DRAW, false, thisx)) {}
+
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 68e871c7888..32a35563f24 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 d6452d25337..57257dbfe4e 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,8 @@ void ObjKibako2_Update(Actor* thisx, PlayState* play) {
}
void ObjKibako2_Draw(Actor* thisx, PlayState* play) {
+ if (!GameInteractor_Should(VB_CRATE_SETUP_DRAW, false, thisx)) {
+ }
+
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 48c22154f4f..7629e6aa101 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