diff --git a/soh/assets/custom/objects/gameplay_holiday/BaubleHilite b/soh/assets/custom/objects/gameplay_holiday/BaubleHilite
new file mode 100644
index 0000000000..4cb27947f0
Binary files /dev/null and b/soh/assets/custom/objects/gameplay_holiday/BaubleHilite differ
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_b_f3dlite_BaubleBlue b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_b_f3dlite_BaubleBlue
new file mode 100644
index 0000000000..9d8829650f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_b_f3dlite_BaubleBlue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_g_f3dlite_BaubleGreen b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_g_f3dlite_BaubleGreen
new file mode 100644
index 0000000000..8ba44c27bd
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_g_f3dlite_BaubleGreen
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_r_f3dlite_BaubleRed b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_r_f3dlite_BaubleRed
new file mode 100644
index 0000000000..539187c2af
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_r_f3dlite_BaubleRed
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_s_f3dlite_BaubleSilver b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_s_f3dlite_BaubleSilver
new file mode 100644
index 0000000000..2c5de1ab2f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_bauble_s_f3dlite_BaubleSilver
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_f3dlite_TreeBrown b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_f3dlite_TreeBrown
new file mode 100644
index 0000000000..e8215b8916
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_f3dlite_TreeBrown
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_f3dlite_TreeGreen b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_f3dlite_TreeGreen
new file mode 100644
index 0000000000..bb926c31e0
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_f3dlite_TreeGreen
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentBlue b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentBlue
new file mode 100644
index 0000000000..95a98809cc
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentBlue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentGreen b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentGreen
new file mode 100644
index 0000000000..e6bea0b6c5
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentGreen
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentRed b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentRed
new file mode 100644
index 0000000000..b42644ae81
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_presents_f3dlite_PresentRed
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_star_f3dlite_GoldStar b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_star_f3dlite_GoldStar
new file mode 100644
index 0000000000..3d82334c6e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/mat_xmas_tree_star_f3dlite_GoldStar
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree b/soh/assets/custom/objects/gameplay_holiday/xmas_tree
new file mode 100644
index 0000000000..2691067888
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b
new file mode 100644
index 0000000000..4498e24fe7
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b_tri_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b_tri_0
new file mode 100644
index 0000000000..792d47536e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b_tri_0
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b_vtx_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b_vtx_0
new file mode 100644
index 0000000000..db948f00be
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_b_vtx_0
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g
new file mode 100644
index 0000000000..fbb02006b7
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g_tri_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g_tri_0
new file mode 100644
index 0000000000..471f208c6e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g_tri_0
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g_vtx_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g_vtx_0
new file mode 100644
index 0000000000..3e9f85ec7f
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_g_vtx_0
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r
new file mode 100644
index 0000000000..b93e0da35a
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r_tri_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r_tri_0
new file mode 100644
index 0000000000..7aa1828a1b
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r_tri_0
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r_vtx_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r_vtx_0
new file mode 100644
index 0000000000..e8fc7a8dcd
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_r_vtx_0
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s
new file mode 100644
index 0000000000..71f8877ae0
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s_tri_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s_tri_0
new file mode 100644
index 0000000000..f88b6f2087
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s_tri_0
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s_vtx_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s_vtx_0
new file mode 100644
index 0000000000..653d4a071c
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_bauble_s_vtx_0
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents
new file mode 100644
index 0000000000..458e405750
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_0
new file mode 100644
index 0000000000..3e2b4441fc
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_0
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_1 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_1
new file mode 100644
index 0000000000..cecbe09a2b
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_1
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_2 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_2
new file mode 100644
index 0000000000..efc528078e
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_tri_2
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_0
new file mode 100644
index 0000000000..fd5885c08c
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_0
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_1 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_1
new file mode 100644
index 0000000000..fdc4bf6e8a
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_1
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_2 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_2
new file mode 100644
index 0000000000..3c4703e1b6
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_presents_vtx_2
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star
new file mode 100644
index 0000000000..4cefe078a1
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star_tri_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star_tri_0
new file mode 100644
index 0000000000..73507855d1
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star_tri_0
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star_vtx_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star_vtx_0
new file mode 100644
index 0000000000..107d0a5c7d
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_star_vtx_0
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_tri_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_tri_0
new file mode 100644
index 0000000000..688a578613
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_tri_0
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_tri_1 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_tri_1
new file mode 100644
index 0000000000..34c37bef70
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_tri_1
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_vtx_0 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_vtx_0
new file mode 100644
index 0000000000..6b65e8a813
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_vtx_0
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/gameplay_holiday/xmas_tree_vtx_1 b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_vtx_1
new file mode 100644
index 0000000000..23934fa7f5
--- /dev/null
+++ b/soh/assets/custom/objects/gameplay_holiday/xmas_tree_vtx_1
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_completed/GlowAlpha_64 b/soh/assets/custom/objects/object_triforce_completed/GlowAlpha_64
new file mode 100644
index 0000000000..1682d9e6f2
Binary files /dev/null and b/soh/assets/custom/objects/object_triforce_completed/GlowAlpha_64 differ
diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL
index 966bef2060..b7c7d8af02 100644
--- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL
+++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL
@@ -1,7 +1,7 @@
-
+
-
+
diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0
index dea47708c1..f9d6420cc0 100644
--- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0
+++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0
@@ -1,56 +1,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1
index 36be4333f2..b67adf06ef 100644
--- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1
+++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1
@@ -1,7 +1,390 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0
index 6ca96db305..ca11ab1b3b 100644
--- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0
+++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0
@@ -1,54 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1
index 3a653966d7..cc747f74a3 100644
--- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1
+++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1
@@ -1,8 +1,347 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_completed/hilite_melon b/soh/assets/custom/objects/object_triforce_completed/hilite_melon
new file mode 100644
index 0000000000..df1d605b38
Binary files /dev/null and b/soh/assets/custom/objects/object_triforce_completed/hilite_melon differ
diff --git a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_Glow b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_Glow
new file mode 100644
index 0000000000..6bed4d2744
--- /dev/null
+++ b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_Glow
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_OrnamentGold
similarity index 75%
rename from soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface
rename to soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_OrnamentGold
index 5f8dc51f90..65dfd4f560 100644
--- a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface
+++ b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_OrnamentGold
@@ -1,6 +1,6 @@
-
+
@@ -8,14 +8,14 @@
-
+
-
+
diff --git a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges
deleted file mode 100644
index 52591dfc85..0000000000
--- a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface
deleted file mode 100644
index 06193ae61a..0000000000
--- a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_completed/noise_tex b/soh/assets/custom/objects/object_triforce_completed/noise_tex
deleted file mode 100644
index a6d6cf945e..0000000000
Binary files a/soh/assets/custom/objects/object_triforce_completed/noise_tex and /dev/null differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL
index 70d08c31d2..0beb02144f 100644
--- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL
+++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL
@@ -1,10 +1,8 @@
-
+
-
+
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0
index 09e44f1b79..286a543842 100644
--- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0
+++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0
@@ -1,17 +1,67 @@
-
-
-
+
+
+
-
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1
index 48001e3c39..a3c013e4ac 100644
--- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1
+++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1
@@ -1,18 +1,91 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2
deleted file mode 100644
index e35e34492a..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0
index a86fa98bf5..3637534b99 100644
--- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0
+++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0
@@ -1,18 +1,72 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1
index 230fbb7f88..ef51d7124c 100644
--- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1
+++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1
@@ -1,22 +1,107 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2
deleted file mode 100644
index 86d1238254..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/image b/soh/assets/custom/objects/object_triforce_piece_0/image
new file mode 100644
index 0000000000..2a8a62348b
Binary files /dev/null and b/soh/assets/custom/objects/object_triforce_piece_0/image differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_ball b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_ball
new file mode 100644
index 0000000000..214ad3df66
--- /dev/null
+++ b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_ball
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge
deleted file mode 100644
index f626317933..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges
deleted file mode 100644
index 9355e70943..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface
deleted file mode 100644
index e863b31c5a..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_silver b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_silver
new file mode 100644
index 0000000000..d56781ad26
--- /dev/null
+++ b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_silver
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_0/noise_tex b/soh/assets/custom/objects/object_triforce_piece_0/noise_tex
deleted file mode 100644
index a6d6cf945e..0000000000
Binary files a/soh/assets/custom/objects/object_triforce_piece_0/noise_tex and /dev/null differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL
index 50a9264c62..4ffea5cf8a 100644
--- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL
+++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL
@@ -1,7 +1,7 @@
-
+
-
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0
index 5f33f7347e..c9e63a8d96 100644
--- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0
+++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0
@@ -1,20 +1,67 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1
index 43df6492b4..67f0ba8eb3 100644
--- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1
+++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1
@@ -1,25 +1,88 @@
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0
index e078b82461..d9a5075af2 100644
--- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0
+++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0
@@ -1,23 +1,72 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1
index e0460194da..8c2f954e7c 100644
--- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1
+++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1
@@ -1,34 +1,96 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/image b/soh/assets/custom/objects/object_triforce_piece_1/image
new file mode 100644
index 0000000000..2a8a62348b
Binary files /dev/null and b/soh/assets/custom/objects/object_triforce_piece_1/image differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/image_copy b/soh/assets/custom/objects/object_triforce_piece_1/image_copy
new file mode 100644
index 0000000000..2a8a62348b
Binary files /dev/null and b/soh/assets/custom/objects/object_triforce_piece_1/image_copy differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_blue_mat b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_blue_mat
new file mode 100644
index 0000000000..18d8436b2b
--- /dev/null
+++ b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_blue_mat
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge
deleted file mode 100644
index b9e61293d1..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_silver_002 b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_silver_002
new file mode 100644
index 0000000000..26f9a0b700
--- /dev/null
+++ b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_silver_002
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_1/noise_tex b/soh/assets/custom/objects/object_triforce_piece_1/noise_tex
deleted file mode 100644
index a6d6cf945e..0000000000
Binary files a/soh/assets/custom/objects/object_triforce_piece_1/noise_tex and /dev/null differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL
index 5213cd53ca..7318e9b1c0 100644
--- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL
+++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL
@@ -1,10 +1,8 @@
-
+
-
+
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0
index b54e182d5e..59d81883f1 100644
--- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0
+++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0
@@ -1,29 +1,67 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1
index 00a32bfd88..a15c641d7a 100644
--- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1
+++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1
@@ -1,11 +1,378 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2
deleted file mode 100644
index 0993c1c1ee..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0
index bf7dfcac67..5122e29042 100644
--- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0
+++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0
@@ -1,36 +1,72 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1
index e3237ab215..988bfb6735 100644
--- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1
+++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1
@@ -1,12 +1,410 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2
deleted file mode 100644
index ec4e737005..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/image b/soh/assets/custom/objects/object_triforce_piece_2/image
new file mode 100644
index 0000000000..2a8a62348b
Binary files /dev/null and b/soh/assets/custom/objects/object_triforce_piece_2/image differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/image_copy b/soh/assets/custom/objects/object_triforce_piece_2/image_copy
new file mode 100644
index 0000000000..2a8a62348b
Binary files /dev/null and b/soh/assets/custom/objects/object_triforce_piece_2/image_copy differ
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_Green_mat b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_Green_mat
new file mode 100644
index 0000000000..35d57dfeae
--- /dev/null
+++ b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_Green_mat
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge
deleted file mode 100644
index c222fe68d5..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges
deleted file mode 100644
index 5968068f5f..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface
deleted file mode 100644
index d903f00bbd..0000000000
--- a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_silver_001 b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_silver_001
new file mode 100644
index 0000000000..6a9be7bec4
--- /dev/null
+++ b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_silver_001
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_triforce_piece_2/noise_tex b/soh/assets/custom/objects/object_triforce_piece_2/noise_tex
deleted file mode 100644
index a6d6cf945e..0000000000
Binary files a/soh/assets/custom/objects/object_triforce_piece_2/noise_tex and /dev/null differ
diff --git a/soh/assets/custom/objects/object_xmas_tree/Bark_64 b/soh/assets/custom/objects/object_xmas_tree/Bark_64
new file mode 100644
index 0000000000..8f1b837cd2
Binary files /dev/null and b/soh/assets/custom/objects/object_xmas_tree/Bark_64 differ
diff --git a/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_64 b/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_64
new file mode 100644
index 0000000000..e33491d5af
Binary files /dev/null and b/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_64 differ
diff --git a/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_shaded_64 b/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_shaded_64
new file mode 100644
index 0000000000..dca2158b4b
Binary files /dev/null and b/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_shaded_64 differ
diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL
new file mode 100644
index 0000000000..c343cfe2a0
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_0
new file mode 100644
index 0000000000..38cdbe014b
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_0
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_1
new file mode 100644
index 0000000000..ff4e066a5b
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_1
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_2
new file mode 100644
index 0000000000..561d3ac5ef
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_2
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_0
new file mode 100644
index 0000000000..94e5e1fefc
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_0
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_1
new file mode 100644
index 0000000000..01ed88a145
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_1
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_2
new file mode 100644
index 0000000000..fd03778f89
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_2
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeBrown b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeBrown
new file mode 100644
index 0000000000..37fdb10d29
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeBrown
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeGreen b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeGreen
new file mode 100644
index 0000000000..119341c701
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeGreen
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeTip b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeTip
new file mode 100644
index 0000000000..9baaadbf55
--- /dev/null
+++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeTip
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h
index 2b193053c3..a672b3663e 100644
--- a/soh/assets/soh_assets.h
+++ b/soh/assets/soh_assets.h
@@ -56,6 +56,27 @@ static const ALIGN_ASSET(2) char gTriforcePiece2DL[] = dgTriforcePiece2DL;
#define dgTriforcePieceCompletedDL "__OTR__objects/object_triforce_completed/gTriforcePieceCompletedDL"
static const ALIGN_ASSET(2) char gTriforcePieceCompletedDL[] = dgTriforcePieceCompletedDL;
+#define dgXmasTreeDL "__OTR__objects/object_xmas_tree/gXmasTreeDL"
+static const ALIGN_ASSET(2) char gXmasTreeDL[] = dgXmasTreeDL;
+
+#define dxmas_tree_presents "__OTR__objects/gameplay_holiday/xmas_tree_presents"
+static const ALIGN_ASSET(2) char xmas_tree_presents[] = dxmas_tree_presents;
+
+#define dxmas_tree_star "__OTR__objects/gameplay_holiday/xmas_tree_star"
+static const ALIGN_ASSET(2) char xmas_tree_star[] = dxmas_tree_star;
+
+#define dxmas_tree_bauble_r "__OTR__objects/gameplay_holiday/xmas_tree_bauble_r"
+static const ALIGN_ASSET(2) char xmas_tree_bauble_r[] = dxmas_tree_bauble_r;
+
+#define dxmas_tree_bauble_g "__OTR__objects/gameplay_holiday/xmas_tree_bauble_g"
+static const ALIGN_ASSET(2) char xmas_tree_bauble_g[] = dxmas_tree_bauble_g;
+
+#define dxmas_tree_bauble_b "__OTR__objects/gameplay_holiday/xmas_tree_bauble_b"
+static const ALIGN_ASSET(2) char xmas_tree_bauble_b[] = dxmas_tree_bauble_b;
+
+#define dxmas_tree_bauble_s "__OTR__objects/gameplay_holiday/xmas_tree_bauble_s"
+static const ALIGN_ASSET(2) char xmas_tree_bauble_s[] = dxmas_tree_bauble_s;
+
// overlays
#define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx"
static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx;
diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp
index 2cf4d8fe77..4e36f5e51f 100644
--- a/soh/soh/ActorDB.cpp
+++ b/soh/soh/ActorDB.cpp
@@ -604,8 +604,25 @@ static ActorDBInit EnPartnerInit = {
};
extern "C" s16 gEnPartnerId;
+#include "src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h"
+static ActorDBInit EnChristmasTreeInit = {
+ "En_ChristmasTree",
+ "Christmas Tree",
+ ACTORCAT_PROP,
+ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY),
+ OBJECT_GAMEPLAY_KEEP,
+ sizeof(EnChristmasTree),
+ (ActorFunc)EnChristmasTree_Init,
+ (ActorFunc)EnChristmasTree_Destroy,
+ (ActorFunc)EnChristmasTree_Update,
+ (ActorFunc)EnChristmasTree_Draw,
+ nullptr,
+};
+extern "C" s16 gEnChristmasTreeId;
+
void ActorDB::AddBuiltInCustomActors() {
gEnPartnerId = ActorDB::Instance->AddEntry(EnPartnerInit).entry.id;
+ gEnChristmasTreeId = ActorDB::Instance->AddEntry(EnChristmasTreeInit).entry.id;
}
extern "C" ActorDBEntry* ActorDB_Retrieve(const int id) {
diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
index 9af4eadb7e..b357363ac9 100644
--- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
+++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
@@ -515,7 +515,7 @@ void DrawInfoTab() {
UIWidgets::InsertHelpHoverText("Z-Targeting behavior");
if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT)) {
- ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U16, &gSaveContext.triforcePiecesCollected);
+ ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, &gSaveContext.triforcePiecesCollected);
UIWidgets::InsertHelpHoverText("Currently obtained Triforce Pieces. For Triforce Hunt.");
}
diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h
index 42c9c91c0f..01557efefe 100644
--- a/soh/soh/Enhancements/debugger/debugSaveEditor.h
+++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h
@@ -505,6 +505,7 @@ const std::vector flagTables = {
{ RAND_INF_CHILD_FISHING, "RAND_INF_CHILD_FISHING" },
{ RAND_INF_ADULT_FISHING, "RAND_INF_ADULT_FISHING" },
{ RAND_INF_10_BIG_POES, "RAND_INF_10_BIG_POES" },
+ { RAND_INF_GRANT_GANONS_BOSSKEY, "RAND_INF_GRANT_GANONS_BOSSKEY" },
} },
};
diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp
index 750ca54be0..f4b62363d4 100644
--- a/soh/soh/Enhancements/mods.cpp
+++ b/soh/soh/Enhancements/mods.cpp
@@ -652,8 +652,6 @@ void RegisterTriforceHunt() {
// Warp to credits
if (GameInteractor::State::TriforceHuntCreditsWarpActive) {
- GetItemEntry getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY);
- GiveItemEntryWithoutActor(gPlayState, getItemEntry);
eventTimer = 1;
GameInteractor::State::TriforceHuntCreditsWarpActive = 0;
}
@@ -706,6 +704,18 @@ void RegisterTriforceHunt() {
});
}
+void RegisterGrantGanonsBossKey() {
+ GameInteractor::Instance->RegisterGameHook([]() {
+ // Triforce Hunt needs the check if the player isn't being teleported to the credits scene.
+ if (!GameInteractor::IsGameplayPaused() && Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) &&
+ gPlayState->sceneLoadFlag != 0x14 && (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) {
+ GetItemEntry getItemEntry =
+ ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY);
+ GiveItemEntryWithoutActor(gPlayState, getItemEntry);
+ }
+ });
+}
+
//this map is used for enemies that can be uniquely identified by their id
//and that are always counted
//enemies that can't be uniquely identified by their id
@@ -1091,6 +1101,7 @@ void InitMods() {
RegisterMenuPathFix();
RegisterMirrorModeHandler();
RegisterTriforceHunt();
+ RegisterGrantGanonsBossKey();
RegisterEnemyDefeatCounts();
RegisterAltTrapTypes();
RegisterRandomizerSheikSpawn();
diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp
index 9b9913c8c4..7d7a3cf428 100644
--- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp
+++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp
@@ -1931,12 +1931,12 @@ void HintTable_Init_Item() {
hintTable[TRIFORCE_PIECE] = HintText::Item({
//obscure text
- Text{"a triumph fork", /*french*/"la Tribosse", /*spanish*/"un trígono del triunfo"},
- Text{"cheese", /*french*/"du fromage", /*spanish*/"un porción de queso"},
- Text{"a gold fragment", /*french*/"un fragment d'or", /*spanish*/"un fragmento dorado"},
+ Text{"a Christmas Ornament", /*french*/"la Tribosse", /*spanish*/"un trígono del triunfo"},
+ Text{"a Christmas Ornament", /*french*/"du fromage", /*spanish*/"un porción de queso"},
+ Text{"a Christmas Ornament", /*french*/"un fragment d'or", /*spanish*/"un fragmento dorado"},
}, {},
//clear text
- Text{"a Piece of the Triforce", /*french*/"un fragment de la Triforce", /*spanish*/"un fragmento de la Trifuerza"}
+ Text{"a Christmas Ornament", /*french*/"un fragment de la Triforce", /*spanish*/"un fragmento de la Trifuerza"}
);
hintTable[EPONA] = HintText::Item({
diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp
index 34e9c779f7..6f61b9e126 100644
--- a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp
+++ b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp
@@ -242,7 +242,7 @@ void ItemTable_Init() { // RandomizerGet
itemTable[BUY_RED_POTION_40] = Item(RG_BUY_RED_POTION_40, Text{"Buy Red Potion [40]", "Acheter: Potion Rouge [40]", "Comprar poción roja [40]"}, ITEMTYPE_SHOP, 0x30, false, &noVariable, BOTTLE_WITH_RED_POTION, 40);
itemTable[BUY_RED_POTION_50] = Item(RG_BUY_RED_POTION_50, Text{"Buy Red Potion [50]", "Acheter: Potion Rouge [50]", "Comprar poción roja [50]"}, ITEMTYPE_SHOP, 0x31, false, &noVariable, BOTTLE_WITH_RED_POTION, 50);
- itemTable[TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{"Triforce Piece", "Triforce Piece", "Triforce Piece"}, ITEMTYPE_ITEM, 0xDF, true, &TriforcePieces, TRIFORCE_PIECE);
+ itemTable[TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{"Christmas Ornament", "Christmas Ornament", "Christmas Ornament"}, ITEMTYPE_ITEM, 0xDF, true, &TriforcePieces, TRIFORCE_PIECE);
itemTable[TRIFORCE] = Item(RG_TRIFORCE, Text{"Triforce", "Triforce", "Trifuerza"}, ITEMTYPE_EVENT, GI_RUPEE_RED_LOSE, false, &noVariable, NONE);
itemTable[HINT] = Item(RG_HINT, Text{"Hint", "Indice", "Pista"}, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE);
diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp
index 85fb22c22d..7e94b8066d 100644
--- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp
+++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp
@@ -699,9 +699,9 @@ void InitTrickNames() {
Text{"Life Heart", "Cœur de vie", "Vida Corazón"},
Text{"Lots of Love", "Beaucoup d'amour", "Mucho amor"}};
trickNameTable[0xDF] = {
- Text{"Piece of Cheese", "Morceau de Fromage", "Piece of Cheese"},
- Text{"Triforce Shard", "Éclat de Triforce", "Triforce Shard"},
- Text{"Shiny Rock", "Caiiloux Brillant", "Shiny Rock"}};
+ Text{"Glass Ball", "Morceau de Fromage", "Piece of Cheese"},
+ Text{"Coal", "Éclat de Triforce", "Triforce Shard"},
+ Text{"Ornamento", "Caiiloux Brillant", "Shiny Rock"}};
/*
//Names for individual upgrades, in case progressive names are replaced
diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp
index eacc62725b..570ac5801c 100644
--- a/soh/soh/Enhancements/randomizer/draw.cpp
+++ b/soh/soh/Enhancements/randomizer/draw.cpp
@@ -214,7 +214,7 @@ extern "C" void Randomizer_DrawTriforcePiece(PlayState* play, GetItemEntry getIt
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
- uint16_t current = gSaveContext.triforcePiecesCollected;
+ uint8_t current = gSaveContext.triforcePiecesCollected;
Matrix_Scale(0.035f, 0.035f, 0.035f, MTXMODE_APPLY);
@@ -238,8 +238,8 @@ extern "C" void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry get
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
- uint16_t current = gSaveContext.triforcePiecesCollected;
- uint16_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED);
+ uint8_t current = gSaveContext.triforcePiecesCollected;
+ uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED);
Matrix_Scale(triforcePieceScale, triforcePieceScale, triforcePieceScale, MTXMODE_APPLY);
diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp
index a1f11bc103..331aedc2f0 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer.cpp
@@ -60,6 +60,7 @@ const std::string Randomizer::hintMessageTableID = "RandomizerHints";
const std::string Randomizer::merchantMessageTableID = "RandomizerMerchants";
const std::string Randomizer::rupeeMessageTableID = "RandomizerRupees";
const std::string Randomizer::triforcePieceMessageTableID = "RandomizerTriforcePiece";
+const std::string Randomizer::christmasTreeMessageTableID = "RandomizerChristmasTree";
const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi";
const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap";
const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints";
@@ -3542,21 +3543,20 @@ void RandomizerSettingsWindow::DrawElement() {
}
// Triforce Hunt
- UIWidgets::EnhancementCheckbox("Triforce Hunt", "gRandomizeTriforceHunt");
+ UIWidgets::EnhancementCheckbox("Christmas Ornaments Hunt", "gRandomizeTriforceHunt");
UIWidgets::InsertHelpHoverText(
- "Pieces of the Triforce of Courage have been scattered across the world. Find them all to finish the game!\n\n"
- "When the required amount of pieces have been found, the game is saved and Ganon's Boss key is given "
- "to you when you load back into the game if you desire to beat Ganon afterwards.\n\n"
- "Keep in mind Ganon might not be logically beatable when \"All Locations Reachable\" is turned off."
+ "The Christmas ornnaments went missing from the tree in Kakariko Village! Find them back and restore the Christmas "
+ "magic. The tree will get more and more decorated as you find more of the ornaments. Interact with the completed tree "
+ "to finish the game! Your game will be saved and Ganon's Boss key will be granted once you load back into the save."
);
if (CVarGetInteger("gRandomizeTriforceHunt", 0)) {
// Triforce Hunt (total pieces)
UIWidgets::Spacer(0);
int totalPieces = CVarGetInteger("gRandomizeTriforceHuntTotalPieces", 30);
- ImGui::Text("Triforce Pieces in the world: %d", totalPieces);
+ ImGui::Text("Ornaments in the world: %d", totalPieces);
UIWidgets::InsertHelpHoverText(
- "The amount of Triforce pieces that will be placed in the world. "
+ "The amount of Christmas ornaments that will be placed in the world. "
"Keep in mind seed generation can fail if more pieces are placed than there are junk items in the item pool."
);
ImGui::SameLine();
@@ -3564,9 +3564,9 @@ void RandomizerSettingsWindow::DrawElement() {
// Triforce Hunt (required pieces)
int requiredPieces = CVarGetInteger("gRandomizeTriforceHuntRequiredPieces", 20);
- ImGui::Text("Triforce Pieces to win: %d", requiredPieces);
+ ImGui::Text("Ornaments to win: %d", requiredPieces);
UIWidgets::InsertHelpHoverText(
- "The amount of Triforce pieces required to win the game."
+ "The amount of Christmas ornaments required to win the game."
);
ImGui::SameLine();
UIWidgets::EnhancementSliderInt("", "##TriforceHuntRequiredPieces", "gRandomizeTriforceHuntRequiredPieces", 1, totalPieces, "", 20);
@@ -5515,27 +5515,27 @@ CustomMessage Randomizer::GetRupeeMessage(u16 rupeeTextId) {
void CreateTriforcePieceMessages() {
CustomMessage TriforcePieceMessages[NUM_TRIFORCE_PIECE_MESSAGES] = {
- { "You found a %yTriforce Piece%w!&%g{{current}}%w down, %c{{remaining}}%w to go. It's a start!",
+ { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. It's a start!",
"Ein %yTriforce-Splitter%w! Du hast&%g{{current}}%w von %c{{required}}%w gefunden. Es ist ein&Anfang!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. C'est un début!" },
- { "You found a %yTriforce Piece%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Progress!",
+ { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Progress!",
"Ein %yTriforce-Splitter%w! Du hast&%g{{current}}%w von %c{{required}}%w gefunden. Es geht voran!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. Ça avance!" },
- { "You found a %yTriforce Piece%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Over half-way&there!",
+ { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Over half-way&there!",
"Ein %yTriforce-Splitter%w! Du hast&schon %g{{current}}%w von %c{{required}}%w gefunden. Schon&über die Hälfte!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. Il en reste un&peu moins que la moitié!" },
- { "You found a %yTriforce Piece%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Almost done!",
+ { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Almost done!",
"Ein %yTriforce-Splitter%w! Du hast&schon %g{{current}}%w von %c{{required}}%w gefunden. Fast&geschafft!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. C'est presque&terminé!" },
- { "You completed the %yTriforce of&Courage%w! %gGG%w!",
+ { "You found all of the %yChristmas&Ornaments%w! Visit the %gChristmas&tree%w in Kakariko Village!",
"Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!",
"Vous avez complété la %yTriforce&du Courage%w! %gFélicitations%w!" },
- { "You found a spare %yTriforce Piece%w!&You only needed %c{{required}}%w, but you have %g{{current}}%w!",
+ { "You found a spare %yChristmas Ornament%w!&You only needed %c{{required}}%w, but you have %g{{current}}%w!",
"Ein übriger %yTriforce-Splitter%w! Du&hast nun %g{{current}}%w von %c{{required}}%w nötigen gefunden.",
"Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c{{required}}%w, mais vous en avez %g{{current}}%w en&tout!" },
};
@@ -5548,9 +5548,9 @@ void CreateTriforcePieceMessages() {
CustomMessage Randomizer::GetTriforcePieceMessage() {
// Item is only given after the textbox, so reflect that inside the textbox.
- uint16_t current = gSaveContext.triforcePiecesCollected + 1;
- uint16_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED);
- uint16_t remaining = required - current;
+ uint8_t current = gSaveContext.triforcePiecesCollected + 1;
+ uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED);
+ uint8_t remaining = required - current;
float percentageCollected = (float)current / (float)required;
uint8_t messageIndex;
@@ -5575,6 +5575,39 @@ CustomMessage Randomizer::GetTriforcePieceMessage() {
messageEntry.Replace("{{required}}", std::to_string(required), std::to_string(required), std::to_string(required));
return messageEntry;
}
+void CreateChristmasTreeMessages() {
+ CustomMessage ChristmasTreeMessages[2] = {
+
+ { "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!",
+ "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!",
+ "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!" },
+
+ { "The tree's magic has been fully&restored. %gMerry %rChristmas%w!",
+ "The tree's magic has been fully&restored. %gMerry %rChristmas%w!",
+ "The tree's magic has been fully&restored. %gMerry %rChristmas%w!" }
+ };
+ CustomMessageManager* customMessageManager = CustomMessageManager::Instance;
+ customMessageManager->AddCustomMessageTable(Randomizer::christmasTreeMessageTableID);
+ for (unsigned int i = 0; i <= 1; i++) {
+ customMessageManager->CreateMessage(Randomizer::christmasTreeMessageTableID, i, ChristmasTreeMessages[i]);
+ }
+}
+
+CustomMessage Randomizer::GetChristmasTreeMessage() {
+ // Item is only given after the textbox, so reflect that inside the textbox.
+ uint8_t current = gSaveContext.triforcePiecesCollected;
+ uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED);
+ uint8_t messageIndex;
+
+ if (current < required) {
+ messageIndex = 0;
+ } else {
+ messageIndex = 1;
+ }
+
+ CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::christmasTreeMessageTableID, messageIndex);
+ return messageEntry;
+}
void CreateNaviRandoMessages() {
CustomMessage NaviMessages[NUM_NAVI_MESSAGES] = {
@@ -6108,6 +6141,7 @@ void Randomizer::CreateCustomMessages() {
CreateGetItemMessages(&getItemMessages);
CreateRupeeMessages();
CreateTriforcePieceMessages();
+ CreateChristmasTreeMessages();
CreateNaviRandoMessages();
CreateIceTrapRandoMessages();
CreateFireTempleGoronMessages();
diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h
index a726cecdee..3ad363d2a9 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.h
+++ b/soh/soh/Enhancements/randomizer/randomizer.h
@@ -49,6 +49,7 @@ class Randomizer {
static const std::string merchantMessageTableID;
static const std::string rupeeMessageTableID;
static const std::string triforcePieceMessageTableID;
+ static const std::string christmasTreeMessageTableID;
static const std::string NaviRandoMessageTableID;
static const std::string IceTrapRandoMessageTableID;
static const std::string randoMiscHintsTableID;
@@ -105,6 +106,7 @@ class Randomizer {
static void CreateCustomMessages();
static CustomMessage GetRupeeMessage(u16 rupeeTextId);
static CustomMessage GetTriforcePieceMessage();
+ static CustomMessage GetChristmasTreeMessage();
bool CheckContainsVanillaItem(RandomizerCheck randoCheck);
};
diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h
index 33c206b470..8d4ec98012 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_inf.h
+++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h
@@ -159,6 +159,7 @@ typedef enum {
RAND_INF_CHILD_FISHING,
RAND_INF_ADULT_FISHING,
RAND_INF_10_BIG_POES,
+ RAND_INF_GRANT_GANONS_BOSSKEY,
// 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)
diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp
index f24ab818b9..33477b0c62 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp
@@ -607,7 +607,7 @@ void DrawItem(ItemTrackerItem item) {
case RG_TRIFORCE_PIECE:
actualItemId = item.id;
hasItem = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT);
- itemName = "Triforce Piece";
+ itemName = "Christmas Ornament";
break;
}
@@ -1148,9 +1148,9 @@ void ItemTrackerSettingsWindow::DrawElement() {
UIWidgets::Spacer(0);
- ImGui::Text("Triforce Piece Count Tracking");
+ ImGui::Text("Christmas ornament Count Tracking");
UIWidgets::EnhancementCombobox("gItemTrackerTriforcePieceTrack", itemTrackerTriforcePieceTrackOptions, TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX);
- UIWidgets::InsertHelpHoverText("Customize what numbers are shown for triforce piece tracking.");
+ UIWidgets::InsertHelpHoverText("Customize what numbers are shown for ornament tracking.");
ImGui::TableNextColumn();
@@ -1191,7 +1191,7 @@ void ItemTrackerSettingsWindow::DrawElement() {
shouldUpdateVectors = true;
}
- if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Triforce Pieces", "gItemTrackerTriforcePiecesDisplayType", displayTypes, SECTION_DISPLAY_HIDDEN)) {
+ if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Christmas Ornaments", "gItemTrackerTriforcePiecesDisplayType", displayTypes, SECTION_DISPLAY_HIDDEN)) {
shouldUpdateVectors = true;
}
diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp
index 7262a56e17..5c7bdee722 100644
--- a/soh/soh/OTRGlobals.cpp
+++ b/soh/soh/OTRGlobals.cpp
@@ -812,11 +812,8 @@ extern "C" void InitOTR() {
time_t now = time(NULL);
tm *tm_now = localtime(&now);
- if (tm_now->tm_mon == 11 && tm_now->tm_mday >= 24 && tm_now->tm_mday <= 25) {
- CVarRegisterInteger("gLetItSnow", 1);
- } else {
- CVarClear("gLetItSnow");
- }
+
+ CVarRegisterInteger("gLetItSnow", 1);
srand(now);
#ifdef ENABLE_CROWD_CONTROL
@@ -2042,7 +2039,9 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
s16 actorParams = 0;
if (IS_RANDO) {
Player* player = GET_PLAYER(play);
- if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) {
+ if (textId == 0x406B && play->sceneNum == SCENE_KAKARIKO_VILLAGE) {
+ messageEntry = Randomizer::GetChristmasTreeMessage();
+ } else if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) {
if (player->getItemEntry.getItemId == RG_ICE_TRAP) {
u16 iceTrapTextId = Random(0, NUM_ICE_TRAP_MESSAGES);
messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::IceTrapRandoMessageTableID, iceTrapTextId);
diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c
index ec25d20625..e972297f65 100644
--- a/soh/src/code/z_parameter.c
+++ b/soh/src/code/z_parameter.c
@@ -2600,14 +2600,6 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
gSaveContext.triforcePiecesCollected++;
GameInteractor_SetTriforceHuntPieceGiven(true);
- // Teleport to credits when goal is reached.
- if (gSaveContext.triforcePiecesCollected == Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED)) {
- gSaveContext.sohStats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME;
- gSaveContext.sohStats.gameComplete = 1;
- Play_PerformSave(play);
- GameInteractor_SetTriforceHuntCreditsWarpActive(true);
- }
-
return Return_Item_Entry(giEntry, RG_NONE);
}
diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c
index 112a71888f..de13f78e94 100644
--- a/soh/src/code/z_play.c
+++ b/soh/src/code/z_play.c
@@ -35,6 +35,7 @@ u64 D_801614D0[0xA00];
PlayState* gPlayState;
s16 gEnPartnerId;
+s16 gEnChristmasTreeId;
void OTRPlay_SpawnScene(PlayState* play, s32 sceneNum, s32 spawn);
@@ -759,6 +760,10 @@ void Play_Init(GameState* thisx) {
GET_PLAYER(play)->actor.world.pos.y + Player_GetHeight(GET_PLAYER(play)) + 5.0f,
GET_PLAYER(play)->actor.world.pos.z, 0, 0, 0, 1, true);
}
+
+ if (play->sceneNum == SCENE_KAKARIKO_VILLAGE && Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT)) {
+ Actor_Spawn(&play->actorCtx, play, gEnChristmasTreeId, -734, 0, 420, 0, 0, 0, 1, true);
+ }
}
void Play_Update(PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c
new file mode 100644
index 0000000000..9d9f65190b
--- /dev/null
+++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c
@@ -0,0 +1,134 @@
+/*
+ * File: z_en_christmastree.c
+ * Overlay: ovl_En_ChristmasTree
+ * Description: Custom Christmas Tree for Ornament Hunt
+ */
+
+#include "z_en_christmastree.h"
+#include "soh_assets.h"
+#include "soh/Enhancements/game-interactor/GameInteractor.h"
+
+void EnChristmasTree_Init(Actor* thisx, PlayState* play);
+void EnChristmasTree_Destroy(Actor* thisx, PlayState* play);
+void EnChristmasTree_Update(Actor* thisx, PlayState* play);
+void EnChristmasTree_Draw(Actor* thisx, PlayState* play);
+
+void EnChristmasTree_Wait(EnChristmasTree* this, PlayState* play);
+void EnChristmasTree_Talk(EnChristmasTree* this, PlayState* play);
+
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_NONE,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_2,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00000000, 0x00, 0x00 },
+ TOUCH_NONE,
+ BUMP_NONE,
+ OCELEM_ON,
+ },
+ { 50, 150, 0, { 0, 0, 0 } },
+};
+
+static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
+
+void EnChristmasTree_Init(Actor* thisx, PlayState* play) {
+ EnChristmasTree* this = (EnChristmasTree*)thisx;
+
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 90.0f);
+ Collider_InitCylinder(play, &this->collider);
+ Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+
+ this->actor.targetMode = 1;
+ this->actor.textId = 0x406B; // Hijacking bean seller text ID so I'm sure it doesn't clash
+
+ this->actionFunc = EnChristmasTree_Wait;
+}
+
+void EnChristmasTree_Destroy(Actor* thisx, PlayState* play) {
+ EnChristmasTree* this = (EnChristmasTree*)thisx;
+
+ Collider_DestroyCylinder(play, &this->collider);
+}
+
+void EnChristmasTree_Wait(EnChristmasTree* this, PlayState* play) {
+ if (Actor_ProcessTalkRequest(&this->actor, play)) { // if talk is initiated
+ this->actionFunc = EnChristmasTree_Talk;
+ } else if ((this->actor.xzDistToPlayer < 170.0f)) { // talk range
+ func_8002F2CC(&this->actor, play, 170.0f);
+ }
+}
+
+void EnChristmasTree_Talk(EnChristmasTree* this, PlayState* play) {
+ u8 dialogState = Message_GetState(&play->msgCtx);
+ if (dialogState != TEXT_STATE_CHOICE) {
+ if ((dialogState == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { // advanced final textbox
+ this->actionFunc = EnChristmasTree_Wait;
+
+ // Teleport to credits when goal is reached.
+ if (gSaveContext.triforcePiecesCollected >= Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED)) {
+ gSaveContext.sohStats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME;
+ gSaveContext.sohStats.gameComplete = 1;
+ Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY);
+ Play_PerformSave(play);
+ GameInteractor_SetTriforceHuntCreditsWarpActive(true);
+ }
+ }
+ }
+
+
+}
+
+void EnChristmasTree_Update(Actor* thisx, PlayState* play) {
+ EnChristmasTree* this = (EnChristmasTree*)thisx;
+ ColliderCylinder* collider = &this->collider;
+
+ Collider_UpdateCylinder(thisx, collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, (Collider*)collider);
+
+ Actor_SetFocus(&this->actor, 80.0f);
+
+ this->actionFunc(this, play);
+}
+
+void EnChristmasTree_Draw(Actor* thisx, PlayState* play) {
+ float percentageCompleted = (float)gSaveContext.triforcePiecesCollected /
+ (float)Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED);
+ float treeSize = 30.0f;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL_25Opa(play->state.gfxCtx);
+
+ Matrix_Scale(treeSize, treeSize, treeSize, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasTreeDL);
+ if (percentageCompleted >= 0.17f) {
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)xmas_tree_presents);
+ }
+ if (percentageCompleted >= 0.34f) {
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)xmas_tree_bauble_r);
+ }
+ if (percentageCompleted >= 0.51f) {
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)xmas_tree_bauble_g);
+ }
+ if (percentageCompleted >= 0.68f) {
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)xmas_tree_bauble_b);
+ }
+ if (percentageCompleted >= 0.85f) {
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)xmas_tree_bauble_s);
+ }
+ if (percentageCompleted >= 1.0f) {
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)xmas_tree_star);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h
new file mode 100644
index 0000000000..1dbed3396b
--- /dev/null
+++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h
@@ -0,0 +1,28 @@
+#ifndef Z_EN_CHRISTMASTREE_H
+#define Z_EN_CHRISTMASTREE_H
+
+#include
+#include "global.h"
+
+struct EnChristmasTree;
+
+typedef void (*EnChristmasTreeActionFunc)(struct EnChristmasTree*, PlayState*);
+
+typedef struct EnChristmasTree {
+ Actor actor;
+ ColliderCylinder collider;
+ EnChristmasTreeActionFunc actionFunc;
+} EnChristmasTree;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void EnChristmasTree_Init(Actor* thisx, PlayState* play);
+void EnChristmasTree_Destroy(Actor* thisx, PlayState* play);
+void EnChristmasTree_Update(Actor* thisx, PlayState* play);
+void EnChristmasTree_Draw(Actor* thisx, PlayState* play);
+#ifdef __cplusplus
+}
+#endif
+
+#endif