diff --git a/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16
new file mode 100644
index 000000000..99a0fd4bd
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16
new file mode 100644
index 000000000..1d4f2db39
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16
new file mode 100644
index 000000000..54bdc9fa7
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16
new file mode 100644
index 000000000..9d561d1ae
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16
new file mode 100644
index 000000000..b9d1f74e3
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16
new file mode 100644
index 000000000..8ec68d3aa
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16
new file mode 100644
index 000000000..2822f18fd
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16
new file mode 100644
index 000000000..bf90c64fc
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16
new file mode 100644
index 000000000..52f4848b3
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16
new file mode 100644
index 000000000..9d14059c0
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16
new file mode 100644
index 000000000..436b87071
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL
new file mode 100644
index 000000000..c0a32b3b0
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0
new file mode 100644
index 000000000..bdb256c87
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1
new file mode 100644
index 000000000..eab49e30d
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2
new file mode 100644
index 000000000..2fea2e4db
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL
new file mode 100644
index 000000000..70e8240a4
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0
new file mode 100644
index 000000000..926fed879
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1
new file mode 100644
index 000000000..74ccefada
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2
new file mode 100644
index 000000000..08fdc08b9
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL
new file mode 100644
index 000000000..046e04d33
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0
new file mode 100644
index 000000000..dcc1da33a
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1
new file mode 100644
index 000000000..8475ba007
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2
new file mode 100644
index 000000000..c20f0dc4d
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL
new file mode 100644
index 000000000..a27f05f47
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0
new file mode 100644
index 000000000..be06a23a7
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL
new file mode 100644
index 000000000..af43aa60c
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0
new file mode 100644
index 000000000..dd226cbc5
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1
new file mode 100644
index 000000000..e00033c0f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2
new file mode 100644
index 000000000..95c382ca0
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL
new file mode 100644
index 000000000..b9e25ae70
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0
new file mode 100644
index 000000000..874e7ffb8
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1
new file mode 100644
index 000000000..90b390218
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2
new file mode 100644
index 000000000..b2c011f94
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL
new file mode 100644
index 000000000..35d99afcd
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0
new file mode 100644
index 000000000..6f519fbc8
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1
new file mode 100644
index 000000000..6d7a07c98
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2
new file mode 100644
index 000000000..f85ac723f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL
new file mode 100644
index 000000000..c04d7156e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0
new file mode 100644
index 000000000..cb19e7c48
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1
new file mode 100644
index 000000000..8cf916c22
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2
new file mode 100644
index 000000000..cb5550f61
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL
new file mode 100644
index 000000000..29371b448
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0
new file mode 100644
index 000000000..a25ca5b55
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1
new file mode 100644
index 000000000..cb9c707a8
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2
new file mode 100644
index 000000000..96023e0eb
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL
new file mode 100644
index 000000000..c8a98c94e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0
new file mode 100644
index 000000000..e60691715
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1
new file mode 100644
index 000000000..d20545643
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2
new file mode 100644
index 000000000..72993605d
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0
new file mode 100644
index 000000000..ff0b01fdf
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1
new file mode 100644
index 000000000..af2f51461
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2
new file mode 100644
index 000000000..5f2557028
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey
new file mode 100644
index 000000000..0cad964b8
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy
new file mode 100644
index 000000000..740ca2da3
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart
new file mode 100644
index 000000000..e074ff279
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold
new file mode 100644
index 000000000..42f481571
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask
new file mode 100644
index 000000000..f19b26e56
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze
new file mode 100644
index 000000000..de5aecac6
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random
new file mode 100644
index 000000000..36895a84b
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver
new file mode 100644
index 000000000..227294911
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token
new file mode 100644
index 000000000..6725b33e6
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf
new file mode 100644
index 000000000..72bfec180
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery
new file mode 100644
index 000000000..0fdd83a9e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_field_keep/model.xml b/soh/assets/custom/objects/gameplay_field_keep/model.xml
new file mode 100644
index 000000000..9c003b401
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_field_keep/model.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16
new file mode 100644
index 000000000..1d4f2db39
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16
new file mode 100644
index 000000000..fa00a5606
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16
new file mode 100644
index 000000000..54bdc9fa7
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16
new file mode 100644
index 000000000..9d561d1ae
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16
new file mode 100644
index 000000000..b9d1f74e3
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16
new file mode 100644
index 000000000..8ec68d3aa
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16
new file mode 100644
index 000000000..2822f18fd
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16
new file mode 100644
index 000000000..bf90c64fc
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16
new file mode 100644
index 000000000..52f4848b3
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16
new file mode 100644
index 000000000..9d14059c0
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16
new file mode 100644
index 000000000..436b87071
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16
new file mode 100644
index 000000000..c59757c1d
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 differ
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL
new file mode 100644
index 000000000..4c7b1ab35
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0
new file mode 100644
index 000000000..061362cd6
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1
new file mode 100644
index 000000000..16c026e42
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2
new file mode 100644
index 000000000..0d0968586
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3
new file mode 100644
index 000000000..d8fcf1fe1
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL
new file mode 100644
index 000000000..875f809dd
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0
new file mode 100644
index 000000000..951dd58bb
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1
new file mode 100644
index 000000000..97fe8599c
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2
new file mode 100644
index 000000000..0d7b67f3c
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3
new file mode 100644
index 000000000..22c8ba3d8
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL
new file mode 100644
index 000000000..235dfdcf3
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0
new file mode 100644
index 000000000..273e96ed4
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1
new file mode 100644
index 000000000..1b8a08eec
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2
new file mode 100644
index 000000000..889988611
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3
new file mode 100644
index 000000000..45a3b48e1
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL
new file mode 100644
index 000000000..d4ab27bdb
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0
new file mode 100644
index 000000000..bcf6f69e6
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull
new file mode 100644
index 000000000..6444457b7
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL
new file mode 100644
index 000000000..7ded8214f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0
new file mode 100644
index 000000000..f8278cc0c
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1
new file mode 100644
index 000000000..64c020a98
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2
new file mode 100644
index 000000000..13938b6d9
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3
new file mode 100644
index 000000000..da60e69d2
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL
new file mode 100644
index 000000000..94c93e453
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0
new file mode 100644
index 000000000..d981594a9
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1
new file mode 100644
index 000000000..ee5852695
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2
new file mode 100644
index 000000000..1ed45fdcb
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3
new file mode 100644
index 000000000..94910ceb3
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL
new file mode 100644
index 000000000..e0ae6e48a
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0
new file mode 100644
index 000000000..7a5d4e3de
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1
new file mode 100644
index 000000000..a24c28fa4
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2
new file mode 100644
index 000000000..5ef0b99cb
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3
new file mode 100644
index 000000000..d49e9b186
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL
new file mode 100644
index 000000000..7ec87e807
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0
new file mode 100644
index 000000000..94ccbe795
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1
new file mode 100644
index 000000000..96e84046e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2
new file mode 100644
index 000000000..db7142847
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3
new file mode 100644
index 000000000..b1b8cb8c1
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL
new file mode 100644
index 000000000..f22094eba
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0
new file mode 100644
index 000000000..2235b57ae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1
new file mode 100644
index 000000000..93b101a86
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2
new file mode 100644
index 000000000..2cf0ed524
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3
new file mode 100644
index 000000000..653b2b7cb
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL
new file mode 100644
index 000000000..d1dff7095
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0
new file mode 100644
index 000000000..dc2309657
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1
new file mode 100644
index 000000000..f78444188
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2
new file mode 100644
index 000000000..7de2d7943
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3
new file mode 100644
index 000000000..e5c1fbd15
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0
new file mode 100644
index 000000000..7f094d39f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1
new file mode 100644
index 000000000..18d3d3c64
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2
new file mode 100644
index 000000000..205b9a005
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3
new file mode 100644
index 000000000..56e99d5ed
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull
new file mode 100644
index 000000000..2f795b083
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey
new file mode 100644
index 000000000..ee25715ae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy
new file mode 100644
index 000000000..d3c0c44ec
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart
new file mode 100644
index 000000000..2864988e3
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold
new file mode 100644
index 000000000..6f451d12a
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask
new file mode 100644
index 000000000..a5bb3b8a4
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze
new file mode 100644
index 000000000..0102b9a5e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random
new file mode 100644
index 000000000..f23e81a03
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver
new file mode 100644
index 000000000..98dcfacb1
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass
new file mode 100644
index 000000000..34034f059
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token
new file mode 100644
index 000000000..63a739c30
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf
new file mode 100644
index 000000000..574f63139
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material
new file mode 100644
index 000000000..04270bbae
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_keep/model.xml b/soh/assets/custom/objects/gameplay_keep/model.xml
new file mode 100644
index 000000000..6444457b7
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_keep/model.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h
index ace158854..9e56e51bd 100644
--- a/soh/assets/soh_assets.h
+++ b/soh/assets/soh_assets.h
@@ -77,6 +77,66 @@ static const ALIGN_ASSET(2) char gBossSoulSkullDL[] = dgBossSoulSkullDL;
#define dgRandoPotDL "__OTR__objects/gameplay_dangeon_keep/gRandoPotDL"
static const ALIGN_ASSET(2) char gRandoPotDL[] = dgRandoPotDL;
+#define dgRandoBushDL "__OTR__objects/gameplay_field_keep/gFieldBushRandomDL"
+static const ALIGN_ASSET(2) char gRandoBushDL[] = dgRandoBushDL;
+
+#define dgRandoBushMinorDL "__OTR__objects/gameplay_field_keep/gFieldBushMinorDL"
+static const ALIGN_ASSET(2) char gRandoBushMinorDL[] = dgRandoBushMinorDL;
+
+#define dgRandoBushMajorDL "__OTR__objects/gameplay_field_keep/gFieldBushMajorDL"
+static const ALIGN_ASSET(2) char gRandoBushMajorDL[] = dgRandoBushMajorDL;
+
+#define dgRandoBushSmallKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushSmallKeyDL"
+static const ALIGN_ASSET(2) char gRandoBushSmallKeyDL[] = dgRandoBushSmallKeyDL;
+
+#define dgRandoBushBossKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushBossKeyDL"
+static const ALIGN_ASSET(2) char gRandoBushBossKeyDL[] = dgRandoBushBossKeyDL;
+
+#define dgRandoBushTokenDL "__OTR__objects/gameplay_field_keep/gFieldBushTokenDL"
+static const ALIGN_ASSET(2) char gRandoBushTokenDL[] = dgRandoBushTokenDL;
+
+#define dgRandoBushMaskDL "__OTR__objects/gameplay_field_keep/gFieldBushMaskDL"
+static const ALIGN_ASSET(2) char gRandoBushMaskDL[] = dgRandoBushMaskDL;
+
+#define dgRandoBushFairyDL "__OTR__objects/gameplay_field_keep/gFieldBushFairyDL"
+static const ALIGN_ASSET(2) char gRandoBushFairyDL[] = dgRandoBushFairyDL;
+
+#define dgRandoBushHeartDL "__OTR__objects/gameplay_field_keep/gFieldBushHeartDL"
+static const ALIGN_ASSET(2) char gRandoBushHeartDL[] = dgRandoBushHeartDL;
+
+#define dgRandoBushJunkDL "__OTR__objects/gameplay_field_keep/gFieldBushJunkDL"
+static const ALIGN_ASSET(2) char gRandoBushJunkDL[] = dgRandoBushJunkDL;
+
+#define dgRandoCuttableGrassRandomDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassRandomDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassDL[] = dgRandoCuttableGrassRandomDL;
+
+#define dgRandoCuttableGrassMinorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMinorDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassMinorDL[] = dgRandoCuttableGrassMinorDL;
+
+#define dgRandoCuttableGrassMajorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMajorDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassMajorDL[] = dgRandoCuttableGrassMajorDL;
+
+#define dgRandoCuttableGrassSmallKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassSmallKeyDL[] = dgRandoCuttableGrassSmallKeyDL;
+
+#define dgRandoCuttableGrassBossKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassBossKeyDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassBossKeyDL[] = dgRandoCuttableGrassBossKeyDL;
+
+#define dgRandoCuttableGrassTokenDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassTokenDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassTokenDL[] = dgRandoCuttableGrassTokenDL;
+
+#define dgRandoCuttableGrassMaskDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMaskDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassMaskDL[] = dgRandoCuttableGrassMaskDL;
+
+#define dgRandoCuttableGrassFairyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassFairyDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassFairyDL[] = dgRandoCuttableGrassFairyDL;
+
+#define dgRandoCuttableGrassHeartDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassHeartDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassHeartDL[] = dgRandoCuttableGrassHeartDL;
+
+#define dgRandoCuttableGrassJunkDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassJunkDL"
+static const ALIGN_ASSET(2) char gRandoCuttableGrassJunkDL[] = dgRandoCuttableGrassJunkDL;
+
#define dgFishingPoleGiDL "__OTR__objects/object_gi_fishing_pole/gFishingPoleGiDL"
static const ALIGN_ASSET(2) char gFishingPoleGiDL[] = dgFishingPoleGiDL;
diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
index 8aace9a90..b4990803f 100644
--- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
+++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
@@ -974,6 +974,22 @@ typedef enum {
// - `*EnDs`
VB_GRANNY_TAKE_MONEY,
+ // ### `result`
+ // ```c
+ // false
+ // ```
+ // ### `args`
+ // - `*EnKusa`
+ VB_GRASS_DROP_ITEM,
+
+ // ### `result`
+ // ```c
+ // true
+ // ```
+ // ### `args`
+ // - `*EnKusa`
+ VB_GRASS_SETUP_DRAW,
+
// #### `result`
// ```c
// Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)
diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp
index 81612ddb2..6e6ec17d6 100644
--- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp
+++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp
@@ -123,6 +123,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*german*/ "Man erzählt sich, daß ein #Herz im Deku-Baum# #[[1]]# verstecke.",
/*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN}));
+ hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.",
+ /*german*/ "",
+ /*french*/ "", {QM_RED, QM_GREEN}));
+
/*--------------------------
| DODONGOS CAVERN |
---------------------------*/
@@ -297,6 +301,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.",
/*french*/ "Selon moi, #jouer un air orageux pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN}));
+ hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.",
+ /*german*/ "!!!",
+ /*french*/ "", {QM_RED, QM_GREEN}));
+
/*--------------------------
| JABU JABUS BELLY |
@@ -457,6 +465,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*german*/ "Man erzählt sich, daß sich #nahe des zentralen Lifts in Jabu-Jabus Bauch# #[[1]]# befände.",
/*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN}));
+ hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.",
+ /*german*/ "",
+ /*french*/ "", {QM_RED, QM_GREEN}));
+
/*--------------------------
| FOREST TEMPLE |
---------------------------*/
@@ -1688,6 +1700,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.",
/*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN}));
+ hintTextTable[RHT_BOTTOM_OF_THE_WELL_GRASS] = HintText(CustomMessage("They say that some #grass in the Bottom of the Well# hides #[[1]]#.",
+ /*german*/ "",
+ /*french*/ "", {QM_RED, QM_GREEN}));
+
/*--------------------------
| ICE CAVERN |
diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp
index 9bbb1e4af..2c28b154e 100644
--- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp
+++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp
@@ -1955,6 +1955,26 @@ void StaticData::HintTable_Init_Exclude_Overworld() {
hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+ hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
+ hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
+
// clang-format on
}
}
diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp
new file mode 100644
index 000000000..b14c816d7
--- /dev/null
+++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp
@@ -0,0 +1,514 @@
+#include "ShuffleGrass.h"
+#include "soh_assets.h"
+#include "static_data.h"
+#include "soh/Enhancements/enhancementTypes.h"
+
+extern "C" {
+#include "variables.h"
+#include "overlays/actors/ovl_En_Kusa/z_en_kusa.h"
+#include "objects/gameplay_field_keep/gameplay_field_keep.h"
+#include "objects/object_kusa/object_kusa.h"
+extern PlayState* gPlayState;
+}
+
+#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get()
+
+extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play);
+
+void DrawTypeOfGrass(EnKusa* grassActor, Gfx* bushDList, Gfx* grassDList, PlayState* play) {
+ // Actor params is -255 for regrowable grass.
+ if (grassActor->actor.params == -255) {
+ Gfx_DrawDListOpa(play, grassDList);
+ } else {
+ Gfx_DrawDListOpa(play, bushDList);
+ }
+}
+
+extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) {
+ //static Gfx* dLists[] = { (Gfx*)gRandoBushDL, (Gfx*)object_kusa_DL_000140, (Gfx*)object_kusa_DL_000140 };
+ static Gfx* dLists[] = { (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, (Gfx*)gRandoCuttableGrassJunkDL };
+ auto grassActor = ((EnKusa*)thisx);
+
+ OPEN_DISPS(play->state.gfxCtx);
+ Gfx_SetupDL_25Opa(play->state.gfxCtx);
+
+ if (grassActor->grassIdentity.randomizerCheck != RC_MAX && Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) {
+ int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED);
+
+ if (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) {
+ auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE);
+ GetItemCategory getItemCategory = itemEntry.getItemCategory;
+
+ switch (getItemCategory) {
+ case ITEM_CATEGORY_JUNK:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, play);
+ break;
+ case ITEM_CATEGORY_LESSER:
+ switch (itemEntry.itemId) {
+ case ITEM_HEART_PIECE:
+ case ITEM_HEART_PIECE_2:
+ case ITEM_HEART_CONTAINER:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL, play);
+ break;
+ default:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, play);
+ break;
+ }
+ break;
+ case ITEM_CATEGORY_BOSS_KEY:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushBossKeyDL, (Gfx*)gRandoCuttableGrassBossKeyDL, play);
+ break;
+ case ITEM_CATEGORY_SMALL_KEY:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushSmallKeyDL, (Gfx*)gRandoCuttableGrassSmallKeyDL, play);
+ break;
+ case ITEM_CATEGORY_SKULLTULA_TOKEN:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushTokenDL, (Gfx*)gRandoCuttableGrassTokenDL, play);
+ break;
+ case ITEM_CATEGORY_MAJOR:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMajorDL, (Gfx*)gRandoCuttableGrassMajorDL, play);
+ break;
+ default:
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play);
+ break;
+ }
+ } else {
+ DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play);
+ }
+ } else if (grassActor->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) {
+ Gfx_DrawDListOpa(play, (Gfx*)object_kusa_DL_0002E0);
+ } else {
+ Gfx_DrawDListOpa(play, dLists[thisx->params & 3]);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) {
+ if (grassActor->grassIdentity.randomizerCheck == RC_MAX)
+ return false;
+
+ RandomizerCheck rc = grassActor->grassIdentity.randomizerCheck;
+
+ uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon();
+ uint8_t grassSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_GRASS).Get();
+
+ // Don't pull randomized item if grass isn't randomized or is already checked
+ if (!IS_RANDO || (grassSetting == RO_SHUFFLE_GRASS_OVERWORLD && isDungeon) ||
+ (grassSetting == RO_SHUFFLE_GRASS_DUNGEONS && !isDungeon) ||
+ Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) ||
+ grassActor->grassIdentity.randomizerCheck == RC_UNKNOWN_CHECK) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+void EnKusa_RandomizerSpawnCollectible(EnKusa* grassActor, PlayState* play) {
+ EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &grassActor->actor.world.pos, ITEM00_SOH_DUMMY);
+ item00->randoInf = grassActor->grassIdentity.randomizerInf;
+ item00->itemEntry =
+ Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE);
+ item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem;
+ item00->actor.velocity.y = 8.0f;
+ item00->actor.speedXZ = 2.0f;
+ item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f);
+}
+
+void EnKusa_RandomizerInit(void* actorRef) {
+ Actor* actor = static_cast(actorRef);
+
+ if (actor->id != ACTOR_EN_KUSA)
+ return;
+
+ EnKusa* grassActor = static_cast(actorRef);
+ s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1);
+
+ grassActor->grassIdentity = OTRGlobals::Instance->gRandomizer->IdentifyGrass(
+ gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, respawnData, gPlayState->linkAgeOnLoad);
+}
+
+void RegisterShuffleGrass() {
+ bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_GRASS);
+
+ COND_ID_HOOK(OnActorInit, ACTOR_EN_KUSA, shouldRegister, EnKusa_RandomizerInit);
+
+ COND_VB_SHOULD(VB_GRASS_SETUP_DRAW, shouldRegister, {
+ EnKusa* grassActor = va_arg(args, EnKusa*);
+ if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) {
+ grassActor->actor.draw = (ActorFunc)EnKusa_RandomizerDraw;
+ *should = false;
+ } else {
+ *should = true;
+ }
+ });
+
+ COND_VB_SHOULD(VB_GRASS_DROP_ITEM, shouldRegister, {
+ EnKusa* grassActor = va_arg(args, EnKusa*);
+ if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) {
+ EnKusa_RandomizerSpawnCollectible(grassActor, gPlayState);
+ grassActor->grassIdentity.randomizerCheck = RC_MAX;
+ grassActor->grassIdentity.randomizerInf = RAND_INF_MAX;
+ *should = false;
+ } else {
+ *should = true;
+ }
+ });
+}
+
+
+void Rando::StaticData::RegisterGrassLocations() {
+ // Overworld Grass
+ // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check
+ locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1));
+ locationTable[RC_KF_CHILD_GRASS_2] = Location::Grass(RC_KF_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(594, 542), "Child Grass 2", "Child Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_2));
+ locationTable[RC_KF_CHILD_GRASS_3] = Location::Grass(RC_KF_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(572, 603), "Child Grass 3", "Child Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_3));
+ locationTable[RC_KF_CHILD_GRASS_4] = Location::Grass(RC_KF_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(385, 643), "Child Grass 4", "Child Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_4));
+ locationTable[RC_KF_CHILD_GRASS_5] = Location::Grass(RC_KF_CHILD_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "Child Grass 5", "Child Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_5));
+ locationTable[RC_KF_CHILD_GRASS_6] = Location::Grass(RC_KF_CHILD_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "Child Grass 6", "Child Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_6));
+ locationTable[RC_KF_CHILD_GRASS_7] = Location::Grass(RC_KF_CHILD_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-612, 737), "Child Grass 7", "Child Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_7));
+ locationTable[RC_KF_CHILD_GRASS_8] = Location::Grass(RC_KF_CHILD_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-671, 671), "Child Grass 8", "Child Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_8));
+ locationTable[RC_KF_CHILD_GRASS_9] = Location::Grass(RC_KF_CHILD_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-748, 632), "Child Grass 9", "Child Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_9));
+ locationTable[RC_KF_CHILD_GRASS_10] = Location::Grass(RC_KF_CHILD_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-757, 708), "Child Grass 10", "Child Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_10));
+ locationTable[RC_KF_CHILD_GRASS_11] = Location::Grass(RC_KF_CHILD_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-823, 666), "Child Grass 11", "Child Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_11));
+ locationTable[RC_KF_CHILD_GRASS_12] = Location::Grass(RC_KF_CHILD_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-835, 605), "Child Grass 12", "Child Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_12));
+ locationTable[RC_KF_CHILD_GRASS_MAZE_1] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-995, 1531), "Child Grass Maze 1", "Child Grass Maze 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_1));
+ locationTable[RC_KF_CHILD_GRASS_MAZE_2] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-701, 1882), "Child Grass Maze 2", "Child Grass Maze 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_2));
+ locationTable[RC_KF_CHILD_GRASS_MAZE_3] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-295, 2297), "Child Grass Maze 3", "Child Grass Maze 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_3));
+ locationTable[RC_KF_ADULT_GRASS_1] = Location::Grass(RC_KF_ADULT_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(839, 685), "Adult Grass 1", "Adult Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_1));
+ locationTable[RC_KF_ADULT_GRASS_2] = Location::Grass(RC_KF_ADULT_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(809, 722), "Adult Grass 2", "Adult Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_2));
+ locationTable[RC_KF_ADULT_GRASS_3] = Location::Grass(RC_KF_ADULT_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(760, 714), "Adult Grass 3", "Adult Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_3));
+ locationTable[RC_KF_ADULT_GRASS_4] = Location::Grass(RC_KF_ADULT_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 679), "Adult Grass 4", "Adult Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_4));
+ locationTable[RC_KF_ADULT_GRASS_5] = Location::Grass(RC_KF_ADULT_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 606), "Adult Grass 5", "Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_5));
+ locationTable[RC_KF_ADULT_GRASS_6] = Location::Grass(RC_KF_ADULT_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 563), "Adult Grass 6", "Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_6));
+ locationTable[RC_KF_ADULT_GRASS_7] = Location::Grass(RC_KF_ADULT_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(868, 606), "Adult Grass 7", "Adult Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_7));
+ locationTable[RC_KF_ADULT_GRASS_8] = Location::Grass(RC_KF_ADULT_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 663), "Adult Grass 8", "Adult Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_8));
+ locationTable[RC_KF_ADULT_GRASS_9] = Location::Grass(RC_KF_ADULT_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(757, 649), "Adult Grass 9", "Adult Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_9));
+ locationTable[RC_KF_ADULT_GRASS_10] = Location::Grass(RC_KF_ADULT_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(773, 610), "Adult Grass 10", "Adult Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_10));
+ locationTable[RC_KF_ADULT_GRASS_11] = Location::Grass(RC_KF_ADULT_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(815, 607), "Adult Grass 11", "Adult Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_11));
+ locationTable[RC_KF_ADULT_GRASS_12] = Location::Grass(RC_KF_ADULT_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(836, 636), "Adult Grass 12", "Adult Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_12));
+ locationTable[RC_KF_ADULT_GRASS_13] = Location::Grass(RC_KF_ADULT_GRASS_13, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-772, 654), "Adult Grass 13", "Adult Grass 13", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_13));
+ locationTable[RC_KF_ADULT_GRASS_14] = Location::Grass(RC_KF_ADULT_GRASS_14, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-785, 611), "Adult Grass 14", "Adult Grass 14", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_14));
+ locationTable[RC_KF_ADULT_GRASS_15] = Location::Grass(RC_KF_ADULT_GRASS_15, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-805, 691), "Adult Grass 15", "Adult Grass 15", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_15));
+ locationTable[RC_KF_ADULT_GRASS_16] = Location::Grass(RC_KF_ADULT_GRASS_16, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-822, 644), "Adult Grass 16", "Adult Grass 16", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_16));
+ locationTable[RC_KF_ADULT_GRASS_17] = Location::Grass(RC_KF_ADULT_GRASS_17, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-842, 601), "Adult Grass 17", "Adult Grass 17", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_17));
+ locationTable[RC_KF_ADULT_GRASS_18] = Location::Grass(RC_KF_ADULT_GRASS_18, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-867, 674), "Adult Grass 18", "Adult Grass 18", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_18));
+ locationTable[RC_KF_ADULT_GRASS_19] = Location::Grass(RC_KF_ADULT_GRASS_19, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 0xFF), "Adult Grass 19", "Adult Grass 19", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_19));
+ locationTable[RC_KF_ADULT_GRASS_20] = Location::Grass(RC_KF_ADULT_GRASS_20, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 0xFF), "Adult Grass 20", "Adult Grass 20", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_20));
+ locationTable[RC_LW_GRASS_1] = Location::Grass(RC_LW_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(676, -651), "Near Shortcuts Grass 1", "Near Shortcuts Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_1));
+ locationTable[RC_LW_GRASS_2] = Location::Grass(RC_LW_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(633, -676), "Near Shortcuts Grass 2", "Near Shortcuts Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_2));
+ locationTable[RC_LW_GRASS_3] = Location::Grass(RC_LW_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(645, -638), "Near Shortcuts Grass 3", "Near Shortcuts Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_3));
+ locationTable[RC_LW_GRASS_4] = Location::Grass(RC_LW_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1476, -2251), "After Mido Grass 1", "After Mido Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_4));
+ locationTable[RC_LW_GRASS_5] = Location::Grass(RC_LW_GRASS_5, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1433, -2276), "After Mido Grass 2", "After Mido Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_5));
+ locationTable[RC_LW_GRASS_6] = Location::Grass(RC_LW_GRASS_6, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1445, -2238), "After Mido Grass 3", "After Mido Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_6));
+ locationTable[RC_LW_GRASS_7] = Location::Grass(RC_LW_GRASS_7, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(926, -2232), "Near SFM Grass 1", "Near SFM Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_7));
+ locationTable[RC_LW_GRASS_8] = Location::Grass(RC_LW_GRASS_8, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(965, -2241), "Near SFM Grass 2", "Near SFM Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_8));
+ locationTable[RC_LW_GRASS_9] = Location::Grass(RC_LW_GRASS_9, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(952, -2275), "Near SFM Grass 3", "Near SFM Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_9));
+ locationTable[RC_MARKET_GRASS_1] = Location::Grass(RC_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-106, 277), "Market Grass 1", "Market Grass 1", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_1));
+ locationTable[RC_MARKET_GRASS_2] = Location::Grass(RC_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-131, 225), "Market Grass 2", "Market Grass 2", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_2));
+ locationTable[RC_MARKET_GRASS_3] = Location::Grass(RC_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(504, -546), "Market Grass 3", "Market Grass 3", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_3));
+ locationTable[RC_MARKET_GRASS_4] = Location::Grass(RC_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(465, -548), "Market Grass 4", "Market Grass 4", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_4));
+ locationTable[RC_MARKET_GRASS_5] = Location::Grass(RC_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(432, -548), "Market Grass 5", "Market Grass 5", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_5));
+ locationTable[RC_MARKET_GRASS_6] = Location::Grass(RC_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(73, -428), "Market Grass 6", "Market Grass 6", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_6));
+ locationTable[RC_MARKET_GRASS_7] = Location::Grass(RC_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(75, -310), "Market Grass 7", "Market Grass 7", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_7));
+ locationTable[RC_MARKET_GRASS_8] = Location::Grass(RC_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(76, -190), "Market Grass 8", "Market Grass 8", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_8));
+ locationTable[RC_HC_GRASS_1] = Location::Grass(RC_HC_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1035, 882), "Near Storms Grotto Grass 1", "Near Storms Grotto Grass 1", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_1));
+ locationTable[RC_HC_GRASS_2] = Location::Grass(RC_HC_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(975, 919), "Near Storms Grotto Grass 2", "Near Storms Grotto Grass 2", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_2));
+ locationTable[RC_KAK_GRASS_1] = Location::Grass(RC_KAK_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1116, 1581), "Near Graveyard Grass 1", "Near Graveyard Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_1));
+ locationTable[RC_KAK_GRASS_2] = Location::Grass(RC_KAK_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1103, 1532), "Near Graveyard Grass 2", "Near Graveyard Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_2));
+ locationTable[RC_KAK_GRASS_3] = Location::Grass(RC_KAK_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1072, 1592), "Near Graveyard Grass 3", "Near Graveyard Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_3));
+ locationTable[RC_KAK_GRASS_4] = Location::Grass(RC_KAK_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-800, 521), "Tree Grass 1", "Tree Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_4));
+ locationTable[RC_KAK_GRASS_5] = Location::Grass(RC_KAK_GRASS_5, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-826, 585), "Tree Grass 2", "Tree Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_5));
+ locationTable[RC_KAK_GRASS_6] = Location::Grass(RC_KAK_GRASS_6, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-827, 465), "Tree Grass 3", "Tree Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_6));
+ locationTable[RC_KAK_GRASS_7] = Location::Grass(RC_KAK_GRASS_7, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-883, 582), "Tree Grass 4", "Tree Grass 4", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_7));
+ locationTable[RC_KAK_GRASS_8] = Location::Grass(RC_KAK_GRASS_8, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-887, 467), "Tree Grass 5", "Tree Grass 5", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_8));
+ locationTable[RC_GY_GRASS_1] = Location::Grass(RC_GY_GRASS_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1059, 732), "Graveyard Grass 1", "Graveyard Grass 1", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_1));
+ locationTable[RC_GY_GRASS_2] = Location::Grass(RC_GY_GRASS_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1089, 769), "Graveyard Grass 2", "Graveyard Grass 2", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_2));
+ locationTable[RC_GY_GRASS_3] = Location::Grass(RC_GY_GRASS_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1138, 761), "Graveyard Grass 3", "Graveyard Grass 3", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_3));
+ locationTable[RC_GY_GRASS_4] = Location::Grass(RC_GY_GRASS_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 726), "Graveyard Grass 4", "Graveyard Grass 4", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_4));
+ locationTable[RC_GY_GRASS_5] = Location::Grass(RC_GY_GRASS_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 653), "Graveyard Grass 5", "Graveyard Grass 5", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_5));
+ locationTable[RC_GY_GRASS_6] = Location::Grass(RC_GY_GRASS_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 610), "Graveyard Grass 6", "Graveyard Grass 6", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_6));
+ locationTable[RC_GY_GRASS_7] = Location::Grass(RC_GY_GRASS_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1030, 653), "Graveyard Grass 7", "Graveyard Grass 7", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_7));
+ locationTable[RC_GY_GRASS_8] = Location::Grass(RC_GY_GRASS_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 710), "Graveyard Grass 8", "Graveyard Grass 8", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_8));
+ locationTable[RC_GY_GRASS_9] = Location::Grass(RC_GY_GRASS_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1141, 696), "Graveyard Grass 9", "Graveyard Grass 9", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_9));
+ locationTable[RC_GY_GRASS_10] = Location::Grass(RC_GY_GRASS_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1125, 657), "Graveyard Grass 10", "Graveyard Grass 10", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_10));
+ locationTable[RC_GY_GRASS_11] = Location::Grass(RC_GY_GRASS_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1083, 654), "Graveyard Grass 11", "Graveyard Grass 11", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_11));
+ locationTable[RC_GY_GRASS_12] = Location::Grass(RC_GY_GRASS_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1062, 683), "Graveyard Grass 12", "Graveyard Grass 12", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_12));
+ locationTable[RC_LH_GRASS_1] = Location::Grass(RC_LH_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1637, 2796), "LH Grass 1", "LH Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_1));
+ locationTable[RC_LH_GRASS_2] = Location::Grass(RC_LH_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1667, 2833), "LH Grass 2", "LH Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_2));
+ locationTable[RC_LH_GRASS_3] = Location::Grass(RC_LH_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1716, 2825), "LH Grass 3", "LH Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_3));
+ locationTable[RC_LH_GRASS_4] = Location::Grass(RC_LH_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2790), "LH Grass 4", "LH Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_4));
+ locationTable[RC_LH_GRASS_5] = Location::Grass(RC_LH_GRASS_5, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2717), "LH Grass 5", "LH Grass 5", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_5));
+ locationTable[RC_LH_GRASS_6] = Location::Grass(RC_LH_GRASS_6, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2674), "LH Grass 6", "LH Grass 6", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_6));
+ locationTable[RC_LH_GRASS_7] = Location::Grass(RC_LH_GRASS_7, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1608, 2717), "LH Grass 7", "LH Grass 7", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_7));
+ locationTable[RC_LH_GRASS_8] = Location::Grass(RC_LH_GRASS_8, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2774), "LH Grass 8", "LH Grass 8", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_8));
+ locationTable[RC_LH_GRASS_9] = Location::Grass(RC_LH_GRASS_9, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1719, 2760), "LH Grass 9", "LH Grass 9", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_9));
+ locationTable[RC_LH_GRASS_10] = Location::Grass(RC_LH_GRASS_10, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1703, 2721), "LH Grass 10", "LH Grass 10", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_10));
+ locationTable[RC_LH_GRASS_11] = Location::Grass(RC_LH_GRASS_11, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1661, 2718), "LH Grass 11", "LH Grass 11", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_11));
+ locationTable[RC_LH_GRASS_12] = Location::Grass(RC_LH_GRASS_12, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1640, 2747), "LH Grass 12", "LH Grass 12", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_12));
+ locationTable[RC_LH_GRASS_13] = Location::Grass(RC_LH_GRASS_13, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2028, 2542), "LH Grass 13", "LH Grass 13", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_13));
+ locationTable[RC_LH_GRASS_14] = Location::Grass(RC_LH_GRASS_14, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2058, 2579), "LH Grass 14", "LH Grass 14", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_14));
+ locationTable[RC_LH_GRASS_15] = Location::Grass(RC_LH_GRASS_15, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2107, 2571), "LH Grass 15", "LH Grass 15", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_15));
+ locationTable[RC_LH_GRASS_16] = Location::Grass(RC_LH_GRASS_16, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2536), "LH Grass 16", "LH Grass 16", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_16));
+ locationTable[RC_LH_GRASS_17] = Location::Grass(RC_LH_GRASS_17, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2463), "LH Grass 17", "LH Grass 17", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_17));
+ locationTable[RC_LH_GRASS_18] = Location::Grass(RC_LH_GRASS_18, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2420), "LH Grass 18", "LH Grass 18", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_18));
+ locationTable[RC_LH_GRASS_19] = Location::Grass(RC_LH_GRASS_19, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1999, 2463), "LH Grass 19", "LH Grass 19", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_19));
+ locationTable[RC_LH_GRASS_20] = Location::Grass(RC_LH_GRASS_20, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2520), "LH Grass 20", "LH Grass 20", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_20));
+ locationTable[RC_LH_GRASS_21] = Location::Grass(RC_LH_GRASS_21, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2110, 2506), "LH Grass 21", "LH Grass 21", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_21));
+ locationTable[RC_LH_GRASS_22] = Location::Grass(RC_LH_GRASS_22, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2094, 2467), "LH Grass 22", "LH Grass 22", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_22));
+ locationTable[RC_LH_GRASS_23] = Location::Grass(RC_LH_GRASS_23, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2052, 2464), "LH Grass 23", "LH Grass 23", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_23));
+ locationTable[RC_LH_GRASS_24] = Location::Grass(RC_LH_GRASS_24, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2031, 2493), "LH Grass 24", "LH Grass 24", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_24));
+ locationTable[RC_LH_GRASS_25] = Location::Grass(RC_LH_GRASS_25, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2204, 3050), "LH Grass 25", "LH Grass 25", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_25));
+ locationTable[RC_LH_GRASS_26] = Location::Grass(RC_LH_GRASS_26, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2234, 3087), "LH Grass 26", "LH Grass 26", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_26));
+ locationTable[RC_LH_GRASS_27] = Location::Grass(RC_LH_GRASS_27, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2283, 3079), "LH Grass 27", "LH Grass 27", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_27));
+ locationTable[RC_LH_GRASS_28] = Location::Grass(RC_LH_GRASS_28, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 3044), "LH Grass 28", "LH Grass 28", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_28));
+ locationTable[RC_LH_GRASS_29] = Location::Grass(RC_LH_GRASS_29, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 2971), "LH Grass 29", "LH Grass 29", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_29));
+ locationTable[RC_LH_GRASS_30] = Location::Grass(RC_LH_GRASS_30, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 2928), "LH Grass 30", "LH Grass 30", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_30));
+ locationTable[RC_LH_GRASS_31] = Location::Grass(RC_LH_GRASS_31, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2175, 2971), "LH Grass 31", "LH Grass 31", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_31));
+ locationTable[RC_LH_GRASS_32] = Location::Grass(RC_LH_GRASS_32, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 3028), "LH Grass 32", "LH Grass 32", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_32));
+ locationTable[RC_LH_GRASS_33] = Location::Grass(RC_LH_GRASS_33, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2286, 3014), "LH Grass 33", "LH Grass 33", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_33));
+ locationTable[RC_LH_GRASS_34] = Location::Grass(RC_LH_GRASS_34, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2270, 2975), "LH Grass 34", "LH Grass 34", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_34));
+ locationTable[RC_LH_GRASS_35] = Location::Grass(RC_LH_GRASS_35, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2228, 2972), "LH Grass 35", "LH Grass 35", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_35));
+ locationTable[RC_LH_GRASS_36] = Location::Grass(RC_LH_GRASS_36, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2207, 3001), "LH Grass 36", "LH Grass 36", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_36));
+ locationTable[RC_LH_CHILD_GRASS_1] = Location::Grass(RC_LH_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(13, 2735), "LH Child Grass 1", "LH Child Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_1));
+ locationTable[RC_LH_CHILD_GRASS_2] = Location::Grass(RC_LH_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-77, 2891), "LH Child Grass 2", "LH Child Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_2));
+ locationTable[RC_LH_CHILD_GRASS_3] = Location::Grass(RC_LH_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-222, 2888), "LH Child Grass 3", "LH Child Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_3));
+ locationTable[RC_LH_CHILD_GRASS_4] = Location::Grass(RC_LH_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-295, 2973), "LH Child Grass 4", "LH Child Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_4));
+ locationTable[RC_LH_WARP_PAD_GRASS_1] = Location::Grass(RC_LH_WARP_PAD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-613, 7369), "LH Warp Pad Grass 1", "LH Warp Pad Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_1));
+ locationTable[RC_LH_WARP_PAD_GRASS_2] = Location::Grass(RC_LH_WARP_PAD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-662, 7352), "LH Warp Pad Grass 2", "LH Warp Pad Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_2));
+ locationTable[RC_HF_NEAR_KF_GRASS_1] = Location::Grass(RC_HF_NEAR_KF_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3186, 7571), "Near KF Grass 1", "Near KF Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_1));
+ locationTable[RC_HF_NEAR_KF_GRASS_2] = Location::Grass(RC_HF_NEAR_KF_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3156, 7608), "Near KF Grass 2", "Near KF Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_2));
+ locationTable[RC_HF_NEAR_KF_GRASS_3] = Location::Grass(RC_HF_NEAR_KF_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3107, 7600), "Near KF Grass 3", "Near KF Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_3));
+ locationTable[RC_HF_NEAR_KF_GRASS_4] = Location::Grass(RC_HF_NEAR_KF_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7565), "Near KF Grass 4", "Near KF Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_4));
+ locationTable[RC_HF_NEAR_KF_GRASS_5] = Location::Grass(RC_HF_NEAR_KF_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7492), "Near KF Grass 5", "Near KF Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_5));
+ locationTable[RC_HF_NEAR_KF_GRASS_6] = Location::Grass(RC_HF_NEAR_KF_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7449), "Near KF Grass 6", "Near KF Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_6));
+ locationTable[RC_HF_NEAR_KF_GRASS_7] = Location::Grass(RC_HF_NEAR_KF_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3215, 7492), "Near KF Grass 7", "Near KF Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_7));
+ locationTable[RC_HF_NEAR_KF_GRASS_8] = Location::Grass(RC_HF_NEAR_KF_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7549), "Near KF Grass 8", "Near KF Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_8));
+ locationTable[RC_HF_NEAR_KF_GRASS_9] = Location::Grass(RC_HF_NEAR_KF_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3104, 7535), "Near KF Grass 9", "Near KF Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_9));
+ locationTable[RC_HF_NEAR_KF_GRASS_10] = Location::Grass(RC_HF_NEAR_KF_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3120, 7496), "Near KF Grass 10", "Near KF Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_10));
+ locationTable[RC_HF_NEAR_KF_GRASS_11] = Location::Grass(RC_HF_NEAR_KF_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3162, 7493), "Near KF Grass 11", "Near KF Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_11));
+ locationTable[RC_HF_NEAR_KF_GRASS_12] = Location::Grass(RC_HF_NEAR_KF_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3183, 7522), "Near KF Grass 12", "Near KF Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_12));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950, 3613), "Near Market Grass 1", "Near Market Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_1));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(920, 3650), "Near Market Grass 2", "Near Market Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_2));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(871, 3642), "Near Market Grass 3", "Near Market Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_3));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3607), "Near Market Grass 4", "Near Market Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_4));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_5] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3534), "Near Market Grass 5", "Near Market Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_5));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_6] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3491), "Near Market Grass 6", "Near Market Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_6));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_7] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(979, 3534), "Near Market Grass 7", "Near Market Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_7));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_8] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3591), "Near Market Grass 8", "Near Market Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_8));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_9] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(868, 3577), "Near Market Grass 9", "Near Market Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_9));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_10] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(884, 3538), "Near Market Grass 10", "Near Market Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_10));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_11] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(926, 3535), "Near Market Grass 11", "Near Market Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_11));
+ locationTable[RC_HF_NEAR_MARKET_GRASS_12] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(947, 3564), "Near Market Grass 12", "Near Market Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_12));
+ locationTable[RC_HF_SOUTH_GRASS_1] = Location::Grass(RC_HF_SOUTH_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-483, 11329), "South Grass 1", "South Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_1));
+ locationTable[RC_HF_SOUTH_GRASS_2] = Location::Grass(RC_HF_SOUTH_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11294), "South Grass 2", "South Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_2));
+ locationTable[RC_HF_SOUTH_GRASS_3] = Location::Grass(RC_HF_SOUTH_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11221), "South Grass 3", "South Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_3));
+ locationTable[RC_HF_SOUTH_GRASS_4] = Location::Grass(RC_HF_SOUTH_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11178), "South Grass 4", "South Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_4));
+ locationTable[RC_HF_SOUTH_GRASS_5] = Location::Grass(RC_HF_SOUTH_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-375, 11221), "South Grass 5", "South Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_5));
+ locationTable[RC_HF_SOUTH_GRASS_6] = Location::Grass(RC_HF_SOUTH_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11278), "South Grass 6", "South Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_6));
+ locationTable[RC_HF_SOUTH_GRASS_7] = Location::Grass(RC_HF_SOUTH_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-486, 11264), "South Grass 7", "South Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_7));
+ locationTable[RC_HF_SOUTH_GRASS_8] = Location::Grass(RC_HF_SOUTH_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-470, 11225), "South Grass 8", "South Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_8));
+ locationTable[RC_HF_SOUTH_GRASS_9] = Location::Grass(RC_HF_SOUTH_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-428, 11222), "South Grass 9", "South Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_9));
+ locationTable[RC_HF_SOUTH_GRASS_10] = Location::Grass(RC_HF_SOUTH_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-407, 11251), "South Grass 10", "South Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_10));
+ locationTable[RC_HF_SOUTH_GRASS_11] = Location::Grass(RC_HF_SOUTH_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-404, 11300), "South Grass 11", "South Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_11));
+ locationTable[RC_HF_SOUTH_GRASS_12] = Location::Grass(RC_HF_SOUTH_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-434, 11337), "South Grass 12", "South Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_12));
+ locationTable[RC_HF_CENTRAL_GRASS_1] = Location::Grass(RC_HF_CENTRAL_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-948, 9981), "Central Grass 1", "Central Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_1));
+ locationTable[RC_HF_CENTRAL_GRASS_2] = Location::Grass(RC_HF_CENTRAL_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-978, 10018), "Central Grass 2", "Central Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_2));
+ locationTable[RC_HF_CENTRAL_GRASS_3] = Location::Grass(RC_HF_CENTRAL_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1027, 10010), "Central Grass 3", "Central Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_3));
+ locationTable[RC_HF_CENTRAL_GRASS_4] = Location::Grass(RC_HF_CENTRAL_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9975), "Central Grass 4", "Central Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_4));
+ locationTable[RC_HF_CENTRAL_GRASS_5] = Location::Grass(RC_HF_CENTRAL_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9902), "Central Grass 5", "Central Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_5));
+ locationTable[RC_HF_CENTRAL_GRASS_6] = Location::Grass(RC_HF_CENTRAL_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9859), "Central Grass 6", "Central Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_6));
+ locationTable[RC_HF_CENTRAL_GRASS_7] = Location::Grass(RC_HF_CENTRAL_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-919, 9902), "Central Grass 7", "Central Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_7));
+ locationTable[RC_HF_CENTRAL_GRASS_8] = Location::Grass(RC_HF_CENTRAL_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9959), "Central Grass 8", "Central Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_8));
+ locationTable[RC_HF_CENTRAL_GRASS_9] = Location::Grass(RC_HF_CENTRAL_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1030, 9945), "Central Grass 9", "Central Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_9));
+ locationTable[RC_HF_CENTRAL_GRASS_10] = Location::Grass(RC_HF_CENTRAL_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1014, 9906), "Central Grass 10", "Central Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_10));
+ locationTable[RC_HF_CENTRAL_GRASS_11] = Location::Grass(RC_HF_CENTRAL_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-972, 9903), "Central Grass 11", "Central Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_11));
+ locationTable[RC_HF_CENTRAL_GRASS_12] = Location::Grass(RC_HF_CENTRAL_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-951, 9932), "Central Grass 12", "Central Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_12));
+ locationTable[RC_ZR_GRASS_1] = Location::Grass(RC_ZR_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1495, 1022), "Near Tree Grass 1", "Near Tree Grass 1", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_1));
+ locationTable[RC_ZR_GRASS_2] = Location::Grass(RC_ZR_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1465, 985), "Near Tree Grass 2", "Near Tree Grass 2", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_2));
+ locationTable[RC_ZR_GRASS_3] = Location::Grass(RC_ZR_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1544, 1014), "Near Tree Grass 3", "Near Tree Grass 3", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_3));
+ locationTable[RC_ZR_GRASS_4] = Location::Grass(RC_ZR_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 979), "Near Tree Grass 4", "Near Tree Grass 4", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_4));
+ locationTable[RC_ZR_GRASS_5] = Location::Grass(RC_ZR_GRASS_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 906), "Near Tree Grass 5", "Near Tree Grass 5", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_5));
+ locationTable[RC_ZR_GRASS_6] = Location::Grass(RC_ZR_GRASS_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 863), "Near Tree Grass 6", "Near Tree Grass 6", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_6));
+ locationTable[RC_ZR_GRASS_7] = Location::Grass(RC_ZR_GRASS_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 963), "Near Tree Grass 7", "Near Tree Grass 7", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_7));
+ locationTable[RC_ZR_GRASS_8] = Location::Grass(RC_ZR_GRASS_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1547, 949), "Near Tree Grass 8", "Near Tree Grass 8", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_8));
+ locationTable[RC_ZR_GRASS_9] = Location::Grass(RC_ZR_GRASS_9, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1531, 910), "Near Tree Grass 9", "Near Tree Grass 9", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_9));
+ locationTable[RC_ZR_GRASS_10] = Location::Grass(RC_ZR_GRASS_10, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1489, 907), "Near Tree Grass 10", "Near Tree Grass 10", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_10));
+ locationTable[RC_ZR_GRASS_11] = Location::Grass(RC_ZR_GRASS_11, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1468, 936), "Near Tree Grass 11", "Near Tree Grass 11", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_11));
+ locationTable[RC_ZR_GRASS_12] = Location::Grass(RC_ZR_GRASS_12, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1436, 906), "Near Tree Grass 12", "Near Tree Grass 12", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_12));
+ locationTable[RC_ZR_NEAR_FREESTANDING_POH_GRASS] = Location::Grass(RC_ZR_NEAR_FREESTANDING_POH_GRASS, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(231, -1478), "Near Freestanding PoH Grass", "Near Freestanding PoH Grass", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS));
+ // Grotto Grass
+ locationTable[RC_KF_STORMS_GROTTO_GRASS_1] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x2C), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_1));
+ locationTable[RC_KF_STORMS_GROTTO_GRASS_2] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x2C), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_2));
+ locationTable[RC_KF_STORMS_GROTTO_GRASS_3] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x2C), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_3));
+ locationTable[RC_KF_STORMS_GROTTO_GRASS_4] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x2C), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_4));
+ locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x14), "Near Shortcuts Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1));
+ locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x14), "Near Shortcuts Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2));
+ locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x14), "Near Shortcuts Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3));
+ locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x14), "Near Shortcuts Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4));
+ locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_1] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x00), "Near Market Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1));
+ locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_2] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x00), "Near Market Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2));
+ locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_3] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x00), "Near Market Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3));
+ locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_4] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x00), "Near Market Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4));
+ locationTable[RC_HF_OPEN_GROTTO_GRASS_1] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x03), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_1));
+ locationTable[RC_HF_OPEN_GROTTO_GRASS_2] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x03), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_2));
+ locationTable[RC_HF_OPEN_GROTTO_GRASS_3] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x03), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_3));
+ locationTable[RC_HF_OPEN_GROTTO_GRASS_4] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x03), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_4));
+ locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_1] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x22), "Southeast Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1));
+ locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_2] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x22), "Southeast Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2));
+ locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_3] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x22), "Southeast Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3));
+ locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_4] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x22), "Southeast Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4));
+ locationTable[RC_HF_COW_GROTTO_GRASS_1] = Location::Base(RC_HF_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3419, 0xE4), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_1));
+ locationTable[RC_HF_COW_GROTTO_GRASS_2] = Location::Base(RC_HF_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3518, 0xE4), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_2));
+ locationTable[RC_KAK_OPEN_GROTTO_GRASS_1] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x28), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_1));
+ locationTable[RC_KAK_OPEN_GROTTO_GRASS_2] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x28), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_2));
+ locationTable[RC_KAK_OPEN_GROTTO_GRASS_3] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x28), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_3));
+ locationTable[RC_KAK_OPEN_GROTTO_GRASS_4] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x28), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_4));
+ locationTable[RC_DMT_STORMS_GROTTO_GRASS_1] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x57), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_1));
+ locationTable[RC_DMT_STORMS_GROTTO_GRASS_2] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x57), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_2));
+ locationTable[RC_DMT_STORMS_GROTTO_GRASS_3] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x57), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_3));
+ locationTable[RC_DMT_STORMS_GROTTO_GRASS_4] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x57), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_4));
+ locationTable[RC_DMT_COW_GROTTO_GRASS_1] = Location::Base(RC_DMT_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2443, 0xF8), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_1));
+ locationTable[RC_DMT_COW_GROTTO_GRASS_2] = Location::Base(RC_DMT_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2494, 0xF8), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_2));
+ locationTable[RC_DMC_UPPER_GROTTO_GRASS_1] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x7A), "Upper Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_1));
+ locationTable[RC_DMC_UPPER_GROTTO_GRASS_2] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x7A), "Upper Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_2));
+ locationTable[RC_DMC_UPPER_GROTTO_GRASS_3] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x7A), "Upper Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_3));
+ locationTable[RC_DMC_UPPER_GROTTO_GRASS_4] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x7A), "Upper Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_4));
+ locationTable[RC_ZR_OPEN_GROTTO_GRASS_1] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x29), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_1));
+ locationTable[RC_ZR_OPEN_GROTTO_GRASS_2] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x29), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_2));
+ locationTable[RC_ZR_OPEN_GROTTO_GRASS_3] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x29), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_3));
+ locationTable[RC_ZR_OPEN_GROTTO_GRASS_4] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x29), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_4));
+ // Dungeon Grass
+ locationTable[RC_DEKU_TREE_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(391, -156), "Deku Tree Lobby Grass 1", "Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_1));
+ locationTable[RC_DEKU_TREE_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(355, -233), "Deku Tree Lobby Grass 2", "Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_2));
+ locationTable[RC_DEKU_TREE_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(307, -289), "Deku Tree Lobby Grass 3", "Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_3));
+ locationTable[RC_DEKU_TREE_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, -414), "Deku Tree Lobby Grass 4", "Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_4));
+ locationTable[RC_DEKU_TREE_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_5, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(142, -399), "Deku Tree Lobby Grass 5", "Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_5));
+ locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1018, 1263), "Deku Tree Slingshot Grass 1", "Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1));
+ locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1005, 1216), "Deku Tree Slingshot Grass 2", "Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2));
+ locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1280, 1026), "Deku Tree Slingshot Grass 3", "Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3));
+ locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1229, 1006), "Deku Tree Slingshot Grass 4", "Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4));
+ locationTable[RC_DEKU_TREE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1444, 169), "Deku Tree Compass Grass 1", "Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_1));
+ locationTable[RC_DEKU_TREE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1516, 142), "Deku Tree Compass Grass 2", "Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_2));
+ locationTable[RC_DEKU_TREE_BASEMENT_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 130), "Deku Tree Basement Grass 1", "Deku Tree Basement Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1));
+ locationTable[RC_DEKU_TREE_BASEMENT_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 187), "Deku Tree Basement Grass 2", "Deku Tree Basement Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2));
+ locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-228, 792), "Deku Tree Eye Switch Grass 1", "Deku Tree Eye Switch Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1));
+ locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-202, 751), "Deku Tree Eye Switch Grass 2", "Deku Tree Eye Switch Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2));
+ locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(79, 794), "Deku Tree Eye Switch Grass 3", "Deku Tree Eye Switch Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3));
+ locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(49, 752), "Deku Tree Eye Switch Grass 4", "Deku Tree Eye Switch Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4));
+ locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1310, 840), "Deku Tree Spike Roller Grass 1", "Deku Tree Spike Roller Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1));
+ locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1361, 840), "Deku Tree Spike Roller Grass 2", "Deku Tree Spike Roller Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2));
+ locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1796, 821), "Deku Tree Torches Grass 1", "Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1));
+ locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1919, 820), "Deku Tree Torches Grass 2", "Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2));
+ locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1955, -296), "Deku Tree Larvae Grass 1", "Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1));
+ locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2025, -301), "Deku Tree Larvae Grass 2", "Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2));
+ locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -515), "Deku Tree Before Boss Grass 1", "Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1));
+ locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -577), "Deku Tree Before Boss Grass 2", "Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2));
+ locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-269, -643), "Deku Tree Before Boss Grass 3", "Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3));
+ locationTable[RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-760, -465), "Dodongo's Cavern First Bridge Grass", "Dodongo's Cavern First Bridge Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS));
+ locationTable[RC_DODONGOS_CAVERN_BLADE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BLADE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1713, -1246), "Dodongo's Cavern Blade Room Grass", "Dodongo's Cavern Blade Room Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS));
+ locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3189, -485), "Dodongo's Cavern Single Eye Grass", "Dodongo's Cavern Single Eye Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS));
+ locationTable[RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-249, -2519), "Dodongo's Cavern Before Boss Grass", "Dodongo's Cavern Before Boss Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-858, -1330), "Bottom of the Well Basement Behind Rocks Grass 1", "Bottom of the Well Basement Behind Rocks Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-870, -1021), "Bottom of the Well Basement Behind Rocks Grass 2", "Bottom of the Well Basement Behind Rocks Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-872, -1383), "Bottom of the Well Basement Behind Rocks Grass 3", "Bottom of the Well Basement Behind Rocks Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-874, -1447), "Bottom of the Well Basement Behind Rocks Grass 4", "Bottom of the Well Basement Behind Rocks Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-886, -1263), "Bottom of the Well Basement Behind Rocks Grass 5", "Bottom of the Well Basement Behind Rocks Grass 5", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-918, -1131), "Bottom of the Well Basement Behind Rocks Grass 6", "Bottom of the Well Basement Behind Rocks Grass 6", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-943, -1316), "Bottom of the Well Basement Behind Rocks Grass 7", "Bottom of the Well Basement Behind Rocks Grass 7", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1377), "Bottom of the Well Basement Behind Rocks Grass 8", "Bottom of the Well Basement Behind Rocks Grass 8", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1463), "Bottom of the Well Basement Behind Rocks Grass 9", "Bottom of the Well Basement Behind Rocks Grass 9", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-619, -627), "Bottom of the Well Basement Grass 1", "Bottom of the Well Basement Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-565, -654), "Bottom of the Well Basement Grass 2", "Bottom of the Well Basement Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2));
+ locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-552, -711), "Bottom of the Well Basement Grass 3", "Bottom of the Well Basement Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3));
+ // MQ Dungeon Grass
+ locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(392, -158), "MQ Deku Tree Lobby Grass 1", "MQ Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(356, -235), "MQ Deku Tree Lobby Grass 2", "MQ Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(308, -291), "MQ Deku Tree Lobby Grass 3", "MQ Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(81, -416), "MQ Deku Tree Lobby Grass 4", "MQ Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4));
+ locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(143, -401), "MQ Deku Tree Lobby Grass 5", "MQ Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5));
+ locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-11, -344), "MQ Deku Tree Lobby Grass 6", "MQ Deku Tree Lobby Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6));
+ locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-159, -302), "MQ Deku Tree Lobby Grass 7", "MQ Deku Tree Lobby Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7));
+ locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-636, 161), "MQ Deku Tree Slingshot Grass 1", "MQ Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-693, 182), "MQ Deku Tree Slingshot Grass 2", "MQ Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1443, 167), "MQ Deku Tree Slingshot Grass 3", "MQ Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1515, 140), "MQ Deku Tree Slingshot Grass 4", "MQ Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-753, 614), "MQ Deku Tree Before Compass Grass 1", "MQ Deku Tree Before Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-736, 795), "MQ Deku Tree Before Compass Grass 2", "MQ Deku Tree Before Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-575, 627), "MQ Deku Tree Before Compass Grass 3", "MQ Deku Tree Before Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-572, 727), "MQ Deku Tree Before Compass Grass 4", "MQ Deku Tree Before Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-788, 702), "MQ Deku Tree Before Compass Grass 5", "MQ Deku Tree Before Compass Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-654, 582), "MQ Deku Tree Before Compass Grass 6", "MQ Deku Tree Before Compass Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-643, 798), "MQ Deku Tree Before Compass Grass 7", "MQ Deku Tree Before Compass Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7));
+ locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1279, 1024), "MQ Deku Tree Compass Grass 1", "MQ Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1228, 1004), "MQ Deku Tree Compass Grass 2", "MQ Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1017, 1261), "MQ Deku Tree Compass Grass 3", "MQ Deku Tree Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1004, 1214), "MQ Deku Tree Compass Grass 4", "MQ Deku Tree Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-15, -261), "MQ Deku Tree Basement Lower Grass 1", "MQ Deku Tree Basement Lower Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-7, -328), "MQ Deku Tree Basement Lower Grass 2", "MQ Deku Tree Basement Lower Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(5, 119), "MQ Deku Tree Basement Lower Grass 3", "MQ Deku Tree Basement Lower Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-39, 118), "MQ Deku Tree Basement Lower Grass 4", "MQ Deku Tree Basement Lower Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-807, -228), "MQ Deku Tree Basement Upper Grass 1", "MQ Deku Tree Basement Upper Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-764, 280), "MQ Deku Tree Basement Upper Grass 2", "MQ Deku Tree Basement Upper Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, 237), "MQ Deku Tree Basement Upper Grass 3", "MQ Deku Tree Basement Upper Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-466, 865), "MQ Deku Tree Spike Roller Front Grass 1", "MQ Deku Tree Spike Roller Front Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-495, 906), "MQ Deku Tree Spike Roller Front Grass 2", "MQ Deku Tree Spike Roller Front Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-538, 907), "MQ Deku Tree Spike Roller Front Grass 3", "MQ Deku Tree Spike Roller Front Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1360, 838), "MQ Deku Tree Spike Roller Back Grass 1", "MQ Deku Tree Spike Roller Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1309, 838), "MQ Deku Tree Spike Roller Back Grass 2", "MQ Deku Tree Spike Roller Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-227, 790), "MQ Deku Tree Torches Grass 1", "MQ Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-201, 749), "MQ Deku Tree Torches Grass 2", "MQ Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(50, 750), "MQ Deku Tree Torches Grass 3", "MQ Deku Tree Torches Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, 792), "MQ Deku Tree Torches Grass 4", "MQ Deku Tree Torches Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1795, 819), "MQ Deku Tree Larvae Grass 1", "MQ Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1918, 818), "MQ Deku Tree Larvae Grass 2", "MQ Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1678, -120), "MQ Deku Tree Graves Grass 1", "MQ Deku Tree Graves Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1700, 196), "MQ Deku Tree Graves Grass 2", "MQ Deku Tree Graves Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2165, 350), "MQ Deku Tree Graves Grass 3", "MQ Deku Tree Graves Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2215, 56), "MQ Deku Tree Graves Grass 4", "MQ Deku Tree Graves Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1901, 604), "MQ Deku Tree Graves Grass 5", "MQ Deku Tree Graves Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2708, -522), "MQ Deku Tree Back Grass 1", "MQ Deku Tree Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2395, -587), "MQ Deku Tree Back Grass 2", "MQ Deku Tree Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2553, -433), "MQ Deku Tree Back Grass 3", "MQ Deku Tree Back Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -517), "MQ Deku Tree Before Boss Grass 1", "MQ Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -579), "MQ Deku Tree Before Boss Grass 2", "MQ Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2));
+ locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-268, -645), "MQ Deku Tree Before Boss Grass 3", "MQ Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3));
+ locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1721, -579), "MQ Dodongo's Cavern Compass Grass 1", "MQ Dodongo's Cavern Compass Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1));
+ locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1731, -45), "MQ Dodongo's Cavern Compass Grass 2", "MQ Dodongo's Cavern Compass Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2));
+ locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2218, -56), "MQ Dodongo's Cavern Compass Grass 3", "MQ Dodongo's Cavern Compass Grass 3", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3));
+ locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2230, -556), "MQ Dodongo's Cavern Compass Grass 4", "MQ Dodongo's Cavern Compass Grass 4", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4));
+ locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1765, -3940), "MQ Dodongo's Cavern Armos Grass", "MQ Dodongo's Cavern Armos Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS));
+ locationTable[RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1285, -4693), "MQ Dodongo's Cavern Back Poe Grass", "MQ Dodongo's Cavern Back Poe Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS));
+ locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2644, -3368), "MQ Dodongo's Cavern Scrub Grass 1", "MQ Dodongo's Cavern Scrub Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1));
+ locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2614, -3387), "MQ Dodongo's Cavern Scrub Grass 2", "MQ Dodongo's Cavern Scrub Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-219, -61), "MQ Jabu Jabu's Belly First Grass 1", "MQ Jabu Jabu's Belly First Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(213, -398), "MQ Jabu Jabu's Belly First Grass 2", "MQ Jabu Jabu's Belly First Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-192, -3209), "MQ Jabu Jabu's Belly Pit Grass 1", "MQ Jabu Jabu's Belly Pit Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(350, -3534), "MQ Jabu Jabu's Belly Pit Grass 2", "MQ Jabu Jabu's Belly Pit Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-91, -2815), "MQ Jabu Jabu's Belly Basement Grass 1", "MQ Jabu Jabu's Belly Basement Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(231, -3575), "MQ Jabu Jabu's Belly Basement Grass 2", "MQ Jabu Jabu's Belly Basement Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(305, -3481), "MQ Jabu Jabu's Belly Basement Grass 3", "MQ Jabu Jabu's Belly Basement Grass 3", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1089, -1489), "MQ Jabu Jabu's Belly Wigglers Grass", "MQ Jabu Jabu's Belly Wigglers Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(652, -5687), "MQ Jabu Jabu's Belly Like Like Grass", "MQ Jabu Jabu's Belly Like Like Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1228, -2647), "MQ Jabu Jabu's Belly Basement Boomerang Grass", "MQ Jabu Jabu's Belly Basement Boomerang Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1360, -3606), "MQ Jabu Jabu's Belly After Big Octo Grass 1", "MQ Jabu Jabu's Belly After Big Octo Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1086, -3346), "MQ Jabu Jabu's Belly After Big Octo Grass 2", "MQ Jabu Jabu's Belly After Big Octo Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1477, -1366), "MQ Jabu Jabu's Belly Before Boss Grass 1", "MQ Jabu Jabu's Belly Before Boss Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1));
+ locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1691, -1576), "MQ Jabu Jabu's Belly Before Boss Grass 2", "MQ Jabu Jabu's Belly Before Boss Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2));
+ locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1604, 3), "MQ Bottom of the Well Dead Hand Grass 1", "MQ Bottom of the Well Dead Hand Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1));
+ locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1529, 2), "MQ Bottom of the Well Dead Hand Grass 2", "MQ Bottom of the Well Dead Hand Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2));
+ locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1492, -49), "MQ Bottom of the Well Dead Hand Grass 3", "MQ Bottom of the Well Dead Hand Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3));
+ locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1458, -130), "MQ Bottom of the Well Dead Hand Grass 4", "MQ Bottom of the Well Dead Hand Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4));
+ // Shared Dungeon Grass
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(545, -75), "Deku Tree Queen Gohma Grass 1", "Deku Tree Queen Gohma Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1));
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(525, -375), "Deku Tree Queen Gohma Grass 2", "Deku Tree Queen Gohma Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2));
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-646, 108), "Deku Tree Queen Gohma Grass 3", "Deku Tree Queen Gohma Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3));
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-444, 323), "Deku Tree Queen Gohma Grass 4", "Deku Tree Queen Gohma Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4));
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-848, -166), "Deku Tree Queen Gohma Grass 5", "Deku Tree Queen Gohma Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5));
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-855, -596), "Deku Tree Queen Gohma Grass 6", "Deku Tree Queen Gohma Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6));
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Deku Tree Queen Gohma Grass 7", "Deku Tree Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7));
+ locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Deku Tree Queen Gohma Grass 8", "Deku Tree Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8));
+ // End Grass
+}
+
+static RegisterShipInitFunc registerShuffleGrass(RegisterShuffleGrass, { "IS_RANDO" });
+static RegisterShipInitFunc registerShuffleGrassLocations(Rando::StaticData::RegisterGrassLocations);
diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.h b/soh/soh/Enhancements/randomizer/ShuffleGrass.h
new file mode 100644
index 000000000..e666f107e
--- /dev/null
+++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.h
@@ -0,0 +1,15 @@
+#ifndef SHUFFLEGRASS_H
+#define SHUFFLEGRASS_H
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void EnKusa_RandomizerInit(void* actorRef);
+#ifdef __cplusplus
+};
+#endif
+
+#endif //SHUFFLEGRASS_H
diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp
index 221e2176c..77f67873e 100644
--- a/soh/soh/Enhancements/randomizer/context.cpp
+++ b/soh/soh/Enhancements/randomizer/context.cpp
@@ -179,6 +179,7 @@ void Context::GenerateLocationPool() {
(location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) ||
(location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) ||
(location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) ||
+ (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) ||
(location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) ||
(location.GetRCType() == RCTYPE_FREESTANDING &&
mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) ||
@@ -189,7 +190,8 @@ void Context::GenerateLocationPool() {
// Skip stuff that is shuffled to dungeon only, i.e. tokens, pots, etc., or other checks that
// should not have a shuffled item.
if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) ||
- (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS))) {
+ (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) ||
+ (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS))) {
continue;
}
// If we've gotten past all the conditions where an overworld location should not be
@@ -201,7 +203,8 @@ void Context::GenerateLocationPool() {
if (location.GetQuest() == RCQUEST_BOTH || (location.GetQuest() == RCQUEST_MQ) == dungeon->IsMQ()) {
if ((location.GetRCType() == RCTYPE_FREESTANDING &&
mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) ||
- (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD))) {
+ (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) ||
+ (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD))) {
continue;
}
// also add to that dungeon's location list.
diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp
index b6f332927..7b5f98f4b 100644
--- a/soh/soh/Enhancements/randomizer/location.cpp
+++ b/soh/soh/Enhancements/randomizer/location.cpp
@@ -392,3 +392,10 @@ Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest
RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) {
return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, false, collectionCheck};
}
+
+Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
+ SceneID scene_, int32_t actorParams_, std::string&& shortName_,
+ std::string&& spoilerName_, RandomizerHintTextKey hintKey,
+ RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) {
+ return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false, collectionCheck };
+}
diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h
index b4fb6482a..3806160c8 100644
--- a/soh/soh/Enhancements/randomizer/location.h
+++ b/soh/soh/Enhancements/randomizer/location.h
@@ -199,6 +199,11 @@ class Location {
RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
SpoilerCollectionCheck collectionCheck);
+ static Location Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_,
+ int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_,
+ RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
+ SpoilerCollectionCheck collectionCheck);
+
static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_,
std::string&& spoilerName_);
diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp
index 2a913f4a9..4ec6b6773 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp
@@ -131,20 +131,32 @@ void RegionTable_Init_BottomOfTheWell() {
areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
- LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()),
- LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, logic->CanCutShrubs() && logic->BlastOrSmash()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, logic->CanCutShrubs() && logic->BlastOrSmash()),
}, {
//Exits
Entrance(RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM, []{return logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}),
@@ -235,6 +247,10 @@ void RegionTable_Init_BottomOfTheWell() {
//Locations
LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DEAD_HAND)),
LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, logic->HasExplosives() || (ctx->GetTrickOption(RT_BOTW_MQ_DEADHAND_KEY) && logic->CanUse(RG_BOOMERANG))),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
//This assumes we spawned in dead hand's room, if whatever trick made this relevant instead puts us in the previous room, remove the kill Dead Hand check.
diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp
index 21a7151da..129a842ef 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp
@@ -25,6 +25,11 @@ void RegionTable_Init_DekuTree() {
LOCATION(RC_DEKU_TREE_MAP_CHEST, true),
LOCATION(RC_DEKU_TREE_LOBBY_LOWER_HEART, true),
LOCATION(RC_DEKU_TREE_LOBBY_UPPER_HEART, logic->CanPassEnemy(RE_BIG_SKULLTULA)),
+ LOCATION(RC_DEKU_TREE_LOBBY_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_LOBBY_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_LOBBY_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_LOBBY_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_LOBBY_GRASS_5, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}),
@@ -45,6 +50,10 @@ void RegionTable_Init_DekuTree() {
//Locations
LOCATION(RC_DEKU_TREE_SLINGSHOT_CHEST, true),
LOCATION(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, true),
+ LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_1, logic->CanCutShrubs() && logic->CanReflectNuts()),
+ LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_2, logic->CanCutShrubs() && logic->CanReflectNuts()),
+ LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_3, logic->CanCutShrubs() && logic->CanReflectNuts()),
+ LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_4, logic->CanCutShrubs() && logic->CanReflectNuts()),
}, {
//Exits
Entrance(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}),
@@ -59,6 +68,8 @@ void RegionTable_Init_DekuTree() {
LOCATION(RC_DEKU_TREE_COMPASS_CHEST, true),
LOCATION(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, true),
LOCATION(RC_DEKU_TREE_GS_COMPASS_ROOM, logic->CanAttack()),
+ LOCATION(RC_DEKU_TREE_COMPASS_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_COMPASS_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}),
@@ -74,6 +85,8 @@ void RegionTable_Init_DekuTree() {
LOCATION(RC_DEKU_TREE_BASEMENT_CHEST, true),
LOCATION(RC_DEKU_TREE_GS_BASEMENT_GATE, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)),
LOCATION(RC_DEKU_TREE_GS_BASEMENT_VINES, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) ? ED_SHORT_JUMPSLASH : ED_BOMB_THROW)),
+ LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_LOBBY, []{return true;}),
@@ -82,7 +95,13 @@ void RegionTable_Init_DekuTree() {
Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return false;}),
});
- areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
+ areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
+ //Location
+ LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_DEKU_TREE_BASEMENT_LOWER, []{return true;}),
Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanHitEyeTargets();});}),
@@ -94,7 +113,11 @@ void RegionTable_Init_DekuTree() {
Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}),
});
- areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
+ areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
+ //Locations
+ LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}),
Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}),
@@ -104,7 +127,11 @@ void RegionTable_Init_DekuTree() {
//Events
EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}),
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
- }, {}, {
+ }, {
+ //Locations
+ LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return true;}),
Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}),
@@ -114,7 +141,11 @@ void RegionTable_Init_DekuTree() {
//Events
EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}),
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
- }, {}, {
+ }, {
+ //Location
+ LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}),
Entrance(RR_DEKU_TREE_BASEMENT_BACK_ROOM, []{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}) && Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->BlastOrSmash();});}),
@@ -142,9 +173,12 @@ void RegionTable_Init_DekuTree() {
areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Region("Deku Tree Outside Boss Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
- LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
- LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
- LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
+ LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
+ LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
+ LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
+ LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()),
+ LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()),
+ LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()),
}, {
//Exits
Entrance(RR_DEKU_TREE_BASEMENT_UPPER, []{return true;}),
@@ -159,7 +193,14 @@ void RegionTable_Init_DekuTree() {
//Events
EventAccess(&logic->DekuBabaSticks, []{return logic->CanKillEnemy(RE_WITHERED_DEKU_BABA);}),
EventAccess(&logic->BrokeDeku1FWeb, []{return logic->HasFireSource();}),
- }, {}, {
+ }, {
+ //Locations
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}),
//may need canAvoid logic with enemy shuffle
@@ -173,9 +214,11 @@ void RegionTable_Init_DekuTree() {
areaTable[RR_DEKU_TREE_MQ_2F] = Region("Deku Tree MQ 2F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
- LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true),
- LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)),
- LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true),
+ LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true),
+ LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)),
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true),
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}),
@@ -195,6 +238,10 @@ void RegionTable_Init_DekuTree() {
LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, logic->CanKillEnemy(RE_DEKU_BABA)),
LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, logic->HasFireSourceWithTorch() || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))),
LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, true),
+ LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}),
@@ -205,7 +252,14 @@ void RegionTable_Init_DekuTree() {
areaTable[RR_DEKU_TREE_MQ_EYE_TARGET_ROOM] = Region("Deku Tree MQ Eye Target Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
- LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true),
+ LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return Here(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanHitEyeTargets();});}),
@@ -214,7 +268,11 @@ void RegionTable_Init_DekuTree() {
areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Region("Deku Tree MQ Compass Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
- LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true),
+ LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true),
+ LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}),
@@ -236,7 +294,11 @@ void RegionTable_Init_DekuTree() {
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
}, {
//Locations
- LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}),
@@ -250,7 +312,13 @@ void RegionTable_Init_DekuTree() {
//Events
//Implies CanKillEnemy(RE_GOHMA_LARVA)
EventAccess(&logic->ClearedMQDekuSERoom, []{return logic->CanKillEnemy(RE_MAD_SCRUB);}),
- }, {}, {
+ }, {
+ //Locations
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasFireSource();}),
Entrance(RR_DEKU_TREE_MQ_BASEMENT, []{return logic->ClearedMQDekuSERoom;}),
@@ -262,7 +330,10 @@ void RegionTable_Init_DekuTree() {
EventAccess(&logic->MQDekuWaterRoomTorches, []{return logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_STICKS) && (ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield())));}),
}, {
//Locations
- LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS));}),
@@ -276,14 +347,20 @@ void RegionTable_Init_DekuTree() {
}, {
//Locations
//it blocks the chest while stunned unless you stun it from afar while it's slightly off the ground
- LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)),
+ LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->MQDekuWaterRoomTorches && logic->CanPassEnemy(RE_BIG_SKULLTULA, logic->CanUse(RG_SONG_OF_TIME) ? ED_CLOSE : ED_SHORT_JUMPSLASH);}),
Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)));}),
});
- areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
+ areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
+ //Locations
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()),
+ }, {
//Exits
//both imply CanKillEnemy(RE_GOHMA_LARVA)
Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->CanKillEnemy(RE_MAD_SCRUB) && logic->CanKillEnemy(RE_KEESE);});}),
@@ -297,6 +374,11 @@ void RegionTable_Init_DekuTree() {
}, {
//Locations
LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG))),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->IsChild && Here(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}),
@@ -308,6 +390,9 @@ void RegionTable_Init_DekuTree() {
areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Region("Deku Tree MQ Basement Back Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return true;}),
@@ -318,7 +403,10 @@ void RegionTable_Init_DekuTree() {
EventAccess(&logic->PushedDekuBasementBlock, []{return true;}),
}, {
//Locations
- LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()),
+ LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->IsChild;}),
@@ -333,6 +421,9 @@ void RegionTable_Init_DekuTree() {
LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}),
@@ -354,8 +445,16 @@ void RegionTable_Init_DekuTree() {
EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || logic->CanKillEnemy(RE_GOHMA);}),
}, {
// Locations
- LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear),
- LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear),
+ LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, logic->DekuTreeClear && logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, logic->DekuTreeClear && logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, logic->DekuTreeClear && logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, logic->DekuTreeClear && logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, logic->DekuTreeClear && logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, logic->DekuTreeClear && logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, logic->DekuTreeClear && logic->CanCutShrubs()),
+ LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, logic->DekuTreeClear && logic->CanCutShrubs()),
}, {
// Exits
Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp
index 738368117..bea5801e5 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp
@@ -153,6 +153,8 @@ void RegionTable_Init_DodongosCavern() {
//Locations
LOCATION(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, true),
LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true),
+ LOCATION(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, logic->CanCutShrubs()),
+ LOCATION(RC_DODONGOS_CAVERN_BLADE_GRASS, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, []{return true;}),
@@ -174,6 +176,7 @@ void RegionTable_Init_DodongosCavern() {
//Locations
LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, logic->CanBreakPots()),
LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}),
@@ -226,7 +229,10 @@ void RegionTable_Init_DodongosCavern() {
areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Region("Dodongos Cavern Boss Region", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->FairyPot, []{return true;}),
- }, {}, {
+ }, {
+ //Location
+ LOCATION(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}),
Entrance(RR_DODONGOS_CAVERN_BACK_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOSS_AREA, []{return logic->CanBreakMudWalls();});}),
@@ -346,7 +352,11 @@ void RegionTable_Init_DodongosCavern() {
areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
- LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS, []{return true;}),
@@ -472,6 +482,8 @@ void RegionTable_Init_DodongosCavern() {
//Locations
LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add
//&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB)))
+ LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);});}),
@@ -497,6 +509,7 @@ void RegionTable_Init_DodongosCavern() {
LOCATION(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, true), //pulling the grave isn't required, as you can open the chest through it
LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, logic->CanBreakPots()),
LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return logic->CanAttack();}),
@@ -513,6 +526,7 @@ void RegionTable_Init_DodongosCavern() {
Here(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) /* || bunny jumps*/);})),
LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, logic->CanBreakPots()),
LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, logic->CanBreakPots()),
+ LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp
index 8e3c8a8d4..ed28e8672 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp
@@ -173,6 +173,8 @@ void RegionTable_Init_JabuJabusBelly() {
LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)),
LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, logic->CanBreakPots()),
LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return true;}),
@@ -220,6 +222,11 @@ void RegionTable_Init_JabuJabusBelly() {
//Locations
LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)),
LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, logic->CanCutShrubs() && logic->HasExplosives()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, logic->CanCutShrubs() && logic->HasExplosives()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return true;}),
@@ -233,10 +240,11 @@ void RegionTable_Init_JabuJabusBelly() {
//Locations
LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, true),
//Implies logic->CanKillEnemy(RE_LIKE_LIKE) && logic->CanKillEnemy(RE_STINGER). Without swim, jump from the song of time block to the vines.
- LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)),
- LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))),
- LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()),
- LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, logic->CanCutShrubs()),
}, {
//Exits
//without swim, jump from rang chest to the other side
@@ -254,6 +262,7 @@ void RegionTable_Init_JabuJabusBelly() {
LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)),
LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()),
LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanUse(RG_BOOMERANG);}),
@@ -298,7 +307,10 @@ void RegionTable_Init_JabuJabusBelly() {
EventAccess(&logic->LoweredJabuPath, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}),
}, {
//Locations
- LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, logic->CanCutShrubs()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}),
@@ -320,9 +332,11 @@ void RegionTable_Init_JabuJabusBelly() {
EventAccess(&logic->FairyPot, []{return true;}),
}, {
//Locations
- LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)),
- LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))),
- LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp
index 33022e270..bdcdf9a4c 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp
@@ -29,6 +29,8 @@ void RegionTable_Init_CastleGrounds() {
LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_HC_MALON_GOSSIP_STONE, true),
LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true),
+ LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_CASTLE_GROUNDS, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp
index 48863c695..cc5601fcb 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp
@@ -114,6 +114,10 @@ void RegionTable_Init_DeathMountainCrater() {
LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_DMC_UPPER_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DMC_UPPER_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DMC_UPPER_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DMC_UPPER_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DMC_UPPER_LOCAL, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp
index 750fbf140..b9fab96e0 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp
@@ -73,6 +73,8 @@ void RegionTable_Init_DeathMountainTrail() {
LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true),
LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true),
LOCATION(RC_DMT_COW_GROTTO_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)),
+ LOCATION(RC_DMT_COW_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DMT_COW_GROTTO_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}),
@@ -87,6 +89,10 @@ void RegionTable_Init_DeathMountainTrail() {
LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_DMT_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_DMT_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_DMT_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_DMT_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp
index 6a3fb41f5..694d0e3ee 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp
@@ -19,6 +19,18 @@ void RegionTable_Init_Graveyard() {
LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
+ LOCATION(RC_GY_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_9, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()),
+ LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->IsAdult || logic->AtNight;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp
index f6c9d1c40..add3a2f86 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp
@@ -13,6 +13,54 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)),
LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)),
LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)),
+ LOCATION(RC_HF_CENTRAL_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_9, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_10, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_11, logic->CanCutShrubs()),
+ LOCATION(RC_HF_CENTRAL_GRASS_12, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_9, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_10, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_11, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTH_GRASS_12, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_9, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_10, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_11, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GRASS_12, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_9, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_LW_BRIDGE, []{return true;}),
@@ -41,6 +89,10 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HYRULE_FIELD, []{return true;}),
@@ -55,6 +107,10 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_HF_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_HF_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_HF_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HYRULE_FIELD, []{return true;}),
@@ -89,6 +145,8 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_HF_COW_GROTTO_POT_1, logic->CanBreakPots()),
LOCATION(RC_HF_COW_GROTTO_POT_2, logic->CanBreakPots()),
+ LOCATION(RC_HF_COW_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_COW_GROTTO_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HF_COW_GROTTO, []{return true;}),
@@ -103,6 +161,10 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HYRULE_FIELD, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp
index 846e55203..7fffa5d72 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp
@@ -31,6 +31,14 @@ void RegionTable_Init_Kakariko() {
LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()),
LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()),
LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()),
+ LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HYRULE_FIELD, []{return true;}),
@@ -224,6 +232,10 @@ void RegionTable_Init_Kakariko() {
LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_KAK_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_KAK_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_KAK_BACKYARD, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp
index cdd43b042..80df2bb91 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp
@@ -40,6 +40,41 @@ void RegionTable_Init_KokiriForest() {
LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild),
LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild),
LOCATION(RC_KF_GOSSIP_STONE, true),
+ LOCATION(RC_KF_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_5, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_6, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_7, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_8, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_9, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_10, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_11, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_12, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_MAZE_1, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_1, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_2, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_3, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_4, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_5, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_6, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_7, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_8, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_9, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_10, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_11, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_12, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_13, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_14, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_15, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_16, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_17, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_19, logic->IsAdult && logic->CanCutShrubs()),
+ LOCATION(RC_KF_ADULT_GRASS_20, logic->IsAdult && logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_KF_LINKS_HOUSE, []{return true;}),
@@ -146,6 +181,10 @@ void RegionTable_Init_KokiriForest() {
LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_KF_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_KF_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_KF_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_KF_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_KOKIRI_FOREST, []{return true;})
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp
index d4b950d78..04ae5fe85 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp
@@ -39,6 +39,48 @@ void RegionTable_Init_LakeHylia() {
LOCATION(RC_LH_LAB_GOSSIP_STONE, true),
LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true),
LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true),
+ LOCATION(RC_LH_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_9, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_10, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_11, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_12, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_13, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_14, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_15, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_16, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_17, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_18, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_19, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_20, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_21, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_22, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_23, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_24, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_25, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_26, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_27, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_28, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_29, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_30, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_31, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_32, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_33, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_34, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_35, logic->CanCutShrubs()),
+ LOCATION(RC_LH_GRASS_36, logic->CanCutShrubs()),
+ LOCATION(RC_LH_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_LH_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_LH_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_LH_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_LH_WARP_PAD_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_LH_WARP_PAD_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HYRULE_FIELD, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp
index fb146ec54..812b33a55 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp
@@ -49,6 +49,9 @@ void RegionTable_Init_LostWoods() {
LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_SHORTCUT_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_GOSSIP_STONE, true),
+ LOCATION(RC_LW_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_LW_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_LW_GRASS_3, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_LW_FOREST_EXIT, []{return true;}),
@@ -72,6 +75,12 @@ void RegionTable_Init_LostWoods() {
LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
+ LOCATION(RC_LW_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_LW_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_LW_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_LW_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_LW_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_LW_GRASS_9, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_LW_FOREST_EXIT, []{return true;}),
@@ -90,6 +99,10 @@ void RegionTable_Init_LostWoods() {
LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_THE_LOST_WOODS, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp
index 3924c858a..02dea3b56 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp
@@ -12,7 +12,17 @@ void RegionTable_Init_Market() {
Entrance(RR_MARKET_GUARD_HOUSE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}),
});
- areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, {
+ areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {
+ //Locations
+ LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()),
+ LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()),
+ }, {
//Exits
Entrance(RR_MARKET_ENTRANCE, []{return true;}),
Entrance(RR_TOT_ENTRANCE, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp
index 3a252edb0..3fbf8bdbd 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp
@@ -7,7 +7,19 @@ void RegionTable_Init_ZoraRiver() {
// clang-format off
areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, {
//Locations
- LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)),
+ LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)),
+ LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_4, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_5, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_6, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_7, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_8, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_9, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_ZORAS_RIVER, []{return logic->IsAdult || logic->BlastOrSmash();}),
@@ -48,6 +60,7 @@ void RegionTable_Init_ZoraRiver() {
LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG))),
LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true),
LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true),
+ LOCATION(RC_ZR_NEAR_FREESTANDING_POH_GRASS, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_ZR_FRONT, []{return true;}),
@@ -73,6 +86,10 @@ void RegionTable_Init_ZoraRiver() {
LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, true),
LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()),
LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()),
+ LOCATION(RC_ZR_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()),
+ LOCATION(RC_ZR_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_ZORAS_RIVER, []{return true;}),
diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp
index a3184765f..576e8c334 100644
--- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp
+++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp
@@ -449,6 +449,17 @@ void Settings::CreateOptionDescriptions() {
"All Items - Shuffle all freestanding rupees & hearts.";
mOptionDescriptions[RSK_SHUFFLE_FAIRIES] =
"Shuffle fairy locations.";
+ mOptionDescriptions[RSK_SHUFFLE_GRASS] =
+ "Grass/Bushes will drop a randomized item the first time they're cut and collected. "
+ "Grass/Bushes will have a different appearance when they hold a randomized item.\n"
+ "\n"
+ "Off - Grass/Bushes will not be shuffled.\n"
+ "\n"
+ "Dungeons - Only shuffle grass/bushes that are within dungeons.\n"
+ "\n"
+ "Overworld - Only shuffle grass/bushes that are outside of dungeons.\n"
+ "\n"
+ "All Grass/Bushes - Shuffle all grass/bushes.";
mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] =
"Shuffles the location of Spiritual Stones and medallions.\n"
"Vanilla - Spiritual Stones and medallions will be given from their respective boss.\n"
diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp
index 4eac2e5bb..f99a38ba3 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer.cpp
@@ -1007,6 +1007,356 @@ std::map rcToRandomizerInf = {
{ RC_ZD_FISH_3, RAND_INF_ZD_FISH_3 },
{ RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 },
{ RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 },
+ // Grass
+ { RC_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_1 },
+ { RC_KF_CHILD_GRASS_2, RAND_INF_KF_CHILD_GRASS_2 },
+ { RC_KF_CHILD_GRASS_3, RAND_INF_KF_CHILD_GRASS_3 },
+ { RC_KF_CHILD_GRASS_4, RAND_INF_KF_CHILD_GRASS_4 },
+ { RC_KF_CHILD_GRASS_5, RAND_INF_KF_CHILD_GRASS_5 },
+ { RC_KF_CHILD_GRASS_6, RAND_INF_KF_CHILD_GRASS_6 },
+ { RC_KF_CHILD_GRASS_7, RAND_INF_KF_CHILD_GRASS_7 },
+ { RC_KF_CHILD_GRASS_8, RAND_INF_KF_CHILD_GRASS_8 },
+ { RC_KF_CHILD_GRASS_9, RAND_INF_KF_CHILD_GRASS_9 },
+ { RC_KF_CHILD_GRASS_10, RAND_INF_KF_CHILD_GRASS_10 },
+ { RC_KF_CHILD_GRASS_11, RAND_INF_KF_CHILD_GRASS_11 },
+ { RC_KF_CHILD_GRASS_12, RAND_INF_KF_CHILD_GRASS_12 },
+ { RC_KF_CHILD_GRASS_MAZE_1, RAND_INF_KF_CHILD_GRASS_MAZE_1 },
+ { RC_KF_CHILD_GRASS_MAZE_2, RAND_INF_KF_CHILD_GRASS_MAZE_2 },
+ { RC_KF_CHILD_GRASS_MAZE_3, RAND_INF_KF_CHILD_GRASS_MAZE_3 },
+ { RC_KF_ADULT_GRASS_1, RAND_INF_KF_ADULT_GRASS_1 },
+ { RC_KF_ADULT_GRASS_2, RAND_INF_KF_ADULT_GRASS_2 },
+ { RC_KF_ADULT_GRASS_3, RAND_INF_KF_ADULT_GRASS_3 },
+ { RC_KF_ADULT_GRASS_4, RAND_INF_KF_ADULT_GRASS_4 },
+ { RC_KF_ADULT_GRASS_5, RAND_INF_KF_ADULT_GRASS_5 },
+ { RC_KF_ADULT_GRASS_6, RAND_INF_KF_ADULT_GRASS_6 },
+ { RC_KF_ADULT_GRASS_7, RAND_INF_KF_ADULT_GRASS_7 },
+ { RC_KF_ADULT_GRASS_8, RAND_INF_KF_ADULT_GRASS_8 },
+ { RC_KF_ADULT_GRASS_9, RAND_INF_KF_ADULT_GRASS_9 },
+ { RC_KF_ADULT_GRASS_10, RAND_INF_KF_ADULT_GRASS_10 },
+ { RC_KF_ADULT_GRASS_11, RAND_INF_KF_ADULT_GRASS_11 },
+ { RC_KF_ADULT_GRASS_12, RAND_INF_KF_ADULT_GRASS_12 },
+ { RC_KF_ADULT_GRASS_13, RAND_INF_KF_ADULT_GRASS_13 },
+ { RC_KF_ADULT_GRASS_14, RAND_INF_KF_ADULT_GRASS_14 },
+ { RC_KF_ADULT_GRASS_15, RAND_INF_KF_ADULT_GRASS_15 },
+ { RC_KF_ADULT_GRASS_16, RAND_INF_KF_ADULT_GRASS_16 },
+ { RC_KF_ADULT_GRASS_17, RAND_INF_KF_ADULT_GRASS_17 },
+ { RC_KF_ADULT_GRASS_18, RAND_INF_KF_ADULT_GRASS_18 },
+ { RC_KF_ADULT_GRASS_19, RAND_INF_KF_ADULT_GRASS_19 },
+ { RC_KF_ADULT_GRASS_20, RAND_INF_KF_ADULT_GRASS_20 },
+ { RC_LW_GRASS_1, RAND_INF_LW_GRASS_1 },
+ { RC_LW_GRASS_2, RAND_INF_LW_GRASS_2 },
+ { RC_LW_GRASS_3, RAND_INF_LW_GRASS_3 },
+ { RC_LW_GRASS_4, RAND_INF_LW_GRASS_4 },
+ { RC_LW_GRASS_5, RAND_INF_LW_GRASS_5 },
+ { RC_LW_GRASS_6, RAND_INF_LW_GRASS_6 },
+ { RC_LW_GRASS_7, RAND_INF_LW_GRASS_7 },
+ { RC_LW_GRASS_8, RAND_INF_LW_GRASS_8 },
+ { RC_LW_GRASS_9, RAND_INF_LW_GRASS_9 },
+ { RC_MARKET_GRASS_1, RAND_INF_MARKET_GRASS_1 },
+ { RC_MARKET_GRASS_2, RAND_INF_MARKET_GRASS_2 },
+ { RC_MARKET_GRASS_3, RAND_INF_MARKET_GRASS_3 },
+ { RC_MARKET_GRASS_4, RAND_INF_MARKET_GRASS_4 },
+ { RC_MARKET_GRASS_5, RAND_INF_MARKET_GRASS_5 },
+ { RC_MARKET_GRASS_6, RAND_INF_MARKET_GRASS_6 },
+ { RC_MARKET_GRASS_7, RAND_INF_MARKET_GRASS_7 },
+ { RC_MARKET_GRASS_8, RAND_INF_MARKET_GRASS_8 },
+ { RC_HC_GRASS_1, RAND_INF_HC_GRASS_1 },
+ { RC_HC_GRASS_2, RAND_INF_HC_GRASS_2 },
+ { RC_KAK_GRASS_1, RAND_INF_KAK_GRASS_1 },
+ { RC_KAK_GRASS_2, RAND_INF_KAK_GRASS_2 },
+ { RC_KAK_GRASS_3, RAND_INF_KAK_GRASS_3 },
+ { RC_KAK_GRASS_4, RAND_INF_KAK_GRASS_4 },
+ { RC_KAK_GRASS_5, RAND_INF_KAK_GRASS_5 },
+ { RC_KAK_GRASS_6, RAND_INF_KAK_GRASS_6 },
+ { RC_KAK_GRASS_7, RAND_INF_KAK_GRASS_7 },
+ { RC_KAK_GRASS_8, RAND_INF_KAK_GRASS_8 },
+ { RC_GY_GRASS_1, RAND_INF_GY_GRASS_1 },
+ { RC_GY_GRASS_2, RAND_INF_GY_GRASS_2 },
+ { RC_GY_GRASS_3, RAND_INF_GY_GRASS_3 },
+ { RC_GY_GRASS_4, RAND_INF_GY_GRASS_4 },
+ { RC_GY_GRASS_5, RAND_INF_GY_GRASS_5 },
+ { RC_GY_GRASS_6, RAND_INF_GY_GRASS_6 },
+ { RC_GY_GRASS_7, RAND_INF_GY_GRASS_7 },
+ { RC_GY_GRASS_8, RAND_INF_GY_GRASS_8 },
+ { RC_GY_GRASS_9, RAND_INF_GY_GRASS_9 },
+ { RC_GY_GRASS_10, RAND_INF_GY_GRASS_10 },
+ { RC_GY_GRASS_11, RAND_INF_GY_GRASS_11 },
+ { RC_GY_GRASS_12, RAND_INF_GY_GRASS_12 },
+ { RC_LH_GRASS_1, RAND_INF_LH_GRASS_1 },
+ { RC_LH_GRASS_2, RAND_INF_LH_GRASS_2 },
+ { RC_LH_GRASS_3, RAND_INF_LH_GRASS_3 },
+ { RC_LH_GRASS_4, RAND_INF_LH_GRASS_4 },
+ { RC_LH_GRASS_5, RAND_INF_LH_GRASS_5 },
+ { RC_LH_GRASS_6, RAND_INF_LH_GRASS_6 },
+ { RC_LH_GRASS_7, RAND_INF_LH_GRASS_7 },
+ { RC_LH_GRASS_8, RAND_INF_LH_GRASS_8 },
+ { RC_LH_GRASS_9, RAND_INF_LH_GRASS_9 },
+ { RC_LH_GRASS_10, RAND_INF_LH_GRASS_10 },
+ { RC_LH_GRASS_11, RAND_INF_LH_GRASS_11 },
+ { RC_LH_GRASS_12, RAND_INF_LH_GRASS_12 },
+ { RC_LH_GRASS_13, RAND_INF_LH_GRASS_13 },
+ { RC_LH_GRASS_14, RAND_INF_LH_GRASS_14 },
+ { RC_LH_GRASS_15, RAND_INF_LH_GRASS_15 },
+ { RC_LH_GRASS_16, RAND_INF_LH_GRASS_16 },
+ { RC_LH_GRASS_17, RAND_INF_LH_GRASS_17 },
+ { RC_LH_GRASS_18, RAND_INF_LH_GRASS_18 },
+ { RC_LH_GRASS_19, RAND_INF_LH_GRASS_19 },
+ { RC_LH_GRASS_20, RAND_INF_LH_GRASS_20 },
+ { RC_LH_GRASS_21, RAND_INF_LH_GRASS_21 },
+ { RC_LH_GRASS_22, RAND_INF_LH_GRASS_22 },
+ { RC_LH_GRASS_23, RAND_INF_LH_GRASS_23 },
+ { RC_LH_GRASS_24, RAND_INF_LH_GRASS_24 },
+ { RC_LH_GRASS_25, RAND_INF_LH_GRASS_25 },
+ { RC_LH_GRASS_26, RAND_INF_LH_GRASS_26 },
+ { RC_LH_GRASS_27, RAND_INF_LH_GRASS_27 },
+ { RC_LH_GRASS_28, RAND_INF_LH_GRASS_28 },
+ { RC_LH_GRASS_29, RAND_INF_LH_GRASS_29 },
+ { RC_LH_GRASS_30, RAND_INF_LH_GRASS_30 },
+ { RC_LH_GRASS_31, RAND_INF_LH_GRASS_31 },
+ { RC_LH_GRASS_32, RAND_INF_LH_GRASS_32 },
+ { RC_LH_GRASS_33, RAND_INF_LH_GRASS_33 },
+ { RC_LH_GRASS_34, RAND_INF_LH_GRASS_34 },
+ { RC_LH_GRASS_35, RAND_INF_LH_GRASS_35 },
+ { RC_LH_GRASS_36, RAND_INF_LH_GRASS_36 },
+ { RC_LH_CHILD_GRASS_1, RAND_INF_LH_CHILD_GRASS_1 },
+ { RC_LH_CHILD_GRASS_2, RAND_INF_LH_CHILD_GRASS_2 },
+ { RC_LH_CHILD_GRASS_3, RAND_INF_LH_CHILD_GRASS_3 },
+ { RC_LH_CHILD_GRASS_4, RAND_INF_LH_CHILD_GRASS_4 },
+ { RC_LH_WARP_PAD_GRASS_1, RAND_INF_LH_WARP_PAD_GRASS_1 },
+ { RC_LH_WARP_PAD_GRASS_2, RAND_INF_LH_WARP_PAD_GRASS_2 },
+ { RC_HF_NEAR_KF_GRASS_1, RAND_INF_HF_NEAR_KF_GRASS_1 },
+ { RC_HF_NEAR_KF_GRASS_2, RAND_INF_HF_NEAR_KF_GRASS_2 },
+ { RC_HF_NEAR_KF_GRASS_3, RAND_INF_HF_NEAR_KF_GRASS_3 },
+ { RC_HF_NEAR_KF_GRASS_4, RAND_INF_HF_NEAR_KF_GRASS_4 },
+ { RC_HF_NEAR_KF_GRASS_5, RAND_INF_HF_NEAR_KF_GRASS_5 },
+ { RC_HF_NEAR_KF_GRASS_6, RAND_INF_HF_NEAR_KF_GRASS_6 },
+ { RC_HF_NEAR_KF_GRASS_7, RAND_INF_HF_NEAR_KF_GRASS_7 },
+ { RC_HF_NEAR_KF_GRASS_8, RAND_INF_HF_NEAR_KF_GRASS_8 },
+ { RC_HF_NEAR_KF_GRASS_9, RAND_INF_HF_NEAR_KF_GRASS_9 },
+ { RC_HF_NEAR_KF_GRASS_10, RAND_INF_HF_NEAR_KF_GRASS_10 },
+ { RC_HF_NEAR_KF_GRASS_11, RAND_INF_HF_NEAR_KF_GRASS_11 },
+ { RC_HF_NEAR_KF_GRASS_12, RAND_INF_HF_NEAR_KF_GRASS_12 },
+ { RC_HF_NEAR_MARKET_GRASS_1, RAND_INF_HF_NEAR_MARKET_GRASS_1 },
+ { RC_HF_NEAR_MARKET_GRASS_2, RAND_INF_HF_NEAR_MARKET_GRASS_2 },
+ { RC_HF_NEAR_MARKET_GRASS_3, RAND_INF_HF_NEAR_MARKET_GRASS_3 },
+ { RC_HF_NEAR_MARKET_GRASS_4, RAND_INF_HF_NEAR_MARKET_GRASS_4 },
+ { RC_HF_NEAR_MARKET_GRASS_5, RAND_INF_HF_NEAR_MARKET_GRASS_5 },
+ { RC_HF_NEAR_MARKET_GRASS_6, RAND_INF_HF_NEAR_MARKET_GRASS_6 },
+ { RC_HF_NEAR_MARKET_GRASS_7, RAND_INF_HF_NEAR_MARKET_GRASS_7 },
+ { RC_HF_NEAR_MARKET_GRASS_8, RAND_INF_HF_NEAR_MARKET_GRASS_8 },
+ { RC_HF_NEAR_MARKET_GRASS_9, RAND_INF_HF_NEAR_MARKET_GRASS_9 },
+ { RC_HF_NEAR_MARKET_GRASS_10, RAND_INF_HF_NEAR_MARKET_GRASS_10 },
+ { RC_HF_NEAR_MARKET_GRASS_11, RAND_INF_HF_NEAR_MARKET_GRASS_11 },
+ { RC_HF_NEAR_MARKET_GRASS_12, RAND_INF_HF_NEAR_MARKET_GRASS_12 },
+ { RC_HF_SOUTH_GRASS_1, RAND_INF_HF_SOUTH_GRASS_1 },
+ { RC_HF_SOUTH_GRASS_2, RAND_INF_HF_SOUTH_GRASS_2 },
+ { RC_HF_SOUTH_GRASS_3, RAND_INF_HF_SOUTH_GRASS_3 },
+ { RC_HF_SOUTH_GRASS_4, RAND_INF_HF_SOUTH_GRASS_4 },
+ { RC_HF_SOUTH_GRASS_5, RAND_INF_HF_SOUTH_GRASS_5 },
+ { RC_HF_SOUTH_GRASS_6, RAND_INF_HF_SOUTH_GRASS_6 },
+ { RC_HF_SOUTH_GRASS_7, RAND_INF_HF_SOUTH_GRASS_7 },
+ { RC_HF_SOUTH_GRASS_8, RAND_INF_HF_SOUTH_GRASS_8 },
+ { RC_HF_SOUTH_GRASS_9, RAND_INF_HF_SOUTH_GRASS_9 },
+ { RC_HF_SOUTH_GRASS_10, RAND_INF_HF_SOUTH_GRASS_10 },
+ { RC_HF_SOUTH_GRASS_11, RAND_INF_HF_SOUTH_GRASS_11 },
+ { RC_HF_SOUTH_GRASS_12, RAND_INF_HF_SOUTH_GRASS_12 },
+ { RC_HF_CENTRAL_GRASS_1, RAND_INF_HF_CENTRAL_GRASS_1 },
+ { RC_HF_CENTRAL_GRASS_2, RAND_INF_HF_CENTRAL_GRASS_2 },
+ { RC_HF_CENTRAL_GRASS_3, RAND_INF_HF_CENTRAL_GRASS_3 },
+ { RC_HF_CENTRAL_GRASS_4, RAND_INF_HF_CENTRAL_GRASS_4 },
+ { RC_HF_CENTRAL_GRASS_5, RAND_INF_HF_CENTRAL_GRASS_5 },
+ { RC_HF_CENTRAL_GRASS_6, RAND_INF_HF_CENTRAL_GRASS_6 },
+ { RC_HF_CENTRAL_GRASS_7, RAND_INF_HF_CENTRAL_GRASS_7 },
+ { RC_HF_CENTRAL_GRASS_8, RAND_INF_HF_CENTRAL_GRASS_8 },
+ { RC_HF_CENTRAL_GRASS_9, RAND_INF_HF_CENTRAL_GRASS_9 },
+ { RC_HF_CENTRAL_GRASS_10, RAND_INF_HF_CENTRAL_GRASS_10 },
+ { RC_HF_CENTRAL_GRASS_11, RAND_INF_HF_CENTRAL_GRASS_11 },
+ { RC_HF_CENTRAL_GRASS_12, RAND_INF_HF_CENTRAL_GRASS_12 },
+ { RC_ZR_GRASS_1, RAND_INF_ZR_GRASS_1 },
+ { RC_ZR_GRASS_2, RAND_INF_ZR_GRASS_2 },
+ { RC_ZR_GRASS_3, RAND_INF_ZR_GRASS_3 },
+ { RC_ZR_GRASS_4, RAND_INF_ZR_GRASS_4 },
+ { RC_ZR_GRASS_5, RAND_INF_ZR_GRASS_5 },
+ { RC_ZR_GRASS_6, RAND_INF_ZR_GRASS_6 },
+ { RC_ZR_GRASS_7, RAND_INF_ZR_GRASS_7 },
+ { RC_ZR_GRASS_8, RAND_INF_ZR_GRASS_8 },
+ { RC_ZR_GRASS_9, RAND_INF_ZR_GRASS_9 },
+ { RC_ZR_GRASS_10, RAND_INF_ZR_GRASS_10 },
+ { RC_ZR_GRASS_11, RAND_INF_ZR_GRASS_11 },
+ { RC_ZR_GRASS_12, RAND_INF_ZR_GRASS_12 },
+ { RC_ZR_NEAR_FREESTANDING_POH_GRASS, RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS },
+ // Grotto Grass
+ { RC_KF_STORMS_GROTTO_GRASS_1, RAND_INF_KF_STORMS_GROTTO_GRASS_1 },
+ { RC_KF_STORMS_GROTTO_GRASS_2, RAND_INF_KF_STORMS_GROTTO_GRASS_2 },
+ { RC_KF_STORMS_GROTTO_GRASS_3, RAND_INF_KF_STORMS_GROTTO_GRASS_3 },
+ { RC_KF_STORMS_GROTTO_GRASS_4, RAND_INF_KF_STORMS_GROTTO_GRASS_4 },
+ { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1 },
+ { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2 },
+ { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3 },
+ { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4 },
+ { RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1 },
+ { RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2 },
+ { RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3 },
+ { RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4 },
+ { RC_HF_OPEN_GROTTO_GRASS_1, RAND_INF_HF_OPEN_GROTTO_GRASS_1 },
+ { RC_HF_OPEN_GROTTO_GRASS_2, RAND_INF_HF_OPEN_GROTTO_GRASS_2 },
+ { RC_HF_OPEN_GROTTO_GRASS_3, RAND_INF_HF_OPEN_GROTTO_GRASS_3 },
+ { RC_HF_OPEN_GROTTO_GRASS_4, RAND_INF_HF_OPEN_GROTTO_GRASS_4 },
+ { RC_HF_SOUTHEAST_GROTTO_GRASS_1, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1 },
+ { RC_HF_SOUTHEAST_GROTTO_GRASS_2, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2 },
+ { RC_HF_SOUTHEAST_GROTTO_GRASS_3, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3 },
+ { RC_HF_SOUTHEAST_GROTTO_GRASS_4, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4 },
+ { RC_HF_COW_GROTTO_GRASS_1, RAND_INF_HF_COW_GROTTO_GRASS_1 },
+ { RC_HF_COW_GROTTO_GRASS_2, RAND_INF_HF_COW_GROTTO_GRASS_2 },
+ { RC_KAK_OPEN_GROTTO_GRASS_1, RAND_INF_KAK_OPEN_GROTTO_GRASS_1 },
+ { RC_KAK_OPEN_GROTTO_GRASS_2, RAND_INF_KAK_OPEN_GROTTO_GRASS_2 },
+ { RC_KAK_OPEN_GROTTO_GRASS_3, RAND_INF_KAK_OPEN_GROTTO_GRASS_3 },
+ { RC_KAK_OPEN_GROTTO_GRASS_4, RAND_INF_KAK_OPEN_GROTTO_GRASS_4 },
+ { RC_DMT_STORMS_GROTTO_GRASS_1, RAND_INF_DMT_STORMS_GROTTO_GRASS_1 },
+ { RC_DMT_STORMS_GROTTO_GRASS_2, RAND_INF_DMT_STORMS_GROTTO_GRASS_2 },
+ { RC_DMT_STORMS_GROTTO_GRASS_3, RAND_INF_DMT_STORMS_GROTTO_GRASS_3 },
+ { RC_DMT_STORMS_GROTTO_GRASS_4, RAND_INF_DMT_STORMS_GROTTO_GRASS_4 },
+ { RC_DMT_COW_GROTTO_GRASS_1, RAND_INF_DMT_COW_GROTTO_GRASS_1 },
+ { RC_DMT_COW_GROTTO_GRASS_2, RAND_INF_DMT_COW_GROTTO_GRASS_2 },
+ { RC_DMC_UPPER_GROTTO_GRASS_1, RAND_INF_DMC_UPPER_GROTTO_GRASS_1 },
+ { RC_DMC_UPPER_GROTTO_GRASS_2, RAND_INF_DMC_UPPER_GROTTO_GRASS_2 },
+ { RC_DMC_UPPER_GROTTO_GRASS_3, RAND_INF_DMC_UPPER_GROTTO_GRASS_3 },
+ { RC_DMC_UPPER_GROTTO_GRASS_4, RAND_INF_DMC_UPPER_GROTTO_GRASS_4 },
+ { RC_ZR_OPEN_GROTTO_GRASS_1, RAND_INF_ZR_OPEN_GROTTO_GRASS_1 },
+ { RC_ZR_OPEN_GROTTO_GRASS_2, RAND_INF_ZR_OPEN_GROTTO_GRASS_2 },
+ { RC_ZR_OPEN_GROTTO_GRASS_3, RAND_INF_ZR_OPEN_GROTTO_GRASS_3 },
+ { RC_ZR_OPEN_GROTTO_GRASS_4, RAND_INF_ZR_OPEN_GROTTO_GRASS_4 },
+ // Dungeon Grass
+ { RC_DEKU_TREE_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_LOBBY_GRASS_1 },
+ { RC_DEKU_TREE_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_LOBBY_GRASS_2 },
+ { RC_DEKU_TREE_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_LOBBY_GRASS_3 },
+ { RC_DEKU_TREE_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_LOBBY_GRASS_4 },
+ { RC_DEKU_TREE_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_LOBBY_GRASS_5 },
+ { RC_DEKU_TREE_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1 },
+ { RC_DEKU_TREE_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2 },
+ { RC_DEKU_TREE_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3 },
+ { RC_DEKU_TREE_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4 },
+ { RC_DEKU_TREE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_COMPASS_GRASS_1 },
+ { RC_DEKU_TREE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_COMPASS_GRASS_2 },
+ { RC_DEKU_TREE_BASEMENT_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_GRASS_1 },
+ { RC_DEKU_TREE_BASEMENT_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_GRASS_2 },
+ { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1 },
+ { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2 },
+ { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3 },
+ { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4 },
+ { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1 },
+ { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2 },
+ { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1 },
+ { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2 },
+ { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1 },
+ { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2 },
+ { RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1 },
+ { RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2 },
+ { RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3 },
+ { RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS },
+ { RC_DODONGOS_CAVERN_BLADE_GRASS, RAND_INF_DODONGOS_CAVERN_BLADE_GRASS },
+ { RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS },
+ { RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2 },
+ { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3 },
+ // MQ Dungeon Grass
+ { RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1 },
+ { RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2 },
+ { RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3 },
+ { RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4 },
+ { RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5 },
+ { RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6 },
+ { RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7 },
+ { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1 },
+ { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2 },
+ { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3 },
+ { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4 },
+ { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3 },
+ { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4 },
+ { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5 },
+ { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6 },
+ { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7 },
+ { RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1 },
+ { RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2 },
+ { RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3 },
+ { RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4 },
+ { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3 },
+ { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4 },
+ { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3 },
+ { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3 },
+ { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3 },
+ { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4 },
+ { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3 },
+ { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4 },
+ { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5 },
+ { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3 },
+ { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1 },
+ { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2 },
+ { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3 },
+ { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1 },
+ { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2 },
+ { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3 },
+ { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4 },
+ { RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS },
+ { RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS },
+ { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1 },
+ { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2 },
+ { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1 },
+ { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2 },
+ { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1 },
+ { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2 },
+ { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1 },
+ { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2 },
+ { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3 },
+ { RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS },
+ { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1 },
+ { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2 },
+ { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS },
+ { RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS },
+ { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1 },
+ { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2 },
+ { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1 },
+ { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2 },
+ { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3 },
+ { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4 },
+ // Shared Dungeon Grass
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1 },
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2 },
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3 },
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4 },
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5 },
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6 },
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7 },
+ { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8 },
+ // End Grass
{ RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT },
{ RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 },
@@ -1836,6 +2186,68 @@ FishIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) {
return fishIdentity;
}
+GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge) {
+ struct GrassIdentity grassIdentity;
+
+ grassIdentity.randomizerInf = RAND_INF_MAX;
+ grassIdentity.randomizerCheck = RC_UNKNOWN_CHECK;
+
+ if (sceneNum == SCENE_GROTTOS) {
+ respawnData = TWO_ACTOR_PARAMS(posX, respawnData);
+ } else {
+ // We'll just pretend it's always daytime for our market bushes.
+ if (sceneNum == SCENE_MARKET_NIGHT) {
+ sceneNum = SCENE_MARKET_DAY;
+
+ /*
+ The two bushes by the tree are not in the same spot
+ between night and day. We'll assume the coordinates
+ of the daytime bushes so that we can count them as
+ the same locations.
+ */
+ if (posX == -74) {
+ posX = -106;
+ posZ = 277;
+ }
+ if (posX == -87) {
+ posX = -131;
+ posZ = 225;
+ }
+ }
+
+ /*
+ Same as with Market. ZR has a bush slightly off pos
+ between Child and Adult. This is to merge them into
+ a single location.
+ */
+ if (sceneNum == SCENE_ZORAS_RIVER) {
+ if (posX == 233) {
+ posX = 231;
+ posZ = -1478;
+ }
+ }
+
+ // The two bushes behind the sign in KF should be separate
+ // locations between Child and Adult.
+ if (sceneNum == SCENE_KOKIRI_FOREST && linkAge == 0) {
+ if (posX == -498 || posX == -523) {
+ posZ = 0xFF;
+ }
+ }
+
+ respawnData = TWO_ACTOR_PARAMS(posX, posZ);
+ }
+
+ Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_KUSA, sceneNum, respawnData);
+
+ if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
+ grassIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()];
+ grassIdentity.randomizerCheck = location->GetRandomizerCheck();
+ }
+
+ return grassIdentity;
+}
+
u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) {
return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get();
}
diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h
index 76bde6a4f..13718dac4 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.h
+++ b/soh/soh/Enhancements/randomizer/randomizer.h
@@ -54,6 +54,7 @@ class Randomizer {
CowIdentity IdentifyCow(s32 sceneNum, s32 posX, s32 posZ);
PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ);
FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams);
+ GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge);
GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true);
GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true);
ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck);
diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h
index 2c97c50c0..9851f614b 100644
--- a/soh/soh/Enhancements/randomizer/randomizerTypes.h
+++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h
@@ -294,6 +294,7 @@ typedef enum {
RCTYPE_FISH, // Fishes
RCTYPE_FREESTANDING, // Freestanding rupees and hearts
RCTYPE_FAIRY, // Fairies
+ RCTYPE_GRASS, // Grass
} RandomizerCheckType;
typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest;
@@ -2848,6 +2849,358 @@ typedef enum {
RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY,
RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY,
RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY,
+
+ // Overworld Grass
+ RC_KF_CHILD_GRASS_1,
+ RC_KF_CHILD_GRASS_2,
+ RC_KF_CHILD_GRASS_3,
+ RC_KF_CHILD_GRASS_4,
+ RC_KF_CHILD_GRASS_5,
+ RC_KF_CHILD_GRASS_6,
+ RC_KF_CHILD_GRASS_7,
+ RC_KF_CHILD_GRASS_8,
+ RC_KF_CHILD_GRASS_9,
+ RC_KF_CHILD_GRASS_10,
+ RC_KF_CHILD_GRASS_11,
+ RC_KF_CHILD_GRASS_12,
+ RC_KF_CHILD_GRASS_MAZE_1,
+ RC_KF_CHILD_GRASS_MAZE_2,
+ RC_KF_CHILD_GRASS_MAZE_3,
+ RC_KF_ADULT_GRASS_1,
+ RC_KF_ADULT_GRASS_2,
+ RC_KF_ADULT_GRASS_3,
+ RC_KF_ADULT_GRASS_4,
+ RC_KF_ADULT_GRASS_5,
+ RC_KF_ADULT_GRASS_6,
+ RC_KF_ADULT_GRASS_7,
+ RC_KF_ADULT_GRASS_8,
+ RC_KF_ADULT_GRASS_9,
+ RC_KF_ADULT_GRASS_10,
+ RC_KF_ADULT_GRASS_11,
+ RC_KF_ADULT_GRASS_12,
+ RC_KF_ADULT_GRASS_13,
+ RC_KF_ADULT_GRASS_14,
+ RC_KF_ADULT_GRASS_15,
+ RC_KF_ADULT_GRASS_16,
+ RC_KF_ADULT_GRASS_17,
+ RC_KF_ADULT_GRASS_18,
+ RC_KF_ADULT_GRASS_19,
+ RC_KF_ADULT_GRASS_20,
+ RC_LW_GRASS_1,
+ RC_LW_GRASS_2,
+ RC_LW_GRASS_3,
+ RC_LW_GRASS_4,
+ RC_LW_GRASS_5,
+ RC_LW_GRASS_6,
+ RC_LW_GRASS_7,
+ RC_LW_GRASS_8,
+ RC_LW_GRASS_9,
+ RC_MARKET_GRASS_1,
+ RC_MARKET_GRASS_2,
+ RC_MARKET_GRASS_3,
+ RC_MARKET_GRASS_4,
+ RC_MARKET_GRASS_5,
+ RC_MARKET_GRASS_6,
+ RC_MARKET_GRASS_7,
+ RC_MARKET_GRASS_8,
+ RC_HC_GRASS_1,
+ RC_HC_GRASS_2,
+ RC_KAK_GRASS_1,
+ RC_KAK_GRASS_2,
+ RC_KAK_GRASS_3,
+ RC_KAK_GRASS_4,
+ RC_KAK_GRASS_5,
+ RC_KAK_GRASS_6,
+ RC_KAK_GRASS_7,
+ RC_KAK_GRASS_8,
+ RC_GY_GRASS_1,
+ RC_GY_GRASS_2,
+ RC_GY_GRASS_3,
+ RC_GY_GRASS_4,
+ RC_GY_GRASS_5,
+ RC_GY_GRASS_6,
+ RC_GY_GRASS_7,
+ RC_GY_GRASS_8,
+ RC_GY_GRASS_9,
+ RC_GY_GRASS_10,
+ RC_GY_GRASS_11,
+ RC_GY_GRASS_12,
+ RC_LH_GRASS_1,
+ RC_LH_GRASS_2,
+ RC_LH_GRASS_3,
+ RC_LH_GRASS_4,
+ RC_LH_GRASS_5,
+ RC_LH_GRASS_6,
+ RC_LH_GRASS_7,
+ RC_LH_GRASS_8,
+ RC_LH_GRASS_9,
+ RC_LH_GRASS_10,
+ RC_LH_GRASS_11,
+ RC_LH_GRASS_12,
+ RC_LH_GRASS_13,
+ RC_LH_GRASS_14,
+ RC_LH_GRASS_15,
+ RC_LH_GRASS_16,
+ RC_LH_GRASS_17,
+ RC_LH_GRASS_18,
+ RC_LH_GRASS_19,
+ RC_LH_GRASS_20,
+ RC_LH_GRASS_21,
+ RC_LH_GRASS_22,
+ RC_LH_GRASS_23,
+ RC_LH_GRASS_24,
+ RC_LH_GRASS_25,
+ RC_LH_GRASS_26,
+ RC_LH_GRASS_27,
+ RC_LH_GRASS_28,
+ RC_LH_GRASS_29,
+ RC_LH_GRASS_30,
+ RC_LH_GRASS_31,
+ RC_LH_GRASS_32,
+ RC_LH_GRASS_33,
+ RC_LH_GRASS_34,
+ RC_LH_GRASS_35,
+ RC_LH_GRASS_36,
+ RC_LH_CHILD_GRASS_1,
+ RC_LH_CHILD_GRASS_2,
+ RC_LH_CHILD_GRASS_3,
+ RC_LH_CHILD_GRASS_4,
+ RC_LH_WARP_PAD_GRASS_1,
+ RC_LH_WARP_PAD_GRASS_2,
+ RC_HF_NEAR_KF_GRASS_1,
+ RC_HF_NEAR_KF_GRASS_2,
+ RC_HF_NEAR_KF_GRASS_3,
+ RC_HF_NEAR_KF_GRASS_4,
+ RC_HF_NEAR_KF_GRASS_5,
+ RC_HF_NEAR_KF_GRASS_6,
+ RC_HF_NEAR_KF_GRASS_7,
+ RC_HF_NEAR_KF_GRASS_8,
+ RC_HF_NEAR_KF_GRASS_9,
+ RC_HF_NEAR_KF_GRASS_10,
+ RC_HF_NEAR_KF_GRASS_11,
+ RC_HF_NEAR_KF_GRASS_12,
+ RC_HF_NEAR_MARKET_GRASS_1,
+ RC_HF_NEAR_MARKET_GRASS_2,
+ RC_HF_NEAR_MARKET_GRASS_3,
+ RC_HF_NEAR_MARKET_GRASS_4,
+ RC_HF_NEAR_MARKET_GRASS_5,
+ RC_HF_NEAR_MARKET_GRASS_6,
+ RC_HF_NEAR_MARKET_GRASS_7,
+ RC_HF_NEAR_MARKET_GRASS_8,
+ RC_HF_NEAR_MARKET_GRASS_9,
+ RC_HF_NEAR_MARKET_GRASS_10,
+ RC_HF_NEAR_MARKET_GRASS_11,
+ RC_HF_NEAR_MARKET_GRASS_12,
+ RC_HF_SOUTH_GRASS_1,
+ RC_HF_SOUTH_GRASS_2,
+ RC_HF_SOUTH_GRASS_3,
+ RC_HF_SOUTH_GRASS_4,
+ RC_HF_SOUTH_GRASS_5,
+ RC_HF_SOUTH_GRASS_6,
+ RC_HF_SOUTH_GRASS_7,
+ RC_HF_SOUTH_GRASS_8,
+ RC_HF_SOUTH_GRASS_9,
+ RC_HF_SOUTH_GRASS_10,
+ RC_HF_SOUTH_GRASS_11,
+ RC_HF_SOUTH_GRASS_12,
+ RC_HF_CENTRAL_GRASS_1,
+ RC_HF_CENTRAL_GRASS_2,
+ RC_HF_CENTRAL_GRASS_3,
+ RC_HF_CENTRAL_GRASS_4,
+ RC_HF_CENTRAL_GRASS_5,
+ RC_HF_CENTRAL_GRASS_6,
+ RC_HF_CENTRAL_GRASS_7,
+ RC_HF_CENTRAL_GRASS_8,
+ RC_HF_CENTRAL_GRASS_9,
+ RC_HF_CENTRAL_GRASS_10,
+ RC_HF_CENTRAL_GRASS_11,
+ RC_HF_CENTRAL_GRASS_12,
+ RC_ZR_GRASS_1,
+ RC_ZR_GRASS_2,
+ RC_ZR_GRASS_3,
+ RC_ZR_GRASS_4,
+ RC_ZR_GRASS_5,
+ RC_ZR_GRASS_6,
+ RC_ZR_GRASS_7,
+ RC_ZR_GRASS_8,
+ RC_ZR_GRASS_9,
+ RC_ZR_GRASS_10,
+ RC_ZR_GRASS_11,
+ RC_ZR_GRASS_12,
+ RC_ZR_NEAR_FREESTANDING_POH_GRASS,
+ // Grotto Grass
+ RC_KF_STORMS_GROTTO_GRASS_1,
+ RC_KF_STORMS_GROTTO_GRASS_2,
+ RC_KF_STORMS_GROTTO_GRASS_3,
+ RC_KF_STORMS_GROTTO_GRASS_4,
+ RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1,
+ RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2,
+ RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3,
+ RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4,
+ RC_HF_NEAR_MARKET_GROTTO_GRASS_1,
+ RC_HF_NEAR_MARKET_GROTTO_GRASS_2,
+ RC_HF_NEAR_MARKET_GROTTO_GRASS_3,
+ RC_HF_NEAR_MARKET_GROTTO_GRASS_4,
+ RC_HF_OPEN_GROTTO_GRASS_1,
+ RC_HF_OPEN_GROTTO_GRASS_2,
+ RC_HF_OPEN_GROTTO_GRASS_3,
+ RC_HF_OPEN_GROTTO_GRASS_4,
+ RC_HF_SOUTHEAST_GROTTO_GRASS_1,
+ RC_HF_SOUTHEAST_GROTTO_GRASS_2,
+ RC_HF_SOUTHEAST_GROTTO_GRASS_3,
+ RC_HF_SOUTHEAST_GROTTO_GRASS_4,
+ RC_HF_COW_GROTTO_GRASS_1,
+ RC_HF_COW_GROTTO_GRASS_2,
+ RC_KAK_OPEN_GROTTO_GRASS_1,
+ RC_KAK_OPEN_GROTTO_GRASS_2,
+ RC_KAK_OPEN_GROTTO_GRASS_3,
+ RC_KAK_OPEN_GROTTO_GRASS_4,
+ RC_DMT_STORMS_GROTTO_GRASS_1,
+ RC_DMT_STORMS_GROTTO_GRASS_2,
+ RC_DMT_STORMS_GROTTO_GRASS_3,
+ RC_DMT_STORMS_GROTTO_GRASS_4,
+ RC_DMT_COW_GROTTO_GRASS_1,
+ RC_DMT_COW_GROTTO_GRASS_2,
+ RC_DMC_UPPER_GROTTO_GRASS_1,
+ RC_DMC_UPPER_GROTTO_GRASS_2,
+ RC_DMC_UPPER_GROTTO_GRASS_3,
+ RC_DMC_UPPER_GROTTO_GRASS_4,
+ RC_ZR_OPEN_GROTTO_GRASS_1,
+ RC_ZR_OPEN_GROTTO_GRASS_2,
+ RC_ZR_OPEN_GROTTO_GRASS_3,
+ RC_ZR_OPEN_GROTTO_GRASS_4,
+ // Dungeon Grass
+ RC_DEKU_TREE_LOBBY_GRASS_1,
+ RC_DEKU_TREE_LOBBY_GRASS_2,
+ RC_DEKU_TREE_LOBBY_GRASS_3,
+ RC_DEKU_TREE_LOBBY_GRASS_4,
+ RC_DEKU_TREE_LOBBY_GRASS_5,
+ RC_DEKU_TREE_SLINGSHOT_GRASS_1,
+ RC_DEKU_TREE_SLINGSHOT_GRASS_2,
+ RC_DEKU_TREE_SLINGSHOT_GRASS_3,
+ RC_DEKU_TREE_SLINGSHOT_GRASS_4,
+ RC_DEKU_TREE_COMPASS_GRASS_1,
+ RC_DEKU_TREE_COMPASS_GRASS_2,
+ RC_DEKU_TREE_BASEMENT_GRASS_1,
+ RC_DEKU_TREE_BASEMENT_GRASS_2,
+ RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1,
+ RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2,
+ RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3,
+ RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4,
+ RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1,
+ RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2,
+ RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1,
+ RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2,
+ RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1,
+ RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2,
+ RC_DEKU_TREE_BEFORE_BOSS_GRASS_1,
+ RC_DEKU_TREE_BEFORE_BOSS_GRASS_2,
+ RC_DEKU_TREE_BEFORE_BOSS_GRASS_3,
+ RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS,
+ RC_DODONGOS_CAVERN_BLADE_GRASS,
+ RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS,
+ RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2,
+ RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3,
+ // MQ Dungeon Grass
+ RC_DEKU_TREE_MQ_LOBBY_GRASS_1,
+ RC_DEKU_TREE_MQ_LOBBY_GRASS_2,
+ RC_DEKU_TREE_MQ_LOBBY_GRASS_3,
+ RC_DEKU_TREE_MQ_LOBBY_GRASS_4,
+ RC_DEKU_TREE_MQ_LOBBY_GRASS_5,
+ RC_DEKU_TREE_MQ_LOBBY_GRASS_6,
+ RC_DEKU_TREE_MQ_LOBBY_GRASS_7,
+ RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1,
+ RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2,
+ RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3,
+ RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4,
+ RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1,
+ RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2,
+ RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3,
+ RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4,
+ RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5,
+ RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6,
+ RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7,
+ RC_DEKU_TREE_MQ_COMPASS_GRASS_1,
+ RC_DEKU_TREE_MQ_COMPASS_GRASS_2,
+ RC_DEKU_TREE_MQ_COMPASS_GRASS_3,
+ RC_DEKU_TREE_MQ_COMPASS_GRASS_4,
+ RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3,
+ RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4,
+ RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3,
+ RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3,
+ RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3,
+ RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4,
+ RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3,
+ RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4,
+ RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5,
+ RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1,
+ RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2,
+ RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3,
+ RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1,
+ RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2,
+ RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3,
+ RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1,
+ RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2,
+ RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3,
+ RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4,
+ RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS,
+ RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS,
+ RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1,
+ RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2,
+ RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1,
+ RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2,
+ RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1,
+ RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2,
+ RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1,
+ RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2,
+ RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3,
+ RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS,
+ RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1,
+ RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2,
+ RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS,
+ RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS,
+ RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1,
+ RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2,
+ RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1,
+ RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2,
+ RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3,
+ RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4,
+ // Shared Dungeon Grass
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1,
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2,
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3,
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4,
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5,
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6,
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7,
+ RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8,
+ // End Grass
+
RC_MAX
} RandomizerCheck;
@@ -4931,8 +5284,23 @@ typedef enum {
RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY,
RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY,
RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY,
+ // GRASS
+ RHT_KF_GRASS,
+ RHT_LW_GRASS,
+ RHT_MARKET_GRASS,
+ RHT_HC_GRASS,
+ RHT_KAK_GRASS,
+ RHT_GY_GRASS,
+ RHT_LH_GRASS,
+ RHT_HF_GRASS,
+ RHT_ZR_GRASS,
+ RHT_GROTTO_GRASS,
+ RHT_DEKU_TREE_GRASS,
+ RHT_DODONGOS_CAVERN_GRASS,
+ RHT_BOTTOM_OF_THE_WELL_GRASS,
+ RHT_JABU_JABUS_BELLY_GRASS,
// MAX
- RHT_MAX
+ RHT_MAX,
} RandomizerHintTextKey;
@@ -5223,6 +5591,7 @@ typedef enum {
RSK_SHUFFLE_FREESTANDING,
RSK_SHUFFLE_FAIRIES,
RSK_LOCK_OVERWORLD_DOORS,
+ RSK_SHUFFLE_GRASS,
RSK_MAX
} RandomizerSettingKey;
@@ -5569,6 +5938,14 @@ typedef enum {
RO_SHUFFLE_POTS_ALL,
} RandoOptionShufflePots;
+// Shuffle Grass settings (off, dungeons, overworld, all)
+typedef enum {
+ RO_SHUFFLE_GRASS_OFF,
+ RO_SHUFFLE_GRASS_DUNGEONS,
+ RO_SHUFFLE_GRASS_OVERWORLD,
+ RO_SHUFFLE_GRASS_ALL,
+} RandoOptionShuffleGrass;
+
//Link's Pocket Settings (dungeon reward, advancement, anything, nothing)
typedef enum {
RO_LINKS_POCKET_DUNGEON_REWARD,
@@ -5664,6 +6041,11 @@ typedef struct FishIdentity {
RandomizerCheck randomizerCheck;
} FishIdentity;
+typedef struct GrassIdentity {
+ RandomizerInf randomizerInf;
+ RandomizerCheck randomizerCheck;
+} GrassIdentity;
+
typedef enum {
TRACKER_WINDOW_FLOATING,
TRACKER_WINDOW_WINDOW,
diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp
index b8d435fd8..9333913a4 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp
@@ -172,6 +172,7 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() {
(location.GetRCType() != RCTYPE_BEEHIVE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) &&
+ (location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) &&
(location.GetRCType() != RCTYPE_ADULT_TRADE ||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) &&
diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
index aa6b8b608..7d531cb24 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
@@ -59,6 +59,8 @@ bool showWeirdEgg;
bool showGerudoCard;
bool showOverworldPots;
bool showDungeonPots;
+bool showOverworldGrass;
+bool showDungeonGrass;
bool showFrogSongRupees;
bool showFairies;
bool showStartingMapsCompasses;
@@ -1269,11 +1271,32 @@ void LoadSettings() {
showDungeonPots = false;
break;
}
+
+ switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GRASS)) {
+ case RO_SHUFFLE_GRASS_ALL:
+ showOverworldGrass = true;
+ showDungeonGrass = true;
+ break;
+ case RO_SHUFFLE_GRASS_OVERWORLD:
+ showOverworldGrass = true;
+ showDungeonGrass = false;
+ break;
+ case RO_SHUFFLE_GRASS_DUNGEONS:
+ showOverworldGrass = false;
+ showDungeonGrass = true;
+ break;
+ default:
+ showOverworldGrass = false;
+ showDungeonGrass = false;
+ break;
+ }
} else { // Vanilla
showOverworldTokens = true;
showDungeonTokens = true;
showOverworldPots = false;
showDungeonPots = false;
+ showOverworldGrass = false;
+ showDungeonGrass = false;
}
fortressFast = false;
@@ -1354,6 +1377,9 @@ bool IsCheckShuffled(RandomizerCheck rc) {
(loc->GetRCType() != RCTYPE_POT ||
(showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
+ (loc->GetRCType() != RCTYPE_GRASS ||
+ (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
+ (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(loc->GetRCType() != RCTYPE_COW || showCows) &&
(loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) &&
(loc->GetRCType() != RCTYPE_FREESTANDING ||
diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h
index 8c4d05a4f..f061be660 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_inf.h
+++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h
@@ -1349,6 +1349,357 @@ typedef enum {
RAND_INF_ADULT_TRADES_HAS_EYEDROPS,
RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK,
+
+ // Overworld Grass
+ RAND_INF_KF_CHILD_GRASS_1,
+ RAND_INF_KF_CHILD_GRASS_2,
+ RAND_INF_KF_CHILD_GRASS_3,
+ RAND_INF_KF_CHILD_GRASS_4,
+ RAND_INF_KF_CHILD_GRASS_5,
+ RAND_INF_KF_CHILD_GRASS_6,
+ RAND_INF_KF_CHILD_GRASS_7,
+ RAND_INF_KF_CHILD_GRASS_8,
+ RAND_INF_KF_CHILD_GRASS_9,
+ RAND_INF_KF_CHILD_GRASS_10,
+ RAND_INF_KF_CHILD_GRASS_11,
+ RAND_INF_KF_CHILD_GRASS_12,
+ RAND_INF_KF_CHILD_GRASS_MAZE_1,
+ RAND_INF_KF_CHILD_GRASS_MAZE_2,
+ RAND_INF_KF_CHILD_GRASS_MAZE_3,
+ RAND_INF_KF_ADULT_GRASS_1,
+ RAND_INF_KF_ADULT_GRASS_2,
+ RAND_INF_KF_ADULT_GRASS_3,
+ RAND_INF_KF_ADULT_GRASS_4,
+ RAND_INF_KF_ADULT_GRASS_5,
+ RAND_INF_KF_ADULT_GRASS_6,
+ RAND_INF_KF_ADULT_GRASS_7,
+ RAND_INF_KF_ADULT_GRASS_8,
+ RAND_INF_KF_ADULT_GRASS_9,
+ RAND_INF_KF_ADULT_GRASS_10,
+ RAND_INF_KF_ADULT_GRASS_11,
+ RAND_INF_KF_ADULT_GRASS_12,
+ RAND_INF_KF_ADULT_GRASS_13,
+ RAND_INF_KF_ADULT_GRASS_14,
+ RAND_INF_KF_ADULT_GRASS_15,
+ RAND_INF_KF_ADULT_GRASS_16,
+ RAND_INF_KF_ADULT_GRASS_17,
+ RAND_INF_KF_ADULT_GRASS_18,
+ RAND_INF_KF_ADULT_GRASS_19,
+ RAND_INF_KF_ADULT_GRASS_20,
+ RAND_INF_LW_GRASS_1,
+ RAND_INF_LW_GRASS_2,
+ RAND_INF_LW_GRASS_3,
+ RAND_INF_LW_GRASS_4,
+ RAND_INF_LW_GRASS_5,
+ RAND_INF_LW_GRASS_6,
+ RAND_INF_LW_GRASS_7,
+ RAND_INF_LW_GRASS_8,
+ RAND_INF_LW_GRASS_9,
+ RAND_INF_MARKET_GRASS_1,
+ RAND_INF_MARKET_GRASS_2,
+ RAND_INF_MARKET_GRASS_3,
+ RAND_INF_MARKET_GRASS_4,
+ RAND_INF_MARKET_GRASS_5,
+ RAND_INF_MARKET_GRASS_6,
+ RAND_INF_MARKET_GRASS_7,
+ RAND_INF_MARKET_GRASS_8,
+ RAND_INF_HC_GRASS_1,
+ RAND_INF_HC_GRASS_2,
+ RAND_INF_KAK_GRASS_1,
+ RAND_INF_KAK_GRASS_2,
+ RAND_INF_KAK_GRASS_3,
+ RAND_INF_KAK_GRASS_4,
+ RAND_INF_KAK_GRASS_5,
+ RAND_INF_KAK_GRASS_6,
+ RAND_INF_KAK_GRASS_7,
+ RAND_INF_KAK_GRASS_8,
+ RAND_INF_GY_GRASS_1,
+ RAND_INF_GY_GRASS_2,
+ RAND_INF_GY_GRASS_3,
+ RAND_INF_GY_GRASS_4,
+ RAND_INF_GY_GRASS_5,
+ RAND_INF_GY_GRASS_6,
+ RAND_INF_GY_GRASS_7,
+ RAND_INF_GY_GRASS_8,
+ RAND_INF_GY_GRASS_9,
+ RAND_INF_GY_GRASS_10,
+ RAND_INF_GY_GRASS_11,
+ RAND_INF_GY_GRASS_12,
+ RAND_INF_LH_GRASS_1,
+ RAND_INF_LH_GRASS_2,
+ RAND_INF_LH_GRASS_3,
+ RAND_INF_LH_GRASS_4,
+ RAND_INF_LH_GRASS_5,
+ RAND_INF_LH_GRASS_6,
+ RAND_INF_LH_GRASS_7,
+ RAND_INF_LH_GRASS_8,
+ RAND_INF_LH_GRASS_9,
+ RAND_INF_LH_GRASS_10,
+ RAND_INF_LH_GRASS_11,
+ RAND_INF_LH_GRASS_12,
+ RAND_INF_LH_GRASS_13,
+ RAND_INF_LH_GRASS_14,
+ RAND_INF_LH_GRASS_15,
+ RAND_INF_LH_GRASS_16,
+ RAND_INF_LH_GRASS_17,
+ RAND_INF_LH_GRASS_18,
+ RAND_INF_LH_GRASS_19,
+ RAND_INF_LH_GRASS_20,
+ RAND_INF_LH_GRASS_21,
+ RAND_INF_LH_GRASS_22,
+ RAND_INF_LH_GRASS_23,
+ RAND_INF_LH_GRASS_24,
+ RAND_INF_LH_GRASS_25,
+ RAND_INF_LH_GRASS_26,
+ RAND_INF_LH_GRASS_27,
+ RAND_INF_LH_GRASS_28,
+ RAND_INF_LH_GRASS_29,
+ RAND_INF_LH_GRASS_30,
+ RAND_INF_LH_GRASS_31,
+ RAND_INF_LH_GRASS_32,
+ RAND_INF_LH_GRASS_33,
+ RAND_INF_LH_GRASS_34,
+ RAND_INF_LH_GRASS_35,
+ RAND_INF_LH_GRASS_36,
+ RAND_INF_LH_CHILD_GRASS_1,
+ RAND_INF_LH_CHILD_GRASS_2,
+ RAND_INF_LH_CHILD_GRASS_3,
+ RAND_INF_LH_CHILD_GRASS_4,
+ RAND_INF_LH_WARP_PAD_GRASS_1,
+ RAND_INF_LH_WARP_PAD_GRASS_2,
+ RAND_INF_HF_NEAR_KF_GRASS_1,
+ RAND_INF_HF_NEAR_KF_GRASS_2,
+ RAND_INF_HF_NEAR_KF_GRASS_3,
+ RAND_INF_HF_NEAR_KF_GRASS_4,
+ RAND_INF_HF_NEAR_KF_GRASS_5,
+ RAND_INF_HF_NEAR_KF_GRASS_6,
+ RAND_INF_HF_NEAR_KF_GRASS_7,
+ RAND_INF_HF_NEAR_KF_GRASS_8,
+ RAND_INF_HF_NEAR_KF_GRASS_9,
+ RAND_INF_HF_NEAR_KF_GRASS_10,
+ RAND_INF_HF_NEAR_KF_GRASS_11,
+ RAND_INF_HF_NEAR_KF_GRASS_12,
+ RAND_INF_HF_NEAR_MARKET_GRASS_1,
+ RAND_INF_HF_NEAR_MARKET_GRASS_2,
+ RAND_INF_HF_NEAR_MARKET_GRASS_3,
+ RAND_INF_HF_NEAR_MARKET_GRASS_4,
+ RAND_INF_HF_NEAR_MARKET_GRASS_5,
+ RAND_INF_HF_NEAR_MARKET_GRASS_6,
+ RAND_INF_HF_NEAR_MARKET_GRASS_7,
+ RAND_INF_HF_NEAR_MARKET_GRASS_8,
+ RAND_INF_HF_NEAR_MARKET_GRASS_9,
+ RAND_INF_HF_NEAR_MARKET_GRASS_10,
+ RAND_INF_HF_NEAR_MARKET_GRASS_11,
+ RAND_INF_HF_NEAR_MARKET_GRASS_12,
+ RAND_INF_HF_SOUTH_GRASS_1,
+ RAND_INF_HF_SOUTH_GRASS_2,
+ RAND_INF_HF_SOUTH_GRASS_3,
+ RAND_INF_HF_SOUTH_GRASS_4,
+ RAND_INF_HF_SOUTH_GRASS_5,
+ RAND_INF_HF_SOUTH_GRASS_6,
+ RAND_INF_HF_SOUTH_GRASS_7,
+ RAND_INF_HF_SOUTH_GRASS_8,
+ RAND_INF_HF_SOUTH_GRASS_9,
+ RAND_INF_HF_SOUTH_GRASS_10,
+ RAND_INF_HF_SOUTH_GRASS_11,
+ RAND_INF_HF_SOUTH_GRASS_12,
+ RAND_INF_HF_CENTRAL_GRASS_1,
+ RAND_INF_HF_CENTRAL_GRASS_2,
+ RAND_INF_HF_CENTRAL_GRASS_3,
+ RAND_INF_HF_CENTRAL_GRASS_4,
+ RAND_INF_HF_CENTRAL_GRASS_5,
+ RAND_INF_HF_CENTRAL_GRASS_6,
+ RAND_INF_HF_CENTRAL_GRASS_7,
+ RAND_INF_HF_CENTRAL_GRASS_8,
+ RAND_INF_HF_CENTRAL_GRASS_9,
+ RAND_INF_HF_CENTRAL_GRASS_10,
+ RAND_INF_HF_CENTRAL_GRASS_11,
+ RAND_INF_HF_CENTRAL_GRASS_12,
+ RAND_INF_ZR_GRASS_1,
+ RAND_INF_ZR_GRASS_2,
+ RAND_INF_ZR_GRASS_3,
+ RAND_INF_ZR_GRASS_4,
+ RAND_INF_ZR_GRASS_5,
+ RAND_INF_ZR_GRASS_6,
+ RAND_INF_ZR_GRASS_7,
+ RAND_INF_ZR_GRASS_8,
+ RAND_INF_ZR_GRASS_9,
+ RAND_INF_ZR_GRASS_10,
+ RAND_INF_ZR_GRASS_11,
+ RAND_INF_ZR_GRASS_12,
+ RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS,
+ // Grotto Grass
+ RAND_INF_KF_STORMS_GROTTO_GRASS_1,
+ RAND_INF_KF_STORMS_GROTTO_GRASS_2,
+ RAND_INF_KF_STORMS_GROTTO_GRASS_3,
+ RAND_INF_KF_STORMS_GROTTO_GRASS_4,
+ RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1,
+ RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2,
+ RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3,
+ RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4,
+ RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1,
+ RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2,
+ RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3,
+ RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4,
+ RAND_INF_HF_OPEN_GROTTO_GRASS_1,
+ RAND_INF_HF_OPEN_GROTTO_GRASS_2,
+ RAND_INF_HF_OPEN_GROTTO_GRASS_3,
+ RAND_INF_HF_OPEN_GROTTO_GRASS_4,
+ RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1,
+ RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2,
+ RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3,
+ RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4,
+ RAND_INF_HF_COW_GROTTO_GRASS_1,
+ RAND_INF_HF_COW_GROTTO_GRASS_2,
+ RAND_INF_KAK_OPEN_GROTTO_GRASS_1,
+ RAND_INF_KAK_OPEN_GROTTO_GRASS_2,
+ RAND_INF_KAK_OPEN_GROTTO_GRASS_3,
+ RAND_INF_KAK_OPEN_GROTTO_GRASS_4,
+ RAND_INF_DMT_STORMS_GROTTO_GRASS_1,
+ RAND_INF_DMT_STORMS_GROTTO_GRASS_2,
+ RAND_INF_DMT_STORMS_GROTTO_GRASS_3,
+ RAND_INF_DMT_STORMS_GROTTO_GRASS_4,
+ RAND_INF_DMT_COW_GROTTO_GRASS_1,
+ RAND_INF_DMT_COW_GROTTO_GRASS_2,
+ RAND_INF_DMC_UPPER_GROTTO_GRASS_1,
+ RAND_INF_DMC_UPPER_GROTTO_GRASS_2,
+ RAND_INF_DMC_UPPER_GROTTO_GRASS_3,
+ RAND_INF_DMC_UPPER_GROTTO_GRASS_4,
+ RAND_INF_ZR_OPEN_GROTTO_GRASS_1,
+ RAND_INF_ZR_OPEN_GROTTO_GRASS_2,
+ RAND_INF_ZR_OPEN_GROTTO_GRASS_3,
+ RAND_INF_ZR_OPEN_GROTTO_GRASS_4,
+ // Dungeon Grass
+ RAND_INF_DEKU_TREE_LOBBY_GRASS_1,
+ RAND_INF_DEKU_TREE_LOBBY_GRASS_2,
+ RAND_INF_DEKU_TREE_LOBBY_GRASS_3,
+ RAND_INF_DEKU_TREE_LOBBY_GRASS_4,
+ RAND_INF_DEKU_TREE_LOBBY_GRASS_5,
+ RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1,
+ RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2,
+ RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3,
+ RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4,
+ RAND_INF_DEKU_TREE_COMPASS_GRASS_1,
+ RAND_INF_DEKU_TREE_COMPASS_GRASS_2,
+ RAND_INF_DEKU_TREE_BASEMENT_GRASS_1,
+ RAND_INF_DEKU_TREE_BASEMENT_GRASS_2,
+ RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1,
+ RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2,
+ RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3,
+ RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4,
+ RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1,
+ RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2,
+ RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1,
+ RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2,
+ RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1,
+ RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2,
+ RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1,
+ RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2,
+ RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3,
+ RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS,
+ RAND_INF_DODONGOS_CAVERN_BLADE_GRASS,
+ RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS,
+ RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2,
+ RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3,
+ // MQ Dungeon Grass
+ RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4,
+ RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5,
+ RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6,
+ RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7,
+ RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7,
+ RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2,
+ RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3,
+ RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1,
+ RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2,
+ RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3,
+ RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4,
+ RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS,
+ RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS,
+ RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1,
+ RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2,
+ RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1,
+ RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2,
+ RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1,
+ RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2,
+ RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1,
+ RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2,
+ RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3,
+ RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS,
+ RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1,
+ RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2,
+ RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS,
+ RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS,
+ RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1,
+ RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2,
+ RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1,
+ RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2,
+ RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3,
+ RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4,
+ // Shared Dungeon Grass
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1,
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2,
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3,
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4,
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5,
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6,
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7,
+ RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8,
+ // End Grass
// If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16)
RAND_INF_MAX,
diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp
index 39f367a1e..ba049b32c 100644
--- a/soh/soh/Enhancements/randomizer/settings.cpp
+++ b/soh/soh/Enhancements/randomizer/settings.cpp
@@ -209,6 +209,7 @@ void Settings::CreateOptions() {
OPT_BOOL(RSK_SHUFFLE_WEIRD_EGG, "Shuffle Weird Egg", CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), mOptionDescriptions[RSK_SHUFFLE_WEIRD_EGG]);
OPT_BOOL(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, "Shuffle Gerudo Membership Card", CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]);
OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF);
+ OPT_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_OFF);
OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]);
OPT_U8(RSK_SHUFFLE_MERCHANTS, "Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE);
OPT_U8(RSK_MERCHANT_PRICES, "Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE);
@@ -677,6 +678,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_SHUFFLE_100_GS_REWARD],
&mOptions[RSK_SHUFFLE_BOSS_SOULS],
&mOptions[RSK_SHUFFLE_FAIRIES],
+ &mOptions[RSK_SHUFFLE_GRASS],
}, WidgetContainerType::COLUMN);
mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", {
&mOptions[RSK_SHUFFLE_DUNGEON_REWARDS],
diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h
index a456089a3..1ce04687c 100644
--- a/soh/soh/Enhancements/randomizer/static_data.h
+++ b/soh/soh/Enhancements/randomizer/static_data.h
@@ -51,6 +51,7 @@ class StaticData {
static void RegisterFairyLocations();
static void RegisterPotLocations();
static void RegisterFreestandingLocations();
+ static void RegisterGrassLocations();
static void InitHashMaps();
static std::array, 17> randomizerFishingPondFish;
static std::unordered_map randomizerGrottoFishMap;
diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
index 49623c850..23146f376 100644
--- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
+++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
@@ -10,6 +10,7 @@
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#include "objects/object_kusa/object_kusa.h"
#include "vt.h"
+#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_THROW_ONLY)
@@ -126,6 +127,10 @@ s32 EnKusa_SnapToFloor(EnKusa* this, PlayState* play, f32 yOffset) {
void EnKusa_DropCollectible(EnKusa* this, PlayState* play) {
s16 dropParams;
+ if (!GameInteractor_Should(VB_GRASS_DROP_ITEM, true, this)) {
+ return;
+ }
+
switch (this->actor.params & 3) {
case ENKUSA_TYPE_0:
case ENKUSA_TYPE_2:
@@ -138,11 +143,9 @@ void EnKusa_DropCollectible(EnKusa* this, PlayState* play) {
break;
case ENKUSA_TYPE_1:
if (CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) {
- }
- else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) {
+ } else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
- }
- else if (Rand_ZeroOne() < 0.5f) {
+ } else if (Rand_ZeroOne() < 0.5f) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
} else {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_HEART);
@@ -193,8 +196,8 @@ void EnKusa_SpawnFragments(EnKusa* this, PlayState* play) {
scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) & 7;
- EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0,
- 80, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubStalkDL);
+ EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, 80,
+ KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubStalkDL);
pos.x = this->actor.world.pos.x + (dir->x * this->actor.scale.x * 40.0f);
pos.y = this->actor.world.pos.y + (dir->y * this->actor.scale.y * 40.0f) + 10.0f;
@@ -206,8 +209,8 @@ void EnKusa_SpawnFragments(EnKusa* this, PlayState* play) {
scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) % 7;
- EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0,
- 80, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubTipDL);
+ EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, 80,
+ KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubTipDL);
}
}
@@ -215,8 +218,9 @@ void EnKusa_SpawnBugs(EnKusa* this, PlayState* play) {
s32 i;
for (i = 0; i < 3; i++) {
- Actor* bug = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, Rand_ZeroOne() * 0xFFFF, 0, 1, true);
+ Actor* bug =
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, Rand_ZeroOne() * 0xFFFF, 0, 1, true);
if (bug == NULL) {
break;
@@ -288,6 +292,10 @@ void EnKusa_WaitObject(EnKusa* this, PlayState* play) {
EnKusa_SetupMain(this);
}
+ if (!GameInteractor_Should(VB_GRASS_SETUP_DRAW, true, this)) {
+ return;
+ }
+
this->actor.draw = EnKusa_Draw;
this->actor.objBankIndex = this->objBankIndex;
this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED;
diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
index f1e9f24d7..6db50aa28 100644
--- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
+++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
@@ -20,6 +20,7 @@ typedef struct EnKusa {
/* 0x0150 */ ColliderCylinder collider;
/* 0x019C */ s16 timer;
/* 0x019E */ s8 objBankIndex;
+ /* */ GrassIdentity grassIdentity;
} EnKusa; // size = 0x01A0
#endif