diff --git a/soh/assets/custom/objects/object_festivehats/antlers_64 b/soh/assets/custom/objects/object_festivehats/antlers_64
new file mode 100644
index 000000000..74fe9e819
Binary files /dev/null and b/soh/assets/custom/objects/object_festivehats/antlers_64 differ
diff --git a/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL
new file mode 100644
index 000000000..ab8fdf45f
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_tri_0
new file mode 100644
index 000000000..980452845
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_tri_0
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_vtx_0
new file mode 100644
index 000000000..8a64cdf18
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_vtx_0
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL
new file mode 100644
index 000000000..6d059179f
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_0
new file mode 100644
index 000000000..3e0ab2ad8
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_0
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_1 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_1
new file mode 100644
index 000000000..99f0a799d
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_1
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_0
new file mode 100644
index 000000000..ebb2b0eea
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_0
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_1 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_1
new file mode 100644
index 000000000..d7263bc94
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_1
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL
new file mode 100644
index 000000000..2b2ee6c3e
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_tri_0
new file mode 100644
index 000000000..543e90c1f
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_tri_0
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_vtx_0
new file mode 100644
index 000000000..d7263bc94
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_vtx_0
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL
new file mode 100644
index 000000000..27bdd9211
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_tri_0
new file mode 100644
index 000000000..313f489de
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_tri_0
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_vtx_0
new file mode 100644
index 000000000..eb7d042ff
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_vtx_0
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL
new file mode 100644
index 000000000..6f7262451
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_tri_0
new file mode 100644
index 000000000..83cf6d929
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_tri_0
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_vtx_0
new file mode 100644
index 000000000..b937dad3e
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_vtx_0
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL
new file mode 100644
index 000000000..769a41928
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_tri_0
new file mode 100644
index 000000000..776fb4da9
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_tri_0
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_vtx_0
new file mode 100644
index 000000000..847f1ae81
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_vtx_0
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL
new file mode 100644
index 000000000..4093e1aa3
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_tri_0
new file mode 100644
index 000000000..4f18af8bf
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_tri_0
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_vtx_0
new file mode 100644
index 000000000..b0c371f13
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_vtx_0
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL
new file mode 100644
index 000000000..ec6ccada7
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_tri_0
new file mode 100644
index 000000000..672602bc1
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_tri_0
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_vtx_0
new file mode 100644
index 000000000..c7a513a67
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_vtx_0
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL
new file mode 100644
index 000000000..0f4573976
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_0
new file mode 100644
index 000000000..5396ff4d8
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_0
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_1 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_1
new file mode 100644
index 000000000..bdf895c49
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_1
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_0
new file mode 100644
index 000000000..145ca70f4
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_0
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_1 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_1
new file mode 100644
index 000000000..7f90daac7
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_1
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/hilite_nose b/soh/assets/custom/objects/object_festivehats/hilite_nose
new file mode 100644
index 000000000..b2d4623c9
Binary files /dev/null and b/soh/assets/custom/objects/object_festivehats/hilite_nose differ
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gCuccoLadyHatDL_f3dlite_hatcolour b/soh/assets/custom/objects/object_festivehats/mat_gCuccoLadyHatDL_f3dlite_hatcolour
new file mode 100644
index 000000000..d1d036f89
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gCuccoLadyHatDL_f3dlite_hatcolour
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_antlers b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_antlers
new file mode 100644
index 000000000..3717c72b2
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_antlers
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_rednose b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_rednose
new file mode 100644
index 000000000..758d8698b
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_rednose
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gHorseAntlersDL_f3dlite_antlers b/soh/assets/custom/objects/object_festivehats/mat_gHorseAntlersDL_f3dlite_antlers
new file mode 100644
index 000000000..3717c72b2
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gHorseAntlersDL_f3dlite_antlers
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultHatTrimDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultHatTrimDL_f3dlite_santahat_white
new file mode 100644
index 000000000..2f72783f7
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultHatTrimDL_f3dlite_santahat_white
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultPompomDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultPompomDL_f3dlite_santahat_white
new file mode 100644
index 000000000..2f72783f7
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultPompomDL_f3dlite_santahat_white
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkChildHatTrimDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildHatTrimDL_f3dlite_santahat_white
new file mode 100644
index 000000000..2f72783f7
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildHatTrimDL_f3dlite_santahat_white
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkChildPompomDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildPompomDL_f3dlite_santahat_white
new file mode 100644
index 000000000..2f72783f7
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildPompomDL_f3dlite_santahat_white
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gPaperCrownGenericDL_f3dlite_crown b/soh/assets/custom/objects/object_festivehats/mat_gPaperCrownGenericDL_f3dlite_crown
new file mode 100644
index 000000000..4fb4e2029
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gPaperCrownGenericDL_f3dlite_crown
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatred b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatred
new file mode 100644
index 000000000..b42644ae8
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatred
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatwhite b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatwhite
new file mode 100644
index 000000000..2f72783f7
--- /dev/null
+++ b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatwhite
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h
index 2a5695b6b..62cd02c7d 100644
--- a/soh/assets/soh_assets.h
+++ b/soh/assets/soh_assets.h
@@ -8,6 +8,27 @@
// On Mac, not using aligned resource names was causing crashes in release builds
// objects
+#define dgLinkAdultHatTrimDL "__OTR__objects/object_festivehats/gLinkAdultHatTrimDL"
+static const ALIGN_ASSET(2) char gLinkAdultHatTrimDL[] = dgLinkAdultHatTrimDL;
+
+#define dgLinkAdultPompomDL "__OTR__objects/object_festivehats/gLinkAdultPompomDL"
+static const ALIGN_ASSET(2) char gLinkAdultPompomDL[] = dgLinkAdultPompomDL;
+
+#define dgLinkChildHatTrimDL "__OTR__objects/object_festivehats/gLinkChildHatTrimDL"
+static const ALIGN_ASSET(2) char gLinkChildHatTrimDL[] = dgLinkChildHatTrimDL;
+
+#define dgPaperCrownGenericDL "__OTR__objects/object_festivehats/gPaperCrownGenericDL"
+static const ALIGN_ASSET(2) char gPaperCrownGenericDL[] = dgPaperCrownGenericDL;
+
+#define dgSantaHatGenericDL "__OTR__objects/object_festivehats/gSantaHatGenericDL"
+static const ALIGN_ASSET(2) char gSantaHatGenericDL[] = dgSantaHatGenericDL;
+
+#define dgHorseAntlersDL "__OTR__objects/object_festivehats/gHorseAntlersDL"
+static const ALIGN_ASSET(2) char gHorseAntlersDL[] = dgHorseAntlersDL;
+
+#define dgEponaRudolphHatDL "__OTR__objects/object_festivehats/gEponaRudolphHatDL"
+static const ALIGN_ASSET(2) char gEponaRudolphHatDL[] = dgEponaRudolphHatDL;
+
#define dgChristmasGreenTreasureChestFrontTex "__OTR__objects/object_box/gChristmasGreenTreasureChestFrontTex"
static const ALIGN_ASSET(2) char gChristmasGreenTreasureChestFrontTex[] = dgChristmasGreenTreasureChestFrontTex;
diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp
index c3bebe952..855eb755a 100644
--- a/soh/soh/OTRGlobals.cpp
+++ b/soh/soh/OTRGlobals.cpp
@@ -1048,6 +1048,10 @@ extern "C" void InitOTR() {
tm *tm_now = localtime(&now);
CVarRegisterInteger("gLetItSnow", 1);
+ CVarRegisterInteger("gCosmetics.Link_KokiriTunic.Changed", 1);
+ CVarRegisterColor("gCosmetics.Link_KokiriTunic.Value", Color_RGBA8{ 255, 0, 0, 255 });
+ CVarRegisterInteger("gCosmetics.NPC_Kokiri.Changed", 1);
+ CVarRegisterColor("gCosmetics.NPC_Kokiri.Value", Color_RGBA8{ 255, 0, 0, 255 });
srand(now);
#ifdef ENABLE_CROWD_CONTROL
diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c
index 820f2c672..a05652f69 100644
--- a/soh/src/code/z_player_lib.c
+++ b/soh/src/code/z_player_lib.c
@@ -10,6 +10,7 @@
#include "soh/Enhancements/randomizer/draw.h"
#include
+#include
typedef struct {
/* 0x00 */ u8 flag;
@@ -1672,6 +1673,52 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList, Ve
Matrix_MultVec3f(&sZeroVec, D_80160000);
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == PLAYER_LIMB_HEAD) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ if (LINK_IS_ADULT) {
+ Matrix_RotateZYX(24000, -16000, -7000, MTXMODE_APPLY);
+ Matrix_Translate(32.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gLinkAdultHatTrimDL);
+ } else {
+ Matrix_RotateZYX(24000, -16000, -7000, MTXMODE_APPLY);
+ Matrix_Translate(32.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gLinkChildHatTrimDL);
+ }
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ if (limbIndex == PLAYER_LIMB_HAT) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ if (LINK_IS_ADULT) {
+ Matrix_RotateZYX(0, 0, 17500, MTXMODE_APPLY);
+ Matrix_Translate(-195.0f, 1500.0f, -95.0f, MTXMODE_APPLY);
+ Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY);
+ } else {
+ Matrix_RotateZYX(0, 0, 27000, MTXMODE_APPLY);
+ Matrix_Translate(-950.0f, 2600.0f, -75.0f, MTXMODE_APPLY);
+ Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY);
+ }
+
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gLinkAdultPompomDL);
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
if (limbIndex == PLAYER_LIMB_L_HAND) {
MtxF sp14C;
Actor* hookedActor;
diff --git a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c
index e90e36e80..aacec12aa 100644
--- a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c
+++ b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c
@@ -5,6 +5,7 @@
#include "scenes/dungeons/ddan_boss/ddan_boss_room_1.h"
#include "soh/frame_interpolation.h"
#include "soh/Enhancements/boss-rush/BossRush.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
@@ -1134,6 +1135,21 @@ void BossDodongo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
Matrix_MultVec3f(&D_808CA48C, &this->unk_404);
}
Collider_UpdateSpheres(limbIndex, &this->collider);
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 7) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-6643, 1771, -14834, MTXMODE_APPLY);
+ Matrix_Translate(2000.0f, 5000.0f, 4000.0f, MTXMODE_APPLY);
+ Matrix_Scale(6.114f, 6.114f, 6.114f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void BossDodongo_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c
index cb00dbee8..80d771976 100644
--- a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c
+++ b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c
@@ -8,6 +8,7 @@
#include "objects/object_geff/object_geff.h"
#include "soh/frame_interpolation.h"
#include "soh/Enhancements/boss-rush/BossRush.h"
+#include "soh_assets.h"
#include
@@ -2658,6 +2659,18 @@ void BossGanon2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
}
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 16) {
+ Matrix_Push();
+ Matrix_RotateZYX(5977, 4649, 18154, MTXMODE_APPLY);
+ Matrix_Translate(364.865f, 67.568f, 378.378f, MTXMODE_APPLY);
+ Matrix_Scale(4.595f, 4.595f, 4.595f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ }
+ }
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -2782,6 +2795,21 @@ void BossGanon2_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
} else if (limbIndex == 10) {
Matrix_MultVec3f(&D_80907164, &this->unk_1B8);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 11) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY);
+ Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void func_80905674(BossGanon2* this, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
index 111380f0b..c73842595 100644
--- a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
+++ b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
@@ -12,6 +12,7 @@
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
#include "soh/Enhancements/boss-rush/BossRush.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
@@ -1451,6 +1452,20 @@ void BossGanondrof_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
if (((this->flyMode != GND_FLY_PAINTING) || (this->actionFunc == BossGanondrof_Intro)) && (limbIndex <= 25)) {
Matrix_MultVec3f(&zeroVec, &this->bodyPartsPos[limbIndex - 1]);
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(11955, 0, -15499, MTXMODE_APPLY);
+ Matrix_Translate(459.460f, 256.757f, -567.568f, MTXMODE_APPLY);
+ Matrix_Scale(0.877f, 0.877f, 0.877f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
Gfx* BossGanondrof_GetClearPixelDList(GraphicsContext* gfxCtx) {
diff --git a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c
index c5ca6686a..d528f5403 100644
--- a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -8,6 +8,7 @@
#include "objects/object_am/object_am.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_CAN_PRESS_SWITCH)
@@ -944,6 +945,21 @@ void EnAm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if ((limbIndex == 1) && (this->unk_264 != 0)) {
EnAm_TransformSwordHitbox(&this->dyna.actor, play);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 4) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -2657, MTXMODE_APPLY);
+ Matrix_Translate(4000.0f, 1148.649f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.655f, 1.655f, 1.655f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
static Vec3f sIcePosOffsets[] = {
diff --git a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c
index 15ebd759c..099ef503d 100644
--- a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c
+++ b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c
@@ -6,6 +6,7 @@
#include "z_en_ani.h"
#include "objects/object_ani/object_ani.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -321,6 +322,21 @@ void EnAni_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 15) {
Matrix_MultVec3f(&sMultVec, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(1992, 0, 2656, MTXMODE_APPLY);
+ Matrix_Translate(972.973f, 40.541f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.965f, 0.965f, 0.965f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnAni_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c
index 39c0e54e9..8024c09e3 100644
--- a/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c
+++ b/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c
@@ -8,6 +8,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_Bb/object_Bb.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_PLAY_HIT_SFX)
@@ -1269,6 +1270,20 @@ void EnBb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
EnBb* this = (EnBb*)thisx;
BodyBreak_SetInfo(&this->bodyBreak, limbIndex, 4, 15, 15, dList, BODYBREAK_OBJECT_DEFAULT);
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-13063, 0, -27454, MTXMODE_APPLY);
+ Matrix_Translate(418.919f, -81.081f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.757f, 1.757f, 1.757f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
static Vec3f sFireIceOffsets[] = {
diff --git a/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c b/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c
index d1659d21c..be4e96dcc 100644
--- a/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c
+++ b/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c
@@ -1,6 +1,7 @@
#include "z_en_cs.h"
#include "objects/object_cs/object_cs.h"
#include "objects/object_link_child/object_link_child.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -521,4 +522,19 @@ void EnCs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_RotateZ(5.0 * M_PI / 9.0, MTXMODE_APPLY);
Matrix_Get(&this->spookyMaskMtx);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(8191, -5757, -24133, MTXMODE_APPLY);
+ Matrix_Translate(270.27f, 297.297f, -513.514f, MTXMODE_APPLY);
+ Matrix_Scale(1.135f, 1.135f, 1.135f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
diff --git a/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c b/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c
index 6cc91e0c7..ea01c116a 100644
--- a/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c
+++ b/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c
@@ -6,6 +6,7 @@
#include "z_en_daiku_kakariko.h"
#include "objects/object_daiku/object_daiku.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -539,6 +540,51 @@ void EnDaikuKakariko_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
gSPDisplayList(POLY_OPA_DISP++, carpenterHeadDLists[this->actor.params & 3]);
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ Matrix_Push();
+ switch(this->actor.params) {
+ case 259: {
+ Matrix_RotateZYX(4649, 0, -3543, MTXMODE_APPLY);
+ Matrix_Translate(824.324f, 324.324f, -175.676f, MTXMODE_APPLY);
+ Matrix_Scale(0.966f, 0.966f, 0.966f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ case 513: {
+ Matrix_RotateZYX(0, 0, -6200, MTXMODE_APPLY);
+ Matrix_Translate(770.27f, 567.568f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.899f, 0.899f, 0.899f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ case 2: {
+ Matrix_RotateZYX(0, 0, 7970, MTXMODE_APPLY);
+ Matrix_Translate(1270.27f, -878.378f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ case -256:
+ default: {
+ Matrix_RotateZYX(0, 0, -8635, MTXMODE_APPLY);
+ Matrix_Translate(675.676f, 716.216f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.899f, 0.899f, 0.899f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ }
+ }
+ Matrix_Pop();
+ }
+ }
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c b/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
index 2b4344f68..524579aa9 100644
--- a/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
+++ b/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
@@ -3,6 +3,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE)
@@ -1279,6 +1280,20 @@ void EnDekubaba_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
if (limbIndex == 1) {
Collider_UpdateSpheres(limbIndex, &this->collider);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 4) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(16485, -1425, -20964, MTXMODE_APPLY);
+ Matrix_Translate(-149.0f, 92.0f, -587.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.534f, 1.534f, 1.534f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnDekubaba_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c
index 0dd33a8ac..a70587070 100644
--- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c
+++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c
@@ -8,6 +8,7 @@
#include "objects/object_shopnuts/object_shopnuts.h"
#include "vt.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -550,9 +551,27 @@ void EnDns_Update(Actor* thisx, PlayState* play) {
}
}
+void EnDns_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnDns* this = (EnDns*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 17) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, 17490, MTXMODE_APPLY);
+ Matrix_Translate(4200.0f, -472.973f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(4.932f, 4.932f, 4.932f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+}
+
void EnDns_Draw(Actor* thisx, PlayState* play) {
EnDns* this = (EnDns*)thisx;
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, &this->actor);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnDns_PostLimbDraw, &this->actor);
}
diff --git a/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c b/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
index 359477614..a342e9412 100644
--- a/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -3,6 +3,7 @@
#include "overlays/actors/ovl_En_Bombf/z_en_bombf.h"
#include "objects/object_dodongo/object_dodongo.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -915,6 +916,21 @@ void EnDodongo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultVec3f(&baseOffset, &this->icePos[i]);
}
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 7) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -13063, MTXMODE_APPLY);
+ Matrix_Translate(864.865f, 756.757f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.662f, 0.662f, 0.662f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnDodongo_Draw(Actor* thisx, PlayState* play2) {
diff --git a/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c b/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c
index 38a1cf95b..a849b4327 100644
--- a/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c
+++ b/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c
@@ -6,6 +6,7 @@
#include "z_en_dog.h"
#include "objects/object_dog/object_dog.h"
+#include "soh_assets.h"
#define FLAGS 0
@@ -494,6 +495,19 @@ s32 EnDog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
}
void EnDog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 4) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(20811, -32768, 3985, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.25f, 1.25f, 1.25f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnDog_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c
index 6da75b1e7..c699fa286 100644
--- a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c
+++ b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c
@@ -7,6 +7,7 @@
#include "z_en_ds.h"
#include "objects/object_ds/object_ds.h"
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -322,6 +323,21 @@ void EnDs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 5) {
Matrix_MultVec3f(&sMultVec, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 5) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-1329, -3100, 0, MTXMODE_APPLY);
+ Matrix_Translate(1270.27f, 351.351f, -310.811f, MTXMODE_APPLY);
+ Matrix_Scale(0.797f, 0.797f, 0.797f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnDs_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c
index acd64e308..3a98074b1 100644
--- a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c
+++ b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c
@@ -1,6 +1,7 @@
#include "z_en_du.h"
#include "objects/object_du/object_du.h"
#include "scenes/overworld/spot18/spot18_scene.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_FREEZE_OCARINA)
@@ -624,6 +625,20 @@ void EnDu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 16) {
Matrix_MultVec3f(&D_809FF40C, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 17) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(13062, -1329, -15499, MTXMODE_APPLY);
+ Matrix_Translate(945.946f, -297.297f, 608.108f, MTXMODE_APPLY);
+ Matrix_Scale(1.217f, 1.217f, 1.217f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnDu_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c
index 2191daeab..d809d283e 100644
--- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -7,6 +7,7 @@
#include "z_en_elf.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA)
@@ -1504,6 +1505,26 @@ s32 EnElf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
return false;
}
+s32 EnElf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnElf* this = (EnElf*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 2) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, 17047, MTXMODE_APPLY);
+ Matrix_Translate(202.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.595f, 0.595f, 0.595f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
+ return false;
+}
+
void EnElf_Draw(Actor* thisx, PlayState* play) {
s32 pad;
f32 alphaScale;
@@ -1541,7 +1562,7 @@ void EnElf_Draw(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, (u8)this->outerColor.r, (u8)this->outerColor.g, (u8)this->outerColor.b,
(u8)(envAlpha * alphaScale));
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
- EnElf_OverrideLimbDraw, NULL, this, POLY_XLU_DISP);
+ EnElf_OverrideLimbDraw, EnElf_PostLimbDraw, this, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c
index 278fb18e2..7cc516f48 100644
--- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -7,6 +7,7 @@
#include "z_en_fu.h"
#include "objects/object_fu/object_fu.h"
#include "scenes/indoors/hakasitarelay/hakasitarelay_scene.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA)
@@ -319,6 +320,20 @@ void EnFu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == FU_LIMB_HEAD) {
Matrix_MultVec3f(&sMtxSrc, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 14) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-27454, 0, 1992, MTXMODE_APPLY);
+ Matrix_Translate(878.378f, -108.108f, 67.568f, MTXMODE_APPLY);
+ Matrix_Scale(1.135f, 1.135f, 1.135f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnFu_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c
index bab56427d..d2e803639 100644
--- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c
+++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c
@@ -1,6 +1,7 @@
#include "z_en_heishi4.h"
#include "objects/object_sd/object_sd.h"
#include "vt.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -414,9 +415,29 @@ s32 EnHeishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
return false;
}
+s32 EnHeishi4_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnHeishi4* this = (EnHeishi4*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 16) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, 442, MTXMODE_APPLY);
+ Matrix_Translate(256.757f, 121.621f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.337f, 1.337f, 1.337f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
+ return false;
+}
+
void EnHeishi4_Draw(Actor* thisx, PlayState* play) {
EnHeishi4* this = (EnHeishi4*)thisx;
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnHeishi_OverrideLimbDraw, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnHeishi_OverrideLimbDraw, EnHeishi4_PostLimbDraw, this);
}
diff --git a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
index deeeee1b9..84eb63d58 100644
--- a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
+++ b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
@@ -7,6 +7,7 @@
#include "z_en_hs2.h"
#include "vt.h"
#include "objects/object_hs/object_hs.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -168,6 +169,21 @@ void EnHs2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 9) {
Matrix_MultVec3f(&D_80A6F4CC, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 9) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -6421, MTXMODE_APPLY);
+ Matrix_Translate(621.622f, 378.378f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.763f, 0.763f, 0.763f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnHs2_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c
index d51c7dd92..1972406be 100644
--- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c
+++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c
@@ -14,6 +14,7 @@
#include "objects/object_cne/object_cne.h"
#include "objects/object_cob/object_cob.h"
#include "objects/object_os_anime/object_os_anime.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -1204,6 +1205,93 @@ void EnHy_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_MultVec3f(&sp3C, &this->actor.focus.pos);
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ Matrix_Push();
+ switch(this->actor.params) {
+ case 1938: {
+ Matrix_RotateZYX(5313, 0, -1550, MTXMODE_APPLY);
+ Matrix_Translate(1108.108f, 54.054f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ break;
+ }
+ case 135:
+ case 7: {
+ Matrix_RotateZYX(1328, 0, 885, MTXMODE_APPLY);
+ Matrix_Translate(864.865f, 229.73f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.25f, 1.25f, 1.25f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ break;
+ }
+ case 1922: {
+ Matrix_RotateZYX(4206, 221, -3543, MTXMODE_APPLY);
+ Matrix_Translate(662.162f, 162.162f, -27.027f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ break;
+ }
+ case 1925: {
+ Matrix_RotateZYX(-9521, 442, -5536, MTXMODE_APPLY);
+ Matrix_Translate(351.351f, 256.757f, 283.784f, MTXMODE_APPLY);
+ Matrix_Scale(1.217f, 1.217f, 1.217f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ break;
+ }
+ case 1920: {
+ Matrix_RotateZYX(0, 0, 3321, MTXMODE_APPLY);
+ Matrix_Translate(1148.649f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ case 1930: {
+ Matrix_RotateZYX(3542, 0, 0, MTXMODE_APPLY);
+ Matrix_Translate(972.973f, -13.514f, 54.054f, MTXMODE_APPLY);
+ Matrix_Scale(0.831f, 0.831f, 0.831f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ case 1929: {
+ Matrix_RotateZYX(3542, 0, 0, MTXMODE_APPLY);
+ Matrix_Translate(972.973f, -13.514f, 54.054f, MTXMODE_APPLY);
+ Matrix_Scale(0.831f, 0.831f, 0.831f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ case 1921: {
+ Matrix_RotateZYX(0, 0, 664, MTXMODE_APPLY);
+ Matrix_Translate(1256.757f, -297.297f, -40.541f, MTXMODE_APPLY);
+ Matrix_Scale(1.135f, 1.135f, 1.135f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ default: {
+ Matrix_RotateZYX(0, 0, 664, MTXMODE_APPLY);
+ Matrix_Translate(783.784f, 94.594f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.662f, 0.662f, 0.662f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ break;
+ }
+ }
+ Matrix_Pop();
+ }
+ }
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c
index aaf0e0342..d29b1decb 100644
--- a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -9,6 +9,7 @@
#include "objects/object_ik/object_ik.h"
#include "vt.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED
@@ -942,6 +943,19 @@ void EnIk_PostLimbDraw3(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
break;
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 11) {
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY);
+ Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ }
+ }
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1223,6 +1237,20 @@ void EnIk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
}
} break;
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 11) {
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY);
+ Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ }
+ }
+
CLOSE_DISPS(gfxCtx);
}
@@ -1373,6 +1401,19 @@ void EnIk_PostLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
break;
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 11) {
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY);
+ Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ }
+ }
+
CLOSE_DISPS(gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_In/z_en_in.c b/soh/src/overlays/actors/ovl_En_In/z_en_in.c
index 13014352a..2897f417b 100644
--- a/soh/src/overlays/actors/ovl_En_In/z_en_in.c
+++ b/soh/src/overlays/actors/ovl_En_In/z_en_in.c
@@ -1,6 +1,7 @@
#include "z_en_in.h"
#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
#include "objects/object_in/object_in.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -987,6 +988,18 @@ void EnIn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
gSPDisplayList(POLY_OPA_DISP++, gIngoChildEraPitchForkDL);
}
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 16) {
+ Matrix_Push();
+ Matrix_RotateZYX(-8192, -222, -11513, MTXMODE_APPLY);
+ Matrix_Translate(770.0f, 837.0f, 878.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.068f, 1.068f, 1.068f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ }
+ }
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c
index 28d8967c2..9a80b75ad 100644
--- a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c
+++ b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c
@@ -7,6 +7,7 @@
#include "z_en_jj.h"
#include "objects/object_jj/object_jj.h"
#include "overlays/actors/ovl_Eff_Dust/z_eff_dust.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
@@ -307,6 +308,26 @@ void EnJj_Update(Actor* thisx, PlayState* play) {
this->skelAnime.jointTable[10].z = this->mouthOpenAngle;
}
+s32 EnJj_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnJj* this = (EnJj*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 13) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(4649, -8635, 15276, MTXMODE_APPLY);
+ Matrix_Translate(27.027f, 135.135f, -81.081f, MTXMODE_APPLY);
+ Matrix_Scale(0.304f, 0.304f, 0.304f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
+ return false;
+}
+
void EnJj_Draw(Actor* thisx, PlayState* play2) {
static void* eyeTextures[] = { gJabuJabuEyeOpenTex, gJabuJabuEyeHalfTex, gJabuJabuEyeClosedTex };
PlayState* play = play2;
@@ -318,7 +339,7 @@ void EnJj_Draw(Actor* thisx, PlayState* play2) {
Matrix_Translate(0.0f, (cosf(this->skelAnime.curFrame * (M_PI / 41.0f)) * 10.0f) - 10.0f, 0.0f, MTXMODE_APPLY);
Matrix_Scale(10.0f, 10.0f, 10.0f, MTXMODE_APPLY);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(eyeTextures[this->eyeIndex]));
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnJj_PostLimbDraw, this);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c
index f388d4989..20eff8f18 100644
--- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c
+++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c
@@ -6,6 +6,7 @@
#include "z_en_ma1.h"
#include "objects/object_ma1/object_ma1.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA)
@@ -555,6 +556,21 @@ void EnMa1_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 15) {
Matrix_MultVec3f(&vec, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, 0, MTXMODE_APPLY);
+ Matrix_Translate(756.757f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnMa1_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c b/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c
index ddc9aea65..997e37e5f 100644
--- a/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c
+++ b/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c
@@ -9,6 +9,7 @@
#include "overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.h"
#include "vt.h"
#include "soh/frame_interpolation.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ALWAYS_THROWN)
@@ -1132,13 +1133,33 @@ s32 EnNiw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
return false;
}
+s32 EnNiw_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnNiw* this = (EnNiw*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -19705, MTXMODE_APPLY);
+ Matrix_Translate(297.297f, -81.082f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
+ return false;
+}
+
void EnNiw_Draw(Actor* thisx, PlayState* play) {
EnNiw* this = (EnNiw*)thisx;
Vec3f scale = { 0.15f, 0.15f, 0.15f };
GraphicsContext* gfxCtx = play->state.gfxCtx;
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiw_OverrideLimbDraw, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiw_OverrideLimbDraw, EnNiw_PostLimbDraw, this);
if (this->actionFunc == func_80AB6450) {
func_80033C30(&this->actor.world.pos, &scale, 255, play);
diff --git a/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c b/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c
index 5113b8a68..e67a75161 100644
--- a/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c
+++ b/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c
@@ -7,6 +7,7 @@
#include "z_en_niw_girl.h"
#include "objects/object_gr/object_gr.h"
#include "vt.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -248,6 +249,27 @@ s32 EnNiwGirlOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
static Vec3f sConstVec3f = { 0.2f, 0.2f, 0.2f };
+s32 EnNiwGirl_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnNiwGirl* this = (EnNiwGirl*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 4) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, 0, MTXMODE_APPLY);
+ Matrix_Translate(945.945f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.676f, 0.676f, 0.676f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
+ return false;
+}
+
void EnNiwGirl_Draw(Actor* thisx, PlayState* play) {
static void* eyeTextures[] = { gNiwGirlEyeOpenTex, gNiwGirlEyeHalfTex, gNiwGirlEyeClosedTex };
EnNiwGirl* this = (EnNiwGirl*)thisx;
@@ -258,7 +280,7 @@ void EnNiwGirl_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(eyeTextures[this->eyeIndex]));
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwGirlOverrideLimbDraw, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwGirlOverrideLimbDraw, EnNiwGirl_PostLimbDraw, this);
func_80033C30(&this->actor.world.pos, &sp4C, 255, play);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c
index 8ddf52fad..645cc6c68 100644
--- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c
+++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c
@@ -4,6 +4,7 @@
#include "overlays/actors/ovl_En_Niw/z_en_niw.h"
#include "vt.h"
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
+#include
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -601,6 +602,27 @@ s32 EnNiwLady_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
return false;
}
+s32 EnNiwLady_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnNiwLady* this = (EnNiwLady*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-886, -3322, -5093, MTXMODE_APPLY);
+ Matrix_Translate(824.324f, 283.782f, -202.703f, MTXMODE_APPLY);
+ Matrix_Scale(0.762f, 0.762f, 0.762f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
+ return false;
+}
+
void EnNiwLady_Draw(Actor* thisx, PlayState* play) {
static void* sEyeTextures[] = { gCuccoLadyEyeOpenTex, gCuccoLadyEyeHalfTex, gCuccoLadyEyeClosedTex };
EnNiwLady* this = (EnNiwLady*)thisx;
@@ -612,7 +634,7 @@ void EnNiwLady_Draw(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->faceState]));
gSPSegment(POLY_OPA_DISP++, 0x0C, func_80ABB0A0(play->state.gfxCtx));
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwLady_OverrideLimbDraw, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwLady_OverrideLimbDraw, EnNiwLady_PostLimbDraw, this);
}
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
index 460c788b2..668b176d5 100644
--- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -16,6 +16,7 @@
#include "soh/Enhancements/randomizer/randomizer_entrance.h"
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#include
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -2457,6 +2458,56 @@ void EnOssan_DrawStickDirectionPrompts(PlayState* play, EnOssan* this) {
CLOSE_DISPS(play->state.gfxCtx);
}
+s32 EnOssan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnOssan* this = (EnOssan*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 8) {
+ switch(this->actor.params) {
+ case 4: {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-11071, -443, -3986, MTXMODE_APPLY);
+ Matrix_Translate(878.378f, 351.351f, 540.541f, MTXMODE_APPLY);
+ Matrix_Scale(1.352f, 1.352f, 1.352f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ break;
+ }
+ case 3: {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-6643, 1992, -1772, MTXMODE_APPLY);
+ Matrix_Translate(918.919f, 121.622f, 256.757f, MTXMODE_APPLY);
+ Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ break;
+ }
+ default: {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-11071, -443, -3986, MTXMODE_APPLY);
+ Matrix_Translate(878.378f, 351.351f, 540.541f, MTXMODE_APPLY);
+ Matrix_Scale(1.352f, 1.352f, 1.352f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ break;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
void EnOssan_DrawBazaarShopkeeper(Actor* thisx, PlayState* play) {
static void* sBazaarShopkeeperEyeTextures[] = { gOssanEyeOpenTex, gOssanEyeHalfTex, gOssanEyeClosedTex };
EnOssan* this = (EnOssan*)thisx;
@@ -2466,7 +2517,7 @@ void EnOssan_DrawBazaarShopkeeper(Actor* thisx, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sBazaarShopkeeperEyeTextures[this->eyeTextureIdx]));
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnOssan_OverrideLimbDrawDefaultShopkeeper, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnOssan_OverrideLimbDrawDefaultShopkeeper, EnOssan_PostLimbDraw, this);
EnOssan_DrawCursor(play, this, this->cursorX, this->cursorY, this->cursorZ, this->drawCursor);
EnOssan_DrawStickDirectionPrompts(play, this);
@@ -2596,7 +2647,7 @@ void EnOssan_DrawPotionShopkeeper(Actor* thisx, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sPotionShopkeeperEyeTextures[this->eyeTextureIdx]));
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnOssan_PostLimbDraw, this);
EnOssan_DrawCursor(play, this, this->cursorX, this->cursorY, this->cursorZ, this->drawCursor);
EnOssan_DrawStickDirectionPrompts(play, this);
diff --git a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c
index 8489b1032..ba6a1e85c 100644
--- a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c
+++ b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c
@@ -7,6 +7,7 @@
#include "z_en_po_relay.h"
#include "overlays/actors/ovl_En_Honotrap/z_en_honotrap.h"
#include "objects/object_tk/object_tk.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_WILL_TALK)
@@ -425,6 +426,20 @@ void EnPoRelay_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
gSPDisplayList(POLY_OPA_DISP++, gDampeHaloDL);
CLOSE_DISPS(play->state.gfxCtx);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 16) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(10627, 3321, -13727, MTXMODE_APPLY);
+ Matrix_Translate(418.919f, 40.54f, -256.757f, MTXMODE_APPLY);
+ Matrix_Scale(1.068f, 1.068f, 1.068f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnPoRelay_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c b/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c
index 6f48314ff..001a2dda6 100644
--- a/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c
+++ b/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c
@@ -1,5 +1,6 @@
#include "z_en_shopnuts.h"
#include "objects/object_shopnuts/object_shopnuts.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE)
@@ -308,6 +309,20 @@ void EnShopnuts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
gSPDisplayList(POLY_OPA_DISP++, gBusinessScrubNoseDL);
CLOSE_DISPS(play->state.gfxCtx);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 17) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, 17490, MTXMODE_APPLY);
+ Matrix_Translate(4200.0f, -472.973f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(4.932f, 4.932f, 4.932f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnShopnuts_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c b/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c
index 6a5862747..32584b826 100644
--- a/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -2,6 +2,7 @@
#include "overlays/actors/ovl_En_Encount1/z_en_encount1.h"
#include "objects/object_skb/object_skb.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -551,6 +552,21 @@ void EnSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
} else if ((this->unk_283 ^ (this->unk_283 | 4)) == 0) {
BodyBreak_SetInfo(&this->bodyBreak, limbIndex, 0, 18, 18, dList, BODYBREAK_OBJECT_DEFAULT);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 11) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -2215, MTXMODE_APPLY);
+ Matrix_Translate(1324.324f, 662.162f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnSkb_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c
index 81242aa77..e7cbb0fc3 100644
--- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c
+++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c
@@ -10,6 +10,7 @@
#include "objects/object_boj/object_boj.h"
#include
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -427,6 +428,21 @@ void EnSth_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
CLOSE_DISPS(play->state.gfxCtx);
}
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-4207, -665, -4650, MTXMODE_APPLY);
+ Matrix_Translate(932.432f, 162.163f, 81.082f, MTXMODE_APPLY);
+ Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
Gfx* EnSth_AllocColorDList(GraphicsContext* play, u8 envR, u8 envG, u8 envB, u8 envA) {
diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
index 888b0ef34..6d91875f3 100644
--- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
+++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
@@ -3,6 +3,7 @@
#include "overlays/actors/ovl_En_Syateki_Itm/z_en_syateki_itm.h"
#include "objects/object_ossan/object_ossan.h"
#include "soh/Enhancements/randomizer/randomizer_entrance.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_LOCKON)
@@ -535,12 +536,33 @@ s32 EnSyatekiMan_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
return 0;
}
+s32 EnSyatekiMan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
+ EnSyatekiMan* this = (EnSyatekiMan*)thisx;
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 8) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(2214, 3985, -7750, MTXMODE_APPLY);
+ Matrix_Translate(1094.594f, 1162.162f, -40.541f, MTXMODE_APPLY);
+ Matrix_Scale(0.864f, 0.864f, 0.864f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+
+ return false;
+}
+
void EnSyatekiMan_Draw(Actor* thisx, PlayState* play) {
s32 pad;
EnSyatekiMan* this = (EnSyatekiMan*)thisx;
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnSyatekiMan_OverrideLimbDraw, NULL, this);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnSyatekiMan_OverrideLimbDraw, EnSyatekiMan_PostLimbDraw, this);
}
void EnSyatekiMan_SetBgm(void) {
diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c
index 9b0dc07e2..8ee8fb733 100644
--- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c
+++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c
@@ -7,6 +7,7 @@
#include "z_en_ta.h"
#include "vt.h"
#include "objects/object_ta/object_ta.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -1218,6 +1219,20 @@ void EnTa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 15) {
Matrix_MultVec3f(&D_80B16E7C, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(11955, -1993, 221, MTXMODE_APPLY);
+ Matrix_Translate(1081.081f, -108.108f, -270.270f, MTXMODE_APPLY);
+ Matrix_Scale(1.554f, 1.554f, 1.554f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnTa_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c
index 46e9edc9e..9026b433d 100644
--- a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c
+++ b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c
@@ -7,6 +7,7 @@
#include "z_en_test.h"
#include "objects/object_sk2/object_sk2.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -1949,6 +1950,20 @@ void EnTest_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
this->bodyPartsPos[bodyPart].z = sp50.z;
}
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 11) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-10849, 0, -5314, MTXMODE_APPLY);
+ Matrix_Translate(513.514f, 283.784f, 554.054f, MTXMODE_APPLY);
+ Matrix_Scale(1.203f, 1.203f, 1.203f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnTest_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c b/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c
index 247db92f3..12f7fa189 100644
--- a/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c
+++ b/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c
@@ -6,6 +6,7 @@
#include "z_en_tg.h"
#include "objects/object_mu/object_mu.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -168,6 +169,34 @@ void EnTg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
// Place the target point at the guy's head instead of the center of the actor
Matrix_MultVec3f(&targetOffset, &this->actor.focus.pos);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 20) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-2657, -1550, 1549, MTXMODE_APPLY);
+ Matrix_Translate(594.594f, -135.135f, -54.054f, MTXMODE_APPLY);
+ Matrix_Scale(0.966f, 0.966f, 0.966f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ if (limbIndex == 9) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-3100, 1992, 2435, MTXMODE_APPLY);
+ Matrix_Translate(864.865f, -121.622f, 175.676f, MTXMODE_APPLY);
+ Matrix_Scale(0.865f, 0.865f, 0.865f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
Gfx* EnTg_SetColor(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b, u8 a) {
diff --git a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c
index 738db714d..3f0fabdf6 100644
--- a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c
+++ b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c
@@ -8,6 +8,7 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_tk/object_tk.h"
#include "soh/frame_interpolation.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
#define COLLECTFLAG_GRAVEDIGGING_HEART_PIECE 0x19
@@ -766,6 +767,20 @@ void EnTk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_MultVec3f(&sp28, &this->v3f_304);
func_80B1D200(play);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 16) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(10627, 3321, -13727, MTXMODE_APPLY);
+ Matrix_Translate(418.919f, 40.54f, -256.757f, MTXMODE_APPLY);
+ Matrix_Scale(1.068f, 1.068f, 1.068f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnTk_Draw(Actor* thisx, PlayState* play) {
diff --git a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c
index 9979c161a..dff5f74f0 100644
--- a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c
+++ b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c
@@ -7,6 +7,7 @@
#include "z_en_toryo.h"
#include "objects/object_toryo/object_toryo.h"
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
@@ -430,4 +431,18 @@ void EnToryo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
Matrix_MultVec3f(&sMultVec, &this->actor.focus.pos);
break;
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 15) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(-23691, 664, -2879, MTXMODE_APPLY);
+ Matrix_Translate(810.811f, -243.243f, 270.27f, MTXMODE_APPLY);
+ Matrix_Scale(1.216f, 1.216f, 1.216f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
diff --git a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c
index ba0a75613..bff8380cd 100644
--- a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c
+++ b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c
@@ -9,6 +9,7 @@
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -517,6 +518,20 @@ void EnVm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
&this->colliderQuad2.dim.quad[1], &this->colliderQuad2.dim.quad[2],
&this->colliderQuad2.dim.quad[3]);
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 6) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(19704, -1329, 11734, MTXMODE_APPLY);
+ Matrix_Translate(310.811f, -108.108f, -81.081f, MTXMODE_APPLY);
+ Matrix_Scale(2.297f, 2.297f, 2.297f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
void EnVm_Draw(Actor* thisx, PlayState* play2) {
diff --git a/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c b/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c
index 41a485bbc..432450bf8 100644
--- a/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -9,6 +9,7 @@
#include "overlays/actors/ovl_En_Encount1/z_en_encount1.h"
#include "objects/object_wf/object_wf.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -1426,6 +1427,21 @@ void EnWf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
this->bodyPartsPos[bodyPartIndex].z = bodyPartPos.z;
}
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 17) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -18377, MTXMODE_APPLY);
+ Matrix_Translate(729.73f, 1243.243f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.743f, 0.743f, 0.743f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
static void* sWolfosNormalEyeTextures[] = { gWolfosNormalEyeOpenTex, gWolfosNormalEyeHalfTex, gWolfosNormalEyeNarrowTex,
diff --git a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
index 9aa8204dd..620bf67a5 100644
--- a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
+++ b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
@@ -7,6 +7,7 @@
#include "z_en_zf.h"
#include "objects/object_zf/object_zf.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@@ -2228,6 +2229,21 @@ void EnZf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_MultVec3f(&zeroVec, &this->bodyPartsPos[bodyPart]);
}
}
+
+ if (CVarGetInteger("gLetItSnow", 0)) {
+ if (limbIndex == 9) {
+ OPEN_DISPS(play->state.gfxCtx);
+ Matrix_Push();
+ Matrix_RotateZYX(0, 0, -22584, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 270.27f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.628f, 0.628f, 0.628f, MTXMODE_APPLY);
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL);
+ Matrix_Pop();
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
}
static Gfx D_80B4A2F8[] = {