diff --git a/Makefile b/Makefile
index e4729002cd..75ad3a54c4 100644
--- a/Makefile
+++ b/Makefile
@@ -28,6 +28,9 @@ N_THREADS ?= $(shell nproc)
#### Setup ####
+# Ensure the map file being created using English localization
+export LANG := C
+
ifeq ($(NON_MATCHING),1)
CFLAGS := -DNON_MATCHING
CPPFLAGS := -DNON_MATCHING
diff --git a/assets/xml/interface/parameter_static.xml b/assets/xml/interface/parameter_static.xml
index 33ab40de48..7532a95b88 100644
--- a/assets/xml/interface/parameter_static.xml
+++ b/assets/xml/interface/parameter_static.xml
@@ -75,9 +75,9 @@
-
-
-
+
+
+
diff --git a/assets/xml/misc/link_animetion.xml b/assets/xml/misc/link_animetion.xml
new file mode 100644
index 0000000000..788e0a49da
--- /dev/null
+++ b/assets/xml/misc/link_animetion.xml
@@ -0,0 +1,699 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/gameplay_dangeon_keep.xml b/assets/xml/objects/gameplay_dangeon_keep.xml
index 7e4d2d2010..e9acb308b3 100644
--- a/assets/xml/objects/gameplay_dangeon_keep.xml
+++ b/assets/xml/objects/gameplay_dangeon_keep.xml
@@ -1,10 +1,10 @@

-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/gameplay_field_keep.xml b/assets/xml/objects/gameplay_field_keep.xml
index 45fa3eccde..596101814c 100644
--- a/assets/xml/objects/gameplay_field_keep.xml
+++ b/assets/xml/objects/gameplay_field_keep.xml
@@ -12,14 +12,14 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml
index 3bfb60efde..03ed9eef50 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -1,4 +1,5 @@

+
@@ -796,7 +797,7 @@
-
+
@@ -820,7 +821,7 @@
-
+
@@ -828,11 +829,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -845,17 +846,17 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -893,11 +894,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -905,7 +906,7 @@
-
+
@@ -944,13 +945,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -983,7 +984,7 @@
-
+
@@ -997,13 +998,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -1075,17 +1076,17 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -1152,37 +1153,37 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -1217,37 +1218,44 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1256,10 +1264,12 @@
-
-
-
-
+
+
+
+
+
+
@@ -1347,10 +1357,13 @@
-
-
-
-
+
+
+
+
+
+
+
@@ -1427,14 +1440,14 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_ah.xml b/assets/xml/objects/object_ah.xml
index 3644f2a902..1bf479e869 100644
--- a/assets/xml/objects/object_ah.xml
+++ b/assets/xml/objects/object_ah.xml
@@ -53,6 +53,6 @@
-
+
diff --git a/assets/xml/objects/object_ahg.xml b/assets/xml/objects/object_ahg.xml
index 7d4c2c7415..7eb4c71263 100644
--- a/assets/xml/objects/object_ahg.xml
+++ b/assets/xml/objects/object_ahg.xml
@@ -48,6 +48,6 @@
-
+
diff --git a/assets/xml/objects/object_al.xml b/assets/xml/objects/object_al.xml
index dc28bcf6bb..db348868ad 100644
--- a/assets/xml/objects/object_al.xml
+++ b/assets/xml/objects/object_al.xml
@@ -65,7 +65,7 @@
-
+
diff --git a/assets/xml/objects/object_am.xml b/assets/xml/objects/object_am.xml
index b0737cb50a..1f738d39be 100644
--- a/assets/xml/objects/object_am.xml
+++ b/assets/xml/objects/object_am.xml
@@ -34,7 +34,7 @@
-
+
diff --git a/assets/xml/objects/object_an1.xml b/assets/xml/objects/object_an1.xml
index 2c212923d7..2db214bd3c 100644
--- a/assets/xml/objects/object_an1.xml
+++ b/assets/xml/objects/object_an1.xml
@@ -81,7 +81,7 @@
-
+
diff --git a/assets/xml/objects/object_and.xml b/assets/xml/objects/object_and.xml
index 17cff45978..00c8d7585a 100644
--- a/assets/xml/objects/object_and.xml
+++ b/assets/xml/objects/object_and.xml
@@ -67,7 +67,7 @@
-
+
diff --git a/assets/xml/objects/object_ani.xml b/assets/xml/objects/object_ani.xml
index 3d8f7c3857..34fb49f0dc 100644
--- a/assets/xml/objects/object_ani.xml
+++ b/assets/xml/objects/object_ani.xml
@@ -21,7 +21,7 @@
-
+
diff --git a/assets/xml/objects/object_aob.xml b/assets/xml/objects/object_aob.xml
index 3325e9b53b..50de06ea06 100644
--- a/assets/xml/objects/object_aob.xml
+++ b/assets/xml/objects/object_aob.xml
@@ -22,7 +22,7 @@
-
+
diff --git a/assets/xml/objects/object_az.xml b/assets/xml/objects/object_az.xml
index d4382673f8..ea6fd5e7d1 100644
--- a/assets/xml/objects/object_az.xml
+++ b/assets/xml/objects/object_az.xml
@@ -1,145 +1,169 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bai.xml b/assets/xml/objects/object_bai.xml
index 4225bec840..8130658768 100644
--- a/assets/xml/objects/object_bai.xml
+++ b/assets/xml/objects/object_bai.xml
@@ -47,7 +47,7 @@
-
+
diff --git a/assets/xml/objects/object_bal.xml b/assets/xml/objects/object_bal.xml
index a16e2fb1fa..2cdfc5c3ab 100644
--- a/assets/xml/objects/object_bal.xml
+++ b/assets/xml/objects/object_bal.xml
@@ -68,7 +68,7 @@
-
+
diff --git a/assets/xml/objects/object_bb.xml b/assets/xml/objects/object_bb.xml
index c9c6a0a908..e03cdb0e20 100644
--- a/assets/xml/objects/object_bb.xml
+++ b/assets/xml/objects/object_bb.xml
@@ -42,6 +42,6 @@
-
+
diff --git a/assets/xml/objects/object_bba.xml b/assets/xml/objects/object_bba.xml
index c3c5a5c1b2..0b22866e76 100644
--- a/assets/xml/objects/object_bba.xml
+++ b/assets/xml/objects/object_bba.xml
@@ -41,7 +41,7 @@
-
+
diff --git a/assets/xml/objects/object_bdoor.xml b/assets/xml/objects/object_bdoor.xml
index a57339f3b3..2e64110f53 100644
--- a/assets/xml/objects/object_bdoor.xml
+++ b/assets/xml/objects/object_bdoor.xml
@@ -1,18 +1,31 @@

+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bee.xml b/assets/xml/objects/object_bee.xml
index 8f1d704cf4..735d191f39 100644
--- a/assets/xml/objects/object_bee.xml
+++ b/assets/xml/objects/object_bee.xml
@@ -23,6 +23,6 @@
-
+
diff --git a/assets/xml/objects/object_bg.xml b/assets/xml/objects/object_bg.xml
index 0602f987d4..fe294cb33b 100644
--- a/assets/xml/objects/object_bg.xml
+++ b/assets/xml/objects/object_bg.xml
@@ -51,7 +51,7 @@
-
+
@@ -107,6 +107,6 @@
-
+
diff --git a/assets/xml/objects/object_bh.xml b/assets/xml/objects/object_bh.xml
index 56b7de5f9b..3e33fb739c 100644
--- a/assets/xml/objects/object_bh.xml
+++ b/assets/xml/objects/object_bh.xml
@@ -13,6 +13,6 @@
-
+
diff --git a/assets/xml/objects/object_bigokuta.xml b/assets/xml/objects/object_bigokuta.xml
index 2c54c6a61a..d8df44ddc6 100644
--- a/assets/xml/objects/object_bigokuta.xml
+++ b/assets/xml/objects/object_bigokuta.xml
@@ -53,6 +53,6 @@
-
+
diff --git a/assets/xml/objects/object_bigslime.xml b/assets/xml/objects/object_bigslime.xml
index 7195c20c71..84a6eec61a 100644
--- a/assets/xml/objects/object_bigslime.xml
+++ b/assets/xml/objects/object_bigslime.xml
@@ -88,7 +88,7 @@
-
+
diff --git a/assets/xml/objects/object_bji.xml b/assets/xml/objects/object_bji.xml
index 0fec0c8c36..bef54b0e5c 100644
--- a/assets/xml/objects/object_bji.xml
+++ b/assets/xml/objects/object_bji.xml
@@ -57,7 +57,7 @@
-
+
diff --git a/assets/xml/objects/object_bjt.xml b/assets/xml/objects/object_bjt.xml
index 59a71dcee6..27529206f0 100644
--- a/assets/xml/objects/object_bjt.xml
+++ b/assets/xml/objects/object_bjt.xml
@@ -23,6 +23,6 @@
-
+
diff --git a/assets/xml/objects/object_bob.xml b/assets/xml/objects/object_bob.xml
index f942c84db3..13edbe6fef 100644
--- a/assets/xml/objects/object_bob.xml
+++ b/assets/xml/objects/object_bob.xml
@@ -15,7 +15,7 @@
-
+
diff --git a/assets/xml/objects/object_boj.xml b/assets/xml/objects/object_boj.xml
index ed42d90314..cfb10e97aa 100644
--- a/assets/xml/objects/object_boj.xml
+++ b/assets/xml/objects/object_boj.xml
@@ -75,7 +75,7 @@
-
+
diff --git a/assets/xml/objects/object_boss01.xml b/assets/xml/objects/object_boss01.xml
index 6a10080a33..89cc97a7e0 100644
--- a/assets/xml/objects/object_boss01.xml
+++ b/assets/xml/objects/object_boss01.xml
@@ -113,7 +113,7 @@
-
+
@@ -183,7 +183,7 @@
-
+
diff --git a/assets/xml/objects/object_boss02.xml b/assets/xml/objects/object_boss02.xml
index 9a400554b7..8a80a57f25 100644
--- a/assets/xml/objects/object_boss02.xml
+++ b/assets/xml/objects/object_boss02.xml
@@ -62,7 +62,7 @@
-
+
@@ -120,6 +120,6 @@
-
+
diff --git a/assets/xml/objects/object_boss03.xml b/assets/xml/objects/object_boss03.xml
index 75ce1d3c9f..da17bf4062 100644
--- a/assets/xml/objects/object_boss03.xml
+++ b/assets/xml/objects/object_boss03.xml
@@ -65,7 +65,7 @@
-
+
@@ -130,7 +130,7 @@
-
+
diff --git a/assets/xml/objects/object_boss04.xml b/assets/xml/objects/object_boss04.xml
index ce54c25b47..d98083a64c 100644
--- a/assets/xml/objects/object_boss04.xml
+++ b/assets/xml/objects/object_boss04.xml
@@ -41,6 +41,6 @@
-
+
diff --git a/assets/xml/objects/object_boss05.xml b/assets/xml/objects/object_boss05.xml
index b401ae2be9..95bb16edd8 100644
--- a/assets/xml/objects/object_boss05.xml
+++ b/assets/xml/objects/object_boss05.xml
@@ -24,7 +24,7 @@
-
+
@@ -72,7 +72,7 @@
-
+
diff --git a/assets/xml/objects/object_boss07.xml b/assets/xml/objects/object_boss07.xml
index 15a2e162da..91234f7580 100644
--- a/assets/xml/objects/object_boss07.xml
+++ b/assets/xml/objects/object_boss07.xml
@@ -47,7 +47,7 @@
-
+
@@ -116,7 +116,7 @@
-
+
@@ -184,7 +184,7 @@
-
+
diff --git a/assets/xml/objects/object_boss_hakugin.xml b/assets/xml/objects/object_boss_hakugin.xml
index 62d6fb91f6..3444dc0414 100644
--- a/assets/xml/objects/object_boss_hakugin.xml
+++ b/assets/xml/objects/object_boss_hakugin.xml
@@ -73,7 +73,7 @@
-
+
diff --git a/assets/xml/objects/object_box.xml b/assets/xml/objects/object_box.xml
index 85e7886330..4413ecd7a6 100644
--- a/assets/xml/objects/object_box.xml
+++ b/assets/xml/objects/object_box.xml
@@ -21,7 +21,7 @@
-
+
@@ -44,7 +44,7 @@
-
+
diff --git a/assets/xml/objects/object_bsb.xml b/assets/xml/objects/object_bsb.xml
index 7ccf12bce2..81cdb99918 100644
--- a/assets/xml/objects/object_bsb.xml
+++ b/assets/xml/objects/object_bsb.xml
@@ -72,7 +72,7 @@
-
+
diff --git a/assets/xml/objects/object_bubble.xml b/assets/xml/objects/object_bubble.xml
index 4397a017f5..da2f01d475 100644
--- a/assets/xml/objects/object_bubble.xml
+++ b/assets/xml/objects/object_bubble.xml
@@ -1,6 +1,6 @@

-
-
+
+
diff --git a/assets/xml/objects/object_cne.xml b/assets/xml/objects/object_cne.xml
index fccbf539f5..135aae7a20 100644
--- a/assets/xml/objects/object_cne.xml
+++ b/assets/xml/objects/object_cne.xml
@@ -18,7 +18,7 @@
-
+
@@ -38,12 +38,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_cow.xml b/assets/xml/objects/object_cow.xml
index 535d5dd85b..6895d62177 100644
--- a/assets/xml/objects/object_cow.xml
+++ b/assets/xml/objects/object_cow.xml
@@ -30,7 +30,7 @@
-
+
@@ -50,7 +50,7 @@
-
+
diff --git a/assets/xml/objects/object_crow.xml b/assets/xml/objects/object_crow.xml
index de51da580e..10fc235435 100644
--- a/assets/xml/objects/object_crow.xml
+++ b/assets/xml/objects/object_crow.xml
@@ -19,6 +19,6 @@
-
+
diff --git a/assets/xml/objects/object_cs.xml b/assets/xml/objects/object_cs.xml
index 803d2b02c2..fe614582b6 100644
--- a/assets/xml/objects/object_cs.xml
+++ b/assets/xml/objects/object_cs.xml
@@ -89,7 +89,7 @@
-
+
diff --git a/assets/xml/objects/object_dai.xml b/assets/xml/objects/object_dai.xml
index f613a9ab82..b547897f89 100644
--- a/assets/xml/objects/object_dai.xml
+++ b/assets/xml/objects/object_dai.xml
@@ -81,6 +81,6 @@
-
+
diff --git a/assets/xml/objects/object_daiku.xml b/assets/xml/objects/object_daiku.xml
index 57124bd281..17d8ddbf09 100644
--- a/assets/xml/objects/object_daiku.xml
+++ b/assets/xml/objects/object_daiku.xml
@@ -65,7 +65,7 @@
-
+
diff --git a/assets/xml/objects/object_dblue_object.xml b/assets/xml/objects/object_dblue_object.xml
index d49b368e14..8611c539be 100644
--- a/assets/xml/objects/object_dblue_object.xml
+++ b/assets/xml/objects/object_dblue_object.xml
@@ -1,78 +1,148 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_death.xml b/assets/xml/objects/object_death.xml
index 7d3e1e5969..77d4ccd4a1 100644
--- a/assets/xml/objects/object_death.xml
+++ b/assets/xml/objects/object_death.xml
@@ -75,7 +75,7 @@
-
+
diff --git a/assets/xml/objects/object_dekubaba.xml b/assets/xml/objects/object_dekubaba.xml
index b82cfb94b7..eb80e770b7 100644
--- a/assets/xml/objects/object_dekubaba.xml
+++ b/assets/xml/objects/object_dekubaba.xml
@@ -20,7 +20,7 @@
-
+
diff --git a/assets/xml/objects/object_dekunuts.xml b/assets/xml/objects/object_dekunuts.xml
index 8a45dd04a9..909231a770 100644
--- a/assets/xml/objects/object_dekunuts.xml
+++ b/assets/xml/objects/object_dekunuts.xml
@@ -38,7 +38,7 @@
-
+
diff --git a/assets/xml/objects/object_dinofos.xml b/assets/xml/objects/object_dinofos.xml
index 7b1ff8c205..8db9c7c4a7 100644
--- a/assets/xml/objects/object_dinofos.xml
+++ b/assets/xml/objects/object_dinofos.xml
@@ -61,7 +61,7 @@
-
+
diff --git a/assets/xml/objects/object_dnk.xml b/assets/xml/objects/object_dnk.xml
index ad69c7722d..bec6ce45d0 100644
--- a/assets/xml/objects/object_dnk.xml
+++ b/assets/xml/objects/object_dnk.xml
@@ -44,7 +44,7 @@
-
+
diff --git a/assets/xml/objects/object_dno.xml b/assets/xml/objects/object_dno.xml
index a320be10fe..6646636287 100644
--- a/assets/xml/objects/object_dno.xml
+++ b/assets/xml/objects/object_dno.xml
@@ -81,6 +81,6 @@
-
+
diff --git a/assets/xml/objects/object_dnp.xml b/assets/xml/objects/object_dnp.xml
index 3763685782..d9494909ce 100644
--- a/assets/xml/objects/object_dnp.xml
+++ b/assets/xml/objects/object_dnp.xml
@@ -81,7 +81,7 @@
-
+
diff --git a/assets/xml/objects/object_dnq.xml b/assets/xml/objects/object_dnq.xml
index 830e6d8e43..92d818a4ba 100644
--- a/assets/xml/objects/object_dnq.xml
+++ b/assets/xml/objects/object_dnq.xml
@@ -88,7 +88,7 @@
-
+
diff --git a/assets/xml/objects/object_dns.xml b/assets/xml/objects/object_dns.xml
index d42f68f54a..e5d91326f7 100644
--- a/assets/xml/objects/object_dns.xml
+++ b/assets/xml/objects/object_dns.xml
@@ -38,7 +38,7 @@
-
+
diff --git a/assets/xml/objects/object_dnt.xml b/assets/xml/objects/object_dnt.xml
index 6a2b0058d1..96b793849b 100644
--- a/assets/xml/objects/object_dnt.xml
+++ b/assets/xml/objects/object_dnt.xml
@@ -84,7 +84,7 @@
-
+
diff --git a/assets/xml/objects/object_dodongo.xml b/assets/xml/objects/object_dodongo.xml
index f63a27467a..8de3f4653f 100644
--- a/assets/xml/objects/object_dodongo.xml
+++ b/assets/xml/objects/object_dodongo.xml
@@ -58,11 +58,17 @@
-
+
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_dog.xml b/assets/xml/objects/object_dog.xml
index 6941cb36c1..0e3d318b40 100644
--- a/assets/xml/objects/object_dog.xml
+++ b/assets/xml/objects/object_dog.xml
@@ -60,6 +60,6 @@
-
+
diff --git a/assets/xml/objects/object_drs.xml b/assets/xml/objects/object_drs.xml
index c5f4ee7261..1b6c295976 100644
--- a/assets/xml/objects/object_drs.xml
+++ b/assets/xml/objects/object_drs.xml
@@ -16,6 +16,6 @@
-
+
diff --git a/assets/xml/objects/object_ds2.xml b/assets/xml/objects/object_ds2.xml
index 1f1fd9d207..1794c4bf80 100644
--- a/assets/xml/objects/object_ds2.xml
+++ b/assets/xml/objects/object_ds2.xml
@@ -27,6 +27,6 @@
-
+
diff --git a/assets/xml/objects/object_ds2n.xml b/assets/xml/objects/object_ds2n.xml
index 721eec6771..7e7d45f0c5 100644
--- a/assets/xml/objects/object_ds2n.xml
+++ b/assets/xml/objects/object_ds2n.xml
@@ -86,7 +86,7 @@
-
+
diff --git a/assets/xml/objects/object_dt.xml b/assets/xml/objects/object_dt.xml
index 78ad8046e9..8b2a902176 100644
--- a/assets/xml/objects/object_dt.xml
+++ b/assets/xml/objects/object_dt.xml
@@ -61,7 +61,7 @@
-
+
diff --git a/assets/xml/objects/object_dy_obj.xml b/assets/xml/objects/object_dy_obj.xml
index 8dd90375ab..a64bc975b4 100644
--- a/assets/xml/objects/object_dy_obj.xml
+++ b/assets/xml/objects/object_dy_obj.xml
@@ -91,6 +91,6 @@
-
+
diff --git a/assets/xml/objects/object_efc_tw.xml b/assets/xml/objects/object_efc_tw.xml
index 3cb6468b9f..709224f9d2 100644
--- a/assets/xml/objects/object_efc_tw.xml
+++ b/assets/xml/objects/object_efc_tw.xml
@@ -8,6 +8,6 @@
-
+
diff --git a/assets/xml/objects/object_eg.xml b/assets/xml/objects/object_eg.xml
index 46d3e00890..9cda7f0a34 100644
--- a/assets/xml/objects/object_eg.xml
+++ b/assets/xml/objects/object_eg.xml
@@ -70,7 +70,7 @@
-
+
diff --git a/assets/xml/objects/object_famos.xml b/assets/xml/objects/object_famos.xml
index cbbf0057c4..d12a94d662 100644
--- a/assets/xml/objects/object_famos.xml
+++ b/assets/xml/objects/object_famos.xml
@@ -22,7 +22,7 @@
-
+
diff --git a/assets/xml/objects/object_fb.xml b/assets/xml/objects/object_fb.xml
index f0d3b8111c..bb630781c8 100644
--- a/assets/xml/objects/object_fb.xml
+++ b/assets/xml/objects/object_fb.xml
@@ -55,7 +55,7 @@
-
+
diff --git a/assets/xml/objects/object_fbdemo_triforce.xml b/assets/xml/objects/object_fbdemo_triforce.xml
new file mode 100644
index 0000000000..a00c9bf13e
--- /dev/null
+++ b/assets/xml/objects/object_fbdemo_triforce.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_firefly.xml b/assets/xml/objects/object_firefly.xml
index 84018ddd86..4c6aacd166 100644
--- a/assets/xml/objects/object_firefly.xml
+++ b/assets/xml/objects/object_firefly.xml
@@ -49,6 +49,6 @@
-
+
diff --git a/assets/xml/objects/object_fish.xml b/assets/xml/objects/object_fish.xml
index 9da78b6ab8..f01639fbfa 100644
--- a/assets/xml/objects/object_fish.xml
+++ b/assets/xml/objects/object_fish.xml
@@ -35,7 +35,7 @@
-
+
@@ -73,7 +73,7 @@
-
+
@@ -131,7 +131,7 @@
-
+
diff --git a/assets/xml/objects/object_fr.xml b/assets/xml/objects/object_fr.xml
index cb02087bab..0cd28760ef 100644
--- a/assets/xml/objects/object_fr.xml
+++ b/assets/xml/objects/object_fr.xml
@@ -62,6 +62,6 @@
-
+
diff --git a/assets/xml/objects/object_fsn.xml b/assets/xml/objects/object_fsn.xml
index e3ae8db1bd..dd67874f0e 100644
--- a/assets/xml/objects/object_fsn.xml
+++ b/assets/xml/objects/object_fsn.xml
@@ -103,7 +103,7 @@
-
+
diff --git a/assets/xml/objects/object_fu.xml b/assets/xml/objects/object_fu.xml
index 4094355aeb..19404f90e5 100644
--- a/assets/xml/objects/object_fu.xml
+++ b/assets/xml/objects/object_fu.xml
@@ -47,6 +47,6 @@
-
+
diff --git a/assets/xml/objects/object_geldb.xml b/assets/xml/objects/object_geldb.xml
index 6338b48d61..5590677eae 100644
--- a/assets/xml/objects/object_geldb.xml
+++ b/assets/xml/objects/object_geldb.xml
@@ -71,7 +71,7 @@
-
+
diff --git a/assets/xml/objects/object_gg.xml b/assets/xml/objects/object_gg.xml
index 17c21c93ab..f7483e3383 100644
--- a/assets/xml/objects/object_gg.xml
+++ b/assets/xml/objects/object_gg.xml
@@ -71,7 +71,7 @@
-
+
diff --git a/assets/xml/objects/object_giant.xml b/assets/xml/objects/object_giant.xml
index 8698d176b0..491cd0cb0e 100644
--- a/assets/xml/objects/object_giant.xml
+++ b/assets/xml/objects/object_giant.xml
@@ -68,7 +68,7 @@
-
+
diff --git a/assets/xml/objects/object_gk.xml b/assets/xml/objects/object_gk.xml
index 3fde40f946..b36aef1535 100644
--- a/assets/xml/objects/object_gk.xml
+++ b/assets/xml/objects/object_gk.xml
@@ -42,7 +42,7 @@
-
+
diff --git a/assets/xml/objects/object_gla.xml b/assets/xml/objects/object_gla.xml
index ae80c7dfc2..7463cd2e0c 100644
--- a/assets/xml/objects/object_gla.xml
+++ b/assets/xml/objects/object_gla.xml
@@ -65,7 +65,7 @@
-
+
diff --git a/assets/xml/objects/object_gmo.xml b/assets/xml/objects/object_gmo.xml
index 7490a661e5..eaee120b30 100644
--- a/assets/xml/objects/object_gmo.xml
+++ b/assets/xml/objects/object_gmo.xml
@@ -11,6 +11,6 @@
-
+
diff --git a/assets/xml/objects/object_grasshopper.xml b/assets/xml/objects/object_grasshopper.xml
index 35120e0c98..3ef7b8e64a 100644
--- a/assets/xml/objects/object_grasshopper.xml
+++ b/assets/xml/objects/object_grasshopper.xml
@@ -58,7 +58,7 @@
-
+
diff --git a/assets/xml/objects/object_gs.xml b/assets/xml/objects/object_gs.xml
index 1e9b159dfe..eebe60035c 100644
--- a/assets/xml/objects/object_gs.xml
+++ b/assets/xml/objects/object_gs.xml
@@ -1,8 +1,9 @@

+
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_ha.xml b/assets/xml/objects/object_ha.xml
index 4f595b6bed..94973c809c 100644
--- a/assets/xml/objects/object_ha.xml
+++ b/assets/xml/objects/object_ha.xml
@@ -63,7 +63,7 @@
-
+
@@ -130,6 +130,6 @@
-
+
diff --git a/assets/xml/objects/object_harfgibud.xml b/assets/xml/objects/object_harfgibud.xml
index 361bbe74c6..61e1fc4576 100644
--- a/assets/xml/objects/object_harfgibud.xml
+++ b/assets/xml/objects/object_harfgibud.xml
@@ -56,7 +56,7 @@
-
+
@@ -116,7 +116,7 @@
-
+
diff --git a/assets/xml/objects/object_hata.xml b/assets/xml/objects/object_hata.xml
index 3f5e12a381..9271520b79 100644
--- a/assets/xml/objects/object_hata.xml
+++ b/assets/xml/objects/object_hata.xml
@@ -34,6 +34,6 @@
-
+
diff --git a/assets/xml/objects/object_hintnuts.xml b/assets/xml/objects/object_hintnuts.xml
index a500981a7e..483623988c 100644
--- a/assets/xml/objects/object_hintnuts.xml
+++ b/assets/xml/objects/object_hintnuts.xml
@@ -27,7 +27,7 @@
-
+
diff --git a/assets/xml/objects/object_horse_link_child.xml b/assets/xml/objects/object_horse_link_child.xml
index 506135e0c9..60178badb6 100644
--- a/assets/xml/objects/object_horse_link_child.xml
+++ b/assets/xml/objects/object_horse_link_child.xml
@@ -76,7 +76,7 @@
-
+
diff --git a/assets/xml/objects/object_hs.xml b/assets/xml/objects/object_hs.xml
index ae025f327c..19ea49b6b7 100644
--- a/assets/xml/objects/object_hs.xml
+++ b/assets/xml/objects/object_hs.xml
@@ -46,6 +46,6 @@
-
+
diff --git a/assets/xml/objects/object_ik.xml b/assets/xml/objects/object_ik.xml
index 7042bf10b1..352b824871 100644
--- a/assets/xml/objects/object_ik.xml
+++ b/assets/xml/objects/object_ik.xml
@@ -100,6 +100,6 @@
-
+
diff --git a/assets/xml/objects/object_ikn_demo.xml b/assets/xml/objects/object_ikn_demo.xml
index 56f8fd0e97..53d5c65a11 100644
--- a/assets/xml/objects/object_ikn_demo.xml
+++ b/assets/xml/objects/object_ikn_demo.xml
@@ -43,7 +43,7 @@
-
+
@@ -63,7 +63,7 @@
-
+
@@ -89,7 +89,7 @@
-
+
diff --git a/assets/xml/objects/object_in.xml b/assets/xml/objects/object_in.xml
index 3874e4834d..15b2382aa5 100644
--- a/assets/xml/objects/object_in.xml
+++ b/assets/xml/objects/object_in.xml
@@ -112,7 +112,7 @@
-
+
diff --git a/assets/xml/objects/object_in2.xml b/assets/xml/objects/object_in2.xml
index 4457defae5..bcd04091b4 100644
--- a/assets/xml/objects/object_in2.xml
+++ b/assets/xml/objects/object_in2.xml
@@ -66,7 +66,7 @@
-
+
diff --git a/assets/xml/objects/object_inibs_object.xml b/assets/xml/objects/object_inibs_object.xml
index e1d454ae71..db78735fb3 100644
--- a/assets/xml/objects/object_inibs_object.xml
+++ b/assets/xml/objects/object_inibs_object.xml
@@ -1,35 +1,43 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_jg.xml b/assets/xml/objects/object_jg.xml
index 17889995fd..c3e1ac18a8 100644
--- a/assets/xml/objects/object_jg.xml
+++ b/assets/xml/objects/object_jg.xml
@@ -108,11 +108,11 @@
-
+
-
+
diff --git a/assets/xml/objects/object_js.xml b/assets/xml/objects/object_js.xml
index 92f14da0ba..1335b8287f 100644
--- a/assets/xml/objects/object_js.xml
+++ b/assets/xml/objects/object_js.xml
@@ -39,7 +39,7 @@
-
+
diff --git a/assets/xml/objects/object_jso.xml b/assets/xml/objects/object_jso.xml
index 33816a797f..a397311c45 100644
--- a/assets/xml/objects/object_jso.xml
+++ b/assets/xml/objects/object_jso.xml
@@ -49,7 +49,7 @@
-
+
@@ -114,7 +114,7 @@
-
+
diff --git a/assets/xml/objects/object_ka.xml b/assets/xml/objects/object_ka.xml
index 36dceb0caf..69ea2d9298 100644
--- a/assets/xml/objects/object_ka.xml
+++ b/assets/xml/objects/object_ka.xml
@@ -58,7 +58,7 @@
-
+
diff --git a/assets/xml/objects/object_kamejima.xml b/assets/xml/objects/object_kamejima.xml
index 425e4643d0..e8368051dc 100644
--- a/assets/xml/objects/object_kamejima.xml
+++ b/assets/xml/objects/object_kamejima.xml
@@ -69,7 +69,7 @@
-
+
diff --git a/assets/xml/objects/object_kbt.xml b/assets/xml/objects/object_kbt.xml
index aad49e9460..102aed91de 100644
--- a/assets/xml/objects/object_kbt.xml
+++ b/assets/xml/objects/object_kbt.xml
@@ -68,7 +68,7 @@
-
+
diff --git a/assets/xml/objects/object_kgy.xml b/assets/xml/objects/object_kgy.xml
index 0e2d3be2c3..5bbf177932 100644
--- a/assets/xml/objects/object_kgy.xml
+++ b/assets/xml/objects/object_kgy.xml
@@ -67,7 +67,7 @@
-
+
diff --git a/assets/xml/objects/object_kitan.xml b/assets/xml/objects/object_kitan.xml
index 05d090d93e..edc2e5cc64 100644
--- a/assets/xml/objects/object_kitan.xml
+++ b/assets/xml/objects/object_kitan.xml
@@ -49,6 +49,6 @@
-
+
diff --git a/assets/xml/objects/object_knight.xml b/assets/xml/objects/object_knight.xml
index 0459cb062f..fa0e900e46 100644
--- a/assets/xml/objects/object_knight.xml
+++ b/assets/xml/objects/object_knight.xml
@@ -171,7 +171,7 @@
-
+
@@ -200,7 +200,7 @@
-
+
diff --git a/assets/xml/objects/object_kz.xml b/assets/xml/objects/object_kz.xml
index 2b714be38f..55f980ad24 100644
--- a/assets/xml/objects/object_kz.xml
+++ b/assets/xml/objects/object_kz.xml
@@ -75,7 +75,7 @@
-
+
diff --git a/assets/xml/objects/object_link_boy.xml b/assets/xml/objects/object_link_boy.xml
index b0a85ece51..68ec00737f 100644
--- a/assets/xml/objects/object_link_boy.xml
+++ b/assets/xml/objects/object_link_boy.xml
@@ -76,6 +76,6 @@
-
+
diff --git a/assets/xml/objects/object_link_child.xml b/assets/xml/objects/object_link_child.xml
index 51145033c5..5ad9030480 100644
--- a/assets/xml/objects/object_link_child.xml
+++ b/assets/xml/objects/object_link_child.xml
@@ -151,6 +151,6 @@
-
+
diff --git a/assets/xml/objects/object_link_goron.xml b/assets/xml/objects/object_link_goron.xml
index 1aa57c0107..39686b4f7c 100644
--- a/assets/xml/objects/object_link_goron.xml
+++ b/assets/xml/objects/object_link_goron.xml
@@ -80,7 +80,7 @@
-
+
@@ -103,6 +103,6 @@
-
+
diff --git a/assets/xml/objects/object_link_nuts.xml b/assets/xml/objects/object_link_nuts.xml
index e3dab39dac..eb072c940e 100644
--- a/assets/xml/objects/object_link_nuts.xml
+++ b/assets/xml/objects/object_link_nuts.xml
@@ -74,6 +74,6 @@
-
+
diff --git a/assets/xml/objects/object_link_zora.xml b/assets/xml/objects/object_link_zora.xml
index fe5c50ea67..9a973c56a7 100644
--- a/assets/xml/objects/object_link_zora.xml
+++ b/assets/xml/objects/object_link_zora.xml
@@ -91,6 +91,6 @@
-
+
diff --git a/assets/xml/objects/object_lotus.xml b/assets/xml/objects/object_lotus.xml
index a9835b81b4..b9f40033cf 100644
--- a/assets/xml/objects/object_lotus.xml
+++ b/assets/xml/objects/object_lotus.xml
@@ -1,8 +1,9 @@

+
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_ma1.xml b/assets/xml/objects/object_ma1.xml
index 4d60bb95fa..b0b1435bc8 100644
--- a/assets/xml/objects/object_ma1.xml
+++ b/assets/xml/objects/object_ma1.xml
@@ -103,7 +103,7 @@
-
+
diff --git a/assets/xml/objects/object_ma2.xml b/assets/xml/objects/object_ma2.xml
index 5e642f3409..0d528b37bc 100644
--- a/assets/xml/objects/object_ma2.xml
+++ b/assets/xml/objects/object_ma2.xml
@@ -93,7 +93,7 @@
-
+
diff --git a/assets/xml/objects/object_market_obj.xml b/assets/xml/objects/object_market_obj.xml
index 81ab838f1f..8ad9436cc0 100644
--- a/assets/xml/objects/object_market_obj.xml
+++ b/assets/xml/objects/object_market_obj.xml
@@ -1,65 +1,69 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mk.xml b/assets/xml/objects/object_mk.xml
index 1ee3741bb3..087fcc9e01 100644
--- a/assets/xml/objects/object_mk.xml
+++ b/assets/xml/objects/object_mk.xml
@@ -40,6 +40,6 @@
-
+
diff --git a/assets/xml/objects/object_mm.xml b/assets/xml/objects/object_mm.xml
index baac5425d0..43e8e930b3 100644
--- a/assets/xml/objects/object_mm.xml
+++ b/assets/xml/objects/object_mm.xml
@@ -54,7 +54,7 @@
-
+
diff --git a/assets/xml/objects/object_mnk.xml b/assets/xml/objects/object_mnk.xml
index c6e23399da..d585972c08 100644
--- a/assets/xml/objects/object_mnk.xml
+++ b/assets/xml/objects/object_mnk.xml
@@ -23,7 +23,7 @@
-
+
@@ -104,7 +104,7 @@
-
+
@@ -121,6 +121,6 @@
-
+
diff --git a/assets/xml/objects/object_ms.xml b/assets/xml/objects/object_ms.xml
index a4a36e1493..93828c76f8 100644
--- a/assets/xml/objects/object_ms.xml
+++ b/assets/xml/objects/object_ms.xml
@@ -27,6 +27,6 @@
-
+
diff --git a/assets/xml/objects/object_mtoride.xml b/assets/xml/objects/object_mtoride.xml
index a795477300..145fcd33f6 100644
--- a/assets/xml/objects/object_mtoride.xml
+++ b/assets/xml/objects/object_mtoride.xml
@@ -1,49 +1,71 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mu.xml b/assets/xml/objects/object_mu.xml
index 925cb74e94..1f246b07b5 100644
--- a/assets/xml/objects/object_mu.xml
+++ b/assets/xml/objects/object_mu.xml
@@ -56,7 +56,7 @@
-
+
diff --git a/assets/xml/objects/object_nb.xml b/assets/xml/objects/object_nb.xml
index e8a695b52b..511fddd6c3 100644
--- a/assets/xml/objects/object_nb.xml
+++ b/assets/xml/objects/object_nb.xml
@@ -41,6 +41,6 @@
-
+
diff --git a/assets/xml/objects/object_niw.xml b/assets/xml/objects/object_niw.xml
index 0e533fb6e6..157d2b3026 100644
--- a/assets/xml/objects/object_niw.xml
+++ b/assets/xml/objects/object_niw.xml
@@ -35,6 +35,6 @@
-
+
diff --git a/assets/xml/objects/object_oF1d_map.xml b/assets/xml/objects/object_oF1d_map.xml
index a55e9c9eab..0f331cbcec 100644
--- a/assets/xml/objects/object_oF1d_map.xml
+++ b/assets/xml/objects/object_oF1d_map.xml
@@ -125,7 +125,7 @@
-
+
diff --git a/assets/xml/objects/object_ob.xml b/assets/xml/objects/object_ob.xml
index 0f79703b57..d2390fc395 100644
--- a/assets/xml/objects/object_ob.xml
+++ b/assets/xml/objects/object_ob.xml
@@ -1,84 +1,101 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_okuta.xml b/assets/xml/objects/object_okuta.xml
index e10afa1355..cad1c57bdc 100644
--- a/assets/xml/objects/object_okuta.xml
+++ b/assets/xml/objects/object_okuta.xml
@@ -60,7 +60,7 @@
-
+
diff --git a/assets/xml/objects/object_osn.xml b/assets/xml/objects/object_osn.xml
index 2cb8315ea6..dbcdb84734 100644
--- a/assets/xml/objects/object_osn.xml
+++ b/assets/xml/objects/object_osn.xml
@@ -110,7 +110,7 @@
-
+
diff --git a/assets/xml/objects/object_ot.xml b/assets/xml/objects/object_ot.xml
index 49a8d89cea..ae3b42d223 100644
--- a/assets/xml/objects/object_ot.xml
+++ b/assets/xml/objects/object_ot.xml
@@ -48,7 +48,7 @@
-
+
diff --git a/assets/xml/objects/object_owl.xml b/assets/xml/objects/object_owl.xml
index 6c9d798833..5560e33473 100644
--- a/assets/xml/objects/object_owl.xml
+++ b/assets/xml/objects/object_owl.xml
@@ -57,7 +57,7 @@
-
+
@@ -90,6 +90,6 @@
-
+
diff --git a/assets/xml/objects/object_pamera.xml b/assets/xml/objects/object_pamera.xml
index 28f73983e1..61dc17694d 100644
--- a/assets/xml/objects/object_pamera.xml
+++ b/assets/xml/objects/object_pamera.xml
@@ -63,7 +63,7 @@
-
+
diff --git a/assets/xml/objects/object_ph.xml b/assets/xml/objects/object_ph.xml
index 2e8a8eb29b..fcf03b765b 100644
--- a/assets/xml/objects/object_ph.xml
+++ b/assets/xml/objects/object_ph.xml
@@ -39,6 +39,6 @@
-
+
diff --git a/assets/xml/objects/object_po.xml b/assets/xml/objects/object_po.xml
index 2cc6e5cbd8..98dbc61b1a 100644
--- a/assets/xml/objects/object_po.xml
+++ b/assets/xml/objects/object_po.xml
@@ -48,6 +48,6 @@
-
+
diff --git a/assets/xml/objects/object_po_composer.xml b/assets/xml/objects/object_po_composer.xml
index ae8ef56e33..c45cf9039b 100644
--- a/assets/xml/objects/object_po_composer.xml
+++ b/assets/xml/objects/object_po_composer.xml
@@ -53,6 +53,6 @@
-
+
diff --git a/assets/xml/objects/object_po_fusen.xml b/assets/xml/objects/object_po_fusen.xml
index 5885b89a3c..a25c9d9607 100644
--- a/assets/xml/objects/object_po_fusen.xml
+++ b/assets/xml/objects/object_po_fusen.xml
@@ -27,6 +27,6 @@
-
+
diff --git a/assets/xml/objects/object_po_sisters.xml b/assets/xml/objects/object_po_sisters.xml
index 61bc0b4040..e2e57a31aa 100644
--- a/assets/xml/objects/object_po_sisters.xml
+++ b/assets/xml/objects/object_po_sisters.xml
@@ -65,6 +65,6 @@
-
+
diff --git a/assets/xml/objects/object_pr.xml b/assets/xml/objects/object_pr.xml
index 95fc4743c5..52429cb185 100644
--- a/assets/xml/objects/object_pr.xml
+++ b/assets/xml/objects/object_pr.xml
@@ -40,7 +40,7 @@
-
+
@@ -55,7 +55,7 @@
-
+
diff --git a/assets/xml/objects/object_ps.xml b/assets/xml/objects/object_ps.xml
index f341e95a43..689d78fb58 100644
--- a/assets/xml/objects/object_ps.xml
+++ b/assets/xml/objects/object_ps.xml
@@ -33,7 +33,7 @@
-
+
diff --git a/assets/xml/objects/object_raf.xml b/assets/xml/objects/object_raf.xml
index e3b4d2d934..2322740d52 100644
--- a/assets/xml/objects/object_raf.xml
+++ b/assets/xml/objects/object_raf.xml
@@ -53,6 +53,6 @@
-
+
diff --git a/assets/xml/objects/object_rb.xml b/assets/xml/objects/object_rb.xml
index 72b3e6cb67..cd0e9c2742 100644
--- a/assets/xml/objects/object_rb.xml
+++ b/assets/xml/objects/object_rb.xml
@@ -48,6 +48,6 @@
-
+
diff --git a/assets/xml/objects/object_rd.xml b/assets/xml/objects/object_rd.xml
index 854ded388c..cb16e492fe 100644
--- a/assets/xml/objects/object_rd.xml
+++ b/assets/xml/objects/object_rd.xml
@@ -45,7 +45,7 @@
-
+
@@ -105,7 +105,7 @@
-
+
diff --git a/assets/xml/objects/object_rs.xml b/assets/xml/objects/object_rs.xml
index fe58a75559..5334f4fb8c 100644
--- a/assets/xml/objects/object_rs.xml
+++ b/assets/xml/objects/object_rs.xml
@@ -58,6 +58,6 @@
-
+
diff --git a/assets/xml/objects/object_ru2.xml b/assets/xml/objects/object_ru2.xml
index f2d3fd2b0c..08f182bb9e 100644
--- a/assets/xml/objects/object_ru2.xml
+++ b/assets/xml/objects/object_ru2.xml
@@ -68,7 +68,7 @@
-
+
diff --git a/assets/xml/objects/object_rz.xml b/assets/xml/objects/object_rz.xml
index a75e033f0a..d8740403af 100644
--- a/assets/xml/objects/object_rz.xml
+++ b/assets/xml/objects/object_rz.xml
@@ -66,6 +66,6 @@
-
+
diff --git a/assets/xml/objects/object_sb.xml b/assets/xml/objects/object_sb.xml
index 359cff20dd..026b3389b1 100644
--- a/assets/xml/objects/object_sb.xml
+++ b/assets/xml/objects/object_sb.xml
@@ -24,7 +24,7 @@
-
+
diff --git a/assets/xml/objects/object_sdn.xml b/assets/xml/objects/object_sdn.xml
index 88c62434e8..8271480bea 100644
--- a/assets/xml/objects/object_sdn.xml
+++ b/assets/xml/objects/object_sdn.xml
@@ -60,7 +60,7 @@
-
+
diff --git a/assets/xml/objects/object_shn.xml b/assets/xml/objects/object_shn.xml
index 4a8e018675..c4b256f68f 100644
--- a/assets/xml/objects/object_shn.xml
+++ b/assets/xml/objects/object_shn.xml
@@ -103,7 +103,7 @@
-
+
diff --git a/assets/xml/objects/object_skb.xml b/assets/xml/objects/object_skb.xml
index c9935b64fd..78413a9de4 100644
--- a/assets/xml/objects/object_skb.xml
+++ b/assets/xml/objects/object_skb.xml
@@ -55,7 +55,7 @@
-
+
diff --git a/assets/xml/objects/object_snowman.xml b/assets/xml/objects/object_snowman.xml
index fde2d911fc..dd5f42c171 100644
--- a/assets/xml/objects/object_snowman.xml
+++ b/assets/xml/objects/object_snowman.xml
@@ -43,7 +43,7 @@
-
+
@@ -58,7 +58,7 @@
-
+
diff --git a/assets/xml/objects/object_ssh.xml b/assets/xml/objects/object_ssh.xml
index 57599fdce3..29cd1fab18 100644
--- a/assets/xml/objects/object_ssh.xml
+++ b/assets/xml/objects/object_ssh.xml
@@ -58,7 +58,7 @@
-
+
diff --git a/assets/xml/objects/object_st.xml b/assets/xml/objects/object_st.xml
index b8b39f94f2..cbb01d3c5d 100644
--- a/assets/xml/objects/object_st.xml
+++ b/assets/xml/objects/object_st.xml
@@ -64,7 +64,7 @@
-
+
diff --git a/assets/xml/objects/object_sth.xml b/assets/xml/objects/object_sth.xml
index c7a0ffd250..b176cd8cc4 100644
--- a/assets/xml/objects/object_sth.xml
+++ b/assets/xml/objects/object_sth.xml
@@ -37,6 +37,6 @@
-
+
diff --git a/assets/xml/objects/object_stk.xml b/assets/xml/objects/object_stk.xml
index 9698e335e7..a6f00c89b5 100644
--- a/assets/xml/objects/object_stk.xml
+++ b/assets/xml/objects/object_stk.xml
@@ -100,7 +100,7 @@
-
+
diff --git a/assets/xml/objects/object_stk2.xml b/assets/xml/objects/object_stk2.xml
index d9bde796db..d526bbc5c4 100644
--- a/assets/xml/objects/object_stk2.xml
+++ b/assets/xml/objects/object_stk2.xml
@@ -42,7 +42,7 @@
-
+
diff --git a/assets/xml/objects/object_tab.xml b/assets/xml/objects/object_tab.xml
index 9a63c2ed33..0a984b284a 100644
--- a/assets/xml/objects/object_tab.xml
+++ b/assets/xml/objects/object_tab.xml
@@ -57,7 +57,7 @@
-
+
diff --git a/assets/xml/objects/object_tanron4.xml b/assets/xml/objects/object_tanron4.xml
index 2c988e74b3..491e9a587c 100644
--- a/assets/xml/objects/object_tanron4.xml
+++ b/assets/xml/objects/object_tanron4.xml
@@ -25,6 +25,6 @@
-
+
diff --git a/assets/xml/objects/object_test3.xml b/assets/xml/objects/object_test3.xml
index 6b0a5349ce..efd0189951 100644
--- a/assets/xml/objects/object_test3.xml
+++ b/assets/xml/objects/object_test3.xml
@@ -63,6 +63,6 @@
-
+
diff --git a/assets/xml/objects/object_tite.xml b/assets/xml/objects/object_tite.xml
index 681b732e8c..351b4f56af 100644
--- a/assets/xml/objects/object_tite.xml
+++ b/assets/xml/objects/object_tite.xml
@@ -49,6 +49,6 @@
-
+
diff --git a/assets/xml/objects/object_tk.xml b/assets/xml/objects/object_tk.xml
index 0c0ea38314..b11b474885 100644
--- a/assets/xml/objects/object_tk.xml
+++ b/assets/xml/objects/object_tk.xml
@@ -60,6 +60,6 @@
-
+
diff --git a/assets/xml/objects/object_tl.xml b/assets/xml/objects/object_tl.xml
index 6397283af1..7f0cfd7565 100644
--- a/assets/xml/objects/object_tl.xml
+++ b/assets/xml/objects/object_tl.xml
@@ -10,7 +10,7 @@
-
+
@@ -55,7 +55,7 @@
-
+
diff --git a/assets/xml/objects/object_toryo.xml b/assets/xml/objects/object_toryo.xml
index 45d3da1005..e19f2c540a 100644
--- a/assets/xml/objects/object_toryo.xml
+++ b/assets/xml/objects/object_toryo.xml
@@ -48,6 +48,6 @@
-
+
diff --git a/assets/xml/objects/object_trt.xml b/assets/xml/objects/object_trt.xml
index a0d83076e8..826aa1ef07 100644
--- a/assets/xml/objects/object_trt.xml
+++ b/assets/xml/objects/object_trt.xml
@@ -1,94 +1,106 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_tru.xml b/assets/xml/objects/object_tru.xml
index dd0e6d20c8..138723cebf 100644
--- a/assets/xml/objects/object_tru.xml
+++ b/assets/xml/objects/object_tru.xml
@@ -102,7 +102,7 @@
-
+
diff --git a/assets/xml/objects/object_tsn.xml b/assets/xml/objects/object_tsn.xml
index 761a6e0d74..d610b185e6 100644
--- a/assets/xml/objects/object_tsn.xml
+++ b/assets/xml/objects/object_tsn.xml
@@ -47,7 +47,7 @@
-
+
diff --git a/assets/xml/objects/object_uch.xml b/assets/xml/objects/object_uch.xml
index e61be5042b..d82bf5b10e 100644
--- a/assets/xml/objects/object_uch.xml
+++ b/assets/xml/objects/object_uch.xml
@@ -59,6 +59,6 @@
-
+
diff --git a/assets/xml/objects/object_um.xml b/assets/xml/objects/object_um.xml
index aa979bf754..aac86a9a7f 100644
--- a/assets/xml/objects/object_um.xml
+++ b/assets/xml/objects/object_um.xml
@@ -77,7 +77,7 @@
-
+
diff --git a/assets/xml/objects/object_utubo.xml b/assets/xml/objects/object_utubo.xml
index a1f499eb6a..4ce3d64f09 100644
--- a/assets/xml/objects/object_utubo.xml
+++ b/assets/xml/objects/object_utubo.xml
@@ -42,7 +42,7 @@
-
+
diff --git a/assets/xml/objects/object_vm.xml b/assets/xml/objects/object_vm.xml
index b6c1cdfa29..bf13f3b404 100644
--- a/assets/xml/objects/object_vm.xml
+++ b/assets/xml/objects/object_vm.xml
@@ -25,6 +25,6 @@
-
+
diff --git a/assets/xml/objects/object_wallmaster.xml b/assets/xml/objects/object_wallmaster.xml
index fba2bc2460..afe3843e39 100644
--- a/assets/xml/objects/object_wallmaster.xml
+++ b/assets/xml/objects/object_wallmaster.xml
@@ -65,7 +65,7 @@
-
+
diff --git a/assets/xml/objects/object_warp1.xml b/assets/xml/objects/object_warp1.xml
index 8143347923..0f6fe168b6 100644
--- a/assets/xml/objects/object_warp1.xml
+++ b/assets/xml/objects/object_warp1.xml
@@ -1,59 +1,79 @@

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_wdhand.xml b/assets/xml/objects/object_wdhand.xml
index bcd5b0ce36..311d9299f5 100644
--- a/assets/xml/objects/object_wdhand.xml
+++ b/assets/xml/objects/object_wdhand.xml
@@ -23,6 +23,6 @@
-
+
diff --git a/assets/xml/objects/object_wf.xml b/assets/xml/objects/object_wf.xml
index 3d9ce392db..b6c5b640d8 100644
--- a/assets/xml/objects/object_wf.xml
+++ b/assets/xml/objects/object_wf.xml
@@ -62,7 +62,7 @@
-
+
@@ -132,7 +132,7 @@
-
+
diff --git a/assets/xml/objects/object_wiz.xml b/assets/xml/objects/object_wiz.xml
index 947cab3c7c..2928083aa2 100644
--- a/assets/xml/objects/object_wiz.xml
+++ b/assets/xml/objects/object_wiz.xml
@@ -97,6 +97,6 @@
-
+
diff --git a/assets/xml/objects/object_yb.xml b/assets/xml/objects/object_yb.xml
index 1a8503a6e9..3bbfc7cce7 100644
--- a/assets/xml/objects/object_yb.xml
+++ b/assets/xml/objects/object_yb.xml
@@ -56,6 +56,6 @@
-
+
diff --git a/assets/xml/objects/object_zl1.xml b/assets/xml/objects/object_zl1.xml
index 04d4ae406e..2b8a101bc1 100644
--- a/assets/xml/objects/object_zl1.xml
+++ b/assets/xml/objects/object_zl1.xml
@@ -74,7 +74,7 @@
-
+
diff --git a/assets/xml/objects/object_zl4.xml b/assets/xml/objects/object_zl4.xml
index 65596c3708..73ebb86065 100644
--- a/assets/xml/objects/object_zl4.xml
+++ b/assets/xml/objects/object_zl4.xml
@@ -93,7 +93,7 @@
-
+
diff --git a/assets/xml/objects/object_zm.xml b/assets/xml/objects/object_zm.xml
index f6f1b95e5a..c35d5aecb4 100644
--- a/assets/xml/objects/object_zm.xml
+++ b/assets/xml/objects/object_zm.xml
@@ -55,7 +55,7 @@
-
+
diff --git a/assets/xml/objects/object_zo.xml b/assets/xml/objects/object_zo.xml
index d2a16cfacf..0cd5c8546f 100644
--- a/assets/xml/objects/object_zo.xml
+++ b/assets/xml/objects/object_zo.xml
@@ -74,7 +74,7 @@
-
+
diff --git a/assets/xml/objects/object_zob.xml b/assets/xml/objects/object_zob.xml
index bc4d61c6a6..8d27f260f5 100644
--- a/assets/xml/objects/object_zob.xml
+++ b/assets/xml/objects/object_zob.xml
@@ -67,7 +67,7 @@
-
+
diff --git a/assets/xml/objects/object_zod.xml b/assets/xml/objects/object_zod.xml
index 3e0b6567a0..2616dbcdfd 100644
--- a/assets/xml/objects/object_zod.xml
+++ b/assets/xml/objects/object_zod.xml
@@ -44,7 +44,7 @@
-
+
diff --git a/assets/xml/objects/object_zog.xml b/assets/xml/objects/object_zog.xml
index 15265596d9..1ede14ad22 100644
--- a/assets/xml/objects/object_zog.xml
+++ b/assets/xml/objects/object_zog.xml
@@ -107,6 +107,6 @@
-
+
diff --git a/assets/xml/objects/object_zoraegg.xml b/assets/xml/objects/object_zoraegg.xml
index 367d2df760..175c6aeb2c 100644
--- a/assets/xml/objects/object_zoraegg.xml
+++ b/assets/xml/objects/object_zoraegg.xml
@@ -22,7 +22,7 @@
-
+
diff --git a/assets/xml/objects/object_zos.xml b/assets/xml/objects/object_zos.xml
index 1f5a2a5429..016831ac55 100644
--- a/assets/xml/objects/object_zos.xml
+++ b/assets/xml/objects/object_zos.xml
@@ -62,7 +62,7 @@
-
+
diff --git a/assets/xml/objects/object_zov.xml b/assets/xml/objects/object_zov.xml
index abbc52268b..440782f102 100644
--- a/assets/xml/objects/object_zov.xml
+++ b/assets/xml/objects/object_zov.xml
@@ -76,6 +76,6 @@
-
+
diff --git a/assets/xml/overlays/ovl_Dm_Char01.xml b/assets/xml/overlays/ovl_Dm_Char01.xml
index 3f855c3764..2aa05fcb66 100644
--- a/assets/xml/overlays/ovl_Dm_Char01.xml
+++ b/assets/xml/overlays/ovl_Dm_Char01.xml
@@ -1,6 +1,7 @@
+
-
+
diff --git a/assets/xml/overlays/ovl_Oceff_Spot.xml b/assets/xml/overlays/ovl_Oceff_Spot.xml
new file mode 100644
index 0000000000..f4e9beea75
--- /dev/null
+++ b/assets/xml/overlays/ovl_Oceff_Spot.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe2.xml b/assets/xml/overlays/ovl_Oceff_Wipe2.xml
new file mode 100644
index 0000000000..c43ced3c03
--- /dev/null
+++ b/assets/xml/overlays/ovl_Oceff_Wipe2.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe3.xml b/assets/xml/overlays/ovl_Oceff_Wipe3.xml
new file mode 100644
index 0000000000..d8be729850
--- /dev/null
+++ b/assets/xml/overlays/ovl_Oceff_Wipe3.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/include/functions.h b/include/functions.h
index 7d06ad159e..42933599e3 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -200,7 +200,7 @@ s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flags);
OSIntMask osSetIntMask(OSIntMask im);
// OSIntMask osGetIntMask(void);
// void osVoiceSetWord(void);
-// void guScale(void);
+void guScale(Mtx* mtx, f32 x, f32 y, f32 z);
f32 sinf(f32 __x);
s16 sins(u16 x);
OSTask* _VirtualToPhysicalTask(OSTask* intp);
@@ -383,7 +383,7 @@ u32 osAiGetLength(void);
s32 osEPiWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data);
void osMapTLBRdb(void);
void osYieldThread(void);
-// void guTranslate(void);
+void guTranslate(Mtx* mtx, f32 x, f32 y, f32 z);
u32 __osGetCause(void);
s32 __osContRamWrite(OSMesgQueue* mq, s32 channel, u16 address, u8* buffer, s32 force);
s32 __osEPiRawWriteIo(OSPiHandle* handle, u32 devAddr, u32 data);
@@ -539,7 +539,7 @@ void EffectSsBlast_SpawnWhiteShockwave(PlayState* play, Vec3f* arg1, Vec3f* arg2
void EffectSsGSpk_SpawnFuse(PlayState* play, Actor* actor, Vec3f* pos, Vec3f* velocity, Vec3f* accel);
// void EffectSsGSpk_SpawnRandColor(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE2 param_6, UNK_TYPE2 param_7);
// void EffectSsGSpk_SpawnSmall(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7);
-void EffectSsDFire_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scaleStep, s16 alpha, s16 fadeDelay, s16 life, s32 arg9);
+void EffectSsDFire_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scaleStep, s16 alpha, s16 alphaStep, s16 fadeDelay, s32 life);
void EffectSsBubble_Spawn(PlayState* play, Vec3f* pos, f32 yPosOffset, f32 yPosRandScale, f32 xzPosRandScale, f32 scale);
void EffectSsGRipple_Spawn(PlayState* play, Vec3f* pos, s16 radius, s16 radiusMax, s16 life);
void EffectSsGSplash_Spawn(PlayState* play, Vec3f* pos, Color_RGBA8* primColor, Color_RGBA8* envColor, s16 type, s16 scale);
@@ -718,7 +718,7 @@ void func_800B9038(Actor* actor, s32 timer);
void func_800B9084(Actor* actor);
void func_800B9098(Actor* actor);
s32 func_800B90AC(PlayState* play, Actor* actor, CollisionPoly* polygon, s32 index, s32 arg4);
-void func_800B90F4(PlayState* play);
+void Actor_DeactivateLens(PlayState* play);
void func_800B9120(ActorContext* actorCtx);
void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEntry);
void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx);
@@ -1858,13 +1858,9 @@ s32 Health_ChangeBy(PlayState* play, s16 healthChange);
void Health_GiveHearts(s16 hearts);
void Rupees_ChangeBy(s16 rupeeChange);
void Inventory_ChangeAmmo(s16 item, s16 ammoChange);
-void Parameter_AddMagic(PlayState* play, s16 arg1);
-void func_80115D5C(GameState* gamestate);
-// void func_80115DB4(void);
-// void func_80116088(void);
-// void func_80116114(void);
-// void func_80116348(void);
-// void func_80116918(void);
+void Magic_Add(PlayState* play, s16 magicToAdd);
+void Magic_Reset(PlayState* play);
+s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type);
// void func_80116FD8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
// void func_801170B8(void);
// void func_80117100(void);
@@ -1975,12 +1971,6 @@ s32 func_80128640(PlayState* play, Player* player, Gfx* dlist);
void func_80128B74(PlayState* play, Player* player, s32 limbIndex);
void func_80128BD0(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dList2, Vec3s* rot, Actor* actor);
-void PreNMI_Stop(PreNMIContext* prenmiCtx);
-void PreNMI_Update(PreNMIContext* prenmiCtx);
-void PreNMI_Draw(PreNMIContext* prenmiCtx);
-void PreNMI_Main(PreNMIContext* prenmiCtx);
-void PreNMI_Destroy(PreNMIContext* prenmiCtx);
-void PreNMI_Init(PreNMIContext* prenmiCtx);
f32 Quake_Random(void);
void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 verticalPertubation, f32 horizontalPertubation);
s16 Quake_Callback1(QuakeRequest* req, ShakeInfo* shake);
@@ -2672,10 +2662,7 @@ void AudioMgr_HandlePRENMI(AudioMgr* audioMgr);
void AudioMgr_ThreadEntry(void* arg);
void AudioMgr_Unlock(AudioMgr* audioMgr);
void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr);
-void TitleSetup_GameStateResetContext(void);
-void TitleSetup_InitImpl(GameState* gameState);
-void TitleSetup_Destroy(GameState* gameState);
-void TitleSetup_Init(GameState* gameState);
+
void Game_UpdateFramerateVariables(s32 divisor);
void Game_SetFramerateDivisor(GameState* gameState, s32 divisor);
void GameState_SetFBFilter(Gfx** gfx, u32 arg1);
@@ -2690,8 +2677,8 @@ void GameState_InitArena(GameState* gameState, size_t size);
void GameState_Realloc(GameState* gameState, size_t size);
void GameState_Init(GameState* gameState, GameStateFunc gameStateInit, GraphicsContext* gfxCtx);
void GameState_Destroy(GameState* gameState);
-GameStateFunc GameState_GetNextStateInit(GameState* gameState);
-size_t GameState_GetNextStateSize(GameState* gameState);
+GameStateFunc GameState_GetInit(GameState* gameState);
+size_t GameState_GetSize(GameState* gameState);
u32 GameState_IsRunning(GameState* gameState);
s32 GameState_GetArenaSize(GameState* gameState);
s32 func_80173B48(GameState* gameState);
@@ -3045,8 +3032,8 @@ void* AudioHeap_AllocAttemptExternal(AudioAllocPool* pool, size_t size);
void* AudioHeap_AllocDmaMemory(AudioAllocPool* pool, size_t size);
void* AudioHeap_AllocZeroed(AudioAllocPool* pool, size_t size);
void* AudioHeap_Alloc(AudioAllocPool* pool, size_t size);
-void AudioHeap_AllocPoolInit(AudioAllocPool* pool, void* addr, size_t size);
-void AudioHeap_PopCache(s32 tableType);
+void AudioHeap_InitPool(AudioAllocPool* pool, void* addr, size_t size);
+void AudioHeap_PopPersistentCache(s32 tableType);
void AudioHeap_InitMainPool(size_t initPoolSize);
void* AudioHeap_AllocCached(s32 tableType, size_t size, s32 cache, s32 id);
void* AudioHeap_SearchCaches(s32 tableType, s32 cache, s32 id);
@@ -3131,10 +3118,10 @@ s32 osAiSetNextBuffer(void* buf, u32 size);
void AudioPlayback_NoteDisable(Note* note);
void AudioPlayback_ProcessNotes(void);
-SoundFontSound* AudioPlayback_InstrumentGetSound(Instrument* instrument, s32 semitone);
+TunedSample* AudioPlayback_GetInstrumentTunedSample(Instrument* instrument, s32 semitone);
Instrument* AudioPlayback_GetInstrumentInner(s32 fontId, s32 instId);
Drum* AudioPlayback_GetDrum(s32 fontId, s32 drumId);
-SoundFontSound* AudioPlayback_GetSfx(s32 fontId, s32 sfxId);
+SoundEffect* AudioPlayback_GetSoundEffect(s32 fontId, s32 sfxId);
s32 AudioPlayback_SetFontInstrument(s32 instrumentType, s32 fontId, s32 index, void* value);
void AudioPlayback_SeqLayerNoteDecay(SequenceLayer* layer);
void AudioPlayback_SeqLayerNoteRelease(SequenceLayer* layer);
diff --git a/include/macros.h b/include/macros.h
index 06021b35d4..d92d89ad04 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -24,9 +24,20 @@
#define GET_ACTIVE_CAM(play) ((play)->cameraPtrs[(play)->activeCamId])
-#define SET_NEXT_GAMESTATE(curState, newInit, newStruct) \
- (curState)->nextGameStateInit = (GameStateFunc)newInit; \
- (curState)->nextGameStateSize = sizeof(newStruct)
+#define STOP_GAMESTATE(curState) \
+ do { \
+ GameState* state = curState; \
+ \
+ state->running = false; \
+ } while(0)
+
+#define SET_NEXT_GAMESTATE(curState, nextInit, nextSize) \
+ do { \
+ GameState* state = curState; \
+ \
+ (state)->init = nextInit; \
+ (state)->size = nextSize; \
+ } while (0)
#define GET_PLAYER(play) ((Player*)(play)->actorCtx.actorLists[ACTORCAT_PLAYER].first)
@@ -45,6 +56,9 @@
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
+// To be used with `Magic_Add`, but ensures enough magic is added to fill the magic bar to capacity
+#define MAGIC_FILL_TO_CAPACITY (((void)0, gSaveContext.magicFillTarget) + (gSaveContext.save.playerData.isDoubleMagicAcquired + 1) * MAGIC_NORMAL_METER)
+
#define CONTROLLER1(gameState) (&(gameState)->input[0])
#define CONTROLLER2(gameState) (&(gameState)->input[1])
#define CONTROLLER3(gameState) (&(gameState)->input[2])
diff --git a/include/regs.h b/include/regs.h
index f8ce4ca863..aa3ba523b2 100644
--- a/include/regs.h
+++ b/include/regs.h
@@ -43,61 +43,58 @@
#define bREG(r) BASE_REG(28, r)
/* TODO: Actually confirm these, in case of miss-match it's at least a simple list to `sed` */
-#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT
-#define R_RUN_SPEED_LIMIT REG(45)
-#define R_UPDATE_RATE SREG(30)
-#define R_PAUSE_MENU_MODE SREG(94)
-#define R_C_UP_ICON_X YREG(88)
-#define R_C_UP_ICON_Y YREG(89)
-#define R_MAGIC_FILL_COLOR(i) ZREG(0 + i)
-#define R_C_BTN_COLOR(i) ZREG(39 + i)
-#define R_B_BTN_COLOR(i) ZREG(43 + i)
-#define R_START_LABEL_DD(i) ZREG(48 + i)
-#define R_START_LABEL_Y(i) ZREG(51 + i)
-#define R_START_LABEL_X(i) ZREG(54 + i)
-#define R_C_UP_BTN_X ZREG(62)
-#define R_C_UP_BTN_Y ZREG(63)
-#define R_START_BTN_X ZREG(68)
-#define R_START_BTN_Y ZREG(69)
-#define R_ITEM_BTN_X(i) ZREG(70 + i)
-#define R_ITEM_BTN_Y(i) ZREG(74 + i)
-#define R_ITEM_BTN_DD(i) ZREG(78 + i)
-#define R_ITEM_ICON_X(i) ZREG(82 + i)
-#define R_ITEM_ICON_Y(i) ZREG(86 + i)
-#define R_ITEM_ICON_DD(i) ZREG(90 + i)
-#define R_A_BTN_Y XREG(16)
-#define R_A_BTN_X XREG(17)
-#define R_A_ICON_Y XREG(19)
-#define R_A_ICON_X XREG(20)
-#define R_A_BTN_COLOR(i) XREG(22 + i)
-#define R_MAGIC_BAR_SMALL_Y XREG(48)
-#define R_MAGIC_BAR_X XREG(49)
-#define R_MAGIC_BAR_LARGE_Y XREG(50)
-#define R_MAGIC_FILL_X XREG(51)
-#define R_MINIMAP_DISABLED XREG(95)
-#define R_B_LABEL_DD WREG(0)
-#define R_OW_MINIMAP_X WREG(29)
-#define R_OW_MINIMAP_Y WREG(30)
-#define R_B_LABEL_X(i) WREG(40 + i)
-#define R_B_LABEL_Y(i) WREG(43 + i)
-#define R_DGN_MINIMAP_X WREG(68)
-#define R_DGN_MINIMAP_Y WREG(69)
-#define R_MAP_INDEX VREG(11)
-#define R_MAP_TEX_INDEX_BASE VREG(12)
-#define R_MAP_TEX_INDEX VREG(13)
-#define R_COMPASS_SCALE_X VREG(14)
-#define R_COMPASS_SCALE_Y VREG(15)
-#define R_COMPASS_OFFSET_X VREG(16)
-#define R_COMPASS_OFFSET_Y VREG(17)
-#define R_MINIMAP_COLOR(i) VREG(18 + i)
-#define R_ITEM_AMMO_X(i) VREG(64 + i)
-#define R_ITEM_AMMO_Y(i) VREG(68 + i)
-#define R_ITEM_ICON_WIDTH(i) VREG(76 + i)
-#define R_ITEM_BTN_WIDTH(i) VREG(80 + i)
+#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT
+#define R_RUN_SPEED_LIMIT REG(45)
+#define R_UPDATE_RATE SREG(30)
+#define R_PAUSE_MENU_MODE SREG(94)
+#define R_C_UP_ICON_X YREG(88)
+#define R_C_UP_ICON_Y YREG(89)
+#define R_MAGIC_FILL_COLOR(i) ZREG(0 + i)
+#define R_C_BTN_COLOR(i) ZREG(39 + i)
+#define R_B_BTN_COLOR(i) ZREG(43 + i)
+#define R_START_LABEL_DD(i) ZREG(48 + i)
+#define R_START_LABEL_Y(i) ZREG(51 + i)
+#define R_START_LABEL_X(i) ZREG(54 + i)
+#define R_C_UP_BTN_X ZREG(62)
+#define R_C_UP_BTN_Y ZREG(63)
+#define R_START_BTN_X ZREG(68)
+#define R_START_BTN_Y ZREG(69)
+#define R_ITEM_BTN_X(i) ZREG(70 + i)
+#define R_ITEM_BTN_Y(i) ZREG(74 + i)
+#define R_ITEM_BTN_DD(i) ZREG(78 + i)
+#define R_ITEM_ICON_X(i) ZREG(82 + i)
+#define R_ITEM_ICON_Y(i) ZREG(86 + i)
+#define R_ITEM_ICON_DD(i) ZREG(90 + i)
+#define R_A_BTN_Y XREG(16)
+#define R_A_BTN_X XREG(17)
+#define R_A_ICON_Y XREG(19)
+#define R_A_ICON_X XREG(20)
+#define R_A_BTN_COLOR(i) XREG(22 + i)
+#define R_MAGIC_CONSUME_TIMER_GIANTS_MASK XREG(41)
+#define R_MINIMAP_DISABLED XREG(95)
+#define R_B_LABEL_DD WREG(0)
+#define R_OW_MINIMAP_X WREG(29)
+#define R_OW_MINIMAP_Y WREG(30)
+#define R_B_LABEL_X(i) WREG(40 + i)
+#define R_B_LABEL_Y(i) WREG(43 + i)
+#define R_DGN_MINIMAP_X WREG(68)
+#define R_DGN_MINIMAP_Y WREG(69)
+#define R_MAP_INDEX VREG(11)
+#define R_MAP_TEX_INDEX_BASE VREG(12)
+#define R_MAP_TEX_INDEX VREG(13)
+#define R_COMPASS_SCALE_X VREG(14)
+#define R_COMPASS_SCALE_Y VREG(15)
+#define R_COMPASS_OFFSET_X VREG(16)
+#define R_COMPASS_OFFSET_Y VREG(17)
+#define R_MINIMAP_COLOR(i) VREG(18 + i)
+#define R_ITEM_AMMO_X(i) VREG(64 + i)
+#define R_ITEM_AMMO_Y(i) VREG(68 + i)
+#define R_ITEM_ICON_WIDTH(i) VREG(76 + i)
+#define R_ITEM_BTN_WIDTH(i) VREG(80 + i)
-#define R_FB_FILTER_TYPE SREG(80)
-#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)
-#define R_FB_FILTER_A SREG(84)
-#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + c)
+#define R_FB_FILTER_TYPE SREG(80)
+#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)
+#define R_FB_FILTER_A SREG(84)
+#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + c)
#endif
diff --git a/include/variables.h b/include/variables.h
index 44958bd1b2..8225112fd1 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -362,8 +362,6 @@ extern ActorInit En_A_Obj_InitVars;
extern ColliderCylinderInit enAObjCylinderInit;
extern InitChainEntry enAObjInitVar;
extern Gfx* enAObjDisplayLists[2];
-extern UNK_PTR D_801ADF30[5];
-extern UNK_PTR D_801ADF44[12];
extern u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER];
extern u8 sDropTableAmounts[DROP_TABLE_SIZE * DROP_TABLE_NUMBER];
extern s32 D_801AE194[32];
@@ -1028,11 +1026,11 @@ extern UNK_PTR D_801BF5C0;
// extern UNK_TYPE2 D_801BF890;
// extern UNK_TYPE2 D_801BF898;
// extern UNK_TYPE2 D_801BF89C;
-// extern UNK_TYPE2 D_801BF8A0;
-// extern UNK_TYPE2 D_801BF8A4;
-// extern UNK_TYPE2 D_801BF8A8;
-// extern UNK_TYPE2 D_801BF8AC;
-// extern UNK_TYPE2 D_801BF8B0;
+// extern UNK_TYPE2 sMagicMeterOutlinePrimRed;
+// extern UNK_TYPE2 sMagicMeterOutlinePrimGreen;
+// extern UNK_TYPE2 sMagicMeterOutlinePrimBlue;
+// extern UNK_TYPE2 sMagicBorderRatio;
+// extern UNK_TYPE2 sMagicBorderStep;
// extern UNK_TYPE2 D_801BF8DC;
// extern UNK_TYPE2 D_801BF8E0;
// extern UNK_TYPE2 D_801BF8E4;
@@ -2719,7 +2717,7 @@ extern f32 D_801DE860;
extern f32 D_801DE864;
extern f32 D_801DE868;
extern f32 D_801DE884;
-extern TexturePtr D_801DE890[];
+extern TexturePtr gCircleTex;
extern f32 D_801DF090;
extern f32 D_801DF094;
extern f32 D_801DF0A0;
@@ -2968,7 +2966,7 @@ extern f64 D_801E0EB0;
// extern UNK_TYPE4 D_801E1068;
extern UNK_PTR D_801E10B0;
extern const s16 gAudioTatumInit[];
-extern const AudioContextInitSizes gAudioContextInitSizes;
+extern const AudioHeapInitSizes gAudioHeapInitSizes;
// extern UNK_TYPE4 D_801E1108;
// extern UNK_TYPE4 D_801E110C;
extern u8 gSoundFontTable[];
@@ -3489,7 +3487,7 @@ extern ActiveSfx gActiveSfx[7][3];
extern AudioContext gAudioContext; // at 0x80200C70
extern void (*D_80208E68)(void);
extern u32 (*D_80208E6C)(s8 value, SequenceChannel* channel);
-extern s32 (*D_80208E70)(SoundFontSample*, s32, s8, s32);
+extern s32 (*D_80208E70)(Sample*, s32, s8, s32);
extern Acmd* (*D_80208E74)(Acmd*, s32, s32);
// post-code buffers
diff --git a/include/z64.h b/include/z64.h
index 4b5ff4254c..a5d2db55a1 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -469,8 +469,8 @@ typedef struct {
/* 0x290 */ f32 unk_290;
/* 0x294 */ f32 unk_294;
/* 0x298 */ f32 unk_298;
- /* 0x29C */ s16 unk_29C;
- /* 0x29E */ s16 unk_29E;
+ /* 0x29C */ s16 promptChoice; // save/continue choice: 0 = yes; 4 = no
+ /* 0x29E */ s16 promptAlpha;
/* 0x2A0 */ s16 unk_2A0;
/* 0x2A2 */ u8 worldMapPoints[20];
/* 0x2B6 */ u8 unk_2B6;
@@ -523,7 +523,7 @@ typedef struct {
/* 0x252 */ s16 lifeSizeChange;
/* 0x254 */ s16 lifeSizeChangeDirection; // 1 means shrinking, 0 growing
/* 0x256 */ s16 unk_256;
- /* 0x258 */ s16 unk_258;
+ /* 0x258 */ s16 magicConsumptionTimer; // For certain magic states, 1 unit of magic is consumed every time the timer reaches 0
/* 0x25A */ u8 numHorseBoosts;
/* 0x25C */ u16 unk_25C;
/* 0x25E */ u16 unk_25E;
@@ -904,8 +904,8 @@ typedef struct GameState {
/* 0x00 */ GraphicsContext* gfxCtx;
/* 0x04 */ GameStateFunc main;
/* 0x08 */ GameStateFunc destroy;
- /* 0x0C */ GameStateFunc nextGameStateInit;
- /* 0x10 */ size_t nextGameStateSize;
+ /* 0x0C */ GameStateFunc init; // Usually the current game state's init, though after stopping, the graph thread will look here to determine the next game state to load.
+ /* 0x10 */ size_t size;
/* 0x14 */ Input input[4];
/* 0x74 */ TwoHeadArena heap;
/* 0x84 */ GameAlloc alloc;
@@ -917,12 +917,6 @@ typedef struct GameState {
/* 0xA3 */ u8 unk_A3;
} GameState; // size = 0xA4
-typedef struct PreNMIContext {
- /* 0x00 */ GameState state;
- /* 0xA4 */ u32 timer;
- /* 0xA8 */ UNK_TYPE4 unkA8;
-} PreNMIContext; // size = 0xAC
-
typedef struct {
/* 0x00 */ u32 resetting;
/* 0x04 */ u32 resetCount;
diff --git a/include/z64actor.h b/include/z64actor.h
index 175d9ef22c..b110783160 100644
--- a/include/z64actor.h
+++ b/include/z64actor.h
@@ -83,7 +83,7 @@ typedef struct {
typedef struct {
/* 0x0 */ s16 unk_0; // frame?
- /* 0x2 */ Vec3s unk_2; // pos?
+ /* 0x2 */ Vec3s unk_2; // scale
} struct_80124618; // size = 0x8
typedef struct {
@@ -307,6 +307,16 @@ typedef enum {
/* 0x0C */ ACTORCAT_MAX
} ActorType;
+#define ACTORCTX_FLAG_0 (1 << 0)
+#define ACTORCTX_FLAG_1 (1 << 1)
+#define ACTORCTX_FLAG_2 (1 << 2)
+#define ACTORCTX_FLAG_3 (1 << 3)
+#define ACTORCTX_FLAG_4 (1 << 4)
+#define ACTORCTX_FLAG_5 (1 << 5)
+#define ACTORCTX_FLAG_6 (1 << 6)
+#define ACTORCTX_FLAG_7 (1 << 7)
+
+
typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ f32 unkC;
@@ -351,13 +361,13 @@ typedef struct ActorContext_unk_20C {
/* 0x4 */ void* ptr;
} ActorContext_unk_20C; // size = 0x8
-typedef struct ActorContextFlags {
+typedef struct ActorContextSceneFlags {
/* 0x00 */ u32 switches[4]; // First 0x40 are permanent, second 0x40 are temporary
/* 0x10 */ u32 chest;
/* 0x14 */ u32 clearedRoom;
/* 0x18 */ u32 clearedRoomTemp;
/* 0x1C */ u32 collectible[4]; // bitfield of 128 bits
-} ActorContextFlags; // size = 0x2C
+} ActorContextSceneFlags; // size = 0x2C
typedef struct ActorListEntry {
/* 0x0 */ s32 length; // number of actors loaded of this type
@@ -365,22 +375,25 @@ typedef struct ActorListEntry {
/* 0x8 */ s32 unk_08;
} ActorListEntry; // size = 0xC
+// Target size when activated
+#define LENS_MASK_ACTIVE_SIZE 100
+
typedef struct ActorContext {
/* 0x000 */ u8 freezeFlashTimer;
/* 0x001 */ UNK_TYPE1 pad1;
/* 0x002 */ u8 unk2;
- /* 0x003 */ u8 unk3;
- /* 0x004 */ s8 unk4;
- /* 0x005 */ u8 unk5;
+ /* 0x003 */ u8 lensActive;
+ /* 0x004 */ s8 lensMaskSize; // The size of the circle when drawn the lens mask. Larger value leads to a smaller circle
+ /* 0x005 */ u8 flags;
/* 0x006 */ UNK_TYPE1 pad6[0x5];
- /* 0x00B */ s8 unkB;
+ /* 0x00B */ s8 lensActorsDrawn;
/* 0x00C */ s16 unkC;
/* 0x00E */ u8 totalLoadedActors;
/* 0x00F */ u8 undrawnActorCount;
/* 0x010 */ ActorListEntry actorLists[ACTORCAT_MAX];
/* 0x0A0 */ Actor* undrawnActors[32]; // Records the first 32 actors drawn each frame
/* 0x120 */ TargetContext targetContext;
- /* 0x1B8 */ ActorContextFlags flags;
+ /* 0x1B8 */ ActorContextSceneFlags sceneFlags;
/* 0x1E4 */ TitleCardContext titleCtxt;
/* 0x1F4 */ u8 unk1F4;
/* 0x1F5 */ u8 unk1F5;
@@ -1185,4 +1198,109 @@ typedef enum {
/* 0xC8 */ CLEAR_TAG_SMOKE = 200
} ClearTagType;
+typedef enum {
+ /* 0x00 */ TATL_HINT_ID_DEFAULT,
+ /* 0x01 */ TATL_HINT_ID_SNAPPER,
+ /* 0x02 */ TATL_HINT_ID_MINI_BABA,
+ /* 0x03 */ TATL_HINT_ID_MAD_JELLY,
+ /* 0x04 */ TATL_HINT_ID_SKULLTULA,
+ /* 0x05 */ TATL_HINT_ID_RED_CHUCHU,
+ /* 0x06 */ TATL_HINT_ID_BLUE_CHUCHU,
+ /* 0x07 */ TATL_HINT_ID_DEKU_BABA,
+ /* 0x08 */ TATL_HINT_ID_BIO_DEKU_BABA,
+ /* 0x09 */ TATL_HINT_ID_WILTED_DEKU_BABA,
+ /* 0x0A */ TATL_HINT_ID_DEXIHAND,
+ /* 0x0B */ TATL_HINT_ID_NEJIRON,
+ /* 0x0C */ TATL_HINT_ID_GIANT_BEE,
+ /* 0x0D */ TATL_HINT_ID_DODONGO,
+ /* 0x0E */ TATL_HINT_ID_DEEP_PYTHON,
+ /* 0x0F */ TATL_HINT_ID_DEATH_ARMOS,
+ /* 0x10 */ TATL_HINT_ID_DINOLFOS,
+ /* 0x11 */ TATL_HINT_ID_FIRE_KEESE,
+ /* 0x12 */ TATL_HINT_ID_KEESE,
+ /* 0x13 */ TATL_HINT_ID_ARMOS,
+ /* 0x14 */ TATL_HINT_ID_EENO,
+ /* 0x15 */ TATL_HINT_ID_DRAGONFLY,
+ /* 0x16 */ TATL_HINT_ID_IGOS_DU_IKANA,
+ /* 0x17 */ TATL_HINT_ID_GARO,
+ /* 0x18 */ TATL_HINT_ID_GARO_MASTER,
+ /* 0x19 */ TATL_HINT_ID_WART,
+ /* 0x1A */ TATL_HINT_ID_GOMESS,
+ /* 0x1B */ TATL_HINT_ID_GOHT,
+ /* 0x1C */ TATL_HINT_ID_BLUE_BUBBLE,
+ /* 0x1D */ TATL_HINT_ID_KINGS_LACKEYS_DARK_ROOM,
+ /* 0x1E */ TATL_HINT_ID_KINGS_LACKEYS_LIGHT_ROOM,
+ /* 0x1F */ TATL_HINT_ID_SKULLWALLTULA,
+ /* 0x20 */ TATL_HINT_ID_GOLD_SKULLTULA, // Only in JP Ver.
+ /* 0x21 */ TATL_HINT_ID_CAPTAIN_KEETA,
+ /* 0x22 */ TATL_HINT_ID_YELLOW_CHUCHU,
+ /* 0x23 */ TATL_HINT_ID_TAKKURI,
+ /* 0x24 */ TATL_HINT_ID_RED_BUBBLE,
+ /* 0x25 */ TATL_HINT_ID_HIPLOOP,
+ /* 0x26 */ TATL_HINT_ID_MASKED_HIPLOOP,
+ /* 0x27 */ TATL_HINT_ID_SHELLBLADE,
+ /* 0x28 */ TATL_HINT_ID_GYORG, // "if you go near, you'll be eaten!"
+ /* 0x29 */ TATL_HINT_ID_GYORG_STUNNED, // "Jump in and attack it!"
+ /* 0x2A */ TATL_HINT_ID_REDEAD,
+ /* 0x2B */ TATL_HINT_ID_2B,
+ /* 0x2C */ TATL_HINT_ID_BLACK_BOE,
+ /* 0x2D */ TATL_HINT_ID_GIBDO,
+ /* 0x2E */ TATL_HINT_ID_TWINMOLD,
+ /* 0x2F */ TATL_HINT_ID_WEARING_GIANTS_MASK, // Twinmold, JP Ver. only
+ /* 0x30 */ TATL_HINT_ID_WALLMASTER,
+ /* 0x31 */ TATL_HINT_ID_FLOORMASTER,
+ /* 0x32 */ TATL_HINT_ID_MAJORAS_MASK,
+ /* 0x33 */ TATL_HINT_ID_MAJORAS_INCARNATION,
+ /* 0x34 */ TATL_HINT_ID_MAJORAS_WRATH,
+ /* 0x35 */ TATL_HINT_ID_IRON_KNUCKLE,
+ /* 0x36 */ TATL_HINT_ID_36, // Empty
+ /* 0x37 */ TATL_HINT_ID_LIKE_LIKE,
+ /* 0x38 */ TATL_HINT_ID_38, // Empty
+ /* 0x39 */ TATL_HINT_ID_BEAMOS,
+ /* 0x3A */ TATL_HINT_ID_3A, // Empty
+ /* 0x3B */ TATL_HINT_ID_FREEZARD,
+ /* 0x3C */ TATL_HINT_ID_WHITE_BOE,
+ /* 0x3D */ TATL_HINT_ID_3D, // Empty
+ /* 0x3E */ TATL_HINT_ID_3E, // Empty
+ /* 0x3F */ TATL_HINT_ID_3F, // Empty
+ /* 0x40 */ TATL_HINT_ID_40, // Empty
+ /* 0x41 */ TATL_HINT_ID_41, // Empty
+ /* 0x42 */ TATL_HINT_ID_OCTOROK,
+ /* 0x43 */ TATL_HINT_ID_43, // Empty
+ /* 0x44 */ TATL_HINT_ID_POE,
+ /* 0x45 */ TATL_HINT_ID_GEKKO_SNAPPER,
+ /* 0x46 */ TATL_HINT_ID_BLUE_TEKTITE,
+ /* 0x47 */ TATL_HINT_ID_LEEVER,
+ /* 0x48 */ TATL_HINT_ID_PEAHAT,
+ /* 0x49 */ TATL_HINT_ID_PEAHAT_LARVA,
+ /* 0x4A */ TATL_HINT_ID_EYEGORE,
+ /* 0x4B */ TATL_HINT_ID_WIZROBE,
+ /* 0x4C */ TATL_HINT_ID_WOLFOS,
+ /* 0x4D */ TATL_HINT_ID_MAD_SCRUB,
+ /* 0x4E */ TATL_HINT_ID_4E, // Empty
+ /* 0x4F */ TATL_HINT_ID_4F, // Empty
+ /* 0x50 */ TATL_HINT_ID_POE_SISTER_MEG,
+ /* 0x51 */ TATL_HINT_ID_POE_SISTER_JO,
+ /* 0x52 */ TATL_HINT_ID_POE_SISTER_BETH,
+ /* 0x53 */ TATL_HINT_ID_POE_SISTER_AMY,
+ /* 0x54 */ TATL_HINT_ID_PIRATE,
+ /* 0x55 */ TATL_HINT_ID_STALCHILD,
+ /* 0x56 */ TATL_HINT_ID_ICE_KEESE,
+ /* 0x57 */ TATL_HINT_ID_WHITE_WOLFOS,
+ /* 0x58 */ TATL_HINT_ID_GUAY,
+ /* 0x59 */ TATL_HINT_ID_BIG_OCTO,
+ /* 0x5A */ TATL_HINT_ID_BIG_POE,
+ /* 0x5B */ TATL_HINT_ID_SKULLFISH,
+ /* 0x5C */ TATL_HINT_ID_DESBREKO,
+ /* 0x5D */ TATL_HINT_ID_GREEN_CHUCHU,
+ /* 0x5E */ TATL_HINT_ID_ODOLWA_1,
+ /* 0x5F */ TATL_HINT_ID_GEKKO_GIANT_SLIME,
+ /* 0x60 */ TATL_HINT_ID_BAD_BAT,
+ /* 0x61 */ TATL_HINT_ID_REAL_BOMBCHU,
+ /* 0x62 */ TATL_HINT_ID_ODOLWA_2,
+ /* 0x63 */ TATL_HINT_ID_ODOLWA_3,
+ /* 0x64 */ TATL_HINT_ID_MUSHROOM,
+ /* 0xFF */ TATL_HINT_ID_NONE = 0xFF
+} TatlHintId;
+
#endif
diff --git a/include/z64audio.h b/include/z64audio.h
index 4095251ca6..fc9bf9f4c9 100644
--- a/include/z64audio.h
+++ b/include/z64audio.h
@@ -10,6 +10,12 @@
#define IS_SEQUENCE_CHANNEL_VALID(ptr) ((uintptr_t)(ptr) != (uintptr_t)&gAudioContext.sequenceChannelNone)
#define SEQ_NUM_CHANNELS 16
+typedef enum {
+ /* 0 */ SEQPLAYER_STATE_0,
+ /* 1 */ SEQPLAYER_STATE_1, // Fading in
+ /* 2 */ SEQPLAYER_STATE_2 // Fading out
+} SeqPlayerState;
+
#define MAX_CHANNELS_PER_BANK 3
#define MUTE_FLAGS_3 (1 << 3) // prevent further noteSubEus from playing
@@ -27,6 +33,21 @@
#define AIBUF_LEN 0x580
+// Must be the same amount of samples as copied by aDuplicate() (audio microcode)
+#define WAVE_SAMPLE_COUNT 64
+
+#define AUDIO_RELOCATED_ADDRESS_START K0BASE
+
+typedef enum {
+ /* 0x1 */ AUDIO_ERROR_NO_INST = 1,
+ /* 0x3 */ AUDIO_ERROR_INVALID_INST_ID = 3,
+ /* 0x4 */ AUDIO_ERROR_INVALID_DRUM_SFX_ID,
+ /* 0x5 */ AUDIO_ERROR_NO_DRUM_SFX,
+ /* 0x10 */ AUDIO_ERROR_FONT_NOT_LOADED = 0x10
+} AudioError;
+
+#define AUDIO_ERROR(fontId, id, err) (((fontId << 8) + id) + (err << 24))
+
typedef enum {
/* 0 */ SOUNDMODE_STEREO,
/* 1 */ SOUNDMODE_HEADSET,
@@ -157,20 +178,20 @@ typedef struct {
typedef struct {
/* 0x00 */ u32 unk_0 : 1;
- /* 0x00 */ u32 codec : 3;
- /* 0x00 */ u32 medium : 2;
- /* 0x00 */ u32 unk_bit26 : 1;
- /* 0x00 */ u32 unk_bit25 : 1;
- /* 0x01 */ u32 size : 24;
- /* 0x04 */ u8* sampleAddr;
- /* 0x08 */ AdpcmLoop* loop;
- /* 0x0C */ AdpcmBook* book;
-} SoundFontSample; // size = 0x10
+ /* 0x00 */ u32 codec : 3; // The state of compression or decompression
+ /* 0x00 */ u32 medium : 2; // Medium where sample is currently stored
+ /* 0x00 */ u32 unk_bit26 : 1; // Has the sample header been relocated (offsets to pointers)
+ /* 0x00 */ u32 isRelocated : 1; // Size of the sample
+ /* 0x01 */ u32 size : 24; // Size of the sample
+ /* 0x04 */ u8* sampleAddr; // Raw sample data. Offset from the start of the sample bank or absolute address to either rom or ram
+ /* 0x08 */ AdpcmLoop* loop; // Adpcm loop parameters used by the sample. Offset from the start of the sound font / pointer to ram
+ /* 0x0C */ AdpcmBook* book; // Adpcm book parameters used by the sample. Offset from the start of the sound font / pointer to ram
+} Sample; // size = 0x10
typedef struct {
- /* 0x00 */ SoundFontSample* sample;
+ /* 0x00 */ Sample* sample;
/* 0x04 */ f32 tuning; // frequency scale factor
-} SoundFontSound; // size = 0x8
+} TunedSample; // size = 0x8
typedef struct {
/* 0x00 */ s16 numSamplesAfterDownsampling; // never read
@@ -222,29 +243,33 @@ typedef struct {
/* 0x27C */ s16* unk_27C;
/* 0x280 */ s16* filterLeftState;
/* 0x284 */ s16* filterRightState;
- /* 0x288 */ SoundFontSound sound;
- /* 0x290 */ SoundFontSample sample;
+ /* 0x288 */ TunedSample tunedSample;
+ /* 0x290 */ Sample sample;
/* 0x2A0 */ AdpcmLoop loop;
} SynthesisReverb; // size = 0x2D0
typedef struct {
- /* 0x00 */ u8 loaded;
+ /* 0x00 */ u8 isRelocated; // have the envelope and all samples been relocated (offsets to pointers)
/* 0x01 */ u8 normalRangeLo;
/* 0x02 */ u8 normalRangeHi;
/* 0x03 */ u8 adsrDecayIndex; // index used to obtain adsr decay rate from adsrDecayTable
/* 0x04 */ EnvelopePoint* envelope;
- /* 0x08 */ SoundFontSound lowNotesSound;
- /* 0x10 */ SoundFontSound normalNotesSound;
- /* 0x18 */ SoundFontSound highNotesSound;
+ /* 0x08 */ TunedSample lowPitchTunedSample;
+ /* 0x10 */ TunedSample normalPitchTunedSample;
+ /* 0x18 */ TunedSample highPitchTunedSample;
} Instrument; // size = 0x20
typedef struct {
/* 0x00 */ u8 adsrDecayIndex; // index used to obtain adsr decay rate from adsrDecayTable
/* 0x01 */ u8 pan;
- /* 0x02 */ u8 loaded;
- /* 0x04 */ SoundFontSound sound;
- /* 0x14 */ EnvelopePoint* envelope;
-} Drum; // size = 0x18
+ /* 0x02 */ u8 isRelocated; // have tunedSample.sample and envelope been relocated (offsets to pointers)
+ /* 0x04 */ TunedSample tunedSample;
+ /* 0x0C */ EnvelopePoint* envelope;
+} Drum; // size = 0x10
+
+typedef struct {
+ /* 0x00 */ TunedSample tunedSample;
+} SoundEffect; // size = 0x08
typedef struct {
/* 0x00 */ u8 numInstruments;
@@ -254,7 +279,7 @@ typedef struct {
/* 0x04 */ u16 numSfx;
/* 0x08 */ Instrument** instruments;
/* 0x0C */ Drum** drums;
- /* 0x10 */ SoundFontSound* soundEffects;
+ /* 0x10 */ SoundEffect* soundEffects;
} SoundFont; // size = 0x14
typedef struct {
@@ -290,10 +315,7 @@ typedef struct {
/* 0x012 */ u16 fadeTimer;
/* 0x014 */ u16 fadeTimerUnkEu;
/* 0x016 */ u16 unk_16;
- union {
- /* 0x018 */ u8* seqData;
- /* 0x018 */ u16* seqData16;
- };
+ /* 0x018 */ u8* seqData;
/* 0x01C */ f32 fadeVolume;
/* 0x020 */ f32 fadeVelocity;
/* 0x024 */ f32 volume;
@@ -437,7 +459,7 @@ typedef struct SequenceChannel {
/* 0xD0 */ u8* sfxState; // SfxChannelState
/* 0xD4 */ s16* filter;
/* 0xD8 */ Stereo stereo;
- /* 0xDC */ s32 unk_DC;
+ /* 0xDC */ s32 startSamplePos;
/* 0xE0 */ s32 unk_E0;
} SequenceChannel; // size = 0xE4
@@ -501,7 +523,7 @@ typedef struct SequenceLayer {
/* 0x50 */ f32 noteVelocity;
/* 0x54 */ f32 noteFreqScale;
/* 0x58 */ Instrument* instrument;
- /* 0x5C */ SoundFontSound* sound;
+ /* 0x5C */ TunedSample* tunedSample;
/* 0x60 */ SequenceChannel* channel; // Not SequenceChannel?
/* 0x64 */ SeqScriptState scriptState;
/* 0x80 */ AudioListItem listItem;
@@ -557,12 +579,18 @@ typedef struct {
/* 0x1A */ u16 delay;
} VibratoState; // size = 0x1C
+typedef enum {
+ /* 0 */ PLAYBACK_STATUS_0,
+ /* 1 */ PLAYBACK_STATUS_1,
+ /* 2 */ PLAYBACK_STATUS_2
+} NotePlaybackStatus;
+
typedef struct {
/* 0x00 */ u8 priority;
/* 0x01 */ u8 waveId;
- /* 0x02 */ u8 sampleCountIndex;
+ /* 0x02 */ u8 harmonicIndex; // the harmonic index for the synthetic wave contained in gWaveSamples (also matches the base 2 logarithm of the harmonic order)
/* 0x03 */ u8 fontId;
- /* 0x04 */ u8 unk_04;
+ /* 0x04 */ u8 status;
/* 0x05 */ u8 stereoHeadsetEffects;
/* 0x06 */ s16 adsrVolScaleUnused;
/* 0x08 */ f32 portamentoFreqScale;
@@ -575,7 +603,7 @@ typedef struct {
/* 0x54 */ Portamento portamento;
/* 0x60 */ VibratoState vibratoState;
/* 0x7C */ char unk_7C[0x8];
- /* 0x84 */ u32 unk_84;
+ /* 0x84 */ u32 startSamplePos;
} NotePlaybackState; // size = 0x88
typedef struct {
@@ -600,16 +628,16 @@ typedef struct {
/* 0x03 */ u8 headsetPanRight;
/* 0x04 */ u8 headsetPanLeft;
/* 0x05 */ u8 reverbVol;
- /* 0x06 */ u8 unk_06;
+ /* 0x06 */ u8 harmonicIndexCurAndPrev; // bits 3..2 store curHarmonicIndex, bits 1..0 store prevHarmonicIndex
/* 0x07 */ u8 unk_07;
/* 0x08 */ u16 targetVolLeft;
/* 0x0A */ u16 targetVolRight;
/* 0x0C */ u16 resamplingRateFixedPoint;
/* 0x0E */ u16 unk_0E;
- union {
- /* 0x10 */ SoundFontSound* soundFontSound;
- /* 0x10 */ s16* samples; // used for synthetic waves
- } sound;
+ union {
+ /* 0x10 */ TunedSample* tunedSample;
+ /* 0x10 */ s16* waveSampleAddr; // used for synthetic waves
+ };
/* 0x14 */ s16* filter;
/* 0x18 */ u8 unk_18;
/* 0x19 */ u8 unk_19;
@@ -640,7 +668,7 @@ typedef struct {
} ReverbSettings; // size = 0x18
/**
- * The high-level audio specifications requested when initializing or resetting the audio heap.
+ * The high-level audio specifications requested when initializing or resetting the audio pool.
* Most often resets during scene transitions, but will highly depend on game play.
*/
typedef struct {
@@ -648,7 +676,8 @@ typedef struct {
/* 0x04 */ u8 unk_04;
/* 0x05 */ u8 numNotes;
/* 0x06 */ u8 numSequencePlayers;
- /* 0x07 */ u8 unk_07[0x2]; // unused, set to zero
+ /* 0x07 */ u8 unk_07; // unused, set to zero
+ /* 0x08 */ u8 unk_08; // unused, set to zero
/* 0x09 */ u8 numReverbs;
/* 0x0C */ ReverbSettings* reverbSettings;
/* 0x10 */ u16 sampleDmaBufSize1;
@@ -675,17 +704,17 @@ typedef struct {
/* 0x02 */ u16 samplingFreq; // Target sampling rate in Hz
/* 0x04 */ u16 aiSamplingFreq; // True sampling rate set to the audio interface (AI) for the audio digital-analog converter (DAC)
/* 0x06 */ s16 samplesPerFrameTarget;
- /* 0x08 */ s16 maxAiBufferLength;
- /* 0x0A */ s16 minAiBufferLength;
- /* 0x0C */ s16 updatesPerFrame;
+ /* 0x08 */ s16 maxAiBufNumSamples;
+ /* 0x0A */ s16 minAiBufNumSamples;
+ /* 0x0C */ s16 updatesPerFrame; // for each frame of the audio thread (default 60 fps), number of updates to process audio
/* 0x0E */ s16 samplesPerUpdate;
/* 0x10 */ s16 samplesPerUpdateMax;
/* 0x12 */ s16 samplesPerUpdateMin;
/* 0x14 */ s16 numSequencePlayers;
/* 0x18 */ f32 resampleRate;
- /* 0x1C */ f32 updatesPerFrameInv;
- /* 0x20 */ f32 unkUpdatesPerFrameScaled;
- /* 0x24 */ f32 unk_24;
+ /* 0x1C */ f32 updatesPerFrameInv; // inverse (reciprocal) of updatesPerFrame
+ /* 0x20 */ f32 updatesPerFrameInvScaled; // updatesPerFrameInv scaled down by a factor of 256
+ /* 0x24 */ f32 updatesPerFrameScaled; // updatesPerFrame scaled down by a factor of 4
} AudioBufferParameters; // size = 0x28
/**
@@ -767,7 +796,7 @@ typedef struct {
typedef struct {
/* 0x00 */ u32 endAndMediumKey;
- /* 0x04 */ SoundFontSample* sample;
+ /* 0x04 */ Sample* sample;
/* 0x08 */ u8* ramAddr;
/* 0x0C */ u32 encodedInfo;
/* 0x10 */ s32 isFree;
@@ -822,7 +851,7 @@ typedef struct {
/* 0x14 */ s32 status;
/* 0x18 */ size_t bytesRemaining;
/* 0x1C */ s8* isDone; // TODO: rename in OoT and sync up here. This is an external status while (s32 status) is an internal status
- /* 0x20 */ SoundFontSample sample;
+ /* 0x20 */ Sample sample;
/* 0x30 */ OSMesgQueue msgqueue;
/* 0x48 */ OSMesg msg;
/* 0x4C */ OSIoMesg ioMesg;
@@ -873,7 +902,7 @@ typedef struct {
/* 0x0014 */ NoteSubEu* noteSubsEu;
/* 0x0018 */ SynthesisReverb synthesisReverbs[4];
/* 0x0B58 */ char unk_0B58[0x30];
- /* 0x0B88 */ SoundFontSample* usedSamples[128];
+ /* 0x0B88 */ Sample* usedSamples[128];
/* 0x0D88 */ AudioPreloadReq preloadSampleStack[128];
/* 0x1788 */ s32 numUsedSamples;
/* 0x178C */ s32 preloadSampleStackTop;
@@ -889,7 +918,7 @@ typedef struct {
/* 0x1E58 */ OSMesg externalLoadMesgBuf[0x10];
/* 0x1E98 */ OSMesgQueue preloadSampleQueue;
/* 0x1EB0 */ OSMesg preloadSampleMesgBuf[0x10];
- /* 0x1EF0 */ OSMesgQueue currAudioFrameDmaQueue;
+ /* 0x1EF0 */ OSMesgQueue curAudioFrameDmaQueue;
/* 0x1F08 */ OSMesg currAudioFrameDmaMesgBuf[0x40];
/* 0x2008 */ OSIoMesg currAudioFrameDmaIoMesgBuf[0x40];
/* 0x2608 */ OSMesgQueue syncDmaQueue;
@@ -911,7 +940,7 @@ typedef struct {
/* 0x285C */ char unk_285C[0x4];
/* 0x2860 */ u8* sequenceFontTable;
/* 0x2864 */ u16 numSequences;
- /* 0x2868 */ SoundFont* soundFonts;
+ /* 0x2868 */ SoundFont* soundFontList;
/* 0x286C */ AudioBufferParameters audioBufferParameters;
/* 0x2994 */ f32 unk_2870;
/* 0x2898 */ s32 sampleDmaBufSize1;
@@ -925,7 +954,7 @@ typedef struct {
/* 0x28C0 */ s32 totalTaskCount; // The total number of times the top-level function on the audio thread is run since the last audio reset
/* 0x28C4 */ s32 curAudioFrameDmaCount;
/* 0x28C8 */ s32 rspTaskIndex;
- /* 0x28CC */ s32 curAiBuffferIndex;
+ /* 0x28CC */ s32 curAiBufferIndex;
/* 0x28AC */ Acmd* abiCmdBufs[2]; // Pointer to audio heap where the audio binary interface command lists are stored. Two lists that alternative every frame
/* 0x28B4 */ Acmd* curAbiCmdBuf;
/* 0x28DC */ AudioTask* curTask;
@@ -933,16 +962,16 @@ typedef struct {
/* 0x2980 */ f32 unk_2960;
/* 0x2984*/ s32 refreshRate;
/* 0x2988 */ s16* aiBuffers[3]; // Pointers to the audio buffer allocated on the initPool contained in the audio heap. Stores fully processed digital audio before transferring to the audio interface (AI)
- /* 0x2994 */ s16 aiBufLengths[3]; // Number of bytes to transfer to the audio interface buffer
+ /* 0x2994 */ s16 aiBufNumSamples[3]; // Number of samples to transfer to the audio interface buffer
/* 0x299C */ u32 audioRandom;
/* 0x29A0 */ s32 audioErrorFlags;
/* 0x29A4 */ volatile u32 resetTimer;
/* 0x29A8 */ u32 (*unk_29A8[4])(s8 value, SequenceChannel* channel);
/* 0x29B8 */ s8 unk_29B8;
/* 0x29BC */ s32 unk_29BC; // sMaxAbiCmdCnt
- /* 0x29C0 */ AudioAllocPool audioSessionPool; // A sub-pool to main pool, contains all sub-pools and data that changes every audio reset
+ /* 0x29C0 */ AudioAllocPool sessionPool; // A sub-pool to main pool, contains all sub-pools and data that changes every audio reset
/* 0x29D0 */ AudioAllocPool externalPool; // pool allocated on an external device. Never used in game
- /* 0x29E0 */ AudioAllocPool audioInitPool; // A sub-pool to the main pool, contains all sub-pools and data that persists every audio reset
+ /* 0x29E0 */ AudioAllocPool initPool; // A sub-pool to the main pool, contains all sub-pools and data that persists every audio reset
/* 0x29F0 */ AudioAllocPool miscPool; // A sub-pool to the session pool,
/* 0x2A00 */ char unk_29D0[0x20]; // probably two unused pools
/* 0x2A20 */ AudioAllocPool cachePool; // The common pool for all cache entries
@@ -978,7 +1007,7 @@ typedef struct {
/* 0x7978 */ u8 cmdWritePos;
/* 0x7979 */ u8 cmdReadPos;
/* 0x797A */ u8 cmdQueueFinished;
- /* 0x797C */ u16 activeChannelsFlags[5]; // bitwise flag for 16 channels. Only channels with bit turned on will be processed
+ /* 0x797C */ u16 activeChannelsFlags[5]; // bit-packed for 16 channels. Only channels with bit turned on will be processed
/* 0x7988 */ OSMesgQueue* audioResetQueueP;
/* 0x798C */ OSMesgQueue* taskStartQueueP;
/* 0x7990 */ OSMesgQueue* cmdProcQueueP;
@@ -1008,9 +1037,9 @@ typedef struct {
typedef struct {
/* 0x0 */ size_t heapSize; // total number of bytes allocated to the audio heap. Must be <= the size of `gAudioHeap` (ideally about the same size)
- /* 0x4 */ size_t mainPoolSplitSize; // The entire audio heap is split into two pools.
+ /* 0x4 */ size_t initPoolSize; // The entire audio heap is split into two pools.
/* 0x8 */ size_t permanentPoolSize;
-} AudioContextInitSizes; // size = 0xC
+} AudioHeapInitSizes; // size = 0xC
typedef struct {
/* 0x00 */ f32 unk_00;
diff --git a/include/z64math.h b/include/z64math.h
index 16ab72e8a3..323042b15b 100644
--- a/include/z64math.h
+++ b/include/z64math.h
@@ -101,6 +101,9 @@ typedef struct {
#define BINANG_LERPIMP(v0, v1, t) ((v0) + (s16)(BINANG_SUB((v1), (v0)) * (t)))
#define BINANG_LERPIMPINV(v0, v1, t) ((v0) + BINANG_SUB((v1), (v0)) / (t))
+#define LERPWEIGHT(val, prev, next) (((val) - (prev)) / ((next) - (prev)))
+#define F32_LERPWEIGHT(val, prev, next) (((f32)(val) - (f32)(prev)) / ((f32)(next) - (f32)(prev)))
+
#define VEC3F_LERPIMPDST(dst, v0, v1, t){ \
(dst)->x = (v0)->x + (((v1)->x - (v0)->x) * t); \
(dst)->y = (v0)->y + (((v1)->y - (v0)->y) * t); \
diff --git a/include/z64save.h b/include/z64save.h
index 882a334bd1..2185b04c5a 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -7,7 +7,7 @@
struct GameState;
struct PlayState;
-struct FileChooseContext;
+struct FileSelectState;
// TODO: properly name DOWN, RETURN and TOP
typedef enum RespawnMode {
@@ -24,6 +24,36 @@ typedef enum RespawnMode {
#define SAVE_BUFFER_SIZE 0x4000
+typedef enum {
+ /* 0 */ MAGIC_STATE_IDLE, // Regular gameplay
+ /* 1 */ MAGIC_STATE_CONSUME_SETUP, // Sets the speed at which the magic border flashes
+ /* 2 */ MAGIC_STATE_CONSUME, // Consume magic until target is reached or no more magic is available
+ /* 3 */ MAGIC_STATE_METER_FLASH_1, // Flashes border
+ /* 4 */ MAGIC_STATE_METER_FLASH_2, // Flashes border and draws yellow magic to preview target consumption
+ /* 5 */ MAGIC_STATE_RESET, // Reset colors and return to idle
+ /* 6 */ MAGIC_STATE_METER_FLASH_3, // Flashes border with no additional behaviour
+ /* 7 */ MAGIC_STATE_CONSUME_LENS, // Magic slowly consumed by Lens of Truth
+ /* 8 */ MAGIC_STATE_STEP_CAPACITY, // Step `magicCapacity` to full capacity
+ /* 9 */ MAGIC_STATE_FILL, // Add magic until magicFillTarget is reached
+ /* 10 */ MAGIC_STATE_CONSUME_GORON_ZORA_SETUP,
+ /* 11 */ MAGIC_STATE_CONSUME_GORON_ZORA, // Magic slowly consumed by Goron spiked rolling or Zora electric barrier.
+ /* 12 */ MAGIC_STATE_CONSUME_GIANTS_MASK // Magic slowly consumed by Giant's Mask
+} MagicState;
+
+typedef enum {
+ /* 0 */ MAGIC_CONSUME_NOW, // Consume magic immediately without preview
+ /* 1 */ MAGIC_CONSUME_WAIT_NO_PREVIEW, // Sets consume target but waits to consume. No yellow magic preview to target consumption. Unused
+ /* 2 */ MAGIC_CONSUME_NOW_ALT, // Identical behaviour to MAGIC_CONSUME_NOW. Unused
+ /* 3 */ MAGIC_CONSUME_LENS, // Lens of Truth consumption
+ /* 4 */ MAGIC_CONSUME_WAIT_PREVIEW, // Sets consume target but waits to consume. Show magic to be consumed in yellow.
+ /* 5 */ MAGIC_CONSUME_GORON_ZORA, // Goron spiked rolling or Zora electric barrier slow consumption
+ /* 6 */ MAGIC_CONSUME_GIANTS_MASK, // Giant's Mask slow consumption
+ /* 7 */ MAGIC_CONSUME_DEITY_BEAM // Fierce Deity Beam consumption, consumed magic now and not via request
+} MagicChangeType;
+
+#define MAGIC_NORMAL_METER 0x30
+#define MAGIC_DOUBLE_METER (2 * MAGIC_NORMAL_METER)
+
typedef struct SramContext {
/* 0x00 */ u8* readBuff;
/* 0x04 */ u8 *saveBuf;
@@ -105,13 +135,13 @@ typedef struct SavePlayerData {
/* 0x08 */ char playerName[8]; // "player_name"
/* 0x10 */ s16 healthCapacity; // "max_life"
/* 0x12 */ s16 health; // "now_life"
- /* 0x14 */ s8 magicLevel; // "magic_max"
- /* 0x15 */ s8 magic; // "magic_now"
+ /* 0x14 */ s8 magicLevel; // 0 for no magic/new load, 1 for magic, 2 for double magic "magic_max"
+ /* 0x15 */ s8 magic; // current magic available for use "magic_now"
/* 0x16 */ s16 rupees; // "lupy_count"
/* 0x18 */ u16 swordHealth; // "long_sword_hp"
/* 0x1A */ u16 tatlTimer; // "navi_timer"
- /* 0x1C */ u8 magicAcquired; // "magic_mode"
- /* 0x1D */ u8 doubleMagic; // "magic_ability"
+ /* 0x1C */ u8 isMagicAcquired; // "magic_mode"
+ /* 0x1D */ u8 isDoubleMagicAcquired; // "magic_ability"
/* 0x1E */ u8 doubleDefense; // "life_ability"
/* 0x1F */ u8 unk_1F; // "ocarina_round"
/* 0x20 */ u8 unk_20; // "first_memory"
@@ -226,13 +256,13 @@ typedef struct SaveContext {
/* 0x3F22 */ u16 unk_3F22; // "prev_alpha_type"
/* 0x3F24 */ u16 unk_3F24; // "alpha_count"
/* 0x3F26 */ u16 unk_3F26; // "last_time_type"
- /* 0x3F28 */ s16 unk_3F28; // "magic_flag"
- /* 0x3F2A */ s16 unk_3F2A; // "recovery_magic_flag"
- /* 0x3F2C */ s16 unk_3F2C; // "keep_magic_flag"
- /* 0x3F2E */ s16 unk_3F2E; // "magic_now_max"
- /* 0x3F30 */ s16 unk_3F30; // "magic_now_now"
- /* 0x3F32 */ s16 unk_3F32; // "magic_used"
- /* 0x3F34 */ s16 unk_3F34; // "magic_recovery"
+ /* 0x3F28 */ s16 magicState; // determines magic meter behavior on each frame "magic_flag"
+ /* 0x3F2A */ s16 isMagicRequested; // a request to add magic has been given "recovery_magic_flag"
+ /* 0x3F2C */ s16 magicFlag; // Set to 0 in func_80812D94(), otherwise unused "keep_magic_flag"
+ /* 0x3F2E */ s16 magicCapacity; // maximum magic available "magic_now_max"
+ /* 0x3F30 */ s16 magicFillTarget; // target used to fill magic "magic_now_now"
+ /* 0x3F32 */ s16 magicToConsume; // accumulated magic that is requested to be consumed "magic_used"
+ /* 0x3F34 */ s16 magicToAdd; // accumulated magic that is requested to be added "magic_recovery"
/* 0x3F36 */ u16 mapIndex; // "scene_ID"
/* 0x3F38 */ u16 minigameState; // "yabusame_mode"
/* 0x3F3A */ u16 minigameScore; // "yabusame_total"
@@ -368,15 +398,15 @@ u16 Sram_CalcChecksum(void* data, size_t count);
void Sram_InitNewSave(void);
void Sram_InitDebugSave(void);
void func_80144A94(SramContext* sramCtx);
-void Sram_OpenSave(struct FileChooseContext* fileChooseCtx, SramContext* sramCtx);
+void Sram_OpenSave(struct FileSelectState* fileSelect, SramContext* sramCtx);
void func_8014546C(SramContext* sramCtx);
-void func_801457CC(struct FileChooseContext* fileChooseCtx, SramContext* sramCtx);
-void func_80146580(struct FileChooseContext* fileChooseCtx, SramContext* sramCtx, s32 fileNum);
-void func_80146628(struct FileChooseContext* fileChooseCtx, SramContext* sramCtx);
-void Sram_InitSave(struct FileChooseContext* fileChooseCtx, SramContext* sramCtx);
+void func_801457CC(struct FileSelectState* fileSelect, SramContext* sramCtx);
+void func_80146580(struct FileSelectState* fileSelect, SramContext* sramCtx, s32 fileNum);
+void func_80146628(struct FileSelectState* fileSelect, SramContext* sramCtx);
+void Sram_InitSave(struct FileSelectState* fileSelect, SramContext* sramCtx);
void func_80146DF8(SramContext* sramCtx);
void Sram_InitSram(struct GameState* gameState, SramContext* sramCtx);
-void Sram_Alloc(struct GameState* gamestate, SramContext* sramCtx);
+void Sram_Alloc(struct GameState* gameState, SramContext* sramCtx);
void Sram_SaveSpecialEnterClockTown(struct PlayState* play);
void Sram_SaveSpecialNewDay(struct PlayState* play);
void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages);
diff --git a/include/z_prenmi.h b/include/z_prenmi.h
new file mode 100644
index 0000000000..1aa1e6f998
--- /dev/null
+++ b/include/z_prenmi.h
@@ -0,0 +1,15 @@
+#ifndef Z64_PRENMI_H
+#define Z64_PRENMI_H
+
+#include "global.h"
+
+void PreNMI_Destroy(GameState* thisx);
+void PreNMI_Init(GameState* thisx);
+
+typedef struct {
+ /* 0x00 */ GameState state;
+ /* 0xA4 */ u32 timer;
+ /* 0xA8 */ UNK_TYPE4 unkA8;
+} PreNMIState; // size = 0xAC
+
+#endif
diff --git a/include/z_title_setup.h b/include/z_title_setup.h
new file mode 100644
index 0000000000..685b87c799
--- /dev/null
+++ b/include/z_title_setup.h
@@ -0,0 +1,13 @@
+#ifndef Z64_TITLE_SETUP_H
+#define Z64_TITLE_SETUP_H
+
+#include "global.h"
+
+void Setup_Destroy(GameState* gameState);
+void Setup_Init(GameState* gameState);
+
+typedef struct {
+ /* 0x00 */ GameState state;
+} SetupState; // size = 0xA4
+
+#endif
diff --git a/spec b/spec
index 169ef792bc..bbbd3fc8cb 100644
--- a/spec
+++ b/spec
@@ -273,7 +273,8 @@ endseg
beginseg
name "link_animetion"
romalign 0x1000
- include "build/baserom/link_animetion.o"
+ include "build/assets/misc/link_animetion/link_animetion.o"
+ number 7
endseg
beginseg
@@ -702,6 +703,7 @@ beginseg
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.o"
+ include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.o"
include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.bss.o"
include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.reloc.o"
@@ -882,8 +884,7 @@ beginseg
name "ovl_En_Bubble"
compress
include "build/src/overlays/actors/ovl_En_Bubble/z_en_bubble.o"
- include "build/data/ovl_En_Bubble/ovl_En_Bubble.data.o"
- include "build/data/ovl_En_Bubble/ovl_En_Bubble.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Bubble/ovl_En_Bubble_reloc.o"
endseg
beginseg
@@ -1162,8 +1163,7 @@ beginseg
name "ovl_En_Encount1"
compress
include "build/src/overlays/actors/ovl_En_Encount1/z_en_encount1.o"
- include "build/data/ovl_En_Encount1/ovl_En_Encount1.data.o"
- include "build/data/ovl_En_Encount1/ovl_En_Encount1.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Encount1/ovl_En_Encount1_reloc.o"
endseg
beginseg
@@ -1643,8 +1643,7 @@ beginseg
name "ovl_En_Js"
compress
include "build/src/overlays/actors/ovl_En_Js/z_en_js.o"
- include "build/data/ovl_En_Js/ovl_En_Js.data.o"
- include "build/data/ovl_En_Js/ovl_En_Js.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Js/ovl_En_Js_reloc.o"
endseg
beginseg
@@ -1695,8 +1694,7 @@ beginseg
name "ovl_Oceff_Spot"
compress
include "build/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.o"
- include "build/data/ovl_Oceff_Spot/ovl_Oceff_Spot.data.o"
- include "build/data/ovl_Oceff_Spot/ovl_Oceff_Spot.reloc.o"
+ include "build/src/overlays/actors/ovl_Oceff_Spot/ovl_Oceff_Spot_reloc.o"
endseg
beginseg
@@ -1740,8 +1738,7 @@ beginseg
name "ovl_Effect_Ss_Dust"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.o"
- include "build/data/ovl_Effect_Ss_Dust/ovl_Effect_Ss_Dust.data.o"
- include "build/data/ovl_Effect_Ss_Dust/ovl_Effect_Ss_Dust.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_Dust/ovl_Effect_Ss_Dust_reloc.o"
endseg
beginseg
@@ -1755,16 +1752,14 @@ beginseg
name "ovl_Effect_Ss_Bomb2"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.o"
- include "build/data/ovl_Effect_Ss_Bomb2/ovl_Effect_Ss_Bomb2.data.o"
- include "build/data/ovl_Effect_Ss_Bomb2/ovl_Effect_Ss_Bomb2.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_Bomb2/ovl_Effect_Ss_Bomb2_reloc.o"
endseg
beginseg
name "ovl_Effect_Ss_Blast"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.o"
- include "build/data/ovl_Effect_Ss_Blast/ovl_Effect_Ss_Blast.data.o"
- include "build/data/ovl_Effect_Ss_Blast/ovl_Effect_Ss_Blast.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_Blast/ovl_Effect_Ss_Blast_reloc.o"
endseg
beginseg
@@ -1778,8 +1773,7 @@ beginseg
name "ovl_Effect_Ss_D_Fire"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.o"
- include "build/data/ovl_Effect_Ss_D_Fire/ovl_Effect_Ss_D_Fire.data.o"
- include "build/data/ovl_Effect_Ss_D_Fire/ovl_Effect_Ss_D_Fire.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_D_Fire/ovl_Effect_Ss_D_Fire_reloc.o"
endseg
beginseg
@@ -1821,8 +1815,7 @@ beginseg
name "ovl_Effect_Ss_Dt_Bubble"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.o"
- include "build/data/ovl_Effect_Ss_Dt_Bubble/ovl_Effect_Ss_Dt_Bubble.data.o"
- include "build/data/ovl_Effect_Ss_Dt_Bubble/ovl_Effect_Ss_Dt_Bubble.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/ovl_Effect_Ss_Dt_Bubble_reloc.o"
endseg
beginseg
@@ -1928,8 +1921,7 @@ beginseg
name "ovl_Effect_Ss_Dead_Db"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.o"
- include "build/data/ovl_Effect_Ss_Dead_Db/ovl_Effect_Ss_Dead_Db.data.o"
- include "build/data/ovl_Effect_Ss_Dead_Db/ovl_Effect_Ss_Dead_Db.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_Dead_Db/ovl_Effect_Ss_Dead_Db_reloc.o"
endseg
beginseg
@@ -1943,8 +1935,7 @@ beginseg
name "ovl_Effect_Ss_Dead_Ds"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.o"
- include "build/data/ovl_Effect_Ss_Dead_Ds/ovl_Effect_Ss_Dead_Ds.data.o"
- include "build/data/ovl_Effect_Ss_Dead_Ds/ovl_Effect_Ss_Dead_Ds.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/ovl_Effect_Ss_Dead_Ds_reloc.o"
endseg
beginseg
@@ -1980,18 +1971,14 @@ beginseg
name "ovl_Oceff_Wipe2"
compress
include "build/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.o"
- include "build/data/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.data.o"
- include "build/data/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.bss.o"
- include "build/data/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.reloc.o"
+ include "build/src/overlays/actors/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2_reloc.o"
endseg
beginseg
name "ovl_Oceff_Wipe3"
compress
include "build/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.o"
- include "build/data/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.data.o"
- include "build/data/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.bss.o"
- include "build/data/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.reloc.o"
+ include "build/src/overlays/actors/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3_reloc.o"
endseg
beginseg
@@ -3039,9 +3026,7 @@ beginseg
name "ovl_En_Az"
compress
include "build/src/overlays/actors/ovl_En_Az/z_en_az.o"
- include "build/data/ovl_En_Az/ovl_En_Az.data.o"
- include "build/data/ovl_En_Az/ovl_En_Az.bss.o"
- include "build/data/ovl_En_Az/ovl_En_Az.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Az/ovl_En_Az_reloc.o"
endseg
beginseg
@@ -3207,9 +3192,7 @@ beginseg
name "ovl_En_Twig"
compress
include "build/src/overlays/actors/ovl_En_Twig/z_en_twig.o"
- include "build/data/ovl_En_Twig/ovl_En_Twig.data.o"
- include "build/data/ovl_En_Twig/ovl_En_Twig.bss.o"
- include "build/data/ovl_En_Twig/ovl_En_Twig.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Twig/ovl_En_Twig_reloc.o"
endseg
beginseg
@@ -3245,8 +3228,7 @@ beginseg
name "ovl_fbdemo_triforce"
compress
include "build/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.o"
- include "build/data/ovl_fbdemo_triforce/ovl_fbdemo_triforce.data.o"
- include "build/data/ovl_fbdemo_triforce/ovl_fbdemo_triforce.reloc.o"
+ include "build/src/overlays/fbdemos/ovl_fbdemo_triforce/ovl_fbdemo_triforce_reloc.o"
endseg
beginseg
@@ -3892,8 +3874,7 @@ beginseg
name "ovl_En_Bee"
compress
include "build/src/overlays/actors/ovl_En_Bee/z_en_bee.o"
- include "build/data/ovl_En_Bee/ovl_En_Bee.data.o"
- include "build/data/ovl_En_Bee/ovl_En_Bee.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Bee/ovl_En_Bee_reloc.o"
endseg
beginseg
@@ -3928,11 +3909,7 @@ beginseg
name "ovl_Obj_Kendo_Kanban"
compress
include "build/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_Obj_Kendo_Kanban/ovl_Obj_Kendo_Kanban_reloc.o"
-#else
- include "build/data/ovl_Obj_Kendo_Kanban/ovl_Obj_Kendo_Kanban.reloc.o"
-#endif
endseg
beginseg
@@ -4849,8 +4826,7 @@ beginseg
name "ovl_Obj_Usiyane"
compress
include "build/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.o"
- include "build/data/ovl_Obj_Usiyane/ovl_Obj_Usiyane.data.o"
- include "build/data/ovl_Obj_Usiyane/ovl_Obj_Usiyane.reloc.o"
+ include "build/src/overlays/actors/ovl_Obj_Usiyane/ovl_Obj_Usiyane_reloc.o"
endseg
beginseg
diff --git a/src/boot_O2_g3/idle.c b/src/boot_O2_g3/idle.c
index da93f13fdb..942435fa7b 100644
--- a/src/boot_O2_g3/idle.c
+++ b/src/boot_O2_g3/idle.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
u8 D_80096B20 = 1;
diff --git a/src/code/audio/audio_effects.c b/src/code/audio/audio_effects.c
index ab9228bbf6..bc27a6e227 100644
--- a/src/code/audio/audio_effects.c
+++ b/src/code/audio/audio_effects.c
@@ -63,7 +63,7 @@ void AudioEffects_SequencePlayerProcessSound(SequencePlayer* seqPlayer) {
}
seqPlayer->fadeTimer--;
- if (seqPlayer->fadeTimer == 0 && seqPlayer->state == 2) {
+ if ((seqPlayer->fadeTimer == 0) && (seqPlayer->state == SEQPLAYER_STATE_2)) {
AudioSeq_SequencePlayerDisable(seqPlayer);
return;
}
@@ -243,12 +243,10 @@ f32 AudioEffects_AdsrUpdate(AdsrState* adsr) {
break;
}
// fallthrough
-
case ADSR_STATE_START_LOOP:
adsr->envIndex = 0;
adsr->action.s.state = ADSR_STATE_LOOP;
// fallthrough
-
retry:
case ADSR_STATE_LOOP:
adsr->delay = adsr->envelope[adsr->envIndex].delay;
@@ -256,18 +254,21 @@ f32 AudioEffects_AdsrUpdate(AdsrState* adsr) {
case ADSR_DISABLE:
adsr->action.s.state = ADSR_STATE_DISABLED;
break;
+
case ADSR_HANG:
adsr->action.s.state = ADSR_STATE_HANG;
break;
+
case ADSR_GOTO:
adsr->envIndex = adsr->envelope[adsr->envIndex].arg;
goto retry;
+
case ADSR_RESTART:
adsr->action.s.state = ADSR_STATE_INITIAL;
break;
default:
- adsr->delay *= gAudioContext.audioBufferParameters.unk_24;
+ adsr->delay *= gAudioContext.audioBufferParameters.updatesPerFrameScaled;
if (adsr->delay == 0) {
adsr->delay = 1;
}
@@ -282,14 +283,13 @@ f32 AudioEffects_AdsrUpdate(AdsrState* adsr) {
break;
}
// fallthrough
-
case ADSR_STATE_FADE:
adsr->current += adsr->velocity;
- if (--adsr->delay <= 0) {
+ adsr->delay--;
+ if (adsr->delay <= 0) {
adsr->action.s.state = ADSR_STATE_LOOP;
}
// fallthrough
-
case ADSR_STATE_HANG:
break;
diff --git a/src/code/audio/audio_heap.c b/src/code/audio/audio_heap.c
index 7d3ea8ba66..667cd1c400 100644
--- a/src/code/audio/audio_heap.c
+++ b/src/code/audio/audio_heap.c
@@ -4,7 +4,7 @@ void* AudioHeap_SearchRegularCaches(s32 tableType, s32 cache, s32 id);
void AudioHeap_InitSampleCaches(size_t persistentSampleCacheSize, size_t temporarySampleCacheSize);
SampleCacheEntry* AudioHeap_AllocTemporarySampleCacheEntry(size_t size);
void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry);
-void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, SoundFontSample* sample);
+void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, Sample* sample);
SampleCacheEntry* AudioHeap_AllocPersistentSampleCacheEntry(size_t size);
void AudioHeap_DiscardSampleCaches(void);
void AudioHeap_DiscardSampleBank(s32 sampleBankId);
@@ -14,29 +14,37 @@ void AudioHeap_InitReverb(s32 reverbIndex, ReverbSettings* settings, s32 flags);
#define gTatumsPerBeat (gAudioTatumInit[1])
-f32 func_8018B0F0(f32 arg0) {
- return 256.0f * gAudioContext.audioBufferParameters.unkUpdatesPerFrameScaled / arg0;
+/**
+ * Effectively scales `updatesPerFrameInv` by the reciprocal of `scaleInv`
+ * `updatesPerFrameInvScaled` is just `updatesPerFrameInv` scaled down by a factor of 256.0f
+ * i.e. (256.0f * `updatesPerFrameInvScaled`) is just `updatesPerFrameInv`
+ */
+f32 AudioHeap_CalculateAdsrDecay(f32 scaleInv) {
+ return 256.0f * gAudioContext.audioBufferParameters.updatesPerFrameInvScaled / scaleInv;
}
-void func_8018B10C(void) {
+/**
+ * Initialize the decay rate table used for decaying notes as part of adsr
+ */
+void AudioHeap_InitAdsrDecayTable(void) {
s32 i;
- gAudioContext.adsrDecayTable[255] = func_8018B0F0(0.25f);
- gAudioContext.adsrDecayTable[254] = func_8018B0F0(0.33f);
- gAudioContext.adsrDecayTable[253] = func_8018B0F0(0.5f);
- gAudioContext.adsrDecayTable[252] = func_8018B0F0(0.66f);
- gAudioContext.adsrDecayTable[251] = func_8018B0F0(0.75f);
+ gAudioContext.adsrDecayTable[255] = AudioHeap_CalculateAdsrDecay(0.25f);
+ gAudioContext.adsrDecayTable[254] = AudioHeap_CalculateAdsrDecay(0.33f);
+ gAudioContext.adsrDecayTable[253] = AudioHeap_CalculateAdsrDecay(0.5f);
+ gAudioContext.adsrDecayTable[252] = AudioHeap_CalculateAdsrDecay(0.66f);
+ gAudioContext.adsrDecayTable[251] = AudioHeap_CalculateAdsrDecay(0.75f);
for (i = 128; i < 251; i++) {
- gAudioContext.adsrDecayTable[i] = func_8018B0F0(251 - i);
+ gAudioContext.adsrDecayTable[i] = AudioHeap_CalculateAdsrDecay(251 - i);
}
for (i = 16; i < 128; i++) {
- gAudioContext.adsrDecayTable[i] = func_8018B0F0(4 * (143 - i));
+ gAudioContext.adsrDecayTable[i] = AudioHeap_CalculateAdsrDecay(4 * (143 - i));
}
for (i = 1; i < 16; i++) {
- gAudioContext.adsrDecayTable[i] = func_8018B0F0(60 * (23 - i));
+ gAudioContext.adsrDecayTable[i] = AudioHeap_CalculateAdsrDecay(60 * (23 - i));
}
gAudioContext.adsrDecayTable[0] = 0.0f;
@@ -71,7 +79,7 @@ void AudioHeap_DiscardFont(s32 fontId) {
Note* note = &gAudioContext.notes[i];
if (note->playbackState.fontId == fontId) {
- if ((note->playbackState.unk_04 == 0) && (note->playbackState.priority != 0)) {
+ if ((note->playbackState.status == PLAYBACK_STATUS_0) && (note->playbackState.priority != 0)) {
note->playbackState.parentLayer->enabled = false;
note->playbackState.parentLayer->finished = true;
}
@@ -233,19 +241,19 @@ void* AudioHeap_Alloc(AudioAllocPool* pool, size_t size) {
* Initialize a pool at the requested address with the requested size.
* Store the metadata of this pool in AudioAllocPool* pool
*/
-void AudioHeap_AllocPoolInit(AudioAllocPool* pool, void* addr, size_t size) {
+void AudioHeap_InitPool(AudioAllocPool* pool, void* addr, size_t size) {
pool->curAddr = pool->startAddr = (u8*)ALIGN16((uintptr_t)addr);
pool->size = size - ((uintptr_t)addr & 0xF);
pool->count = 0;
}
-void AudioHeap_ClearPersistentCache(AudioPersistentCache* persistent) {
+void AudioHeap_InitPersistentCache(AudioPersistentCache* persistent) {
persistent->pool.count = 0;
persistent->numEntries = 0;
persistent->pool.curAddr = persistent->pool.startAddr;
}
-void AudioHeap_ClearTemporaryCache(AudioTemporaryCache* temporary) {
+void AudioHeap_InitTemporaryCache(AudioTemporaryCache* temporary) {
temporary->pool.count = 0;
temporary->pool.curAddr = temporary->pool.startAddr;
temporary->nextSide = 0;
@@ -260,7 +268,7 @@ void AudioHeap_ResetPool(AudioAllocPool* pool) {
pool->curAddr = pool->startAddr;
}
-void AudioHeap_PopCache(s32 tableType) {
+void AudioHeap_PopPersistentCache(s32 tableType) {
AudioCache* loadedCache;
AudioAllocPool* persistentHeap;
AudioPersistentCache* persistent;
@@ -306,69 +314,65 @@ void AudioHeap_PopCache(s32 tableType) {
persistent->numEntries--;
}
-void AudioHeap_InitMainPool(size_t mainPoolSplitSize) {
- AudioHeap_AllocPoolInit(&gAudioContext.audioInitPool, gAudioContext.audioHeap, mainPoolSplitSize);
- AudioHeap_AllocPoolInit(&gAudioContext.audioSessionPool, gAudioContext.audioHeap + mainPoolSplitSize,
- gAudioContext.audioHeapSize - mainPoolSplitSize);
+void AudioHeap_InitMainPool(size_t initPoolSize) {
+ AudioHeap_InitPool(&gAudioContext.initPool, gAudioContext.audioHeap, initPoolSize);
+ AudioHeap_InitPool(&gAudioContext.sessionPool, gAudioContext.audioHeap + initPoolSize,
+ gAudioContext.audioHeapSize - initPoolSize);
gAudioContext.externalPool.startAddr = NULL;
}
void AudioHeap_InitSessionPool(AudioSessionPoolSplit* split) {
- gAudioContext.audioSessionPool.curAddr = gAudioContext.audioSessionPool.startAddr;
+ gAudioContext.sessionPool.curAddr = gAudioContext.sessionPool.startAddr;
- AudioHeap_AllocPoolInit(&gAudioContext.miscPool,
- AudioHeap_Alloc(&gAudioContext.audioSessionPool, split->miscPoolSize), split->miscPoolSize);
- AudioHeap_AllocPoolInit(&gAudioContext.cachePool,
- AudioHeap_Alloc(&gAudioContext.audioSessionPool, split->cachePoolSize),
- split->cachePoolSize);
+ AudioHeap_InitPool(&gAudioContext.miscPool, AudioHeap_Alloc(&gAudioContext.sessionPool, split->miscPoolSize),
+ split->miscPoolSize);
+ AudioHeap_InitPool(&gAudioContext.cachePool, AudioHeap_Alloc(&gAudioContext.sessionPool, split->cachePoolSize),
+ split->cachePoolSize);
}
void AudioHeap_InitCachePool(AudioCachePoolSplit* split) {
gAudioContext.cachePool.curAddr = gAudioContext.cachePool.startAddr;
- AudioHeap_AllocPoolInit(&gAudioContext.persistentCommonPool,
- AudioHeap_Alloc(&gAudioContext.cachePool, split->persistentCommonPoolSize),
- split->persistentCommonPoolSize);
- AudioHeap_AllocPoolInit(&gAudioContext.temporaryCommonPool,
- AudioHeap_Alloc(&gAudioContext.cachePool, split->temporaryCommonPoolSize),
- split->temporaryCommonPoolSize);
+ AudioHeap_InitPool(&gAudioContext.persistentCommonPool,
+ AudioHeap_Alloc(&gAudioContext.cachePool, split->persistentCommonPoolSize),
+ split->persistentCommonPoolSize);
+ AudioHeap_InitPool(&gAudioContext.temporaryCommonPool,
+ AudioHeap_Alloc(&gAudioContext.cachePool, split->temporaryCommonPoolSize),
+ split->temporaryCommonPoolSize);
}
-void AudioHeap_InitPersistentCache(AudioCommonPoolSplit* split) {
+void AudioHeap_InitPersistentPoolsAndCaches(AudioCommonPoolSplit* split) {
gAudioContext.persistentCommonPool.curAddr = gAudioContext.persistentCommonPool.startAddr;
- AudioHeap_AllocPoolInit(&gAudioContext.seqCache.persistent.pool,
- AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->seqCacheSize),
- split->seqCacheSize);
- AudioHeap_AllocPoolInit(&gAudioContext.fontCache.persistent.pool,
- AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->fontCacheSize),
- split->fontCacheSize);
- AudioHeap_AllocPoolInit(&gAudioContext.sampleBankCache.persistent.pool,
- AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->sampleBankCacheSize),
- split->sampleBankCacheSize);
+ AudioHeap_InitPool(&gAudioContext.seqCache.persistent.pool,
+ AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->seqCacheSize), split->seqCacheSize);
+ AudioHeap_InitPool(&gAudioContext.fontCache.persistent.pool,
+ AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->fontCacheSize),
+ split->fontCacheSize);
+ AudioHeap_InitPool(&gAudioContext.sampleBankCache.persistent.pool,
+ AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->sampleBankCacheSize),
+ split->sampleBankCacheSize);
- AudioHeap_ClearPersistentCache(&gAudioContext.seqCache.persistent);
- AudioHeap_ClearPersistentCache(&gAudioContext.fontCache.persistent);
- AudioHeap_ClearPersistentCache(&gAudioContext.sampleBankCache.persistent);
+ AudioHeap_InitPersistentCache(&gAudioContext.seqCache.persistent);
+ AudioHeap_InitPersistentCache(&gAudioContext.fontCache.persistent);
+ AudioHeap_InitPersistentCache(&gAudioContext.sampleBankCache.persistent);
}
-void AudioHeap_InitTemporaryCache(AudioCommonPoolSplit* split) {
+void AudioHeap_InitTemporaryPoolsAndCaches(AudioCommonPoolSplit* split) {
gAudioContext.temporaryCommonPool.curAddr = gAudioContext.temporaryCommonPool.startAddr;
- AudioHeap_AllocPoolInit(&gAudioContext.seqCache.temporary.pool,
- AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->seqCacheSize),
- split->seqCacheSize);
- AudioHeap_AllocPoolInit(&gAudioContext.fontCache.temporary.pool,
- AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->fontCacheSize),
- split->fontCacheSize);
- AudioHeap_AllocPoolInit(&gAudioContext.sampleBankCache.temporary.pool,
- AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->sampleBankCacheSize),
- split->sampleBankCacheSize);
+ AudioHeap_InitPool(&gAudioContext.seqCache.temporary.pool,
+ AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->seqCacheSize), split->seqCacheSize);
+ AudioHeap_InitPool(&gAudioContext.fontCache.temporary.pool,
+ AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->fontCacheSize), split->fontCacheSize);
+ AudioHeap_InitPool(&gAudioContext.sampleBankCache.temporary.pool,
+ AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->sampleBankCacheSize),
+ split->sampleBankCacheSize);
- AudioHeap_ClearTemporaryCache(&gAudioContext.seqCache.temporary);
- AudioHeap_ClearTemporaryCache(&gAudioContext.fontCache.temporary);
- AudioHeap_ClearTemporaryCache(&gAudioContext.sampleBankCache.temporary);
+ AudioHeap_InitTemporaryCache(&gAudioContext.seqCache.temporary);
+ AudioHeap_InitTemporaryCache(&gAudioContext.fontCache.temporary);
+ AudioHeap_InitTemporaryCache(&gAudioContext.sampleBankCache.temporary);
}
void* AudioHeap_AllocCached(s32 tableType, size_t size, s32 cache, s32 id) {
@@ -764,7 +768,7 @@ void AudioHeap_LoadFilter(s16* filter, s32 lowPassCutoff, s32 highPassCutoff) {
s32 cutOff;
//! @bug filter is never set if (lowPassCutoff == highPassCutoff) and does not equal 0
- if (lowPassCutoff == 0 && highPassCutoff == 0) {
+ if ((lowPassCutoff == 0) && (highPassCutoff == 0)) {
// Identity filter
AudioHeap_LoadLowPassFilter(filter, 0);
} else if (highPassCutoff == 0) {
@@ -830,13 +834,13 @@ void AudioHeap_UpdateReverbs(void) {
* Clear the Audio Interface Buffers
*/
void AudioHeap_ClearAiBuffers(void) {
- s32 curAiBuffferIndex = gAudioContext.curAiBuffferIndex;
+ s32 curAiBufferIndex = gAudioContext.curAiBufferIndex;
s32 i;
- gAudioContext.aiBufLengths[curAiBuffferIndex] = gAudioContext.audioBufferParameters.minAiBufferLength;
+ gAudioContext.aiBufNumSamples[curAiBufferIndex] = gAudioContext.audioBufferParameters.minAiBufNumSamples;
for (i = 0; i < AIBUF_LEN; i++) {
- gAudioContext.aiBuffers[curAiBuffferIndex][i] = 0;
+ gAudioContext.aiBuffers[curAiBufferIndex][i] = 0;
}
}
@@ -902,8 +906,8 @@ s32 AudioHeap_ResetStep(void) {
case 1:
AudioHeap_Init();
gAudioContext.resetStatus = 0;
- for (i = 0; i < ARRAY_COUNT(gAudioContext.aiBufLengths); i++) {
- gAudioContext.aiBufLengths[i] = gAudioContext.audioBufferParameters.maxAiBufferLength;
+ for (i = 0; i < ARRAY_COUNT(gAudioContext.aiBufNumSamples); i++) {
+ gAudioContext.aiBufNumSamples[i] = gAudioContext.audioBufferParameters.maxAiBufNumSamples;
for (j = 0; j < AIBUF_LEN; j++) {
gAudioContext.aiBuffers[i][j] = 0;
}
@@ -940,9 +944,9 @@ void AudioHeap_Init(void) {
gAudioContext.audioBufferParameters.samplesPerFrameTarget =
ALIGN16(gAudioContext.audioBufferParameters.samplingFreq / gAudioContext.refreshRate);
- gAudioContext.audioBufferParameters.minAiBufferLength =
+ gAudioContext.audioBufferParameters.minAiBufNumSamples =
gAudioContext.audioBufferParameters.samplesPerFrameTarget - 0x10;
- gAudioContext.audioBufferParameters.maxAiBufferLength =
+ gAudioContext.audioBufferParameters.maxAiBufNumSamples =
gAudioContext.audioBufferParameters.samplesPerFrameTarget + 0x10;
gAudioContext.audioBufferParameters.updatesPerFrame =
((gAudioContext.audioBufferParameters.samplesPerFrameTarget + 0x10) / 0xD0) + 1;
@@ -952,9 +956,10 @@ void AudioHeap_Init(void) {
gAudioContext.audioBufferParameters.samplesPerUpdateMax = gAudioContext.audioBufferParameters.samplesPerUpdate + 8;
gAudioContext.audioBufferParameters.samplesPerUpdateMin = gAudioContext.audioBufferParameters.samplesPerUpdate - 8;
gAudioContext.audioBufferParameters.resampleRate = 32000.0f / (s32)gAudioContext.audioBufferParameters.samplingFreq;
- gAudioContext.audioBufferParameters.unkUpdatesPerFrameScaled =
+ gAudioContext.audioBufferParameters.updatesPerFrameInvScaled =
(1.0f / 256.0f) / gAudioContext.audioBufferParameters.updatesPerFrame;
- gAudioContext.audioBufferParameters.unk_24 = gAudioContext.audioBufferParameters.updatesPerFrame * 0.25f;
+ gAudioContext.audioBufferParameters.updatesPerFrameScaled =
+ gAudioContext.audioBufferParameters.updatesPerFrame / 4.0f;
gAudioContext.audioBufferParameters.updatesPerFrameInv = 1.0f / gAudioContext.audioBufferParameters.updatesPerFrame;
// sample dma size
@@ -980,12 +985,12 @@ void AudioHeap_Init(void) {
gAudioContext.audioBufferParameters.specUnk4 = spec->unk_04;
gAudioContext.audioBufferParameters.samplesPerFrameTarget *= gAudioContext.audioBufferParameters.specUnk4;
- gAudioContext.audioBufferParameters.maxAiBufferLength *= gAudioContext.audioBufferParameters.specUnk4;
- gAudioContext.audioBufferParameters.minAiBufferLength *= gAudioContext.audioBufferParameters.specUnk4;
+ gAudioContext.audioBufferParameters.maxAiBufNumSamples *= gAudioContext.audioBufferParameters.specUnk4;
+ gAudioContext.audioBufferParameters.minAiBufNumSamples *= gAudioContext.audioBufferParameters.specUnk4;
gAudioContext.audioBufferParameters.updatesPerFrame *= gAudioContext.audioBufferParameters.specUnk4;
if (gAudioContext.audioBufferParameters.specUnk4 >= 2) {
- gAudioContext.audioBufferParameters.maxAiBufferLength -= 0x10;
+ gAudioContext.audioBufferParameters.maxAiBufNumSamples -= 0x10;
}
// Determine the maximum allowable number of audio command list entries for the rsp microcode
@@ -998,7 +1003,7 @@ void AudioHeap_Init(void) {
temporarySize =
spec->temporarySeqCacheSize + spec->temporaryFontCacheSize + spec->temporarySampleBankCacheSize + 0x10;
cachePoolSize = persistentSize + temporarySize;
- miscPoolSize = gAudioContext.audioSessionPool.size - cachePoolSize - 0x100;
+ miscPoolSize = gAudioContext.sessionPool.size - cachePoolSize - 0x100;
if (gAudioContext.externalPool.startAddr != NULL) {
gAudioContext.externalPool.curAddr = gAudioContext.externalPool.startAddr;
@@ -1018,13 +1023,13 @@ void AudioHeap_Init(void) {
gAudioContext.persistentCommonPoolSplit.seqCacheSize = spec->persistentSeqCacheSize;
gAudioContext.persistentCommonPoolSplit.fontCacheSize = spec->persistentFontCacheSize;
gAudioContext.persistentCommonPoolSplit.sampleBankCacheSize = spec->persistentSampleBankCacheSize;
- AudioHeap_InitPersistentCache(&gAudioContext.persistentCommonPoolSplit);
+ AudioHeap_InitPersistentPoolsAndCaches(&gAudioContext.persistentCommonPoolSplit);
// Temporary Pool Split (Split into Sequences, SoundFonts, Samples)
gAudioContext.temporaryCommonPoolSplit.seqCacheSize = spec->temporarySeqCacheSize;
gAudioContext.temporaryCommonPoolSplit.fontCacheSize = spec->temporaryFontCacheSize;
gAudioContext.temporaryCommonPoolSplit.sampleBankCacheSize = spec->temporarySampleBankCacheSize;
- AudioHeap_InitTemporaryCache(&gAudioContext.temporaryCommonPoolSplit);
+ AudioHeap_InitTemporaryPoolsAndCaches(&gAudioContext.temporaryCommonPoolSplit);
AudioHeap_ResetLoadStatus();
@@ -1039,12 +1044,12 @@ void AudioHeap_Init(void) {
// Initialize audio binary interface command list buffer
for (j = 0; j < ARRAY_COUNT(gAudioContext.abiCmdBufs); j++) {
gAudioContext.abiCmdBufs[j] =
- AudioHeap_AllocDmaMemoryZeroed(&gAudioContext.miscPool, gAudioContext.maxAudioCmds * sizeof(u64));
+ AudioHeap_AllocDmaMemoryZeroed(&gAudioContext.miscPool, gAudioContext.maxAudioCmds * sizeof(Acmd));
}
- // Initialize adsrDecayTable (fadeOutVelocities for ADSR)
+ // Initialize the decay rate table for ADSR
gAudioContext.adsrDecayTable = AudioHeap_Alloc(&gAudioContext.miscPool, 0x100 * sizeof(f32));
- func_8018B10C();
+ AudioHeap_InitAdsrDecayTable();
// Initialize reverbs
for (i = 0; i < ARRAY_COUNT(gAudioContext.synthesisReverbs); i++) {
@@ -1139,14 +1144,14 @@ void AudioHeap_InitSampleCaches(size_t persistentSampleCacheSize, size_t tempora
if (addr == NULL) {
gAudioContext.persistentSampleCache.pool.size = 0;
} else {
- AudioHeap_AllocPoolInit(&gAudioContext.persistentSampleCache.pool, addr, persistentSampleCacheSize);
+ AudioHeap_InitPool(&gAudioContext.persistentSampleCache.pool, addr, persistentSampleCacheSize);
}
addr = AudioHeap_AllocAttemptExternal(&gAudioContext.miscPool, temporarySampleCacheSize);
if (addr == NULL) {
gAudioContext.temporarySampleCache.pool.size = 0;
} else {
- AudioHeap_AllocPoolInit(&gAudioContext.temporarySampleCache.pool, addr, temporarySampleCacheSize);
+ AudioHeap_InitPool(&gAudioContext.temporarySampleCache.pool, addr, temporarySampleCacheSize);
}
gAudioContext.persistentSampleCache.numEntries = 0;
@@ -1257,35 +1262,35 @@ SampleCacheEntry* AudioHeap_AllocTemporarySampleCacheEntry(size_t size) {
void AudioHeap_UnapplySampleCacheForFont(SampleCacheEntry* entry, s32 fontId) {
Drum* drum;
Instrument* inst;
- SoundFontSound* sfx;
+ SoundEffect* soundEffect;
s32 instId;
s32 drumId;
s32 sfxId;
- for (instId = 0; instId < gAudioContext.soundFonts[fontId].numInstruments; instId++) {
+ for (instId = 0; instId < gAudioContext.soundFontList[fontId].numInstruments; instId++) {
inst = AudioPlayback_GetInstrumentInner(fontId, instId);
if (inst != NULL) {
if (inst->normalRangeLo != 0) {
- AudioHeap_UnapplySampleCache(entry, inst->lowNotesSound.sample);
+ AudioHeap_UnapplySampleCache(entry, inst->lowPitchTunedSample.sample);
}
if (inst->normalRangeHi != 0x7F) {
- AudioHeap_UnapplySampleCache(entry, inst->highNotesSound.sample);
+ AudioHeap_UnapplySampleCache(entry, inst->highPitchTunedSample.sample);
}
- AudioHeap_UnapplySampleCache(entry, inst->normalNotesSound.sample);
+ AudioHeap_UnapplySampleCache(entry, inst->normalPitchTunedSample.sample);
}
}
- for (drumId = 0; drumId < gAudioContext.soundFonts[fontId].numDrums; drumId++) {
+ for (drumId = 0; drumId < gAudioContext.soundFontList[fontId].numDrums; drumId++) {
drum = AudioPlayback_GetDrum(fontId, drumId);
if (drum != NULL) {
- AudioHeap_UnapplySampleCache(entry, drum->sound.sample);
+ AudioHeap_UnapplySampleCache(entry, drum->tunedSample.sample);
}
}
- for (sfxId = 0; sfxId < gAudioContext.soundFonts[fontId].numSfx; sfxId++) {
- sfx = AudioPlayback_GetSfx(fontId, sfxId);
- if (sfx != NULL) {
- AudioHeap_UnapplySampleCache(entry, sfx->sample);
+ for (sfxId = 0; sfxId < gAudioContext.soundFontList[fontId].numSfx; sfxId++) {
+ soundEffect = AudioPlayback_GetSoundEffect(fontId, sfxId);
+ if (soundEffect != NULL) {
+ AudioHeap_UnapplySampleCache(entry, soundEffect->tunedSample.sample);
}
}
}
@@ -1298,8 +1303,8 @@ void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry) {
numFonts = gAudioContext.soundFontTable->numEntries;
for (fontId = 0; fontId < numFonts; fontId++) {
- sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1;
- sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2;
+ sampleBankId1 = gAudioContext.soundFontList[fontId].sampleBankId1;
+ sampleBankId2 = gAudioContext.soundFontList[fontId].sampleBankId2;
if (((sampleBankId1 != 0xFF) && (entry->sampleBankId == sampleBankId1)) ||
((sampleBankId2 != 0xFF) && (entry->sampleBankId == sampleBankId2)) || entry->sampleBankId == 0 ||
entry->sampleBankId == 0xFE) {
@@ -1313,7 +1318,7 @@ void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry) {
}
}
-void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, SoundFontSample* sample) {
+void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, Sample* sample) {
if (sample != NULL) {
if (sample->sampleAddr == entry->allocatedAddr) {
sample->sampleAddr = entry->sampleAddr;
@@ -1362,8 +1367,8 @@ void AudioHeap_DiscardSampleCaches(void) {
numFonts = gAudioContext.soundFontTable->numEntries;
for (fontId = 0; fontId < numFonts; fontId++) {
- sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1;
- sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2;
+ sampleBankId1 = gAudioContext.soundFontList[fontId].sampleBankId1;
+ sampleBankId2 = gAudioContext.soundFontList[fontId].sampleBankId2;
if ((sampleBankId1 == 0xFF) && (sampleBankId2 == 0xFF)) {
continue;
}
@@ -1390,7 +1395,7 @@ typedef struct {
u8 newMedium;
} StorageChange;
-void AudioHeap_ChangeStorage(StorageChange* change, SoundFontSample* sample) {
+void AudioHeap_ChangeStorage(StorageChange* change, Sample* sample) {
if (sample != NULL && ((sample->medium == change->newMedium) || (D_801FD120 != 1)) &&
((sample->medium == MEDIUM_RAM) || (D_801FD120 != 0))) {
uintptr_t startAddr = change->oldAddr;
@@ -1430,7 +1435,7 @@ void AudioHeap_ApplySampleBankCacheInternal(s32 apply, s32 sampleBankId) {
s32 fontId;
Drum* drum;
Instrument* inst;
- SoundFontSound* sfx;
+ SoundEffect* soundEffect;
uintptr_t* newAddr;
s32 pad[4];
@@ -1457,8 +1462,8 @@ void AudioHeap_ApplySampleBankCacheInternal(s32 apply, s32 sampleBankId) {
}
for (fontId = 0; fontId < numFonts; fontId++) {
- sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1;
- sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2;
+ sampleBankId1 = gAudioContext.soundFontList[fontId].sampleBankId1;
+ sampleBankId2 = gAudioContext.soundFontList[fontId].sampleBankId2;
if ((sampleBankId1 != 0xFF) || (sampleBankId2 != 0xFF)) {
if (!AudioLoad_IsFontLoadComplete(fontId) ||
AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, fontId) == NULL) {
@@ -1471,30 +1476,30 @@ void AudioHeap_ApplySampleBankCacheInternal(s32 apply, s32 sampleBankId) {
continue;
}
- for (instId = 0; instId < gAudioContext.soundFonts[fontId].numInstruments; instId++) {
+ for (instId = 0; instId < gAudioContext.soundFontList[fontId].numInstruments; instId++) {
inst = AudioPlayback_GetInstrumentInner(fontId, instId);
if (inst != NULL) {
if (inst->normalRangeLo != 0) {
- AudioHeap_ChangeStorage(&change, inst->lowNotesSound.sample);
+ AudioHeap_ChangeStorage(&change, inst->lowPitchTunedSample.sample);
}
if (inst->normalRangeHi != 0x7F) {
- AudioHeap_ChangeStorage(&change, inst->highNotesSound.sample);
+ AudioHeap_ChangeStorage(&change, inst->highPitchTunedSample.sample);
}
- AudioHeap_ChangeStorage(&change, inst->normalNotesSound.sample);
+ AudioHeap_ChangeStorage(&change, inst->normalPitchTunedSample.sample);
}
}
- for (drumId = 0; drumId < gAudioContext.soundFonts[fontId].numDrums; drumId++) {
+ for (drumId = 0; drumId < gAudioContext.soundFontList[fontId].numDrums; drumId++) {
drum = AudioPlayback_GetDrum(fontId, drumId);
if (drum != NULL) {
- AudioHeap_ChangeStorage(&change, drum->sound.sample);
+ AudioHeap_ChangeStorage(&change, drum->tunedSample.sample);
}
}
- for (sfxId = 0; sfxId < gAudioContext.soundFonts[fontId].numSfx; sfxId++) {
- sfx = AudioPlayback_GetSfx(fontId, sfxId);
- if (sfx != NULL) {
- AudioHeap_ChangeStorage(&change, sfx->sample);
+ for (sfxId = 0; sfxId < gAudioContext.soundFontList[fontId].numSfx; sfxId++) {
+ soundEffect = AudioPlayback_GetSoundEffect(fontId, sfxId);
+ if (soundEffect != NULL) {
+ AudioHeap_ChangeStorage(&change, soundEffect->tunedSample.sample);
}
}
}
@@ -1671,9 +1676,9 @@ void AudioHeap_InitReverb(s32 reverbIndex, ReverbSettings* settings, s32 flags)
reverb->framesToIgnore = 2;
}
- reverb->sound.sample = &reverb->sample;
+ reverb->tunedSample.sample = &reverb->sample;
reverb->sample.loop = &reverb->loop;
- reverb->sound.tuning = 1.0f;
+ reverb->tunedSample.tuning = 1.0f;
reverb->sample.codec = CODEC_REVERB;
reverb->sample.medium = MEDIUM_RAM;
reverb->sample.size = reverb->windowSize * 2;
diff --git a/src/code/audio/audio_init_params.c b/src/code/audio/audio_init_params.c
index b407ef7c98..81c49b30ca 100644
--- a/src/code/audio/audio_init_params.c
+++ b/src/code/audio/audio_init_params.c
@@ -5,8 +5,8 @@ const s16 gAudioTatumInit[] = {
0x30, // gTatumsPerBeat
};
-const AudioContextInitSizes gAudioContextInitSizes = {
+const AudioHeapInitSizes gAudioHeapInitSizes = {
0x137F00, // heapSize
- 0x1C480, // mainPoolSplitSize
+ 0x1C480, // initPoolSize
0x1A000, // permanentPoolSize
};
diff --git a/src/code/audio/audio_load.c b/src/code/audio/audio_load.c
index 9ebdd1d857..c8e5ac5d1b 100644
--- a/src/code/audio/audio_load.c
+++ b/src/code/audio/audio_load.c
@@ -16,7 +16,7 @@
* SoundFont Notes:
*
*/
-// opaque type for unpatched sound font data (should maybe get rid of this?)
+// opaque type for soundfont data loaded into ram (should maybe get rid of this?)
typedef void SoundFontData;
typedef struct {
@@ -26,7 +26,7 @@ typedef struct {
/* 0x0C */ uintptr_t baseAddr2;
/* 0x10 */ u32 medium1;
/* 0x14 */ u32 medium2;
-} AudioRelocInfo; // size = 0x18
+} SampleBankRelocInfo; // size = 0x18
void AudioLoad_DiscardFont(s32 fontId);
s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIndex, s32 seqId, s32 arg2);
@@ -42,7 +42,7 @@ void AudioLoad_SyncDmaUnkMedium(uintptr_t devAddr, u8* addr, size_t size, s32 un
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, uintptr_t devAddr, void* ramAddr, size_t size,
OSMesgQueue* reqQueue, s32 medium, const char* dmaFuncType);
void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue);
-SoundFontSample* AudioLoad_GetFontSample(s32 fontId, s32 instId);
+Sample* AudioLoad_GetFontSample(s32 fontId, s32 instId);
void AudioLoad_ProcessSlowLoads(s32 resetStatus);
void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, size_t size);
void AudioLoad_DmaSlowCopyUnkMedium(intptr_t devAddr, intptr_t ramAddr, size_t size, s32 arg3);
@@ -56,8 +56,9 @@ void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus);
void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, size_t size);
void AudioLoad_AsyncDmaRamUnloaded(AudioAsyncLoad* asyncLoad, size_t size);
void AudioLoad_AsyncDmaUnkMedium(uintptr_t devAddr, void* ramAddr, size_t size, s16 arg3);
-void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* fontData, AudioRelocInfo* relocInfo);
-void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* fontData, AudioRelocInfo* relocInfo, s32 async);
+void AudioLoad_RelocateSample(TunedSample* tunedSample, SoundFontData* fontData, SampleBankRelocInfo* sampleBankReloc);
+void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* fontData, SampleBankRelocInfo* sampleBankReloc,
+ s32 isAsync);
s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus);
#define MK_ASYNC_MSG(retData, tableType, id, loadStatus) \
@@ -217,7 +218,7 @@ void* AudioLoad_DmaSampleData(uintptr_t devAddr, size_t size, s32 arg2, u8* dmaI
dma->devAddr = dmaDevAddr;
dma->sizeUnused = transfer;
AudioLoad_Dma(&gAudioContext.currAudioFrameDmaIoMesgBuf[gAudioContext.curAudioFrameDmaCount++], OS_MESG_PRI_NORMAL,
- OS_READ, dmaDevAddr, dma->ramAddr, transfer, &gAudioContext.currAudioFrameDmaQueue, medium,
+ OS_READ, dmaDevAddr, dma->ramAddr, transfer, &gAudioContext.curAudioFrameDmaQueue, medium,
"SUPERDMA");
*dmaIndexRef = dmaIndex;
return (devAddr - dmaDevAddr) + dma->ramAddr;
@@ -423,10 +424,10 @@ void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1, s32 arg2, OSMesgQueue* arg3
}
}
-s32 AudioLoad_SyncLoadSample(SoundFontSample* sample, s32 fontId) {
+s32 AudioLoad_SyncLoadSample(Sample* sample, s32 fontId) {
void* sampleAddr;
- if (sample->unk_bit25 == true) {
+ if (sample->isRelocated == true) {
if (sample->medium != MEDIUM_RAM) {
sampleAddr = AudioHeap_AllocSampleCache(sample->size, fontId, (void*)sample->sampleAddr, sample->medium,
CACHE_PERSISTENT);
@@ -454,11 +455,11 @@ s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId) {
return -1;
}
if (instrument->normalRangeLo != 0) {
- AudioLoad_SyncLoadSample(instrument->lowNotesSound.sample, fontId);
+ AudioLoad_SyncLoadSample(instrument->lowPitchTunedSample.sample, fontId);
}
- AudioLoad_SyncLoadSample(instrument->normalNotesSound.sample, fontId);
+ AudioLoad_SyncLoadSample(instrument->normalPitchTunedSample.sample, fontId);
if (instrument->normalRangeHi != 0x7F) {
- return AudioLoad_SyncLoadSample(instrument->highNotesSound.sample, fontId);
+ return AudioLoad_SyncLoadSample(instrument->highPitchTunedSample.sample, fontId);
}
// TODO: is this missing return UB?
} else if (instId == 0x7F) {
@@ -467,7 +468,7 @@ s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId) {
if (drum == NULL) {
return -1;
}
- AudioLoad_SyncLoadSample(drum->sound.sample, fontId);
+ AudioLoad_SyncLoadSample(drum->tunedSample.sample, fontId);
return 0;
}
// TODO: is this missing return UB?
@@ -680,28 +681,29 @@ SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) {
s32 sampleBankId1;
s32 sampleBankId2;
s32 didAllocate;
- AudioRelocInfo relocInfo;
+ SampleBankRelocInfo sampleBankReloc;
s32 realFontId = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId);
if (gAudioContext.fontLoadStatus[realFontId] == LOAD_STATUS_IN_PROGRESS) {
return NULL;
}
- sampleBankId1 = gAudioContext.soundFonts[realFontId].sampleBankId1;
- sampleBankId2 = gAudioContext.soundFonts[realFontId].sampleBankId2;
+ sampleBankId1 = gAudioContext.soundFontList[realFontId].sampleBankId1;
+ sampleBankId2 = gAudioContext.soundFontList[realFontId].sampleBankId2;
- relocInfo.sampleBankId1 = sampleBankId1;
- relocInfo.sampleBankId2 = sampleBankId2;
- if (relocInfo.sampleBankId1 != 0xFF) {
- relocInfo.baseAddr1 = AudioLoad_TrySyncLoadSampleBank(relocInfo.sampleBankId1, &relocInfo.medium1, false);
+ sampleBankReloc.sampleBankId1 = sampleBankId1;
+ sampleBankReloc.sampleBankId2 = sampleBankId2;
+ if (sampleBankReloc.sampleBankId1 != 0xFF) {
+ sampleBankReloc.baseAddr1 =
+ AudioLoad_TrySyncLoadSampleBank(sampleBankReloc.sampleBankId1, &sampleBankReloc.medium1, false);
} else {
- relocInfo.baseAddr1 = 0;
+ sampleBankReloc.baseAddr1 = 0;
}
if (sampleBankId2 != 0xFF) {
- relocInfo.baseAddr2 = AudioLoad_TrySyncLoadSampleBank(sampleBankId2, &relocInfo.medium2, false);
+ sampleBankReloc.baseAddr2 = AudioLoad_TrySyncLoadSampleBank(sampleBankId2, &sampleBankReloc.medium2, false);
} else {
- relocInfo.baseAddr2 = 0;
+ sampleBankReloc.baseAddr2 = 0;
}
fontData = AudioLoad_SyncLoad(FONT_TABLE, fontId, &didAllocate);
@@ -709,7 +711,7 @@ SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) {
return NULL;
}
if (didAllocate == true) {
- AudioLoad_RelocateFontAndPreloadSamples(realFontId, fontData, &relocInfo, false);
+ AudioLoad_RelocateFontAndPreloadSamples(realFontId, fontData, &sampleBankReloc, false);
}
return fontData;
@@ -778,7 +780,7 @@ void* AudioLoad_SyncLoad(s32 tableType, u32 id, s32* didAllocate) {
}
if (tableType == FONT_TABLE) {
- SoundFont* soundFont = &gAudioContext.soundFonts[realId];
+ SoundFont* soundFont = &gAudioContext.soundFontList[realId];
soundFont->numInstruments = ((UnloadedFonts*)romAddr)->numInstruments;
soundFont->numDrums = ((UnloadedFonts*)romAddr)->numDrums;
@@ -861,89 +863,131 @@ AudioTable* AudioLoad_GetLoadTable(s32 tableType) {
}
/**
+ * Read and extract information from soundFont binary loaded into ram.
+ * Also relocate offsets into pointers within this loaded soundFont
*
- * SoundFontData* mem -> the address of the soundFont as stored in memory
+ * @param fontId index of font being processed
+ * @param fontDataStartAddr ram address of raw soundfont binary loaded into cache
+ * @param sampleBankReloc information on the sampleBank containing raw audio samples
*/
-void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontData, AudioRelocInfo* relocInfo) {
- uintptr_t reloc;
- uintptr_t reloc2;
+void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontDataStartAddr, SampleBankRelocInfo* sampleBankReloc) {
+ uintptr_t soundOffset;
+ uintptr_t soundListOffset;
Instrument* inst;
Drum* drum;
- SoundFontSound* sfx;
+ SoundEffect* soundEffect;
s32 i;
- s32 numDrums = gAudioContext.soundFonts[fontId].numDrums;
- s32 numInstruments = gAudioContext.soundFonts[fontId].numInstruments;
- s32 numSfx = gAudioContext.soundFonts[fontId].numSfx;
- void** ptrs = (void**)fontData;
+ s32 numDrums = gAudioContext.soundFontList[fontId].numDrums;
+ s32 numInstruments = gAudioContext.soundFontList[fontId].numInstruments;
+ s32 numSfx = gAudioContext.soundFontList[fontId].numSfx;
+ u32* fontData = (u32*)fontDataStartAddr;
-#define BASE_OFFSET(x) (void*)((uintptr_t)(x) + (uintptr_t)(fontData))
+ // Relocate an offset (relative to the start of the font data) to a pointer (a ram address)
+#define RELOC_TO_RAM(x) (void*)((uintptr_t)(x) + (uintptr_t)(fontDataStartAddr))
- // relocate drums
- reloc2 = ptrs[0];
+ // Drums relocation
+
+ // The first u32 in fontData is an offset to a list of offsets to the drums
+ soundListOffset = fontData[0];
if (1) {}
- if ((reloc2 != 0) && (numDrums != 0)) {
- ptrs[0] = BASE_OFFSET(reloc2);
+
+ // If the soundFont has drums
+ if ((soundListOffset != 0) && (numDrums != 0)) {
+
+ fontData[0] = RELOC_TO_RAM(soundListOffset);
+
+ // Loop through the drum offsets
for (i = 0; i < numDrums; i++) {
- reloc = ((Drum**)ptrs[0])[i];
- if (reloc != 0) {
- reloc = BASE_OFFSET(reloc);
- ((Drum**)ptrs[0])[i] = drum = reloc;
- if (!drum->loaded) {
- AudioLoad_RelocateSample(&drum->sound, fontData, relocInfo);
- reloc = drum->envelope;
- drum->envelope = BASE_OFFSET(reloc);
- drum->loaded = true;
+ // Get the i'th drum offset
+ soundOffset = ((Drum**)fontData[0])[i];
+
+ // Some drum data entries are empty, represented by an offset of 0 in the list of drum offsets
+ if (soundOffset != 0) {
+ soundOffset = RELOC_TO_RAM(soundOffset);
+ ((Drum**)fontData[0])[i] = drum = soundOffset;
+
+ // The drum may be in the list multiple times and already relocated
+ if (!drum->isRelocated) {
+ AudioLoad_RelocateSample(&drum->tunedSample, fontDataStartAddr, sampleBankReloc);
+
+ soundOffset = drum->envelope;
+ drum->envelope = RELOC_TO_RAM(soundOffset);
+
+ drum->isRelocated = true;
}
}
}
}
- // relocate sfxs
- reloc2 = ptrs[1];
+ // Sound effects relocation
+
+ // The second u32 in fontData is an offset to the first sound effect entry
+ soundListOffset = fontData[1];
if (1) {}
- if ((reloc2 != 0) && (numSfx != 0)) {
- ptrs[1] = BASE_OFFSET(reloc2);
+
+ // If the soundFont has sound effects
+ if ((soundListOffset != 0) && (numSfx != 0)) {
+
+ fontData[1] = RELOC_TO_RAM(soundListOffset);
+
+ // Loop through the sound effects
for (i = 0; i < numSfx; i++) {
- reloc = (SoundFontSound*)ptrs[1] + i;
- if (reloc != 0) {
- sfx = reloc;
- if (sfx->sample != NULL) {
- AudioLoad_RelocateSample(sfx, fontData, relocInfo);
- }
+ // Get a pointer to the i'th sound effect
+ soundOffset = (TunedSample*)fontData[1] + i;
+ soundEffect = (SoundEffect*)soundOffset;
+
+ // Check for NULL (note: the pointer is guaranteed to be in fontData and can never be NULL)
+ if ((soundEffect != NULL) && (soundEffect->tunedSample.sample != NULL)) {
+ AudioLoad_RelocateSample(&soundEffect->tunedSample, fontDataStartAddr, sampleBankReloc);
}
}
}
- if (numInstruments > 0x7E) {
- numInstruments = 0x7E;
+ // Instruments relocation
+
+ // Instrument Id 126 and above is reserved.
+ // There can only be 126 instruments, indexed from 0 to 125
+ if (numInstruments > 126) {
+ numInstruments = 126;
}
- // relocate instruments
+ // Starting from the 3rd u32 in fontData is the list of offsets to the instruments
+ // Loop through the instruments
for (i = 2; i <= 2 + numInstruments - 1; i++) {
- if (ptrs[i] != NULL) {
- ptrs[i] = BASE_OFFSET(ptrs[i]);
- inst = ptrs[i];
- if (!inst->loaded) {
+ // Some instrument data entries are empty, represented by an offset of 0 in the list of instrument offsets
+ if (fontData[i] != 0) {
+ fontData[i] = RELOC_TO_RAM(fontData[i]);
+ inst = (Instrument*)fontData[i];
+
+ // The instrument may be in the list multiple times and already relocated
+ if (!inst->isRelocated) {
+ // Some instruments have a different sample for low pitches
if (inst->normalRangeLo != 0) {
- AudioLoad_RelocateSample(&inst->lowNotesSound, fontData, relocInfo);
- }
- AudioLoad_RelocateSample(&inst->normalNotesSound, fontData, relocInfo);
- if (inst->normalRangeHi != 0x7F) {
- AudioLoad_RelocateSample(&inst->highNotesSound, fontData, relocInfo);
+ AudioLoad_RelocateSample(&inst->lowPitchTunedSample, fontDataStartAddr, sampleBankReloc);
}
- reloc = inst->envelope;
- inst->envelope = BASE_OFFSET(reloc);
- inst->loaded = true;
+ // Every instrument has a sample for the default range
+ AudioLoad_RelocateSample(&inst->normalPitchTunedSample, fontDataStartAddr, sampleBankReloc);
+
+ // Some instruments have a different sample for high pitches
+ if (inst->normalRangeHi != 0x7F) {
+ AudioLoad_RelocateSample(&inst->highPitchTunedSample, fontDataStartAddr, sampleBankReloc);
+ }
+
+ soundOffset = inst->envelope;
+ inst->envelope = (EnvelopePoint*)RELOC_TO_RAM(soundOffset);
+
+ inst->isRelocated = true;
}
}
}
-#undef BASE_OFFSET
+#undef RELOC_TO_RAM
- gAudioContext.soundFonts[fontId].drums = ptrs[0];
- gAudioContext.soundFonts[fontId].soundEffects = ptrs[1];
- gAudioContext.soundFonts[fontId].instruments = (Instrument**)(&ptrs[2]);
+ // Store the relocated pointers
+ gAudioContext.soundFontList[fontId].drums = (Drum**)fontData[0];
+ gAudioContext.soundFontList[fontId].soundEffects = (SoundEffect*)fontData[1];
+ gAudioContext.soundFontList[fontId].instruments = (Instrument**)(&fontData[2]);
}
void AudioLoad_SyncDma(uintptr_t devAddr, u8* ramAddr, size_t size, s32 medium) {
@@ -1102,7 +1146,7 @@ void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData,
}
if (tableType == FONT_TABLE) {
- soundFont = &gAudioContext.soundFonts[realId];
+ soundFont = &gAudioContext.soundFontList[realId];
soundFont->numInstruments = ((UnloadedFonts*)romAddr)->numInstruments;
soundFont->numDrums = ((UnloadedFonts*)romAddr)->numDrums;
@@ -1154,8 +1198,8 @@ void AudioLoad_SetUnusedHandler(void* callback) {
sUnusedHandler = callback;
}
-void AudioLoad_InitSoundFontMeta(s32 fontId) {
- SoundFont* font = &gAudioContext.soundFonts[fontId];
+void AudioLoad_InitSoundFont(s32 fontId) {
+ SoundFont* font = &gAudioContext.soundFontList[fontId];
AudioTableEntry* entry = &gAudioContext.soundFontTable->entries[fontId];
font->sampleBankId1 = (entry->shortData1 >> 8) & 0xFF;
@@ -1210,20 +1254,20 @@ void AudioLoad_Init(void* heap, size_t heapSize) {
AudioThread_InitMesgQueues();
- for (i = 0; i < ARRAY_COUNT(gAudioContext.aiBufLengths); i++) {
- gAudioContext.aiBufLengths[i] = 0xA0;
+ for (i = 0; i < ARRAY_COUNT(gAudioContext.aiBufNumSamples); i++) {
+ gAudioContext.aiBufNumSamples[i] = 0xA0;
}
gAudioContext.totalTaskCount = 0;
gAudioContext.rspTaskIndex = 0;
- gAudioContext.curAiBuffferIndex = 0;
+ gAudioContext.curAiBufferIndex = 0;
gAudioContext.soundMode = SOUNDMODE_STEREO;
gAudioContext.curTask = NULL;
gAudioContext.rspTask[0].task.t.dataSize = 0;
gAudioContext.rspTask[1].task.t.dataSize = 0;
osCreateMesgQueue(&gAudioContext.syncDmaQueue, &gAudioContext.syncDmaMesg, 1);
- osCreateMesgQueue(&gAudioContext.currAudioFrameDmaQueue, gAudioContext.currAudioFrameDmaMesgBuf,
+ osCreateMesgQueue(&gAudioContext.curAudioFrameDmaQueue, gAudioContext.currAudioFrameDmaMesgBuf,
ARRAY_COUNT(gAudioContext.currAudioFrameDmaMesgBuf));
osCreateMesgQueue(&gAudioContext.externalLoadQueue, gAudioContext.externalLoadMesgBuf,
ARRAY_COUNT(gAudioContext.externalLoadMesgBuf));
@@ -1235,23 +1279,24 @@ void AudioLoad_Init(void* heap, size_t heapSize) {
if (heap == NULL) {
gAudioContext.audioHeap = gAudioHeap;
- gAudioContext.audioHeapSize = gAudioContextInitSizes.heapSize;
+ gAudioContext.audioHeapSize = gAudioHeapInitSizes.heapSize;
} else {
void** hp = &heap;
+
gAudioContext.audioHeap = *hp;
gAudioContext.audioHeapSize = heapSize;
}
- for (i = 0; i < (s32)gAudioContext.audioHeapSize / 8; i++) {
+ for (i = 0; i < ((s32)gAudioContext.audioHeapSize / (s32)sizeof(u64)); i++) {
((u64*)gAudioContext.audioHeap)[i] = 0;
}
// Main Pool Split (split entirety of audio heap into initPool and sessionPool)
- AudioHeap_InitMainPool(gAudioContextInitSizes.mainPoolSplitSize);
+ AudioHeap_InitMainPool(gAudioHeapInitSizes.initPoolSize);
- // Initialize the audio interface buffer
+ // Initialize the audio interface buffers
for (i = 0; i < ARRAY_COUNT(gAudioContext.aiBuffers); i++) {
- gAudioContext.aiBuffers[i] = AudioHeap_AllocZeroed(&gAudioContext.audioInitPool, AIBUF_LEN * sizeof(s16));
+ gAudioContext.aiBuffers[i] = AudioHeap_AllocZeroed(&gAudioContext.initPool, AIBUF_LEN * sizeof(s16));
}
// Connect audio tables to their tables in memory
@@ -1272,18 +1317,18 @@ void AudioLoad_Init(void* heap, size_t heapSize) {
AudioLoad_InitTable(gAudioContext.sampleBankTable, SEGMENT_ROM_START(Audiotable), 0);
numFonts = gAudioContext.soundFontTable->numEntries;
- gAudioContext.soundFonts = AudioHeap_Alloc(&gAudioContext.audioInitPool, numFonts * sizeof(SoundFont));
+ gAudioContext.soundFontList = AudioHeap_Alloc(&gAudioContext.initPool, numFonts * sizeof(SoundFont));
for (i = 0; i < numFonts; i++) {
- AudioLoad_InitSoundFontMeta(i);
+ AudioLoad_InitSoundFont(i);
}
- if (addr = AudioHeap_Alloc(&gAudioContext.audioInitPool, gAudioContextInitSizes.permanentPoolSize), addr == NULL) {
- // cast away const from D_8014A6C4
- *((u32*)&gAudioContextInitSizes.permanentPoolSize) = 0;
+ if (addr = AudioHeap_Alloc(&gAudioContext.initPool, gAudioHeapInitSizes.permanentPoolSize), addr == NULL) {
+ // cast away const from gAudioHeapInitSizes
+ *((u32*)&gAudioHeapInitSizes.permanentPoolSize) = 0;
}
- AudioHeap_AllocPoolInit(&gAudioContext.permanentPool, addr, gAudioContextInitSizes.permanentPoolSize);
+ AudioHeap_InitPool(&gAudioContext.permanentPool, addr, gAudioHeapInitSizes.permanentPoolSize);
gAudioContextInitalized = true;
osSendMesg(gAudioContext.taskStartQueueP, (void*)gAudioContext.totalTaskCount, OS_MESG_NOBLOCK);
}
@@ -1294,7 +1339,7 @@ void AudioLoad_InitSlowLoads(void) {
}
s32 AudioLoad_SlowLoadSample(s32 fontId, s32 instId, s8* isDone) {
- SoundFontSample* sample;
+ Sample* sample;
AudioSlowLoad* slowLoad;
sample = AudioLoad_GetFontSample(fontId, instId);
@@ -1344,8 +1389,8 @@ s32 AudioLoad_SlowLoadSample(s32 fontId, s32 instId, s8* isDone) {
return 0;
}
-SoundFontSample* AudioLoad_GetFontSample(s32 fontId, s32 instId) {
- SoundFontSample* sample;
+Sample* AudioLoad_GetFontSample(s32 fontId, s32 instId) {
+ Sample* sample;
if (instId < 0x80) {
Instrument* instrument = AudioPlayback_GetInstrumentInner(fontId, instId);
@@ -1353,21 +1398,21 @@ SoundFontSample* AudioLoad_GetFontSample(s32 fontId, s32 instId) {
if (instrument == NULL) {
return NULL;
}
- sample = instrument->normalNotesSound.sample;
+ sample = instrument->normalPitchTunedSample.sample;
} else if (instId < 0x100) {
Drum* drum = AudioPlayback_GetDrum(fontId, instId - 0x80);
if (drum == NULL) {
return NULL;
}
- sample = drum->sound.sample;
+ sample = drum->tunedSample.sample;
} else {
- SoundFontSound* sound = AudioPlayback_GetSfx(fontId, instId - 0x100);
+ SoundEffect* soundEffect = AudioPlayback_GetSoundEffect(fontId, instId - 0x100);
- if (sound == NULL) {
+ if (soundEffect == NULL) {
return NULL;
}
- sample = sound->sample;
+ sample = soundEffect->tunedSample.sample;
}
return sample;
@@ -1377,7 +1422,7 @@ void AudioLoad_Unused2(void) {
}
void AudioLoad_FinishSlowLoad(AudioSlowLoad* slowLoad) {
- SoundFontSample* sample;
+ Sample* sample;
if (slowLoad->sample.sampleAddr == NULL) {
return;
@@ -1596,7 +1641,7 @@ void AudioLoad_FinishAsyncLoad(AudioAsyncLoad* asyncLoad) {
OSMesg doneMsg;
u32 sampleBankId1;
u32 sampleBankId2;
- AudioRelocInfo relocInfo;
+ SampleBankRelocInfo sampleBankReloc;
if (1) {}
switch (ASYNC_TBLTYPE(retMsg)) {
@@ -1608,16 +1653,16 @@ void AudioLoad_FinishAsyncLoad(AudioAsyncLoad* asyncLoad) {
break;
case FONT_TABLE:
fontId = ASYNC_ID(retMsg);
- sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1;
- sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2;
- relocInfo.sampleBankId1 = sampleBankId1;
- relocInfo.sampleBankId2 = sampleBankId2;
- relocInfo.baseAddr1 =
- sampleBankId1 != 0xFF ? AudioLoad_GetSampleBank(sampleBankId1, &relocInfo.medium1) : 0;
- relocInfo.baseAddr2 =
- sampleBankId2 != 0xFF ? AudioLoad_GetSampleBank(sampleBankId2, &relocInfo.medium2) : 0;
+ sampleBankId1 = gAudioContext.soundFontList[fontId].sampleBankId1;
+ sampleBankId2 = gAudioContext.soundFontList[fontId].sampleBankId2;
+ sampleBankReloc.sampleBankId1 = sampleBankId1;
+ sampleBankReloc.sampleBankId2 = sampleBankId2;
+ sampleBankReloc.baseAddr1 =
+ (sampleBankId1 != 0xFF) ? AudioLoad_GetSampleBank(sampleBankId1, &sampleBankReloc.medium1) : 0;
+ sampleBankReloc.baseAddr2 =
+ (sampleBankId2 != 0xFF) ? AudioLoad_GetSampleBank(sampleBankId2, &sampleBankReloc.medium2) : 0;
AudioLoad_SetFontLoadStatus(fontId, ASYNC_STATUS(retMsg));
- AudioLoad_RelocateFontAndPreloadSamples(fontId, asyncLoad->ramAddr, &relocInfo, true);
+ AudioLoad_RelocateFontAndPreloadSamples(fontId, asyncLoad->ramAddr, &sampleBankReloc, true);
break;
}
@@ -1700,28 +1745,48 @@ void AudioLoad_AsyncDmaRamUnloaded(AudioAsyncLoad* asyncLoad, size_t size) {
void AudioLoad_AsyncDmaUnkMedium(uintptr_t devAddr, void* ramAddr, size_t size, s16 arg3) {
}
-#define RELOC(v, base) (reloc = (void*)((uintptr_t)(v) + (uintptr_t)(base)))
-
-void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, AudioRelocInfo* relocInfo) {
- SoundFontSample* sample;
+/**
+ * Read and extract information from TunedSample and its Sample
+ * contained in the soundFont binary loaded into ram
+ * TunedSample contains metadata on a sample used by a particular instrument/drum/sfx
+ * Also relocate offsets into pointers within this loaded TunedSample
+ *
+ * @param fontId index of font being processed
+ * @param fontData ram address of raw soundfont binary loaded into cache
+ * @param sampleBankReloc information on the sampleBank containing raw audio samples
+ */
+void AudioLoad_RelocateSample(TunedSample* tunedSample, SoundFontData* fontData, SampleBankRelocInfo* sampleBankReloc) {
+ Sample* sample;
void* reloc;
- if ((uintptr_t)sound->sample <= 0x80000000) {
- sample = sound->sample = RELOC(sound->sample, mem);
- if (sample->size != 0 && sample->unk_bit25 != true) {
- sample->loop = RELOC(sample->loop, mem);
- sample->book = RELOC(sample->book, mem);
+ // Relocate an offset (relative to data loaded in ram at `base`) to a pointer (a ram address)
+#define AUDIO_RELOC(v, base) (reloc = (void*)((uintptr_t)(v) + (uintptr_t)(base)))
- // Resolve the sample medium 2-bit bitfield into a real value based on relocInfo.
+ if ((uintptr_t)tunedSample->sample <= AUDIO_RELOCATED_ADDRESS_START) {
+
+ sample = tunedSample->sample = AUDIO_RELOC(tunedSample->sample, fontData);
+
+ // If the sample exists and has not already been relocated
+ // Note: this is important, as the same sample can be used by different drums, sound effects, instruments
+ if ((sample->size != 0) && (sample->isRelocated != true)) {
+ sample->loop = AUDIO_RELOC(sample->loop, fontData);
+ sample->book = AUDIO_RELOC(sample->book, fontData);
+
+ // Resolve the sample medium 2-bit bitfield into a real value based on sampleBankReloc.
+ // Then relocate the offset sample within the sampleBank (not the fontData) into absolute address.
+ // sampleAddr can be either rom or ram depending on sampleBank cache policy
+ // in practice, this is always in rom
switch (sample->medium) {
case 0:
- sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr1);
- sample->medium = relocInfo->medium1;
+ sample->sampleAddr = AUDIO_RELOC(sample->sampleAddr, sampleBankReloc->baseAddr1);
+ sample->medium = sampleBankReloc->medium1;
break;
+
case 1:
- sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr2);
- sample->medium = relocInfo->medium2;
+ sample->sampleAddr = AUDIO_RELOC(sample->sampleAddr, sampleBankReloc->baseAddr2);
+ sample->medium = sampleBankReloc->medium2;
break;
+
case 2:
case 3:
// Invalid? This leaves sample->medium as MEDIUM_CART and MEDIUM_DISK_DRIVE
@@ -1729,7 +1794,8 @@ void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, AudioRe
break;
}
- sample->unk_bit25 = true;
+ sample->isRelocated = true;
+
if (sample->unk_bit26 && (sample->medium != MEDIUM_RAM)) {
gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample;
}
@@ -1737,12 +1803,19 @@ void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, AudioRe
}
}
-#undef RELOC
+#undef AUDIO_RELOC
-void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, AudioRelocInfo* relocInfo, s32 async) {
+/**
+ * @param fontId index of font being processed
+ * @param fontData ram address of raw soundfont binary loaded into cache
+ * @param sampleBankReloc information on the sampleBank containing raw audio samples
+ * @param isAsync bool for whether this is an asynchronous load or not
+ */
+void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* fontData, SampleBankRelocInfo* sampleBankReloc,
+ s32 isAsync) {
AudioPreloadReq* preload;
AudioPreloadReq* topPreload;
- SoundFontSample* sample;
+ Sample* sample;
size_t size;
s32 nChunks;
u8* sampleRamAddr;
@@ -1757,7 +1830,7 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, Aud
}
gAudioContext.numUsedSamples = 0;
- AudioLoad_RelocateFont(fontId, mem, relocInfo);
+ AudioLoad_RelocateFont(fontId, fontData, sampleBankReloc);
size = 0;
for (i = 0; i < gAudioContext.numUsedSamples; i++) {
@@ -1772,13 +1845,13 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, Aud
sample = gAudioContext.usedSamples[i];
sampleRamAddr = NULL;
- switch (async) {
+ switch (isAsync) {
case false:
- if (sample->medium == relocInfo->medium1) {
- sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1,
+ if (sample->medium == sampleBankReloc->medium1) {
+ sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId1,
sample->sampleAddr, sample->medium, CACHE_PERSISTENT);
- } else if (sample->medium == relocInfo->medium2) {
- sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2,
+ } else if (sample->medium == sampleBankReloc->medium2) {
+ sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId2,
sample->sampleAddr, sample->medium, CACHE_PERSISTENT);
} else if (sample->medium == MEDIUM_DISK_DRIVE) {
sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, 0xFE, sample->sampleAddr, sample->medium,
@@ -1787,23 +1860,26 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, Aud
break;
case true:
- if (sample->medium == relocInfo->medium1) {
- sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1,
+ if (sample->medium == sampleBankReloc->medium1) {
+ sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId1,
sample->sampleAddr, sample->medium, CACHE_TEMPORARY);
- } else if (sample->medium == relocInfo->medium2) {
- sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2,
+ } else if (sample->medium == sampleBankReloc->medium2) {
+ sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId2,
sample->sampleAddr, sample->medium, CACHE_TEMPORARY);
} else if (sample->medium == MEDIUM_DISK_DRIVE) {
sampleRamAddr = AudioHeap_AllocSampleCache(sample->size, 0xFE, sample->sampleAddr, sample->medium,
CACHE_TEMPORARY);
}
break;
+
+ default:
+ break;
}
if (sampleRamAddr == NULL) {
continue;
}
- switch (async) {
+ switch (isAsync) {
case false:
if (sample->medium == MEDIUM_UNK) {
AudioLoad_SyncDmaUnkMedium((uintptr_t)sample->sampleAddr, sampleRamAddr, sample->size,
@@ -1827,6 +1903,9 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, Aud
preload->endAndMediumKey = (uintptr_t)sample->sampleAddr + sample->size + sample->medium;
gAudioContext.preloadSampleStackTop++;
break;
+
+ default:
+ break;
}
}
gAudioContext.numUsedSamples = 0;
@@ -1841,7 +1920,7 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, Aud
}
s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus) {
- SoundFontSample* sample;
+ Sample* sample;
AudioPreloadReq* preload;
u32 preloadIndex;
u32 key;
@@ -1902,7 +1981,7 @@ s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus) {
return true;
}
-s32 AudioLoad_AddToSampleSet(SoundFontSample* sample, s32 numSamples, SoundFontSample** sampleSet) {
+s32 AudioLoad_AddToSampleSet(Sample* sample, s32 numSamples, Sample** sampleSet) {
s32 i;
for (i = 0; i < numSamples; i++) {
@@ -1919,18 +1998,18 @@ s32 AudioLoad_AddToSampleSet(SoundFontSample* sample, s32 numSamples, SoundFontS
return numSamples;
}
-s32 AudioLoad_GetSamplesForFont(s32 fontId, SoundFontSample** sampleSet) {
+s32 AudioLoad_GetSamplesForFont(s32 fontId, Sample** sampleSet) {
s32 i;
s32 numSamples = 0;
- s32 numDrums = gAudioContext.soundFonts[fontId].numDrums;
- s32 numInstruments = gAudioContext.soundFonts[fontId].numInstruments;
+ s32 numDrums = gAudioContext.soundFontList[fontId].numDrums;
+ s32 numInstruments = gAudioContext.soundFontList[fontId].numInstruments;
for (i = 0; i < numDrums; i++) {
Drum* drum = AudioPlayback_GetDrum(fontId, i);
if (1) {}
if (drum != NULL) {
- numSamples = AudioLoad_AddToSampleSet(drum->sound.sample, numSamples, sampleSet);
+ numSamples = AudioLoad_AddToSampleSet(drum->tunedSample.sample, numSamples, sampleSet);
}
}
@@ -1939,12 +2018,12 @@ s32 AudioLoad_GetSamplesForFont(s32 fontId, SoundFontSample** sampleSet) {
if (instrument != NULL) {
if (instrument->normalRangeLo != 0) {
- numSamples = AudioLoad_AddToSampleSet(instrument->lowNotesSound.sample, numSamples, sampleSet);
+ numSamples = AudioLoad_AddToSampleSet(instrument->lowPitchTunedSample.sample, numSamples, sampleSet);
}
if (instrument->normalRangeHi != 0x7F) {
- numSamples = AudioLoad_AddToSampleSet(instrument->highNotesSound.sample, numSamples, sampleSet);
+ numSamples = AudioLoad_AddToSampleSet(instrument->highPitchTunedSample.sample, numSamples, sampleSet);
}
- numSamples = AudioLoad_AddToSampleSet(instrument->normalNotesSound.sample, numSamples, sampleSet);
+ numSamples = AudioLoad_AddToSampleSet(instrument->normalPitchTunedSample.sample, numSamples, sampleSet);
}
}
@@ -1952,27 +2031,27 @@ s32 AudioLoad_GetSamplesForFont(s32 fontId, SoundFontSample** sampleSet) {
return numSamples;
}
-void AudioLoad_AddUsedSample(SoundFontSound* sound) {
- SoundFontSample* sample = sound->sample;
+void AudioLoad_AddUsedSample(TunedSample* tunedSample) {
+ Sample* sample = tunedSample->sample;
if ((sample->size != 0) && (sample->unk_bit26) && (sample->medium != MEDIUM_RAM)) {
gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample;
}
}
-void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, AudioRelocInfo* relocInfo) {
+void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, SampleBankRelocInfo* sampleBankReloc) {
s32 numDrums;
s32 numInstruments;
s32 numSfx;
Drum* drum;
Instrument* instrument;
- SoundFontSound* sound;
+ SoundEffect* soundEffect;
AudioPreloadReq* preload;
AudioPreloadReq* topPreload;
u8* addr;
size_t size;
s32 i;
- SoundFontSample* sample;
+ Sample* sample;
s32 preloadInProgress;
s32 nChunks;
@@ -1983,34 +2062,34 @@ void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, AudioRelocInfo* relo
gAudioContext.numUsedSamples = 0;
- numDrums = gAudioContext.soundFonts[fontId].numDrums;
- numInstruments = gAudioContext.soundFonts[fontId].numInstruments;
- numSfx = gAudioContext.soundFonts[fontId].numSfx;
+ numDrums = gAudioContext.soundFontList[fontId].numDrums;
+ numInstruments = gAudioContext.soundFontList[fontId].numInstruments;
+ numSfx = gAudioContext.soundFontList[fontId].numSfx;
for (i = 0; i < numInstruments; i++) {
instrument = AudioPlayback_GetInstrumentInner(fontId, i);
if (instrument != NULL) {
if (instrument->normalRangeLo != 0) {
- AudioLoad_AddUsedSample(&instrument->lowNotesSound);
+ AudioLoad_AddUsedSample(&instrument->lowPitchTunedSample);
}
if (instrument->normalRangeHi != 0x7F) {
- AudioLoad_AddUsedSample(&instrument->highNotesSound);
+ AudioLoad_AddUsedSample(&instrument->highPitchTunedSample);
}
- AudioLoad_AddUsedSample(&instrument->normalNotesSound);
+ AudioLoad_AddUsedSample(&instrument->normalPitchTunedSample);
}
}
for (i = 0; i < numDrums; i++) {
drum = AudioPlayback_GetDrum(fontId, i);
if (drum != NULL) {
- AudioLoad_AddUsedSample(&drum->sound);
+ AudioLoad_AddUsedSample(&drum->tunedSample);
}
}
for (i = 0; i < numSfx; i++) {
- sound = AudioPlayback_GetSfx(fontId, i);
- if (sound != NULL) {
- AudioLoad_AddUsedSample(sound);
+ soundEffect = AudioPlayback_GetSoundEffect(fontId, i);
+ if (soundEffect != NULL) {
+ AudioLoad_AddUsedSample(&soundEffect->tunedSample);
}
}
@@ -2036,21 +2115,21 @@ void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, AudioRelocInfo* relo
switch (async) {
case false:
- if (sample->medium == relocInfo->medium1) {
- addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr,
+ if (sample->medium == sampleBankReloc->medium1) {
+ addr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId1, sample->sampleAddr,
sample->medium, CACHE_PERSISTENT);
- } else if (sample->medium == relocInfo->medium2) {
- addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr,
+ } else if (sample->medium == sampleBankReloc->medium2) {
+ addr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId2, sample->sampleAddr,
sample->medium, CACHE_PERSISTENT);
}
break;
case true:
- if (sample->medium == relocInfo->medium1) {
- addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr,
+ if (sample->medium == sampleBankReloc->medium1) {
+ addr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId1, sample->sampleAddr,
sample->medium, CACHE_TEMPORARY);
- } else if (sample->medium == relocInfo->medium2) {
- addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr,
+ } else if (sample->medium == sampleBankReloc->medium2) {
+ addr = AudioHeap_AllocSampleCache(sample->size, sampleBankReloc->sampleBankId2, sample->sampleAddr,
sample->medium, CACHE_TEMPORARY);
}
break;
@@ -2104,23 +2183,25 @@ void AudioLoad_LoadPermanentSamples(void) {
sampleBankTable = AudioLoad_GetLoadTable(SAMPLE_TABLE);
for (i = 0; i < gAudioContext.permanentPool.count; i++) {
- AudioRelocInfo relocInfo;
+ SampleBankRelocInfo sampleBankReloc;
if (gAudioContext.permanentEntries[i].tableType == FONT_TABLE) {
fontId = AudioLoad_GetRealTableIndex(FONT_TABLE, gAudioContext.permanentEntries[i].id);
- relocInfo.sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1;
- relocInfo.sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2;
+ sampleBankReloc.sampleBankId1 = gAudioContext.soundFontList[fontId].sampleBankId1;
+ sampleBankReloc.sampleBankId2 = gAudioContext.soundFontList[fontId].sampleBankId2;
- if (relocInfo.sampleBankId1 != 0xFF) {
- relocInfo.sampleBankId1 = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, relocInfo.sampleBankId1);
- relocInfo.medium1 = sampleBankTable->entries[relocInfo.sampleBankId1].medium;
+ if (sampleBankReloc.sampleBankId1 != 0xFF) {
+ sampleBankReloc.sampleBankId1 =
+ AudioLoad_GetRealTableIndex(SAMPLE_TABLE, sampleBankReloc.sampleBankId1);
+ sampleBankReloc.medium1 = sampleBankTable->entries[sampleBankReloc.sampleBankId1].medium;
}
- if (relocInfo.sampleBankId2 != 0xFF) {
- relocInfo.sampleBankId2 = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, relocInfo.sampleBankId2);
- relocInfo.medium2 = sampleBankTable->entries[relocInfo.sampleBankId2].medium;
+ if (sampleBankReloc.sampleBankId2 != 0xFF) {
+ sampleBankReloc.sampleBankId2 =
+ AudioLoad_GetRealTableIndex(SAMPLE_TABLE, sampleBankReloc.sampleBankId2);
+ sampleBankReloc.medium2 = sampleBankTable->entries[sampleBankReloc.sampleBankId2].medium;
}
- AudioLoad_PreloadSamplesForFont(fontId, false, &relocInfo);
+ AudioLoad_PreloadSamplesForFont(fontId, false, &sampleBankReloc);
}
}
}
diff --git a/src/code/audio/audio_playback.c b/src/code/audio/audio_playback.c
index e7f5153ac2..e1a42b1eda 100644
--- a/src/code/audio/audio_playback.c
+++ b/src/code/audio/audio_playback.c
@@ -4,9 +4,10 @@ void AudioPlayback_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRat
void AudioPlayback_AudioListPushFront(AudioListItem* list, AudioListItem* item);
void AudioPlayback_NoteInitForLayer(Note* note, SequenceLayer* layer);
-void AudioPlayback_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) {
- f32 volRight, volLeft;
- s32 smallPanIndex;
+void AudioPlayback_InitNoteSub(Note* note, NoteSubEu* noteSubEu, NoteSubAttributes* subAttrs) {
+ f32 volLeft;
+ f32 volRight;
+ s32 halfPanIndex;
u64 pad;
u8 strongLeft;
u8 strongRight;
@@ -16,41 +17,41 @@ void AudioPlayback_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* at
StereoData stereoData;
s32 stereoHeadsetEffects = note->playbackState.stereoHeadsetEffects;
- vel = attrs->velocity;
- pan = attrs->pan;
- reverbVol = attrs->reverbVol;
- stereoData = attrs->stereo.s;
+ vel = subAttrs->velocity;
+ pan = subAttrs->pan;
+ reverbVol = subAttrs->reverbVol;
+ stereoData = subAttrs->stereo.s;
- sub->bitField0 = note->noteSubEu.bitField0;
- sub->bitField1 = note->noteSubEu.bitField1;
- sub->sound.samples = note->noteSubEu.sound.samples;
- sub->unk_06 = note->noteSubEu.unk_06;
+ noteSubEu->bitField0 = note->noteSubEu.bitField0;
+ noteSubEu->bitField1 = note->noteSubEu.bitField1;
+ noteSubEu->waveSampleAddr = note->noteSubEu.waveSampleAddr;
+ noteSubEu->harmonicIndexCurAndPrev = note->noteSubEu.harmonicIndexCurAndPrev;
- AudioPlayback_NoteSetResamplingRate(sub, attrs->frequency);
+ AudioPlayback_NoteSetResamplingRate(noteSubEu, subAttrs->frequency);
pan &= 0x7F;
- sub->bitField0.stereoStrongRight = false;
- sub->bitField0.stereoStrongLeft = false;
- sub->bitField0.stereoHeadsetEffects = stereoData.stereoHeadsetEffects;
- sub->bitField0.usesHeadsetPanEffects = stereoData.usesHeadsetPanEffects;
- if (stereoHeadsetEffects && gAudioContext.soundMode == SOUNDMODE_HEADSET) {
- smallPanIndex = pan >> 1;
- if (smallPanIndex > 0x3F) {
- smallPanIndex = 0x3F;
+ noteSubEu->bitField0.stereoStrongRight = false;
+ noteSubEu->bitField0.stereoStrongLeft = false;
+ noteSubEu->bitField0.stereoHeadsetEffects = stereoData.stereoHeadsetEffects;
+ noteSubEu->bitField0.usesHeadsetPanEffects = stereoData.usesHeadsetPanEffects;
+ if (stereoHeadsetEffects && (gAudioContext.soundMode == SOUNDMODE_HEADSET)) {
+ halfPanIndex = pan >> 1;
+ if (halfPanIndex > 0x3F) {
+ halfPanIndex = 0x3F;
}
- sub->headsetPanLeft = gHeadsetPanQuantization[smallPanIndex];
- sub->headsetPanRight = gHeadsetPanQuantization[0x3F - smallPanIndex];
- sub->bitField1.usesHeadsetPanEffects2 = true;
+ noteSubEu->headsetPanLeft = gHeadsetPanQuantization[halfPanIndex];
+ noteSubEu->headsetPanRight = gHeadsetPanQuantization[0x3F - halfPanIndex];
+ noteSubEu->bitField1.usesHeadsetPanEffects2 = true;
volLeft = gHeadsetPanVolume[pan];
volRight = gHeadsetPanVolume[0x7F - pan];
- } else if (stereoHeadsetEffects && gAudioContext.soundMode == SOUNDMODE_STEREO) {
+ } else if (stereoHeadsetEffects && (gAudioContext.soundMode == SOUNDMODE_STEREO)) {
strongLeft = strongRight = false;
- sub->headsetPanRight = 0;
- sub->headsetPanLeft = 0;
- sub->bitField1.usesHeadsetPanEffects2 = false;
+ noteSubEu->headsetPanRight = 0;
+ noteSubEu->headsetPanLeft = 0;
+ noteSubEu->bitField1.usesHeadsetPanEffects2 = false;
volLeft = gStereoPanVolume[pan];
volRight = gStereoPanVolume[0x7F - pan];
@@ -60,34 +61,38 @@ void AudioPlayback_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* at
strongRight = true;
}
- sub->bitField0.stereoStrongRight = strongRight;
- sub->bitField0.stereoStrongLeft = strongLeft;
+ // case 0:
+ noteSubEu->bitField0.stereoStrongRight = strongRight;
+ noteSubEu->bitField0.stereoStrongLeft = strongLeft;
switch (stereoData.bit2) {
case 0:
break;
+
case 1:
- sub->bitField0.stereoStrongRight = stereoData.strongRight;
- sub->bitField0.stereoStrongLeft = stereoData.strongLeft;
+ noteSubEu->bitField0.stereoStrongRight = stereoData.strongRight;
+ noteSubEu->bitField0.stereoStrongLeft = stereoData.strongLeft;
break;
+
case 2:
- sub->bitField0.stereoStrongRight = stereoData.strongRight | strongRight;
- sub->bitField0.stereoStrongLeft = stereoData.strongLeft | strongLeft;
+ noteSubEu->bitField0.stereoStrongRight = stereoData.strongRight | strongRight;
+ noteSubEu->bitField0.stereoStrongLeft = stereoData.strongLeft | strongLeft;
break;
+
case 3:
- sub->bitField0.stereoStrongRight = stereoData.strongRight ^ strongRight;
- sub->bitField0.stereoStrongLeft = stereoData.strongLeft ^ strongLeft;
+ noteSubEu->bitField0.stereoStrongRight = stereoData.strongRight ^ strongRight;
+ noteSubEu->bitField0.stereoStrongLeft = stereoData.strongLeft ^ strongLeft;
break;
}
} else if (gAudioContext.soundMode == SOUNDMODE_MONO) {
- sub->bitField0.stereoHeadsetEffects = false;
- sub->bitField0.usesHeadsetPanEffects = false;
+ noteSubEu->bitField0.stereoHeadsetEffects = false;
+ noteSubEu->bitField0.usesHeadsetPanEffects = false;
volLeft = 0.707f; // approx 1/sqrt(2)
volRight = 0.707f;
} else {
- sub->bitField0.stereoStrongRight = stereoData.strongRight;
- sub->bitField0.stereoStrongLeft = stereoData.strongLeft;
+ noteSubEu->bitField0.stereoStrongRight = stereoData.strongRight;
+ noteSubEu->bitField0.stereoStrongLeft = stereoData.strongLeft;
volLeft = gDefaultPanVolume[pan];
volRight = gDefaultPanVolume[0x7F - pan];
}
@@ -95,15 +100,15 @@ void AudioPlayback_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* at
vel = 0.0f > vel ? 0.0f : vel;
vel = 1.0f < vel ? 1.0f : vel;
- sub->targetVolLeft = (s32)((vel * volLeft) * (0x1000 - 0.001f));
- sub->targetVolRight = (s32)((vel * volRight) * (0x1000 - 0.001f));
+ noteSubEu->targetVolLeft = (s32)((vel * volLeft) * (0x1000 - 0.001f));
+ noteSubEu->targetVolRight = (s32)((vel * volRight) * (0x1000 - 0.001f));
- sub->gain = attrs->gain;
- sub->filter = attrs->filter;
- sub->unk_07 = attrs->unk_14;
- sub->unk_0E = attrs->unk_16;
- sub->reverbVol = reverbVol;
- sub->unk_19 = attrs->unk_3;
+ noteSubEu->gain = subAttrs->gain;
+ noteSubEu->filter = subAttrs->filter;
+ noteSubEu->unk_07 = subAttrs->unk_14;
+ noteSubEu->unk_0E = subAttrs->unk_16;
+ noteSubEu->reverbVol = reverbVol;
+ noteSubEu->unk_19 = subAttrs->unk_3;
}
void AudioPlayback_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput) {
@@ -133,7 +138,7 @@ void AudioPlayback_NoteInit(Note* note) {
¬e->playbackState.adsrVolScaleUnused);
}
- note->playbackState.unk_04 = 0;
+ note->playbackState.status = PLAYBACK_STATUS_0;
note->playbackState.adsr.action.s.state = ADSR_STATE_INITIAL;
note->noteSubEu = gDefaultNoteSub;
}
@@ -144,7 +149,7 @@ void AudioPlayback_NoteDisable(Note* note) {
}
note->playbackState.priority = 0;
note->noteSubEu.bitField0.enabled = false;
- note->playbackState.unk_04 = 0;
+ note->playbackState.status = PLAYBACK_STATUS_0;
note->noteSubEu.bitField0.finished = false;
note->playbackState.parentLayer = NO_LAYER;
note->playbackState.prevParentLayer = NO_LAYER;
@@ -154,7 +159,7 @@ void AudioPlayback_NoteDisable(Note* note) {
void AudioPlayback_ProcessNotes(void) {
s32 pad;
- s32 unk_04;
+ s32 playbackStatus;
NoteAttributes* attrs;
NoteSubEu* noteSubEu2;
NoteSubEu* noteSubEu;
@@ -174,19 +179,19 @@ void AudioPlayback_ProcessNotes(void) {
continue;
}
- if (note != playbackState->parentLayer->note && playbackState->unk_04 == 0) {
+ if ((note != playbackState->parentLayer->note) && (playbackState->status == PLAYBACK_STATUS_0)) {
playbackState->adsr.action.s.release = true;
playbackState->adsr.fadeOutVel = gAudioContext.audioBufferParameters.updatesPerFrameInv;
playbackState->priority = 1;
- playbackState->unk_04 = 2;
+ playbackState->status = PLAYBACK_STATUS_2;
goto out;
- } else if (!playbackState->parentLayer->enabled && playbackState->unk_04 == 0 &&
- playbackState->priority >= 1) {
+ } else if (!playbackState->parentLayer->enabled && (playbackState->status == PLAYBACK_STATUS_0) &&
+ (playbackState->priority >= 1)) {
// do nothing
} else if (playbackState->parentLayer->channel->seqPlayer == NULL) {
AudioSeq_SequenceChannelDisable(playbackState->parentLayer->channel);
playbackState->priority = 1;
- playbackState->unk_04 = 1;
+ playbackState->status = PLAYBACK_STATUS_1;
continue;
} else if (playbackState->parentLayer->channel->seqPlayer->muted &&
(playbackState->parentLayer->channel->muteFlags & MUTE_FLAGS_STOP_NOTES)) {
@@ -199,8 +204,8 @@ void AudioPlayback_ProcessNotes(void) {
AudioPlayback_AudioListRemove(¬e->listItem);
AudioPlayback_AudioListPushFront(¬e->listItem.pool->decaying, ¬e->listItem);
playbackState->priority = 1;
- playbackState->unk_04 = 2;
- } else if (playbackState->unk_04 == 0 && playbackState->priority >= 1) {
+ playbackState->status = PLAYBACK_STATUS_2;
+ } else if ((playbackState->status == PLAYBACK_STATUS_0) && (playbackState->priority >= 1)) {
continue;
}
@@ -208,8 +213,8 @@ void AudioPlayback_ProcessNotes(void) {
if (playbackState->priority != 0) {
if (1) {}
noteSubEu = ¬e->noteSubEu;
- if (playbackState->unk_04 >= 1 || noteSubEu->bitField0.finished) {
- if (playbackState->adsr.action.s.state == ADSR_STATE_DISABLED || noteSubEu->bitField0.finished) {
+ if ((playbackState->status >= 1) || noteSubEu->bitField0.finished) {
+ if ((playbackState->adsr.action.s.state == ADSR_STATE_DISABLED) || noteSubEu->bitField0.finished) {
if (playbackState->wantedParentLayer != NO_LAYER) {
AudioPlayback_NoteDisable(note);
if (playbackState->wantedParentLayer->channel != NULL) {
@@ -249,9 +254,9 @@ void AudioPlayback_ProcessNotes(void) {
scale = AudioEffects_AdsrUpdate(&playbackState->adsr);
AudioEffects_NoteVibratoUpdate(note);
- unk_04 = playbackState->unk_04;
+ playbackStatus = playbackState->status;
attrs = &playbackState->attributes;
- if (unk_04 == 1 || unk_04 == 2) {
+ if ((playbackStatus == PLAYBACK_STATUS_1) || (playbackStatus == PLAYBACK_STATUS_2)) {
subAttrs.frequency = attrs->freqScale;
subAttrs.velocity = attrs->velocity;
subAttrs.pan = attrs->pan;
@@ -317,17 +322,18 @@ void AudioPlayback_ProcessNotes(void) {
}
}
-SoundFontSound* AudioPlayback_InstrumentGetSound(Instrument* instrument, s32 semitone) {
- SoundFontSound* sound;
+TunedSample* AudioPlayback_GetInstrumentTunedSample(Instrument* instrument, s32 semitone) {
+ TunedSample* tunedSample;
if (semitone < instrument->normalRangeLo) {
- sound = &instrument->lowNotesSound;
+ tunedSample = &instrument->lowPitchTunedSample;
} else if (semitone <= instrument->normalRangeHi) {
- sound = &instrument->normalNotesSound;
+ tunedSample = &instrument->normalPitchTunedSample;
} else {
- sound = &instrument->highNotesSound;
+ tunedSample = &instrument->highPitchTunedSample;
}
- return sound;
+
+ return tunedSample;
}
Instrument* AudioPlayback_GetInstrumentInner(s32 fontId, s32 instId) {
@@ -338,18 +344,18 @@ Instrument* AudioPlayback_GetInstrumentInner(s32 fontId, s32 instId) {
}
if (!AudioLoad_IsFontLoadComplete(fontId)) {
- gAudioContext.audioErrorFlags = fontId + 0x10000000;
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(0, fontId, AUDIO_ERROR_FONT_NOT_LOADED);
return NULL;
}
- if (instId >= gAudioContext.soundFonts[fontId].numInstruments) {
- gAudioContext.audioErrorFlags = ((fontId << 8) + instId) + 0x3000000;
+ if (instId >= gAudioContext.soundFontList[fontId].numInstruments) {
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(fontId, instId, AUDIO_ERROR_INVALID_INST_ID);
return NULL;
}
- inst = gAudioContext.soundFonts[fontId].instruments[instId];
+ inst = gAudioContext.soundFontList[fontId].instruments[instId];
if (inst == NULL) {
- gAudioContext.audioErrorFlags = ((fontId << 8) + instId) + 0x1000000;
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(fontId, instId, AUDIO_ERROR_NO_INST);
return inst;
}
@@ -364,58 +370,58 @@ Drum* AudioPlayback_GetDrum(s32 fontId, s32 drumId) {
}
if (!AudioLoad_IsFontLoadComplete(fontId)) {
- gAudioContext.audioErrorFlags = fontId + 0x10000000;
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(0, fontId, AUDIO_ERROR_FONT_NOT_LOADED);
return NULL;
}
- if (drumId >= gAudioContext.soundFonts[fontId].numDrums) {
- gAudioContext.audioErrorFlags = ((fontId << 8) + drumId) + 0x4000000;
+ if (drumId >= gAudioContext.soundFontList[fontId].numDrums) {
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(fontId, drumId, AUDIO_ERROR_INVALID_DRUM_SFX_ID);
return NULL;
}
- if ((u32)gAudioContext.soundFonts[fontId].drums < 0x80000000) {
+ if ((u32)gAudioContext.soundFontList[fontId].drums < AUDIO_RELOCATED_ADDRESS_START) {
return NULL;
}
- drum = gAudioContext.soundFonts[fontId].drums[drumId];
+ drum = gAudioContext.soundFontList[fontId].drums[drumId];
if (drum == NULL) {
- gAudioContext.audioErrorFlags = ((fontId << 8) + drumId) + 0x5000000;
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(fontId, drumId, AUDIO_ERROR_NO_DRUM_SFX);
}
return drum;
}
-SoundFontSound* AudioPlayback_GetSfx(s32 fontId, s32 sfxId) {
- SoundFontSound* sfx;
+SoundEffect* AudioPlayback_GetSoundEffect(s32 fontId, s32 sfxId) {
+ SoundEffect* soundEffect;
if (fontId == 0xFF) {
return NULL;
}
if (!AudioLoad_IsFontLoadComplete(fontId)) {
- gAudioContext.audioErrorFlags = fontId + 0x10000000;
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(0, fontId, AUDIO_ERROR_FONT_NOT_LOADED);
return NULL;
}
- if (sfxId >= gAudioContext.soundFonts[fontId].numSfx) {
- gAudioContext.audioErrorFlags = ((fontId << 8) + sfxId) + 0x4000000;
+ if (sfxId >= gAudioContext.soundFontList[fontId].numSfx) {
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(fontId, sfxId, AUDIO_ERROR_INVALID_DRUM_SFX_ID);
return NULL;
}
- if ((u32)gAudioContext.soundFonts[fontId].soundEffects < 0x80000000) {
+ if ((u32)gAudioContext.soundFontList[fontId].soundEffects < AUDIO_RELOCATED_ADDRESS_START) {
return NULL;
}
- sfx = &gAudioContext.soundFonts[fontId].soundEffects[sfxId];
+ soundEffect = &gAudioContext.soundFontList[fontId].soundEffects[sfxId];
- if (sfx == NULL) {
- gAudioContext.audioErrorFlags = ((fontId << 8) + sfxId) + 0x5000000;
+ if (soundEffect == NULL) {
+ gAudioContext.audioErrorFlags = AUDIO_ERROR(fontId, sfxId, AUDIO_ERROR_NO_DRUM_SFX);
}
- if (sfx->sample == NULL) {
+ if (soundEffect->tunedSample.sample == NULL) {
return NULL;
}
- return sfx;
+ return soundEffect;
}
s32 AudioPlayback_SetFontInstrument(s32 instrumentType, s32 fontId, s32 index, void* value) {
@@ -429,24 +435,24 @@ s32 AudioPlayback_SetFontInstrument(s32 instrumentType, s32 fontId, s32 index, v
switch (instrumentType) {
case 0:
- if (index >= gAudioContext.soundFonts[fontId].numDrums) {
+ if (index >= gAudioContext.soundFontList[fontId].numDrums) {
return -3;
}
- gAudioContext.soundFonts[fontId].drums[index] = value;
+ gAudioContext.soundFontList[fontId].drums[index] = value;
break;
case 1:
- if (index >= gAudioContext.soundFonts[fontId].numSfx) {
+ if (index >= gAudioContext.soundFontList[fontId].numSfx) {
return -3;
}
- gAudioContext.soundFonts[fontId].soundEffects[index] = *(SoundFontSound*)value;
+ gAudioContext.soundFontList[fontId].soundEffects[index] = *(SoundEffect*)value;
break;
default:
- if (index >= gAudioContext.soundFonts[fontId].numInstruments) {
+ if (index >= gAudioContext.soundFontList[fontId].numInstruments) {
return -3;
}
- gAudioContext.soundFonts[fontId].instruments[index] = value;
+ gAudioContext.soundFontList[fontId].instruments[index] = value;
break;
}
@@ -456,7 +462,7 @@ s32 AudioPlayback_SetFontInstrument(s32 instrumentType, s32 fontId, s32 index, v
void AudioPlayback_SeqLayerDecayRelease(SequenceLayer* layer, s32 target) {
Note* note;
NoteAttributes* attrs;
- SequenceChannel* chan;
+ SequenceChannel* channel;
s32 i;
if (layer == NO_LAYER) {
@@ -491,27 +497,27 @@ void AudioPlayback_SeqLayerDecayRelease(SequenceLayer* layer, s32 target) {
attrs->pan = layer->notePan;
if (layer->channel != NULL) {
- chan = layer->channel;
+ channel = layer->channel;
if (layer->unk_0A.s.bit_2 == 1) {
- attrs->reverb = chan->reverb;
+ attrs->reverb = channel->reverb;
} else {
attrs->reverb = layer->unk_09;
}
if (layer->unk_08 == 0x80) {
- attrs->unk_3 = chan->unk_10;
+ attrs->unk_3 = channel->unk_10;
} else {
attrs->unk_3 = layer->unk_08;
}
if (layer->unk_0A.s.bit_9 == 1) {
- attrs->gain = chan->gain;
+ attrs->gain = channel->gain;
} else {
attrs->gain = 0;
}
- attrs->filter = chan->filter;
+ attrs->filter = channel->filter;
if (attrs->filter != NULL) {
for (i = 0; i < 8; i++) {
@@ -520,18 +526,18 @@ void AudioPlayback_SeqLayerDecayRelease(SequenceLayer* layer, s32 target) {
attrs->filter = attrs->filterBuf;
}
- attrs->unk_6 = chan->unk_20;
- attrs->unk_4 = chan->unk_0F;
- if (chan->seqPlayer->muted && (chan->muteFlags & MUTE_FLAGS_3)) {
+ attrs->unk_6 = channel->unk_20;
+ attrs->unk_4 = channel->unk_0F;
+ if (channel->seqPlayer->muted && (channel->muteFlags & MUTE_FLAGS_3)) {
note->noteSubEu.bitField0.finished = true;
}
if (layer->stereo.asByte == 0) {
- attrs->stereo = chan->stereo;
+ attrs->stereo = channel->stereo;
} else {
attrs->stereo = layer->stereo;
}
- note->playbackState.priority = chan->someOtherPriority;
+ note->playbackState.priority = channel->someOtherPriority;
} else {
attrs->stereo = layer->stereo;
note->playbackState.priority = 1;
@@ -542,9 +548,9 @@ void AudioPlayback_SeqLayerDecayRelease(SequenceLayer* layer, s32 target) {
if (target == ADSR_STATE_RELEASE) {
note->playbackState.adsr.fadeOutVel = gAudioContext.audioBufferParameters.updatesPerFrameInv;
note->playbackState.adsr.action.s.release = true;
- note->playbackState.unk_04 = 2;
+ note->playbackState.status = PLAYBACK_STATUS_2;
} else {
- note->playbackState.unk_04 = 1;
+ note->playbackState.status = PLAYBACK_STATUS_1;
note->playbackState.adsr.action.s.decay = true;
if (layer->adsr.decayIndex == 0) {
note->playbackState.adsr.fadeOutVel = gAudioContext.adsrDecayTable[layer->channel->adsr.decayIndex];
@@ -570,10 +576,18 @@ void AudioPlayback_SeqLayerNoteRelease(SequenceLayer* layer) {
AudioPlayback_SeqLayerDecayRelease(layer, ADSR_STATE_RELEASE);
}
+/**
+ * Extract the synthetic wave to use from gWaveSamples and update corresponding frequencies
+ *
+ * @param note
+ * @param layer
+ * @param waveId the index of the type of synthetic wave to use, offset by 128
+ * @return harmonicIndex, the index of the harmonic for the synthetic wave contained in gWaveSamples
+ */
s32 AudioPlayback_BuildSyntheticWave(Note* note, SequenceLayer* layer, s32 waveId) {
f32 freqScale;
- f32 ratio;
- u8 sampleCountIndex;
+ f32 freqRatio;
+ u8 harmonicIndex;
if (waveId < 128) {
waveId = 128;
@@ -583,42 +597,48 @@ s32 AudioPlayback_BuildSyntheticWave(Note* note, SequenceLayer* layer, s32 waveI
if (layer->portamento.mode != 0 && 0.0f < layer->portamento.extent) {
freqScale *= (layer->portamento.extent + 1.0f);
}
+
+ // Map frequency to the harmonic to use from gWaveSamples
if (freqScale < 0.99999f) {
- sampleCountIndex = 0;
- ratio = 1.0465f;
+ harmonicIndex = 0;
+ freqRatio = 1.0465f;
} else if (freqScale < 1.99999f) {
- sampleCountIndex = 1;
- ratio = 0.52325f;
+ harmonicIndex = 1;
+ freqRatio = 1.0465f / 2;
} else if (freqScale < 3.99999f) {
- sampleCountIndex = 2;
- ratio = 0.26263f;
+ harmonicIndex = 2;
+ freqRatio = 1.0465f / 4 + 1.005E-3;
} else {
- sampleCountIndex = 3;
- ratio = 0.13081f;
+ harmonicIndex = 3;
+ freqRatio = 1.0465f / 8 - 2.5E-6;
}
- layer->freqScale *= ratio;
+
+ // Update results
+ layer->freqScale *= freqRatio;
note->playbackState.waveId = waveId;
- note->playbackState.sampleCountIndex = sampleCountIndex;
+ note->playbackState.harmonicIndex = harmonicIndex;
- note->noteSubEu.sound.samples = &gWaveSamples[waveId - 128][sampleCountIndex * 64];
+ // Save the pointer to the synthethic wave
+ // waveId index starts at 128, there are WAVE_SAMPLE_COUNT samples to read from
+ note->noteSubEu.waveSampleAddr = &gWaveSamples[waveId - 128][harmonicIndex * WAVE_SAMPLE_COUNT];
- return sampleCountIndex;
+ return harmonicIndex;
}
void AudioPlayback_InitSyntheticWave(Note* note, SequenceLayer* layer) {
- s32 sampleCountIndex;
- s32 waveSampleCountIndex;
+ s32 prevHarmonicIndex;
+ s32 curHarmonicIndex;
s32 waveId = layer->instOrWave;
if (waveId == 0xFF) {
waveId = layer->channel->instOrWave;
}
- sampleCountIndex = note->playbackState.sampleCountIndex;
- waveSampleCountIndex = AudioPlayback_BuildSyntheticWave(note, layer, waveId);
+ prevHarmonicIndex = note->playbackState.harmonicIndex;
+ curHarmonicIndex = AudioPlayback_BuildSyntheticWave(note, layer, waveId);
- if (waveSampleCountIndex != sampleCountIndex) {
- note->noteSubEu.unk_06 = waveSampleCountIndex * 4 + sampleCountIndex;
+ if (curHarmonicIndex != prevHarmonicIndex) {
+ note->noteSubEu.harmonicIndexCurAndPrev = (curHarmonicIndex << 2) + prevHarmonicIndex;
}
}
@@ -805,7 +825,7 @@ void AudioPlayback_NoteInitForLayer(Note* note, SequenceLayer* layer) {
if (instId == 0xFF) {
instId = channel->instOrWave;
}
- noteSubEu->sound.soundFontSound = layer->sound;
+ noteSubEu->tunedSample = layer->tunedSample;
if (instId >= 0x80 && instId < 0xC0) {
noteSubEu->bitField1.isSyntheticWave = true;
@@ -815,12 +835,12 @@ void AudioPlayback_NoteInitForLayer(Note* note, SequenceLayer* layer) {
if (noteSubEu->bitField1.isSyntheticWave) {
AudioPlayback_BuildSyntheticWave(note, layer, instId);
- } else if (channel->unk_DC == 1) {
- playbackState->unk_84 = noteSubEu->sound.soundFontSound->sample->loop->start;
+ } else if (channel->startSamplePos == 1) {
+ playbackState->startSamplePos = noteSubEu->tunedSample->sample->loop->start;
} else {
- playbackState->unk_84 = channel->unk_DC;
- if (playbackState->unk_84 >= noteSubEu->sound.soundFontSound->sample->loop->end) {
- playbackState->unk_84 = 0;
+ playbackState->startSamplePos = channel->startSamplePos;
+ if (playbackState->startSamplePos >= noteSubEu->tunedSample->sample->loop->end) {
+ playbackState->startSamplePos = 0;
}
}
@@ -969,7 +989,7 @@ void AudioPlayback_NoteInitAll(void) {
note = &gAudioContext.notes[i];
note->noteSubEu = gZeroNoteSub;
note->playbackState.priority = 0;
- note->playbackState.unk_04 = 0;
+ note->playbackState.status = PLAYBACK_STATUS_0;
note->playbackState.parentLayer = NO_LAYER;
note->playbackState.wantedParentLayer = NO_LAYER;
note->playbackState.prevParentLayer = NO_LAYER;
@@ -981,7 +1001,7 @@ void AudioPlayback_NoteInitAll(void) {
note->playbackState.portamento.cur = 0;
note->playbackState.portamento.speed = 0;
note->playbackState.stereoHeadsetEffects = false;
- note->playbackState.unk_84 = 0;
+ note->playbackState.startSamplePos = 0;
note->synthesisState.synthesisBuffers = AudioHeap_AllocDmaMemory(&gAudioContext.miscPool, 0x2E0);
note->playbackState.attributes.filterBuf = AudioHeap_AllocDmaMemory(&gAudioContext.miscPool, 0x10);
}
diff --git a/src/code/audio/audio_seqplayer.c b/src/code/audio/audio_seqplayer.c
index ebcc9a8d1c..ea5c5ed5e4 100644
--- a/src/code/audio/audio_seqplayer.c
+++ b/src/code/audio/audio_seqplayer.c
@@ -33,7 +33,7 @@ u8 AudioSeq_ScriptReadU8(SeqScriptState* state);
s16 AudioSeq_ScriptReadS16(SeqScriptState* state);
u16 AudioSeq_ScriptReadCompressedU16(SeqScriptState* state);
void AudioSeq_SeqLayerProcessScriptStep1(SequenceLayer* layer);
-s32 AudioSeq_SeqLayerProcessScriptStep5(SequenceLayer* layer, s32 sameSound);
+s32 AudioSeq_SeqLayerProcessScriptStep5(SequenceLayer* layer, s32 sameTunedSample);
s32 AudioSeq_SeqLayerProcessScriptStep2(SequenceLayer* layer);
s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd);
s32 AudioSeq_SeqLayerProcessScriptStep3(SequenceLayer* layer, s32 cmd);
@@ -320,7 +320,7 @@ void AudioSeq_InitSequenceChannel(SequenceChannel* channel) {
channel->unused = false;
AudioPlayback_InitNoteLists(&channel->notePool);
- channel->unk_DC = 0;
+ channel->startSamplePos = 0;
channel->unk_E0 = 0;
channel->sfxState = NULL;
}
@@ -582,7 +582,7 @@ void AudioSeq_SeqLayerProcessScript(SequenceLayer* layer) {
} while ((cmd == -1) && (layer->delay == 0));
if (cmd != PROCESS_SCRIPT_END) {
- // returns `sameSound` instead of a command
+ // returns `sameTunedSample` instead of a command
cmd = AudioSeq_SeqLayerProcessScriptStep4(layer, cmd);
}
@@ -611,20 +611,20 @@ void AudioSeq_SeqLayerProcessScriptStep1(SequenceLayer* layer) {
layer->notePropertiesNeedInit = true;
}
-s32 AudioSeq_SeqLayerProcessScriptStep5(SequenceLayer* layer, s32 sameSound) {
+s32 AudioSeq_SeqLayerProcessScriptStep5(SequenceLayer* layer, s32 sameTunedSample) {
Note* note;
if ((layer->continuousNotes == true) && (layer->bit1 == true)) {
return 0;
}
- if ((layer->continuousNotes == true) && (layer->note != NULL) && layer->bit3 && (sameSound == true) &&
+ if ((layer->continuousNotes == true) && (layer->note != NULL) && layer->bit3 && (sameTunedSample == true) &&
(layer->note->playbackState.parentLayer == layer)) {
- if (layer->sound == NULL) {
+ if (layer->tunedSample == NULL) {
AudioPlayback_InitSyntheticWave(layer->note, layer);
}
} else {
- if (!sameSound) {
+ if (!sameTunedSample) {
AudioPlayback_SeqLayerNoteDecay(layer);
}
@@ -815,7 +815,7 @@ s32 AudioSeq_SeqLayerProcessScriptStep2(SequenceLayer* layer) {
}
s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
- s32 sameSound = true;
+ s32 sameTunedSample = true;
s32 instOrWave;
s32 speed;
f32 temp_f14;
@@ -823,10 +823,10 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
Portamento* portamento;
f32 freqScale;
f32 freqScale2;
- SoundFontSound* sound;
+ TunedSample* tunedSample;
Instrument* instrument;
Drum* drum;
- s32 pad;
+ SoundEffect* soundEffect;
SequenceChannel* channel;
SequencePlayer* seqPlayer;
u8 semitone = cmd;
@@ -861,15 +861,15 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
return PROCESS_SCRIPT_END;
}
- sound = &drum->sound;
+ tunedSample = &drum->tunedSample;
layer->adsr.envelope = drum->envelope;
layer->adsr.decayIndex = drum->adsrDecayIndex;
if (!layer->ignoreDrumPan) {
layer->pan = drum->pan;
}
- layer->sound = sound;
- layer->freqScale = sound->tuning;
+ layer->tunedSample = tunedSample;
+ layer->freqScale = tunedSample->tuning;
break;
case 1:
@@ -877,15 +877,16 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
layer->semitone = semitone;
sfxId = (layer->transposition << 6) + semitone;
- sound = AudioPlayback_GetSfx(channel->fontId, sfxId);
- if (sound == NULL) {
+ soundEffect = AudioPlayback_GetSoundEffect(channel->fontId, sfxId);
+ if (soundEffect == NULL) {
layer->stopSomething = true;
layer->delay2 = layer->delay + 1;
return PROCESS_SCRIPT_END;
}
- layer->sound = sound;
- layer->freqScale = sound->tuning;
+ tunedSample = &soundEffect->tunedSample;
+ layer->tunedSample = tunedSample;
+ layer->freqScale = tunedSample->tuning;
break;
default:
@@ -909,15 +910,15 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
vel = (semitone > layer->portamentoTargetNote) ? semitone : layer->portamentoTargetNote;
if (instrument != NULL) {
- sound = AudioPlayback_InstrumentGetSound(instrument, vel);
- sameSound = (layer->sound == sound);
- layer->sound = sound;
- tuning = sound->tuning;
+ tunedSample = AudioPlayback_GetInstrumentTunedSample(instrument, vel);
+ sameTunedSample = (layer->tunedSample == tunedSample);
+ layer->tunedSample = tunedSample;
+ tuning = tunedSample->tuning;
} else {
- layer->sound = NULL;
+ layer->tunedSample = NULL;
tuning = 1.0f;
if (instOrWave >= 0xC0) {
- layer->sound = &gAudioContext.synthesisReverbs[instOrWave - 0xC0].sound;
+ layer->tunedSample = &gAudioContext.synthesisReverbs[instOrWave - 0xC0].tunedSample;
}
}
@@ -971,15 +972,15 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
}
if (instrument != NULL) {
- sound = AudioPlayback_InstrumentGetSound(instrument, semitone);
- sameSound = (sound == layer->sound);
- layer->sound = sound;
- layer->freqScale = gPitchFrequencies[semitone2] * sound->tuning;
+ tunedSample = AudioPlayback_GetInstrumentTunedSample(instrument, semitone);
+ sameTunedSample = (tunedSample == layer->tunedSample);
+ layer->tunedSample = tunedSample;
+ layer->freqScale = gPitchFrequencies[semitone2] * tunedSample->tuning;
} else {
- layer->sound = NULL;
+ layer->tunedSample = NULL;
layer->freqScale = gPitchFrequencies[semitone2];
if (instOrWave >= 0xC0) {
- layer->sound = &gAudioContext.synthesisReverbs[instOrWave - 0xC0].sound;
+ layer->tunedSample = &gAudioContext.synthesisReverbs[instOrWave - 0xC0].tunedSample;
}
}
break;
@@ -989,8 +990,8 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
layer->freqScale *= layer->bend;
if (layer->delay == 0) {
- if (layer->sound != NULL) {
- time = layer->sound->sample->loop->end;
+ if (layer->tunedSample != NULL) {
+ time = layer->tunedSample->sample->loop->end;
} else {
time = 0.0f;
}
@@ -1020,7 +1021,7 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
}
}
}
- return sameSound;
+ return sameTunedSample;
}
s32 AudioSeq_SeqLayerProcessScriptStep3(SequenceLayer* layer, s32 cmd) {
@@ -1571,7 +1572,7 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
channel->unk_0F = 0;
channel->unk_20 = 0;
channel->bookOffset = 0;
- channel->unk_DC = 0;
+ channel->startSamplePos = 0;
channel->unk_E0 = 0;
channel->freqScale = 1.0f;
break;
@@ -1659,7 +1660,7 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
break;
case 0xBD: // channel:
- channel->unk_DC = cmdArgs[0];
+ channel->startSamplePos = cmdArgs[0];
break;
case 0xBE: // channel:
@@ -1672,10 +1673,10 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
}
break;
- case 0xA0: // channel:
- case 0xA1: // channel:
- case 0xA2: // channel:
- case 0xA3: // channel:
+ case 0xA0: // channel: read from SfxChannelState using arg
+ case 0xA1: // channel: read from SfxChannelState using unk_22
+ case 0xA2: // channel: write to SfxChannelState using arg
+ case 0xA3: // channel: write to SfxChannelState using unk_22
if ((cmd == 0xA0) || (cmd == 0xA2)) {
cmdArgU16 = (u16)cmdArgs[0];
} else {
@@ -1958,15 +1959,15 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
cmd = AudioSeq_ScriptReadU8(seqScript);
temp = AudioSeq_ScriptReadS16(seqScript);
switch (cmd) {
- case 0:
- case 1:
- if (seqPlayer->state != 2) {
+ case SEQPLAYER_STATE_0:
+ case SEQPLAYER_STATE_1:
+ if (seqPlayer->state != SEQPLAYER_STATE_2) {
seqPlayer->fadeTimerUnkEu = temp;
seqPlayer->state = cmd;
}
break;
- case 2:
+ case SEQPLAYER_STATE_2:
seqPlayer->fadeTimer = temp;
seqPlayer->state = cmd;
seqPlayer->fadeVelocity = (0.0f - seqPlayer->fadeVolume) / (s32)seqPlayer->fadeTimer;
@@ -1977,11 +1978,11 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
case 0xDB: // seqPlayer: set volume
value = AudioSeq_ScriptReadU8(seqScript);
switch (seqPlayer->state) {
- case 1:
- seqPlayer->state = 0;
+ case SEQPLAYER_STATE_1:
+ seqPlayer->state = SEQPLAYER_STATE_0;
seqPlayer->fadeVolume = 0.0f;
// fallthrough
- case 0:
+ case SEQPLAYER_STATE_0:
seqPlayer->fadeTimer = seqPlayer->fadeTimerUnkEu;
if (seqPlayer->fadeTimerUnkEu != 0) {
seqPlayer->fadeVelocity =
@@ -1991,7 +1992,7 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
}
break;
- case 2:
+ case SEQPLAYER_STATE_2:
break;
}
break;
@@ -2102,7 +2103,7 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
cmd = AudioSeq_ScriptReadU8(seqScript);
if (cmd == 0xFF) {
cmd = seqPlayer->playerIndex;
- if (seqPlayer->state == 2) {
+ if (seqPlayer->state == SEQPLAYER_STATE_2) {
break;
}
}
@@ -2224,7 +2225,7 @@ void AudioSeq_ResetSequencePlayer(SequencePlayer* seqPlayer) {
AudioSeq_SequencePlayerDisable(seqPlayer);
seqPlayer->stopScript = false;
seqPlayer->delay = 0;
- seqPlayer->state = 1;
+ seqPlayer->state = SEQPLAYER_STATE_1;
seqPlayer->fadeTimer = 0;
seqPlayer->fadeTimerUnkEu = 0;
seqPlayer->tempoAcc = 0;
diff --git a/src/code/game.c b/src/code/game.c
index 84743b8c5a..da21de17f4 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -200,8 +200,8 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g
gfxCtx->viConfigFeatures = gViConfigFeatures;
gfxCtx->xScale = gViConfigXScale;
gfxCtx->yScale = gViConfigYScale;
- gameState->nextGameStateInit = NULL;
- gameState->nextGameStateSize = 0;
+ gameState->init = NULL;
+ gameState->size = 0;
{
s32 requiredScopeTemp;
@@ -242,12 +242,12 @@ void GameState_Destroy(GameState* gameState) {
GameAlloc_Cleanup(&gameState->alloc);
}
-GameStateFunc GameState_GetNextStateInit(GameState* gameState) {
- return gameState->nextGameStateInit;
+GameStateFunc GameState_GetInit(GameState* gameState) {
+ return gameState->init;
}
-size_t GameState_GetNextStateSize(GameState* gameState) {
- return gameState->nextGameStateSize;
+size_t GameState_GetSize(GameState* gameState) {
+ return gameState->size;
}
u32 GameState_IsRunning(GameState* gameState) {
diff --git a/src/code/graph.c b/src/code/graph.c
index bfce5ab0fa..8a722a8a67 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -6,6 +6,7 @@
#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "overlays/gamestates/ovl_select/z_select.h"
#include "overlays/gamestates/ovl_title/z_title.h"
+#include "z_title_setup.h"
FaultAddrConvClient sGraphFaultAddrConvClient;
FaultClient sGraphFaultClient;
@@ -63,44 +64,45 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) {
}
GameStateOverlay* Graph_GetNextGameState(GameState* gameState) {
- GameStateFunc gameStateInit = GameState_GetNextStateInit(gameState);
+ GameStateFunc gameStateInit = GameState_GetInit(gameState);
- if (gameStateInit == (GameStateFunc)TitleSetup_Init) {
+ if (gameStateInit == Setup_Init) {
return &gGameStateOverlayTable[0];
}
- if (gameStateInit == (GameStateFunc)MapSelect_Init) {
+ if (gameStateInit == MapSelect_Init) {
return &gGameStateOverlayTable[1];
}
- if (gameStateInit == (GameStateFunc)Title_Init) {
+ if (gameStateInit == ConsoleLogo_Init) {
return &gGameStateOverlayTable[2];
}
- if (gameStateInit == (GameStateFunc)Play_Init) {
+ if (gameStateInit == Play_Init) {
return &gGameStateOverlayTable[3];
}
- if (gameStateInit == (GameStateFunc)Opening_Init) {
+ if (gameStateInit == TitleSetup_Init) {
return &gGameStateOverlayTable[4];
}
- if (gameStateInit == (GameStateFunc)FileChoose_Init) {
+ if (gameStateInit == FileSelect_Init) {
return &gGameStateOverlayTable[5];
}
- if (gameStateInit == (GameStateFunc)Daytelop_Init) {
+ if (gameStateInit == DayTelop_Init) {
return &gGameStateOverlayTable[6];
}
+
return NULL;
}
void* Graph_FaultAddrConvFunc(void* address, void* param) {
uintptr_t addr = address;
- GameStateOverlay* gamestateOvl = &gGameStateOverlayTable[0];
+ GameStateOverlay* gameStateOvl = &gGameStateOverlayTable[0];
uintptr_t ramConv;
void* ramStart;
uintptr_t diff;
s32 i;
- for (i = 0; i < graphNumGameStates; i++, gamestateOvl++) {
- diff = VRAM_PTR_SIZE(gamestateOvl);
- ramStart = gamestateOvl->loadedRamAddr;
- ramConv = (uintptr_t)gamestateOvl->vramStart - (uintptr_t)ramStart;
+ for (i = 0; i < graphNumGameStates; i++, gameStateOvl++) {
+ diff = VRAM_PTR_SIZE(gameStateOvl);
+ ramStart = gameStateOvl->loadedRamAddr;
+ ramConv = (uintptr_t)gameStateOvl->vramStart - (uintptr_t)ramStart;
if (ramStart != NULL) {
if (addr >= (uintptr_t)ramStart && addr < (uintptr_t)ramStart + diff) {
@@ -235,7 +237,7 @@ void Graph_UpdateGame(GameState* gameState) {
}
/**
- * Run the gamestate logic, then finalize the gfx buffer
+ * Run the game state logic, then finalize the gfx buffer
* and run the graphics task for this frame.
*/
void Graph_ExecuteAndDraw(GraphicsContext* gfxCtx, GameState* gameState) {
diff --git a/src/code/title_setup.c b/src/code/title_setup.c
index 69790b60c0..dad3c6458b 100644
--- a/src/code/title_setup.c
+++ b/src/code/title_setup.c
@@ -1,14 +1,14 @@
-#include "global.h"
+#include "z_title_setup.h"
#include "overlays/gamestates/ovl_title/z_title.h"
-void TitleSetup_GameStateResetContext(void) {
+void Setup_SetRegs(void) {
XREG(2) = 0;
XREG(10) = 0x1A;
XREG(11) = 0x14;
XREG(12) = 0xE;
XREG(13) = 0;
XREG(31) = 0;
- XREG(41) = 0x50;
+ R_MAGIC_CONSUME_TIMER_GIANTS_MASK = 80;
XREG(43) = 0xFC54;
XREG(44) = 0xD7;
@@ -45,23 +45,21 @@ void TitleSetup_GameStateResetContext(void) {
YREG(43) = 0xB1;
}
-void TitleSetup_InitImpl(GameState* gameState) {
+void Setup_InitImpl(SetupState* this) {
func_80185908();
SaveContext_Init();
- TitleSetup_GameStateResetContext();
+ Setup_SetRegs();
- gameState->running = 0;
-
-setNextGamestate
- :; // This label is probably a leftover of a debug ifdef, it's essential to not have gameState->running reordered!
- SET_NEXT_GAMESTATE(gameState, Title_Init, TitleContext);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, ConsoleLogo_Init, sizeof(ConsoleLogoState));
}
-void TitleSetup_Destroy(GameState* gameState) {
- ;
+void Setup_Destroy(GameState* thisx) {
}
-void TitleSetup_Init(GameState* gameState) {
- gameState->destroy = TitleSetup_Destroy;
- TitleSetup_InitImpl(gameState);
+void Setup_Init(GameState* thisx) {
+ SetupState* this = (SetupState*)thisx;
+
+ this->state.destroy = Setup_Destroy;
+ Setup_InitImpl(this);
}
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index fb2b41c489..1b70ff75b8 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -692,7 +692,7 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
*/
s32 Flags_GetSwitch(PlayState* play, s32 flag) {
if (flag >= 0 && flag < 0x80) {
- return play->actorCtx.flags.switches[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
+ return play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
}
@@ -702,7 +702,7 @@ s32 Flags_GetSwitch(PlayState* play, s32 flag) {
*/
void Flags_SetSwitch(PlayState* play, s32 flag) {
if (flag >= 0 && flag < 0x80) {
- play->actorCtx.flags.switches[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
+ play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -711,7 +711,7 @@ void Flags_SetSwitch(PlayState* play, s32 flag) {
*/
void Flags_UnsetSwitch(PlayState* play, s32 flag) {
if (flag >= 0 && flag < 0x80) {
- play->actorCtx.flags.switches[(flag & ~0x1F) >> 5] &= ~(1 << (flag & 0x1F));
+ play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] &= ~(1 << (flag & 0x1F));
}
}
@@ -719,70 +719,70 @@ void Flags_UnsetSwitch(PlayState* play, s32 flag) {
* Tests if current scene chest flag is set.
*/
s32 Flags_GetTreasure(PlayState* play, s32 flag) {
- return play->actorCtx.flags.chest & (1 << flag);
+ return play->actorCtx.sceneFlags.chest & (1 << flag);
}
/**
* Sets current scene chest flag.
*/
void Flags_SetTreasure(PlayState* play, s32 flag) {
- play->actorCtx.flags.chest |= (1 << flag);
+ play->actorCtx.sceneFlags.chest |= (1 << flag);
}
/**
* Overrides the all the chest flags.
*/
void Flags_SetAllTreasure(PlayState* play, s32 flag) {
- play->actorCtx.flags.chest = flag;
+ play->actorCtx.sceneFlags.chest = flag;
}
/**
* Returns all the chest flags.
*/
s32 Flags_GetAllTreasure(PlayState* play) {
- return play->actorCtx.flags.chest;
+ return play->actorCtx.sceneFlags.chest;
}
/**
* Tests if current scene clear flag is set.
*/
s32 Flags_GetClear(PlayState* play, s32 roomNumber) {
- return play->actorCtx.flags.clearedRoom & (1 << roomNumber);
+ return play->actorCtx.sceneFlags.clearedRoom & (1 << roomNumber);
}
/**
* Sets current scene clear flag.
*/
void Flags_SetClear(PlayState* play, s32 roomNumber) {
- play->actorCtx.flags.clearedRoom |= (1 << roomNumber);
+ play->actorCtx.sceneFlags.clearedRoom |= (1 << roomNumber);
}
/**
* Unsets current scene clear flag.
*/
void Flags_UnsetClear(PlayState* play, s32 roomNumber) {
- play->actorCtx.flags.clearedRoom &= ~(1 << roomNumber);
+ play->actorCtx.sceneFlags.clearedRoom &= ~(1 << roomNumber);
}
/**
* Tests if current scene temp clear flag is set.
*/
s32 Flags_GetClearTemp(PlayState* play, s32 roomNumber) {
- return play->actorCtx.flags.clearedRoomTemp & (1 << roomNumber);
+ return play->actorCtx.sceneFlags.clearedRoomTemp & (1 << roomNumber);
}
/**
* Sets current scene temp clear flag.
*/
void Flags_SetClearTemp(PlayState* play, s32 roomNumber) {
- play->actorCtx.flags.clearedRoomTemp |= (1 << roomNumber);
+ play->actorCtx.sceneFlags.clearedRoomTemp |= (1 << roomNumber);
}
/**
* Unsets current scene temp clear flag.
*/
void Flags_UnsetClearTemp(PlayState* play, s32 roomNumber) {
- play->actorCtx.flags.clearedRoomTemp &= ~(1 << roomNumber);
+ play->actorCtx.sceneFlags.clearedRoomTemp &= ~(1 << roomNumber);
}
/**
@@ -790,7 +790,7 @@ void Flags_UnsetClearTemp(PlayState* play, s32 roomNumber) {
*/
s32 Flags_GetCollectible(PlayState* play, s32 flag) {
if (flag > 0 && flag < 0x80) {
- return play->actorCtx.flags.collectible[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
+ return play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
}
@@ -800,7 +800,7 @@ s32 Flags_GetCollectible(PlayState* play, s32 flag) {
*/
void Flags_SetCollectible(PlayState* play, s32 flag) {
if (flag > 0 && flag < 0x80) {
- play->actorCtx.flags.collectible[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
+ play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -1076,7 +1076,7 @@ void Actor_Init(Actor* actor, PlayState* play) {
actor->uncullZoneScale = 350.0f;
actor->uncullZoneDownward = 700.0f;
- actor->hintId = 255;
+ actor->hintId = TATL_HINT_ID_NONE;
CollisionCheck_InitInfo(&actor->colChkInfo);
actor->floorBgId = BGCHECK_SCENE;
@@ -2212,10 +2212,10 @@ s32 func_800B90AC(PlayState* play, Actor* actor, CollisionPoly* polygon, s32 bgI
return false;
}
-void func_800B90F4(PlayState* play) {
- if (play->actorCtx.unk3 != 0) {
- play->actorCtx.unk3 = 0;
- func_80115D5C(&play->state);
+void Actor_DeactivateLens(PlayState* play) {
+ if (play->actorCtx.lensActive) {
+ play->actorCtx.lensActive = false;
+ Magic_Reset(play);
}
}
@@ -2249,14 +2249,14 @@ void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* acto
overlayEntry++;
}
- actorCtx->flags.chest = cycleFlags->chest;
- actorCtx->flags.switches[0] = cycleFlags->switch0;
- actorCtx->flags.switches[1] = cycleFlags->switch1;
+ actorCtx->sceneFlags.chest = cycleFlags->chest;
+ actorCtx->sceneFlags.switches[0] = cycleFlags->switch0;
+ actorCtx->sceneFlags.switches[1] = cycleFlags->switch1;
if (play->sceneNum == SCENE_INISIE_R) {
cycleFlags = &gSaveContext.cycleSceneFlags[play->sceneNum];
}
- actorCtx->flags.collectible[0] = cycleFlags->collectible;
- actorCtx->flags.clearedRoom = cycleFlags->clearedRoom;
+ actorCtx->sceneFlags.collectible[0] = cycleFlags->collectible;
+ actorCtx->sceneFlags.clearedRoom = cycleFlags->clearedRoom;
TitleCard_ContextInit(&play->state, &actorCtx->titleCtxt);
func_800B6468(play);
@@ -2594,7 +2594,7 @@ void func_800B9D1C(Actor* actor) {
void Actor_DrawAllSetup(PlayState* play) {
play->actorCtx.undrawnActorCount = 0;
- play->actorCtx.unkB = 0;
+ play->actorCtx.lensActorsDrawn = false;
}
s32 Actor_RecordUndrawnActor(PlayState* play, Actor* actor) {
@@ -2607,13 +2607,12 @@ s32 Actor_RecordUndrawnActor(PlayState* play, Actor* actor) {
return true;
}
-void func_800B9E84(Gfx** arg0, s32 arg1) {
- func_80164C14(arg0, D_801DE890, 4, 0, 6, 6, ((100 - arg1) * 0.003f) + 1.0f);
+void Actor_DrawLensOverlay(Gfx** gfxP, s32 lensMaskSize) {
+ func_80164C14(gfxP, &gCircleTex, 4, 0, 6, 6, ((LENS_MASK_ACTIVE_SIZE - lensMaskSize) * 0.003f) + 1.0f);
}
#ifdef NON_EQUIVALENT
-// Related to draw actors with lens
-void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
+void Actor_DrawLensActors(PlayState* play, s32 numActors, Actor** actors) {
s32 spB4;
Gfx* spAC;
void* spA8; // pad
@@ -2684,7 +2683,7 @@ void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
}
// spAC = phi_s1;
- func_800B9E84(&spAC, play->actorCtx.unk4);
+ Actor_DrawLensOverlay(&spAC, play->actorCtx.lensMaskSize);
phi_s1_2 = func_801660B8(play, spAC);
for (spB4 = 0; spB4 < numActors; spB4++, actors++) {
@@ -2744,7 +2743,7 @@ void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
spAC = phi_s1_2;
// spAC = temp_s1_11;
- func_800B9E84(&spAC, (s32)play->actorCtx.unk4);
+ Actor_DrawLensOverlay(&spAC, (s32)play->actorCtx.lensMaskSize);
// temp_s1_11->words.w0 = 0xE7000000;
// temp_s1_11->words.w1 = 0;
// temp_s1_12 = temp_s1_11 + 8;
@@ -2796,15 +2795,15 @@ void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
// spAC = temp_s1_18 + 8;
gDPSetPrimColor(spAC++, 0, 0, 74, 0, 0, 74);
- func_800B9E84(&spAC, (s32)play->actorCtx.unk4);
+ Actor_DrawLensOverlay(&spAC, (s32)play->actorCtx.lensMaskSize);
OVERLAY_DISP = spAC;
CLOSE_DISPS(play->state.gfxCtx);
}
#else
-void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/func_800B9EF4.s")
+void Actor_DrawLensActors(PlayState* play, s32 numActors, Actor** actors);
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/Actor_DrawLensActors.s")
#endif
s32 func_800BA2D8(PlayState* play, Actor* actor) {
@@ -2883,7 +2882,7 @@ void Actor_DrawAll(PlayState* play, ActorContext* actorCtx) {
actor->isDrawn = false;
if ((actor->init == NULL) && (actor->draw != NULL) && (actor->flags & actorFlags)) {
if ((actor->flags & ACTOR_FLAG_80) &&
- ((play->roomCtx.currRoom.unk5 == 0) || (play->actorCtx.unk4 == 0x64) ||
+ ((play->roomCtx.currRoom.unk5 == 0) || (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) ||
(actor->room != play->roomCtx.currRoom.num))) {
if (Actor_RecordUndrawnActor(play, actor)) {}
} else {
@@ -2903,17 +2902,17 @@ void Actor_DrawAll(PlayState* play, ActorContext* actorCtx) {
gSPDisplayList(sp58, &ref2[1]);
POLY_XLU_DISP = &ref2[1];
- if (play->actorCtx.unk3 != 0) {
- Math_StepToC(&play->actorCtx.unk4, 100, 20);
+ if (play->actorCtx.lensActive) {
+ Math_StepToC(&play->actorCtx.lensMaskSize, LENS_MASK_ACTIVE_SIZE, 20);
if (GET_PLAYER(play)->stateFlags2 & 0x8000000) {
- func_800B90F4(play);
+ Actor_DeactivateLens(play);
}
} else {
- Math_StepToC(&play->actorCtx.unk4, 0, 10);
+ Math_StepToC(&play->actorCtx.lensMaskSize, 0, 10);
}
- if (play->actorCtx.unk4 != 0) {
- play->actorCtx.unkB = 1;
- func_800B9EF4(play, play->actorCtx.undrawnActorCount, play->actorCtx.undrawnActors);
+ if (play->actorCtx.lensMaskSize != 0) {
+ play->actorCtx.lensActorsDrawn = true;
+ Actor_DrawLensActors(play, play->actorCtx.undrawnActorCount, play->actorCtx.undrawnActors);
}
tmp2 = POLY_XLU_DISP;
@@ -2977,9 +2976,9 @@ void func_800BA798(PlayState* play, ActorContext* actorCtx) {
}
CollisionCheck_ClearContext(play, &play->colChkCtx);
- actorCtx->flags.clearedRoomTemp = 0;
- actorCtx->flags.switches[3] = 0;
- actorCtx->flags.collectible[3] = 0;
+ actorCtx->sceneFlags.clearedRoomTemp = 0;
+ actorCtx->sceneFlags.switches[3] = 0;
+ actorCtx->sceneFlags.collectible[3] = 0;
play->msgCtx.unk_12030 = 0;
}
@@ -3815,9 +3814,9 @@ typedef struct {
} DoorLockInfo; // size = 0x1C
DoorLockInfo sDoorLocksInfo[DOORLOCK_MAX] = {
- /* DOORLOCK_NORMAL */ { 0.54f, 6000.0f, 5000.0, 1.0f, 0.0f, gDoorChainsDL, gDoorLockDL },
- /* DOORLOCK_BOSS */ { 0.644f, 12000.0f, 8000.0f, 1.0f, 0.0f, object_bdoor_DL_000530, object_bdoor_DL_000400 },
- /* DOORLOCK_2 */ { 0.6400000453f, 8500.0f, 8000.0f, 1.75f, 0.1f, gDoorChainsDL, gDoorLockDL },
+ /* DOORLOCK_NORMAL */ { 0.54f, 6000.0f, 5000.0, 1.0f, 0.0f, gDoorChainDL, gDoorLockDL },
+ /* DOORLOCK_BOSS */ { 0.644f, 12000.0f, 8000.0f, 1.0f, 0.0f, gBossDoorChainDL, gBossDoorLockDL },
+ /* DOORLOCK_2 */ { 0.6400000453f, 8500.0f, 8000.0f, 1.75f, 0.1f, gDoorChainDL, gDoorLockDL },
};
/**
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 0c66a6283d..02fa0a66e2 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -126,12 +126,11 @@ void func_800EA2B8(PlayState* play, CutsceneContext* csCtx) {
/* Start of command handling section */
// Command 0x96: Miscellaneous commands.
-void Cutscene_Command_Misc(PlayState* play2, CutsceneContext* csCtx, CsCmdBase* cmd) {
+void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
static u16 D_801BB15C = 0xFFFF;
- Player* player = GET_PLAYER(play2);
- PlayState* play = play2;
- u8 isStartFrame = false;
+ Player* player = GET_PLAYER(play);
f32 progress;
+ u8 isStartFrame = false;
SceneTableEntry* loadedScene;
if ((csCtx->frames < cmd->startFrame) || ((csCtx->frames >= cmd->endFrame) && (cmd->endFrame != cmd->startFrame))) {
@@ -346,11 +345,8 @@ void Cutscene_Command_Misc(PlayState* play2, CutsceneContext* csCtx, CsCmdBase*
gSaveContext.save.day = 9;
- {
- GameState* gameState = &play->state;
- gameState->running = false;
- }
- SET_NEXT_GAMESTATE(&play->state, Daytelop_Init, DaytelopContext);
+ STOP_GAMESTATE(&play->state);
+ SET_NEXT_GAMESTATE(&play->state, DayTelop_Init, sizeof(DayTelopState));
Sram_SaveSpecialNewDay(play);
break;
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index 5258c2ecf6..5fc51b0c33 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -91,63 +91,76 @@ void EffectSsDust_Spawn(PlayState* play, u16 drawFlags, Vec3f* pos, Vec3f* veloc
void func_800B0DE0(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
Color_RGBA8* envColor, s16 scale, s16 scaleStep) {
- EffectSsDust_Spawn(play, 0, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG0, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10,
+ DUST_UPDATE_NORMAL);
}
void func_800B0E48(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
Color_RGBA8* envColor, s16 scale, s16 scaleStep) {
- EffectSsDust_Spawn(play, 1, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG1, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10,
+ DUST_UPDATE_NORMAL);
}
void func_800B0EB0(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
Color_RGBA8* envColor, s16 scale, s16 scaleStep, s16 life) {
- EffectSsDust_Spawn(play, 0, pos, velocity, accel, primColor, envColor, scale, scaleStep, life, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG0, pos, velocity, accel, primColor, envColor, scale, scaleStep, life,
+ DUST_UPDATE_NORMAL);
}
void func_800B0F18(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
Color_RGBA8* envColor, s16 scale, s16 scaleStep, s16 life) {
- EffectSsDust_Spawn(play, 1, pos, velocity, accel, primColor, envColor, scale, scaleStep, life, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG1, pos, velocity, accel, primColor, envColor, scale, scaleStep, life,
+ DUST_UPDATE_NORMAL);
}
void func_800B0F80(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
Color_RGBA8* envColor, s16 scale, s16 scaleStep, s16 life) {
- EffectSsDust_Spawn(play, 2, pos, velocity, accel, primColor, envColor, scale, scaleStep, life, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG2, pos, velocity, accel, primColor, envColor, scale, scaleStep, life,
+ DUST_UPDATE_NORMAL);
}
void func_800B0FE8(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
Color_RGBA8* envColor, s16 scale, s16 scaleStep) {
- EffectSsDust_Spawn(play, 0, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10, 1);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG0, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10,
+ DUST_UPDATE_FIRE);
}
void func_800B1054(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
Color_RGBA8* envColor, s16 scale, s16 scaleStep) {
- EffectSsDust_Spawn(play, 1, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10, 1);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG1, pos, velocity, accel, primColor, envColor, scale, scaleStep, 10,
+ DUST_UPDATE_FIRE);
}
static Color_RGBA8 sDustBrownPrim = { 170, 130, 90, 255 };
static Color_RGBA8 sDustBrownEnv = { 100, 60, 20, 255 };
void func_800B10C0(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel) {
- EffectSsDust_Spawn(play, 4, pos, velocity, accel, &sDustBrownPrim, &sDustBrownEnv, 100, 5, 10, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG_RAND_COLOR_OFFSET | DUST_DRAWFLAG0, pos, velocity, accel, &sDustBrownPrim,
+ &sDustBrownEnv, 100, 5, 10, DUST_UPDATE_NORMAL);
}
void func_800B1130(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel) {
- EffectSsDust_Spawn(play, 5, pos, velocity, accel, &sDustBrownPrim, &sDustBrownEnv, 100, 5, 10, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG_RAND_COLOR_OFFSET | DUST_DRAWFLAG1, pos, velocity, accel, &sDustBrownPrim,
+ &sDustBrownEnv, 100, 5, 10, DUST_UPDATE_NORMAL);
}
void func_800B11A0(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scaleStep) {
- EffectSsDust_Spawn(play, 4, pos, velocity, accel, &sDustBrownPrim, &sDustBrownEnv, scale, scaleStep, 10, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG_RAND_COLOR_OFFSET | DUST_DRAWFLAG0, pos, velocity, accel, &sDustBrownPrim,
+ &sDustBrownEnv, scale, scaleStep, 10, DUST_UPDATE_NORMAL);
}
void func_800B1210(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scaleStep) {
- EffectSsDust_Spawn(play, 5, pos, velocity, accel, &sDustBrownPrim, &sDustBrownEnv, scale, scaleStep, 10, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG_RAND_COLOR_OFFSET | DUST_DRAWFLAG1, pos, velocity, accel, &sDustBrownPrim,
+ &sDustBrownEnv, scale, scaleStep, 10, DUST_UPDATE_NORMAL);
}
void func_800B1280(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scaleStep, s16 life) {
- EffectSsDust_Spawn(play, 4, pos, velocity, accel, &sDustBrownPrim, &sDustBrownEnv, scale, scaleStep, life, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG_RAND_COLOR_OFFSET | DUST_DRAWFLAG0, pos, velocity, accel, &sDustBrownPrim,
+ &sDustBrownEnv, scale, scaleStep, life, DUST_UPDATE_NORMAL);
}
void func_800B12F0(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scaleStep, s16 life) {
- EffectSsDust_Spawn(play, 5, pos, velocity, accel, &sDustBrownPrim, &sDustBrownEnv, scale, scaleStep, life, 0);
+ EffectSsDust_Spawn(play, DUST_DRAWFLAG_RAND_COLOR_OFFSET | DUST_DRAWFLAG1, pos, velocity, accel, &sDustBrownPrim,
+ &sDustBrownEnv, scale, scaleStep, life, DUST_UPDATE_NORMAL);
}
void func_800B1360(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
@@ -285,7 +298,7 @@ void EffectSsBomb2_SpawnLayered(PlayState* play, Vec3f* pos, Vec3f* velocity, Ve
// EffectSsBlast Spawn Functions
void EffectSsBlast_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor,
- Color_RGBA8* envColor, s16 scale, s16 scaleStep, s16 sclaeStepDecay, s16 life) {
+ Color_RGBA8* envColor, s16 scale, s16 scaleStep, s16 scaleStepDecay, s16 life) {
EffectSsBlastInitParams initParams;
Math_Vec3f_Copy(&initParams.pos, pos);
@@ -295,7 +308,7 @@ void EffectSsBlast_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* ac
Color_RGBA8_Copy(&initParams.envColor, envColor);
initParams.scale = scale;
initParams.scaleStep = scaleStep;
- initParams.sclaeStepDecay = sclaeStepDecay;
+ initParams.scaleStepDecay = scaleStepDecay;
initParams.life = life;
EffectSs_Spawn(play, EFFECT_SS_BLAST, 128, &initParams);
@@ -391,7 +404,7 @@ void EffectSsGSpk_SpawnSmall(PlayState* play, Actor* actor, Vec3f* pos, Vec3f* v
// EffectSsDFire Spawn Functions
void EffectSsDFire_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scaleStep,
- s16 alpha, s16 fadeDelay, s16 arg8, s32 life) {
+ s16 alpha, s16 alphaStep, s16 fadeDelay, s32 life) {
EffectSsDFireInitParams initParams;
Math_Vec3f_Copy(&initParams.pos, pos);
@@ -400,8 +413,8 @@ void EffectSsDFire_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* ac
initParams.scale = scale;
initParams.scaleStep = scaleStep;
initParams.alpha = alpha;
+ initParams.alphaStep = alphaStep;
initParams.fadeDelay = fadeDelay;
- initParams.unk_2C = arg8;
initParams.life = life;
EffectSs_Spawn(play, EFFECT_SS_D_FIRE, 128, &initParams);
@@ -492,7 +505,7 @@ void EffectSsDtBubble_SpawnColorProfile(PlayState* play, Vec3f* pos, Vec3f* velo
Math_Vec3f_Copy(&initParams.pos, pos);
Math_Vec3f_Copy(&initParams.velocity, velocity);
Math_Vec3f_Copy(&initParams.accel, accel);
- initParams.customColor = 0;
+ initParams.customColor = false;
initParams.colorProfile = colorProfile;
initParams.scale = scale;
initParams.life = life;
@@ -513,7 +526,7 @@ void EffectSsDtBubble_SpawnCustomColor(PlayState* play, Vec3f* pos, Vec3f* veloc
initParams.scale = scale;
initParams.life = life;
initParams.randXZ = randXZ;
- initParams.customColor = 1;
+ initParams.customColor = true;
EffectSs_Spawn(play, EFFECT_SS_DT_BUBBLE, 128, &initParams);
}
@@ -927,7 +940,7 @@ void EffectSsExtra_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* ac
// EffectSsDeadDb Spawn Functions
void EffectSsDeadDb_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, Color_RGBA8* prim,
- Color_RGBA8* env, s16 scale, s16 scaleStep, s32 unk) {
+ Color_RGBA8* env, s16 scale, s16 scaleStep, s32 life) {
EffectSsDeadDbInitParams initParams;
Math_Vec3f_Copy(&initParams.pos, pos);
@@ -942,7 +955,7 @@ void EffectSsDeadDb_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* a
initParams.envColor.r = env->r;
initParams.envColor.g = env->g;
initParams.envColor.b = env->b;
- initParams.unk_30 = unk;
+ initParams.life = life;
EffectSs_Spawn(play, EFFECT_SS_DEAD_DB, 120, &initParams);
}
diff --git a/src/code/z_elf_message.c b/src/code/z_elf_message.c
index 57e84e86bf..25d6f8ca89 100644
--- a/src/code/z_elf_message.c
+++ b/src/code/z_elf_message.c
@@ -25,7 +25,7 @@ u16 ElfMessage_GetFirstCycleHint(PlayState* play) {
}
return 0x21D;
}
- if (gSaveContext.save.playerData.magicAcquired != true) {
+ if (gSaveContext.save.playerData.isMagicAcquired != true) {
return 0x21F;
}
if (INV_CONTENT(ITEM_DEED_LAND) == ITEM_DEED_LAND) {
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 0637f6392a..437728f0ea 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -18,6 +18,11 @@ void func_800A6650(EnItem00* this, PlayState* play);
void func_800A6780(EnItem00* this, PlayState* play);
void func_800A6A40(EnItem00* this, PlayState* play);
+void EnItem00_DrawRupee(EnItem00* this, PlayState* play);
+void EnItem00_DrawSprite(EnItem00* this, PlayState* play);
+void EnItem00_DrawHeartContainer(EnItem00* this, PlayState* play);
+void EnItem00_DrawHeartPiece(EnItem00* this, PlayState* play);
+
const ActorInit En_Item00_InitVars = {
ACTOR_EN_ITEM00,
ACTORCAT_MISC,
@@ -102,12 +107,14 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
this->unk154 = 0.015f;
shadowOffset = 750.0f;
break;
+
case ITEM00_SMALL_KEY:
this->unk150 = 0;
Actor_SetScale(&this->actor, 0.03f);
this->unk154 = 0.03f;
shadowOffset = 350.0f;
break;
+
case ITEM00_HEART_PIECE:
case ITEM00_HEART_CONTAINER:
this->unk150 = 0;
@@ -118,12 +125,14 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
sp30 = -1;
}
break;
+
case ITEM00_RECOVERY_HEART:
- this->actor.home.rot.z = randPlusMinusPoint5Scaled(65535.0f);
+ this->actor.home.rot.z = randPlusMinusPoint5Scaled(0xFFFF);
shadowOffset = 430.0f;
Actor_SetScale(&this->actor, 0.02f);
this->unk154 = 0.02f;
break;
+
case ITEM00_ARROWS_10:
case ITEM00_ARROWS_30:
case ITEM00_ARROWS_40:
@@ -132,6 +141,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
this->unk154 = 0.035f;
shadowOffset = 250.0f;
break;
+
case ITEM00_BOMBS_A:
case ITEM00_BOMBS_B:
case ITEM00_NUTS_1:
@@ -143,39 +153,47 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
this->unk154 = 0.03f;
shadowOffset = 320.0f;
break;
+
case ITEM00_MAGIC_LARGE:
- Actor_SetScale(&this->actor, 0.044999998f);
- this->unk154 = 0.044999998f;
+ Actor_SetScale(&this->actor, 4.5f * 0.01f);
+ this->unk154 = 4.5f * 0.01f;
shadowOffset = 320.0f;
break;
+
case ITEM00_RUPEE_HUGE:
- Actor_SetScale(&this->actor, 0.044999998f);
- this->unk154 = 0.044999998f;
+ Actor_SetScale(&this->actor, 4.5f * 0.01f);
+ this->unk154 = 4.5f * 0.01f;
shadowOffset = 750.0f;
break;
+
case ITEM00_RUPEE_PURPLE:
Actor_SetScale(&this->actor, 0.03f);
this->unk154 = 0.03f;
shadowOffset = 750.0f;
break;
+
case ITEM00_FLEXIBLE:
case ITEM00_BIG_FAIRY:
shadowOffset = 500.0f;
Actor_SetScale(&this->actor, 0.01f);
this->unk154 = 0.01f;
break;
+
case ITEM00_SHIELD_HERO:
this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_SHIELD_2);
EnItem00_SetObject(this, play, &shadowOffset, &shadowScale);
break;
+
case ITEM00_MAP:
this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_MAP);
EnItem00_SetObject(this, play, &shadowOffset, &shadowScale);
break;
+
case ITEM00_COMPASS:
this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_COMPASS);
EnItem00_SetObject(this, play, &shadowOffset, &shadowScale);
break;
+
default:
break;
}
@@ -191,6 +209,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
this->unk152 = -1;
return;
}
+
if (sp30 == 0) {
this->actionFunc = func_800A640C;
this->unk152 = -1;
@@ -208,61 +227,78 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
case ITEM00_RUPEE_GREEN:
Item_Give(play, ITEM_RUPEE_GREEN);
break;
+
case ITEM00_RUPEE_BLUE:
Item_Give(play, ITEM_RUPEE_BLUE);
break;
+
case ITEM00_RUPEE_RED:
Item_Give(play, ITEM_RUPEE_RED);
break;
+
case ITEM00_RUPEE_PURPLE:
Item_Give(play, ITEM_RUPEE_PURPLE);
break;
+
case ITEM00_RUPEE_HUGE:
Item_Give(play, ITEM_RUPEE_HUGE);
break;
+
case ITEM00_RECOVERY_HEART:
Item_Give(play, ITEM_RECOVERY_HEART);
break;
+
case ITEM00_FLEXIBLE:
case ITEM00_BIG_FAIRY:
Health_ChangeBy(play, 0x70);
break;
+
case ITEM00_BOMBS_A:
case ITEM00_BOMBS_B:
Item_Give(play, ITEM_BOMBS_5);
break;
+
case ITEM00_ARROWS_10:
Item_Give(play, ITEM_ARROWS_10);
break;
+
case ITEM00_ARROWS_30:
Item_Give(play, ITEM_ARROWS_30);
break;
+
case ITEM00_ARROWS_40:
Item_Give(play, ITEM_ARROWS_40);
break;
+
case ITEM00_ARROWS_50:
Item_Give(play, ITEM_ARROWS_50);
break;
+
case ITEM00_MAGIC_LARGE:
Item_Give(play, ITEM_MAGIC_LARGE);
break;
+
case ITEM00_MAGIC_SMALL:
Item_Give(play, ITEM_MAGIC_SMALL);
break;
+
case ITEM00_SMALL_KEY:
Item_Give(play, ITEM_KEY_SMALL);
break;
+
case ITEM00_NUTS_1:
getItemId = GI_NUTS_1;
break;
+
case ITEM00_NUTS_10:
getItemId = GI_NUTS_10;
break;
+
default:
break;
}
- if ((getItemId != GI_NONE) && (Actor_HasParent(&this->actor, play) == 0)) {
+ if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, play)) {
Actor_PickUp(&this->actor, play, getItemId, 50.0f, 20.0f);
}
@@ -277,11 +313,10 @@ void EnItem00_Destroy(Actor* thisx, PlayState* play) {
}
void EnItem00_WaitForHeartObject(EnItem00* this, PlayState* play) {
- s32 sp1C;
+ s32 objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS);
- sp1C = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS);
- if (Object_IsLoaded(&play->objectCtx, sp1C)) {
- this->actor.objBankIndex = sp1C;
+ if (Object_IsLoaded(&play->objectCtx, objBankIndex)) {
+ this->actor.objBankIndex = objBankIndex;
this->actionFunc = func_800A640C;
}
}
@@ -327,15 +362,15 @@ void func_800A640C(EnItem00* this, PlayState* play) {
}
}
- if ((this->actor.gravity != 0.0f) && ((this->actor.bgCheckFlags & 1) == 0)) {
+ if ((this->actor.gravity != 0.0f) && !(this->actor.bgCheckFlags & 1)) {
this->actionFunc = func_800A6650;
}
}
-static Color_RGBA8 D_801ADF10 = { 255, 255, 127, 0 };
-static Color_RGBA8 D_801ADF14 = { 255, 255, 255, 0 };
-static Vec3f D_801ADF18 = { 0.0f, 0.1f, 0.0f };
-static Vec3f D_801ADF24 = { 0.0f, 0.01f, 0.0f };
+static Color_RGBA8 sEffectPrimColor = { 255, 255, 127, 0 };
+static Color_RGBA8 sEffectEnvColor = { 255, 255, 255, 0 };
+static Vec3f sEffectVelocity = { 0.0f, 0.1f, 0.0f };
+static Vec3f sEffectAccel = { 0.0f, 0.01f, 0.0f };
void func_800A6650(EnItem00* this, PlayState* play) {
u32 pad;
@@ -344,20 +379,21 @@ void func_800A6650(EnItem00* this, PlayState* play) {
if (this->actor.params <= ITEM00_RUPEE_RED) {
this->actor.shape.rot.y = this->actor.shape.rot.y + 960;
}
+
if ((play->gameplayFrames & 1) != 0) {
pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(10.0f);
pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(10.0f);
pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(10.0f);
- EffectSsKirakira_SpawnSmall(play, &pos, &D_801ADF18, &D_801ADF24, &D_801ADF10, &D_801ADF14);
+ EffectSsKirakira_SpawnSmall(play, &pos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor, &sEffectEnvColor);
}
- if ((this->actor.bgCheckFlags & 3) != 0) {
+
+ if (this->actor.bgCheckFlags & 3) {
if (this->actor.velocity.y > -2.0f) {
this->actionFunc = func_800A640C;
- return;
+ } else {
+ this->actor.velocity.y = this->actor.velocity.y * -0.8f;
+ this->actor.bgCheckFlags &= ~1;
}
-
- this->actor.velocity.y = this->actor.velocity.y * -0.8f;
- this->actor.bgCheckFlags = this->actor.bgCheckFlags & 0xFFFE;
}
}
@@ -384,18 +420,18 @@ void func_800A6780(EnItem00* this, PlayState* play) {
}
if (this->actor.params <= ITEM00_RUPEE_RED) {
- this->actor.shape.rot.y += 960;
+ this->actor.shape.rot.y += 0x3C0;
} else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_NUTS_10) &&
(this->actor.params != ITEM00_BOMBS_0)) {
- this->actor.world.rot.x -= 700;
- this->actor.shape.rot.y += 400;
+ this->actor.world.rot.x -= 0x2BC;
+ this->actor.shape.rot.y += 0x190;
this->actor.shape.rot.x = this->actor.world.rot.x - 0x4000;
}
if (this->actor.velocity.y <= 2.0f) {
- var1 = (u16)this->actor.shape.rot.z + 10000;
- if (var1 < 65535) {
- this->actor.shape.rot.z += 10000;
+ var1 = (u16)this->actor.shape.rot.z + 0x2710;
+ if (var1 < 0xFFFF) {
+ this->actor.shape.rot.z += 0x2710;
} else {
this->actor.shape.rot.z = -1;
}
@@ -405,10 +441,10 @@ void func_800A6780(EnItem00* this, PlayState* play) {
pos.x = this->actor.world.pos.x + ((Rand_ZeroOne() - 0.5f) * 10.0f);
pos.y = this->actor.world.pos.y + ((Rand_ZeroOne() - 0.5f) * 10.0f);
pos.z = this->actor.world.pos.z + ((Rand_ZeroOne() - 0.5f) * 10.0f);
- EffectSsKirakira_SpawnSmall(play, &pos, &D_801ADF18, &D_801ADF24, &D_801ADF10, &D_801ADF14);
+ EffectSsKirakira_SpawnSmall(play, &pos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor, &sEffectEnvColor);
}
- if (this->actor.bgCheckFlags & 0x0003) {
+ if (this->actor.bgCheckFlags & 3) {
this->actionFunc = func_800A640C;
this->actor.shape.rot.z = 0;
this->actor.speedXZ = 0.0f;
@@ -419,7 +455,7 @@ void func_800A6A40(EnItem00* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->getItemId != GI_NONE) {
- if (Actor_HasParent(&this->actor, play) == 0) {
+ if (!Actor_HasParent(&this->actor, play)) {
Actor_PickUp(&this->actor, play, this->getItemId, 50.0f, 80.0f);
this->unk152++;
} else {
@@ -435,7 +471,7 @@ void func_800A6A40(EnItem00* this, PlayState* play) {
this->actor.world.pos = player->actor.world.pos;
if (this->actor.params <= ITEM00_RUPEE_RED) {
- this->actor.shape.rot.y = this->actor.shape.rot.y + 960;
+ this->actor.shape.rot.y += 0x3C0;
} else if (this->actor.params == ITEM00_RECOVERY_HEART) {
this->actor.shape.rot.y = 0;
}
@@ -443,7 +479,7 @@ void func_800A6A40(EnItem00* this, PlayState* play) {
this->actor.world.pos.y += (40.0f + (Math_SinS(this->unk152 * 15000) * (this->unk152 * 0.3f)));
if (LINK_IS_ADULT) {
- this->actor.world.pos.y = this->actor.world.pos.y + 20.0f;
+ this->actor.world.pos.y += 20.0f;
}
}
@@ -500,7 +536,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
}
}
- if (play->gameOverCtx.state != 0) {
+ if (play->gameOverCtx.state != GAMEOVER_INACTIVE) {
return;
}
@@ -509,78 +545,101 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
this->unk1A4 = 1;
Item_Give(play, ITEM_RUPEE_GREEN);
break;
+
case ITEM00_RUPEE_BLUE:
this->unk1A4 = 1;
Item_Give(play, ITEM_RUPEE_BLUE);
break;
+
case ITEM00_RUPEE_RED:
this->unk1A4 = 1;
Item_Give(play, ITEM_RUPEE_RED);
break;
+
case ITEM00_RUPEE_PURPLE:
this->unk1A4 = 1;
Item_Give(play, ITEM_RUPEE_PURPLE);
break;
+
case ITEM00_RUPEE_HUGE:
this->unk1A4 = 1;
Item_Give(play, ITEM_RUPEE_HUGE);
break;
+
case ITEM00_STICK:
getItemId = GI_STICKS_1;
break;
+
case ITEM00_NUTS_1:
getItemId = GI_NUTS_1;
break;
+
case ITEM00_NUTS_10:
getItemId = GI_NUTS_10;
break;
+
case ITEM00_RECOVERY_HEART:
Item_Give(play, ITEM_RECOVERY_HEART);
break;
+
case ITEM00_FLEXIBLE:
case ITEM00_BIG_FAIRY:
Health_ChangeBy(play, 0x70);
break;
+
case ITEM00_BOMBS_A:
case ITEM00_BOMBS_B:
Item_Give(play, ITEM_BOMBS_5);
break;
+
case ITEM00_ARROWS_10:
Item_Give(play, ITEM_ARROWS_10);
break;
+
case ITEM00_ARROWS_30:
Item_Give(play, ITEM_ARROWS_30);
break;
+
case ITEM00_ARROWS_40:
Item_Give(play, ITEM_ARROWS_40);
break;
+
case ITEM00_ARROWS_50:
Item_Give(play, ITEM_ARROWS_50);
break;
+
case ITEM00_SMALL_KEY:
getItemId = GI_KEY_SMALL;
break;
+
case ITEM00_HEART_PIECE:
getItemId = GI_HEART_PIECE;
break;
+
case ITEM00_HEART_CONTAINER:
getItemId = GI_HEART_CONTAINER;
break;
+
case ITEM00_MAGIC_LARGE:
Item_Give(play, ITEM_MAGIC_LARGE);
break;
+
case ITEM00_MAGIC_SMALL:
Item_Give(play, ITEM_MAGIC_SMALL);
break;
+
case ITEM00_SHIELD_HERO:
getItemId = GI_SHIELD_HERO;
break;
+
case ITEM00_MAP:
getItemId = GI_MAP;
break;
+
case ITEM00_COMPASS:
getItemId = GI_COMPASS;
break;
+
default:
break;
}
@@ -603,6 +662,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
Actor_MarkForDeath(&this->actor);
}
return;
+
default:
break;
}
@@ -634,11 +694,6 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
this->actionFunc = func_800A6A40;
}
-void EnItem00_DrawRupee(EnItem00* this, PlayState* play);
-void EnItem00_DrawSprite(EnItem00* this, PlayState* play);
-void EnItem00_DrawHeartContainer(EnItem00* this, PlayState* play);
-void EnItem00_DrawHeartPiece(EnItem00* this, PlayState* play);
-
void EnItem00_Draw(Actor* thisx, PlayState* play) {
s32 pad;
EnItem00* this = THIS;
@@ -652,16 +707,20 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
case ITEM00_RUPEE_PURPLE:
EnItem00_DrawRupee(this, play);
break;
+
case ITEM00_HEART_PIECE:
EnItem00_DrawHeartPiece(this, play);
break;
+
case ITEM00_HEART_CONTAINER:
EnItem00_DrawHeartContainer(this, play);
break;
+
case ITEM00_RECOVERY_HEART:
if (this->unk152 < 0) {
if (this->unk152 == -1) {
s8 bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEART);
+
if (Object_IsLoaded(&play->objectCtx, bankIndex)) {
this->actor.objBankIndex = bankIndex;
Actor_SetObjectDependency(play, &this->actor);
@@ -673,6 +732,7 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
}
break;
}
+ // fallthrough
case ITEM00_BOMBS_A:
case ITEM00_ARROWS_10:
case ITEM00_ARROWS_30:
@@ -688,14 +748,19 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
case ITEM00_BOMBS_0:
EnItem00_DrawSprite(this, play);
break;
+
case ITEM00_SHIELD_HERO:
GetItem_Draw(play, GID_SHIELD_HERO);
break;
+
case ITEM00_MAP:
GetItem_Draw(play, GID_DUNGEON_MAP);
break;
+
case ITEM00_COMPASS:
GetItem_Draw(play, GID_COMPASS);
+ break;
+
case ITEM00_MASK:
case ITEM00_FLEXIBLE:
case ITEM00_3_HEARTS:
@@ -706,17 +771,13 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
}
}
-TexturePtr D_801ADF30[] = {
- gameplay_keep_Tex_061FC0, // Green rupee
- gameplay_keep_Tex_061FE0, // Blue rupee
- gameplay_keep_Tex_062000, // Red rupee
- gameplay_keep_Tex_062040, // Orange rupee
- gameplay_keep_Tex_062020 // Purple rupee
+static TexturePtr sRupeeTextures[] = {
+ gRupeeGreenTex, gRupeeBlueTex, gRupeeRedTex, gRupeeOrangeTex, gRupeePurpleTex,
};
void EnItem00_DrawRupee(EnItem00* this, PlayState* play) {
s32 pad;
- s32 iconNb;
+ s32 texIndex;
OPEN_DISPS(play->state.gfxCtx);
@@ -724,67 +785,66 @@ void EnItem00_DrawRupee(EnItem00* this, PlayState* play) {
func_800B8050(&this->actor, play, 0);
if (this->actor.params <= ITEM00_RUPEE_RED) {
- iconNb = this->actor.params;
+ texIndex = this->actor.params;
} else {
- iconNb = this->actor.params - 0x10;
+ texIndex = this->actor.params - 0x10;
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_801ADF30[iconNb]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeTextures[texIndex]));
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_0622C0); // TODO symbol
+ gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
CLOSE_DISPS(play->state.gfxCtx);
}
-TexturePtr D_801ADF44[12] = {
- gameplay_keep_Tex_05E6F0, // Heart (Not used)
- gameplay_keep_Tex_05CEF0, // Bombs (A), Bombs (0)
- gameplay_keep_Tex_05BEF0, // Arrows (10)
- gameplay_keep_Tex_05B6F0, // Arrows (30)
- gameplay_keep_Tex_05C6F0, // Arrows (40), Arrows (50)
- gameplay_keep_Tex_05CEF0, // Bombs (B)
- gameplay_keep_Tex_0607C0, // Nuts (1), Nuts (10)
- gameplay_keep_Tex_060FC0, // Sticks (1)
- gameplay_keep_Tex_0617C0, // Magic (Large)
- gameplay_keep_Tex_05FFC0, // Magic (Small)
+TexturePtr sItemDropTextures[] = {
+ gDropRecoveryHeartTex, // Heart (Not used)
+ gDropBombTex, // Bombs (A), Bombs (0)
+ gDropArrows1Tex, // Arrows (10)
+ gDropArrows2Tex, // Arrows (30)
+ gDropArrows3Tex, // Arrows (40), Arrows (50)
+ gDropBombTex, // Bombs (B)
+ gDropDekuNutTex, // Nuts (1), Nuts (10)
+ gDropDekuStickTex, // Sticks (1)
+ gDropMagicLargeTex, // Magic (Large)
+ gDropMagicSmallTex, // Magic (Small)
NULL,
- gameplay_keep_Tex_05F7C0 // Small Key
+ gDropKeySmallTex // Small Key
};
void EnItem00_DrawSprite(EnItem00* this, PlayState* play) {
- s32 iconNb = this->actor.params - 3;
+ s32 texIndex = this->actor.params - 3;
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = func_801660B8(play, POLY_OPA_DISP);
if (this->actor.params == ITEM00_NUTS_10) {
- iconNb = 6;
+ texIndex = 6;
} else if (this->actor.params == ITEM00_BOMBS_0) {
- iconNb = 1;
+ texIndex = 1;
} else if (this->actor.params >= ITEM00_ARROWS_30) {
- iconNb -= 3;
+ texIndex -= 3;
if (this->actor.params < ITEM00_ARROWS_50) {
- iconNb++;
+ texIndex++;
}
}
POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_801ADF44[iconNb]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sItemDropTextures[texIndex]));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_05F6F0);
+ gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
CLOSE_DISPS(play->state.gfxCtx);
}
void EnItem00_DrawHeartContainer(EnItem00* actor, PlayState* play) {
- s32 pad;
- s32 pad2;
+ s32 pad[2];
if (Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS) == actor->actor.objBankIndex) {
OPEN_DISPS(play->state.gfxCtx);
@@ -811,7 +871,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_05AAB0);
+ gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -893,7 +953,7 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) {
}
spawnedActor->speedXZ = 2.0f;
spawnedActor->gravity = -0.9f;
- spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(65536.0f);
+ spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000);
Actor_SetScale(spawnedActor, 0.0f);
((EnItem00*)spawnedActor)->actionFunc = func_800A6780;
((EnItem00*)spawnedActor)->unk152 = 0xDC;
@@ -948,7 +1008,7 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
} else {
spawnedActor->gravity = -0.9f;
}
- spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(65536.0f);
+ spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000);
spawnedActor->flags |= 0x10;
}
}
diff --git a/src/code/z_game_dlftbls.c b/src/code/z_game_dlftbls.c
index a79c732d8d..11d390a28d 100644
--- a/src/code/z_game_dlftbls.c
+++ b/src/code/z_game_dlftbls.c
@@ -4,6 +4,7 @@
#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "overlays/gamestates/ovl_select/z_select.h"
#include "overlays/gamestates/ovl_title/z_title.h"
+#include "z_title_setup.h"
#define GAMESTATE_OVERLAY(name, init, destroy, size) \
{ \
@@ -14,13 +15,13 @@
{ NULL, 0, 0, NULL, NULL, 0, init, destroy, 0, 0, 0, size }
GameStateOverlay gGameStateOverlayTable[] = {
- GAMESTATE_OVERLAY_INTERNAL(TitleSetup_Init, TitleSetup_Destroy, sizeof(GameState)),
+ GAMESTATE_OVERLAY_INTERNAL(Setup_Init, Setup_Destroy, sizeof(SetupState)),
GAMESTATE_OVERLAY(select, MapSelect_Init, MapSelect_Destroy, sizeof(MapSelectState)),
- GAMESTATE_OVERLAY(title, Title_Init, Title_Destroy, sizeof(TitleContext)),
+ GAMESTATE_OVERLAY(title, ConsoleLogo_Init, ConsoleLogo_Destroy, sizeof(ConsoleLogoState)),
GAMESTATE_OVERLAY_INTERNAL(Play_Init, Play_Destroy, sizeof(PlayState)),
- GAMESTATE_OVERLAY(opening, Opening_Init, Opening_Destroy, sizeof(OpeningContext)),
- GAMESTATE_OVERLAY(file_choose, FileChoose_Init, FileChoose_Destroy, sizeof(FileChooseContext)),
- GAMESTATE_OVERLAY(daytelop, Daytelop_Init, Daytelop_Destroy, sizeof(DaytelopContext)),
+ GAMESTATE_OVERLAY(opening, TitleSetup_Init, TitleSetup_Destroy, sizeof(TitleSetupState)),
+ GAMESTATE_OVERLAY(file_choose, FileSelect_Init, FileSelect_Destroy, sizeof(FileSelectState)),
+ GAMESTATE_OVERLAY(daytelop, DayTelop_Init, DayTelop_Destroy, sizeof(DayTelopState)),
};
s32 graphNumGameStates = ARRAY_COUNT(gGameStateOverlayTable);
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index 625adf20fd..b054dac74e 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -75,9 +75,11 @@ void KaleidoSetup_Update(PlayState* play) {
if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
if ((gSaveContext.save.cutscene < 0xFFF0) && (gSaveContext.nextCutsceneIndex < 0xFFF0)) {
if (!Play_InCsMode(play) || ((msgCtx->msgMode != 0) && (msgCtx->currentTextId == 0xFF))) {
- if ((play->unk_1887C < 2) && (gSaveContext.unk_3F28 != 8) && (gSaveContext.unk_3F28 != 9)) {
+ if ((play->unk_1887C < 2) && (gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) &&
+ (gSaveContext.magicState != MAGIC_STATE_FILL)) {
if (!(gSaveContext.eventInf[1] & 0x80) && !(player->stateFlags1 & 0x20)) {
- if (!(play->actorCtx.unk5 & 2) && !(play->actorCtx.unk5 & 4)) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_1) &&
+ !(play->actorCtx.flags & ACTORCTX_FLAG_2)) {
if ((play->actorCtx.unk268 == 0) && CHECK_BTN_ALL(input->press.button, BTN_START)) {
gSaveContext.unk_3F26 = gSaveContext.unk_3F22;
pauseCtx->unk_2B9 = 0;
@@ -137,7 +139,7 @@ void KaleidoSetup_Init(PlayState* play) {
pauseCtx->unk_2A0 = -1;
pauseCtx->unk_2BA = 320;
pauseCtx->unk_2BC = 40;
- pauseCtx->unk_29E = 100;
+ pauseCtx->promptAlpha = 100;
View_Init(&pauseCtx->view, play->state.gfxCtx);
}
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index bffe85d078..79385a7890 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -139,11 +139,11 @@ u16 sMinigameScoreDigits[] = { 0, 0, 0, 0 };
u16 sCUpInvisible = 0;
u16 sCUpTimer = 0;
-s16 sMagicBarOutlinePrimRed = 255;
-s16 sMagicBarOutlinePrimGreen = 255;
-s16 sMagicBarOutlinePrimBlue = 255;
-s16 D_801BF8AC = 2; // sMagicBorderRatio
-s16 D_801BF8B0 = 1;
+s16 sMagicMeterOutlinePrimRed = 255;
+s16 sMagicMeterOutlinePrimGreen = 255;
+s16 sMagicMeterOutlinePrimBlue = 255;
+s16 sMagicBorderRatio = 2;
+s16 sMagicBorderStep = 1;
s16 sExtraItemBases[] = {
ITEM_STICK, // ITEM_STICKS_5
@@ -225,10 +225,14 @@ s16 sFinalHoursClockColorTargetIndex = 0;
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010CD98.s")
+Gfx* func_8010CFBC(Gfx* displayListHead, void* texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop,
+ s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy, s16 r, s16 g, s16 b, s16 a);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010CFBC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010D2D4.s")
+Gfx* func_8010D480(Gfx* displayListHead, void* texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop,
+ s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy, s16 r, s16 g, s16 b, s16 a, s32 argE, s32 argF);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010D480.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010D7D0.s")
@@ -600,7 +604,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return item;
} else if (item == ITEM_MAGIC_SMALL) {
- Parameter_AddMagic(play, 0x18);
+ Magic_Add(play, MAGIC_NORMAL_METER / 2);
if (!(gSaveContext.save.weekEventReg[12] & 0x80)) {
gSaveContext.save.weekEventReg[12] |= 0x80;
return ITEM_NONE;
@@ -608,7 +612,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return item;
} else if (item == ITEM_MAGIC_LARGE) {
- Parameter_AddMagic(play, 0x30);
+ Magic_Add(play, MAGIC_NORMAL_METER);
if (!(gSaveContext.save.weekEventReg[12] & 0x80)) {
gSaveContext.save.weekEventReg[12] |= 0x80;
return ITEM_NONE;
@@ -1145,26 +1149,482 @@ void Inventory_ChangeAmmo(s16 item, s16 ammoChange) {
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Parameter_AddMagic.s")
+void Magic_Add(PlayState* play, s16 magicToAdd) {
+ if (((void)0, gSaveContext.save.playerData.magic) < ((void)0, gSaveContext.magicCapacity)) {
+ gSaveContext.magicToAdd += magicToAdd;
+ gSaveContext.isMagicRequested = true;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80115D5C.s")
+void Magic_Reset(PlayState* play) {
+ if ((gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) && (gSaveContext.magicState != MAGIC_STATE_FILL)) {
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80115DB4.s")
+/**
+ * Request to consume magic.
+ *
+ * @param magicToConsume the positive-valued amount to decrease magic by
+ * @param type how the magic is consumed.
+ * @return false if the request failed
+ */
+s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116088.s")
+ // Magic is not acquired yet
+ if (!gSaveContext.save.playerData.isMagicAcquired) {
+ return false;
+ }
-s16 magicBorderColors[][3] = {
+ // Not enough magic available to consume
+ if ((gSaveContext.save.playerData.magic - magicToConsume) < 0) {
+ if (gSaveContext.magicCapacity != 0) {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ return false;
+ }
+
+ switch (type) {
+ case MAGIC_CONSUME_NOW:
+ case MAGIC_CONSUME_NOW_ALT:
+ // Drain magic immediately e.g. Deku Bubble
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ magicToConsume = 0;
+ }
+ gSaveContext.magicToConsume = magicToConsume;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_SETUP;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+
+ case MAGIC_CONSUME_WAIT_NO_PREVIEW:
+ // Sets consume target but waits to consume.
+ // No yellow magic to preview target consumption.
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ magicToConsume = 0;
+ }
+ gSaveContext.magicToConsume = magicToConsume;
+ gSaveContext.magicState = MAGIC_STATE_METER_FLASH_3;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+
+ case MAGIC_CONSUME_LENS:
+ if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
+ if (gSaveContext.save.playerData.magic != 0) {
+ interfaceCtx->magicConsumptionTimer = 80;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_LENS;
+ return true;
+ } else {
+ return false;
+ }
+ } else if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ return true;
+ } else {
+ return false;
+ }
+
+ case MAGIC_CONSUME_WAIT_PREVIEW:
+ // Sets consume target but waits to consume.
+ // Preview consumption with a yellow bar. e.g. Spin Attack
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ gSaveContext.magicToConsume = magicToConsume;
+ gSaveContext.magicState = MAGIC_STATE_METER_FLASH_2;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+
+ case MAGIC_CONSUME_GORON_ZORA:
+ // Goron spiked rolling or Zora electric barrier
+ if (gSaveContext.save.playerData.magic != 0) {
+ interfaceCtx->magicConsumptionTimer = 10;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_GORON_ZORA_SETUP;
+ return true;
+ } else {
+ return false;
+ }
+
+ case MAGIC_CONSUME_GIANTS_MASK:
+ // Wearing Giant's Mask
+ if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
+ if (gSaveContext.save.playerData.magic != 0) {
+ interfaceCtx->magicConsumptionTimer = R_MAGIC_CONSUME_TIMER_GIANTS_MASK;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_GIANTS_MASK;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_GIANTS_MASK) {
+ return true;
+ } else {
+ return false;
+ }
+
+ case MAGIC_CONSUME_DEITY_BEAM:
+ // Consumes magic immediately
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ magicToConsume = 0;
+ }
+ gSaveContext.save.playerData.magic -= magicToConsume;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+ }
+
+ return false;
+}
+
+void Magic_UpdateAddRequest(void) {
+ if (gSaveContext.isMagicRequested) {
+ gSaveContext.save.playerData.magic += 4;
+ play_sound(NA_SE_SY_GAUGE_UP - SFX_FLAG);
+
+ if (((void)0, gSaveContext.save.playerData.magic) >= ((void)0, gSaveContext.magicCapacity)) {
+ gSaveContext.save.playerData.magic = gSaveContext.magicCapacity;
+ gSaveContext.magicToAdd = 0;
+ gSaveContext.isMagicRequested = false;
+ } else {
+ gSaveContext.magicToAdd -= 4;
+ if (gSaveContext.magicToAdd <= 0) {
+ gSaveContext.magicToAdd = 0;
+ gSaveContext.isMagicRequested = false;
+ }
+ }
+ }
+}
+
+s16 sMagicBorderColors[][3] = {
{ 255, 255, 255 },
{ 150, 150, 150 },
};
-s16 magicBorderIndices[] = { 0, 1, 1, 0 };
-s16 magicBorderColorTimerIndex[] = { 2, 1, 2, 1 };
+s16 sMagicBorderIndices[] = { 0, 1, 1, 0 };
+s16 sMagicBorderColorTimerIndex[] = { 2, 1, 2, 1 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116114.s")
+void Magic_FlashMeterBorder(void) {
+ s16 borderChangeR;
+ s16 borderChangeG;
+ s16 borderChangeB;
+ s16 index = sMagicBorderIndices[sMagicBorderStep];
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116348.s")
+ borderChangeR = ABS_ALT(sMagicMeterOutlinePrimRed - sMagicBorderColors[index][0]) / sMagicBorderRatio;
+ borderChangeG = ABS_ALT(sMagicMeterOutlinePrimGreen - sMagicBorderColors[index][1]) / sMagicBorderRatio;
+ borderChangeB = ABS_ALT(sMagicMeterOutlinePrimBlue - sMagicBorderColors[index][2]) / sMagicBorderRatio;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116918.s")
+ if (sMagicMeterOutlinePrimRed >= sMagicBorderColors[index][0]) {
+ sMagicMeterOutlinePrimRed -= borderChangeR;
+ } else {
+ sMagicMeterOutlinePrimRed += borderChangeR;
+ }
+
+ if (sMagicMeterOutlinePrimGreen >= sMagicBorderColors[index][1]) {
+ sMagicMeterOutlinePrimGreen -= borderChangeG;
+ } else {
+ sMagicMeterOutlinePrimGreen += borderChangeG;
+ }
+
+ if (sMagicMeterOutlinePrimBlue >= sMagicBorderColors[index][2]) {
+ sMagicMeterOutlinePrimBlue -= borderChangeB;
+ } else {
+ sMagicMeterOutlinePrimBlue += borderChangeB;
+ }
+
+ sMagicBorderRatio--;
+ if (sMagicBorderRatio == 0) {
+ sMagicMeterOutlinePrimRed = sMagicBorderColors[index][0];
+ sMagicMeterOutlinePrimGreen = sMagicBorderColors[index][1];
+ sMagicMeterOutlinePrimBlue = sMagicBorderColors[index][2];
+
+ sMagicBorderRatio = sMagicBorderColorTimerIndex[sMagicBorderStep];
+
+ sMagicBorderStep++;
+ if (sMagicBorderStep >= 4) {
+ sMagicBorderStep = 0;
+ }
+ }
+}
+
+void Magic_Update(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ s16 magicCapacityTarget;
+
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ Magic_FlashMeterBorder();
+ }
+
+ switch (gSaveContext.magicState) {
+ case MAGIC_STATE_STEP_CAPACITY:
+ // Step magicCapacity to the capacity determined by magicLevel
+ // This changes the width of the magic meter drawn
+ magicCapacityTarget = gSaveContext.save.playerData.magicLevel * MAGIC_NORMAL_METER;
+ if (gSaveContext.magicCapacity != magicCapacityTarget) {
+ if (gSaveContext.magicCapacity < magicCapacityTarget) {
+ gSaveContext.magicCapacity += 0x10;
+ if (gSaveContext.magicCapacity > magicCapacityTarget) {
+ gSaveContext.magicCapacity = magicCapacityTarget;
+ }
+ } else {
+ gSaveContext.magicCapacity -= 0x10;
+ if (gSaveContext.magicCapacity <= magicCapacityTarget) {
+ gSaveContext.magicCapacity = magicCapacityTarget;
+ }
+ }
+ } else {
+ // Once the capacity has reached its target,
+ // follow up by filling magic to magicFillTarget
+ gSaveContext.magicState = MAGIC_STATE_FILL;
+ }
+ break;
+
+ case MAGIC_STATE_FILL:
+ // Add magic until magicFillTarget is reached
+ gSaveContext.save.playerData.magic += 0x10;
+
+ if ((gSaveContext.gameMode == 0) && (gSaveContext.sceneSetupIndex < 4)) {
+ play_sound(NA_SE_SY_GAUGE_UP - SFX_FLAG);
+ }
+
+ if (((void)0, gSaveContext.save.playerData.magic) >= ((void)0, gSaveContext.magicFillTarget)) {
+ gSaveContext.save.playerData.magic = gSaveContext.magicFillTarget;
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ }
+ break;
+
+ case MAGIC_STATE_CONSUME_SETUP:
+ // Sets the speed at which magic border flashes
+ sMagicBorderRatio = 2;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME;
+ break;
+
+ case MAGIC_STATE_CONSUME:
+ // Consume magic until target is reached or no more magic is available
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic =
+ ((void)0, gSaveContext.save.playerData.magic) - ((void)0, gSaveContext.magicToConsume);
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1;
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ }
+ // fallthrough (flash border while magic is being consumed)
+ case MAGIC_STATE_METER_FLASH_1:
+ case MAGIC_STATE_METER_FLASH_2:
+ case MAGIC_STATE_METER_FLASH_3:
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ case MAGIC_STATE_RESET:
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ break;
+
+ case MAGIC_STATE_CONSUME_LENS:
+ // Slowly consume magic while Lens of Truth is active
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
+ (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) &&
+ !Play_InCsMode(play)) {
+
+ if ((gSaveContext.save.playerData.magic == 0) ||
+ ((func_801242DC(play) >= 2) && (func_801242DC(play) <= 4)) ||
+ ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) != ITEM_LENS) &&
+ (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) != ITEM_LENS) &&
+ (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) != ITEM_LENS)) ||
+ !play->actorCtx.lensActive) {
+ // Deactivate Lens of Truth and set magic state to idle
+ play->actorCtx.lensActive = false;
+ play_sound(NA_SE_SY_GLASSMODE_OFF);
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ break;
+ }
+
+ interfaceCtx->magicConsumptionTimer--;
+ if (interfaceCtx->magicConsumptionTimer == 0) {
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic--;
+ }
+ interfaceCtx->magicConsumptionTimer = 80;
+ }
+ }
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ case MAGIC_STATE_CONSUME_GORON_ZORA_SETUP:
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic -= 2;
+ }
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_GORON_ZORA;
+ // fallthrough
+ case MAGIC_STATE_CONSUME_GORON_ZORA:
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == 0) && (msgCtx->msgMode == 0) &&
+ (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
+ (play->transitionMode == TRANS_MODE_OFF)) {
+ if (!Play_InCsMode(play)) {
+ interfaceCtx->magicConsumptionTimer--;
+ if (interfaceCtx->magicConsumptionTimer == 0) {
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic--;
+ }
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ interfaceCtx->magicConsumptionTimer = 10;
+ }
+ }
+ }
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ case MAGIC_STATE_CONSUME_GIANTS_MASK:
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
+ (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
+ if (!Play_InCsMode(play)) {
+ interfaceCtx->magicConsumptionTimer--;
+ if (interfaceCtx->magicConsumptionTimer == 0) {
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic--;
+ }
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ interfaceCtx->magicConsumptionTimer = R_MAGIC_CONSUME_TIMER_GIANTS_MASK;
+ }
+ }
+ }
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ default:
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ break;
+ }
+}
+
+void Magic_DrawMeter(PlayState* play) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ s16 magicBarY;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (gSaveContext.save.playerData.magicLevel != 0) {
+ if (gSaveContext.save.playerData.healthCapacity > 0xA0) {
+ magicBarY = 42; // two rows of hearts
+ } else {
+ magicBarY = 34; // one row of hearts
+ }
+
+ func_8012C654(play->state.gfxCtx);
+
+ gDPSetEnvColor(OVERLAY_DISP++, 100, 50, 50, 255);
+
+ OVERLAY_DISP = func_8010CFBC(OVERLAY_DISP, gMagicMeterEndTex, 8, 16, 18, magicBarY, 8, 16, 1 << 10, 1 << 10,
+ sMagicMeterOutlinePrimRed, sMagicMeterOutlinePrimGreen, sMagicMeterOutlinePrimBlue,
+ interfaceCtx->magicAlpha);
+ OVERLAY_DISP =
+ func_8010CFBC(OVERLAY_DISP, gMagicMeterMidTex, 24, 16, 26, magicBarY, ((void)0, gSaveContext.magicCapacity),
+ 16, 1 << 10, 1 << 10, sMagicMeterOutlinePrimRed, sMagicMeterOutlinePrimGreen,
+ sMagicMeterOutlinePrimBlue, interfaceCtx->magicAlpha);
+ OVERLAY_DISP =
+ func_8010D480(OVERLAY_DISP, gMagicMeterEndTex, 8, 16, ((void)0, gSaveContext.magicCapacity) + 26, magicBarY,
+ 8, 16, 1 << 10, 1 << 10, sMagicMeterOutlinePrimRed, sMagicMeterOutlinePrimGreen,
+ sMagicMeterOutlinePrimBlue, interfaceCtx->magicAlpha, 3, 0x100);
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, PRIMITIVE, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, PRIMITIVE);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255);
+
+ if (gSaveContext.magicState == MAGIC_STATE_METER_FLASH_2) {
+ // Yellow part of the meter indicating the amount of magic to be subtracted
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 250, 250, 0, interfaceCtx->magicAlpha);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gMagicMeterFillTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSPTextureRectangle(OVERLAY_DISP++, 104, (magicBarY + 3) << 2,
+ (((void)0, gSaveContext.save.playerData.magic) + 26) << 2, (magicBarY + 10) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+
+ // Fill the rest of the meter with the normal magic color
+ gDPPipeSync(OVERLAY_DISP++);
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Blue magic (drank Chateau Romani)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 200, interfaceCtx->magicAlpha);
+ } else {
+ // Green magic (default)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 200, 0, interfaceCtx->magicAlpha);
+ }
+
+ gSPTextureRectangle(
+ OVERLAY_DISP++, 104, (magicBarY + 3) << 2,
+ ((((void)0, gSaveContext.save.playerData.magic) - ((void)0, gSaveContext.magicToConsume)) + 26) << 2,
+ (magicBarY + 10) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ } else {
+ // Fill the whole meter with the normal magic color
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Blue magic (drank Chateau Romani)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 200, interfaceCtx->magicAlpha);
+ } else {
+ // Green magic (default)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 200, 0, interfaceCtx->magicAlpha);
+ }
+
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gMagicMeterFillTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSPTextureRectangle(OVERLAY_DISP++, 104, (magicBarY + 3) << 2,
+ (((void)0, gSaveContext.save.playerData.magic) + 26) << 2, (magicBarY + 10) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ }
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116FD8.s")
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 66b33a8fd6..720e74239f 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -724,43 +724,19 @@ void Play_UpdateTransition(PlayState* this) {
}
if (gSaveContext.gameMode == 4) {
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, Opening_Init, OpeningContext);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, sizeof(TitleSetupState));
} else if (gSaveContext.gameMode != 2) {
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, Play_Init, PlayState);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
gSaveContext.save.entrance = this->nextEntrance;
if (gSaveContext.minigameState == 1) {
gSaveContext.minigameState = 3;
}
} else {
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, FileChoose_Init, FileChooseContext);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, FileSelect_Init, sizeof(FileSelectState));
}
} else {
if (this->transitionCtx.transitionType == TRANS_TYPE_21) {
@@ -805,16 +781,8 @@ void Play_UpdateTransition(PlayState* this) {
this->envCtx.screenFillColor[3] = (sTransitionFillTimer / 20.0f) * 255.0f;
if (sTransitionFillTimer >= 20) {
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, Play_Init, PlayState);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
gSaveContext.save.entrance = this->nextEntrance;
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
@@ -855,16 +823,8 @@ void Play_UpdateTransition(PlayState* this) {
case TRANS_MODE_INSTANT:
if (this->transitionTrigger != TRANS_TRIGGER_END) {
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, Play_Init, PlayState);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
gSaveContext.save.entrance = this->nextEntrance;
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
@@ -905,16 +865,8 @@ void Play_UpdateTransition(PlayState* this) {
}
} else {
if (this->envCtx.sandstormEnvA == 255) {
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, Play_Init, PlayState);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
gSaveContext.save.entrance = this->nextEntrance;
this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF;
@@ -1909,16 +1861,16 @@ void Play_SaveCycleSceneFlags(GameState* thisx) {
CycleSceneFlags* cycleSceneFlags;
cycleSceneFlags = &gSaveContext.cycleSceneFlags[Play_GetOriginalSceneNumber(this->sceneNum)];
- cycleSceneFlags->chest = this->actorCtx.flags.chest;
- cycleSceneFlags->switch0 = this->actorCtx.flags.switches[0];
- cycleSceneFlags->switch1 = this->actorCtx.flags.switches[1];
+ cycleSceneFlags->chest = this->actorCtx.sceneFlags.chest;
+ cycleSceneFlags->switch0 = this->actorCtx.sceneFlags.switches[0];
+ cycleSceneFlags->switch1 = this->actorCtx.sceneFlags.switches[1];
if (this->sceneNum == SCENE_INISIE_R) { // Inverted Stone Tower Temple
cycleSceneFlags = &gSaveContext.cycleSceneFlags[this->sceneNum];
}
- cycleSceneFlags->collectible = this->actorCtx.flags.collectible[0];
- cycleSceneFlags->clearedRoom = this->actorCtx.flags.clearedRoom;
+ cycleSceneFlags->collectible = this->actorCtx.sceneFlags.collectible[0];
+ cycleSceneFlags->clearedRoom = this->actorCtx.sceneFlags.clearedRoom;
}
void Play_SetRespawnData(GameState* thisx, s32 respawnMode, u16 entrance, s32 roomIndex, s32 playerParams, Vec3f* pos,
@@ -1930,9 +1882,9 @@ void Play_SetRespawnData(GameState* thisx, s32 respawnMode, u16 entrance, s32 ro
gSaveContext.respawn[respawnMode].pos = *pos;
gSaveContext.respawn[respawnMode].yaw = yaw;
gSaveContext.respawn[respawnMode].playerParams = playerParams;
- gSaveContext.respawn[respawnMode].tempSwitchFlags = this->actorCtx.flags.switches[2];
- gSaveContext.respawn[respawnMode].unk_18 = this->actorCtx.flags.collectible[1];
- gSaveContext.respawn[respawnMode].tempCollectFlags = this->actorCtx.flags.collectible[2];
+ gSaveContext.respawn[respawnMode].tempSwitchFlags = this->actorCtx.sceneFlags.switches[2];
+ gSaveContext.respawn[respawnMode].unk_18 = this->actorCtx.sceneFlags.collectible[1];
+ gSaveContext.respawn[respawnMode].tempCollectFlags = this->actorCtx.sceneFlags.collectible[2];
}
void Play_SetupRespawnPoint(GameState* thisx, s32 respawnMode, s32 playerParams) {
@@ -1959,9 +1911,9 @@ void func_80169ECC(PlayState* this) {
void func_80169EFC(GameState* thisx) {
PlayState* this = (PlayState*)thisx;
- gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwitchFlags = this->actorCtx.flags.switches[2];
- gSaveContext.respawn[RESPAWN_MODE_DOWN].unk_18 = this->actorCtx.flags.collectible[1];
- gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = this->actorCtx.flags.collectible[2];
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwitchFlags = this->actorCtx.sceneFlags.switches[2];
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].unk_18 = this->actorCtx.sceneFlags.collectible[1];
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = this->actorCtx.sceneFlags.collectible[2];
this->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance;
gSaveContext.respawnFlag = 1;
func_80169ECC(this);
@@ -2124,16 +2076,8 @@ void Play_Init(GameState* thisx) {
if ((gSaveContext.respawnFlag == -4) || (gSaveContext.respawnFlag == -0x63)) {
if (gSaveContext.eventInf[2] & 0x80) {
gSaveContext.eventInf[2] &= (u8)~0x80;
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, Daytelop_Init, DaytelopContext);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, DayTelop_Init, sizeof(DayTelopState));
return;
}
@@ -2147,16 +2091,8 @@ void Play_Init(GameState* thisx) {
if (gSaveContext.save.entrance == -1) {
gSaveContext.save.entrance = 0;
- do {
- GameState* state = &this->state;
-
- state->running = false;
- } while (0);
- do {
- GameState* state = &this->state;
-
- SET_NEXT_GAMESTATE(state, Opening_Init, OpeningContext);
- } while (0);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, sizeof(TitleSetupState));
return;
}
@@ -2267,7 +2203,7 @@ void Play_Init(GameState* thisx) {
if (((gSaveContext.gameMode != 0) && (gSaveContext.gameMode != 1)) || (gSaveContext.save.cutscene >= 0xFFF0)) {
gSaveContext.unk_3DC0 = 0;
- func_80115D5C(&this->state);
+ Magic_Reset(this);
gSaveContext.sceneSetupIndex = (gSaveContext.save.cutscene & 0xF) + 1;
gSaveContext.save.cutscene = 0;
} else {
diff --git a/src/code/z_prenmi.c b/src/code/z_prenmi.c
index 0e9c435c69..e0381153a7 100644
--- a/src/code/z_prenmi.c
+++ b/src/code/z_prenmi.c
@@ -1,23 +1,22 @@
-#include "global.h"
+#include "z_prenmi.h"
-void PreNMI_Stop(PreNMIContext* prenmiCtx) {
- prenmiCtx->state.running = 0;
- prenmiCtx->state.nextGameStateInit = NULL;
- prenmiCtx->state.nextGameStateSize = 0;
+void PreNMI_Stop(PreNMIState* this) {
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, NULL, 0);
}
-void PreNMI_Update(PreNMIContext* prenmiCtx) {
- if (prenmiCtx->timer == 0) {
+void PreNMI_Update(PreNMIState* this) {
+ if (this->timer == 0) {
ViConfig_UpdateVi(1);
- PreNMI_Stop(prenmiCtx);
+ PreNMI_Stop(this);
return;
}
- prenmiCtx->timer--;
+ this->timer--;
}
-void PreNMI_Draw(PreNMIContext* prenmiCtx) {
- GraphicsContext* gfxCtx = prenmiCtx->state.gfxCtx;
+void PreNMI_Draw(PreNMIState* this) {
+ GraphicsContext* gfxCtx = this->state.gfxCtx;
func_8012CF0C(gfxCtx, true, true, 0, 0, 0);
@@ -26,26 +25,30 @@ void PreNMI_Draw(PreNMIContext* prenmiCtx) {
func_8012C470(gfxCtx);
gDPSetFillColor(POLY_OPA_DISP++, (GPACK_RGBA5551(255, 255, 255, 1) << 16) | GPACK_RGBA5551(255, 255, 255, 1));
- gDPFillRectangle(POLY_OPA_DISP++, 0, prenmiCtx->timer + 100, SCREEN_WIDTH - 1, prenmiCtx->timer + 100);
+ gDPFillRectangle(POLY_OPA_DISP++, 0, this->timer + 100, SCREEN_WIDTH - 1, this->timer + 100);
CLOSE_DISPS(gfxCtx);
}
-void PreNMI_Main(PreNMIContext* prenmiCtx) {
- PreNMI_Update(prenmiCtx);
- PreNMI_Draw(prenmiCtx);
+void PreNMI_Main(GameState* thisx) {
+ PreNMIState* this = (PreNMIState*)thisx;
- prenmiCtx->state.unk_A3 = 1;
+ PreNMI_Update(this);
+ PreNMI_Draw(this);
+
+ this->state.unk_A3 = 1;
}
-void PreNMI_Destroy(PreNMIContext* prenmiCtx) {
+void PreNMI_Destroy(GameState* thisx) {
}
-void PreNMI_Init(PreNMIContext* prenmiCtx) {
- prenmiCtx->state.main = (GameStateFunc)PreNMI_Main;
- prenmiCtx->state.destroy = (GameStateFunc)PreNMI_Destroy;
- prenmiCtx->timer = 30;
- prenmiCtx->unkA8 = 10;
+void PreNMI_Init(GameState* thisx) {
+ PreNMIState* this = (PreNMIState*)thisx;
- Game_SetFramerateDivisor(&prenmiCtx->state, 1);
+ this->state.main = PreNMI_Main;
+ this->state.destroy = PreNMI_Destroy;
+ this->timer = 30;
+ this->unkA8 = 10;
+
+ Game_SetFramerateDivisor(&this->state, 1);
}
diff --git a/src/code/z_snap.c b/src/code/z_snap.c
index 246309749c..7a234ca225 100644
--- a/src/code/z_snap.c
+++ b/src/code/z_snap.c
@@ -49,7 +49,7 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
// Actors which may be pictographed anywhere
switch (actor->id) {
case ACTOR_EN_KAKASI:
- if (GET_KAKASI_ABOVE_GROUND(actor) == 1) {
+ if (KAKASI_GET_ABOVE_GROUND(actor) == 1) {
seen |= PICTO_SEEN_ANYWHERE;
break; //! @bug break is inside conditional, meaning it falls through if it is false
}
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index 5f92d13e54..ed7945ec37 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -267,11 +267,11 @@ void Sram_SaveEndOfCycle(PlayState* play) {
sceneNum = Play_GetOriginalSceneNumber(play->sceneNum);
Play_SaveCycleSceneFlags(&play->state);
- play->actorCtx.flags.chest &= D_801C5FC0[sceneNum][2];
- play->actorCtx.flags.switches[0] &= D_801C5FC0[sceneNum][0];
- play->actorCtx.flags.switches[1] &= D_801C5FC0[sceneNum][1];
- play->actorCtx.flags.collectible[0] &= D_801C5FC0[sceneNum][3];
- play->actorCtx.flags.clearedRoom = 0;
+ play->actorCtx.sceneFlags.chest &= D_801C5FC0[sceneNum][2];
+ play->actorCtx.sceneFlags.switches[0] &= D_801C5FC0[sceneNum][0];
+ play->actorCtx.sceneFlags.switches[1] &= D_801C5FC0[sceneNum][1];
+ play->actorCtx.sceneFlags.collectible[0] &= D_801C5FC0[sceneNum][3];
+ play->actorCtx.sceneFlags.clearedRoom = 0;
for (i = 0; i < SCENE_MAX; i++) {
gSaveContext.cycleSceneFlags[i].switch0 = ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & D_801C5FC0[i][0];
@@ -597,12 +597,12 @@ SavePlayerData sSaveDefaultPlayerData = {
0x30, // healthCapacity
0x30, // health
0, // magicLevel
- 0x30, // magic
+ MAGIC_NORMAL_METER, // magic
0, // rupees
0, // swordHealth
0, // tatlTimer
- 0, // magicAcquired
- 0, // doubleMagic
+ false, // isMagicAcquired
+ false, // isDoubleMagicAcquired
0, // doubleDefense
0, // unk_1F
0xFF, // unk_20
@@ -697,12 +697,12 @@ SavePlayerData sSaveDebugPlayerData = {
0x80, // healthCapacity
0x80, // health
0, // magicLevel
- 0x30, // magic
- 0x32, // rupees
- 0x64, // swordHealth
+ MAGIC_NORMAL_METER, // magic
+ 50, // rupees
+ 100, // swordHealth
0, // tatlTimer
- 1, // magicAcquired
- 0, // doubleMagic
+ true, // isMagicAcquired
+ false, // isDoubleMagicAcquired
0, // doubleDefense
0, // unk_1F
0xFF, // unk_20
@@ -918,7 +918,7 @@ u16 D_801C6A58[] = {
ENTRANCE(IKANA_CANYON, 4), ENTRANCE(STONE_TOWER, 3),
};
-void Sram_OpenSave(FileChooseContext* fileChooseCtx, SramContext* sramCtx) {
+void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
s32 i;
s32 pad;
s32 phi_t1;
@@ -930,7 +930,7 @@ void Sram_OpenSave(FileChooseContext* fileChooseCtx, SramContext* sramCtx) {
if (gSaveContext.fileNum == 0xFF) {
func_80185968(sramCtx->saveBuf, D_801C67C8[0], D_801C67F0[0]);
- } else if (fileChooseCtx->unk_2446A[gSaveContext.fileNum] != 0) {
+ } else if (fileSelect->unk_2446A[gSaveContext.fileNum] != 0) {
phi_t1 = gSaveContext.fileNum + 2;
phi_t1 *= 2;
@@ -1079,8 +1079,8 @@ void func_80145698(SramContext* sramCtx) {
// Verifies save and use backup if corrupted?
#ifdef NON_EQUIVALENT
-void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
- FileChooseContext* fileChooseCtx = fileChooseCtx2;
+void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
+ FileSelectState* fileSelect = fileSelect2;
u16 sp7A;
// u16 sp78;
u16 sp76;
@@ -1119,7 +1119,7 @@ void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
}
if (sp76 < 2) {
- fileChooseCtx->unk_24468[sp76] = 0;
+ fileSelect->unk_24468[sp76] = 0;
if (phi_s2) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
@@ -1157,34 +1157,33 @@ void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.newf); sp7A++) {
- fileChooseCtx->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
+ fileSelect->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
}
- if (!CHECK_NEWF(fileChooseCtx->newf[sp76])) {
- fileChooseCtx->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
+ if (!CHECK_NEWF(fileSelect->newf[sp76])) {
+ fileSelect->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.playerName); sp7A++) {
- fileChooseCtx->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
+ fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
}
- fileChooseCtx->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
- fileChooseCtx->health[sp76] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24454[sp76] = gSaveContext.save.inventory.defenseHearts;
- fileChooseCtx->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
- fileChooseCtx->unk_24458[sp76] = gSaveContext.save.time;
- fileChooseCtx->unk_24460[sp76] = gSaveContext.save.day;
- fileChooseCtx->unk_24468[sp76] = gSaveContext.save.isOwlSave;
- fileChooseCtx->rupees[sp76] = gSaveContext.save.playerData.rupees;
- fileChooseCtx->unk_24474[sp76] = CUR_UPG_VALUE(4);
+ fileSelect->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
+ fileSelect->health[sp76] = gSaveContext.save.playerData.health;
+ fileSelect->unk_24454[sp76] = gSaveContext.save.inventory.defenseHearts;
+ fileSelect->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
+ fileSelect->unk_24458[sp76] = gSaveContext.save.time;
+ fileSelect->unk_24460[sp76] = gSaveContext.save.day;
+ fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[sp76] = gSaveContext.save.playerData.rupees;
+ fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4);
for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
if (gSaveContext.save.inventory.items[sp7A + 24] != 0xFF) {
phi_a0++;
}
}
- fileChooseCtx->maskCount[sp76] = phi_a0;
- fileChooseCtx->heartPieceCount[sp76] =
- ((gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C);
+ fileSelect->maskCount[sp76] = phi_a0;
+ fileSelect->heartPieceCount[sp76] = ((gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C);
}
if (sp6E == 1) {
@@ -1209,9 +1208,9 @@ void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
}
}
} else if (sp76 < 4) {
- fileChooseCtx->unk_24468[sp76] = 0;
+ fileSelect->unk_24468[sp76] = 0;
- if (!CHECK_NEWF(fileChooseCtx->newf2[(s32)sp76])) { // TODO: Needed?
+ if (!CHECK_NEWF(fileSelect->newf2[(s32)sp76])) { // TODO: Needed?
if (phi_s2) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf,
@@ -1251,34 +1250,34 @@ void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.newf); sp7A++) {
- fileChooseCtx->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
+ fileSelect->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
}
- if (!CHECK_NEWF(fileChooseCtx->newf[sp76])) {
- fileChooseCtx->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
+ if (!CHECK_NEWF(fileSelect->newf[sp76])) {
+ fileSelect->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.playerName); sp7A++) {
phi_s2 += 0; // TODO: Needed?
- fileChooseCtx->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
+ fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
}
- fileChooseCtx->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
- fileChooseCtx->health[sp76] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24454[sp76] = gSaveContext.save.inventory.defenseHearts;
- fileChooseCtx->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
- fileChooseCtx->unk_24458[sp76] = gSaveContext.save.time;
- fileChooseCtx->unk_24460[sp76] = gSaveContext.save.day;
- fileChooseCtx->unk_24468[sp76] = gSaveContext.save.isOwlSave;
- fileChooseCtx->rupees[sp76] = gSaveContext.save.playerData.rupees;
- fileChooseCtx->unk_24474[sp76] = CUR_UPG_VALUE(4);
+ fileSelect->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
+ fileSelect->health[sp76] = gSaveContext.save.playerData.health;
+ fileSelect->unk_24454[sp76] = gSaveContext.save.inventory.defenseHearts;
+ fileSelect->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
+ fileSelect->unk_24458[sp76] = gSaveContext.save.time;
+ fileSelect->unk_24460[sp76] = gSaveContext.save.day;
+ fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[sp76] = gSaveContext.save.playerData.rupees;
+ fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4);
for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
if (gSaveContext.save.inventory.items[sp7A + 24] != 0xFF) {
phi_a0++;
}
}
- fileChooseCtx->maskCount[sp76] = phi_a0;
- fileChooseCtx->heartPieceCount[sp76] =
+ fileSelect->maskCount[sp76] = phi_a0;
+ fileSelect->heartPieceCount[sp76] =
((gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C);
}
@@ -1342,14 +1341,14 @@ void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_801457CC.s")
#endif
-void func_80146580(FileChooseContext* fileChooseCtx2, SramContext* sramCtx, s32 fileNum) {
- FileChooseContext* fileChooseCtx = fileChooseCtx2;
+void func_80146580(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) {
+ FileSelectState* fileSelect = fileSelect2;
s32 pad;
if (gSaveContext.unk_3F3F) {
- if (fileChooseCtx->unk_2446A[fileNum]) {
+ if (fileSelect->unk_2446A[fileNum]) {
func_80147314(sramCtx, fileNum);
- fileChooseCtx->unk_2446A[fileNum] = 0;
+ fileSelect->unk_2446A[fileNum] = 0;
}
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
@@ -1361,30 +1360,30 @@ void func_80146580(FileChooseContext* fileChooseCtx2, SramContext* sramCtx, s32
#ifdef NON_MATCHING
// v0/v1
-void func_80146628(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
- FileChooseContext* fileChooseCtx = fileChooseCtx2;
+void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) {
+ FileSelectState* fileSelect = fileSelect2;
u16 i;
s16 maskCount;
if (gSaveContext.unk_3F3F) {
- if (fileChooseCtx->unk_2446A[fileChooseCtx->unk_2448E]) {
- func_80147414(sramCtx, fileChooseCtx->unk_2448E, fileChooseCtx->fileNum);
- fileChooseCtx->unk_24410[fileChooseCtx->fileNum] = gSaveContext.save.playerData.deaths;
+ if (fileSelect->unk_2446A[fileSelect->unk_2448E]) {
+ func_80147414(sramCtx, fileSelect->unk_2448E, fileSelect->fileNum);
+ fileSelect->unk_24410[fileSelect->fileNum] = gSaveContext.save.playerData.deaths;
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
- fileChooseCtx->unk_24424[fileChooseCtx->fileNum][i] = gSaveContext.save.playerData.playerName[i];
+ fileSelect->unk_24424[fileSelect->fileNum][i] = gSaveContext.save.playerData.playerName[i];
}
- fileChooseCtx->unk_24438[fileChooseCtx->fileNum] = gSaveContext.save.playerData.healthCapacity;
- fileChooseCtx->unk_24440[fileChooseCtx->fileNum] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24456[fileChooseCtx->fileNum] = gSaveContext.save.inventory.defenseHearts;
- fileChooseCtx->unk_2444C[fileChooseCtx->fileNum] = gSaveContext.save.inventory.questItems;
- fileChooseCtx->unk_2445C[fileChooseCtx->fileNum] = gSaveContext.save.time;
- fileChooseCtx->unk_24464[fileChooseCtx->fileNum] = gSaveContext.save.day;
- fileChooseCtx->unk_2446A[fileChooseCtx->fileNum] = gSaveContext.save.isOwlSave;
- fileChooseCtx->unk_24470[fileChooseCtx->fileNum] = gSaveContext.save.playerData.rupees;
+ fileSelect->unk_24438[fileSelect->fileNum] = gSaveContext.save.playerData.healthCapacity;
+ fileSelect->unk_24440[fileSelect->fileNum] = gSaveContext.save.playerData.health;
+ fileSelect->unk_24456[fileSelect->fileNum] = gSaveContext.save.inventory.defenseHearts;
+ fileSelect->unk_2444C[fileSelect->fileNum] = gSaveContext.save.inventory.questItems;
+ fileSelect->unk_2445C[fileSelect->fileNum] = gSaveContext.save.time;
+ fileSelect->unk_24464[fileSelect->fileNum] = gSaveContext.save.day;
+ fileSelect->unk_2446A[fileSelect->fileNum] = gSaveContext.save.isOwlSave;
+ fileSelect->unk_24470[fileSelect->fileNum] = gSaveContext.save.playerData.rupees;
// = CUR_UPG_VALUE(UPG_WALLET);
- fileChooseCtx->unk_24476[fileChooseCtx->fileNum] =
+ fileSelect->unk_24476[fileSelect->fileNum] =
(gSaveContext.save.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
for (i = 0, maskCount = 0; i < 24; i++) {
@@ -1393,41 +1392,39 @@ void func_80146628(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
}
}
- fileChooseCtx->unk_2447A[fileChooseCtx->fileNum] = maskCount;
- fileChooseCtx->unk_2447E[fileChooseCtx->fileNum] =
- (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
+ fileSelect->unk_2447A[fileSelect->fileNum] = maskCount;
+ fileSelect->unk_2447E[fileSelect->fileNum] = (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
}
// clear buffer
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
// read to buffer
- func_80185968(sramCtx->saveBuf, D_801C67C8[fileChooseCtx->unk_2448E * 2],
- D_801C67F0[fileChooseCtx->unk_2448E * 2]);
+ func_80185968(sramCtx->saveBuf, D_801C67C8[fileSelect->unk_2448E * 2], D_801C67F0[fileSelect->unk_2448E * 2]);
if (1) {}
- func_80185968(&sramCtx->saveBuf[0x2000], D_801C67C8[fileChooseCtx->unk_2448E * 2 + 1],
- D_801C67F0[fileChooseCtx->unk_2448E * 2 + 1]);
+ func_80185968(&sramCtx->saveBuf[0x2000], D_801C67C8[fileSelect->unk_2448E * 2 + 1],
+ D_801C67F0[fileSelect->unk_2448E * 2 + 1]);
if (1) {}
// copy buffer to save context
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
- fileChooseCtx->unk_2440C[fileChooseCtx->fileNum] = gSaveContext.save.playerData.deaths;
+ fileSelect->unk_2440C[fileSelect->fileNum] = gSaveContext.save.playerData.deaths;
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
- fileChooseCtx->unk_24414[fileChooseCtx->fileNum][i] = gSaveContext.save.playerData.playerName[i];
+ fileSelect->unk_24414[fileSelect->fileNum][i] = gSaveContext.save.playerData.playerName[i];
}
- fileChooseCtx->healthCapacity[fileChooseCtx->fileNum] = gSaveContext.save.playerData.healthCapacity;
- fileChooseCtx->health[fileChooseCtx->fileNum] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24454[fileChooseCtx->fileNum] = gSaveContext.save.inventory.defenseHearts;
- fileChooseCtx->unk_24444[fileChooseCtx->fileNum] = gSaveContext.save.inventory.questItems;
- fileChooseCtx->unk_24458[fileChooseCtx->fileNum] = gSaveContext.save.time;
- fileChooseCtx->unk_24460[fileChooseCtx->fileNum] = gSaveContext.save.day;
- fileChooseCtx->unk_24468[fileChooseCtx->fileNum] = gSaveContext.save.isOwlSave;
- fileChooseCtx->rupees[fileChooseCtx->fileNum] = gSaveContext.save.playerData.rupees;
+ fileSelect->healthCapacity[fileSelect->fileNum] = gSaveContext.save.playerData.healthCapacity;
+ fileSelect->health[fileSelect->fileNum] = gSaveContext.save.playerData.health;
+ fileSelect->unk_24454[fileSelect->fileNum] = gSaveContext.save.inventory.defenseHearts;
+ fileSelect->unk_24444[fileSelect->fileNum] = gSaveContext.save.inventory.questItems;
+ fileSelect->unk_24458[fileSelect->fileNum] = gSaveContext.save.time;
+ fileSelect->unk_24460[fileSelect->fileNum] = gSaveContext.save.day;
+ fileSelect->unk_24468[fileSelect->fileNum] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->fileNum] = gSaveContext.save.playerData.rupees;
// = CUR_UPG_VALUE(UPG_WALLET);
- fileChooseCtx->unk_24474[fileChooseCtx->fileNum] =
+ fileSelect->unk_24474[fileSelect->fileNum] =
(gSaveContext.save.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
for (i = 0, maskCount = 0; i < 24; i++) {
@@ -1436,8 +1433,8 @@ void func_80146628(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
}
}
- fileChooseCtx->maskCount[fileChooseCtx->fileNum] = maskCount;
- fileChooseCtx->heartPieceCount[fileChooseCtx->fileNum] =
+ fileSelect->maskCount[fileSelect->fileNum] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->fileNum] =
(gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
}
@@ -1448,21 +1445,20 @@ void func_80146628(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146628.s")
#endif
-void Sram_InitSave(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
+void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) {
s32 phi_v0;
u16 i;
- FileChooseContext* fileChooseCtx = fileChooseCtx2;
+ FileSelectState* fileSelect = fileSelect2;
s16 maskCount;
if (gSaveContext.unk_3F3F) {
Sram_InitNewSave();
- if (fileChooseCtx->unk_24480 == 0) {
+ if (fileSelect->unk_24480 == 0) {
gSaveContext.save.cutscene = 0xFFF0;
}
for (phi_v0 = 0; phi_v0 < ARRAY_COUNT(gSaveContext.save.playerData.playerName); phi_v0++) {
- gSaveContext.save.playerData.playerName[phi_v0] =
- fileChooseCtx->unk_24414[fileChooseCtx->unk_24480][phi_v0];
+ gSaveContext.save.playerData.playerName[phi_v0] = fileSelect->unk_24414[fileSelect->unk_24480][phi_v0];
}
gSaveContext.save.playerData.newf[0] = 'Z';
@@ -1478,24 +1474,24 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.newf); i++) {
- fileChooseCtx->newf[fileChooseCtx->unk_24480][i] = gSaveContext.save.playerData.newf[i];
+ fileSelect->newf[fileSelect->unk_24480][i] = gSaveContext.save.playerData.newf[i];
}
- fileChooseCtx->unk_2440C[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.deaths;
+ fileSelect->unk_2440C[fileSelect->unk_24480] = gSaveContext.save.playerData.deaths;
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
- fileChooseCtx->unk_24414[fileChooseCtx->unk_24480][i] = gSaveContext.save.playerData.playerName[i];
+ fileSelect->unk_24414[fileSelect->unk_24480][i] = gSaveContext.save.playerData.playerName[i];
}
- fileChooseCtx->healthCapacity[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.healthCapacity;
- fileChooseCtx->health[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24454[fileChooseCtx->unk_24480] = gSaveContext.save.inventory.defenseHearts;
- fileChooseCtx->unk_24444[fileChooseCtx->unk_24480] = gSaveContext.save.inventory.questItems;
- fileChooseCtx->unk_24458[fileChooseCtx->unk_24480] = gSaveContext.save.time;
- fileChooseCtx->unk_24460[fileChooseCtx->unk_24480] = gSaveContext.save.day;
- fileChooseCtx->unk_24468[fileChooseCtx->unk_24480] = gSaveContext.save.isOwlSave;
- fileChooseCtx->rupees[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.rupees;
- fileChooseCtx->unk_24474[fileChooseCtx->unk_24480] = CUR_UPG_VALUE(UPG_WALLET);
+ fileSelect->healthCapacity[fileSelect->unk_24480] = gSaveContext.save.playerData.healthCapacity;
+ fileSelect->health[fileSelect->unk_24480] = gSaveContext.save.playerData.health;
+ fileSelect->unk_24454[fileSelect->unk_24480] = gSaveContext.save.inventory.defenseHearts;
+ fileSelect->unk_24444[fileSelect->unk_24480] = gSaveContext.save.inventory.questItems;
+ fileSelect->unk_24458[fileSelect->unk_24480] = gSaveContext.save.time;
+ fileSelect->unk_24460[fileSelect->unk_24480] = gSaveContext.save.day;
+ fileSelect->unk_24468[fileSelect->unk_24480] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->unk_24480] = gSaveContext.save.playerData.rupees;
+ fileSelect->unk_24474[fileSelect->unk_24480] = CUR_UPG_VALUE(UPG_WALLET);
for (i = 0, maskCount = 0; i < 24; i++) {
if (gSaveContext.save.inventory.items[i + 24] != ITEM_NONE) {
@@ -1503,8 +1499,8 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
}
}
- fileChooseCtx->maskCount[fileChooseCtx->unk_24480] = maskCount;
- fileChooseCtx->heartPieceCount[fileChooseCtx->unk_24480] =
+ fileSelect->maskCount[fileSelect->unk_24480] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->unk_24480] =
(gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
}
@@ -1526,9 +1522,9 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) {
func_801A3D98(gSaveContext.options.audioSetting);
}
-void Sram_Alloc(GameState* gamestate, SramContext* sramCtx) {
+void Sram_Alloc(GameState* gameState, SramContext* sramCtx) {
if (gSaveContext.unk_3F3F) {
- sramCtx->saveBuf = THA_AllocEndAlign16(&gamestate->heap, SAVE_BUFFER_SIZE);
+ sramCtx->saveBuf = THA_AllocEndAlign16(&gameState->heap, SAVE_BUFFER_SIZE);
sramCtx->status = 0;
}
}
diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
index 5f32870a76..3be9ff149d 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
@@ -69,7 +69,7 @@ void ArmsHook_Destroy(Actor* thisx, PlayState* play) {
ArmsHook* this = THIS;
if (this->grabbed != NULL) {
- this->grabbed->flags &= ~0x2000;
+ this->grabbed->flags &= ~ACTOR_FLAG_2000;
}
Collider_DestroyQuad(play, &this->collider);
}
@@ -100,7 +100,7 @@ s32 ArmsHook_AttachToPlayer(ArmsHook* this, Player* player) {
void ArmsHook_DetachHookFromActor(ArmsHook* this) {
if (this->grabbed != NULL) {
- this->grabbed->flags &= ~0x2000;
+ this->grabbed->flags &= ~ACTOR_FLAG_2000;
this->grabbed = NULL;
}
}
@@ -120,7 +120,7 @@ s32 ArmsHook_CheckForCancel(ArmsHook* this) {
}
void ArmsHook_AttachHookToActor(ArmsHook* this, Actor* actor) {
- actor->flags |= 0x2000;
+ actor->flags |= ACTOR_FLAG_2000;
this->grabbed = actor;
Math_Vec3f_Diff(&actor->world.pos, &this->actor.world.pos, &this->unk1FC);
}
@@ -140,10 +140,10 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
if (this->timer != 0 && (this->collider.base.atFlags & AT_HIT) &&
(this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4)) {
Actor* touchedActor = this->collider.base.at;
- if ((touchedActor->update != NULL) && (touchedActor->flags & 0x600)) {
+ if ((touchedActor->update != NULL) && (touchedActor->flags & (ACTOR_FLAG_200 | ACTOR_FLAG_400))) {
if (this->collider.info.atHitInfo->bumperFlags & BUMP_HOOKABLE) {
ArmsHook_AttachHookToActor(this, touchedActor);
- if ((touchedActor->flags & 0x400) == 0x400) {
+ if ((touchedActor->flags & ACTOR_FLAG_400) == ACTOR_FLAG_400) {
func_808C1154(this);
}
}
@@ -164,7 +164,7 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
grabbed = this->grabbed;
if (grabbed != NULL) {
- if ((grabbed->update == NULL) || (grabbed->flags & 0x2000) != 0x2000) {
+ if ((grabbed->update == NULL) || !CHECK_FLAG_ALL(grabbed->flags, ACTOR_FLAG_2000)) {
grabbed = NULL;
this->grabbed = NULL;
} else {
diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
index cee615da1e..7afe3a2ce2 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
@@ -15,7 +15,7 @@ typedef struct ArmsHook {
/* 0x1EC */ Vec3f unk1EC;
/* 0x1F8 */ Actor* grabbed;
/* 0x1FC */ Vec3f unk1FC;
- /* 0x208 */ char unk208[0x2];
+ /* 0x208 */ UNK_TYPE1 unk208[0x2];
/* 0x20A */ s16 timer;
/* 0x20C */ ArmsHookActionFunc actionFunc;
} ArmsHook; // size = 0x210
diff --git a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
index 16e4832a8f..9cf65349f1 100644
--- a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
+++ b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
@@ -81,7 +81,7 @@ void ArrowFire_Init(Actor* thisx, PlayState* play) {
void ArrowFire_Destroy(Actor* thisx, PlayState* play) {
ArrowFire* this = THIS;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
Collider_DestroyQuad(play, &this->collider1);
Collider_DestroyQuad(play, &this->collider2);
}
diff --git a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
index 7c4f1f9691..88eddb39e6 100644
--- a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
+++ b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
@@ -57,7 +57,7 @@ void ArrowIce_Init(Actor* thisx, PlayState* play) {
}
void ArrowIce_Destroy(Actor* thisx, PlayState* play) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
(void)"消滅"; // Unreferenced in retail, means "Disappearance"
}
diff --git a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
index 1a7503e54c..9f974472f8 100644
--- a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
+++ b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
@@ -56,7 +56,7 @@ void ArrowLight_Init(Actor* thisx, PlayState* play) {
}
void ArrowLight_Destroy(Actor* thisx, PlayState* play) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
(void)"消滅"; // Unreferenced in retail, means "Disappearance"
}
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
index d849ab5ed9..d7e1bef1f8 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
@@ -1,7 +1,7 @@
/*
* File: z_bg_dblue_balance.c
* Overlay: ovl_Bg_Dblue_Balance
- * Description: Great Bay Temple - See-Saw
+ * Description: Great Bay Temple - Seesaw and Waterwheel w/ Platforms
*/
#include "prevent_bss_reordering.h"
@@ -43,19 +43,19 @@ const ActorInit Bg_Dblue_Balance_InitVars = {
};
typedef struct {
- /* 0x00 */ Gfx* unk_00;
- /* 0x04 */ CollisionHeader* unk_04;
+ /* 0x00 */ Gfx* opaDList;
+ /* 0x04 */ CollisionHeader* colHeader;
/* 0x08 */ u32 unk_08;
/* 0x0C */ f32 unk_0C;
/* 0x10 */ f32 unk_10;
- /* 0x14 */ ActorFunc unk_14;
- /* 0x18 */ ActorFunc unk_18;
-} BgDblueBalanceStruct2;
+ /* 0x14 */ ActorFunc update;
+ /* 0x18 */ ActorFunc draw;
+} BgDblueBalanceTypeInfo; // size = 0x1C
-BgDblueBalanceStruct2 D_80B83A20[] = {
+BgDblueBalanceTypeInfo sTypeInfo[] = {
{
- object_dblue_object_DL_00B8F8,
- &object_dblue_object_Colheader_00BC08,
+ gGreatBayTempleObjectSeesawShaftDL,
+ &gGreatBayTempleObjectSeesawShaftCol,
0x10,
360.0f,
300.0f,
@@ -63,8 +63,8 @@ BgDblueBalanceStruct2 D_80B83A20[] = {
BgDblueBalance_Draw,
},
{
- object_dblue_object_DL_00BF48,
- &object_dblue_object_Colheader_00C180,
+ gGreatBayTempleObjectLargeSeesawPlatformDL,
+ &gGreatBayTempleObjectLargeSeesawPlatformCol,
0x10,
210.0f,
190.0f,
@@ -72,8 +72,8 @@ BgDblueBalanceStruct2 D_80B83A20[] = {
BgDblueBalance_Draw,
},
{
- object_dblue_object_DL_00C4B8,
- &object_dblue_object_Colheader_00C700,
+ gGreatBayTempleObjectSmallSeesawPlatformDL,
+ &gGreatBayTempleObjectSmallSeesawPlatformCol,
0x10,
180.0f,
180.0f,
@@ -81,8 +81,8 @@ BgDblueBalanceStruct2 D_80B83A20[] = {
BgDblueBalance_Draw,
},
{
- object_dblue_object_DL_001E68,
- &object_dblue_object_Colheader_002E78,
+ gGreatBayTempleObjectWaterwheelWithPlatformsDL,
+ &gGreatBayTempleObjectWaterwheelWithPlatformsCol,
0x30,
1500.0f,
1500.0f,
@@ -311,19 +311,19 @@ void BgDblueBalance_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- this->dyna.actor.flags = D_80B83A20[sp2C].unk_08;
- this->dyna.actor.uncullZoneScale = D_80B83A20[sp2C].unk_0C;
- this->dyna.actor.uncullZoneDownward = D_80B83A20[sp2C].unk_10;
- this->dyna.actor.update = D_80B83A20[sp2C].unk_14;
- this->dyna.actor.draw = D_80B83A20[sp2C].unk_18;
+ this->dyna.actor.flags = sTypeInfo[sp2C].unk_08;
+ this->dyna.actor.uncullZoneScale = sTypeInfo[sp2C].unk_0C;
+ this->dyna.actor.uncullZoneDownward = sTypeInfo[sp2C].unk_10;
+ this->dyna.actor.update = sTypeInfo[sp2C].update;
+ this->dyna.actor.draw = sTypeInfo[sp2C].draw;
DynaPolyActor_Init(&this->dyna, 1);
- DynaPolyActor_LoadMesh(play, &this->dyna, D_80B83A20[sp2C].unk_04);
+ DynaPolyActor_LoadMesh(play, &this->dyna, sTypeInfo[sp2C].colHeader);
if (sp2C == 3) {
- D_80B83C70 = Lib_SegmentedToVirtual(object_dblue_object_Matanimheader_00CE00);
+ D_80B83C70 = Lib_SegmentedToVirtual(gGreatBayTempleObjectWaterwheelSplashTexAnim);
} else if (sp2C == 0) {
- D_80B83C74 = Lib_SegmentedToVirtual(object_dblue_object_Matanimheader_00D250);
+ D_80B83C74 = Lib_SegmentedToVirtual(gGreatBayTempleObjectSeesawSplashTexAnim);
}
if (sp2C == 0) {
@@ -645,11 +645,11 @@ void func_80B83518(Actor* thisx, PlayState* play) {
void BgDblueBalance_Draw(Actor* thisx, PlayState* play) {
s32 pad;
BgDblueBalance* this = THIS;
- BgDblueBalanceStruct2* ptr2 = &D_80B83A20[BGDBLUEBALANCE_GET_300(&this->dyna.actor)];
+ BgDblueBalanceTypeInfo* ptr2 = &sTypeInfo[BGDBLUEBALANCE_GET_300(&this->dyna.actor)];
BgDblueBalance* sp38;
Gfx* gfx;
- Gfx_DrawDListOpa(play, ptr2->unk_00);
+ Gfx_DrawDListOpa(play, ptr2->opaDList);
if (!(BGDBLUEBALANCE_GET_300(&this->dyna.actor)) && (this->unk_160 != NULL)) {
AnimatedMat_Draw(play, D_80B83C74);
@@ -666,7 +666,7 @@ void BgDblueBalance_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetEnvColor(gfx++, 0, 0, 0, this->unk_183);
- gSPDisplayList(gfx++, object_dblue_object_DL_00D110);
+ gSPDisplayList(gfx++, gGreatBayTempleObjectSeesawSplashDL);
POLY_XLU_DISP = gfx;
@@ -681,7 +681,7 @@ void func_80B83758(Actor* thisx, PlayState* play) {
Gfx* gfx;
s32 i;
BgDblueBalanceStruct* ptr;
- BgDblueBalanceStruct2* ptr2;
+ BgDblueBalanceTypeInfo* ptr2;
s32 temp;
if (this->unk_178 != 0) {
@@ -695,8 +695,8 @@ void func_80B83758(Actor* thisx, PlayState* play) {
}
if (this->dyna.actor.flags & ACTOR_FLAG_40) {
- ptr2 = &D_80B83A20[BGDBLUEBALANCE_GET_300(&this->dyna.actor)];
- Gfx_DrawDListOpa(play, ptr2->unk_00);
+ ptr2 = &sTypeInfo[BGDBLUEBALANCE_GET_300(&this->dyna.actor)];
+ Gfx_DrawDListOpa(play, ptr2->opaDList);
if (this->unk_183 != 0) {
AnimatedMat_Draw(play, D_80B83C70);
@@ -717,7 +717,7 @@ void func_80B83758(Actor* thisx, PlayState* play) {
temp = ptr->unk_0E * (f32)this->unk_183 * 0.003921569f;
gDPSetEnvColor(gfx++, 0, 0, 0, temp);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(gfx++, object_dblue_object_DL_00CD10);
+ gSPDisplayList(gfx++, gGreatBayTempleObjectWaterwheelSplashDL);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
index c42d96c0f3..53a3300d4e 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
@@ -1,7 +1,7 @@
/*
* File: z_bg_dblue_movebg.c
* Overlay: ovl_Bg_Dblue_Movebg
- * Description: Great Bay Temple - Waterwheels and push switches
+ * Description: Great Bay Temple - Waterwheels, push switches, gear shafts, and whirlpools
*/
#include "prevent_bss_reordering.h"
@@ -57,42 +57,42 @@ const ActorInit Bg_Dblue_Movebg_InitVars = {
(ActorFunc)BgDblueMovebg_Draw,
};
-Gfx* D_80A2B8AC[] = {
+static Gfx* sOpaDLists[] = {
NULL,
- object_dblue_object_DL_0069D8,
+ gGreatBayTempleObjectTwoWaySwitchDL,
NULL,
NULL,
NULL,
NULL,
- object_dblue_object_DL_004848,
- object_dblue_object_DL_0061B8,
+ gGreatBayTempleObjectGearShaftWithPlatformsDL,
+ gGreatBayTempleObjectOneWaySwitchDL,
NULL,
NULL,
NULL,
NULL,
};
-Gfx* D_80A2B8DC[] = {
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, object_dblue_object_DL_00CAA0, NULL,
+static Gfx* sXluDLists[] = {
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, gGreatBayTempleObjectWhirlpoolDL, NULL,
};
-CollisionHeader* D_80A2B90C[] = {
+static CollisionHeader* sColHeaders[] = {
NULL,
- &object_dblue_object_Colheader_006EA8,
+ &gGreatBayTempleObjectTwoWaySwitchCol,
NULL,
NULL,
NULL,
- &object_dblue_object_Colheader_00D3DC,
- &object_dblue_object_Colheader_005D28,
- &object_dblue_object_Colheader_00714C,
- &object_dblue_object_Colheader_00AED0,
- &object_dblue_object_Colheader_00AED0,
+ &gGreatBayTempleObjectUnusedCol,
+ &gGreatBayTempleObjectGearShaftWithPlatformsCol,
+ &gGreatBayTempleObjectOneWaySwitchCol,
+ &gGreatBayTempleObjectWaterwheelCol,
+ &gGreatBayTempleObjectWaterwheelCol,
NULL,
NULL,
};
-AnimatedMaterial* D_80A2B93C[] = {
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, object_dblue_object_Matanimheader_00CC18, NULL,
+static AnimatedMaterial* sTexAnims[] = {
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, gGreatBayTempleObjectWhirlpoolTexAnim, NULL,
};
s16 D_80A2B96C[] = { 0, 0x16C, -0x16C, 0 };
@@ -189,13 +189,13 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
D_80A2BBF4.unk_01 = 1;
}
- if (D_80A2B90C[this->unk_160] != NULL) {
- DynaPolyActor_LoadMesh(play, &this->dyna, D_80A2B90C[this->unk_160]);
+ if (sColHeaders[this->unk_160] != NULL) {
+ DynaPolyActor_LoadMesh(play, &this->dyna, sColHeaders[this->unk_160]);
}
- this->unk_164 = D_80A2B8AC[this->unk_160];
- this->unk_168 = D_80A2B8DC[this->unk_160];
- this->unk_16C = D_80A2B93C[this->unk_160];
+ this->opaDList = sOpaDLists[this->unk_160];
+ this->xluDList = sXluDLists[this->unk_160];
+ this->texAnim = sTexAnims[this->unk_160];
SubS_FillCutscenesList(&this->dyna.actor, this->unk_1B6, ARRAY_COUNT(this->unk_1B6));
@@ -341,9 +341,9 @@ void func_80A2A1E0(BgDblueMovebg* this, PlayState* play) {
this->dyna.actor.shape.rot.y += this->unk_1CC;
if (play->roomCtx.currRoom.num == 0) {
- this->unk_164 = object_dblue_object_DL_004848;
+ this->opaDList = gGreatBayTempleObjectGearShaftWithPlatformsDL;
} else if (play->roomCtx.currRoom.num == 8) {
- this->unk_164 = NULL;
+ this->opaDList = NULL;
}
if (play->roomCtx.currRoom.num != this->unk_170) {
@@ -678,9 +678,9 @@ void func_80A2AED0(BgDblueMovebg* this, PlayState* play) {
}
if (play->roomCtx.currRoom.num == 0) {
- this->unk_164 = object_dblue_object_DL_008778;
+ this->opaDList = gGreatBayTempleObjectWaterwheelDL;
} else if (play->roomCtx.currRoom.num == 8) {
- this->unk_164 = object_dblue_object_DL_00A528;
+ this->opaDList = gGreatBayTempleObjectWaterwheelWithFakeGearDL;
}
if (this == D_80A2BBF0) {
@@ -756,7 +756,7 @@ void func_80A2B308(Actor* thisx, PlayState* play) {
func_8012C28C(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, this->unk_164);
+ gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -774,34 +774,34 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
if ((this->unk_160 == 9) || (this->unk_160 == 8) || (this->dyna.actor.flags & ACTOR_FLAG_40)) {
- if (this->unk_16C != NULL) {
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(this->unk_16C));
+ if (this->texAnim != NULL) {
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(this->texAnim));
}
- if ((this->unk_164 != 0) || (this->unk_160 == 6)) {
+ if ((this->opaDList != NULL) || (this->unk_160 == 6)) {
gfx2 = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
gSPMatrix(&gfx2[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (this->unk_160 == 6) {
- gSPDisplayList(&gfx2[1], object_dblue_object_DL_0052B8);
- if (this->unk_164 != 0) {
- gSPDisplayList(&gfx2[2], this->unk_164);
+ gSPDisplayList(&gfx2[1], gGreatBayTempleObjectGearShaftDL);
+ if (this->opaDList != NULL) {
+ gSPDisplayList(&gfx2[2], this->opaDList);
POLY_OPA_DISP = &gfx2[3];
} else {
POLY_OPA_DISP = &gfx2[2];
}
} else {
- gSPDisplayList(&gfx2[1], this->unk_164);
+ gSPDisplayList(&gfx2[1], this->opaDList);
POLY_OPA_DISP = &gfx2[2];
}
}
- if (this->unk_168 != NULL) {
+ if (this->xluDList != NULL) {
gfx = func_8012C2B4(POLY_XLU_DISP);
gSPMatrix(&gfx[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(&gfx[1], this->unk_168);
+ gSPDisplayList(&gfx[1], this->xluDList);
POLY_XLU_DISP = &gfx[2];
}
@@ -812,7 +812,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
CLOSE_DISPS(play->state.gfxCtx);
if ((this->unk_160 == 8) && (this->unk_172 & 0x20)) {
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_dblue_object_Matanimheader_00CE00));
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gGreatBayTempleObjectWaterwheelSplashTexAnim));
OPEN_DISPS(play->state.gfxCtx);
@@ -844,7 +844,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetEnvColor(gfx++, 255, 255, 255, this->unk_1D8[j][i]);
- gSPDisplayList(gfx++, object_dblue_object_DL_00CD10);
+ gSPDisplayList(gfx++, gGreatBayTempleObjectWaterwheelSplashDL);
Matrix_Pop();
}
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h
index 83fb1df621..6b5351c2c2 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h
+++ b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h
@@ -17,9 +17,9 @@ typedef struct BgDblueMovebg {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ BgDblueMovebgActionFunc actionFunc;
/* 0x160 */ s32 unk_160;
- /* 0x164 */ Gfx* unk_164;
- /* 0x168 */ Gfx* unk_168;
- /* 0x16C */ TexturePtr unk_16C;
+ /* 0x164 */ Gfx* opaDList;
+ /* 0x168 */ Gfx* xluDList;
+ /* 0x16C */ AnimatedMaterial* texAnim;
/* 0x170 */ s8 unk_170;
/* 0x171 */ s8 unk_171;
/* 0x172 */ u16 unk_172;
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
index 6f914a4752..a2fa18103d 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
@@ -1,7 +1,7 @@
/*
* File: z_bg_dblue_waterfall.c
* Overlay: ovl_Bg_Dblue_Waterfall
- * Description: Great Bay Temple - Freezable Geyser
+ * Description: Great Bay Temple - Freezable Waterfall
*/
#include "z_bg_dblue_waterfall.h"
@@ -344,7 +344,7 @@ void BgDblueWaterfall_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
Collider_UpdateCylinder(&this->actor, &this->collider);
- this->unk_190 = Lib_SegmentedToVirtual(object_dblue_object_Matanimheader_00B448);
+ this->unk_190 = Lib_SegmentedToVirtual(gGreatBayTempleObjectWaterfallTexAnim);
Actor_SetFocus(&this->actor, -100.0f);
func_80B84568(this, play);
@@ -600,30 +600,30 @@ void BgDblueWaterfall_Draw(Actor* thisx, PlayState* play) {
AnimatedMat_Draw(play, this->unk_190);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x8A, 255, 255, 255, sp38);
- gSPDisplayList(POLY_XLU_DISP++, object_dblue_object_DL_00B280);
+ gSPDisplayList(POLY_XLU_DISP++, gGreatBayTempleObjectWaterfallDL);
}
if (this->unk_19F > 0) {
if (this->unk_19F < 255) {
gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x9B, 255, 255, 255, this->unk_19F);
- gSPDisplayList(POLY_XLU_DISP++, object_dblue_object_DL_003358);
+ gSPDisplayList(POLY_XLU_DISP++, gGreatBayTempleObjectIceStalactiteDL);
} else {
func_8012C28C(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x9B, 255, 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++, object_dblue_object_DL_003358);
+ gSPDisplayList(POLY_OPA_DISP++, gGreatBayTempleObjectIceStalactiteDL);
}
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 255, 255, 255, this->unk_19F);
- gSPDisplayList(POLY_XLU_DISP++, object_dblue_object_DL_003250);
+ gSPDisplayList(POLY_XLU_DISP++, gGreatBayTempleObjectIceStalactiteRimDL);
}
if (this->unk_1A0 > 0) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 255, 255, 255, this->unk_1A0);
- gSPDisplayList(POLY_XLU_DISP++, object_dblue_object_DL_003770);
+ gSPDisplayList(POLY_XLU_DISP++, gGreatBayTempleObjectFrozenWaterfallDL);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
index 99fd93627b..902b527763 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
@@ -7,6 +7,7 @@
#include "z_bg_ikana_rotaryroom.h"
#include "overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.h"
#include "overlays/actors/ovl_En_Torch2/z_en_torch2.h"
+#include "overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h"
#include "objects/object_ikana_obj/object_ikana_obj.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -679,7 +680,8 @@ void func_80B81570(BgIkanaRotaryroom* this, PlayState* play) {
sp70.y += this->dyna.actor.world.pos.y;
sp70.z += this->dyna.actor.world.pos.z;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, sp70.x, sp70.y, sp70.z, 0, 0, 0, 1);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, sp70.x, sp70.y, sp70.z, 0, 0, 0,
+ ENWATEREFFECT_TYPE_FALLING_ROCK_SPAWNER);
}
Matrix_Pop();
diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
index cc29867e50..0bc385cb7b 100644
--- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
+++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
@@ -153,7 +153,7 @@ void func_80C0ABA8(BgIkninSusceil* this, PlayState* play) {
this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
if (this->dyna.actor.world.pos.y <= this->dyna.actor.home.pos.y) {
func_80C0A86C(this, play, 4, 14, 1);
- Flags_UnsetSwitch(play, GET_SUSCEIL_SWITCHFLAG(this));
+ Flags_UnsetSwitch(play, SUSCEIL_GET_SWITCHFLAG(&this->dyna.actor));
Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND);
func_80C0AC74(this);
} else {
@@ -167,7 +167,7 @@ void func_80C0AC74(BgIkninSusceil* this) {
}
void func_80C0AC90(BgIkninSusceil* this, PlayState* play) {
- if (Flags_GetSwitch(play, GET_SUSCEIL_SWITCHFLAG(this))) {
+ if (Flags_GetSwitch(play, SUSCEIL_GET_SWITCHFLAG(&this->dyna.actor))) {
func_80C0ACD4(this);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h
index f5f5b384f8..8fc32bd068 100644
--- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h
+++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define GET_SUSCEIL_SWITCHFLAG(this) (((this)->dyna.actor.params) & 0x7F)
+#define SUSCEIL_GET_SWITCHFLAG(thisx) (((thisx)->params) & 0x7F)
struct BgIkninSusceil;
diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
index e9c9cc544c..54833f38e9 100644
--- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
+++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
@@ -216,7 +216,7 @@ void func_80953F9C(BgIngate* this, PlayState* play) {
if (ActorCutscene_GetCurrentIndex() != -1) {
Camera_ChangeSetting(mainCam, CAM_SET_NORMAL0);
player->stateFlags1 |= 0x20;
- play->actorCtx.unk5 &= ~0x4;
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_2;
} else {
Camera_ChangeSetting(mainCam, CAM_SET_BOAT_CRUISE);
player->stateFlags1 &= ~0x20;
diff --git a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
index bd641bf4c1..68c432c5f4 100644
--- a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
+++ b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
@@ -27,9 +27,9 @@ const ActorInit Bg_Inibs_Movebg_InitVars = {
(ActorFunc)BgInibsMovebg_Draw,
};
-Gfx* D_80B96560[] = { object_inibs_object_DL_0062D8, object_inibs_object_DL_001DC0 };
-Gfx* D_80B96568[] = { object_inibs_object_DL_006140, object_inibs_object_DL_001C10 };
-AnimatedMaterial* D_80B96570[] = { object_inibs_object_Matanimheader_006858, object_inibs_object_Matanimheader_002598 };
+Gfx* sOpaDLists[] = { gTwinmoldArenaNormalModeSandDL, gTwinmoldArenaGiantModeSandDL };
+Gfx* sXluDLists[] = { gTwinmoldArenaNormalModeCenterPlatformDL, gTwinmoldArenaGiantModeCenterPlatformDL };
+AnimatedMaterial* sSandTexAnims[] = { gTwinmoldArenaNormalModeSandTexAnim, gTwinmoldArenaGiantModeSandTexAnim };
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_STOP),
@@ -41,9 +41,9 @@ void BgInibsMovebg_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 1);
- this->unk_15C = D_80B96560[BGINIBSMOVEBG_GET_F(thisx)];
- this->unk_160 = D_80B96568[BGINIBSMOVEBG_GET_F(thisx)];
- this->unk_164 = D_80B96570[BGINIBSMOVEBG_GET_F(thisx)];
+ this->opaDList = sOpaDLists[BG_INIBS_MOVEBG_GET_MODE(thisx)];
+ this->xluDList = sXluDLists[BG_INIBS_MOVEBG_GET_MODE(thisx)];
+ this->sandTexAnim = sSandTexAnims[BG_INIBS_MOVEBG_GET_MODE(thisx)];
}
void BgInibsMovebg_Destroy(Actor* thisx, PlayState* play) {
@@ -54,23 +54,22 @@ void BgInibsMovebg_Destroy(Actor* thisx, PlayState* play) {
void BgInibsMovebg_Draw(Actor* thisx, PlayState* play) {
BgInibsMovebg* this = THIS;
+ AnimatedMaterial* sandTexAnim;
+ Gfx* opaDList;
+ Gfx* xluDList;
- AnimatedMaterial* animMat;
- Gfx* dl1;
- Gfx* dl2;
-
- animMat = this->unk_164;
- if (animMat != NULL) {
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(this->unk_164));
+ sandTexAnim = this->sandTexAnim;
+ if (sandTexAnim != NULL) {
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(this->sandTexAnim));
}
- dl1 = this->unk_15C;
- if (dl1 != NULL) {
- Gfx_DrawDListOpa(play, this->unk_15C);
+ opaDList = this->opaDList;
+ if (opaDList != NULL) {
+ Gfx_DrawDListOpa(play, this->opaDList);
}
- dl2 = this->unk_160;
- if (dl2 != NULL) {
- Gfx_DrawDListXlu(play, this->unk_160);
+ xluDList = this->xluDList;
+ if (xluDList != NULL) {
+ Gfx_DrawDListXlu(play, this->xluDList);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h
index 92494a35f9..629a5cd036 100644
--- a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h
+++ b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h
@@ -5,13 +5,13 @@
struct BgInibsMovebg;
-#define BGINIBSMOVEBG_GET_F(thisx) ((u16)((thisx)->params) & 0xF)
+#define BG_INIBS_MOVEBG_GET_MODE(thisx) ((u16)((thisx)->params) & 0xF)
typedef struct BgInibsMovebg {
/* 0x000 */ DynaPolyActor dyna;
- /* 0x15C */ Gfx* unk_15C;
- /* 0x160 */ Gfx* unk_160;
- /* 0x164 */ AnimatedMaterial* unk_164;
+ /* 0x15C */ Gfx* opaDList;
+ /* 0x160 */ Gfx* xluDList;
+ /* 0x164 */ AnimatedMaterial* sandTexAnim;
} BgInibsMovebg; // size = 0x168
extern const ActorInit Bg_Inibs_Movebg_InitVars;
diff --git a/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c
index 60ca416bcc..86854cbe8d 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c
+++ b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c
@@ -145,7 +145,7 @@ void BgKin2Bombwall_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
bombwallCollider = &this->collider;
Collider_InitCylinder(play, bombwallCollider);
- if (Flags_GetSwitch(play, BG_KIN2_BOMBWALL_SWITCH_FLAG(this))) {
+ if (Flags_GetSwitch(play, BG_KIN2_BOMBWALL_SWITCH_FLAG(&this->dyna.actor))) {
Actor_MarkForDeath(&this->dyna.actor);
} else {
DynaPolyActor_LoadMesh(play, &this->dyna, &gOceanSpiderHouseBombableWallCol);
@@ -184,7 +184,7 @@ void BgKin2Bombwall_SetupPlayCutscene(BgKin2Bombwall* this) {
void BgKin2Bombwall_PlayCutscene(BgKin2Bombwall* this, PlayState* play) {
if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
- Flags_SetSwitch(play, BG_KIN2_BOMBWALL_SWITCH_FLAG(this));
+ Flags_SetSwitch(play, BG_KIN2_BOMBWALL_SWITCH_FLAG(&this->dyna.actor));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 60, NA_SE_EV_WALL_BROKEN);
func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
diff --git a/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.h b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.h
index 86b0afab3d..17370427a2 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.h
+++ b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.h
@@ -1,7 +1,7 @@
#ifndef Z_BG_KIN2_BOMBWALL_H
#define Z_BG_KIN2_BOMBWALL_H
-#define BG_KIN2_BOMBWALL_SWITCH_FLAG(thisx) (thisx->dyna.actor.params & 0x7F)
+#define BG_KIN2_BOMBWALL_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#include "global.h"
diff --git a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
index 43e5e94f10..36226212e6 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
@@ -49,8 +49,8 @@ void BgLadder_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- this->switchFlag = GET_BGLADDER_SWITCHFLAG(thisx);
- thisx->params = GET_BGLADDER_SIZE(thisx);
+ this->switchFlag = BGLADDER_GET_SWITCHFLAG(thisx);
+ thisx->params = BGLADDER_GET_SIZE(thisx);
DynaPolyActor_Init(&this->dyna, 0);
size = thisx->params;
diff --git a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
index e5fe13b749..c53a803521 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
@@ -3,8 +3,8 @@
#include "global.h"
-#define GET_BGLADDER_SIZE(actor) ((actor)->params & 0xFF)
-#define GET_BGLADDER_SWITCHFLAG(actor) (((actor)->params >> 8) & 0xFF)
+#define BGLADDER_GET_SIZE(thisx) ((thisx)->params & 0xFF)
+#define BGLADDER_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0xFF)
struct BgLadder;
@@ -18,10 +18,10 @@ typedef struct BgLadder {
} BgLadder; // size = 0x164
typedef enum {
- LADDER_SIZE_12RUNG,
- LADDER_SIZE_16RUNG,
- LADDER_SIZE_20RUNG,
- LADDER_SIZE_24RUNG,
+ /* 0 */ LADDER_SIZE_12RUNG,
+ /* 1 */ LADDER_SIZE_16RUNG,
+ /* 2 */ LADDER_SIZE_20RUNG,
+ /* 3 */ LADDER_SIZE_24RUNG,
} BgLadderSize;
extern const ActorInit Bg_Ladder_InitVars;
diff --git a/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c
index 6ac4ac8666..72a38b21b3 100644
--- a/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c
+++ b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c
@@ -43,7 +43,7 @@ void BgLotus_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 1);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_lotus_Colheader_000A20);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gLilyPadCol);
this->dyna.actor.floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &thisx->floorPoly, &bgId,
&this->dyna.actor, &this->dyna.actor.world.pos);
this->timer2 = 96;
@@ -171,5 +171,5 @@ void BgLotus_Update(Actor* thisx, PlayState* play) {
}
void BgLotus_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_lotus_DL_000040);
+ Gfx_DrawDListOpa(play, gLilyPadDL);
}
diff --git a/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.c b/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.c
index 8ac6c61c39..f2f5ef8703 100644
--- a/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.c
+++ b/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.c
@@ -27,17 +27,25 @@ static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_STOP),
};
-Gfx* D_80AF0120[] = { object_market_obj_DL_01F050, object_market_obj_DL_018DA0 };
-Gfx* D_80AF0128[] = { object_market_obj_DL_01EF10, object_market_obj_DL_018C60 };
+Gfx* sMarketDLs[] = {
+ gWestClockTownMarketDayDL,
+ gWestClockTownMarketNightDL,
+};
+
+Gfx* sBankAdvertisementsAndDoorDLs[] = {
+ gWestClockTownMarketBankAdvertisementsAndDoorDayDL,
+ gWestClockTownMarketBankAdvertisementsAndDoorNightDL,
+};
void BgMarketStep_Init(Actor* thisx, PlayState* play) {
BgMarketStep* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
}
-void BgMarketStep_Draw(Actor* thisx, PlayState* play) {
- s32 index = thisx->params & 1;
- Gfx_DrawDListOpa(play, D_80AF0120[index]);
- Gfx_DrawDListOpa(play, D_80AF0128[index]);
+void BgMarketStep_Draw(Actor* thisx, PlayState* play) {
+ s32 timeOfDay = BG_MARKET_STEP_GET_TIME_OF_DAY(thisx);
+
+ Gfx_DrawDListOpa(play, sMarketDLs[timeOfDay]);
+ Gfx_DrawDListOpa(play, sBankAdvertisementsAndDoorDLs[timeOfDay]);
}
diff --git a/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.h b/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.h
index aa98c0aa1b..c779b227ac 100644
--- a/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.h
+++ b/src/overlays/actors/ovl_Bg_Market_Step/z_bg_market_step.h
@@ -3,6 +3,8 @@
#include "global.h"
+#define BG_MARKET_STEP_GET_TIME_OF_DAY(thisx) ((thisx)->params & 1)
+
struct BgMarketStep;
typedef struct BgMarketStep {
diff --git a/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
index 3ed675c5fe..9808e68a40 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
@@ -571,13 +571,13 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
} else {
this->unk_1D20 = 1;
}
- XREG(41) = KREG(14) + 20;
+ R_MAGIC_CONSUME_TIMER_GIANTS_MASK = KREG(14) + 20;
this->unk_01AC = 1.0f;
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_TANRON5, 0.0f, 1000.0f, 0.0f, 0, 0, 0, 0);
} else if (this->actor.params == TWINMOLD_TAIL) {
this->actor.update = Boss02_Tail_Update;
this->actor.draw = NULL;
- this->actor.hintId = 0x2E;
+ this->actor.hintId = TATL_HINT_ID_TWINMOLD;
} else {
if (this->actor.params != TWINMOLD_BLUE) {
this->actor.params = TWINMOLD_RED;
diff --git a/src/overlays/actors/ovl_Boss_03/z_boss_03.c b/src/overlays/actors/ovl_Boss_03/z_boss_03.c
index 75378de784..1c14d63bb1 100644
--- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c
+++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c
@@ -53,6 +53,7 @@
* - Seaweed
*/
+#include "prevent_bss_reordering.h"
#include "z_boss_03.h"
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
#include "overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h"
@@ -724,7 +725,7 @@ void Boss03_ChasePlayer(Boss03* this, PlayState* play) {
if (sp43 != 0) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, player->actor.world.pos.x, this->waterHeight,
- player->actor.world.pos.z, 0, 0, 0x78, ENWATEREFFECT_309);
+ player->actor.world.pos.z, 0, 0, 0x78, ENWATEREFFECT_TYPE_GYORG_RIPPLES);
Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_KONB_SINK_OLD);
}
@@ -1055,7 +1056,7 @@ void Boss03_Charge(Boss03* this, PlayState* play) {
play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
func_800BC848(&this->actor, play, 20, 15);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, 0.0f, this->waterHeight, 0.0f, 0, 0, 0x96,
- ENWATEREFFECT_30C);
+ ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE);
// Player is above water && Player is standing on ground
if ((this->waterHeight < player->actor.world.pos.y) && (player->actor.bgCheckFlags & 1)) {
@@ -1528,7 +1529,7 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
if ((this->workTimer[WORK_TIMER_UNK0_C] == 0) && ((this->waterHeight - 100.0f) < this->actor.world.pos.y)) {
this->workTimer[WORK_TIMER_UNK0_C] = Rand_ZeroFloat(15.0f) + 15.0f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, this->actor.world.pos.x, this->waterHeight,
- this->actor.world.pos.z, 0, 0, 0x78, ENWATEREFFECT_309);
+ this->actor.world.pos.z, 0, 0, 0x78, ENWATEREFFECT_TYPE_GYORG_RIPPLES);
if (this->actionFunc == Boss03_DeathCutscene) {
if ((D_809E9840 % 2) != 0) {
@@ -1762,7 +1763,7 @@ void Boss03_SetupStunned(Boss03* this, PlayState* play) {
}
void Boss03_Stunned(Boss03* this, PlayState* play) {
- this->actor.hintId = 0x29;
+ this->actor.hintId = TATL_HINT_ID_GYORG_STUNNED;
if (this->unk_240 >= 16) {
Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_COMMON_WEAKENED - SFX_FLAG);
@@ -1955,7 +1956,7 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
s16 j;
f32 yRot;
- this->actor.hintId = 0x28;
+ this->actor.hintId = TATL_HINT_ID_GYORG;
if (!D_809E9842 && (player->actor.world.pos.y < (PLATFORM_HEIGHT + 5.0f))) {
D_809E9842 = true;
@@ -2012,7 +2013,7 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
}
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, this->actor.world.pos.x, this->waterHeight,
- this->actor.world.pos.z, 0, 0, 0x78, ENWATEREFFECT_309);
+ this->actor.world.pos.z, 0, 0, 0x78, ENWATEREFFECT_TYPE_GYORG_RIPPLES);
this->unk_280 = 27;
this->unk_284 = this->actor.world.pos.x;
@@ -2428,7 +2429,7 @@ void Boss03_DrawEffects(PlayState* play) {
if (!flag) {
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gDust1Tex));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
@@ -2462,7 +2463,7 @@ void Boss03_DrawEffects(PlayState* play) {
if (!flag) {
func_8012C448(gfxCtx);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gDust1Tex));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
diff --git a/src/overlays/actors/ovl_Boss_04/z_boss_04.c b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
index 3524efa53c..e7d96d205e 100644
--- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c
+++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
@@ -163,7 +163,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) {
this->actor.params = 0x64;
Actor_SetScale(&this->actor, 0.1f);
this->actor.targetMode = 5;
- this->actor.hintId = 0x19;
+ this->actor.hintId = TATL_HINT_ID_WART;
this->actor.colChkInfo.health = 20;
this->actor.colChkInfo.damageTable = &sDamageTable;
this->unk_700 = 1.0f;
diff --git a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
index 64c42a1cec..12da392887 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
@@ -649,7 +649,7 @@ void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (this->actor.params == DEMO_KANKYO_TYPE_GIANTS) {
- gSPDisplayList(POLY_XLU_DISP++, object_bubble_DL_001000);
+ gSPDisplayList(POLY_XLU_DISP++, gBubbleDL);
} else {
gSPDisplayList(POLY_XLU_DISP++, gLightOrbVtxDL);
}
diff --git a/src/overlays/actors/ovl_Dm_An/z_dm_an.c b/src/overlays/actors/ovl_Dm_An/z_dm_an.c
index 64b6a7a98a..4cd28f454c 100644
--- a/src/overlays/actors/ovl_Dm_An/z_dm_an.c
+++ b/src/overlays/actors/ovl_Dm_An/z_dm_an.c
@@ -160,7 +160,7 @@ Actor* func_80C1C8E8(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || NULL) {
+ if (tempActor == NULL || false) {
foundActor = NULL;
break;
}
diff --git a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
index 8c1aebc964..900530f4d8 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
@@ -80,11 +80,11 @@ void DmChar01_Init(Actor* thisx, PlayState* play) {
this->unk_348 = 255.0f;
for (i = 0; i < ARRAY_COUNT(this->unk_1AC); i++) {
- this->unk_1AC[i] = ovl_dm_char01_Vtx_1BE0[i].v.ob[1] * 409.6f;
+ this->unk_1AC[i] = gWoodfallSceneryDynamicPoisonWaterVtx[i].v.ob[1] * 409.6f;
}
DynaPolyActor_Init(&this->dyna, 0);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_mtoride_Colheader_009E4C);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gWoodfallSceneryPoisonWaterDamageCol);
this->unk_34D = true;
if (gSaveContext.sceneSetupIndex == 1) {
@@ -114,7 +114,7 @@ void DmChar01_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.y += 0x8000;
this->dyna.actor.shape.rot.y += 0x8000;
DynaPolyActor_Init(&this->dyna, 0);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_mtoride_Colheader_010C3C);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gWoodfallSceneryTempleCol);
this->unk_34D = true;
this->unk_348 = 200.0f;
this->actionFunc = func_80AA8F2C;
@@ -131,7 +131,7 @@ void DmChar01_Init(Actor* thisx, PlayState* play) {
Actor_Spawn(&play->actorCtx, play, ACTOR_OBJ_ETCETERA, 5.0f, 202.0f, 294.0f, 0, 0, 0,
DEKU_FLOWER_PARAMS(DEKU_FLOWER_TYPE_PINK_WITH_INITIAL_BOUNCE));
DynaPolyActor_Init(&this->dyna, 0);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_mtoride_Colheader_00FE5C);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gWoodfallSceneryTempleRampAndPlatformCol);
this->unk_34D = true;
if (!(gSaveContext.save.weekEventReg[20] & 2)) {
@@ -252,8 +252,9 @@ void func_80AA892C(DmChar01* this, PlayState* play) {
this->unk_34C = 0;
}
- for (i = 0; i < ARRAY_COUNT(ovl_dm_char01_Vtx_1BE0); i++) {
- s32 temp_s2 = sqrtf(SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[2]) + SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[0]));
+ for (i = 0; i < ARRAY_COUNT(gWoodfallSceneryDynamicPoisonWaterVtx); i++) {
+ s32 temp_s2 = sqrtf(SQ((f32)gWoodfallSceneryDynamicPoisonWaterVtx[i].v.ob[2]) +
+ SQ((f32)gWoodfallSceneryDynamicPoisonWaterVtx[i].v.ob[0]));
f32 cos = Math_CosS((temp_s2 / 1892.0f) * 0x4000);
f32 temp_f20 = (1.0f - (ABS_ALT(temp_s2 - D_80AAAE22) / 1892.0f)) * D_80AAAE20 * cos;
@@ -265,7 +266,7 @@ void func_80AA892C(DmChar01* this, PlayState* play) {
temp_f20 += temp_f18;
this->unk_1AC[i] += 1600;
- ovl_dm_char01_Vtx_1BE0[i].v.ob[1] = temp_f20;
+ gWoodfallSceneryDynamicPoisonWaterVtx[i].v.ob[1] = temp_f20;
}
}
@@ -297,8 +298,9 @@ void func_80AA8C28(DmChar01* this, PlayState* play) {
break;
}
- for (i = 0; i < ARRAY_COUNT(ovl_dm_char01_Vtx_1BE0); i++) {
- s32 temp_s2 = sqrtf(SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[2]) + SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[0]));
+ for (i = 0; i < ARRAY_COUNT(gWoodfallSceneryDynamicPoisonWaterVtx); i++) {
+ s32 temp_s2 = sqrtf(SQ((f32)gWoodfallSceneryDynamicPoisonWaterVtx[i].v.ob[2]) +
+ SQ((f32)gWoodfallSceneryDynamicPoisonWaterVtx[i].v.ob[0]));
f32 cos = Math_CosS((temp_s2 / 1892.0f) * 0x4000);
f32 temp_f20 = (1.0f - (ABS_ALT(temp_s2 - D_80AAAE22) / 1892.0f)) * D_80AAAE20 * cos;
@@ -310,7 +312,7 @@ void func_80AA8C28(DmChar01* this, PlayState* play) {
temp_f20 += temp_f18;
this->unk_1AC[i] += 1600;
- ovl_dm_char01_Vtx_1BE0[i].v.ob[1] = temp_f20;
+ gWoodfallSceneryDynamicPoisonWaterVtx[i].v.ob[1] = temp_f20;
}
Math_SmoothStepToF(&this->unk_348, 0.0f, 0.02f, 0.6f, 0.4f);
@@ -404,18 +406,18 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
case DMCHAR01_0:
switch (this->unk_34C) {
case 0:
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00AA50));
- Gfx_DrawDListOpa(play, object_mtoride_DL_00A8F8);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryPoisonWaterTexAnim));
+ Gfx_DrawDListOpa(play, gWoodfallSceneryPoisonWaterDL);
break;
case 1:
if (gSaveContext.sceneSetupIndex == 1) {
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_0110B8));
- Gfx_DrawDListOpa(play, object_mtoride_DL_010FD8);
- Gfx_DrawDListXlu(play, object_mtoride_DL_010EF0);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryPurifiedWaterTexAnim));
+ Gfx_DrawDListOpa(play, gWoodfallSceneryFloorDL);
+ Gfx_DrawDListXlu(play, gWoodfallSceneryPurifiedWaterDL);
Matrix_Translate(0.0f, 10.0f, 0.0f, MTXMODE_APPLY);
}
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_009D70));
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryDynamicPoisonWaterTexAnim));
OPEN_DISPS(play->state.gfxCtx);
@@ -426,10 +428,11 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x96, 255, 255, 255, 255);
- gSPSegment(POLY_OPA_DISP++, 0x0B, Lib_SegmentedToVirtual(ovl_dm_char01_Vtx_1BE0));
+ gSPSegment(POLY_OPA_DISP++, 0x0B,
+ Lib_SegmentedToVirtual(gWoodfallSceneryDynamicPoisonWaterVtx));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, object_mtoride_DL_009928);
+ gSPDisplayList(POLY_OPA_DISP++, gWoodfallSceneryDynamicPoisonWaterDL);
} else {
func_8012C2DC(play->state.gfxCtx);
@@ -437,19 +440,20 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)this->unk_348);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x96, 255, 255, 255, (u8)this->unk_348);
- gSPSegment(POLY_XLU_DISP++, 0x0B, Lib_SegmentedToVirtual(ovl_dm_char01_Vtx_1BE0));
+ gSPSegment(POLY_XLU_DISP++, 0x0B,
+ Lib_SegmentedToVirtual(gWoodfallSceneryDynamicPoisonWaterVtx));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_mtoride_DL_009928);
+ gSPDisplayList(POLY_XLU_DISP++, gWoodfallSceneryDynamicPoisonWaterDL);
}
CLOSE_DISPS(play->state.gfxCtx);
break;
case 2:
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_0110B8));
- Gfx_DrawDListOpa(play, object_mtoride_DL_010FD8);
- Gfx_DrawDListXlu(play, object_mtoride_DL_010EF0);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryPurifiedWaterTexAnim));
+ Gfx_DrawDListOpa(play, gWoodfallSceneryFloorDL);
+ Gfx_DrawDListXlu(play, gWoodfallSceneryPurifiedWaterDL);
break;
}
break;
@@ -457,23 +461,23 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
case DMCHAR01_1:
switch (this->unk_34C) {
case 0:
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00A5C0));
- Gfx_DrawDListOpa(play, object_mtoride_DL_00A398);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryPoisonWallsTexAnim));
+ Gfx_DrawDListOpa(play, gWoodfallSceneryPoisonWallsDL);
break;
case 1:
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00B1A0));
- Gfx_DrawDListOpa(play, object_mtoride_DL_00AF98);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryPurifiedWallsTexAnim));
+ Gfx_DrawDListOpa(play, gWoodfallSceneryPurifiedWallsDL);
break;
}
break;
case DMCHAR01_2:
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00FE90));
- Gfx_DrawDListOpa(play, object_mtoride_DL_00DF18);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryTempleTexAnim));
+ Gfx_DrawDListOpa(play, gWoodfallSceneryTempleDL);
if ((this->unk_34C != 0) && ((u8)this->unk_348 != 0)) {
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00F768));
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(&gWoodfallSceneryWaterFlowingOverTempleTexAnim));
OPEN_DISPS(play->state.gfxCtx);
@@ -484,7 +488,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, (u8)this->unk_348);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_mtoride_DL_00F3C0);
+ gSPDisplayList(POLY_XLU_DISP++, gWoodfallSceneryWaterFlowingOverTempleDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -536,12 +540,12 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
}
}
- Gfx_DrawDListXlu(play, object_mtoride_DL_00DE50);
+ Gfx_DrawDListXlu(play, gWoodfallSceneryTempleEntrancesDL);
break;
case DMCHAR01_3:
if (thisx->world.pos.y > -120.0f) {
- Gfx_DrawDListOpa(play, object_mtoride_DL_00FAE8);
+ Gfx_DrawDListOpa(play, gWoodfallSceneryTempleRampAndPlatformDL);
}
break;
}
diff --git a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.h b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.h
index 39f09856a7..8d35283476 100644
--- a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.h
+++ b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.h
@@ -25,9 +25,9 @@ typedef enum {
typedef struct DmChar07 {
/* 0x000 */ DynaPolyActor dyna;
- /* 0x15C */ char pad15C[0x14C];
+ /* 0x15C */ UNK_TYPE1 pad15C[0x14C];
/* 0x2A8 */ DmChar07ActionFunc actionFunc;
- /* 0x2AC */ char pad2AC[0xD];
+ /* 0x2AC */ UNK_TYPE1 pad2AC[0xD];
/* 0x2B9 */ u8 spotlightFlags;
/* 0x2BA */ u8 isStage;
} DmChar07; // size = 0x2BC
diff --git a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
index 2b9c62e190..b51f4df8dd 100644
--- a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
+++ b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
@@ -1,7 +1,7 @@
/*
* File: z_dm_gm.c
* Overlay: ovl_Dm_Gm
- * Description: Anju (cutscene) (duplicate of Dm_An?)
+ * Description: Complete duplicate of Dm_An
*/
#include "z_dm_gm.h"
diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
index 1417d8094c..120c9ea49c 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -1089,7 +1089,7 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
} else if ((play->sceneNum == SCENE_00KEIKOKU) && (gSaveContext.sceneSetupIndex == 0)) {
- if (!(play->actorCtx.unk5 & 2)) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
Actor_MarkForDeath(&this->actor);
}
@@ -1632,7 +1632,7 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
this->alpha = 0;
this->fadeOutState = SK_FADE_OUT_STATE_NONE;
gSaveContext.save.weekEventReg[12] |= 4;
- if (!(play->actorCtx.unk5 & 2)) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
Actor_MarkForDeath(&this->actor);
} else {
this->shouldDraw = false;
@@ -1813,9 +1813,10 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
// This code is responsible for making in-game time pass while using the telescope in the Astral Observatory.
// Skull Kid is always loaded in the scene, even if he isn't visible, hence why time always passes.
- if ((play->actorCtx.unk5 & 2) && (play->msgCtx.msgMode != 0) && (play->msgCtx.currentTextId == 0x5E6) &&
- !FrameAdvance_IsEnabled(&play->state) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
- (ActorCutscene_GetCurrentIndex() == -1) && (play->csCtx.state == 0)) {
+ if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != 0) &&
+ (play->msgCtx.currentTextId == 0x5E6) && !FrameAdvance_IsEnabled(&play->state) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (ActorCutscene_GetCurrentIndex() == -1) &&
+ (play->csCtx.state == 0)) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)REG(15);
if (REG(15) != 0) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed);
diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
index 0c99056b41..b5f75efaac 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
@@ -74,11 +74,11 @@ typedef struct {
} ShutterInfo; // size = 0xC
ShutterInfo D_808A21B0[] = {
- { object_bdoor_DL_0000C0, NULL, 130, 12, 50, 15 },
+ { gBossDoorDL, NULL, 130, 12, 50, 15 },
{ gameplay_keep_DL_077990, gameplay_keep_DL_078A80, 130, 12, 20, 15 },
{ object_numa_obj_DL_007150, gameplay_keep_DL_078A80, 130, 12, 20, 15 },
{ object_hakugin_obj_DL_000128, gameplay_keep_DL_078A80, 130, 12, 20, 15 },
- { object_dblue_object_DL_017D00, gameplay_keep_DL_078A80, 130, 12, 20, 15 },
+ { gGreatBayTempleObjectDoorDL, gameplay_keep_DL_078A80, 130, 12, 20, 15 },
{ object_ikana_obj_DL_014A40, gameplay_keep_DL_078A80, 130, 12, 20, 15 },
{ object_redead_obj_DL_0001A0, gameplay_keep_DL_078A80, 130, 12, 20, 15 },
{ object_ikninside_obj_DL_004440, object_ikninside_obj_DL_005260, 130, 0, 20, 15 },
@@ -129,8 +129,7 @@ Vec3f D_808A22C4 = { 120.0f, 0.0f, 0.0f };
Vec3f D_808A22D0 = { -90.0f, 0.0f, 0.0f };
TexturePtr D_808A22DC[] = {
- object_bdoor_Tex_006BA0, object_bdoor_Tex_005BA0, object_bdoor_Tex_0005C0,
- object_bdoor_Tex_004BA0, object_bdoor_Tex_003BA0,
+ gBossDoorDefaultTex, gBossDoorWoodfallTex, gBossDoorSnowheadTex, gBossDoorGreatBayTex, gBossDoorStoneTowerTex,
};
void DoorShutter_SetupAction(DoorShutter* this, DoorShutterActionFunc actionFunc) {
diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
index 78861d55c9..e0d5653e26 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
@@ -10,7 +10,7 @@ typedef void (*DoorShutterActionFunc)(struct DoorShutter*, PlayState*);
#define DOORSHUTTER_GET_1F(thisx) ((thisx)->params & 0x1F)
#define DOORSHUTTER_GET_7F(thisx) ((thisx)->params & 0x7F)
#define DOORSHUTTER_GET_380(thisx) (((thisx)->params >> 7) & 7)
-#define DOORSHUTTER_GET_FC00(thisx) (((u16)(thisx)->params >> 0xA))
+#define DOORSHUTTER_GET_FC00(thisx) ((u16)(thisx)->params >> 0xA)
typedef struct DoorShutter {
/* 0x0000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.c b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.c
index 43c7143c30..f43f7c58cd 100644
--- a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.c
+++ b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.c
@@ -16,10 +16,6 @@
#define THIS ((DoorSpiral*)thisx)
-#define GET_ORIENTATION_PARAM(this) ((((Actor*)(this))->params >> 7) & 0x1)
-#define GET_UNK145_PARAM(this) ((((Actor*)(this))->params >> 8) & 0x3)
-#define GET_TRANSITION_ID_PARAM(this) ((u16)((Actor*)(this))->params >> 10)
-
typedef enum {
/* 0 */ SPIRAL_OVERWORLD, // does not display anything as there is not a DL in GAMEPLAY_KEEP for it
/* 1 */ SPIRAL_DUNGEON,
@@ -179,7 +175,7 @@ static InitChainEntry sInitChain[] = {
void DoorSpiral_Init(Actor* thisx, PlayState* play) {
DoorSpiral* this = THIS;
s32 pad;
- s32 transition = GET_TRANSITION_ID_PARAM(thisx);
+ s32 transition = DOORSPIRAL_GET_TRANSITION_ID(thisx);
s8 objBankId;
if (this->actor.room != play->doorCtx.transitionActorList[transition].sides[0].room) {
@@ -188,8 +184,8 @@ void DoorSpiral_Init(Actor* thisx, PlayState* play) {
}
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->unk145 = GET_UNK145_PARAM(thisx); // set but never used
- this->orientation = GET_ORIENTATION_PARAM(thisx);
+ this->unk145 = DOORSPIRAL_GET_UNK145(thisx); // set but never used
+ this->orientation = DOORSPIRAL_GET_ORIENTATION(thisx);
this->objectType = DoorSpiral_GetObjectType(play);
objBankId = Object_GetIndex(&play->objectCtx, sSpiralObjectInfo[this->objectType].objectBankId);
this->bankIndex = objBankId;
@@ -204,7 +200,7 @@ void DoorSpiral_Init(Actor* thisx, PlayState* play) {
}
void DoorSpiral_Destroy(Actor* thisx, PlayState* play) {
- s32 transition = GET_TRANSITION_ID_PARAM(thisx);
+ s32 transition = DOORSPIRAL_GET_TRANSITION_ID(thisx);
play->doorCtx.transitionActorList[transition].id *= -1;
}
@@ -281,7 +277,7 @@ void DoorSpiral_Wait(DoorSpiral* this, PlayState* play) {
player->doorType = 4;
player->doorDirection = this->orientation;
player->doorActor = &this->actor;
- transition = GET_TRANSITION_ID_PARAM(this);
+ transition = DOORSPIRAL_GET_TRANSITION_ID(&this->actor);
player->doorNext = ((u16)play->doorCtx.transitionActorList[transition].params) >> 10;
func_80122F28(player);
diff --git a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
index 207765e383..f12b79d84e 100644
--- a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
+++ b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
@@ -5,6 +5,10 @@
struct DoorSpiral;
+#define DOORSPIRAL_GET_ORIENTATION(thisx) (((thisx)->params >> 7) & 0x1)
+#define DOORSPIRAL_GET_UNK145(thisx) (((thisx)->params >> 8) & 0x3)
+#define DOORSPIRAL_GET_TRANSITION_ID(thisx) ((u16)(thisx)->params >> 10)
+
typedef void (*DoorSpiralActionFunc)(struct DoorSpiral*, PlayState*);
typedef struct DoorSpiral {
diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
index 30c004a2ec..2bf0d716e6 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -1,7 +1,7 @@
/*
* File: z_door_warp1.c
* Overlay: ovl_Door_Warp1
- * Description: Blue Warp
+ * Description: Blue warp portal and crystal, and the Majora's Mask-shaped boss warp platform
*/
#include "z_door_warp1.h"
@@ -152,7 +152,7 @@ void DoorWarp1_Init(Actor* thisx, PlayState* play) {
case ENDOORWARP1_FF_5:
this->unk_1D3 = 1;
DynaPolyActor_Init(&this->dyna, 0);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_warp1_Colheader_008BD4);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gWarpBossWarpPlatformCol);
func_808B8C48(this, play);
break;
@@ -210,8 +210,8 @@ void func_808B8924(DoorWarp1* this, PlayState* play) {
}
void func_808B8A7C(DoorWarp1* this, PlayState* play) {
- SkelAnime_Init(play, &this->skelAnime, &object_warp1_Skel_002CA8, &object_warp1_Anim_001374, NULL, NULL, 0);
- Animation_ChangeImpl(&this->skelAnime, &object_warp1_Anim_001374, 1.0f, 1.0f, 1.0f, 2, 40.0f, 1);
+ SkelAnime_Init(play, &this->skelAnime, &gWarpCrystalSkel, &gWarpCrystalAnim, NULL, NULL, 0);
+ Animation_ChangeImpl(&this->skelAnime, &gWarpCrystalAnim, 1.0f, 1.0f, 1.0f, 2, 40.0f, 1);
this->unk_1C4 = 0;
this->unk_1C6 = -140;
this->unk_1C8 = -80;
@@ -622,9 +622,8 @@ void func_808B9FD0(DoorWarp1* this, PlayState* play) {
ActorCutscene_Start(play->playerActorCsIds[9], NULL);
AudioSfx_PlaySfx(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
- Animation_ChangeImpl(&this->skelAnime, &object_warp1_Anim_001374, 1.0f,
- Animation_GetLastFrame(&object_warp1_Anim_001374.common),
- Animation_GetLastFrame(&object_warp1_Anim_001374.common), 2, 40.0f, 1);
+ Animation_ChangeImpl(&this->skelAnime, &gWarpCrystalAnim, 1.0f, Animation_GetLastFrame(&gWarpCrystalAnim),
+ Animation_GetLastFrame(&gWarpCrystalAnim), 2, 40.0f, 1);
this->unk_1CA = 50;
D_808BC004 = player2->actor.world.pos.y;
DoorWarp1_SetupAction(this, func_808BA550);
@@ -992,7 +991,7 @@ void func_808BAE9C(DoorWarp1* this, PlayState* play) {
MTXMODE_APPLY);
gSPSegment(POLY_XLU_DISP++, 0x09, Matrix_NewMtx(play->state.gfxCtx));
- gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_0001A0);
+ gSPDisplayList(POLY_XLU_DISP++, gWarpPortalDL);
Matrix_Pop();
@@ -1010,14 +1009,14 @@ void func_808BAE9C(DoorWarp1* this, PlayState* play) {
MTXMODE_APPLY);
gSPSegment(POLY_XLU_DISP++, 0x09, Matrix_NewMtx(play->state.gfxCtx));
- gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_0001A0);
+ gSPDisplayList(POLY_XLU_DISP++, gWarpPortalDL);
}
CLOSE_DISPS(play->state.gfxCtx);
}
void func_808BB4C4(DoorWarp1* this, PlayState* play) {
- Gfx_DrawDListOpa(play, object_warp1_DL_0076C0);
+ Gfx_DrawDListOpa(play, gWarpBossWarpPlatformDL);
}
void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
@@ -1035,8 +1034,8 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
Matrix_Translate(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + this->unk_1A4,
this->dyna.actor.world.pos.z, MTXMODE_NEW);
Matrix_Scale(4.0f, this->unk_1AC, 4.0f, MTXMODE_APPLY);
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_warp1_Matanimheader_0044D8));
- Gfx_DrawDListXlu(play, object_warp1_DL_003230);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gWarpBossWarpActivationBeamTexAnim));
+ Gfx_DrawDListXlu(play, gWarpBossWarpActivationBeamDL);
return;
}
@@ -1054,7 +1053,7 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
MTXMODE_NEW);
Matrix_RotateYS(this->dyna.actor.world.rot.y, MTXMODE_APPLY);
Matrix_Scale(1.0f, this->unk_1A8, 1.0f, MTXMODE_APPLY);
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_warp1_Matanimheader_0057D8));
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gWarpBossWarpLightShaftsTexAnim));
OPEN_DISPS(play->state.gfxCtx);
@@ -1063,13 +1062,13 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
gDPSetEnvColor(POLY_XLU_DISP++, sp64[sp60].r, sp64[sp60].g, sp64[sp60].b, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_004690);
+ gSPDisplayList(POLY_XLU_DISP++, gWarpBossWarpLightShaftsDL);
CLOSE_DISPS(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_warp1_Matanimheader_007238));
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gWarpBossWarpGlowTexAnim));
Matrix_Translate(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z,
MTXMODE_NEW);
Matrix_RotateYS(this->dyna.actor.world.rot.y, MTXMODE_APPLY);
@@ -1080,7 +1079,7 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
gDPSetEnvColor(POLY_XLU_DISP++, sp64[sp60].r, sp64[sp60].g, sp64[sp60].b, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->unk_203);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_0058C8);
+ gSPDisplayList(POLY_XLU_DISP++, gWarpBossWarpGlowDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Am/z_en_am.c b/src/overlays/actors/ovl_En_Am/z_en_am.c
index 5b1b488cb9..eda01c2545 100644
--- a/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -128,7 +128,7 @@ static CollisionCheckInfoInit sColChkInfoInit = { 1, 23, 98, MASS_HEAVY };
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 14, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 19, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_ARMOS, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -4000, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
index c1cb316143..88ddcd0f80 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.c
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
@@ -128,7 +128,7 @@ void EnAni_Init(Actor* thisx, PlayState* play) {
this->treeReachTimer = 0;
this->blinkFunc = EnAni_DefaultBlink;
- if (GET_ANI_TYPE(thisx) == ANI_TYPE_TREE_HANGING) {
+ if (ANI_GET_TYPE(thisx) == ANI_TYPE_TREE_HANGING) {
Animation_Change(&this->skelAnime, &gAniTreeHangingAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gAniTreeHangingAnim), ANIMMODE_ONCE, 0.0f);
this->actionFunc = EnAni_HangInTree;
diff --git a/src/overlays/actors/ovl_En_Ani/z_en_ani.h b/src/overlays/actors/ovl_En_Ani/z_en_ani.h
index 52e60fc317..fcced964bd 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.h
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.h
@@ -33,6 +33,6 @@ enum EnAniType {
/* 1 */ ANI_TYPE_TREE_HANGING = 1,
};
-#define GET_ANI_TYPE(thisx) (thisx->params & 0xFF)
+#define ANI_GET_TYPE(thisx) ((thisx)->params & 0xFF)
#endif // Z_EN_ANI_H
diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
index 46d42a8173..8fd78fb51e 100644
--- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
+++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
@@ -139,7 +139,7 @@ void EnArrow_Destroy(Actor* thisx, PlayState* play) {
}
if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6) && (this->actor.child == NULL)) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
}
@@ -162,13 +162,13 @@ void func_8088A594(EnArrow* this, PlayState* play) {
this->bubble.unk_148++;
if (this->bubble.unk_148 > 20) {
this->actionFunc = func_8088ACE0;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
}
} else {
if ((this->actor.params != ENARROW_8) && (player->unk_D57 == 0)) {
if (this->actor.params == ENARROW_7) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
Actor_MarkForDeath(&this->actor);
return;
@@ -202,7 +202,7 @@ void func_8088A594(EnArrow* this, PlayState* play) {
this->bubble.unk_144 = CLAMP_MIN(this->bubble.unk_144, 3.5f);
func_8088A514(this);
this->unk_260 = 99;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
} else if (this->actor.params >= ENARROW_6) {
if ((this->actor.params == ENARROW_8) && (this->actor.world.rot.x < 0)) {
Actor_SetScale(&this->actor, 0.009f);
@@ -310,7 +310,7 @@ void func_8088AA98(EnArrow* this, PlayState* play) {
return;
}
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
}
}
@@ -389,11 +389,12 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
if (sp50 && (this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4)) {
sp7C = this->collider.base.at;
- if ((sp7C->update != NULL) && !(this->collider.base.atFlags & AT_BOUNCED) && (sp7C->flags & 0x4000)) {
+ if ((sp7C->update != NULL) && !(this->collider.base.atFlags & AT_BOUNCED) &&
+ (sp7C->flags & ACTOR_FLAG_4000)) {
this->unk_264 = sp7C;
func_8088A894(this, play);
Math_Vec3f_Diff(&sp7C->world.pos, &this->actor.world.pos, &this->unk_268);
- sp7C->flags |= 0x8000;
+ sp7C->flags |= ACTOR_FLAG_8000;
this->collider.base.atFlags &= ~AT_HIT;
this->actor.speedXZ *= 0.5f;
this->actor.velocity.y *= 0.5f;
diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.c b/src/overlays/actors/ovl_En_Az/z_en_az.c
index c025a6f777..7fe52d8391 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.c
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.c
@@ -5,28 +5,93 @@
*/
#include "z_en_az.h"
+#include "objects/object_az/object_az.h"
+#include "overlays/actors/ovl_En_Twig/z_en_twig.h"
+#include "overlays/actors/ovl_En_Fish/z_en_fish.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_80000000)
#define THIS ((EnAz*)thisx)
+typedef struct {
+ /* 0x0 */ s16 unk_0;
+ /* 0x4 */ f32 unk_4;
+} struct_80A98F94; // size = 0x8
+
void EnAz_Init(Actor* thisx, PlayState* play);
void EnAz_Destroy(Actor* thisx, PlayState* play);
void EnAz_Update(Actor* thisx, PlayState* play);
void EnAz_Draw(Actor* thisx, PlayState* play);
+void func_80A982E0(PlayState* play, ActorPathing* actorPathing);
+void func_80A98414(EnAz* this, PlayState* play);
+s32 func_80A98DA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
+void func_80A98E48(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx);
+void func_80A98EFC(EnAz* this, PlayState* play, u16 textId, s32 arg3, s32 arg4);
+void func_80A98F94(struct_80A98F94* yData, f32 frame, f32* yInterp);
+
+void func_80A95C5C(EnAz* this, PlayState* play);
void func_80A95CEC(EnAz* this, PlayState* play);
+
+void func_80A95DA0(EnAz* this, PlayState* play);
void func_80A95E88(EnAz* this, PlayState* play);
+
+void func_80A95F94(EnAz* this, PlayState* play);
void func_80A95FE8(EnAz* this, PlayState* play);
+
+void func_80A979DC(EnAz* this, PlayState* play);
void func_80A979F4(EnAz* this, PlayState* play);
+
+void func_80A97A28(EnAz* this, PlayState* play);
void func_80A97A40(EnAz* this, PlayState* play);
+
+void func_80A97A9C(EnAz* this, PlayState* play);
void func_80A97AB4(EnAz* this, PlayState* play);
+
+void func_80A97C0C(EnAz* this, PlayState* play);
void func_80A97C24(EnAz* this, PlayState* play);
void func_80A97C4C(EnAz* this, PlayState* play);
+
+void func_80A97D5C(EnAz* this, PlayState* play);
void func_80A97E48(EnAz* this, PlayState* play);
+
+void func_80A97EAC(EnAz* this, PlayState* play);
void func_80A97F9C(EnAz* this, PlayState* play);
-#if 0
+typedef enum {
+ /* 0 */ BEAVER_ANIM_IDLE,
+ /* 1 */ BEAVER_ANIM_WALK,
+ /* 2 */ BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
+ /* 3 */ BEAVER_ANIM_SWIM_WITH_RAISED_TAIL, // Unused
+ /* 4 */ BEAVER_ANIM_TALK,
+ /* 5 */ BEAVER_ANIM_TALK_WAVE_ARMS,
+ /* 6 */ BEAVER_ANIM_LAUGH_RIGHT,
+ /* 7 */ BEAVER_ANIM_LAUGH_LEFT,
+ /* 8 */ BEAVER_ANIM_SWIM,
+ /* 9 */ BEAVER_ANIM_TALK_TO_LEFT,
+ /* 10 */ BEAVER_ANIM_TALK_TO_RIGHT,
+ /* 11 */ BEAVER_ANIM_BOW,
+ /* 12 */ BEAVER_ANIM_IDLE_FACE_LEFT,
+ /* 13 */ BEAVER_ANIM_IDLE_FACE_RIGHT,
+} BeaverAnimation;
+
+static AnimationSpeedInfo sAnimationInfo[] = {
+ { &gBeaverIdleAnim, 1.0f, ANIMMODE_LOOP, -10.0f },
+ { &gBeaverWalkAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverSwimWithSpinningTail, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverSwimWithRaisedTail, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverTalkAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverTalkWaveArmsAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverLaughRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverLaughLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverSwimAnim, 2.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverTalkToLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverTalkToRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverBowAnim, 1.0f, ANIMMODE_ONCE, -5.0f },
+ { &gBeaverIdleFaceLeftAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &gBeaverIdleFaceRightAnim, 1.0f, ANIMMODE_LOOP, -5.0f },
+};
+
const ActorInit En_Az_InitVars = {
ACTOR_EN_AZ,
ACTORCAT_NPC,
@@ -39,108 +104,1823 @@ const ActorInit En_Az_InitVars = {
(ActorFunc)EnAz_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80A99110 = {
- { COLTYPE_HIT0, AT_NONE, AC_ON | AC_TYPE_PLAYER | AC_TYPE_ENEMY, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_HIT0,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER | AC_TYPE_ENEMY,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK1,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 18, 46, 0, { 0, 0, 0 } },
};
-#endif
+static EnAz* D_80A9913C = NULL;
-extern ColliderCylinderInit D_80A99110;
+Vec3f D_80A99E80; // path point?
+f32 D_80A99E8C; // player distance to path point?
+f32 D_80A99E90[2]; // unused?
-extern UNK_TYPE D_0600C94C;
-extern UNK_TYPE D_0601ABF0;
+void func_80A94A30(EnAz* this) {
+ this->actor.velocity.y += this->actor.gravity;
+ if (this->actor.velocity.y < this->actor.terminalVelocity) {
+ this->actor.velocity.y = this->actor.terminalVelocity;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94A30.s")
+void func_80A94A64(EnAz* this) {
+ func_80A94A30(this);
+ Actor_UpdatePos(&this->actor);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94A64.s")
+s32 func_80A94A90(PlayState* play, ActorPathing* actorPathing) {
+ func_80A94A64((EnAz*)actorPathing->actor);
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94A90.s")
+void func_80A94AB8(EnAz* this, PlayState* play, s32 spawnIndex) {
+ play->nextEntrance = Entrance_CreateFromSpawn(spawnIndex);
+ gSaveContext.nextCutsceneIndex = 0;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94AB8.s")
+void func_80A94B20(PlayState* play) {
+ Actor* ring = NULL;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94B20.s")
+ do {
+ ring = SubS_FindActor(play, ring, ACTORCAT_MISC, ACTOR_EN_TWIG);
+ if (ring != NULL) {
+ if (RACERING_GET_PARAM_F(ring) == 1) {
+ Actor_MarkForDeath(ring);
+ }
+ ring = ring->next;
+ }
+ } while (ring != NULL);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94B98.s")
+s32 func_80A94B98(EnAz* this, PlayState* play) {
+ EnTwig* ring;
+ s32 ret = false;
+ Actor* misc = NULL;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Init.s")
+ do {
+ if (1) {}
+ ring = (EnTwig*)SubS_FindActor(play, misc, ACTORCAT_MISC, ACTOR_EN_TWIG);
+ if ((ring != NULL) && (RACERING_GET_PARAM_F(&ring->dyna.actor) == 1) && !(ring->unk_16C & 1)) {
+ ret = true;
+ break;
+ }
+ misc = ring->dyna.actor.next;
+ } while (misc != NULL);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Destroy.s")
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A954AC.s")
+static InitChainEntry sInitChain[3] = {
+ ICHAIN_F32(uncullZoneScale, 80, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 80, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95534.s")
+void EnAz_Init(Actor* thisx, PlayState* play2) {
+ static s16 D_80A9914C[] = { 1, 0, 3, 2, 5, 4, -1 };
+ static s16 D_80A9915C[] = { 0, 1, 0, 1, 0, 1, 1 };
+ EnAz* this = THIS;
+ PlayState* play = play2;
+ s16 sp4E;
+ s32 phi_v1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A9565C.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ this->unk_374 = 0;
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ this->actor.targetMode = 1;
+ switch (BEAVER_GET_PARAM_F00(thisx)) {
+ case 0:
+ phi_v1 = (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) &&
+ (gSaveContext.save.weekEventReg[93] & 1);
+ phi_v1 = !phi_v1;
+ break;
+ case 2:
+ phi_v1 = (gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) ||
+ !(gSaveContext.save.weekEventReg[24] & 4);
+ break;
+ case 4:
+ phi_v1 = gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 2);
+ break;
+ case 1:
+ phi_v1 = (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) &&
+ (gSaveContext.save.weekEventReg[93] & 1);
+ phi_v1 = !phi_v1;
+ break;
+ case 3:
+ phi_v1 = (gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) ||
+ (gSaveContext.save.weekEventReg[24] & 4);
+ break;
+ case 5:
+ phi_v1 = gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 2);
+ break;
+ case 6:
+ phi_v1 = (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) &&
+ !(gSaveContext.save.weekEventReg[93] & 1);
+ phi_v1 = !phi_v1;
+ break;
+ default:
+ phi_v1 = true;
+ break;
+ }
+ if (phi_v1) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95730.s")
+ this->unk_2F8 = D_80A9915C[BEAVER_GET_PARAM_F00(thisx)];
+ if (BEAVER_GET_PARAM_F00(thisx) >= 0) {
+ sp4E = D_80A9914C[BEAVER_GET_PARAM_F00(thisx)];
+ } else {
+ sp4E = -1;
+ }
+ if (this->unk_2F8 == 0) {
+ this->unk_374 |= 2;
+ }
+ SubS_FillCutscenesList(&this->actor, this->unk_3D0, ARRAY_COUNT(this->unk_3D0));
+ if (D_80A9913C == NULL) {
+ D_80A9913C = THIS;
+ this->unk_374 |= 1;
+ }
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
+ if (this->unk_374 & 2) {
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBeaverOlderBrotherSkel, &gBeaverWalkAnim, this->jointTable,
+ this->morphTable, BEAVER_OLDER_BROTHER_LIMB_MAX);
+ Actor_SetScale(&this->actor, 0.012f);
+ } else {
+ SkelAnime_InitFlex(play, &this->skelAnime, &gBeaverYoungerBrotherSkel, &gBeaverWalkAnim, this->jointTable,
+ this->morphTable, BEAVER_YOUNGER_BROTHER_LIMB_MAX);
+ }
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ if (this->unk_374 & 2) {
+ this->collider.dim.radius *= 1.2f;
+ this->collider.dim.height *= 1.2f;
+ this->collider.dim.yShift *= 1.2f;
+ }
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 5);
+ if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 22.0f)) {
+ this->unk_374 |= 0x100;
+ this->unk_376 |= 0x100;
+ }
+ Animation_Change(&this->skelAnime, sAnimationInfo[BEAVER_ANIM_IDLE].animation, 1.0f,
+ Animation_GetLastFrame(sAnimationInfo[BEAVER_ANIM_IDLE].animation) * Rand_ZeroOne(),
+ Animation_GetLastFrame(sAnimationInfo[BEAVER_ANIM_IDLE].animation),
+ sAnimationInfo[BEAVER_ANIM_IDLE].mode, sAnimationInfo[BEAVER_ANIM_IDLE].morphFrames);
+ this->unk_37E = 0;
+ this->unk_380 = 0;
+ this->unk_384 = 0;
+ this->actor.gravity = -1.0f;
+ this->unk_376 = this->unk_374;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ this->skelAnime.curFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A958B0.s")
+ switch (gSaveContext.save.entrance) {
+ case ENTRANCE(WATERFALL_RAPIDS, 0):
+ if (gSaveContext.save.weekEventReg[93] & 1) {
+ this->unk_2FA = 5;
+ if (this->unk_374 & 2) {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->unk_374 |= 0x20;
+ }
+ } else {
+ this->unk_2FA = 0;
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->unk_374 |= 0x20;
+ }
+ func_80A94B20(play);
+ if (this->unk_2FA == 5) {
+ func_80A97C0C(this, play);
+ } else {
+ func_80A95DA0(this, play);
+ }
+ break;
+ case ENTRANCE(WATERFALL_RAPIDS, 3):
+ this->unk_2FA = 0;
+ if (!(this->unk_374 & 2)) {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ }
+ if (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 3)) {
+ this->unk_2FA = 0xA;
+ }
+ func_80A97C0C(this, play);
+ break;
+ case ENTRANCE(WATERFALL_RAPIDS, 1):
+ if (gSaveContext.save.weekEventReg[93] & 1) {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 8;
+ } else {
+ this->unk_2FA = 6;
+ }
+ } else {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 3;
+ } else {
+ this->unk_2FA = 1;
+ }
+ }
+ if (this->unk_374 & 1) {
+ SubS_CopyPointFromPathList(play->setupPathList, BEAVER_GET_PARAM_FF(thisx),
+ play->setupPathList[BEAVER_GET_PARAM_FF(thisx)].count - 1, &D_80A99E80);
+ }
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ if (this->unk_374 & 2) {
+ func_80A97D5C(this, play);
+ } else {
+ func_80A979DC(this, play);
+ }
+ } else if (this->unk_374 & 2) {
+ func_80A979DC(this, play);
+ } else {
+ func_80A97D5C(this, play);
+ }
+ break;
+ case ENTRANCE(WATERFALL_RAPIDS, 2):
+ if (gSaveContext.save.weekEventReg[93] & 1) {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 9;
+ } else {
+ this->unk_2FA = 7;
+ }
+ } else {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 4;
+ } else {
+ this->unk_2FA = 2;
+ }
+ }
+ if (this->unk_2FA == 2) {
+ if (!(this->unk_374 & 2)) {
+ this->unk_374 |= 0x20;
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ this->actionFunc = func_80A97C24;
+ } else {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ func_80A95C5C(this, play);
+ }
+ } else {
+ if (this->unk_374 & 2) {
+ this->unk_374 |= 0x20;
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ } else {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ }
+ this->actionFunc = func_80A97C24;
+ }
+ break;
+ }
+ if (sp4E >= 0) {
+ this->brother = NULL;
+ do {
+ this->brother = (EnAz*)SubS_FindActor(play, &this->brother->actor, ACTORCAT_NPC, ACTOR_EN_AZ);
+ if (this->brother != NULL) {
+ if (sp4E == BEAVER_GET_PARAM_F00(&this->brother->actor)) {
+ break;
+ }
+ this->brother = (EnAz*)this->brother->actor.next;
+ }
+ } while (this->brother != NULL);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95B34.s")
+void EnAz_Destroy(Actor* thisx, PlayState* play2) {
+ EnAz* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95C5C.s")
+ if (gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) {
+ gSaveContext.unk_3DD0[4] = 5;
+ }
+ Collider_DestroyCylinder(play2, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95CEC.s")
+f32 func_80A954AC(EnAz* this) {
+ ActorPathing* pathing = &this->unk_300;
+ Vec3f sp28;
+ Vec3f sp1C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95DA0.s")
+ sp28.x = pathing->curPoint.x - this->actor.world.pos.x;
+ sp28.y = pathing->curPoint.y - this->actor.world.pos.y;
+ sp28.z = pathing->curPoint.z - this->actor.world.pos.z;
+ sp1C.x = pathing->curPoint.x - pathing->prevPoint.x;
+ sp1C.y = pathing->curPoint.y - pathing->prevPoint.y;
+ sp1C.z = pathing->curPoint.z - pathing->prevPoint.z;
+ return Math3D_Parallel(&sp28, &sp1C);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95E88.s")
+s32 func_80A95534(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95F94.s")
+ this->actor.world.rot.x = 0;
+ Math_SmoothStepToS(&this->unk_39E, this->actor.world.rot.x, 2, 0x71C, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 2, 0x71C, 0);
+ Math_SmoothStepToS(&this->actor.world.rot.y, actorPathing->rotToCurPoint.y, 1, 0xE38, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, 0x71C, 0);
+ this->actor.gravity = -1.0f;
+ this->unk_36C = 1.5f;
+ if (actorPathing->curPointIndex == actorPathing->endPointIndex) {
+ if (actorPathing->distSqToCurPointXZ < this->unk_36C) {
+ this->unk_36C = actorPathing->distSqToCurPointXZ;
+ }
+ }
+ Math_SmoothStepToF(&this->actor.speedXZ, this->unk_36C, 0.8f, 2.0f, 0.0f);
+ actorPathing->moveFunc = SubS_ActorPathing_MoveWithGravity;
+ if (actorPathing->distSqToCurPointXZ <= this->actor.speedXZ) {
+ ret = true;
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95FE8.s")
+s32 func_80A9565C(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
+ f32 temp_f0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A9617C.s")
+ this->actor.gravity = -1.0f;
+ actorPathing->moveFunc = func_80A94A90;
+ this->unk_374 |= 0x2000;
+ temp_f0 = func_80A954AC(this);
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp_f0 <= 0.0f)) {
+ ret = true;
+ } else {
+ this->unk_39E = this->actor.world.rot.x =
+ Math_Atan2S(-this->actor.velocity.y, Math_CosS(-this->actor.world.rot.x) * this->actor.speedXZ);
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97114.s")
+s32 func_80A95730(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
+ f32 temp_f0;
+ f32 sp40;
+ s32 sp3C;
+ s32 sp38;
+ s32 sp34;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97274.s")
+ this->actor.gravity = 0.0f;
+ temp_f0 = func_80A954AC(this);
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp_f0 <= 0.0f)) {
+ ret = true;
+ } else {
+ sp40 = SQ(this->actor.speedXZ) / actorPathing->distSqToCurPoint;
+ sp34 = ABS(actorPathing->rotToCurPoint.x - this->actor.world.rot.x);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A973B4.s")
+ sp3C = (s32)(sp34 * sp40) + 0xAAA;
+ sp34 = ABS(actorPathing->rotToCurPoint.y - this->actor.world.rot.y);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97410.s")
+ Math_SmoothStepToS(&this->actor.world.rot.x, actorPathing->rotToCurPoint.x, 1, sp3C, 0);
+ sp38 = (s32)(sp34 * sp40) + 0xAAA;
+ Math_SmoothStepToS(&this->actor.world.rot.y, actorPathing->rotToCurPoint.y, 1, sp38, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A979DC.s")
+ Math_SmoothStepToS(&this->unk_39E, this->actor.world.rot.x, 2, sp3C, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, sp38, 0);
+ }
+ actorPathing->moveFunc = SubS_ActorPathing_MoveWithoutGravityReverse;
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A979F4.s")
+s32 func_80A958B0(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
+ f32 temp;
+ f32 phi_f0;
+ f32 temp1;
+ f32 temp2;
+ f32 sp3C;
+ s32 sp2C;
+ s32 sp28;
+ s32 sp30;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97A28.s")
+ this->actor.gravity = 0.0f;
+ temp2 = D_80A99E8C;
+ temp = D_80A99E90[this->unk_2F8];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97A40.s")
+ if (temp <= temp2) {
+ phi_f0 = (this->unk_374 & 2) ? 480.0f : 240.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97A9C.s")
+ if (this->actor.xzDistToPlayer < phi_f0) {
+ Math_SmoothStepToF(&this->unk_36C, 12.0f, 0.8f, 0.5f, 0.01f);
+ } else {
+ Math_SmoothStepToF(&this->unk_36C, 6.0f, 0.8f, 0.5f, 0.01f);
+ }
+ } else {
+ Math_SmoothStepToF(&this->unk_36C, 26.0f, 0.5f, 1.0f, 0.01f);
+ }
+ Math_SmoothStepToF(&this->actor.speedXZ, this->unk_36C, 0.8f, 2.0f, 0.0f);
+ temp1 = func_80A954AC(this);
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp1 <= 0.0f)) {
+ ret = true;
+ } else {
+ sp3C = SQ(this->actor.speedXZ) / actorPathing->distSqToCurPoint;
+ sp30 = ABS(actorPathing->rotToCurPoint.x - this->actor.world.rot.x);
+ sp2C = (s32)(sp30 * sp3C) + 0xAAA;
+ sp30 = ABS(actorPathing->rotToCurPoint.y - this->actor.world.rot.y);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97AB4.s")
+ Math_SmoothStepToS(&this->actor.world.rot.x, actorPathing->rotToCurPoint.x, 1, sp2C, 0);
+ sp28 = (s32)(sp30 * sp3C) + 0xAAA;
+ Math_SmoothStepToS(&this->actor.world.rot.y, actorPathing->rotToCurPoint.y, 1, sp28, 0);
+ Math_SmoothStepToS(&this->unk_39E, this->actor.world.rot.x, 2, sp2C, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, sp28, 0);
+ }
+ actorPathing->moveFunc = SubS_ActorPathing_MoveWithoutGravityReverse;
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97C0C.s")
+s32 func_80A95B34(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97C24.s")
+ if (this->unk_374 & 0x100) {
+ if (!(this->unk_374 & 8)) {
+ if (this->unk_374 & 2) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM, &this->animIndex);
+ } else {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
+ &this->animIndex);
+ }
+ this->unk_374 |= 8;
+ }
+ if (this->unk_2FA == 0) {
+ ret = func_80A95730(play, actorPathing);
+ } else {
+ ret = func_80A958B0(play, actorPathing);
+ }
+ } else if (this->actor.bgCheckFlags & 1) {
+ if (this->unk_374 & 8) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_WALK, &this->animIndex);
+ this->unk_374 &= ~8;
+ }
+ ret = func_80A95534(play, actorPathing);
+ } else {
+ ret = func_80A9565C(play, actorPathing);
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97C4C.s")
+void func_80A95C5C(EnAz* this, PlayState* play) {
+ this->actor.draw = NULL;
+ this->actor.world.pos.y = this->actor.home.pos.y + 120.0f;
+ this->actor.gravity = -1.0f;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.bgCheckFlags &= ~0x21;
+ this->unk_3C0 = 0;
+ this->actionFunc = func_80A95CEC;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97D5C.s")
+void func_80A95CEC(EnAz* this, PlayState* play) {
+ if (this->unk_374 & 0x8000) {
+ if (!(this->actor.bgCheckFlags & 1)) {
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ this->actor.draw = EnAz_Draw;
+ Actor_MoveWithGravity(&this->actor);
+ func_800B9010(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
+ } else {
+ if (this->actor.bgCheckFlags & 2) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
+ }
+ if (SubS_StartActorCutscene(&this->actor, 0x7C, this->unk_3D0[0], SUBS_CUTSCENE_NORMAL)) {
+ func_80A97C0C(this, play);
+ }
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97E48.s")
+void func_80A95DA0(EnAz* this, PlayState* play) {
+ ActorPathing* sp40 = &this->unk_300;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97EAC.s")
+ SubS_ActorPathing_Init(play, &this->actor.world.pos, &this->actor, sp40, play->setupPathList,
+ BEAVER_GET_PARAM_FF(&this->actor), 0, 0, 1, 1);
+ this->unk_36C = 4.0f;
+ this->actor.speedXZ = 4.0f;
+ this->actor.gravity = 0.0f;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
+ &this->animIndex);
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.bgCheckFlags &= ~0x21;
+ this->unk_374 |= 0x1000;
+ Math_Vec3f_Copy(&this->actor.world.pos, &sp40->curPoint);
+ this->actionFunc = func_80A95E88;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97F9C.s")
+void func_80A95E88(EnAz* this, PlayState* play) {
+ SubS_ActorPathing_Update(play, &this->unk_300, func_80A982E0, func_80A95B34, SubS_ActorPathing_MoveWithGravity,
+ SubS_ActorPathing_SetNextPoint);
+ if (this->actor.depthInWater > 8.0f) {
+ if (this->unk_374 & 2) {
+ if ((this->skelAnime.curFrame < this->skelAnime.playSpeed) && (this->skelAnime.curFrame >= 0.0f)) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
+ }
+ } else {
+ func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ }
+ }
+ if (!(this->unk_374 & 0x2000)) {
+ SkelAnime_Update(&this->skelAnime);
+ }
+ this->unk_374 &= ~0x2000;
+ if (this->actor.isTargeted) {
+ func_80A95F94(this, play);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A982E0.s")
+void func_80A95F94(EnAz* this, PlayState* play) {
+ func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, 0);
+ this->unk_39E = 0;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ this->actionFunc = func_80A95FE8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98414.s")
+void func_80A95FE8(EnAz* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (ActorCutscene_GetCanPlayNext(this->unk_3D0[0])) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->unk_3D0[0], &this->actor);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->unk_3D0[0]);
+ }
+ if (Actor_DistanceToPoint(&this->actor, &this->actor.home.pos) > 20.0f) {
+ func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x, 3, 0xE38, 0x38E);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0xE38, 0x38E);
+ this->actor.shape.rot.z = 0;
+ Actor_MoveWithoutGravityReverse(&this->actor);
+ } else {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ this->unk_374 &= ~0x1000;
+ this->actor.gravity = -1.0f;
+ this->actor.speedXZ = 0.0f;
+ Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 3, 0x1000, 0x100);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x1038, 0x100);
+ if (this->actor.bgCheckFlags & 1) {
+ this->actor.shape.rot.x = 0;
+ this->actor.gravity = 0.0f;
+ func_80A97C0C(this, play);
+ ActorCutscene_Stop(this->unk_3D0[0]);
+ }
+ Actor_MoveWithGravity(&this->actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Update.s")
+s32 func_80A9617C(EnAz* this, PlayState* play) {
+ s32 pad[2];
+ s32 ret = 2;
+ EnAz* brother = this->brother;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Draw.s")
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ case TEXT_STATE_5:
+ case TEXT_STATE_DONE:
+ if ((play->msgCtx.currentTextId == 0x10DD) && (this->unk_374 & 0x8000)) {
+ if (SubS_StartActorCutscene(&brother->actor, brother->unk_3D0[0], 0x7C, SUBS_CUTSCENE_NORMAL)) {
+ brother->unk_374 |= 0x8000;
+ play->msgCtx.msgMode = 0x44;
+ ret = 0;
+ }
+ } else if (Message_ShouldAdvance(play)) {
+ ret = 3;
+ switch (play->msgCtx.currentTextId) {
+ case 0x70:
+ case 0xCD:
+ gSaveContext.save.weekEventReg[24] &= (u8)~1;
+ this->actor.textId = 0x10F2;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ &brother->animIndex);
+ break;
+ case 0x10CE:
+ this->actor.textId = 0x10CF;
+ gSaveContext.save.weekEventReg[16] |= 0x40;
+ break;
+ case 0x10CF:
+ this->actor.textId = 0x10D0;
+ break;
+ case 0x10D0:
+ this->actor.textId = 0x10D1;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_WAVE_ARMS,
+ &this->animIndex);
+ break;
+ case 0x10D1:
+ this->actor.textId = 0x10D2;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ break;
+ case 0x10D2:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ this->actor.textId = 0x10D6;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo,
+ BEAVER_ANIM_TALK_WAVE_ARMS, &this->animIndex);
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10D3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ &this->animIndex);
+ }
+ break;
+ case 0x10D3:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ case 0x10D4:
+ this->actor.textId = 0x10D2;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ break;
+ case 0x10D6:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ func_80A979DC(this, play);
+ this->unk_2FA = 1;
+ ret = 0;
+ break;
+ case 0x10D7:
+ this->actor.textId = 0x10D8;
+ break;
+ case 0x10D8:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ switch (this->unk_2FA) {
+ case 2:
+ this->unk_2FA = 1;
+ break;
+ case 4:
+ this->unk_2FA = 3;
+ break;
+ case 7:
+ this->unk_2FA = 6;
+ break;
+ case 9:
+ this->unk_2FA = 8;
+ break;
+ }
+ ret = 0;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10D9;
+ }
+ break;
+ case 0x10D9:
+ if ((this->unk_2FA == 3) || (this->unk_2FA == 8)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ }
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10DA:
+ this->actor.textId = 0x10DB;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ break;
+ case 0x10DB:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ play->msgCtx.msgMode = 0x44;
+ this->unk_2FA = 1;
+ ret = 0;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10DC;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ &this->animIndex);
+ }
+ break;
+ case 0x10DC:
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ case 0x10DD:
+ func_80A98EFC(this, play, 0x10DE, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
+ this->unk_374 |= 0x8000;
+ ret = 2;
+ break;
+ case 0x10DE:
+ func_80A98EFC(this, play, 0x10DF, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10DF:
+ func_80A98EFC(this, play, 0x10E0, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
+ ret = 0;
+ break;
+ case 0x10E0:
+ func_80A98EFC(this, play, 0x10E1, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10E1:
+ func_80A98EFC(this, play, 0x10E2, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
+ ret = 0;
+ break;
+ case 0x10E2:
+ this->actor.textId = 0x10E3;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ break;
+ case 0x10E3:
+ func_80A98EFC(this, play, 0x10E4, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK);
+ ret = 0;
+ break;
+ case 0x10E4:
+ func_80A98EFC(this, play, 0x10E5, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK);
+ ret = 0;
+ break;
+ case 0x10E5:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ this->actor.textId = 0x10E8;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10E6;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_TO_LEFT,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo,
+ BEAVER_ANIM_IDLE_FACE_RIGHT, &brother->animIndex);
+ }
+ break;
+ case 0x10E6:
+ this->actor.textId = 0x10E7;
+ func_80A98EFC(this, play, 0x10E7, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10E7:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ func_80A94AB8(this, play, 0);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10E8:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ this->unk_2FA = 3;
+ ret = 0;
+ break;
+ case 0x10E9:
+ func_80A98EFC(this, play, 0x10EA, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK);
+ ret = 0;
+ break;
+ case 0x10EA:
+ func_80A98EFC(this, play, 0x10EB, BEAVER_ANIM_IDLE, BEAVER_ANIM_TALK);
+ ret = 0;
+ break;
+ case 0x10EB:
+ if (play->msgCtx.choiceIndex == 0) {
+ play->msgCtx.msgMode = 0x44;
+ func_8019F208();
+ switch (this->unk_2FA) {
+ case 4:
+ this->unk_2FA = 3;
+ break;
+ case 7:
+ this->unk_2FA = 6;
+ break;
+ case 9:
+ default:
+ this->unk_2FA = 8;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98DA4.s")
+ break;
+ }
+ ret = 0;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10EC;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_LAUGH_LEFT,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo,
+ BEAVER_ANIM_IDLE_FACE_RIGHT, &brother->animIndex);
+ }
+ break;
+ case 0x10EC:
+ func_80A98EFC(this, play, 0x10ED, -1, BEAVER_ANIM_LAUGH_RIGHT);
+ ret = 0;
+ break;
+ case 0x10ED:
+ if ((this->unk_2FA == 4) || (this->unk_2FA == 9)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ }
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10EE:
+ func_80A98EFC(this, play, 0x10EF, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10EF:
+ func_80A98EFC(this, play, 0x10F0, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
+ ret = 0;
+ break;
+ case 0x10F0:
+ func_80A98EFC(this, play, 0x10F1, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10F1:
+ gSaveContext.save.weekEventReg[93] |= 1;
+ if (gSaveContext.save.weekEventReg[23] & 0x80) {
+ this->getItemId = GI_RUPEE_RED;
+ } else {
+ this->getItemId = GI_BOTTLE;
+ gSaveContext.save.weekEventReg[23] |= 0x80;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ ret = 7;
+ break;
+ case 0x10F2:
+ case 0x1109:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10F3:
+ func_80A98EFC(this, play, 0x10F4, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10F4:
+ func_80A98EFC(this, play, 0x10F5, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
+ ret = 0;
+ break;
+ case 0x10F5:
+ func_80A98EFC(this, play, 0x10F6, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10F6:
+ func_80A98EFC(this, play, 0x10F7, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_WAVE_ARMS);
+ ret = 0;
+ break;
+ case 0x10F7:
+ this->actor.textId = 0x10F8;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ break;
+ case 0x10F8:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ if (gSaveContext.save.weekEventReg[25] & 1) {
+ this->actor.textId = 0x1107;
+ } else {
+ this->actor.textId = 0x10FA;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo,
+ BEAVER_ANIM_TALK_WAVE_ARMS, &this->animIndex);
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10F9;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ &brother->animIndex);
+ }
+ break;
+ case 0x10F9:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ case 0x10FA:
+ case 0x1107:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ this->unk_2FA = 6;
+ ret = 0;
+ break;
+ case 0x10FB:
+ func_80A98EFC(this, play, 0x10FC, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x10FC:
+ func_80A98EFC(this, play, 0x10FD, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK);
+ ret = 0;
+ break;
+ case 0x10FD:
+ this->actor.textId = 0x10FE;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ break;
+ case 0x10FE:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ if (gSaveContext.save.weekEventReg[25] & 1) {
+ this->actor.textId = 0x1108;
+ } else {
+ this->actor.textId = 0x1101;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10FF;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_TO_LEFT,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo,
+ BEAVER_ANIM_IDLE_FACE_RIGHT, &brother->animIndex);
+ }
+ break;
+ case 0x10FF:
+ func_80A98EFC(this, play, 0x1100, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x1100:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x1101:
+ case 0x1108:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ this->unk_2FA = 8;
+ ret = 0;
+ break;
+ case 0x1102:
+ func_80A98EFC(this, play, 0x1103, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x1103:
+ func_80A98EFC(this, play, 0x1104, BEAVER_ANIM_IDLE_FACE_RIGHT, BEAVER_ANIM_TALK_TO_LEFT);
+ ret = 0;
+ break;
+ case 0x1104:
+ func_80A98EFC(this, play, 0x1105, BEAVER_ANIM_IDLE_FACE_LEFT, BEAVER_ANIM_TALK_TO_RIGHT);
+ ret = 0;
+ break;
+ case 0x1105:
+ if (gSaveContext.save.weekEventReg[25] & 1) {
+ this->getItemId = GI_RUPEE_PURPLE;
+ } else {
+ this->getItemId = GI_HEART_PIECE;
+ gSaveContext.save.weekEventReg[25] |= 1;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ ret = 7;
+ break;
+ case 0x1106:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &brother->animIndex);
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10D5:
+ default:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE,
+ &this->animIndex);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ }
+ }
+ break;
+ case TEXT_STATE_NONE:
+ case TEXT_STATE_1:
+ case TEXT_STATE_CLOSING:
+ case TEXT_STATE_3:
+ break;
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98E48.s")
+void func_80A97114(EnAz* this, PlayState* play) {
+ EnAz* brother = this->brother;
+ s32 sp20 = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98EFC.s")
+ this->actor.flags &= ~ACTOR_FLAG_10000;
+ switch (this->actor.textId) {
+ case 0x10DA:
+ case 0x10DD:
+ case 0x10E9:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK, &this->animIndex);
+ break;
+ case 0x10EE:
+ case 0x10F3:
+ case 0x10FB:
+ case 0x1102:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_TO_LEFT,
+ &this->animIndex);
+ sp20 = true;
+ break;
+ case 0x10F2:
+ case 0x1106:
+ case 0x1109:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW, &this->animIndex);
+ if (brother != NULL) {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_BOW,
+ &brother->animIndex);
+ }
+ break;
+ }
+ if ((brother != NULL) && sp20) {
+ if (this->unk_374 & 2) {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE_FACE_RIGHT,
+ &brother->animIndex);
+ } else {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE_FACE_LEFT,
+ &brother->animIndex);
+ }
+ }
+ this->unk_374 &= ~0x20;
+ this->unk_378 = 2;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98F94.s")
+s32 func_80A97274(EnAz* this, PlayState* play) {
+ s32 textId;
+
+ if (this->unk_374 & 0x4000) {
+ return 0x10D7;
+ }
+ switch (this->unk_2FA) {
+ case 0:
+ default:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ if (!(gSaveContext.save.weekEventReg[16] & 0x40)) {
+ textId = 0x10CE;
+ } else {
+ textId = 0x10D4;
+ }
+ break;
+ case 2:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ gSaveContext.save.weekEventReg[24] |= 4;
+ this->unk_3C0 = 0;
+ textId = 0x10DD;
+ } else {
+ textId = 0x10DA;
+ }
+ break;
+ case 4:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ textId = 0x10EE;
+ } else {
+ textId = 0x10E9;
+ }
+ break;
+ case 5:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ textId = 0x10F3;
+ break;
+ case 7:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ gSaveContext.save.weekEventReg[24] |= 4;
+ textId = 0x10FB;
+ } else {
+ textId = 0x10E9;
+ }
+ break;
+ case 9:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ textId = 0x1102;
+ } else {
+ textId = 0x10E9;
+ }
+ break;
+ }
+ return textId;
+}
+
+s32 func_80A973B4(EnAz* this, PlayState* play) {
+ s32 ret = 0;
+
+ if (this->getItemId != GI_RUPEE_RED) {
+ if ((this->getItemId != GI_RUPEE_PURPLE) && (this->getItemId != GI_HEART_PIECE)) {
+ if (this->getItemId == GI_BOTTLE) {
+ ret = 0x10F2;
+ }
+ } else {
+ ret = 0x1106;
+ }
+ } else {
+ ret = 0x1109;
+ }
+ this->unk_374 |= 0x20;
+
+ return ret;
+}
+
+void func_80A97410(EnAz* this, PlayState* play) {
+ s16 sp56;
+ s16 sp54;
+ s32 temp_a0;
+
+ if (this->unk_378 != 0) {
+ Vec3f* thisPos = &this->actor.world.pos;
+
+ if ((this->unk_2FA == 0) && !(this->unk_374 & 2)) {
+ Math_SmoothStepToS(&this->unk_3D4, 0, 2, 0x71C, 0xA);
+ Math_SmoothStepToS(&this->unk_3D6, 0, 3, 0x71C, 0xA);
+ }
+ if (this->brother != NULL) {
+ Vec3f* broPos = &this->brother->actor.world.pos;
+
+ if (this->unk_374 & 0x40) {
+ this->actor.focus.pos.x = (thisPos->x * 0.5f) + (broPos->x * 0.5f);
+ this->actor.focus.pos.y = (thisPos->y * 0.5f) + (broPos->y * 0.5f) + 45.0f;
+ this->actor.focus.pos.z = (thisPos->z * 0.5f) + (broPos->z * 0.5f);
+ } else {
+ this->actor.focus.pos.x = (thisPos->x * 0.7f) + (broPos->x * 0.3f);
+ this->actor.focus.pos.y = (thisPos->y * 0.7f) + (broPos->y * 0.3f) + 45.0f;
+ this->actor.focus.pos.z = (thisPos->z * 0.7f) + (broPos->z * 0.3f);
+ }
+ } else {
+ this->actor.focus.pos.x = thisPos->x;
+ this->actor.focus.pos.y = thisPos->y;
+ this->actor.focus.pos.z = thisPos->z;
+ }
+ this->actor.focus.rot.x = this->actor.world.rot.x;
+ this->actor.focus.rot.y = this->actor.world.rot.y;
+ this->actor.focus.rot.z = this->actor.world.rot.z;
+ }
+ if (this->unk_378 == 2) {
+ this->unk_378 = func_80A9617C(this, play);
+ if (this->unk_378 == 0) {
+ this->actor.flags &= ~ACTOR_FLAG_10000;
+ }
+ }
+ if (this->unk_378 == 3) {
+ func_80151938(play, this->actor.textId);
+ this->unk_378 = 2;
+ } else if (this->unk_378 == 5) {
+ Message_StartTextbox(play, this->actor.textId, &this->actor);
+ this->unk_378 = 2;
+ } else {
+ if ((this->unk_378 == 6) || (this->unk_378 == 7)) {
+ if (Actor_HasParent(&this->actor, play)) {
+ this->actor.parent = NULL;
+ if (this->unk_378 == 7) {
+ this->unk_378 = 1;
+ this->unk_374 |= 0x20;
+ } else {
+ this->unk_378 = 0;
+ }
+ } else {
+ Actor_PickUp(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel);
+ }
+ }
+ if (this->unk_378 == 9) {
+ temp_a0 = Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xE38, 0x222);
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ if (temp_a0 == 0) {
+ switch (this->unk_3D2) {
+ case 0x10CE:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK,
+ &this->animIndex);
+ break;
+ case 0x10D4:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_TALK_WAVE_ARMS,
+ &this->animIndex);
+ break;
+ }
+ Message_StartTextbox(play, this->unk_3D2, &this->actor);
+ this->actor.textId = this->unk_3D2;
+ this->unk_378 = 2;
+ }
+ } else if (((this->unk_378 == 0) || (this->unk_378 == 1)) && (this->unk_374 & 0x20)) {
+ if (this->unk_378 == 1) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ func_80A97114(this, play);
+ this->unk_378 = 2;
+ } else if (func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_AP_MINUS1)) {
+ this->actor.textId = func_80A973B4(this, play);
+ }
+ } else {
+ if ((this->unk_2FA == 0) && !(this->unk_374 & 2)) {
+ Player* player = GET_PLAYER(play);
+ Vec3f sp38;
+ s16 temp_a1_2 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
+ s16 temp_v0_7;
+
+ if (ABS(temp_a1_2) < 0x1800) {
+ Math_SmoothStepToS(&this->unk_3D4, temp_a1_2, 2, 0x71C, 0);
+ } else {
+ Math_SmoothStepToS(&this->unk_3D4, 0, 2, 0x71C, 0);
+ }
+ Math_Vec3f_Copy(&sp38, &player->actor.world.pos);
+ sp38.y = player->bodyPartsPos[7].y + 3.0f;
+ temp_v0_7 = Math_Vec3f_Pitch(&this->actor.focus.pos, &sp38);
+ if (ABS(temp_v0_7) < 0x800) {
+ Math_SmoothStepToS(&this->unk_3D6, temp_v0_7, 3, 0x71C, 0);
+ } else {
+ Math_SmoothStepToS(&this->unk_3D6, 0, 3, 0x71C, 0);
+ }
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ func_80A97114(this, play);
+ this->unk_378 = 2;
+ if ((this->unk_3D2 == 0x10CE) || (this->unk_3D2 == 0x10D4)) {
+ this->unk_378 = 9;
+ }
+ } else {
+ Actor_GetScreenPos(play, &this->actor, &sp56, &sp54);
+ if ((sp56 >= 0) && (sp56 <= SCREEN_WIDTH) && (sp54 >= 0) && (sp54 <= SCREEN_HEIGHT) &&
+ func_800B8500(&this->actor, play, 120.0f, 120.0f, 0)) {
+ this->unk_3D2 = func_80A97274(this, play);
+ if ((this->unk_3D2 == 0x10CE) || (this->unk_3D2 == 0x10D4)) {
+ this->actor.textId = 0;
+ } else {
+ this->actor.textId = this->unk_3D2;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void func_80A979DC(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A979F4;
+}
+
+void func_80A979F4(EnAz* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ Actor_MoveWithGravity(&this->actor);
+}
+
+void func_80A97A28(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A97A40;
+}
+
+void func_80A97A40(EnAz* this, PlayState* play) {
+ if (SubS_StartActorCutscene(&this->actor, 0, -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ play->msgCtx.msgMode = 0;
+ play->msgCtx.msgLength = 0;
+ func_80A97A9C(this, play);
+ }
+}
+
+void func_80A97A9C(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A97AB4;
+}
+
+void func_80A97AB4(EnAz* this, PlayState* play) {
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_NONE:
+ Message_StartTextbox(play, 0x10D7, NULL);
+ break;
+ case TEXT_STATE_CHOICE:
+ case TEXT_STATE_5:
+ case TEXT_STATE_DONE:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x10D7:
+ func_80151938(play, 0x10D8);
+ break;
+ case 0x10D8:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ play->msgCtx.msgMode = 0x44;
+ func_800FD750(NA_BGM_MINI_GAME_2);
+ func_80A94AB8(this, play, 1);
+ func_80A979DC(this, play);
+ } else {
+ func_8019F230();
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ }
+ func_80151938(play, 0x10D9);
+ }
+ break;
+ case 0x10D9:
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ break;
+ }
+ }
+ case TEXT_STATE_1:
+ case TEXT_STATE_CLOSING:
+ break;
+ }
+}
+
+void func_80A97C0C(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A97C4C;
+}
+
+void func_80A97C24(EnAz* this, PlayState* play) {
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ this->actionFunc = func_80A97C4C;
+}
+
+void func_80A97C4C(EnAz* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == BEAVER_ANIM_BOW)) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_IDLE, &this->animIndex);
+ }
+ func_80A97410(this, play);
+ if ((this->unk_2FA == 1) || (this->unk_2FA == 3) || (this->unk_2FA == 6) || (this->unk_2FA == 8)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~1;
+ func_800FD750(NA_BGM_MINI_GAME_2);
+ play->nextEntrance = Entrance_CreateFromSpawn(1);
+ gSaveContext.nextCutsceneIndex = 0;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_80;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+ func_80A979DC(this, play);
+ } else {
+ Actor_MoveWithGravity(&this->actor);
+ }
+}
+
+void func_80A97D5C(EnAz* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ func_80112AFC(play);
+ gSaveContext.minigameScore = (this->unk_374 & 2) ? 25 : 20;
+ play->interfaceCtx.unk_280 = 1;
+ if ((this->unk_2FA == 1) || (this->unk_2FA == 3)) {
+ func_8010E9F0(4, 120);
+ } else if (gSaveContext.save.weekEventReg[25] & 1) {
+ func_8010E9F0(4, 100);
+ } else {
+ func_8010E9F0(4, 110);
+ }
+ this->actionFunc = func_80A97E48;
+}
+
+void func_80A97E48(EnAz* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ if (play->interfaceCtx.unk_280 >= 8) {
+ player->stateFlags1 &= ~PLAYER_STATE1_20;
+ func_80A97EAC(this, play);
+ }
+ Actor_MoveWithGravity(&this->actor);
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void func_80A97EAC(EnAz* this, PlayState* play) {
+ SubS_ActorPathing_Init(play, &this->actor.world.pos, &this->actor, &this->unk_300, play->setupPathList,
+ BEAVER_GET_PARAM_FF(&this->actor), 0, 0, 1, 0);
+ this->unk_36C = 8.0f;
+ this->actor.speedXZ = 8.0f;
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 6.0f;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, BEAVER_ANIM_SWIM_WITH_SPINNING_TAIL,
+ &this->animIndex);
+ this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.bgCheckFlags &= ~0x21;
+ this->unk_374 |= 0x1000;
+ this->unk_3C2 = 0;
+ this->unk_3C4 = 0;
+ this->actionFunc = func_80A97F9C;
+}
+
+void func_80A97F9C(EnAz* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ D_80A99E8C =
+ Math3D_XZDistanceSquared(player->actor.world.pos.x, player->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z);
+ if (Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z) >=
+ SQ(1000.0f)) {
+ this->unk_374 |= 0x1000;
+ }
+ if (!(this->unk_300.flags & ACTOR_PATHING_REACHED_END_PERMANENT)) {
+ SubS_ActorPathing_Update(play, &this->unk_300, func_80A982E0, func_80A95B34, SubS_ActorPathing_MoveWithGravity,
+ SubS_ActorPathing_SetNextPoint);
+ }
+ if (!(this->unk_374 & 0x10) &&
+ SurfaceType_IsHorseBlocked(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ this->unk_374 |= 0x10;
+ }
+ if (SurfaceType_IsHorseBlocked(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId)) {
+ if (func_80A94B98(this, play)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~1;
+ } else {
+ gSaveContext.save.weekEventReg[24] |= 1;
+ }
+ gSaveContext.unk_3DD0[4] = 5;
+ this->unk_374 &= ~0x10;
+ play->nextEntrance = Entrance_CreateFromSpawn(2);
+ gSaveContext.nextCutsceneIndex = 0;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+ this->actor.speedXZ = 0.0f;
+ func_80A979DC(this, play);
+ } else {
+ if (gSaveContext.unk_3DE0[4] == 0) {
+ gSaveContext.unk_3DD0[4] = 5;
+ this->unk_374 |= 0x4000;
+ func_80A97A28(this, play);
+ }
+ if (this->unk_374 & 0x100) {
+ if (this->actor.flags & ACTOR_FLAG_40) {
+ func_80A98414(this, play);
+ }
+ if ((DECR(this->unk_37A) == 0) && (this->actor.flags & ACTOR_FLAG_40)) {
+ EffectSsBubble_Spawn(play, &this->actor.world.pos, 0.0f, 20.0f, 20.0f, 0.35f);
+ this->unk_37A = (Rand_ZeroOne() * 70.0f) + 10.0f;
+ }
+ }
+ if (this->actor.depthInWater > 8.0f) {
+ if (this->unk_374 & 2) {
+ if ((this->skelAnime.curFrame < this->skelAnime.playSpeed) && (this->skelAnime.curFrame >= 0.0f)) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
+ }
+ } else {
+ func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ }
+ }
+ SkelAnime_Update(&this->skelAnime);
+ }
+}
+
+void func_80A982E0(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ Vec3f sp28;
+
+ actorPathing->curPoint.x = actorPathing->points[actorPathing->curPointIndex].x;
+ if (this->actor.bgCheckFlags & 1) {
+ actorPathing->curPoint.y = actorPathing->points[actorPathing->curPointIndex].y;
+ } else {
+ actorPathing->curPoint.y = actorPathing->points[actorPathing->curPointIndex].y - this->unk_3A4;
+ }
+ actorPathing->curPoint.z = actorPathing->points[actorPathing->curPointIndex].z;
+ sp28.x = actorPathing->curPoint.x - actorPathing->worldPos->x;
+ sp28.y = actorPathing->curPoint.y - actorPathing->worldPos->y;
+ sp28.z = actorPathing->curPoint.z - actorPathing->worldPos->z;
+ actorPathing->distSqToCurPointXZ = Math3D_XZLengthSquared(sp28.x, sp28.z);
+ actorPathing->distSqToCurPoint = Math3D_LengthSquared(&sp28);
+ actorPathing->rotToCurPoint.y = Math_FAtan2F(sp28.z, sp28.x);
+ actorPathing->rotToCurPoint.x = Math_FAtan2F(sqrtf(actorPathing->distSqToCurPointXZ), -sp28.y);
+ actorPathing->rotToCurPoint.z = 0;
+}
+
+void func_80A98414(EnAz* this, PlayState* play) {
+ Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
+
+ while (itemAction != NULL) {
+ if (itemAction->id == ACTOR_EN_FISH) {
+ EnFish* fish = (EnFish*)itemAction;
+
+ if ((fish->actor.params < 0) && (fish->actor.room == this->actor.room) &&
+ (Math3D_Vec3fDistSq(&this->actor.world.pos, &fish->actor.world.pos) < SQ(200.0f))) {
+ fish->unk_276 = 0x14;
+ fish->unk_274 = Actor_YawBetweenActors(&fish->actor, &this->actor);
+ }
+ }
+ itemAction = itemAction->next;
+ }
+}
+
+void EnAz_Update(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnAz* this = THIS;
+
+ this->unk_374 &= ~0x100;
+ if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 22.0f)) {
+ if (!(this->unk_376 & 0x100)) {
+ this->unk_374 |= 0x200;
+ }
+ this->unk_374 |= 0x100;
+ } else if (this->unk_376 & 0x100) {
+ this->unk_374 |= 0x400;
+ }
+ this->actionFunc(this, play);
+ Actor_SetFocus(&this->actor, 40.0f);
+ if (this->unk_374 & 0x200) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WATER);
+ }
+ if (this->unk_374 & 0x400) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_JUMP_OUT_WATER);
+ }
+ this->unk_37E++;
+ if (this->unk_37E >= 4) {
+ this->unk_37E = 0;
+ }
+ this->unk_380++;
+ if (this->unk_380 >= 3) {
+ this->unk_380 = 0;
+ }
+ this->unk_384--;
+ if (this->unk_384 < 0) {
+ this->unk_384 = 2;
+ }
+ this->unk_39C++;
+ if (this->unk_39C >= 16) {
+ this->unk_39C = 0;
+ }
+ if (!(this->unk_374 & 0x1000)) {
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ } else {
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 0x400);
+ this->unk_374 &= ~0x1000;
+ }
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+
+ this->unk_376 = this->unk_374;
+ this->unk_374 &= ~0x600;
+
+ if (GET_ACTIVE_CAM(play)->stateFlags & CAM_STATE_UNDERWATER) {
+ this->unk_374 |= 0x800;
+ } else {
+ this->unk_374 &= ~0x800;
+ }
+}
+
+static Gfx* D_80A9916C[] = {
+ gBeaverOlderBrotherTailVortex1DL, gBeaverOlderBrotherTailVortex2DL, gBeaverOlderBrotherTailVortex3DL,
+ gBeaverOlderBrotherTailVortex4DL, gBeaverOlderBrotherTailVortex5DL,
+};
+static AnimatedMaterial* D_80A99180[] = {
+ gBeaverOlderBrotherTailVortex1TexAnim, gBeaverOlderBrotherTailVortex2TexAnim, gBeaverOlderBrotherTailVortex3TexAnim,
+ gBeaverOlderBrotherTailVortex4TexAnim, gBeaverOlderBrotherTailVortex5TexAnim,
+};
+static u8 D_80A99194[] = {
+ 95, 135, 175, 215, 255,
+};
+static u8 D_80A9919C[] = {
+ 31, 45, 58, 73, 85,
+};
+static struct_80124618 D_80A991A4[5][9] = {
+ {
+ { 0, { 200, 160, 160 } },
+ { 2, { 250, 210, 210 } },
+ { 4, { 200, 160, 160 } },
+ { 6, { 250, 210, 210 } },
+ { 8, { 200, 160, 160 } },
+ { 10, { 250, 210, 210 } },
+ { 12, { 200, 160, 160 } },
+ { 14, { 250, 210, 210 } },
+ { 16, { 200, 160, 160 } },
+ },
+ {
+ { 0, { 330, 200, 200 } },
+ { 2, { 280, 150, 150 } },
+ { 4, { 330, 200, 200 } },
+ { 6, { 280, 150, 150 } },
+ { 8, { 330, 200, 200 } },
+ { 10, { 280, 150, 150 } },
+ { 12, { 330, 200, 200 } },
+ { 14, { 280, 150, 150 } },
+ { 16, { 330, 200, 200 } },
+ },
+ {
+ { 0, { 350, 170, 120 } },
+ { 2, { 400, 220, 170 } },
+ { 4, { 350, 170, 120 } },
+ { 6, { 400, 220, 170 } },
+ { 8, { 350, 170, 120 } },
+ { 10, { 400, 220, 170 } },
+ { 12, { 350, 170, 120 } },
+ { 14, { 400, 220, 170 } },
+ { 16, { 350, 170, 120 } },
+ },
+ {
+ { 0, { 480, 216, 156 } },
+ { 2, { 540, 216, 156 } },
+ { 4, { 450, 300, 216 } },
+ { 6, { 540, 216, 156 } },
+ { 8, { 450, 300, 216 } },
+ { 10, { 540, 216, 156 } },
+ { 12, { 450, 300, 216 } },
+ { 14, { 540, 300, 156 } },
+ { 16, { 450, 250, 216 } },
+ },
+ {
+ { 0, { 600, 375, 160 } },
+ { 2, { 640, 510, 200 } },
+ { 4, { 600, 375, 160 } },
+ { 6, { 640, 510, 200 } },
+ { 8, { 600, 375, 160 } },
+ { 10, { 640, 510, 200 } },
+ { 12, { 600, 375, 160 } },
+ { 14, { 640, 510, 200 } },
+ { 16, { 600, 375, 160 } },
+ },
+};
+static struct_80A98F94 D_80A9930C[5][4] = {
+ { { 0, 2100.0f }, { 7, 1500.0f }, { 16, 2100.0f }, { 0, 0.0f } },
+ { { 0, 1900.0f }, { 7, 2200.0f }, { 10, 1600.0f }, { 16, 1900.0f } },
+ { { 0, 1700.0f }, { 7, 2200.0f }, { 16, 1700.0f }, { 0, 0.0f } },
+ { { 0, 1900.0f }, { 4, 1600.0f }, { 10, 2200.0f }, { 16, 1900.0f } },
+ { { 0, 1900.0f }, { 7, 1400.0f }, { 16, 1900.0f }, { 0, 0.0f } },
+};
+static Vec3f D_80A993AC[] = {
+ { 1.0f, 1.0f, 0.0f },
+ { 0.9f, 0.9f, 120.0f },
+ { 0.95f, 0.95f, 240.0f },
+};
+static Vec3f D_80A993D0[] = {
+ { 1.5f, 1.5f, 0.0f },
+ { 1.2f, 1.2f, 120.0f },
+ { 1.35f, 1.35f, 240.0f },
+};
+static TexturePtr sYoungerBrotherEyeTextures[] = {
+ gBeaverYoungerBrotherEye1Tex,
+ gBeaverYoungerBrotherEye2Tex,
+ gBeaverYoungerBrotherEye3Tex,
+ gBeaverYoungerBrotherEye4Tex,
+};
+static TexturePtr sYoungerBrotherBeltTextures[] = {
+ gBeaverYoungerBrotherBeltRedTex,
+ gBeaverYoungerBrotherBeltGreenTex,
+ gBeaverYoungerBrotherBeltBlueTex,
+};
+
+void EnAz_Draw(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnAz* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+ POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ if (this->unk_374 & 2) {
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ func_80A98DA4, func_80A98E48, &this->actor);
+ } else {
+ OPEN_DISPS(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sYoungerBrotherEyeTextures[this->unk_37E]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sYoungerBrotherBeltTextures[this->unk_380]));
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ func_80A98DA4, func_80A98E48, &this->actor);
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ OPEN_DISPS(play->state.gfxCtx);
+ if ((this->actor.depthInWater >= 28.0f) && (this->actor.speedXZ > 0.5f)) {
+ Matrix_Translate(this->unk_3B4.x, this->unk_3B4.y, this->unk_3B4.z, MTXMODE_NEW);
+ Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+ Matrix_RotateXS(this->unk_39E, MTXMODE_APPLY);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ func_8012C2DC(play->state.gfxCtx);
+ if (this->unk_374 & 2) {
+ s32 i;
+ Vec3f sp98;
+ f32 sp94;
+
+ Matrix_Translate(0.0f, 0.0f, -2000.0f, MTXMODE_APPLY);
+ for (i = 0; i < ARRAY_COUNT(D_80A99180); i++) {
+ Matrix_Push();
+ func_80A98F94(D_80A9930C[i], this->unk_39C, &sp94);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(D_80A99180[i]));
+ Matrix_Translate(0.0f, sp94 * 100.0f, i * -930.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.1f, 0.95f, 1.0f, MTXMODE_APPLY);
+ func_80124618(D_80A991A4[i], this->unk_39C, &sp98);
+ Matrix_Scale(sp98.x, sp98.y, sp98.z, MTXMODE_APPLY);
+ if (this->unk_374 & 0x800) {
+ gSPSegment(POLY_XLU_DISP++, 0x09,
+ Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, D_80A99194[i]));
+ } else {
+ gSPSegment(POLY_XLU_DISP++, 0x09,
+ Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, D_80A9919C[i]));
+ }
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, D_80A9916C[i]);
+ Matrix_Pop();
+ }
+ } else {
+ Matrix_Push();
+ Matrix_Translate(0.0f, 2000.0f, -2000.0f, MTXMODE_APPLY);
+ Matrix_RotateZS(D_80A993D0[this->unk_384].z * (0x10000 / 360.0f), MTXMODE_APPLY);
+ Matrix_Scale(D_80A993AC[this->unk_384].x, D_80A993AC[this->unk_384].y, 0.0f, MTXMODE_APPLY);
+ if (this->unk_374 & 0x800) {
+ gSPSegment(POLY_XLU_DISP++, 0x08, Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, 255));
+ } else {
+ gSPSegment(POLY_XLU_DISP++, 0x08, Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, 85));
+ }
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gBeaverYoungerBrotherTailVortexDL);
+ Matrix_Pop();
+ Matrix_Translate(0.0f, 2000.0f, -2100.0f, MTXMODE_APPLY);
+ Matrix_RotateZS(D_80A993D0[this->unk_384].z * (0x10000 / 360.0f), MTXMODE_APPLY);
+ Matrix_Scale(D_80A993D0[this->unk_384].x, D_80A993D0[this->unk_384].y, 0.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gBeaverYoungerBrotherTailSplashDL);
+ }
+ }
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+s32 func_80A98DA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnAz* this = THIS;
+
+ if ((limbIndex == BEAVER_OLDER_BROTHER_LIMB_NONE) && ((play->gameplayFrames % 2) != 0)) {
+ *dList = NULL;
+ }
+ if (limbIndex == BEAVER_OLDER_BROTHER_LIMB_NONE) {
+ rot->x = rot->x;
+ rot->y = rot->y;
+ rot->z = rot->z;
+ }
+ if (limbIndex == BEAVER_OLDER_BROTHER_LIMB_PELVIS) {
+ rot->y -= this->unk_39E;
+ } else {
+ // this space intentionally left blank
+ }
+ if (limbIndex == BEAVER_OLDER_BROTHER_LIMB_HEAD_ROOT) {
+ rot->x += this->unk_3D4;
+ rot->y -= this->unk_3D6;
+ }
+ return false;
+}
+
+void func_80A98E48(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ static Vec3f D_80A99410 = { 700.0f, 0.0f, 0.0f };
+ static Vec3f D_80A9941C = { -500.0f, 0.0f, 0.0f };
+ static Vec3f D_80A99428 = { -1200.0f, 0.0f, 1000.0f };
+ EnAz* this = THIS;
+
+ if (limbIndex == BEAVER_OLDER_BROTHER_LIMB_PELVIS) {
+ Matrix_MultVec3f(&D_80A99410, &this->unk_3A8);
+ Math_SmoothStepToF(&this->unk_3A4, this->unk_3A8.y - this->actor.world.pos.y, 0.8f, 10.0f, 0.01f);
+ if (this->unk_374 & 2) {
+ Matrix_MultVec3f(&D_80A9941C, &this->unk_3B4);
+ } else {
+ Matrix_MultVec3f(&D_80A99428, &this->unk_3B4);
+ }
+ }
+}
+
+void func_80A98EFC(EnAz* this, PlayState* play, u16 textId, s32 animIndex, s32 brotherAnimIndex) {
+ EnAz* brother = this->brother;
+
+ Actor_ChangeFocus(&this->actor, play, &brother->actor);
+ if (animIndex >= 0) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, animIndex, &this->animIndex);
+ }
+ this->actor.textId = 0;
+ brother->actor.textId = textId;
+ brother->unk_378 = 5;
+ if ((brotherAnimIndex >= 0) && (brotherAnimIndex != brother->animIndex)) {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, brotherAnimIndex, &brother->animIndex);
+ }
+ this->unk_378 = 0;
+}
+
+void func_80A98F94(struct_80A98F94* yData, f32 frame, f32* yInterp) {
+ f32 nextFrame;
+ f32 prevFrame;
+ f32 weight;
+
+ do {
+ yData++;
+ nextFrame = yData[0].unk_0;
+ } while (nextFrame < frame);
+ prevFrame = yData[-1].unk_0;
+ weight = LERPWEIGHT(frame, prevFrame, nextFrame);
+ *yInterp = LERPIMP(yData[-1].unk_4, yData[0].unk_4, weight) * 0.01f;
+}
diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.h b/src/overlays/actors/ovl_En_Az/z_en_az.h
index 5c302c6f3f..ffe094a932 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.h
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.h
@@ -7,10 +7,48 @@ struct EnAz;
typedef void (*EnAzActionFunc)(struct EnAz*, PlayState*);
+#define BEAVER_GET_PARAM_F00(thisx) (((thisx)->params >> 8) & 0xF)
+#define BEAVER_GET_PARAM_FF(thisx) ((thisx)->params & 0xFF)
+
typedef struct EnAz {
/* 0x000 */ Actor actor;
/* 0x144 */ EnAzActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x290];
+ /* 0x148 */ SkelAnime skelAnime;
+ /* 0x18C */ ColliderCylinder collider;
+ /* 0x1D8 */ Vec3s jointTable[24];
+ /* 0x268 */ Vec3s morphTable[24];
+ /* 0x2F8 */ s16 unk_2F8;
+ /* 0x2FA */ s16 unk_2FA; // cutscene state?
+ /* 0x2FC */ s32 animIndex;
+ /* 0x300 */ ActorPathing unk_300;
+ /* 0x36C */ f32 unk_36C;
+ /* 0x370 */ UNK_TYPE1 unk370[4];
+ /* 0x374 */ u16 unk_374; // flags of some sort
+ /* 0x376 */ u16 unk_376; // flags of some sort
+ /* 0x378 */ u8 unk_378; // cutscene state?
+ /* 0x37A */ s16 unk_37A;
+ /* 0x37C */ s16 unk_37C;
+ /* 0x37E */ s16 unk_37E;
+ /* 0x380 */ s16 unk_380;
+ /* 0x382 */ s16 unk_382;
+ /* 0x384 */ s16 unk_384;
+ /* 0x388 */ struct EnAz* brother;
+ /* 0x38C */ UNK_TYPE1 unk38C[0x10];
+ /* 0x39C */ s16 unk_39C;
+ /* 0x39E */ s16 unk_39E; // some sort of rotation
+ /* 0x3A0 */ UNK_TYPE1 unk3A0[4];
+ /* 0x3A4 */ f32 unk_3A4;
+ /* 0x3A8 */ Vec3f unk_3A8;
+ /* 0x3B4 */ Vec3f unk_3B4; // translation
+ /* 0x3C0 */ s16 unk_3C0; // seems to do nothing
+ /* 0x3C2 */ s16 unk_3C2;
+ /* 0x3C4 */ s16 unk_3C4;
+ /* 0x3C6 */ UNK_TYPE1 unk3C6[6];
+ /* 0x3CC */ s32 getItemId;
+ /* 0x3D0 */ s16 unk_3D0[1];
+ /* 0x3D2 */ u16 unk_3D2;
+ /* 0x3D4 */ s16 unk_3D4;
+ /* 0x3D6 */ s16 unk_3D6;
} EnAz; // size = 0x3D8
extern const ActorInit En_Az_InitVars;
diff --git a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
index a0954943b6..e2496e18ed 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
@@ -126,7 +126,7 @@ void EnBaguo_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f);
SkelAnime_Init(play, &this->skelAnime, &gNejironSkel, NULL, this->jointTable, this->morphTable, NEJIRON_LIMB_MAX);
- this->actor.hintId = 0xB;
+ this->actor.hintId = TATL_HINT_ID_NEJIRON;
this->maxDistanceFromHome = 240.0f;
this->maxDistanceFromHome += this->actor.world.rot.z * 40.0f;
this->actor.world.rot.z = 0;
diff --git a/src/overlays/actors/ovl_En_Bat/z_en_bat.c b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
index e816087210..fe1eb9fd84 100644
--- a/src/overlays/actors/ovl_En_Bat/z_en_bat.c
+++ b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
@@ -107,7 +107,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 1, 15, 30, 10 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 96, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BAD_BAT, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
diff --git a/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
index 488ed04822..a66c28a893 100644
--- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c
+++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
@@ -114,7 +114,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 2, 20, 40, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 28, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BLUE_BUBBLE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 10, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
index 2193203fe3..b1e4db445a 100644
--- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
+++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
@@ -143,7 +143,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 2, 20, 40, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 36, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_RED_BUBBLE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 10, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Bee/z_en_bee.c b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
index f53b58bf64..0a0c6dd3fd 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.c
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
@@ -17,8 +17,11 @@ void EnBee_Draw(Actor* thisx, PlayState* play);
void func_80B5A9E8(EnBee* this, PlayState* play);
void func_80B5AC3C(EnBee* this, PlayState* play);
+void func_80B5A854(EnBee* this);
+void func_80B5ABC4(EnBee* this);
+
+s32 D_80B5B1F0 = 0;
-#if 0
const ActorInit En_Bee_InitVars = {
ACTOR_EN_BEE,
ACTORCAT_ENEMY,
@@ -31,8 +34,7 @@ const ActorInit En_Bee_InitVars = {
(ActorFunc)EnBee_Draw,
};
-// static DamageTable sDamageTable = {
-static DamageTable D_80B5B214 = {
+static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(1, 0xF),
/* Deku Stick */ DMG_ENTRY(1, 0xF),
/* Horse trample */ DMG_ENTRY(1, 0xF),
@@ -67,34 +69,219 @@ static DamageTable D_80B5B214 = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80B5B234 = {
- { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_HARD | AC_TYPE_PLAYER, OC1_ON, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x08, 0x02 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_HARD | AC_TYPE_PLAYER,
+ OC1_ON,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x08, 0x02 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 6, 13, -4, { 0, 0, 0 } },
};
-#endif
+void EnBee_Init(Actor* thisx, PlayState* play) {
+ EnBee* this = THIS;
-extern DamageTable D_80B5B214;
-extern ColliderCylinderInit D_80B5B234;
+ this->actor.colChkInfo.mass = 10;
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
+ SkelAnime_Init(play, &this->skelAnime, &object_bee_Skel_001398, &object_bee_Anim_00005C, this->morphTable,
+ this->jointTable, OBJECT_BEE_LIMB_MAX);
+ this->actor.colChkInfo.health = 1;
+ this->actor.colChkInfo.damageTable = &sDamageTable;
+ this->actor.targetMode = 6;
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ this->unk_218 = D_80B5B1F0;
+ D_80B5B1F0++;
+ this->actor.shape.shadowScale = 12.0f;
-extern UNK_TYPE D_0600005C;
+ if (ActorCutscene_GetCurrentIndex() != -1) {
+ func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_ITEMACTION);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/EnBee_Init.s")
+ this->actor.hintId = TATL_HINT_ID_GIANT_BEE;
+ func_80B5A854(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/EnBee_Destroy.s")
+void EnBee_Destroy(Actor* thisx, PlayState* play) {
+ EnBee* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/func_80B5A854.s")
+ Collider_DestroyCylinder(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/func_80B5A9E8.s")
+void func_80B5A854(EnBee* this) {
+ s32 pad;
+ Vec3f sp48;
+ s16 sp46;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/func_80B5ABC4.s")
+ Animation_Change(&this->skelAnime, &object_bee_Anim_00005C, 1.0f, 0.0f,
+ Animation_GetLastFrame(&object_bee_Anim_00005C), 0, -10.0f);
+ Math_Vec3f_Copy(&sp48, &this->actor.home.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/func_80B5AC3C.s")
+ sp46 = (this->unk_218 * 0x700) + 0x2000;
+ sp48.x += Math_SinS(sp46) * 50.0f;
+ sp48.y = Rand_ZeroFloat(50.0f) + (this->actor.floorHeight + 30.0f);
+ sp48.z += Math_CosS(sp46) * 50.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/func_80B5AF80.s")
+ Math_Vec3f_Copy(&this->unk_21C[0], &sp48);
+ Math_Vec3f_Copy(&sp48, &this->actor.home.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/EnBee_Update.s")
+ sp48.x += Math_SinS(sp46 - 0x4000) * 50.0f;
+ sp48.y = Rand_ZeroFloat(50.0f) + (this->actor.floorHeight + 30.0f);
+ sp48.z += Math_CosS(sp46 - 0x4000) * 50.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bee/EnBee_Draw.s")
+ Math_Vec3f_Copy(&this->unk_21C[1], &sp48);
+
+ this->unk_204 = Rand_S16Offset(0x14, 0x1E);
+ this->unk_208 = 0;
+ this->actionFunc = func_80B5A9E8;
+}
+
+void func_80B5A9E8(EnBee* this, PlayState* play) {
+ Vec3f sp3C;
+ s32 pad[2];
+
+ if ((this->actor.category != ACTORCAT_ENEMY) && (ActorCutscene_GetCurrentIndex() == -1)) {
+ func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY);
+ }
+
+ Math_Vec3f_Copy(&sp3C, &this->unk_21C[this->unk_214]);
+ sp3C.x += Math_SinS(this->unk_20C) * 30.0f;
+ sp3C.z += Math_CosS(this->unk_20C) * 30.0f;
+
+ if (!(this->unk_218 & 1)) {
+ this->unk_20C += (s16)((s32)randPlusMinusPoint5Scaled(1000.0f) + 4000);
+ } else {
+ this->unk_20C -= (s16)((s32)randPlusMinusPoint5Scaled(1000.0f) + 4000);
+ }
+
+ this->unk_210 += 1000;
+ this->actor.velocity.y = Math_SinS(this->unk_210);
+
+ if (this->unk_20C > 0x10000) {
+ this->unk_20C = 0;
+ this->unk_214++;
+ this->unk_214 &= 1;
+ }
+
+ Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp3C), 1, 0x7D0, 0);
+ Math_ApproachF(&this->actor.speedXZ, 3.0f, 0.3f, 1.0f);
+
+ if ((this->unk_204 == 0) && (this->actor.params != 0)) {
+ func_80B5ABC4(this);
+ }
+}
+
+void func_80B5ABC4(EnBee* this) {
+ Animation_Change(&this->skelAnime, &object_bee_Anim_00005C, 1.0f, 0.0f,
+ Animation_GetLastFrame(&object_bee_Anim_00005C), 0, -10.0f);
+ this->unk_208 = 1;
+ this->actionFunc = func_80B5AC3C;
+}
+
+void func_80B5AC3C(EnBee* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ Vec3f sp88;
+ f32 rnd;
+ f32 phi_fs1;
+ s32 i;
+
+ Math_Vec3f_Copy(&sp88, &player->actor.world.pos);
+ phi_fs1 = (this->unk_218 * 0x700) + 0x2000;
+
+ for (i = 0; i < 2; i++) {
+ rnd = randPlusMinusPoint5Scaled(20.0f);
+ sp88.x += Math_SinS((this->actor.yawTowardsPlayer + ((f32)this->unk_20C)) + phi_fs1) * (rnd + 30.0f);
+ sp88.y = (Math_SinS(this->unk_210) * 10.0f) + (player->actor.floorHeight + 40.0f);
+ rnd = randPlusMinusPoint5Scaled(20.0f);
+ sp88.z += Math_CosS((f32)this->actor.yawTowardsPlayer + this->unk_20C + phi_fs1) * (rnd + 30.0f);
+ Math_Vec3f_Copy(&this->unk_21C[i], &sp88);
+ phi_fs1 -= 16384.0f;
+ }
+
+ Math_Vec3f_Copy(&sp88, &this->unk_21C[this->unk_214]);
+
+ if (!(this->unk_218 & 1)) {
+ this->unk_20C += (this->unk_218 * 0x700) + (s32)randPlusMinusPoint5Scaled((this->unk_218 * 0x700) * 0.5f);
+ } else {
+ this->unk_20C -= (this->unk_218 * 0x700) + (s32)randPlusMinusPoint5Scaled((this->unk_218 * 0x700) * 0.5f);
+ }
+
+ this->unk_210 += (s32)randPlusMinusPoint5Scaled(500.0f) + 1000;
+
+ if (this->unk_20C > 0x10000) {
+ this->unk_20C = 0;
+ this->unk_214++;
+ this->unk_214 &= 1;
+ }
+
+ Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp88), 1, 0x1388, 0);
+ Math_ApproachF(&this->actor.world.pos.y, sp88.y, 0.3f, 3.0f);
+ Math_ApproachF(&this->actor.speedXZ, 5.0f, 0.3f, 1.0f);
+}
+
+void func_80B5AF80(EnBee* this, PlayState* play) {
+ if ((this->unk_206 == 0) && (this->collider.base.atFlags & AC_HIT)) {
+ AudioSfx_StopByPosAndId(&this->actor.projectedPos, NA_SE_EN_BEE_FLY - SFX_FLAG);
+ this->unk_206 = 5;
+ }
+
+ if (this->collider.base.acFlags & AC_HIT) {
+ Enemy_StartFinishingBlow(play, &this->actor);
+ this->actor.speedXZ = 0.0f;
+ SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 10, NA_SE_EN_CUTBODY);
+ this->actor.colChkInfo.health = 0;
+ SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EN_EXTINCT);
+ func_800B3030(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, 100, 0, 2);
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void EnBee_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnBee* this = THIS;
+
+ SkelAnime_Update(&this->skelAnime);
+
+ if (this->actor.category == ACTORCAT_ENEMY) {
+ if (this->unk_204 != 0) {
+ this->unk_204--;
+ }
+ if (this->unk_206 != 0) {
+ this->unk_206--;
+ }
+ }
+
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BEE_FLY - SFX_FLAG);
+ func_80B5AF80(this, play);
+ Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
+ Actor_SetFocus(&this->actor, 0.0f);
+ Actor_SetScale(&this->actor, 0.01f);
+
+ this->actionFunc(this, play);
+
+ Actor_MoveWithGravity(&this->actor);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 40.0f, 40.0f, 0x1D);
+
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
+}
+
+void EnBee_Draw(Actor* thisx, PlayState* play) {
+ EnBee* this = THIS;
+
+ func_8012C28C(play->state.gfxCtx);
+ func_8012C2DC(play->state.gfxCtx);
+ SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
+}
diff --git a/src/overlays/actors/ovl_En_Bee/z_en_bee.h b/src/overlays/actors/ovl_En_Bee/z_en_bee.h
index 1676a55079..1638407ee0 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.h
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.h
@@ -2,6 +2,7 @@
#define Z_EN_BEE_H
#include "global.h"
+#include "assets/objects/object_bee/object_bee.h"
struct EnBee;
@@ -9,9 +10,20 @@ typedef void (*EnBeeActionFunc)(struct EnBee*, PlayState*);
typedef struct EnBee {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0xBC];
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ Vec3s morphTable[OBJECT_BEE_LIMB_MAX];
+ /* 0x1C4 */ Vec3s jointTable[OBJECT_BEE_LIMB_MAX];
/* 0x200 */ EnBeeActionFunc actionFunc;
- /* 0x204 */ char unk_204[0x84];
+ /* 0x204 */ s16 unk_204;
+ /* 0x206 */ s16 unk_206;
+ /* 0x208 */ s16 unk_208;
+ /* 0x20C */ s32 unk_20C;
+ /* 0x210 */ s32 unk_210;
+ /* 0x214 */ s32 unk_214;
+ /* 0x218 */ s32 unk_218;
+ /* 0x21C */ Vec3f unk_21C[2];
+ /* 0x234 */ UNK_TYPE1 pad234[8];
+ /* 0x23C */ ColliderCylinder collider;
} EnBee; // size = 0x288
extern const ActorInit En_Bee_InitVars;
diff --git a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
index bb3f28bee6..4f8f28f3c7 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -88,7 +88,7 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 2500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 89, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BIG_OCTO, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 33, ICHAIN_STOP),
};
@@ -443,7 +443,7 @@ void EnBigokuta_PlayDeathEffects(EnBigokuta* this, PlayState* play) {
bubblePos.z = this->picto.actor.world.pos.z + (2.0f * bubbleVel.z);
EffectSsDtBubble_SpawnCustomColor(play, &bubblePos, &bubbleVel, &D_80AC45A4, &D_80AC45B0,
- &D_80AC45B8, Rand_S16Offset(150, 50), 25, 0);
+ &D_80AC45B8, Rand_S16Offset(150, 50), 25, false);
}
if (this->picto.actor.params != 0xFF) {
diff --git a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
index e0585b8f5f..20a868bc61 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
@@ -154,7 +154,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 90, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BIG_POE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3200, ICHAIN_STOP),
};
@@ -181,8 +181,7 @@ void EnBigpo_Init(Actor* thisx, PlayState* play2) {
Actor_ProcessInitChain(&this->actor, sInitChain);
- // thisx req to match
- this->switchFlags = GET_BIGPO_SWITCHFLAGS(thisx);
+ this->switchFlags = BIGPO_GET_SWITCHFLAGS(thisx);
thisx->params &= 0xFF;
if (thisx->params == ENBIGPO_POSSIBLEFIRE) {
if (Flags_GetSwitch(play, this->switchFlags)) {
@@ -220,7 +219,7 @@ void EnBigpo_Init(Actor* thisx, PlayState* play2) {
}
if (thisx->params == ENBIGPO_REGULAR) { // the well poe, starts immediately
- thisx->flags &= ~0x10; // always update OFF
+ thisx->flags &= ~ACTOR_FLAG_10; // always update OFF
this->unkBool204 = true;
EnBigpo_InitWellBigpo(this);
} else if (thisx->params == ENBIGPO_SUMMONED) { // dampe type
@@ -672,7 +671,7 @@ void EnBigpo_SetupDeath(EnBigpo* this) {
this->idleTimer = 0;
this->actor.speedXZ = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->collider.base.ocFlags1 &= ~OC1_ON;
this->actionFunc = EnBigpo_BurnAwayDeath;
}
diff --git a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
index 248c9356cf..9117bd97c5 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
@@ -64,6 +64,6 @@ enum EnBigpoType {
/* 5 */ ENBIGPO_UNK5,
};
-#define GET_BIGPO_SWITCHFLAGS(thisx) ((u8)(thisx->params >> 0x8))
+#define BIGPO_GET_SWITCHFLAGS(thisx) (u8)((thisx)->params >> 0x8)
#endif // Z_EN_BIGPO_H
diff --git a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
index 12076537e6..392f9a441f 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -303,7 +303,7 @@ static AnimationHeader* sGekkoAttackAnimations[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 95, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GEKKO_GIANT_SLIME, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(targetArrowOffset, -13221, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
@@ -765,7 +765,7 @@ void EnBigslime_BreakIntoMinislime(EnBigslime* this, PlayState* play) {
this->actor.colChkInfo.mass = 50;
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_400);
this->actor.flags |= ACTOR_FLAG_200;
- this->actor.hintId = 95;
+ this->actor.hintId = TATL_HINT_ID_GEKKO_GIANT_SLIME;
this->gekkoRot.x = 0;
this->gekkoRot.y = 0;
this->actor.bgCheckFlags &= ~1;
@@ -2308,7 +2308,7 @@ void EnBigslime_FormBigslime(EnBigslime* this, PlayState* play) {
if (this->minislimeCounter == MINISLIME_NUM_SPAWN) {
this->minislimeState = MINISLIME_INACTIVE_STATE;
- this->actor.hintId = 3;
+ this->actor.hintId = TATL_HINT_ID_MAD_JELLY;
EnBigslime_SetupMoveOnCeiling(this);
}
}
diff --git a/src/overlays/actors/ovl_En_Bom/z_en_bom.c b/src/overlays/actors/ovl_En_Bom/z_en_bom.c
index 6b79d6021f..5d5b01ee8b 100644
--- a/src/overlays/actors/ovl_En_Bom/z_en_bom.c
+++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.c
@@ -139,7 +139,7 @@ void EnBom_Init(Actor* thisx, PlayState* play) {
this->flashSpeedScale = 7;
this->isPowderKeg = ENBOM_GETX_1(&this->actor);
if (this->isPowderKeg) {
- play->actorCtx.unk5 |= 1;
+ play->actorCtx.flags |= ACTORCTX_FLAG_0;
this->timer = gSaveContext.powderKegTimer;
} else {
this->timer = 70;
@@ -188,7 +188,7 @@ void EnBom_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyJntSph(play, &this->collider2);
Collider_DestroyCylinder(play, &this->collider1);
if (this->isPowderKeg) {
- play->actorCtx.unk5 &= ~1;
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_0;
}
}
@@ -541,7 +541,7 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
Camera_AddQuake(&play->mainCamera, 2, 11, 8);
thisx->params = ENBOM_1;
this->timer = 10;
- thisx->flags |= (0x100000 | 0x20);
+ thisx->flags |= (ACTOR_FLAG_20 | ACTOR_FLAG_100000);
this->actionFunc = func_808715B8;
if (this->isPowderKeg) {
gSaveContext.powderKegTimer = 0;
diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c
index 876186a20d..a7c13b643e 100644
--- a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c
+++ b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c
@@ -509,7 +509,7 @@ void func_809C59F0(EnBomBowlMan* this, PlayState* play) {
} else {
this->actor.textId = 0x716;
}
- func_800B8500(&this->actor, play, 400.0f, 400.0f, -1);
+ func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_AP_MINUS1);
this->actionFunc = func_809C5AA4;
} else {
Actor_PickUp(&this->actor, play, GI_BOMBERS_NOTEBOOK, 300.0f, 300.0f);
@@ -524,7 +524,7 @@ void func_809C5AA4(EnBomBowlMan* this, PlayState* play) {
this->actionFunc = func_809C5598;
}
} else {
- func_800B8500(&this->actor, play, 400.0f, 400.0f, -1);
+ func_800B8500(&this->actor, play, 400.0f, 400.0f, PLAYER_AP_MINUS1);
}
}
diff --git a/src/overlays/actors/ovl_En_Boom/z_en_boom.c b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
index df4adfc20f..2c68e20f85 100644
--- a/src/overlays/actors/ovl_En_Boom/z_en_boom.c
+++ b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
@@ -219,7 +219,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
(this->collider.base.at->id == ACTOR_EN_SI))) {
this->unk_1C8 = this->collider.base.at;
if (this->collider.base.at->id == ACTOR_EN_SI) {
- this->collider.base.at->flags |= 0x2000;
+ this->collider.base.at->flags |= ACTOR_FLAG_2000;
}
}
@@ -264,7 +264,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
sp7C->gravity = -0.9f;
sp7C->bgCheckFlags &= ~3;
} else {
- sp7C->flags &= -0x2001;
+ sp7C->flags &= ~ACTOR_FLAG_2000;
}
}
Actor_MarkForDeath(&this->actor);
diff --git a/src/overlays/actors/ovl_En_Box/z_en_box.c b/src/overlays/actors/ovl_En_Box/z_en_box.c
index bfc2420605..10c28b6eb6 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.c
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.c
@@ -604,7 +604,7 @@ void EnBox_Update(Actor* thisx, PlayState* play) {
EnBox_ClipToGround(this, play);
}
if ((this->getItemId == GI_STRAY_FAIRY) && !Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor))) {
- play->actorCtx.unk5 |= 8;
+ play->actorCtx.flags |= ACTORCTX_FLAG_3;
}
this->actionFunc(this, play);
if (this->movementFlags & ENBOX_MOVE_0x80) {
diff --git a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
index 3030041ca8..06c5c33b1f 100644
--- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
+++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
@@ -15,11 +15,10 @@ void EnBubble_Destroy(Actor* thisx, PlayState* play);
void EnBubble_Update(Actor* thisx, PlayState* play);
void EnBubble_Draw(Actor* thisx, PlayState* play);
-void func_808A029C(EnBubble* this, PlayState* play);
-void func_808A0350(EnBubble* this, PlayState* play);
-void func_808A03E8(EnBubble* this, PlayState* play);
+void EnBubble_Wait(EnBubble* this, PlayState* play);
+void EnBubble_Pop(EnBubble* this, PlayState* play);
+void EnBubble_Regrow(EnBubble* this, PlayState* play);
-#if 0
const ActorInit En_Bubble_InitVars = {
ACTOR_EN_BUBBLE,
ACTORCAT_ENEMY,
@@ -32,73 +31,396 @@ const ActorInit En_Bubble_InitVars = {
(ActorFunc)EnBubble_Draw,
};
-// static ColliderJntSphElementInit sJntSphElementsInit[2] = {
-static ColliderJntSphElementInit D_808A0700[2] = {
+static ColliderJntSphElementInit sJntSphElementsInit[2] = {
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x04 }, { 0xF7CFD757, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x04 },
+ { 0xF7CFD757, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 0, { { 0, 0, 0 }, 16 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x00002820, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_NO_AT_INFO | BUMP_NO_DAMAGE | BUMP_NO_SWORD_SFX | BUMP_NO_HITMARK, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00002820, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON | BUMP_NO_AT_INFO | BUMP_NO_DAMAGE | BUMP_NO_SWORD_SFX | BUMP_NO_HITMARK,
+ OCELEM_NONE,
+ },
{ 0, { { 0, 0, 0 }, 16 }, 100 },
},
};
-// static ColliderJntSphInit sJntSphInit = {
-static ColliderJntSphInit D_808A0748 = {
- { COLTYPE_HIT6, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, },
- ARRAY_COUNT(sJntSphElementsInit), D_808A0700, // sJntSphElementsInit,
+static ColliderJntSphInit sJntSphInit = {
+ {
+ COLTYPE_HIT6,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_JNTSPH,
+ },
+ ARRAY_COUNT(sJntSphElementsInit),
+ sJntSphElementsInit,
};
-// sColChkInfoInit
-static CollisionCheckInfoInit2 D_808A0758 = { 1, 2, 25, 25, MASS_IMMOVABLE };
+static CollisionCheckInfoInit2 sColChkInfoInit = { 1, 2, 25, 25, MASS_IMMOVABLE };
-#endif
+void EnBubble_SetDimensions(EnBubble* this, f32 dim) {
+ f32 x;
+ f32 y;
+ f32 z;
+ f32 norm;
-extern ColliderJntSphElementInit D_808A0700[2];
-extern ColliderJntSphInit D_808A0748;
-extern CollisionCheckInfoInit2 D_808A0758;
+ this->actor.flags |= ACTOR_FLAG_1;
+ Actor_SetScale(&this->actor, 1.0f);
+ this->actor.shape.yOffset = 16.0f;
+ this->modelRotSpeed = 16.0f;
+ this->modelEllipticity = 0.08f;
+ this->modelWidth = dim;
+ this->modelHeight = dim;
+ x = Rand_ZeroOne();
+ y = Rand_ZeroOne();
+ z = Rand_ZeroOne();
+ this->unk_210 = 1.0f;
+ this->unk_214 = 1.0f;
+ norm = SQ(x) + SQ(y) + SQ(z);
+ this->unk1F8.x = x / norm;
+ this->unk1F8.y = y / norm;
+ this->unk1F8.z = z / norm;
+}
-extern UNK_TYPE D_06001000;
+s32 func_8089F59C(EnBubble* this) {
+ ColliderInfo* info = &this->colliderSphere.elements[0].info;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F4E0.s")
+ info->toucher.dmgFlags = DMG_EXPLOSIVES;
+ info->toucher.effect = 0;
+ info->toucher.damage = 4;
+ info->toucherFlags = TOUCH_ON;
+ this->actor.velocity.y = 0.0f;
+ return 6;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F59C.s")
+s32 func_8089F5D0(EnBubble* this) {
+ EnBubble_SetDimensions(this, -1.0f);
+ return 12;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F5D0.s")
+void EnBubble_DamagePlayer(EnBubble* this, PlayState* play) {
+ play->damagePlayer(play, -this->colliderSphere.elements[0].info.toucher.damage);
+ func_800B8E1C(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F5F4.s")
+s32 EnBubble_Explosion(EnBubble* this, PlayState* play) {
+ static Color_RGBA8 sEffectPrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sEffectEnvColor = { 150, 150, 150, 0 };
+ s32 i;
+ Vec3f effectAccel = { 0.0f, -0.5f, 0.0f };
+ Vec3f effectVel;
+ Vec3f effectPos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F660.s")
+ Math_SmoothStepToF(&this->modelWidth, 4.0f, 0.1f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelHeight, 4.0f, 0.1f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelRotSpeed, 54.0f, 0.1f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelEllipticity, 0.2f, 0.1f, 1000.0f, 0.0f);
+ this->actor.shape.yOffset = (this->modelHeight + 1.0f) * 16.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F8BC.s")
+ if (DECR(this->explosionCountdown) != 0) {
+ return -1;
+ }
+ effectPos.x = this->actor.world.pos.x;
+ effectPos.y = this->actor.world.pos.y + this->actor.shape.yOffset;
+ effectPos.z = this->actor.world.pos.z;
+ for (i = 0; i < 20; i++) {
+ effectVel.x = (Rand_ZeroOne() - 0.5f) * 7.0f;
+ effectVel.y = Rand_ZeroOne() * 7.0f;
+ effectVel.z = (Rand_ZeroOne() - 0.5f) * 7.0f;
+ EffectSsDtBubble_SpawnCustomColor(play, &effectPos, &effectVel, &effectAccel, &sEffectPrimColor,
+ &sEffectEnvColor, Rand_S16Offset(100, 50), 25, 0);
+ }
+ Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, 0x50);
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ return Rand_S16Offset(90, 60);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F908.s")
+s32 func_8089F8BC(EnBubble* this) {
+ if (DECR(this->explosionCountdown) != 0) {
+ return -1;
+ } else {
+ return func_8089F5D0(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F95C.s")
+s32 func_8089F908(EnBubble* this) {
+ this->modelWidth += 1.0f / 12.0f;
+ this->modelHeight += 1.0f / 12.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F9E4.s")
+ if (DECR(this->explosionCountdown) != 0) {
+ return false;
+ } else {
+ return true;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089FA54.s")
+void EnBubble_Vec3fNormalizedReflect(Vec3f* vec1, Vec3f* vec2, Vec3f* dest) {
+ f32 norm;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089FF30.s")
+ func_80179F64(vec1, vec2, dest);
+ norm = sqrtf(SQ(dest->x) + SQ(dest->y) + SQ(dest->z));
+ if (norm != 0.0f) {
+ dest->x /= norm;
+ dest->y /= norm;
+ dest->z /= norm;
+ } else {
+ dest->x = dest->y = dest->z = 0.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089FFCC.s")
+void EnBubble_Vec3fNormalize(Vec3f* vec) {
+ f32 norm = sqrtf(SQ(vec->x) + SQ(vec->y) + SQ(vec->z));
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A005C.s")
+ if (norm != 0.0f) {
+ vec->x /= norm;
+ vec->y /= norm;
+ vec->z /= norm;
+ } else {
+ vec->x = vec->y = vec->z = 0.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Init.s")
+void EnBubble_Fly(EnBubble* this, PlayState* play) {
+ CollisionPoly* poly;
+ Actor* bumpActor;
+ Vec3f sp84;
+ Vec3f sp78;
+ Vec3f sp6C;
+ Vec3f normal;
+ Vec3f bounceDirection;
+ f32 bounceSpeed;
+ s32 bgId;
+ u8 bounceCount;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Destroy.s")
+ if (this->colliderSphere.elements[1].info.bumperFlags & BUMP_HIT) {
+ bumpActor = this->colliderSphere.base.ac;
+ this->normalizedBumpVelocity = bumpActor->velocity;
+ EnBubble_Vec3fNormalize(&this->normalizedBumpVelocity);
+ this->velocityFromBump.x += this->normalizedBumpVelocity.x * 3.0f;
+ this->velocityFromBump.y += this->normalizedBumpVelocity.y * 3.0f;
+ this->velocityFromBump.z += this->normalizedBumpVelocity.z * 3.0f;
+ }
+ this->yVelocity -= 0.1f;
+ if (this->yVelocity < this->actor.terminalVelocity) {
+ this->yVelocity = this->actor.terminalVelocity;
+ }
+ bounceDirection.x = this->velocityFromBounce.x + this->velocityFromBump.x;
+ bounceDirection.y = this->velocityFromBounce.y + this->velocityFromBump.y + this->yVelocity;
+ bounceDirection.z = this->velocityFromBounce.z + this->velocityFromBump.z;
+ EnBubble_Vec3fNormalize(&bounceDirection);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A029C.s")
+ sp78.x = this->actor.world.pos.x;
+ sp78.y = this->actor.world.pos.y + this->actor.shape.yOffset;
+ sp78.z = this->actor.world.pos.z;
+ sp6C = sp78;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A0350.s")
+ sp6C.x += (bounceDirection.x * 24.0f);
+ sp6C.y += (bounceDirection.y * 24.0f);
+ sp6C.z += (bounceDirection.z * 24.0f);
+ if (BgCheck_EntityLineTest1(&play->colCtx, &sp78, &sp6C, &sp84, &poly, true, true, true, false, &bgId)) {
+ normal.x = COLPOLY_GET_NORMAL(poly->normal.x);
+ normal.y = COLPOLY_GET_NORMAL(poly->normal.y);
+ normal.z = COLPOLY_GET_NORMAL(poly->normal.z);
+ EnBubble_Vec3fNormalizedReflect(&bounceDirection, &normal, &bounceDirection);
+ this->bounceDirection = bounceDirection;
+ bounceCount = this->bounceCount;
+ this->bounceCount = ++bounceCount;
+ if (bounceCount > (s16)(Rand_ZeroOne() * 10.0f)) {
+ this->bounceCount = 0;
+ }
+ bounceSpeed = (this->bounceCount == 0) ? 3.6000001f : 3.0f;
+ this->velocityFromBump.x = this->velocityFromBump.y = this->velocityFromBump.z = 0.0f;
+ this->velocityFromBounce.x = this->bounceDirection.x * bounceSpeed;
+ this->velocityFromBounce.y = this->bounceDirection.y * bounceSpeed;
+ this->velocityFromBounce.z = this->bounceDirection.z * bounceSpeed;
+ this->yVelocity = 0.0f;
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AWA_BOUND);
+ this->modelRotSpeed = 128.0f;
+ this->modelEllipticity = 0.48f;
+ } else if ((this->actor.bgCheckFlags & 0x20) && (bounceDirection.y < 0.0f)) {
+ normal.x = normal.z = 0.0f;
+ normal.y = 1.0f;
+ EnBubble_Vec3fNormalizedReflect(&bounceDirection, &normal, &bounceDirection);
+ this->bounceDirection = bounceDirection;
+ bounceCount = this->bounceCount;
+ this->bounceCount = ++bounceCount;
+ if (bounceCount > (s16)(Rand_ZeroOne() * 10.0f)) {
+ this->bounceCount = 0;
+ }
+ bounceSpeed = (this->bounceCount == 0) ? 3.6000001f : 3.0f;
+ this->velocityFromBump.x = this->velocityFromBump.y = this->velocityFromBump.z = 0.0f;
+ this->velocityFromBounce.x = (this->bounceDirection.x * bounceSpeed);
+ this->velocityFromBounce.y = (this->bounceDirection.y * bounceSpeed);
+ this->velocityFromBounce.z = (this->bounceDirection.z * bounceSpeed);
+ this->yVelocity = 0.0f;
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AWA_BOUND);
+ this->modelRotSpeed = 128.0f;
+ this->modelEllipticity = 0.48f;
+ }
+ this->actor.velocity.x = this->velocityFromBounce.x + this->velocityFromBump.x;
+ this->actor.velocity.y = this->velocityFromBounce.y + this->velocityFromBump.y + this->yVelocity;
+ this->actor.velocity.z = this->velocityFromBounce.z + this->velocityFromBump.z;
+ Math_ApproachF(&this->velocityFromBump.x, 0.0f, 0.3f, 0.1f);
+ Math_ApproachF(&this->velocityFromBump.y, 0.0f, 0.3f, 0.1f);
+ Math_ApproachF(&this->velocityFromBump.z, 0.0f, 0.3f, 0.1f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A03A0.s")
+s32 func_8089FF30(EnBubble* this) {
+ if (((this->colliderSphere.base.acFlags & AC_HIT) != 0) == false) {
+ return false;
+ }
+ this->colliderSphere.base.acFlags &= ~AC_HIT;
+ if (this->colliderSphere.elements[1].info.bumperFlags & BUMP_HIT) {
+ this->unk1F4.x = this->colliderSphere.base.ac->velocity.x / 10.0f;
+ this->unk1F4.y = this->colliderSphere.base.ac->velocity.y / 10.0f;
+ this->unk1F4.z = this->colliderSphere.base.ac->velocity.z / 10.0f;
+ this->modelRotSpeed = 128.0f;
+ this->modelEllipticity = 0.48f;
+ return false;
+ }
+ this->timer = 8;
+ return true;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A03E8.s")
+s32 EnBubble_IsPopped(EnBubble* this, PlayState* play) {
+ if ((DECR(this->timer) != 0) || (this->actionFunc == EnBubble_Pop)) {
+ return false;
+ }
+ if (this->colliderSphere.base.ocFlags2 & OC2_HIT_PLAYER) {
+ this->colliderSphere.base.ocFlags2 &= ~OC2_HIT_PLAYER;
+ EnBubble_DamagePlayer(this, play);
+ this->timer = 8;
+ return true;
+ }
+ return func_8089FF30(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Update.s")
+void func_808A005C(EnBubble* this) {
+ ColliderJntSphElementDim* dim = &this->colliderSphere.elements[0].dim;
+ Vec3f src;
+ Vec3f dest;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Draw.s")
+ src.x = dim->modelSphere.center.x;
+ src.y = dim->modelSphere.center.y;
+ src.z = dim->modelSphere.center.z;
+
+ Matrix_MultVec3f(&src, &dest);
+ dim->worldSphere.center.x = dest.x;
+ dim->worldSphere.center.y = dest.y;
+ dim->worldSphere.center.z = dest.z;
+ dim->worldSphere.radius = dim->modelSphere.radius * (1.0f + this->modelWidth);
+ this->colliderSphere.elements[1].dim = *dim;
+}
+
+void EnBubble_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnBubble* this = THIS;
+
+ ActorShape_Init(&this->actor.shape, 16.0f, ActorShadow_DrawCircle, 0.2f);
+ Collider_InitJntSph(play, &this->colliderSphere);
+ Collider_SetJntSph(play, &this->colliderSphere, &this->actor, &sJntSphInit, this->colliderElements);
+ CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(9), &sColChkInfoInit);
+ this->actor.hintId = 0x16;
+ this->bounceDirection.x = Rand_ZeroOne();
+ this->bounceDirection.y = Rand_ZeroOne();
+ this->bounceDirection.z = Rand_ZeroOne();
+ EnBubble_Vec3fNormalize(&this->bounceDirection);
+ this->velocityFromBounce.x = this->bounceDirection.x * 3.0f;
+ this->velocityFromBounce.y = this->bounceDirection.y * 3.0f;
+ this->velocityFromBounce.z = this->bounceDirection.z * 3.0f;
+ EnBubble_SetDimensions(this, 0);
+ this->actionFunc = EnBubble_Wait;
+}
+
+void EnBubble_Destroy(Actor* thisx, PlayState* play) {
+ EnBubble* this = (EnBubble*)thisx;
+
+ Collider_DestroyJntSph(play, &this->colliderSphere);
+}
+
+void EnBubble_Wait(EnBubble* this, PlayState* play) {
+ if (EnBubble_IsPopped(this, play)) {
+ this->explosionCountdown = func_8089F59C(this);
+ this->actionFunc = EnBubble_Pop;
+ } else {
+ EnBubble_Fly(this, play);
+ this->actor.shape.yOffset = (this->modelHeight + 1.0f) * 16.0f;
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderSphere.base);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
+ }
+}
+
+void EnBubble_Pop(EnBubble* this, PlayState* play) {
+ if (EnBubble_Explosion(this, play) > -1) {
+ SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 60, NA_SE_EN_AWA_BREAK);
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void EnBubble_Disappear(EnBubble* this, PlayState* play) {
+ s32 temp_v0 = func_8089F8BC(this);
+
+ if (temp_v0 >= 0) {
+ this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
+ this->explosionCountdown = temp_v0;
+ this->actionFunc = EnBubble_Regrow;
+ }
+}
+
+void EnBubble_Regrow(EnBubble* this, PlayState* play) {
+ if (func_8089F908(this)) {
+ this->actionFunc = EnBubble_Wait;
+ }
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderSphere.base);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
+}
+
+void EnBubble_Update(Actor* thisx, PlayState* play) {
+ EnBubble* this = (EnBubble*)thisx;
+
+ Actor_UpdatePos(&this->actor);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 16.0f, 16.0f, 0.0f, 7);
+ this->actionFunc(this, play);
+ Actor_SetFocus(&this->actor, this->actor.shape.yOffset);
+}
+
+void EnBubble_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnBubble* this = (EnBubble*)thisx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (this->actionFunc != EnBubble_Disappear) {
+ func_8012C2DC(play->state.gfxCtx);
+ Math_SmoothStepToF(&this->modelRotSpeed, 16.0f, 0.2f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelEllipticity, 0.08f, 0.2f, 1000.0f, 0.0f);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(this->modelWidth + 1.0f, this->modelHeight + 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(DEGF_TO_RADF((f32)play->state.frames) * this->modelRotSpeed, MTXMODE_APPLY);
+ Matrix_Scale(this->modelEllipticity + 1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(DEGF_TO_RADF(-(f32)play->state.frames) * this->modelRotSpeed, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPDisplayList(POLY_XLU_DISP++, gBubbleDL);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ if (this->actionFunc != EnBubble_Disappear) {
+ this->actor.shape.shadowScale = (this->modelWidth + 1.0f) * 0.2f;
+ func_808A005C(this);
+ }
+}
diff --git a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h
index 2217b86b15..7affed807f 100644
--- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h
+++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h
@@ -2,6 +2,7 @@
#define Z_EN_BUBBLE_H
#include "global.h"
+#include "objects/object_bubble/object_bubble.h"
struct EnBubble;
@@ -10,7 +11,25 @@ typedef void (*EnBubbleActionFunc)(struct EnBubble*, PlayState*);
typedef struct EnBubble {
/* 0x000 */ Actor actor;
/* 0x144 */ EnBubbleActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x110];
+ /* 0x148 */ ColliderJntSph colliderSphere;
+ /* 0x168 */ ColliderJntSphElement colliderElements[2];
+ /* 0x1F4 */ Vec3f unk1F4; // set but never used
+ /* 0x1F4 */ Vec3f unk1F8; // randomly generated, set but never used
+ /* 0x200 */ s16 timer; // set to 8 when about to pop
+ /* 0x202 */ s16 explosionCountdown;
+ /* 0x204 */ UNK_TYPE1 pad204[4]; // unused
+ /* 0x208 */ f32 modelRotSpeed;
+ /* 0x20C */ f32 modelEllipticity;
+ /* 0x210 */ f32 unk_210; // set to 1.0f, never used
+ /* 0x214 */ f32 unk_214; // set to 1.0f, never used
+ /* 0x218 */ f32 modelWidth;
+ /* 0x21C */ f32 modelHeight;
+ /* 0x220 */ u8 bounceCount;
+ /* 0x224 */ Vec3f bounceDirection;
+ /* 0x230 */ Vec3f velocityFromBounce;
+ /* 0x23C */ Vec3f normalizedBumpVelocity;
+ /* 0x248 */ Vec3f velocityFromBump;
+ /* 0x254 */ f32 yVelocity;
} EnBubble; // size = 0x258
extern const ActorInit En_Bubble_InitVars;
diff --git a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
index 54a78442cc..0b909d61f3 100644
--- a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
+++ b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
@@ -234,7 +234,7 @@ void func_80AFE414(Actor* thisx, PlayState* play) {
func_8012C2DC(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_05AAB0);
+ gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -246,9 +246,9 @@ void func_80AFE4AC(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = func_801660B8(play, POLY_OPA_DISP);
POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gameplay_keep_Tex_05E6F0));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropRecoveryHeartTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_05F6F0);
+ gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -268,8 +268,8 @@ void func_80AFE650(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = func_801660B8(play, POLY_OPA_DISP);
POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gameplay_keep_Tex_05CEF0));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropBombTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_05F6F0);
+ gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Crow/z_en_crow.c b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
index e6980ba4f1..c04462c44b 100644
--- a/src/overlays/actors/ovl_En_Crow/z_en_crow.c
+++ b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
@@ -118,7 +118,7 @@ static s32 sDeadCount = 0;
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 88, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GUAY, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dai/z_en_dai.c b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
index 4f8d5eaaa2..31e3264092 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
@@ -639,7 +639,7 @@ void func_80B3F78C(EnDai* this, PlayState* play) {
};
s32 pad;
- if (play->actorCtx.unkB != 0) {
+ if (play->actorCtx.lensActorsDrawn) {
this->unk_1CE |= 0x40;
} else {
Actor_RecordUndrawnActor(play, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Death/z_en_death.c b/src/overlays/actors/ovl_En_Death/z_en_death.c
index edc240cd53..b0f03af7cb 100644
--- a/src/overlays/actors/ovl_En_Death/z_en_death.c
+++ b/src/overlays/actors/ovl_En_Death/z_en_death.c
@@ -131,7 +131,7 @@ static CollisionCheckInfoInit2 D_808C9A30 = { 20, 28, 90, 20, 100 };
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_808C9A60[] = {
ICHAIN_VEC3F(scale, 0, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 26, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GOMESS, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
index 15ae675a16..0f37266e20 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
@@ -109,7 +109,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 77, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_MAD_SCRUB, ICHAIN_CONTINUE),
ICHAIN_F32(gravity, -1, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2600, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
index eb77191503..65c11e0352 100644
--- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
+++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
@@ -253,7 +253,7 @@ static s32 D_8089E350 = 0;
static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 16, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_DINOLFOS, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 15, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
index 0d28281ef5..d663bcf740 100644
--- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
+++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
@@ -201,7 +201,7 @@ void func_80A5063C(EnDnb* this, PlayState* play) {
void EnDnb_Draw(Actor* thisx, PlayState* play) {
EnDnb* this = THIS;
- if (play->actorCtx.unk4 != 0) {
+ if (play->actorCtx.lensMaskSize != 0) {
func_80A50510(this, play);
} else {
func_80A5063C(this, play);
@@ -252,8 +252,8 @@ s32 func_80A5086C(EnDnbUnkStruct* arg0) {
}
s32 func_80A50950(EnDnbUnkStruct* arg0, PlayState* play2) {
- static TexturePtr D_80A50CBC[] = {
- gDust8Tex, gDust7Tex, gDust6Tex, gDust5Tex, gDust4Tex, gDust3Tex, gDust2Tex, gDust1Tex,
+ static TexturePtr sDustTextures[] = {
+ gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
PlayState* play = play2;
s32 isGfxSetup = false;
@@ -286,7 +286,7 @@ s32 func_80A50950(EnDnbUnkStruct* arg0, PlayState* play2) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A50CBC[idx]));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000020);
Matrix_Pop();
diff --git a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
index 45311b83f2..65e5417f33 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -273,7 +273,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 100, 100, 80 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 13, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_DODONGO, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 1400, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
index 901efc0d2c..c8b1c98231 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
@@ -242,7 +242,7 @@ void EnDragon_Init(Actor* thisx, PlayState* play) {
this->pythonIndex = EN_DRAGON_GET_PYTHON_INDEX(&this->actor);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->action = DEEP_PYTHON_ACTION_IDLE;
- this->actor.hintId = 0xE;
+ this->actor.hintId = TATL_HINT_ID_DEEP_PYTHON;
this->scale = 0.5f;
this->actor.flags &= ~ACTOR_FLAG_8000000;
@@ -317,7 +317,8 @@ void EnDragon_SpawnBubbles(EnDragon* this, PlayState* play, Vec3f basePos) {
sBubbleAccel.y = Rand_ZeroFloat(1.0f) * 20.0f * 3.0f;
scale = Rand_S16Offset(380, 240);
EffectSsDtBubble_SpawnCustomColor(play, &bubblePos, &sBubbleVelocity, &sBubbleAccel,
- &sBubblePrimColors[colorIndex], &sBubbleEnvColors[colorIndex], scale, 30, 0);
+ &sBubblePrimColors[colorIndex], &sBubbleEnvColors[colorIndex], scale, 30,
+ false);
}
}
diff --git a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h
index 9a0b53223f..6d5d93ec43 100644
--- a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h
+++ b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.h
@@ -15,7 +15,7 @@ typedef struct EnDyExtra {
/* 0x14C */ s16 unk14C;
/* 0x14E */ s16 unk14E;
/* 0x150 */ f32 unk150;
- /* 0x154 */ char unk154[0xC];
+ /* 0x154 */ UNK_TYPE1 unk154[0xC];
/* 0x160 */ Vec3f unk160;
} EnDyExtra; // size = 0x16C
diff --git a/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
index bc84c329b9..c7ea4f5b00 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -675,8 +675,7 @@ void func_8088DD34(EnElf* this, PlayState* play) {
!func_8088C804(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) {
Health_ChangeBy(play, 0x80);
if (this->fairyFlags & 0x200) {
- Parameter_AddMagic(play, ((void)0, gSaveContext.unk_3F30) +
- (gSaveContext.save.playerData.doubleMagic * 0x30) + 0x30);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
gSaveContext.jinxTimer = 0;
this->unk_254 = 50.0f;
@@ -1464,7 +1463,7 @@ void func_8089010C(Actor* thisx, PlayState* play) {
}
if (player->tatlTextId < 0) {
- thisx->flags |= 0x10000;
+ thisx->flags |= ACTOR_FLAG_10000;
}
if (Actor_ProcessTalkRequest(thisx, &play->state)) {
@@ -1481,7 +1480,7 @@ void func_8089010C(Actor* thisx, PlayState* play) {
thisx->update = func_8088FE64;
func_8088C51C(this, 3);
if (this->elfMsg != NULL) {
- this->elfMsg->flags |= 0x100;
+ this->elfMsg->flags |= ACTOR_FLAG_100;
thisx->cutscene = this->elfMsg->cutscene;
if (thisx->cutscene != -1) {
func_8088FD04(this);
@@ -1493,7 +1492,7 @@ void func_8089010C(Actor* thisx, PlayState* play) {
} else {
thisx->cutscene = -1;
}
- thisx->flags &= ~0x10000;
+ thisx->flags &= ~ACTOR_FLAG_10000;
} else if (this->unk_264 & 4) {
thisx->focus.pos = thisx->world.pos;
this->fairyFlags |= 0x10;
diff --git a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
index d0bc05b8b5..e50fc13cd7 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
@@ -62,7 +62,7 @@ void EnElfbub_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 16.0f, ActorShadow_DrawCircle, 0.2f);
- this->actor.hintId = 0x16;
+ this->actor.hintId = TATL_HINT_ID_IGOS_DU_IKANA;
Actor_SetScale(&this->actor, 1.25f);
this->actionFunc = EnElfbub_Idle;
@@ -113,7 +113,7 @@ void EnElfbub_Pop(EnElfbub* this, PlayState* play) {
velocity.y = Rand_ZeroOne() * 7.0f;
velocity.z = (Rand_ZeroOne() - 0.5f) * 7.0f;
EffectSsDtBubble_SpawnCustomColor(play, &pos, &velocity, &sAccel, &sPrimColor, &sEnvColor,
- Rand_S16Offset(100, 50), 25, 0);
+ Rand_S16Offset(100, 50), 25, false);
}
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 60, NA_SE_EN_AWA_BREAK);
@@ -161,7 +161,7 @@ void EnElfbub_Draw(Actor* thisx, PlayState* play2) {
Matrix_RotateZS(this->zRot * -1, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_bubble_DL_001000);
+ gSPDisplayList(POLY_XLU_DISP++, gBubbleDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
index ba8cb4f019..61457bf508 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
@@ -99,7 +99,7 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
break;
case ENELFGRP_2:
- if (gSaveContext.save.playerData.doubleMagic == true) {
+ if (gSaveContext.save.playerData.isDoubleMagicAcquired == true) {
func_80A396B0(this, 1);
}
break;
@@ -156,7 +156,7 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
func_80A396B0(this, 3);
this->unk_14A |= 2;
}
- } else if (gSaveContext.save.playerData.magicAcquired == true) {
+ } else if (gSaveContext.save.playerData.isMagicAcquired == true) {
func_80A396B0(this, 1);
}
} else {
@@ -477,8 +477,7 @@ void func_80A3A610(EnElfgrp* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->unk_144 == 60) {
- Parameter_AddMagic(play,
- ((void)0, gSaveContext.unk_3F30) + (gSaveContext.save.playerData.doubleMagic * 0x30) + 0x30);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
gSaveContext.healthAccumulator = 320;
}
diff --git a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
index 04ad98f8fa..fa465afbec 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
@@ -263,7 +263,7 @@ void EnElforg_MoveToTarget(EnElforg* this, Vec3f* targetPos) {
}
void func_80ACCBB8(EnElforg* this, PlayState* play) {
- play->actorCtx.unk5 |= 8;
+ play->actorCtx.flags |= ACTORCTX_FLAG_3;
}
void EnElforg_TrappedByBubble(EnElforg* this, PlayState* play) {
diff --git a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
index 8e68f92058..0305af8ef9 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
@@ -15,7 +15,6 @@ void EnEncount1_Update(Actor* thisx, PlayState* play);
void func_808E0954(EnEncount1* this, PlayState* play);
-#if 0
const ActorInit En_Encount1_InitVars = {
ACTOR_EN_ENCOUNT1,
ACTORCAT_PROP,
@@ -28,10 +27,129 @@ const ActorInit En_Encount1_InitVars = {
(ActorFunc)NULL,
};
-#endif
+static s16 sActorList[] = {
+ ACTOR_EN_GRASSHOPPER,
+ ACTOR_EN_WALLMAS,
+ ACTOR_EN_PR2,
+ ACTOR_EN_PR2,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount1/EnEncount1_Init.s")
+static s16 sActorParams[] = { 1, 0, 1, 3 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount1/func_808E0954.s")
+void EnEncount1_Init(Actor* thisx, PlayState* play) {
+ EnEncount1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount1/EnEncount1_Update.s")
+ if (this->actor.params <= 0) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+
+ this->actorType = ENENCOUNT1_GET_TYPE(&this->actor);
+ this->unk_14C = ENENCOUNT1_GET_7C0(&this->actor);
+ this->unk_154 = ENENCOUNT1_GET_PATH(&this->actor);
+ this->unk_158 = this->actor.world.rot.x;
+ this->unk_15C = this->actor.world.rot.y;
+ this->unk_160 = (this->actor.world.rot.z * 40.0f) + 120.0f;
+
+ if (this->unk_154 >= 0x3F) {
+ this->unk_154 = -1;
+ }
+ if (this->actor.world.rot.z < 0) {
+ this->unk_160 = -1.0f;
+ }
+ if (this->actorType == EN_ENCOUNT1_SKULLFISH_2) {
+ this->unk_15A = ENENCOUNT1_GET_PATH(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->unk_15A, 0x3F);
+ this->unk_154 = -1;
+ this->unk_160 = -1.0f;
+ }
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actionFunc = func_808E0954;
+}
+
+void func_808E0954(EnEncount1* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ Vec3f spawnPos;
+ f32 sp64;
+ f32 temp_fv0_2;
+ s16 sp5E;
+ s16 actorList;
+ s32 actorParams;
+ CollisionPoly* sp54;
+ s32 sp50;
+
+ if (((this->unk_14E >= this->unk_14C) || ((this->unk_160 > 0.0f) && (this->unk_160 < this->actor.xzDistToPlayer)) ||
+ ((this->unk_154 > 0) && (this->unk_154 <= this->unk_152)))) {
+ return;
+ } else if (this->unk_156 != 0) {
+ this->unk_156++;
+ if (this->unk_156 < this->unk_158) {
+ return;
+ }
+ }
+
+ this->unk_156 = 0;
+ switch (this->actorType) {
+ case EN_ENCOUNT1_GRASSHOPPER:
+ sp64 = randPlusMinusPoint5Scaled(40.0f) + 200.0f;
+ sp5E = player->actor.shape.rot.y;
+ if (this->unk_14E & 1) {
+ sp5E = -sp5E;
+ sp64 = randPlusMinusPoint5Scaled(20.0f) + 100.0f;
+ }
+ spawnPos.x = player->actor.world.pos.x + (Math_SinS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ spawnPos.y = player->actor.floorHeight + 120.0f;
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ temp_fv0_2 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp54, &sp50, &this->actor, &spawnPos);
+ if ((temp_fv0_2 <= BGCHECK_Y_MIN) ||
+ ((player->actor.depthInWater != BGCHECK_Y_MIN) &&
+ (temp_fv0_2 < (player->actor.world.pos.y - player->actor.depthInWater)))) {
+ return;
+ }
+ spawnPos.y = temp_fv0_2;
+ break;
+
+ case EN_ENCOUNT1_WALLMASTER:
+ Math_Vec3f_Copy(&spawnPos, &player->actor.world.pos);
+ break;
+
+ case EN_ENCOUNT1_SKULLFISH:
+ sp64 = randPlusMinusPoint5Scaled(250.0f) + 500.0f;
+ sp5E = player->actor.shape.rot.y;
+ spawnPos.x = player->actor.world.pos.x + Math_SinS(sp5E) * sp64 + randPlusMinusPoint5Scaled(40.0f);
+ spawnPos.y = player->actor.world.pos.y - Rand_ZeroFloat(20.0f);
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ temp_fv0_2 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp54, &sp50, &this->actor, &spawnPos);
+ if ((!(player->stateFlags1 & 0x8000000) || (temp_fv0_2 <= (BGCHECK_Y_MIN)) ||
+ (player->actor.depthInWater < temp_fv0_2))) {
+ return;
+ }
+ break;
+
+ case EN_ENCOUNT1_SKULLFISH_2:
+ if ((this->path != NULL) && (!SubS_CopyPointFromPath(this->path, 0, &spawnPos))) {
+ Actor_MarkForDeath(&this->actor);
+ }
+ break;
+ }
+
+ actorList = sActorList[this->actorType];
+ actorParams = sActorParams[this->actorType];
+ if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, actorList, spawnPos.x, spawnPos.y, spawnPos.z, 0, 0, 0,
+ actorParams) != NULL) {
+ this->unk_14E++;
+ if (this->unk_154 > 0) {
+ this->unk_152++;
+ }
+
+ if ((this->unk_14E >= this->unk_14C) && (this->unk_158 != 0)) {
+ this->unk_156 = 1;
+ }
+ }
+}
+
+void EnEncount1_Update(Actor* thisx, PlayState* play) {
+ EnEncount1* this = THIS;
+
+ this->actionFunc(this, play);
+}
diff --git a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
index d625f21519..8906d523ef 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
@@ -3,6 +3,17 @@
#include "global.h"
+#define ENENCOUNT1_GET_TYPE(thisx) (((thisx)->params >> 11) & 0x1F)
+#define ENENCOUNT1_GET_7C0(thisx) (((thisx)->params >> 6) & 0x1F)
+#define ENENCOUNT1_GET_PATH(thisx) ((thisx)->params & 0x3F)
+
+typedef enum EnEncount1Enemy {
+ /* 0x0 */ EN_ENCOUNT1_GRASSHOPPER,
+ /* 0x1 */ EN_ENCOUNT1_WALLMASTER,
+ /* 0x2 */ EN_ENCOUNT1_SKULLFISH,
+ /* 0x3 */ EN_ENCOUNT1_SKULLFISH_2,
+} EnEncount1Enemy;
+
struct EnEncount1;
typedef void (*EnEncount1ActionFunc)(struct EnEncount1*, PlayState*);
@@ -10,11 +21,17 @@ typedef void (*EnEncount1ActionFunc)(struct EnEncount1*, PlayState*);
typedef struct EnEncount1 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnEncount1ActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x6];
+ /* 0x148 */ Path* path;
+ /* 0x14C */ s16 unk_14C;
/* 0x14E */ s16 unk_14E;
- /* 0x150 */ char unk_150[0xA];
+ /* 0x150 */ s16 actorType;
+ /* 0x152 */ s16 unk_152;
+ /* 0x154 */ s16 unk_154;
+ /* 0x156 */ s16 unk_156;
+ /* 0x158 */ s16 unk_158;
/* 0x15A */ s16 unk_15A;
- /* 0x15C */ char unk_15C[0x8];
+ /* 0x15C */ s32 unk_15C;
+ /* 0x160 */ f32 unk_160;
} EnEncount1; // size = 0x164
extern const ActorInit En_Encount1_InitVars;
diff --git a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
index d7c0cc5618..d771f3511c 100644
--- a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
+++ b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
@@ -114,7 +114,7 @@ void EnEncount2_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.targetMode = 6;
this->dyna.actor.colChkInfo.health = 1;
this->scale = 0.1;
- this->switchFlag = GET_ENCOUNT2_SWITCH_FLAG(this);
+ this->switchFlag = ENCOUNT2_GET_SWITCH_FLAG(&this->dyna.actor);
if (this->switchFlag == 0x7F) {
this->switchFlag = -1;
@@ -137,6 +137,7 @@ void EnEncount2_Init(Actor* thisx, PlayState* play) {
void EnEncount2_Destroy(Actor* thisx, PlayState* play) {
EnEncount2* this = THIS;
+
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
Collider_DestroyJntSph(play, &this->collider);
}
diff --git a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.h b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.h
index 8f2a6c66a0..9927653e2d 100644
--- a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.h
+++ b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.h
@@ -33,7 +33,7 @@ typedef struct EnEncount2 {
/* 0x01D0 */ EnEncount2Effect effects[EN_ENCOUNT2_EFFECT_COUNT];
} EnEncount2; // size = 0x2A70
-#define GET_ENCOUNT2_SWITCH_FLAG(actor) ((s16)(((Actor*)actor)->params & 0x7F))
+#define ENCOUNT2_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
extern const ActorInit En_Encount2_InitVars;
diff --git a/src/overlays/actors/ovl_En_Fall/z_en_fall.c b/src/overlays/actors/ovl_En_Fall/z_en_fall.c
index 3da09bb3b1..df4597dcae 100644
--- a/src/overlays/actors/ovl_En_Fall/z_en_fall.c
+++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.c
@@ -279,7 +279,7 @@ void EnFall_Setup(EnFall* this, PlayState* play) {
this->actor.draw = NULL;
this->actionFunc = EnFall_MoonsTear_Fall;
Actor_SetScale(&this->actor, 0.02f);
- if (!(play->actorCtx.unk5 & 2)) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
Actor_MarkForDeath(&this->actor);
}
moon = EnFall_MoonsTear_GetTerminaFieldMoon(play);
diff --git a/src/overlays/actors/ovl_En_Famos/z_en_famos.c b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
index 8cebddded9..b6b93aded4 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
@@ -154,7 +154,7 @@ static AnimatedMaterial* sEmblemAnimatedMats[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 15, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_DEATH_ARMOS, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3500, ICHAIN_STOP),
};
@@ -166,7 +166,7 @@ void EnFamos_Init(Actor* thisx, PlayState* play) {
s32 i;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (GET_FAMOS_PATH(thisx) != 0xFF) {
+ if (FAMOS_GET_PATH(thisx) != 0xFF) {
path = &play->setupPathList[this->actor.params];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
this->pathNodeCount = path->count;
@@ -193,7 +193,7 @@ void EnFamos_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = 250;
this->baseHeight = this->actor.world.pos.y;
// params: [this->actor.shape.rot.x] is used to set aggro distance
- this->aggroDistance = (GET_FAMOS_AGGRO_DISTANCE(thisx) <= 0) ? (200.0f) : (this->actor.shape.rot.x * 40.0f * 0.1f);
+ this->aggroDistance = (FAMOS_GET_AGGRO_DISTANCE(thisx) <= 0) ? (200.0f) : (this->actor.shape.rot.x * 40.0f * 0.1f);
this->actor.shape.rot.x = 0;
this->actor.world.rot.x = 0;
this->hasFinishedRotating = true;
diff --git a/src/overlays/actors/ovl_En_Famos/z_en_famos.h b/src/overlays/actors/ovl_En_Famos/z_en_famos.h
index c446c21131..874da90346 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.h
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.h
@@ -15,8 +15,8 @@ typedef struct EnFamosRock {
/* 0x20 */ f32 scale;
} EnFamosRock; // size = 0x24
-#define GET_FAMOS_PATH(thisx) (thisx->params)
-#define GET_FAMOS_AGGRO_DISTANCE(thisx) (thisx->shape.rot.x)
+#define FAMOS_GET_PATH(thisx) ((thisx)->params)
+#define FAMOS_GET_AGGRO_DISTANCE(thisx) ((thisx)->shape.rot.x)
// stateTimer gets reused:
// after spotting player, counts frames until first attack (8)
diff --git a/src/overlays/actors/ovl_En_Fg/z_en_fg.c b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
index 8ad22ff53d..cacc2e728f 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.c
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
@@ -444,8 +444,8 @@ void EnFg_UpdateDust(EnFgEffectDust* dustEffect) {
}
}
-TexturePtr sDustTex[] = {
- gDust8Tex, gDust7Tex, gDust6Tex, gDust5Tex, gDust4Tex, gDust3Tex, gDust2Tex, gDust1Tex,
+static TexturePtr sDustTextures[] = {
+ gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
void EnFg_DrawDust(PlayState* play, EnFgEffectDust* dustEffect) {
@@ -475,7 +475,7 @@ void EnFg_DrawDust(PlayState* play, EnFgEffectDust* dustEffect) {
Matrix_Scale(dustEffect->xyScale, dustEffect->xyScale, 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
index = 0.5f * dustEffect->timer;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTex[index]));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B338);
}
}
diff --git a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
index d8cbe91f50..3ac02d9c94 100644
--- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
+++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
@@ -149,19 +149,19 @@ void EnFirefly_Init(Actor* thisx, PlayState* play) {
this->auraType = KEESE_AURA_FIRE;
this->timer = Rand_S16Offset(20, 60);
this->actor.shape.rot.x = 0x1554;
- this->actor.hintId = 0x11; // Fire Keese
+ this->actor.hintId = TATL_HINT_ID_FIRE_KEESE;
this->maxAltitude = this->actor.home.pos.y;
this->actionFunc = EnFirefly_FlyIdle;
} else if (this->actor.params == KEESE_ICE_FLY) {
this->auraType = KEESE_AURA_ICE;
this->collider.info.toucher.effect = 2; // Freeze
- this->actor.hintId = 0x56; // Ice Keese
+ this->actor.hintId = TATL_HINT_ID_ICE_KEESE;
this->maxAltitude = this->actor.home.pos.y + 100.0f;
this->actionFunc = EnFirefly_FlyIdle;
} else {
this->auraType = KEESE_AURA_NONE;
this->collider.info.toucher.effect = 0; // Nothing
- this->actor.hintId = 0x12; // Keese
+ this->actor.hintId = TATL_HINT_ID_KEESE;
this->maxAltitude = this->actor.home.pos.y + 100.0f;
this->actionFunc = EnFirefly_Perch;
}
@@ -188,7 +188,7 @@ void EnFirefly_Extinguish(EnFirefly* this) {
this->currentType = KEESE_NORMAL;
this->collider.info.toucher.effect = 0; // Nothing
this->auraType = KEESE_AURA_NONE;
- this->actor.hintId = 0x12; // Keese
+ this->actor.hintId = TATL_HINT_ID_KEESE;
}
void EnFirefly_Ignite(EnFirefly* this) {
@@ -196,7 +196,7 @@ void EnFirefly_Ignite(EnFirefly* this) {
this->currentType = KEESE_FIRE;
this->collider.info.toucher.effect = 1; // Fire
this->auraType = KEESE_AURA_FIRE;
- this->actor.hintId = 0x11; // Fire Keese
+ this->actor.hintId = TATL_HINT_ID_FIRE_KEESE;
}
}
@@ -739,7 +739,7 @@ s32 EnFirefly_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
Gfx** gfx) {
EnFirefly* this = THIS;
- if (this->isInvisible && (play->actorCtx.unk4 != 0x64)) {
+ if (this->isInvisible && (play->actorCtx.lensMaskSize != LENS_MASK_ACTIVE_SIZE)) {
*dList = NULL;
} else if (limbIndex == 1) {
pos->y += 2300.0f;
diff --git a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
index 5f79700c96..67dfa98f77 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
@@ -34,7 +34,7 @@ typedef struct EnFish2 {
/* 0x02C8 */ u8 unk_2C8;
/* 0x02CA */ s16 subCamId;
/* 0x02CC */ f32 unk_2CC;
- /* 0x02D0 */ char unk_2D0[0x4];
+ /* 0x02D0 */ UNK_TYPE1 unk_2D0[0x4];
/* 0x02D4 */ f32 unk_2D4;
/* 0x02D8 */ f32 unk_2D8;
/* 0x02DC */ Vec3f subCamEye;
@@ -53,7 +53,6 @@ typedef struct EnFish2 {
/* 0x0348 */ s16 unk_348;
/* 0x034A */ s16 unk_34A;
/* 0x034C */ s16 unk_34C;
- /* 0x034E */ char unk_34E[0x02];
/* 0x0350 */ Actor* unk_350;
/* 0x0354 */ struct EnFish2* unk_354;
/* 0x0358 */ ColliderJntSph collider;
diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
index 59e3abdb4f..2aabec27f2 100644
--- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
+++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
@@ -830,7 +830,7 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
thisx->focus.pos = thisx->world.pos;
thisx->focus.pos.y += 75.0f;
- thisx->flags |= 9;
+ thisx->flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
if (sLinkAge != 1) {
// HIGH_SCORE(HS_FISHING) from OoT
@@ -960,7 +960,7 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
this->unk_150 = 100;
func_800BC154(play, &play->actorCtx, thisx, ACTORCAT_PROP);
thisx->targetMode = 0;
- thisx->flags |= 9;
+ thisx->flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
} else {
this->unk_150 = 10;
diff --git a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
index c5e7b24f14..411d837121 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
@@ -129,7 +129,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 49, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_FLOORMASTER, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 5500, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
index fe7a91667e..0c00c60404 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
@@ -261,26 +261,26 @@ u8 EnFsn_SetCursorIndexFromNeutral(EnFsn* this) {
}
void EnFsn_CursorLeftRight(EnFsn* this) {
- u8 cursorScan = this->cursorIdx;
+ u8 cursorScan = this->cursorIndex;
if (this->stickAccumX > 0) {
if (cursorScan != this->totalSellingItems - 1) {
while (cursorScan != this->totalSellingItems - 1) {
cursorScan++;
if (this->itemIds[cursorScan] != -1) {
- this->cursorIdx = cursorScan;
+ this->cursorIndex = cursorScan;
break;
}
}
} else if (this->itemIds[cursorScan] != -1) {
- this->cursorIdx = cursorScan;
+ this->cursorIndex = cursorScan;
}
} else if (this->stickAccumX < 0) {
if (cursorScan != 0) {
while (cursorScan != 0) {
cursorScan--;
if (this->itemIds[cursorScan] != -1) {
- this->cursorIdx = cursorScan;
+ this->cursorIndex = cursorScan;
break;
} else if (cursorScan == 0) {
play_sound(NA_SE_SY_CURSOR);
@@ -294,7 +294,7 @@ void EnFsn_CursorLeftRight(EnFsn* this) {
this->drawCursor = 0;
this->actionFunc = EnFsn_LookToShopkeeperFromShelf;
if (this->itemIds[cursorScan] != -1) {
- this->cursorIdx = cursorScan;
+ this->cursorIndex = cursorScan;
}
}
}
@@ -417,7 +417,7 @@ s32 EnFsn_TestEndInteraction(EnFsn* this, PlayState* play, Input* input) {
s32 EnFsn_TestCancelOption(EnFsn* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
return true;
}
return false;
@@ -429,7 +429,7 @@ void EnFsn_UpdateCursorPos(EnFsn* this, PlayState* play) {
f32 xOffset = 0.0f;
f32 yOffset = 17.0f;
- Actor_GetScreenPos(play, &this->items[this->cursorIdx]->actor, &x, &y);
+ Actor_GetScreenPos(play, &this->items[this->cursorIndex]->actor, &x, &y);
this->cursorPos.x = x + xOffset;
this->cursorPos.y = y + yOffset;
this->cursorPos.z = 1.2f;
@@ -466,9 +466,9 @@ s32 EnFsn_HasPlayerSelectedItem(EnFsn* this, PlayState* play, Input* input) {
return true;
}
if (EnFsn_TestItemSelected(play)) {
- if (!this->items[this->cursorIdx]->isOutOfStock) {
+ if (!this->items[this->cursorIndex]->isOutOfStock) {
this->prevActionFunc = this->actionFunc;
- func_80151938(play, this->items[this->cursorIdx]->choiceTextId);
+ func_80151938(play, this->items[this->cursorIndex]->choiceTextId);
play_sound(NA_SE_SY_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
@@ -522,7 +522,7 @@ void EnFsn_UpdateJoystickInputState(EnFsn* this, PlayState* play) {
void EnFsn_PositionSelectedItem(EnFsn* this) {
Vec3f selectedItemPosition = { 13.0f, 38.0f, -71.0f };
- u8 i = this->cursorIdx;
+ u8 i = this->cursorIndex;
EnGirlA* item = this->items[i];
Vec3f worldPos;
@@ -572,7 +572,7 @@ void EnFsn_UpdateItemSelectedProperty(EnFsn* this) {
this->drawCursor == 0) {
(*items)->isSelected = false;
} else {
- (*items)->isSelected = (i == this->cursorIdx) ? true : false;
+ (*items)->isSelected = (i == this->cursorIndex) ? true : false;
}
}
}
@@ -712,7 +712,7 @@ void EnFsn_InitShop(EnFsn* this, PlayState* play) {
}
this->blinkTimer = 20;
this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
- this->eyeTextureIdx = 0;
+ this->eyeTexIndex = 0;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnFsn_Idle;
}
@@ -995,7 +995,7 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) {
void EnFsn_GiveItem(EnFsn* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
- if ((this->isSelling == true) && (this->items[this->cursorIdx]->getItemId == GI_MASK_ALL_NIGHT)) {
+ if ((this->isSelling == true) && (this->items[this->cursorIndex]->getItemId == GI_MASK_ALL_NIGHT)) {
func_80151BB4(play, 45);
func_80151BB4(play, 3);
}
@@ -1005,7 +1005,7 @@ void EnFsn_GiveItem(EnFsn* this, PlayState* play) {
}
this->actionFunc = EnFsn_SetupResumeInteraction;
} else if (this->isSelling == true) {
- Actor_PickUp(&this->actor, play, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
} else {
Actor_PickUp(&this->actor, play, this->getItemId, 300.0f, 300.0f);
}
@@ -1086,7 +1086,7 @@ void EnFsn_LookToShelf(EnFsn* this, PlayState* play) {
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
EnFsn_UpdateCursorPos(this, play);
this->actionFunc = EnFsn_BrowseShelf;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
} else {
ActorCutscene_SetIntentToPlay(this->cutscene);
}
@@ -1096,7 +1096,7 @@ void EnFsn_LookToShelf(EnFsn* this, PlayState* play) {
void EnFsn_BrowseShelf(EnFsn* this, PlayState* play) {
u8 talkstate = Message_GetState(&play->msgCtx);
s32 pad;
- u8 prevCursorIdx = this->cursorIdx;
+ u8 prevCursorIdx = this->cursorIndex;
if (!EnFsn_ReturnItemToShelf(this)) {
this->delayTimer = 3;
@@ -1110,9 +1110,9 @@ void EnFsn_BrowseShelf(EnFsn* this, PlayState* play) {
func_8011552C(play, 6);
if (!EnFsn_HasPlayerSelectedItem(this, play, CONTROLLER1(&play->state))) {
EnFsn_CursorLeftRight(this);
- if (this->cursorIdx != prevCursorIdx) {
+ if (this->cursorIndex != prevCursorIdx) {
play_sound(NA_SE_SY_CURSOR);
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
}
}
}
@@ -1144,7 +1144,7 @@ void EnFsn_LookToShopkeeperFromShelf(EnFsn* this, PlayState* play) {
}
void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
switch (item->canBuyFunc(play, item)) {
case CANBUY_RESULT_SUCCESS_2:
@@ -1156,23 +1156,23 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
this->cutsceneState = ENFSN_CUTSCENESTATE_STOPPED;
}
func_8019F208();
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->buyFanfareFunc(play, item);
- Actor_PickUp(&this->actor, play, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
Interface_ChangeAlpha(50);
this->drawCursor = 0;
this->shopItemSelectedTween = 0.0f;
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->boughtFunc(play, item);
- if (this->stolenItem1 == this->cursorIdx) {
+ if (this->stolenItem1 == this->cursorIndex) {
SET_STOLEN_ITEM_1(STOLEN_ITEM_NONE);
- } else if (this->stolenItem2 == this->cursorIdx) {
+ } else if (this->stolenItem2 == this->cursorIndex) {
SET_STOLEN_ITEM_2(STOLEN_ITEM_NONE);
}
this->numSellingItems--;
- this->itemIds[this->cursorIdx] = -1;
+ this->itemIds[this->cursorIndex] = -1;
this->actionFunc = EnFsn_GiveItem;
break;
case CANBUY_RESULT_NEED_RUPEES:
@@ -1218,7 +1218,7 @@ void EnFsn_SelectItem(EnFsn* this, PlayState* play) {
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
}
}
}
@@ -1227,7 +1227,7 @@ void EnFsn_SelectItem(EnFsn* this, PlayState* play) {
void EnFsn_PlayerCannotBuy(EnFsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
}
}
@@ -1326,16 +1326,16 @@ void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, PlayState* play) {
void EnFsn_FaceShopkeeperSelling(EnFsn* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
- u8 cursorIdx;
+ u8 cursorIndex;
if (talkState == TEXT_STATE_CHOICE) {
func_8011552C(play, 6);
if (!EnFsn_TestEndInteraction(this, play, CONTROLLER1(&play->state)) &&
(!Message_ShouldAdvance(play) || !EnFsn_FacingShopkeeperDialogResult(this, play)) &&
this->stickAccumX > 0) {
- cursorIdx = EnFsn_SetCursorIndexFromNeutral(this);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnFsn_SetCursorIndexFromNeutral(this);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
this->actionFunc = EnFsn_LookToShelf;
func_8011552C(play, 6);
this->stickRightPrompt.isEnabled = false;
@@ -1394,13 +1394,13 @@ void EnFsn_Blink(EnFsn* this) {
s16 decr = this->blinkTimer - 1;
if (decr >= 3) {
- this->eyeTextureIdx = 0;
+ this->eyeTexIndex = 0;
this->blinkTimer = decr;
} else if (decr == 0) {
- this->eyeTextureIdx = 2;
+ this->eyeTexIndex = 2;
this->blinkTimer = (s32)(Rand_ZeroOne() * 60.0f) + 20;
} else {
- this->eyeTextureIdx = 1;
+ this->eyeTexIndex = 1;
this->blinkTimer = decr;
}
}
@@ -1427,7 +1427,7 @@ void EnFsn_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->blinkTimer = 20;
- this->eyeTextureIdx = 0;
+ this->eyeTexIndex = 0;
this->actor.flags |= ACTOR_FLAG_1;
this->actor.targetMode = 0;
this->animIndex = FSN_ANIM_IDLE;
@@ -1472,6 +1472,7 @@ void EnFsn_DrawCursor(EnFsn* this, PlayState* play, f32 x, f32 y, f32 z, u8 draw
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
+
if (drawCursor != 0) {
func_8012C654(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
@@ -1486,6 +1487,7 @@ void EnFsn_DrawCursor(EnFsn* this, PlayState* play, f32 x, f32 y, f32 z, u8 draw
dsdx = (1.0f / z) * 1024.0f;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, 0, 0, dsdx, dsdx);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1501,6 +1503,7 @@ void EnFsn_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32 y
s32 dtdy;
OPEN_DISPS(play->state.gfxCtx);
+
gDPPipeSync(OVERLAY_DISP++);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, r, g, b, a);
@@ -1517,6 +1520,7 @@ void EnFsn_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32 y
dtdy = dy * unk;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, dsdx, dtdy);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1525,6 +1529,7 @@ void EnFsn_DrawStickDirectionPrompts(EnFsn* this, PlayState* play) {
s32 drawStickLeftPrompt = this->stickRightPrompt.isEnabled;
OPEN_DISPS(play->state.gfxCtx);
+
if (drawStickRightPrompt || drawStickLeftPrompt) {
func_8012C654(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -1559,6 +1564,7 @@ void EnFsn_DrawStickDirectionPrompts(EnFsn* this, PlayState* play) {
this->stickRightPrompt.texZ, 0, 0, 1.0f, 1.0f);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1604,8 +1610,10 @@ void EnFsn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
this->actor.focus.pos.z = this->actor.world.pos.z;
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, gFsnGlassesFrameDL);
gSPDisplayList(POLY_OPA_DISP++, gFsnGlassesLensesDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1617,9 +1625,10 @@ void EnFsn_Draw(Actor* thisx, PlayState* play) {
s16 i;
OPEN_DISPS(play->state.gfxCtx);
+
func_8012C5B0(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTextureIdx]));
- gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTextureIdx]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnFsn_OverrideLimbDraw, EnFsn_PostLimbDraw, &this->actor);
@@ -1631,5 +1640,6 @@ void EnFsn_Draw(Actor* thisx, PlayState* play) {
EnFsn_DrawCursor(this, play, this->cursorPos.x, this->cursorPos.y, this->cursorPos.z, this->drawCursor);
EnFsn_DrawStickDirectionPrompts(this, play);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
index 9479e982ea..6bf337be73 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
@@ -30,7 +30,7 @@ typedef struct EnFsn {
/* 0x27A */ Vec3s unk27A; // Set but never used
/* 0x280 */ Vec3s jointTable[FSN_LIMB_MAX + 1]; // Note: adding 1 to FSN_LIMB_MAX due to bug in object_fsn, see bug in object_fsn.xml
/* 0x2F2 */ Vec3s morphTable[FSN_LIMB_MAX + 1];
- /* 0x364 */ s16 eyeTextureIdx;
+ /* 0x364 */ s16 eyeTexIndex;
/* 0x366 */ s16 blinkTimer;
/* 0x368 */ s16 cutsceneState;
/* 0x36A */ s16 cutscene;
@@ -41,7 +41,7 @@ typedef struct EnFsn {
/* 0x374 */ s16 price;
/* 0x376 */ u16 textId;
/* 0x378 */ u8 isSelling;
- /* 0x379 */ u8 cursorIdx;
+ /* 0x379 */ u8 cursorIndex;
/* 0x37C */ s32 getItemId;
/* 0x380 */ s16 stolenItem1;
/* 0x382 */ s16 stolenItem2;
diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
index 5e3b46fe6e..6b0a7e3b96 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -651,9 +651,8 @@ void func_80962A10(EnFu* this, PlayState* play) {
this->unk_546 = 1;
}
- if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && gSaveContext.save.playerData.magicAcquired) {
- Parameter_AddMagic(play,
- ((void)0, gSaveContext.unk_3F30) + (gSaveContext.save.playerData.doubleMagic * 48) + 48);
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && gSaveContext.save.playerData.isMagicAcquired) {
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
func_80962F10(this);
@@ -1139,7 +1138,7 @@ void func_80963DE4(EnFu* this, PlayState* play) {
}
void func_80963EAC(EnFu* this, PlayState* play) {
- if (gSaveContext.save.playerData.magicAcquired) {
+ if (gSaveContext.save.playerData.isMagicAcquired) {
if (this->unk_540 == 1) {
Message_StartTextbox(play, 0x2847, &this->actor);
this->unk_552 = 0x2847;
@@ -1461,7 +1460,7 @@ void func_80964950(PlayState* play, EnFuUnkStruct* ptr, s32 len) {
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(ptr->unk_00, ptr->unk_00, ptr->unk_00, MTXMODE_APPLY);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gameplay_keep_Tex_05E6F0));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropRecoveryHeartTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_mu_DL_00B0E0);
}
diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.h b/src/overlays/actors/ovl_En_Fu/z_en_fu.h
index 9ed3b69c5a..e35c961e73 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.h
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.h
@@ -12,12 +12,12 @@ typedef void (*EnFuActionFunc)(struct EnFu*, PlayState*);
typedef struct {
/* 0x00 */ f32 unk_00;
- /* 0x04 */ char unk_04[0x4];
+ /* 0x04 */ UNK_TYPE1 unk_04[0x4];
/* 0x08 */ Vec3f unk_08;
/* 0x14 */ Vec3f unk_14;
/* 0x20 */ Vec3f unk_20;
/* 0x2C */ s16 unk_2C;
- /* 0x2E */ char unk_2E[0x8];
+ /* 0x2E */ UNK_TYPE1 unk_2E[0x8];
/* 0x36 */ u8 unk_36;
/* 0x37 */ u8 unk_37;
} EnFuUnkStruct; // size = 0x38
@@ -36,7 +36,7 @@ typedef struct EnFu {
/* 0x520 */ s32 unk_520;
/* 0x524 */ s16 unk_524[3];
/* 0x52A */ s16 unk_52A[3];
- /* 0x530 */ char unk530[0x8];
+ /* 0x530 */ UNK_TYPE1 unk530[0x8];
/* 0x538 */ Vec3s* unk_538;
/* 0x53C */ s16 unk_53C;
/* 0x53E */ s16 unk_53E;
diff --git a/src/overlays/actors/ovl_En_Fz/z_en_fz.c b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
index 00c47b1119..198166b007 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.c
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
@@ -156,7 +156,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 59, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_FREEZARD, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1400, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
diff --git a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
index c2c42fa592..e011933787 100644
--- a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
+++ b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
@@ -55,9 +55,8 @@ static ColliderCylinderInit sCylinderInit = {
{ 10, 30, 0, { 0, 0, 0 } },
};
-static TexturePtr sRupeeTex[] = {
- gameplay_keep_Tex_061FC0, gameplay_keep_Tex_061FE0, gameplay_keep_Tex_062000,
- gameplay_keep_Tex_062040, gameplay_keep_Tex_062020,
+static TexturePtr sRupeeTextures[] = {
+ gRupeeGreenTex, gRupeeBlueTex, gRupeeRedTex, gRupeeOrangeTex, gRupeePurpleTex,
};
static Color_RGBA8 sPrimColor = { 255, 255, 255, 255 };
@@ -185,8 +184,8 @@ void EnGamelupy_Draw(Actor* thisx, PlayState* play) {
func_8012C28C(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeTex[this->rupeeIndex]));
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_0622C0);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeTextures[this->rupeeIndex]));
+ gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Gg/z_en_gg.c b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
index 5c46061856..e2ebab0d5e 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
@@ -231,7 +231,7 @@ void func_80B35450(EnGg* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
- func_800B90F4(play);
+ Actor_DeactivateLens(play);
}
this->unk_308 = 1;
this->actionFunc = func_80B352A4;
@@ -682,7 +682,7 @@ void EnGg_Destroy(Actor* thisx, PlayState* play) {
void EnGg_Update(Actor* thisx, PlayState* play) {
EnGg* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
this->actor.flags |= ACTOR_FLAG_80;
this->actor.flags |= ACTOR_FLAG_1;
} else {
diff --git a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
index 9726a693a1..ebbaaca7f0 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
@@ -421,7 +421,7 @@ void EnGg2_Destroy(Actor* thisx, PlayState* play) {
void EnGg2_Update(Actor* thisx, PlayState* play) {
EnGg2* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
this->actor.flags |= ACTOR_FLAG_80;
this->actor.flags |= ACTOR_FLAG_1;
if ((this->unk_2EE == 5) && (this->unk_2EE == 7)) {
@@ -443,7 +443,7 @@ void EnGg2_Update(Actor* thisx, PlayState* play) {
if ((this->unk_2EE == 5) || (this->unk_2EE == 7)) {
func_800B9010(&this->actor, NA_SE_EN_SHARP_FLOAT - SFX_FLAG);
- if ((play->actorCtx.unk4 == 100) && ((play->state.frames % 4) == 0)) {
+ if ((play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) && ((play->state.frames % 4) == 0)) {
func_80B3B4B0(this, play);
}
}
diff --git a/src/overlays/actors/ovl_En_Gk/z_en_gk.c b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
index 2042d2b568..d3dfcd6bf1 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -297,9 +297,9 @@ void func_80B509A8(EnGk* this, PlayState* play) {
}
EffectSsDtBubble_SpawnCustomColor(play, &this->unk_2E8, &this->unk_300, &sp4C, &D_80B533A0, &D_80B533A4,
- Rand_S16Offset(15, 15), phi_s1, 0);
+ Rand_S16Offset(15, 15), phi_s1, false);
EffectSsDtBubble_SpawnCustomColor(play, &this->unk_2F4, &this->unk_30C, &sp4C, &D_80B533A0, &D_80B533A4,
- Rand_S16Offset(15, 15), phi_s1, 0);
+ Rand_S16Offset(15, 15), phi_s1, false);
}
void func_80B50B38(EnGk* this, PlayState* play) {
@@ -724,8 +724,7 @@ void func_80B51B40(EnGk* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
- Parameter_AddMagic(play, ((void)0, gSaveContext.unk_3F30) +
- (gSaveContext.save.playerData.doubleMagic * 0x30) + 0x30);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
} else {
this->actionFunc = func_80B51760;
}
diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
index 3ad077fec9..3faf24a1c2 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -963,7 +963,8 @@ s32 func_8094F53C(EnGm* this, PlayState* play) {
this->unk_18C(this, play);
}
- if ((this->unk_3E8 == 6) && !(play->actorCtx.unk5 & 0x20) && Animation_OnFrame(&this->skelAnime, 20.0f)) {
+ if ((this->unk_3E8 == 6) && !(play->actorCtx.flags & ACTORCTX_FLAG_5) &&
+ Animation_OnFrame(&this->skelAnime, 20.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO);
}
diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.c b/src/overlays/actors/ovl_En_Go/z_en_go.c
index 491e1c95e5..e5775d1296 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.c
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.c
@@ -299,8 +299,8 @@ void func_80A1143C(EnGoStruct* ptr, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4
}
void func_80A115B4(EnGoStruct* ptr, PlayState* play) {
- static TexturePtr D_80A16644[] = {
- gDust8Tex, gDust7Tex, gDust6Tex, gDust5Tex, gDust4Tex, gDust3Tex, gDust2Tex, gDust1Tex,
+ static TexturePtr sDustTextures[] = {
+ gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
static Color_RGBA8 D_80A16664[] = {
{ 255, 255, 255, 0 },
@@ -341,7 +341,7 @@ void func_80A115B4(EnGoStruct* ptr, PlayState* play) {
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A16644[(s32)(temp * 7.0f)]));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[(s32)(temp * 7.0f)]));
gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
Matrix_Pop();
@@ -987,7 +987,7 @@ Actor* func_80A13400(EnGo* this, PlayState* play) {
}
void func_80A134B0(EnGo* this, PlayState* play, s32 arg2) {
- if ((gSaveContext.save.weekEventReg[18] & 0x80) || (play->actorCtx.unk5 & 1) || arg2) {
+ if ((gSaveContext.save.weekEventReg[18] & 0x80) || (play->actorCtx.flags & ACTORCTX_FLAG_0) || arg2) {
this->colliderSphere.dim.modelSphere.radius = 300;
} else {
this->colliderSphere.dim.modelSphere.radius = 380;
diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.c b/src/overlays/actors/ovl_En_Gs/z_en_gs.c
index e831328f65..3927305ad0 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c
@@ -1082,10 +1082,10 @@ void EnGs_Draw(Actor* thisx, PlayState* play) {
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, object_gs_DL_000950);
+ gSPDisplayList(POLY_OPA_DISP++, gGossipStoneMaterialDL);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->unk_1FA.r, this->unk_1FA.g, this->unk_1FA.b, 255);
- gSPDisplayList(POLY_OPA_DISP++, object_gs_DL_0009D0);
- gSPDisplayList(POLY_OPA_DISP++, object_gs_DL_000A60);
+ gSPDisplayList(POLY_OPA_DISP++, gGossipStoneDL);
+ gSPDisplayList(POLY_OPA_DISP++, gGossipStoneBottomModelDL);
Matrix_Pop();
diff --git a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h
index 2178c62783..0262cd41d7 100644
--- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h
+++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.h
@@ -15,10 +15,10 @@ typedef struct EnGuruguru {
/* 0x248 */ EnGuruguruActionFunc actionFunc;
/* 0x24C */ s16 headZRot;
/* 0x24E */ s16 headXRot;
- /* 0x250 */ char unk250[0x2];
+ /* 0x250 */ UNK_TYPE1 unk250[0x2];
/* 0x252 */ s16 headZRotTarget;
/* 0x254 */ s16 headXRotTarget;
- /* 0x256 */ char unk256[0xE];
+ /* 0x256 */ UNK_TYPE1 unk256[0xE];
/* 0x264 */ s16 unusedTimer; // set to 6 and decremented, but never has any effect
/* 0x266 */ s16 unk266;
/* 0x268 */ s16 unk268;
diff --git a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c
index 50f0c1e1e0..81cb9850cb 100644
--- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c
+++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c
@@ -176,7 +176,8 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
sp74.x += randPlusMinusPoint5Scaled(15.0f);
sp74.z += randPlusMinusPoint5Scaled(15.0f);
- EffectSsDtBubble_SpawnCustomColor(play, &sp74, &sp94, &sp88, &sp84, &sp80, Rand_S16Offset(120, 90), 30, 1);
+ EffectSsDtBubble_SpawnCustomColor(play, &sp74, &sp94, &sp88, &sp84, &sp80, Rand_S16Offset(120, 90), 30,
+ true);
}
this->unk_218 = 30;
}
@@ -218,7 +219,8 @@ void func_80BDB59C(EnHiddenNuts* this, PlayState* play) {
sp78.x += randPlusMinusPoint5Scaled(15.0f);
sp78.z += randPlusMinusPoint5Scaled(15.0f);
- EffectSsDtBubble_SpawnCustomColor(play, &sp78, &sp98, &sp8C, &sp88, &sp84, Rand_S16Offset(120, 90), 30, 1);
+ EffectSsDtBubble_SpawnCustomColor(play, &sp78, &sp98, &sp8C, &sp88, &sp84, Rand_S16Offset(120, 90), 30,
+ true);
}
this->unk_218 = 30;
}
diff --git a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c
index 3664fcede9..46a52a9faf 100644
--- a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c
+++ b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c
@@ -158,7 +158,7 @@ void EnHintSkb_Init(Actor* thisx, PlayState* play) {
Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElement);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->unk_3E4 = 0;
this->unk_3DE = 0;
this->unk_3E0 = 0;
@@ -587,7 +587,7 @@ void func_80C20D64(EnHintSkb* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.hintId = 255;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
if (this->actionFunc == func_80C1FE80) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
@@ -597,7 +597,7 @@ void func_80C20D64(EnHintSkb* this, PlayState* play) {
} else if (Player_GetMask(play) != PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.textId = 0;
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
func_80C1FE0C(this);
diff --git a/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h b/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h
index f48ffbe9d9..0a1383e0a0 100644
--- a/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h
+++ b/src/overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h
@@ -7,7 +7,7 @@ struct EnHitTag;
typedef void (*EnHitTagActionFunc)(struct EnHitTag*, PlayState*);
-#define ENHITTAG_GET_SWITCHFLAG(thisx) (s32)(((thisx)->params & 0xFE00) >> 9)
+#define ENHITTAG_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef struct EnHitTag {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Hs/z_en_hs.c b/src/overlays/actors/ovl_En_Hs/z_en_hs.c
index 00bfd2cd58..5fec475944 100644
--- a/src/overlays/actors/ovl_En_Hs/z_en_hs.c
+++ b/src/overlays/actors/ovl_En_Hs/z_en_hs.c
@@ -162,7 +162,7 @@ void func_80953098(EnHs* this, PlayState* play) {
this->actionFunc = func_8095345C;
this->actor.flags |= ACTOR_FLAG_10000;
this->stateFlags |= 0x10;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
} else {
this->stateFlags |= 8;
if (INV_CONTENT(ITEM_MASK_BUNNY) == ITEM_MASK_BUNNY) {
@@ -264,7 +264,7 @@ void func_8095345C(EnHs* this, PlayState* play) {
this->actionFunc = func_80953354;
this->stateTimer = 40;
} else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_10000)) {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
this->stateFlags |= 1;
} else if ((this->actor.xzDistToPlayer < 120.0f) && Player_IsFacingActor(&this->actor, 0x2000, play)) {
func_800B8614(&this->actor, play, 130.0f);
diff --git a/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c b/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
index 3e6ab858fe..a251dd1133 100644
--- a/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
+++ b/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
@@ -1,7 +1,7 @@
/*
* File: z_en_hs2.c
* Overlay: ovl_En_Hs2
- * Description: Blue Target Spot (?)
+ * Description: Near-empty actor. Does nothing, but can be targeted.
*/
#include "z_en_hs2.h"
diff --git a/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
index a1c33264eb..d71e4c1935 100644
--- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -388,7 +388,7 @@ void EnIk_Idle(EnIk* this, PlayState* play) {
} else if (this->colliderCylinder.base.acFlags & AC_HIT) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_ARMOR_HIT);
func_801A2E54(NA_BGM_MINI_BOSS);
- this->actor.hintId = 0x35;
+ this->actor.hintId = TATL_HINT_ID_IRON_KNUCKLE;
this->colliderCylinder.base.acFlags &= ~AC_HIT;
this->invincibilityFrames = 12;
EnIk_SetupWalk(this);
diff --git a/src/overlays/actors/ovl_En_In/z_en_in.h b/src/overlays/actors/ovl_En_In/z_en_in.h
index 1fb9694f6c..9221c94ce1 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.h
+++ b/src/overlays/actors/ovl_En_In/z_en_in.h
@@ -46,7 +46,7 @@ typedef struct EnIn {
/* 0x18C */ ColliderJntSph colliderJntSph;
/* 0x1AC */ ColliderJntSphElement colliderJntSphElement;
/* 0x1EC */ ColliderCylinder colliderCylinder;
- /* 0x238 */ char unk238[0x4];
+ /* 0x238 */ UNK_TYPE1 unk238[0x4];
/* 0x23C */ u8 unk23C;
/* 0x23D */ u8 unk23D;
/* 0x240 */ Path* path;
@@ -60,19 +60,19 @@ typedef struct EnIn {
/* 0x352 */ Vec3s trackTarget;
/* 0x358 */ Vec3s headRot;
/* 0x35E */ Vec3s torsoRot;
- /* 0x364 */ char unk364[0x12];
+ /* 0x364 */ UNK_TYPE1 unk364[0x12];
/* 0x376 */ s16 unk376[20];
/* 0x39E */ s16 unk39E[20];
- /* 0x3C6 */ char unk3C6[0xBC];
+ /* 0x3C6 */ UNK_TYPE1 unk3C6[0xBC];
/* 0x482 */ s16 unk482;
/* 0x484 */ s16 unk484;
/* 0x486 */ s16 unk486;
/* 0x488 */ s16 unk488;
/* 0x48A */ u16 unk48A;
/* 0x48C */ s32 unk48C;
- /* 0x490 */ char unk490[0x4];
+ /* 0x490 */ UNK_TYPE1 unk490[0x4];
/* 0x494 */ s32 unk494;
- /* 0x498 */ char unk498[0xC];
+ /* 0x498 */ UNK_TYPE1 unk498[0xC];
/* 0x4A4 */ struct EnIn* unk4A4;
/* 0x4A8 */ s32 unk4A8;
/* 0x4AC */ s32 unk4AC;
diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
index c351f83c69..2ac1672352 100644
--- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
+++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
@@ -4,7 +4,6 @@
* Description: Ranch nighttime actors
*/
-#include "prevent_bss_reordering.h"
#include "z_en_invadepoh.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
#include "objects/gameplay_keep/gameplay_keep.h"
diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h
index 3826397a84..cafae5f239 100644
--- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h
+++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.h
@@ -34,32 +34,32 @@ typedef enum {
} EnInvadepohDirection;
typedef struct unkStruct80B50350 {
- /* 0x000 */ s8 unk0;
- /* 0x001 */ s8 unk1;
- /* 0x002 */ u8 unk2;
- /* 0x004 */ Vec3f unk4;
+ /* 0x0 */ s8 unk0;
+ /* 0x1 */ s8 unk1;
+ /* 0x2 */ u8 unk2;
+ /* 0x4 */ Vec3f unk4;
} unkStruct80B50350; // size = 0x10;
typedef struct {
- /* 0x00 */ s8* unk00;
- /* 0x04 */ s8 unk04;
-} unkstructInvadepoh0; // size = 0x08
+ /* 0x0 */ s8* unk00;
+ /* 0x4 */ s8 unk04;
+} unkstructInvadepoh0; // size = 0x8
typedef struct {
- /* 0x00 */ s8 unk00;
- /* 0x04 */ f32 unk04;
-} unkstructInvadepoh1; // size = 0x08
+ /* 0x0 */ s8 unk00;
+ /* 0x4 */ f32 unk04;
+} unkstructInvadepoh1; // size = 0x8
typedef struct {
- /* 0x00 */ s8 unk00;
- /* 0x04 */ unkstructInvadepoh0* unk04;
-} unkstructInvadepoh2; // size = 0x08
+ /* 0x0 */ s8 unk00;
+ /* 0x4 */ unkstructInvadepoh0* unk04;
+} unkstructInvadepoh2; // size = 0x8
typedef struct {
- /* 0x00 */ s8 unk0;
- /* 0x04 */ unkstructInvadepoh0* unk4;
- /* 0x08 */ s8 unk8;
- /* 0x0C */ unkstructInvadepoh1* unkC;
+ /* 0x0 */ s8 unk0;
+ /* 0x4 */ unkstructInvadepoh0* unk4;
+ /* 0x8 */ s8 unk8;
+ /* 0xC */ unkstructInvadepoh1* unkC;
} unkstructInvadepoh3; // size = 0x10
typedef struct {
@@ -72,38 +72,38 @@ typedef struct {
} unkstructInvadepoh4; // size = 0x14
typedef struct {
- /* 0x00 */ f32 unk00;
- /* 0x04 */ s16 unk04;
- /* 0x06 */ s16 unk06;
-} unkstruct80B4EE0C; // size = 0x08
+ /* 0x0 */ f32 unk00;
+ /* 0x4 */ s16 unk04;
+ /* 0x6 */ s16 unk06;
+} unkstruct80B4EE0C; // size = 0x8
typedef struct EnInvadePohStruct {
- /* 0x000 */ unkstructInvadepoh4* unk0;
- /* 0x004 */ s8 unk4;
- /* 0x008 */ unkstructInvadepoh4* unk8;
- /* 0x00C */ s16 unkC;
- /* 0x00E */ s8 unkE;
- /* 0x00F */ s8 unkF;
+ /* 0x0 */ unkstructInvadepoh4* unk0;
+ /* 0x4 */ s8 unk4;
+ /* 0x8 */ unkstructInvadepoh4* unk8;
+ /* 0xC */ s16 unkC;
+ /* 0xE */ s8 unkE;
+ /* 0xF */ s8 unkF;
} EnInvadePohStruct; // size = 0x10;
typedef struct AlienBehaviorInfo {
- /* 0x000 */ EnInvadePohStruct unk0;
- /* 0x010 */ EnInvadePohStruct unk10;
- /* 0x020 */ Vec3s unk20;
- /* 0x026 */ Vec3s unk26;
- /* 0x02C */ s16 unk2C;
- /* 0x02E */ u16 unk2E;
- /* 0x030 */ f32 unk30;
- /* 0x034 */ f32 unk34;
- /* 0x038 */ f32 unk38;
- /* 0x03C */ f32 unk3C;
- /* 0x040 */ s16 unk40;
- /* 0x042 */ s16 unk42;
- /* 0x044 */ f32 unk44;
- /* 0x048 */ s16 unk48;
- /* 0x04A */ char unk4A[0x2];
- /* 0x04C */ s16 unk4C;
- /* 0x04E */ s16 unk4E;
+ /* 0x00 */ EnInvadePohStruct unk0;
+ /* 0x10 */ EnInvadePohStruct unk10;
+ /* 0x20 */ Vec3s unk20;
+ /* 0x26 */ Vec3s unk26;
+ /* 0x2C */ s16 unk2C;
+ /* 0x2E */ u16 unk2E;
+ /* 0x30 */ f32 unk30;
+ /* 0x34 */ f32 unk34;
+ /* 0x38 */ f32 unk38;
+ /* 0x3C */ f32 unk3C;
+ /* 0x40 */ s16 unk40;
+ /* 0x42 */ s16 unk42;
+ /* 0x44 */ f32 unk44;
+ /* 0x48 */ s16 unk48;
+ /* 0x4A */ UNK_TYPE1 unk4A[0x2];
+ /* 0x4C */ s16 unk4C;
+ /* 0x4E */ s16 unk4E;
} AlienBehaviorInfo; // size = 0x50
typedef struct EnInvadepoh {
@@ -148,7 +148,7 @@ typedef struct EnInvadepoh {
/* 0x3A8 */ s16 scaleAdjAngle;
/* 0x3AA */ s16 unk3AA;
/* 0x3AC */ s8 unk3AC; // index for D_80B4EDD0
- /* 0x3AD */ char unk3AD[0xF];
+ /* 0x3AD */ UNK_TYPE1 unk3AD[0xF];
/* 0x3BC */ s8 unk3BC;
} EnInvadepoh; // size = 0x3C0
diff --git a/src/overlays/actors/ovl_En_Js/z_en_js.c b/src/overlays/actors/ovl_En_Js/z_en_js.c
index 57763a190d..4e35a51587 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.c
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.c
@@ -15,7 +15,18 @@ void EnJs_Destroy(Actor* thisx, PlayState* play);
void EnJs_Update(Actor* thisx, PlayState* play);
void EnJs_Draw(Actor* thisx, PlayState* play);
-#if 0
+s32 func_80968B8C(EnJs* this, PlayState* play);
+s32 func_809692A8(s32 arg0);
+void func_80968A5C(EnJs* this);
+void func_80969400(s32 arg0);
+void func_8096971C(EnJs* this, PlayState* play);
+void func_80969898(EnJs* this, PlayState* play);
+void func_80969B5C(EnJs* this, PlayState* play);
+void func_80969DA4(EnJs* this, PlayState* play);
+void func_8096A104(EnJs* this, PlayState* play);
+void func_8096A38C(EnJs* this, PlayState* play);
+void func_8096A6F4(EnJs* this, PlayState* play);
+
const ActorInit En_Js_InitVars = {
ACTOR_EN_JS,
ACTORCAT_NPC,
@@ -28,89 +39,1021 @@ const ActorInit En_Js_InitVars = {
(ActorFunc)EnJs_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_8096ABA0 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_ENEMY, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_ENEMY,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 20, 40, 0, { 0, 0, 0 } },
};
-#endif
+static Gfx* D_8096ABCC[] = {
+ gMoonChildMajorasMaskDL, gMoonChildOdalwasMaskDL, gMoonChildGohtsMaskDL,
+ gMoonChildGyorgsMaskDL, gMoonChildTwinmoldsMaskDL,
+};
-extern ColliderCylinderInit D_8096ABA0;
+f32 D_8096ABE0[] = { 1.0f, 0.5f, 0.5f, 0.48f, 0.45f };
-extern UNK_TYPE D_06010880;
-extern UNK_TYPE D_06016F58;
-extern UNK_TYPE D_06017E98;
+f32 D_8096ABF4[] = { 60.0f, 0.0f, 0.0f, 0.0f, 0.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Init.s")
+f32 D_8096AC08[] = { -450.0f, 1400.0f, 1470.0f, 1670.0f, 1470.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Destroy.s")
+f32 D_8096AC1C[] = { 0.0f, 700.0f, 900.0f, 900.0f, 900.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968A5C.s")
+Vec3f D_8096AC30 = { 500.0f, -500.0f, 0.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968B18.s")
+void EnJs_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ s16 cs;
+ s32 i;
+ EnJs* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968B8C.s")
+ Actor_SetScale(&this->actor, 0.01f);
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gMoonChildSkel, &gMoonChildStandingAnim, this->jointTable,
+ this->morphTable, MOONCHILD_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gMoonChildStandingAnim);
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968CB8.s")
+ this->actionFunc = func_8096971C;
+ this->maskType = 0;
+ this->actor.terminalVelocity = -9.0f;
+ this->actor.gravity = -1.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968DD0.s")
+ cs = this->actor.cutscene;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968E38.s")
+ for (i = 0; i < ARRAY_COUNT(this->cutscenes); i++) {
+ this->cutscenes[i] = cs;
+ if (cs != -1) {
+ this->actor.cutscene = cs;
+ cs = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968F48.s")
+ this->cutsceneIndex = -1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809691B8.s")
+ switch (ENJS_GET_TYPE(&this->actor)) {
+ case 0:
+ this->maskType = 0;
+ this->actionFunc = func_8096A6F4;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809692A8.s")
+ Animation_PlayLoop(&this->skelAnime, &gMoonChildSittingAnim);
+ func_8016566C(0x3C);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096933C.s")
+ if (gSaveContext.save.weekEventReg[84] & 0x20) {
+ Inventory_DeleteItem(ITEM_MASK_FIERCE_DEITY, SLOT(ITEM_MASK_FIERCE_DEITY));
+ gSaveContext.save.weekEventReg[84] &= (u8)~0x20;
+ }
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ this->maskType = ENJS_GET_TYPE(&this->actor);
+ func_80968B8C(this, play);
+ this->actionFunc = func_80969B5C;
+ func_80968A5C(this);
+ if (func_809692A8(ENJS_GET_TYPE(&this->actor) + 4)) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ this->maskType = ENJS_GET_TYPE(&this->actor) - 4;
+ this->actionFunc = func_8096A104;
+ break;
+ default:
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969400.s")
+void EnJs_Destroy(Actor* thisx, PlayState* play) {
+ u32 paramsF;
+ EnJs* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969494.s")
+ Collider_DestroyCylinder(play, &this->collider);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809694E8.s")
+ paramsF = ENJS_GET_TYPE(&this->actor);
+ switch (paramsF) {
+ case 0:
+ func_80165690();
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (!func_809692A8(paramsF)) {
+ func_80969400(ENJS_GET_TYPE(&this->actor));
+ }
+ break;
+ default:
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969530.s")
+void func_80968A5C(EnJs* this) {
+ if (Rand_ZeroOne() < 0.5f) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildRunningAnim, -10.0f);
+ this->unk_2B4 = 5.0f;
+ } else {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildWalkingAnim, -10.0f);
+ this->unk_2B4 = 2.5f;
+ }
+ this->unk_2B8 &= ~4;
+ this->unk_2BC = Rand_ZeroFloat(40.0f) + 80.0f;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809695FC.s")
+void func_80968B18(EnJs* this) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, -10.0f);
+ this->unk_2B4 = 0.0f;
+ this->unk_2BC = Rand_ZeroFloat(20.0f) + 40.0f;
+ this->unk_2B8 |= 4;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969688.s")
+s32 func_80968B8C(EnJs* this, PlayState* play) {
+ Path* path;
+ f32 temp_f0;
+ f32 temp_f2;
+ s32 pathIndex = ENJS_GET_PATH_INDEX(&this->actor);
+ s32 i;
+ f32 sp18 = 0.0f;
+ Vec3s* points;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809696EC.s")
+ if (pathIndex != 0x3F) {
+ this->path = &play->setupPathList[pathIndex];
+ if (this->path != NULL) {
+ path = this->path;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096971C.s")
+ points = Lib_SegmentedToVirtual(path->points);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969748.s")
+ for (i = 0; i < path->count; i++, points++) {
+ temp_f0 = points->x - this->actor.world.pos.x;
+ temp_f2 = points->z - this->actor.world.pos.z;
+ temp_f0 = SQ(temp_f0) + SQ(temp_f2);
+ if (i == 0) {
+ sp18 = temp_f0;
+ this->unk_2B0 = 0;
+ } else if (temp_f0 < sp18) {
+ sp18 = temp_f0;
+ this->unk_2B0 = i;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969898.s")
+ this->unk_2B0++;
+ if (this->unk_2B0 >= path->count) {
+ this->unk_2B0 = 0;
+ }
+ }
+ } else {
+ this->path = NULL;
+ this->unk_2B0 = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969AA0.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969B5C.s")
+s32 func_80968CB8(EnJs* this) {
+ Path* path;
+ s32 pad;
+ f32 temp_fa0;
+ f32 temp_fa1;
+ Vec3s* temp_v1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969C54.s")
+ if (this->path == NULL) {
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969DA4.s")
+ path = this->path;
+ temp_v1 = &((Vec3s*)Lib_SegmentedToVirtual(path->points))[this->unk_2B0];
+ temp_fa0 = temp_v1->x - this->actor.world.pos.x;
+ temp_fa1 = temp_v1->z - this->actor.world.pos.z;
+ this->actor.world.rot.y = Math_Atan2S(temp_fa0, temp_fa1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A080.s")
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, 0x7D0, 0xC8);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A104.s")
+ if ((SQ(temp_fa0) + SQ(temp_fa1)) < SQ(10.0f)) {
+ this->unk_2B0++;
+ if (this->unk_2B0 >= path->count) {
+ this->unk_2B0 = 0;
+ }
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A184.s")
+ Math_StepToF(&this->actor.speedXZ, this->unk_2B4, 0.5f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A1E8.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A2C0.s")
+s32 func_80968DD0(EnJs* this, PlayState* play) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
+ Actor_IsFacingPlayer(&this->actor, 0x3000)) {
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A38C.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A6F4.s")
+s32 func_80968E38(s32 arg0) {
+ s32 i;
+ s32 count;
+ u8 mask;
+ u8* maskMaskBit = gSaveContext.maskMaskBit;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Update.s")
+ if (((arg0 < 0) || (arg0 >= 9))) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A9F4.s")
+ count = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Draw.s")
+ arg0 *= 3;
+ for (mask = 1, i = 0; i < 8; i++, mask <<= 1) {
+ if (maskMaskBit[arg0] & mask) {
+ count++;
+ }
+ }
+
+ arg0++;
+ for (mask = 1, i = 0; i < 8; i++, mask <<= 1) {
+ if (maskMaskBit[arg0] & mask) {
+ count++;
+ }
+ }
+
+ arg0++;
+ for (mask = 1, i = 0; i < 5; i++, mask <<= 1) {
+ if (maskMaskBit[arg0] & mask) {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+s32 EnJs_GetRemainingMasks(void) {
+ s32 count = 0;
+
+ if (INV_CONTENT(ITEM_MASK_TRUTH) == ITEM_MASK_TRUTH) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_KAFEIS_MASK) == ITEM_MASK_KAFEIS_MASK) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_ALL_NIGHT) == ITEM_MASK_ALL_NIGHT) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_BUNNY) == ITEM_MASK_BUNNY) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_KEATON) == ITEM_MASK_KEATON) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GARO) == ITEM_MASK_GARO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_CIRCUS_LEADER) == ITEM_MASK_CIRCUS_LEADER) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_POSTMAN) == ITEM_MASK_POSTMAN) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_COUPLE) == ITEM_MASK_COUPLE) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GREAT_FAIRY) == ITEM_MASK_GREAT_FAIRY) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GIBDO) == ITEM_MASK_GIBDO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_DON_GERO) == ITEM_MASK_DON_GERO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_KAMARO) == ITEM_MASK_KAMARO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_CAPTAIN) == ITEM_MASK_CAPTAIN) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_STONE) == ITEM_MASK_STONE) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_BREMEN) == ITEM_MASK_BREMEN) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_BLAST) == ITEM_MASK_BLAST) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_SCENTS) == ITEM_MASK_SCENTS) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GIANT) == ITEM_MASK_GIANT) {
+ count++;
+ }
+
+ count -= func_80968E38(0);
+ return count;
+}
+
+void EnJs_TakeMask(s32 actionParams, s32 childType) {
+ u8* maskMaskBit = gSaveContext.maskMaskBit;
+ s32 temp = 0;
+
+ if ((childType >= 0) && (childType < 9)) {
+ actionParams -= PLAYER_AP_MASK_TRUTH;
+ childType *= 3;
+ if (actionParams < 8) {
+ maskMaskBit[childType] |= 1 << actionParams;
+ maskMaskBit[temp] |= 1 << actionParams;
+ return;
+ }
+
+ actionParams -= 8;
+ childType++;
+ temp++;
+ if (actionParams < 8) {
+ maskMaskBit[childType] |= 1 << actionParams;
+ maskMaskBit[temp] |= 1 << actionParams;
+ return;
+ }
+
+ actionParams -= 8;
+ childType++;
+ temp++;
+ if (actionParams < 6) {
+ maskMaskBit[childType] |= 1 << actionParams;
+ maskMaskBit[temp] |= 1 << actionParams;
+ }
+ }
+}
+
+s32 func_809692A8(s32 arg0) {
+ switch (arg0) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ if (func_80968E38(arg0) < arg0) {
+ return false;
+ }
+ return true;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (func_80968E38(arg0) < (arg0 - 4)) {
+ return false;
+ }
+ return true;
+ default:
+ return false;
+ }
+}
+
+s32 func_8096933C(s32 arg0) {
+ s32 sp1C;
+
+ switch (arg0) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ sp1C = EnJs_GetRemainingMasks();
+ if ((func_80968E38(arg0) + sp1C) < arg0) {
+ return false;
+ } else {
+ return true;
+ }
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ sp1C = EnJs_GetRemainingMasks();
+ if ((func_80968E38(arg0) + sp1C) < (arg0 - 4)) {
+ return false;
+ } else {
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
+void func_80969400(s32 arg0) {
+ u8* maskMaskBit = gSaveContext.maskMaskBit;
+ u8* temp_v0 = &gSaveContext.maskMaskBit[arg0 * 3];
+
+ if ((arg0 >= 0) && (arg0 < 9)) {
+ maskMaskBit[0] &= ~temp_v0[0];
+ maskMaskBit[1] &= ~temp_v0[1];
+
+ temp_v0[2] &= 0xF;
+ maskMaskBit[2] &= ~temp_v0[2];
+
+ temp_v0[0] = 0;
+ temp_v0[1] = 0;
+ temp_v0[2] = 0;
+ }
+}
+
+void func_80969494(EnJs* this, PlayState* play) {
+ func_80968A5C(this);
+ func_801477B4(play);
+ this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actionFunc = func_80969B5C;
+}
+
+void func_809694E8(EnJs* this, PlayState* play) {
+ func_801477B4(play);
+ this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actionFunc = func_8096A104;
+}
+
+void func_80969530(EnJs* this, PlayState* play) {
+ func_801477B4(play);
+ this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actionFunc = func_8096A6F4;
+ if ((this->actor.home.rot.y == this->actor.shape.rot.y) && (this->unk_2B8 & 0x10)) {
+ Animation_Change(&this->skelAnime, &gMoonChildGettingUpAnim, -1.0f,
+ Animation_GetLastFrame(&gMoonChildGettingUpAnim) - 1.0f, 0.0f, ANIMMODE_ONCE, -10.0f);
+ this->unk_2B8 &= ~0x10;
+ this->unk_2B8 |= 8;
+ }
+}
+
+s32 func_809695FC(EnJs* this, PlayState* play) {
+ if (ENJS_GET_EXIT_INDEX(&this->actor) == 0x3F) {
+ return false;
+ }
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->nextEntrance = play->setupExitList[ENJS_GET_EXIT_INDEX(&this->actor)];
+ this->actionFunc = func_8096971C;
+ play->msgCtx.msgLength = 0;
+ gSaveContext.respawnFlag = -2;
+ return true;
+}
+
+void func_80969688(EnJs* this) {
+ if (this->cutsceneIndex != -1) {
+ if (ActorCutscene_GetCurrentIndex() == this->cutscenes[this->cutsceneIndex]) {
+ ActorCutscene_Stop(this->cutscenes[this->cutsceneIndex]);
+ }
+ this->cutsceneIndex = -1;
+ }
+}
+
+void func_809696EC(EnJs* this, s16 arg1) {
+ func_80969688(this);
+ this->cutsceneIndex = arg1;
+}
+
+void func_8096971C(EnJs* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void func_80969748(EnJs* this, PlayState* play) {
+ s32 itemActionParam;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_16) {
+ itemActionParam = func_80123810(play);
+ if (itemActionParam != PLAYER_AP_NONE) {
+ this->actionFunc = func_80969898;
+ }
+ if (itemActionParam > PLAYER_AP_NONE) {
+ func_801477B4(play);
+ if ((itemActionParam >= PLAYER_AP_MASK_TRUTH) && (itemActionParam <= PLAYER_AP_MASK_GIANT)) {
+ EnJs_TakeMask(itemActionParam, ENJS_GET_TYPE(&this->actor));
+ Inventory_UnequipItem(itemActionParam - 4);
+ if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
+ player->actor.textId = 0x2212;
+ } else {
+ player->actor.textId = 0x2213;
+ }
+ } else if ((itemActionParam >= PLAYER_AP_MASK_FIERCE_DEITY) && (itemActionParam <= PLAYER_AP_MASK_DEKU)) {
+ player->actor.textId = 0x2211;
+ } else {
+ player->actor.textId = 0x2210;
+ }
+ }
+ if (itemActionParam <= PLAYER_AP_MINUS1) {
+ func_80151938(play, 0x2216);
+ }
+ }
+}
+
+void func_80969898(EnJs* this, PlayState* play) {
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x2215)) {
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ func_80151938(play, 0x2217);
+ break;
+ case 1:
+ func_8019F230();
+ func_80151938(play, 0x2216);
+ break;
+ }
+ }
+ break;
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x220C:
+ this->unk_2B8 |= 1;
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ func_80151938(play, 0x220F);
+ break;
+ }
+ func_80151938(play, 0x220D);
+ break;
+ case 0x220D:
+ case 0x2213:
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ case 0x220E:
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969748;
+ break;
+ case 0x2210:
+ case 0x2211:
+ case 0x2212:
+ player->exchangeItemId = PLAYER_AP_NONE;
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969748;
+ break;
+ case 0x2214:
+ case 0x2217:
+ if (!func_809695FC(this, play)) {
+ func_80969494(this, play);
+ break;
+ }
+ break;
+ default:
+ func_80969494(this, play);
+ break;
+ }
+ }
+ break;
+ }
+}
+
+void func_80969AA0(EnJs* this, PlayState* play) {
+ u16 textId;
+
+ if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ textId = 0x220B;
+ } else {
+ textId = 0x2215;
+ if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
+ if (this->unk_2B8 & 1) {
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ textId = 0x220F;
+ } else {
+ textId = 0x220E;
+ }
+ } else {
+ textId = 0x220C;
+ }
+ } else {
+ textId = 0x2215;
+ }
+ }
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, -10.0f);
+ Message_StartTextbox(play, textId, &this->actor);
+}
+
+void func_80969B5C(EnJs* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (this->unk_2BC > 0) {
+ this->unk_2BC--;
+ if (this->unk_2BC == 0) {
+ if (this->unk_2B8 & 4) {
+ func_80968A5C(this);
+ } else {
+ func_80968B18(this);
+ }
+ }
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actionFunc = func_80969898;
+ this->actor.speedXZ = 0.0f;
+ this->unk_2B4 = 0.0f;
+ func_80969AA0(this, play);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
+ func_800B8614(&this->actor, play, 120.0f);
+ }
+ func_80968CB8(this);
+}
+
+void func_80969C54(EnJs* this, PlayState* play) {
+ s32 itemActionParam;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_16) {
+ itemActionParam = func_80123810(play);
+ if (itemActionParam != PLAYER_AP_NONE) {
+ this->actionFunc = func_80969DA4;
+ }
+ if (itemActionParam > PLAYER_AP_NONE) {
+ func_801477B4(play);
+ if ((itemActionParam >= PLAYER_AP_MASK_TRUTH) && (itemActionParam <= PLAYER_AP_MASK_GIANT)) {
+ EnJs_TakeMask(itemActionParam, ENJS_GET_TYPE(&this->actor));
+ Inventory_UnequipItem(itemActionParam - 4);
+ if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
+ player->actor.textId = 0x2221;
+ } else {
+ player->actor.textId = 0x2222;
+ }
+ } else if ((itemActionParam >= PLAYER_AP_MASK_FIERCE_DEITY) && (itemActionParam <= PLAYER_AP_MASK_DEKU)) {
+ player->actor.textId = 0x2220;
+ } else {
+ player->actor.textId = 0x221D;
+ }
+ }
+ if (itemActionParam <= PLAYER_AP_MINUS1) {
+ func_80151938(play, 0x221E);
+ }
+ }
+}
+
+void func_80969DA4(EnJs* this, PlayState* play) {
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ if (Message_ShouldAdvance(play) &&
+ ((play->msgCtx.currentTextId == 0x2219) || (play->msgCtx.currentTextId == 0x221E))) {
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ if (!func_809695FC(this, play)) {
+ func_809694E8(this, play);
+ break;
+ }
+ break;
+ case 1:
+ func_8019F230();
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ }
+ }
+ break;
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x221B:
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ func_80151938(play, 0x2219);
+ break;
+ }
+ func_80151938(play, 0x221C);
+ break;
+ case 0x2224:
+ case 0x2226:
+ case 0x2228:
+ case 0x222A:
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ case 0x2225:
+ case 0x2227:
+ case 0x2229:
+ case 0x222B:
+ if (!func_809695FC(this, play)) {
+ func_809694E8(this, play);
+ break;
+ }
+ break;
+ case 0x2222:
+ player->exchangeItemId = PLAYER_AP_NONE;
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ case 0x2223:
+ switch (ENJS_GET_TYPE(&this->actor)) {
+ case 5:
+ func_80151938(play, 0x2224);
+ break;
+ case 6:
+ func_80151938(play, 0x2226);
+ break;
+ case 7:
+ func_80151938(play, 0x2228);
+ break;
+ case 8:
+ func_80151938(play, 0x222A);
+ break;
+ }
+ break;
+ case 0x221C:
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969C54;
+ break;
+ case 0x221D:
+ case 0x2220:
+ case 0x2221:
+ player->exchangeItemId = PLAYER_AP_NONE;
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969C54;
+ break;
+ default:
+ func_809694E8(this, play);
+ break;
+ }
+ }
+ break;
+ }
+}
+
+void func_8096A080(EnJs* this, PlayState* play) {
+ u16 textId;
+
+ if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ textId = 0x2218;
+ } else {
+ textId = 0x221B;
+ if (this->unk_2B8 & 1) {
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ textId = 0x2219;
+ } else {
+ textId = 0x221C;
+ }
+ } else {
+ this->unk_2B8 |= 1;
+ }
+ }
+ Message_StartTextbox(play, textId, &this->actor);
+}
+
+void func_8096A104(EnJs* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actionFunc = func_80969DA4;
+ func_8096A080(this, play);
+ } else if (func_80968DD0(this, play)) {
+ func_800B8614(&this->actor, play, 120.0f);
+ }
+}
+
+void func_8096A184(EnJs* this, PlayState* play) {
+ u16 textId;
+
+ if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ textId = 0x220B;
+ } else if (func_80968E38(0) >= 20) {
+ textId = 0x2202;
+ } else {
+ textId = 0x21FC;
+ }
+ Message_StartTextbox(play, textId, &this->actor);
+}
+
+void func_8096A1E8(EnJs* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, 0.0f);
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actor.flags &= ~ACTOR_FLAG_10000;
+ this->actionFunc = func_8096A38C;
+ Message_StartTextbox(play, 0x2208, &this->actor);
+ gSaveContext.save.weekEventReg[84] |= 0x20;
+ func_809696EC(this, 0);
+ } else {
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
+ }
+}
+
+void func_8096A2C0(EnJs* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, 0.0f);
+ }
+ if (Actor_HasParent(&this->actor, play)) {
+ this->actor.parent = NULL;
+ this->actor.flags |= ACTOR_FLAG_10000;
+ this->actionFunc = func_8096A1E8;
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
+ } else {
+ Actor_PickUp(&this->actor, play, GI_MASK_FIERCE_DEITY, 10000.0f, 1000.0f);
+ }
+}
+
+void func_8096A38C(EnJs* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, 0.0f);
+ this->unk_2B8 |= 2;
+ }
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ break;
+
+ case 1:
+ func_8019F230();
+ break;
+ }
+
+ switch (play->msgCtx.currentTextId) {
+ case 0x21FC:
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_80151938(play, 0x21FE);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f);
+ this->unk_2B8 |= 0x10;
+ break;
+ case 1:
+ func_80151938(play, 0x21FD);
+ break;
+ }
+ break;
+
+ case 0x21FE:
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_80151938(play, 0x2200);
+ func_809696EC(this, 0);
+ break;
+ case 1:
+ func_80151938(play, 0x21FF);
+ break;
+ }
+ break;
+
+ case 0x2203:
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_80151938(play, 0x2205);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f);
+ this->unk_2B8 |= 0x10;
+ break;
+ case 1:
+ func_80151938(play, 0x2204);
+ break;
+ }
+ }
+ }
+ break;
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x2202:
+ case 0x2205:
+ case 0x2206:
+ case 0x2209:
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+
+ case 0x2200:
+ case 0x2208:
+ func_809696EC(this, 1);
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+
+ case 0x2207:
+ if (INV_CONTENT(ITEM_MASK_FIERCE_DEITY) == ITEM_MASK_FIERCE_DEITY) {
+ func_80151938(play, 0x2208);
+ func_809696EC(this, 0);
+ } else {
+ func_801477B4(play);
+ this->actionFunc = func_8096A2C0;
+ func_8096A2C0(this, play);
+ }
+ break;
+
+ case 0x2201:
+
+ case 0x220A:
+ if (!func_809695FC(this, play)) {
+ func_80969530(this, play);
+ }
+ break;
+
+ default:
+ func_80969530(this, play);
+ break;
+ }
+ }
+ break;
+ }
+}
+
+void func_8096A6F4(EnJs* this, PlayState* play) {
+ s32 pad;
+
+ if (this->actor.home.rot.y != this->actor.shape.rot.y) {
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 2, 0x400, 0x100);
+ if ((this->actor.home.rot.y == this->actor.shape.rot.y) && (this->unk_2B8 & 0x10)) {
+ Animation_Change(&this->skelAnime, &gMoonChildGettingUpAnim, -1.0f,
+ Animation_GetLastFrame(&gMoonChildGettingUpAnim) - 1.0f, 0.0f, ANIMMODE_ONCE, -10.0f);
+ this->unk_2B8 &= ~0x10;
+ this->unk_2B8 |= 8;
+ }
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ }
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildSittingAnim, -10.0f);
+ this->unk_2B8 &= ~8;
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actionFunc = func_8096A38C;
+ this->unk_2B8 &= ~2;
+ func_8096A184(this, play);
+ return;
+ }
+ if (!(this->unk_2B8 & 8) && (this->actor.xzDistToPlayer < 100.0f) &&
+ Player_IsFacingActor(&this->actor, 0x3000, play) && Actor_IsFacingPlayer(&this->actor, 0x1000)) {
+ func_800B8614(&this->actor, play, 120.0f);
+ }
+}
+
+void EnJs_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnJs* this = THIS;
+
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+
+ Actor_MoveWithGravity(&this->actor);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 25.0f, 40.0f, 5);
+
+ this->actionFunc(this, play);
+
+ if ((this->cutsceneIndex != -1) && (ActorCutscene_GetCurrentIndex() != this->cutscenes[this->cutsceneIndex])) {
+ if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ ActorCutscene_Stop(0x7C);
+ ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIndex]);
+ } else if (ActorCutscene_GetCanPlayNext(this->cutscenes[this->cutsceneIndex])) {
+ ActorCutscene_Start(this->cutscenes[this->cutsceneIndex], &this->actor);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIndex]);
+ }
+ }
+}
+
+void func_8096A9F4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ s32 pad;
+ EnJs* this = THIS;
+
+ if (limbIndex == MOONCHILD_LIMB_HEAD) {
+ Matrix_MultVec3f(&D_8096AC30, &thisx->focus.pos);
+ if ((this->maskType >= 0) && (this->maskType < 5)) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (this->maskType != 0) {
+ Matrix_Scale(D_8096ABE0[this->maskType], D_8096ABE0[this->maskType], D_8096ABE0[this->maskType],
+ MTXMODE_APPLY);
+ Matrix_RotateZYX(0, -0x4000, -0x36B0, MTXMODE_APPLY);
+ }
+ Matrix_Translate(D_8096ABF4[this->maskType], D_8096AC08[this->maskType], D_8096AC1C[this->maskType],
+ MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, D_8096ABCC[this->maskType]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+}
+
+void EnJs_Draw(Actor* thisx, PlayState* play) {
+ EnJs* this = THIS;
+
+ func_8012C28C(play->state.gfxCtx);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
+ func_8096A9F4, &this->actor);
+}
diff --git a/src/overlays/actors/ovl_En_Js/z_en_js.h b/src/overlays/actors/ovl_En_Js/z_en_js.h
index 96c1bbf49e..534557e66d 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.h
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.h
@@ -2,6 +2,11 @@
#define Z_EN_JS_H
#include "global.h"
+#include "objects/object_ob/object_ob.h"
+
+#define ENJS_GET_TYPE(thisx) ((thisx)->params & 0xF)
+#define ENJS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define ENJS_GET_EXIT_INDEX(thisx) (((thisx)->params & 0x3F0) >> 4)
struct EnJs;
@@ -9,7 +14,18 @@ typedef void (*EnJsActionFunc)(struct EnJs*, PlayState*);
typedef struct EnJs {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x180];
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ ColliderCylinder collider;
+ /* 0x1D4 */ Vec3s jointTable[MOONCHILD_LIMB_MAX];
+ /* 0x240 */ Vec3s morphTable[MOONCHILD_LIMB_MAX];
+ /* 0x2AC */ Path* path;
+ /* 0x2B0 */ s32 unk_2B0;
+ /* 0x2B4 */ f32 unk_2B4;
+ /* 0x2B8 */ u16 unk_2B8;
+ /* 0x2BA */ s16 maskType;
+ /* 0x2BC */ s16 unk_2BC;
+ /* 0x2BE */ s16 cutscenes[2];
+ /* 0x2C2 */ s16 cutsceneIndex;
/* 0x2C4 */ EnJsActionFunc actionFunc;
} EnJs; // size = 0x2C8
diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
index 72eafa2836..6d7cc29eac 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -149,7 +149,7 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &D_80971D80);
SkelAnime_InitFlex(play, &this->skelanime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, 0, 0, 0);
- this->songSummonDist = GET_KAKASI_SUMMON_DISTANCE(&this->picto.actor) * 20.0f;
+ this->songSummonDist = KAKASI_GET_SUMMON_DISTANCE(&this->picto.actor) * 20.0f;
if (this->songSummonDist < 40.0f) {
this->songSummonDist = 40.0f;
}
@@ -158,11 +158,11 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) {
this->picto.actor.world.rot.z = 0;
this->picto.actor.targetMode = 0;
if (this->picto.actor.world.rot.x > 0 && this->picto.actor.world.rot.x < 8) {
- this->picto.actor.targetMode = GET_KAKASI_TARGETMODE(thisx);
+ this->picto.actor.targetMode = KAKASI_GET_TARGETMODE(thisx);
}
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y;
- this->aboveGroundStatus = GET_KAKASI_ABOVE_GROUND(&this->picto.actor);
+ this->aboveGroundStatus = KAKASI_GET_ABOVE_GROUND(&this->picto.actor);
this->picto.actor.world.rot.x = 0;
this->picto.actor.flags |= ACTOR_FLAG_400;
this->picto.actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -318,7 +318,7 @@ void EnKakasi_TimeSkipDialogue(EnKakasi* this, PlayState* play) {
this->picto.actor.flags &= ~ACTOR_FLAG_10000;
this->actionFunc = EnKakasi_RegularDialogue;
} else {
- func_800B8500(&this->picto.actor, play, 9999.9f, 9999.9f, -1);
+ func_800B8500(&this->picto.actor, play, 9999.9f, 9999.9f, PLAYER_AP_MINUS1);
}
}
}
@@ -346,7 +346,7 @@ void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) {
EnKakasi_SetupDialogue(this);
return;
}
- if (play->actorCtx.unk5 & 0x4) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_2) {
Actor_GetScreenPos(play, &this->picto.actor, &x, &y);
if (this->picto.actor.projectedPos.z > -20.0f && x > 0 && x < SCREEN_WIDTH && y > 0 && y < SCREEN_HEIGHT &&
this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
index b6010d1223..59ef3272ad 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
@@ -44,8 +44,8 @@ extern const ActorInit En_Kakasi_InitVars;
#define ENKAKASI_ABOVE_GROUND_TYPE 2
-#define GET_KAKASI_SUMMON_DISTANCE(thisx) (((thisx)->params >> 0x8) & 0xFF)
-#define GET_KAKASI_ABOVE_GROUND(thisx) ((thisx)->params & 0x1)
-#define GET_KAKASI_TARGETMODE(thisx) ((thisx)->world.rot.x - 1)
+#define KAKASI_GET_SUMMON_DISTANCE(thisx) (((thisx)->params >> 0x8) & 0xFF)
+#define KAKASI_GET_ABOVE_GROUND(thisx) ((thisx)->params & 0x1)
+#define KAKASI_GET_TARGETMODE(thisx) ((thisx)->world.rot.x - 1)
#endif // Z_EN_KAKASI_H
diff --git a/src/overlays/actors/ovl_En_Kame/z_en_kame.c b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
index b6edc7778f..c1ea3ae461 100644
--- a/src/overlays/actors/ovl_En_Kame/z_en_kame.c
+++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
@@ -114,7 +114,7 @@ static TexturePtr D_80AD8E34[] = { object_tl_Tex_0055A0, object_tl_Tex_0057A0, o
object_tl_Tex_0057A0 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 1, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_SNAPPER, ICHAIN_CONTINUE),
ICHAIN_F32(gravity, -1, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
index 4499ed44a0..5113c12917 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
@@ -963,7 +963,7 @@ void EnKanban_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (this->partFlags == 0xFFFF) {
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_05AED0);
+ gSPDisplayList(POLY_OPA_DISP++, gSignRectangularDL);
} else {
for (i = 0; i < ARRAY_COUNT(sPartFlags); i++) {
if (sPartFlags[i] & this->partFlags) {
diff --git a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
index 5412065f52..46a1adfd5d 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
@@ -154,9 +154,9 @@ void EnKarebaba_Init(Actor* thisx, PlayState* play) {
this->unk_22C = NULL;
if (this->actor.params == ENKAREBABA_2) {
- this->actor.hintId = 2;
+ this->actor.hintId = TATL_HINT_ID_MINI_BABA;
} else {
- this->actor.hintId = 9;
+ this->actor.hintId = TATL_HINT_ID_WILTED_DEKU_BABA;
}
if (this->actor.params == ENKAREBABA_0) {
diff --git a/src/overlays/actors/ovl_En_Knight/z_en_knight.h b/src/overlays/actors/ovl_En_Knight/z_en_knight.h
index a4fca8554e..167a966828 100644
--- a/src/overlays/actors/ovl_En_Knight/z_en_knight.h
+++ b/src/overlays/actors/ovl_En_Knight/z_en_knight.h
@@ -12,16 +12,16 @@ typedef struct EnKnight {
/* 0x144 */ s16 unk_144;
/* 0x146 */ char unk_146[0x2];
/* 0x148 */ s8 unk_148;
- /* 0x149 */ char pad149[8];
+ /* 0x149 */ char unk_149[0x8];
/* 0x151 */ s8 unk_151;
- /* 0x152 */ char pad152[1];
+ /* 0x152 */ char unk_152[0x1];
/* 0x153 */ u8 unk_153;
/* 0x154 */ u8 unk_154;
- /* 0x155 */ char pad155[0x2CB];
+ /* 0x155 */ char unk_155[0x2CB];
/* 0x420 */ EnKnightActionFunc actionFunc;
/* 0x424 */ char unk_424[0x25C];
/* 0x680 */ u8 unk_680;
- /* 0x681 */ char pad681[9];
+ /* 0x681 */ char unk_681[0x9];
/* 0x68A */ s16 unk_68A;
/* 0x68C */ char pad68C[0x48];
} EnKnight; // size = 0x6D4
diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
index ca3d2c326a..dc3ecc56ce 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
@@ -244,12 +244,12 @@ void EnKusa_DropCollectible(EnKusa* this, PlayState* play) {
s32 collectible;
s32 collectableParams;
- if ((GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_GRASS) || (GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_BUSH)) {
+ if ((KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_GRASS) || (KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_BUSH)) {
if (!KUSA_GET_PARAMS_0C(&this->actor)) {
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos,
KUSA_GET_RAND_COLLECTIBLE_ID(&this->actor) * 0x10);
}
- } else if (GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_REGROWING_GRASS) {
+ } else if (KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_REGROWING_GRASS) {
Item_DropCollectible(play, &this->actor.world.pos, 3);
} else {
collectible = func_800A8150(KUSA_GET_PARAMS_3F(&this->actor));
@@ -362,7 +362,7 @@ void EnKusa_InitCollider(Actor* thisx, PlayState* play) {
void EnKusa_Init(Actor* thisx, PlayState* play) {
EnKusa* this = THIS;
s32 pad;
- s32 kusaType = GET_KUSA_TYPE(&this->actor);
+ s32 kusaType = KUSA_GET_TYPE(&this->actor);
Actor_ProcessInitChain(&this->actor, sInitChain);
@@ -393,7 +393,7 @@ void EnKusa_Init(Actor* thisx, PlayState* play) {
this->isInWater |= 1;
}
- this->objIndex = Object_GetIndex(&play->objectCtx, objectIds[(GET_KUSA_TYPE(&this->actor))]);
+ this->objIndex = Object_GetIndex(&play->objectCtx, objectIds[(KUSA_GET_TYPE(&this->actor))]);
if (this->objIndex < 0) {
Actor_MarkForDeath(&this->actor);
return;
@@ -429,7 +429,7 @@ void EnKusa_WaitObject(EnKusa* this, PlayState* play) {
s32 pad;
if (Object_IsLoaded(&play->objectCtx, this->objIndex)) {
- s32 kusaType = GET_KUSA_TYPE(&this->actor);
+ s32 kusaType = KUSA_GET_TYPE(&this->actor);
if (this->isCut) {
EnKusa_SetupCut(this);
@@ -466,11 +466,11 @@ void EnKusa_WaitForInteract(EnKusa* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN);
if (KUSA_SHOULD_SPAWN_BUGS(&this->actor)) {
- if (GET_KUSA_TYPE(&this->actor) != ENKUSA_TYPE_GRASS_2) {
+ if (KUSA_GET_TYPE(&this->actor) != ENKUSA_TYPE_GRASS_2) {
EnKusa_SpawnBugs(this, play);
}
}
- if (GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_BUSH) {
+ if (KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_BUSH) {
Actor_MarkForDeath(&this->actor);
} else {
EnKusa_SetupCut(this);
@@ -489,7 +489,7 @@ void EnKusa_WaitForInteract(EnKusa* this, PlayState* play) {
if (this->actor.xzDistToPlayer < 400.0f) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
if (this->actor.xzDistToPlayer < 100.0f) {
- if (GET_KUSA_TYPE(&this->actor) != ENKUSA_TYPE_GRASS_2) {
+ if (KUSA_GET_TYPE(&this->actor) != ENKUSA_TYPE_GRASS_2) {
Actor_LiftActor(&this->actor, play);
}
}
@@ -558,7 +558,7 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) {
}
EnKusa_SpawnFragments(this, play);
EnKusa_DropCollectible(this, play);
- switch (GET_KUSA_TYPE(&this->actor)) {
+ switch (KUSA_GET_TYPE(&this->actor)) {
case ENKUSA_TYPE_BUSH:
case ENKUSA_TYPE_GRASS:
Actor_MarkForDeath(&this->actor);
@@ -611,7 +611,7 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) {
}
void EnKusa_SetupCut(EnKusa* this) {
- switch (GET_KUSA_TYPE(&this->actor)) {
+ switch (KUSA_GET_TYPE(&this->actor)) {
case ENKUSA_TYPE_GRASS:
case ENKUSA_TYPE_GRASS_2:
this->actionFunc = EnKusa_DoNothing;
diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
index a4be56cf68..eca474d5fc 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
@@ -34,6 +34,6 @@ extern const ActorInit En_Kusa_InitVars;
#define KUSA_GET_PARAMS_3F(thisx) (((thisx)->params >> 0x2) & 0x3F)
-#define GET_KUSA_TYPE(thisx)((thisx)->params & 0x3)
+#define KUSA_GET_TYPE(thisx)((thisx)->params & 0x3)
#endif // Z_EN_KUSA_H
diff --git a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.h b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.h
index 67e172ee8d..eb8276ac63 100644
--- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.h
+++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.h
@@ -9,8 +9,8 @@ struct EnKusa2UnkBssSubStruct;
typedef void (*EnKusa2ActionFunc)(struct EnKusa2*, PlayState*);
typedef void (*EnKusa2BssFunc)(struct EnKusa2UnkBssSubStruct*);
-#define ENKUSA2_GET_1(thisx) (((thisx)->params) & 1)
-#define ENKUSA2_GET_7F00(thisx) (u8)((((thisx)->params) >> 8) & 0x7F)
+#define ENKUSA2_GET_1(thisx) ((thisx)->params & 1)
+#define ENKUSA2_GET_7F00(thisx) (u8)(((thisx)->params >> 8) & 0x7F)
typedef struct EnKusa2UnkBssSubStruct {
/* 0x00 */ Vec3f unk_00;
diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
index 647fe8f3a2..2ae3409285 100644
--- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
+++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
@@ -161,7 +161,7 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
this->unk31E = 0;
this->blinkTimer = 100;
- this->type = EN_MA_YTO_PARSE_TYPE(this->actor.params);
+ this->type = EN_MA_YTO_GET_TYPE(&this->actor);
if (!EnMaYto_CheckValidSpawn(this, play)) {
Actor_MarkForDeath(&this->actor);
return;
@@ -304,7 +304,7 @@ s32 EnMaYto_SearchRomani(EnMaYto* this, PlayState* play) {
while (npcActor != NULL) {
if (npcActor->id == ACTOR_EN_MA_YTS) {
EnMaYts* romani = (EnMaYts*)npcActor;
- s16 romaniType = EN_MA_YTS_PARSE_TYPE(&romani->actor);
+ s16 romaniType = EN_MA_YTS_GET_TYPE(&romani->actor);
if ((this->type == MA_YTO_TYPE_DINNER && romaniType == MA_YTS_TYPE_SITTING) ||
(this->type == MA_YTO_TYPE_BARN && romaniType == MA_YTS_TYPE_BARN)) {
diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h
index cc69a029d6..e21b30c296 100644
--- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h
+++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h
@@ -40,7 +40,7 @@ typedef enum {
/* 4 */ MA_YTO_TYPE_4 // HugCutscene? Doesn't seem to work properly in-game
} EnMaYtoType;
-#define EN_MA_YTO_PARSE_TYPE(params) (((params)&0xF000) >> 12)
+#define EN_MA_YTO_GET_TYPE(thisx) (((thisx)->params & 0xF000) >> 12)
#define EN_MA_YTO_PARAM(enMaYtsType, arg1) (((enMaYtsType) << 12) | ((arg1) << 8))
#endif // Z_EN_MA_YTO_H
diff --git a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
index f5456f7a21..5fcf1c7f06 100644
--- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
+++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
@@ -218,7 +218,7 @@ void EnMaYts_Init(Actor* thisx, PlayState* play) {
EnMaYts* this = THIS;
s32 pad;
- this->type = EN_MA_YTS_PARSE_TYPE(thisx);
+ this->type = EN_MA_YTS_GET_TYPE(thisx);
if (!EnMaYts_CheckValidSpawn(this, play)) {
Actor_MarkForDeath(&this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h
index c3da6b71d7..e34ef3d0ef 100644
--- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h
+++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h
@@ -16,16 +16,16 @@ typedef struct EnMaYts {
/* 0x1D8 */ struct_800BD888_arg1 unk_1D8;
/* 0x200 */ s32 unk_200; // Set, but not used
/* 0x204 */ Vec3s jointTable[ROMANI_LIMB_MAX];
- /* 0x28E */ char unk_28E[0x6];
+ /* 0x28E */ UNK_TYPE1 unk_28E[0x6];
/* 0x294 */ Vec3s morphTable[ROMANI_LIMB_MAX];
- /* 0x31E */ char unk_31E[0x8];
+ /* 0x31E */ UNK_TYPE1 unk_31E[0x8];
/* 0x326 */ s16 blinkTimer;
/* 0x328 */ s16 overrideEyeTexIndex; // If non-zero, then this index will be used instead of eyeTexIndex
/* 0x32A */ s16 eyeTexIndex;
/* 0x32C */ s16 unk_32C; // flag?
/* 0x32E */ s16 mouthTexIndex;
/* 0x330 */ s16 type;
- /* 0x332 */ char unk_332[0x2];
+ /* 0x332 */ UNK_TYPE1 unk_332[0x2];
/* 0x334 */ s16 endCreditsFlag;
/* 0x336 */ s16 hasBow;
/* 0x338 */ u16 textId;
@@ -40,7 +40,7 @@ typedef enum {
/* 3 */ MA_YTS_TYPE_ENDCREDITS
} EnMaYtsType;
-#define EN_MA_YTS_PARSE_TYPE(actor) ((((actor)->params)&0xF000) >> 12)
+#define EN_MA_YTS_GET_TYPE(thisx) (((thisx)->params & 0xF000) >> 12)
#define EN_MA_YTS_PARAM(enMaYtsType) ((enMaYtsType) << 12)
/**
diff --git a/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/src/overlays/actors/ovl_En_Mk/z_en_mk.c
index 03dda25adb..cb25445b9d 100644
--- a/src/overlays/actors/ovl_En_Mk/z_en_mk.c
+++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.c
@@ -365,7 +365,7 @@ void func_80959C94(EnMk* this, PlayState* play) {
Message_StartTextbox(play, 0xFB3, &this->actor);
} else {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 350.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 350.0f, 1000.0f, PLAYER_AP_MINUS1);
}
}
diff --git a/src/overlays/actors/ovl_En_Ms/z_en_ms.c b/src/overlays/actors/ovl_En_Ms/z_en_ms.c
index 0a3573516d..01b5c4becc 100644
--- a/src/overlays/actors/ovl_En_Ms/z_en_ms.c
+++ b/src/overlays/actors/ovl_En_Ms/z_en_ms.c
@@ -149,7 +149,7 @@ void EnMs_Talk(EnMs* this, PlayState* play) {
void EnMs_Sell(EnMs* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->actor.textId = 0;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, 0);
+ func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_AP_NONE);
this->actionFunc = EnMs_TalkAfterPurchase;
} else {
Actor_PickUp(&this->actor, play, GI_MAGIC_BEANS, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
@@ -161,7 +161,7 @@ void EnMs_TalkAfterPurchase(EnMs* this, PlayState* play) {
func_80151938(play, 0x936); // "You can plant 'em whenever you want [...]"
this->actionFunc = EnMs_Talk;
} else {
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, -1);
+ func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_AP_MINUS1);
}
}
diff --git a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
index 83156a15f5..1fc99ace8e 100644
--- a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
+++ b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
@@ -433,8 +433,7 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
func_801477B4(play);
func_800B7298(play, &this->actor, 7);
- Parameter_AddMagic(play,
- ((void)0, gSaveContext.unk_3F30) + (gSaveContext.save.playerData.doubleMagic * 48) + 48);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
gSaveContext.eventInf[1] &= (u8)~1;
gSaveContext.eventInf[1] &= (u8)~2;
diff --git a/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
index bd56373e57..bf91c75161 100644
--- a/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
+++ b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
@@ -134,7 +134,7 @@ void EnNeoReeba_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.damageTable = &sDamageTable;
this->actor.targetMode = 2;
- this->actor.hintId = 0x47;
+ this->actor.hintId = TATL_HINT_ID_LEEVER;
this->actor.gravity = -0.5f;
this->targetPos = gZeroVec3f;
diff --git a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
index a0de8cc484..938696e881 100644
--- a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
+++ b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
@@ -95,7 +95,7 @@ static DamageTable D_80870900 = {
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_80870920[] = {
- ICHAIN_S8(hintId, 66, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_OCTOROK, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
index fc5a2a724a..ef46c5e816 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -291,7 +291,7 @@ void EnOssan_UpdateCursorPos(PlayState* play, EnOssan* this) {
s16 x;
s16 y;
- Actor_GetScreenPos(play, &this->items[this->cursorIdx]->actor, &x, &y);
+ Actor_GetScreenPos(play, &this->items[this->cursorIndex]->actor, &x, &y);
this->cursorPos.x = x;
this->cursorPos.y = y;
}
@@ -332,7 +332,7 @@ s32 EnOssan_TestEndInteraction(EnOssan* this, PlayState* play, Input* input) {
s32 EnOssan_TestCancelOption(EnOssan* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
return true;
}
return false;
@@ -500,7 +500,7 @@ u8 EnOssan_SetCursorIndexFromNeutral(EnOssan* this, u8 shelfOffset) {
u8 i;
// if cursor is on the top shelf
- if (this->cursorIdx & 1) {
+ if (this->cursorIndex & 1) {
// scan top shelf
for (i = shelfOffset + 1; i < shelfOffset + 4; i += 2) {
if (this->items[i] != NULL) {
@@ -530,26 +530,26 @@ u8 EnOssan_SetCursorIndexFromNeutral(EnOssan* this, u8 shelfOffset) {
return CURSOR_INVALID;
}
-u8 EnOssan_CursorRight(EnOssan* this, u8 cursorIdx, u8 shelfSlotMin) {
+u8 EnOssan_CursorRight(EnOssan* this, u8 cursorIndex, u8 shelfSlotMin) {
u8 end = shelfSlotMin + 4;
- while (cursorIdx >= shelfSlotMin && cursorIdx < end) {
- cursorIdx -= 2;
- if (cursorIdx >= shelfSlotMin && cursorIdx < end) {
- if (this->items[cursorIdx] != NULL) {
- return cursorIdx;
+ while (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ cursorIndex -= 2;
+ if (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ if (this->items[cursorIndex] != NULL) {
+ return cursorIndex;
}
}
}
return CURSOR_INVALID;
}
-u8 EnOssan_CursorLeft(EnOssan* this, u8 cursorIdx, u8 shelfSlotMax) {
- while (cursorIdx < shelfSlotMax) {
- cursorIdx += 2;
- if (cursorIdx < shelfSlotMax) {
- if (this->items[cursorIdx] != NULL) {
- return cursorIdx;
+u8 EnOssan_CursorLeft(EnOssan* this, u8 cursorIndex, u8 shelfSlotMax) {
+ while (cursorIndex < shelfSlotMax) {
+ cursorIndex += 2;
+ if (cursorIndex < shelfSlotMax) {
+ if (this->items[cursorIndex] != NULL) {
+ return cursorIndex;
}
}
}
@@ -619,7 +619,7 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
s32 pad;
Player* player = GET_PLAYER(play);
- u8 cursorIdx;
+ u8 cursorIndex;
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
if (ActorCutscene_GetCurrentIndex() == 0x7C) {
@@ -634,18 +634,18 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
if (!EnOssan_TestEndInteraction(this, play, CONTROLLER1(&play->state)) &&
(!Message_ShouldAdvance(play) || !EnOssan_FacingShopkeeperDialogResult(this, play))) {
if (this->stickAccumX < 0) {
- cursorIdx = EnOssan_SetCursorIndexFromNeutral(this, 4);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_SetCursorIndexFromNeutral(this, 4);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
EnOssan_SetupAction(this, EnOssan_LookToLeftShelf);
func_8011552C(play, 6);
this->stickLeftPrompt.isEnabled = false;
play_sound(NA_SE_SY_CURSOR);
}
} else if (this->stickAccumX > 0) {
- cursorIdx = EnOssan_SetCursorIndexFromNeutral(this, 0);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_SetCursorIndexFromNeutral(this, 0);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
EnOssan_SetupAction(this, EnOssan_LookToRightShelf);
func_8011552C(play, 6);
this->stickRightPrompt.isEnabled = false;
@@ -693,7 +693,7 @@ void EnOssan_LookToLeftShelf(EnOssan* this, PlayState* play) {
this->cutsceneState = ENOSSAN_CUTSCENESTATE_PLAYING;
EnOssan_UpdateCursorPos(play, this);
EnOssan_SetupAction(this, EnOssan_BrowseLeftShelf);
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
} else {
ActorCutscene_SetIntentToPlay(this->cutscene);
}
@@ -721,7 +721,7 @@ void EnOssan_LookToRightShelf(EnOssan* this, PlayState* play) {
this->cutsceneState = ENOSSAN_CUTSCENESTATE_PLAYING;
EnOssan_UpdateCursorPos(play, this);
EnOssan_SetupAction(this, EnOssan_BrowseRightShelf);
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
} else {
ActorCutscene_SetIntentToPlay(this->cutscene);
}
@@ -731,16 +731,16 @@ void EnOssan_LookToRightShelf(EnOssan* this, PlayState* play) {
}
void EnOssan_CursorUpDown(EnOssan* this) {
- u8 curTemp = this->cursorIdx;
+ u8 curTemp = this->cursorIndex;
u8 curScanTemp;
if (this->stickAccumY < 0) {
curTemp &= (u8)~1;
if (this->items[curTemp] != NULL) {
- this->cursorIdx = curTemp;
+ this->cursorIndex = curTemp;
return;
}
- // cursorIdx on right shelf
+ // cursorIndex on right shelf
if (curTemp < 4) {
curScanTemp = curTemp + 2;
if (curScanTemp >= 4) {
@@ -748,7 +748,7 @@ void EnOssan_CursorUpDown(EnOssan* this) {
}
while (curScanTemp != curTemp) {
if (this->items[curScanTemp] != NULL) {
- this->cursorIdx = curScanTemp;
+ this->cursorIndex = curScanTemp;
return;
}
curScanTemp += 2;
@@ -757,14 +757,14 @@ void EnOssan_CursorUpDown(EnOssan* this) {
}
}
} else {
- // cursorIdx on left shelf
+ // cursorIndex on left shelf
curScanTemp = curTemp + 2;
if (curScanTemp >= 8) {
curScanTemp = 4;
}
while (curScanTemp != curTemp) {
if (this->items[curScanTemp] != NULL) {
- this->cursorIdx = curScanTemp;
+ this->cursorIndex = curScanTemp;
return;
}
curScanTemp += 2;
@@ -776,10 +776,10 @@ void EnOssan_CursorUpDown(EnOssan* this) {
} else if (this->stickAccumY > 0) {
curTemp |= 1;
if (this->items[curTemp] != NULL) {
- this->cursorIdx = curTemp;
+ this->cursorIndex = curTemp;
return;
}
- // cursorIdx on right shelf
+ // cursorIndex on right shelf
if (curTemp < 4) {
curScanTemp = curTemp + 2;
if (curScanTemp >= 4) {
@@ -787,7 +787,7 @@ void EnOssan_CursorUpDown(EnOssan* this) {
}
while (curScanTemp != curTemp) {
if (this->items[curScanTemp] != NULL) {
- this->cursorIdx = curScanTemp;
+ this->cursorIndex = curScanTemp;
return;
}
curScanTemp += 2;
@@ -796,14 +796,14 @@ void EnOssan_CursorUpDown(EnOssan* this) {
}
}
} else {
- // cursorIdx on left shelf
+ // cursorIndex on left shelf
curScanTemp = curTemp + 2;
if (curScanTemp >= 8) {
curScanTemp = 5;
}
while (curScanTemp != curTemp) {
if (this->items[curScanTemp] != NULL) {
- this->cursorIdx = curScanTemp;
+ this->cursorIndex = curScanTemp;
return;
}
curScanTemp += 2;
@@ -816,7 +816,7 @@ void EnOssan_CursorUpDown(EnOssan* this) {
}
s32 EnOssan_HasPlayerSelectedItem(PlayState* play, EnOssan* this, Input* input) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
if (EnOssan_TestEndInteraction(this, play, input)) {
return true;
@@ -824,7 +824,7 @@ s32 EnOssan_HasPlayerSelectedItem(PlayState* play, EnOssan* this, Input* input)
if (EnOssan_TestItemSelected(play)) {
if (!item->isOutOfStock) {
this->prevActionFunc = this->actionFunc;
- func_80151938(play, this->items[this->cursorIdx]->choiceTextId);
+ func_80151938(play, this->items[this->cursorIndex]->choiceTextId);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
play_sound(NA_SE_SY_DECIDE);
@@ -841,8 +841,8 @@ s32 EnOssan_HasPlayerSelectedItem(PlayState* play, EnOssan* this, Input* input)
void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
s32 pad;
- u8 prevCursorIndex = this->cursorIdx;
- u8 cursorIdx;
+ u8 prevCursorIndex = this->cursorIndex;
+ u8 cursorIndex;
if (!EnOssan_ReturnItemToShelf(this)) {
this->delayTimer = 3;
@@ -857,38 +857,38 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
if (!EnOssan_HasPlayerSelectedItem(play, this, CONTROLLER1(&play->state))) {
if (this->moveHorizontal) {
if (this->stickAccumX > 0) {
- cursorIdx = EnOssan_CursorRight(this, this->cursorIdx, 4);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 4);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
} else {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
} else if (this->stickAccumX < 0) {
- cursorIdx = EnOssan_CursorLeft(this, this->cursorIdx, 8);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 8);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
}
}
} else {
if (this->stickAccumX > 0 && this->stickAccumX > 500) {
- cursorIdx = EnOssan_CursorRight(this, this->cursorIdx, 4);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 4);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
} else {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
} else if (this->stickAccumX < 0 && this->stickAccumX < -500) {
- cursorIdx = EnOssan_CursorLeft(this, this->cursorIdx, 8);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 8);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
}
}
}
EnOssan_CursorUpDown(this);
- if (this->cursorIdx != prevCursorIndex) {
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ if (this->cursorIndex != prevCursorIndex) {
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
play_sound(NA_SE_SY_CURSOR);
}
}
@@ -899,8 +899,8 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
s32 pad;
- u8 prevCursorIndex = this->cursorIdx;
- u8 cursorIdx;
+ u8 prevCursorIndex = this->cursorIndex;
+ u8 cursorIndex;
if (!EnOssan_ReturnItemToShelf(this)) {
this->delayTimer = 3;
@@ -915,38 +915,38 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
if (!EnOssan_HasPlayerSelectedItem(play, this, CONTROLLER1(&play->state))) {
if (this->moveHorizontal != 0) {
if (this->stickAccumX < 0) {
- cursorIdx = EnOssan_CursorRight(this, this->cursorIdx, 0);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 0);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
} else {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
} else if (this->stickAccumX > 0) {
- cursorIdx = EnOssan_CursorLeft(this, this->cursorIdx, 4);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
}
}
} else {
if (this->stickAccumX < 0 && this->stickAccumX < -500) {
- cursorIdx = EnOssan_CursorRight(this, this->cursorIdx, 0);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 0);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
} else {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
} else if (this->stickAccumX > 0 && this->stickAccumX > 500) {
- cursorIdx = EnOssan_CursorLeft(this, this->cursorIdx, 4);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
}
}
}
EnOssan_CursorUpDown(this);
- if (this->cursorIdx != prevCursorIndex) {
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ if (this->cursorIndex != prevCursorIndex) {
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
play_sound(NA_SE_SY_CURSOR);
}
}
@@ -981,7 +981,7 @@ void EnOssan_LookToShopkeeperFromShelf(EnOssan* this, PlayState* play) {
void EnOssan_SetupBuyItemWithFanfare(PlayState* play, EnOssan* this) {
Player* player = GET_PLAYER(play);
- Actor_PickUp(&this->actor, play, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
player->stateFlags2 &= ~0x20000000;
@@ -1001,7 +1001,7 @@ void EnOssan_SetupBuy(PlayState* play, EnOssan* this, u16 textId) {
}
void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
switch (item->canBuyFunc(play, item)) {
case CANBUY_RESULT_SUCCESS_1:
@@ -1061,7 +1061,7 @@ void EnOssan_SelectItem(EnOssan* this, PlayState* play) {
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
break;
}
}
@@ -1071,7 +1071,7 @@ void EnOssan_SelectItem(EnOssan* this, PlayState* play) {
void EnOssan_CannotBuy(EnOssan* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
}
}
@@ -1081,10 +1081,10 @@ void EnOssan_CanBuy(EnOssan* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->shopItemSelectedTween = 0.0f;
EnOssan_ResetItemPosition(this);
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->restockFunc(play, item);
this->actionFunc = this->prevActionFunc;
- func_80151938(play, this->items[this->cursorIdx]->actor.textId);
+ func_80151938(play, this->items[this->cursorIndex]->actor.textId);
}
}
@@ -1093,7 +1093,7 @@ void EnOssan_BuyItemWithFanfare(EnOssan* this, PlayState* play) {
this->actor.parent = NULL;
EnOssan_SetupAction(this, EnOssan_SetupItemPurchased);
} else {
- Actor_PickUp(&this->actor, play, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
}
}
@@ -1122,7 +1122,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
func_8011552C(play, 6);
if (Message_ShouldAdvance(play)) {
EnOssan_ResetItemPosition(this);
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->restockFunc(play, item);
if (!EnOssan_TestEndInteraction(this, play, CONTROLLER1(&play->state))) {
switch (play->msgCtx.choiceIndex) {
@@ -1144,7 +1144,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
}
} else if (talkState == TEXT_STATE_5 && Message_ShouldAdvance(play)) {
EnOssan_ResetItemPosition(this);
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->restockFunc(play, item);
player->actor.shape.rot.y = BINANG_ROT180(player->actor.shape.rot.y);
player->stateFlags2 |= 0x20000000;
@@ -1184,7 +1184,7 @@ void EnOssan_PositionSelectedItem(EnOssan* this) {
{ -35.0f, 68.0f, -130.0f },
};
EnGirlA* item;
- u8 i = this->cursorIdx;
+ u8 i = this->cursorIndex;
u8 i2;
ShopItem* shopItem = &sShops[this->actor.params][i];
Vec3f worldPos;
@@ -1245,7 +1245,7 @@ void EnOssan_UpdateItemSelectedProperty(EnOssan* this) {
this->drawCursor == 0) {
item->isSelected = false;
} else {
- item->isSelected = this->cursorIdx == i ? true : false;
+ item->isSelected = this->cursorIndex == i ? true : false;
}
}
}
@@ -1479,7 +1479,7 @@ void EnOssan_InitShop(EnOssan* this, PlayState* play) {
this->actor.colChkInfo.cylRadius = 50;
this->stickAccumX = this->stickAccumY = 0;
- this->cursorIdx = 0;
+ this->cursorIndex = 0;
this->cursorPos.z = 1.5f;
this->cursorColor.r = 0;
this->cursorColor.g = 80;
@@ -1573,6 +1573,7 @@ void EnOssan_DrawCursor(PlayState* play, EnOssan* this, f32 x, f32 y, f32 z, u8
(void)"../z_en_oB1.c";
OPEN_DISPS(play->state.gfxCtx);
+
if (drawCursor != 0) {
func_8012C654(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
@@ -1587,6 +1588,7 @@ void EnOssan_DrawCursor(PlayState* play, EnOssan* this, f32 x, f32 y, f32 z, u8
dsdx = (1.0f / z) * 1024.0f;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, 0, 0, dsdx, dsdx);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1605,6 +1607,7 @@ void EnOssan_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32
(void)"../z_en_oB1.c";
OPEN_DISPS(play->state.gfxCtx);
+
gDPPipeSync(OVERLAY_DISP++);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, r, g, b, a);
@@ -1621,6 +1624,7 @@ void EnOssan_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32
dtdy = dy * unk;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, dsdx, dtdy);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1631,6 +1635,7 @@ void EnOssan_DrawStickDirectionPrompts(PlayState* play, EnOssan* this) {
(void)"../z_en_oB1.c";
OPEN_DISPS(play->state.gfxCtx);
+
if (drawStickRightPrompt || drawStickLeftPrompt) {
func_8012C654(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -1665,6 +1670,7 @@ void EnOssan_DrawStickDirectionPrompts(PlayState* play, EnOssan* this) {
this->stickRightPrompt.texZ, 0, 0, 1.0f, 1.0f);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1713,6 +1719,7 @@ void EnOssan_CuriosityShopMan_Draw(Actor* thisx, PlayState* play) {
EnOssan* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
func_8012C28C(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
@@ -1720,6 +1727,7 @@ void EnOssan_CuriosityShopMan_Draw(Actor* thisx, PlayState* play) {
&this->actor);
EnOssan_DrawCursor(play, this, this->cursorPos.x, this->cursorPos.y, this->cursorPos.z, this->drawCursor);
EnOssan_DrawStickDirectionPrompts(play, this);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1729,11 +1737,13 @@ void EnOssan_PartTimer_Draw(Actor* thisx, PlayState* play) {
EnOssan* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
func_8012C28C(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnOssan_PartTimer_OverrideLimbDraw, EnOssan_PartTimer_PostLimbDraw, &this->actor);
EnOssan_DrawCursor(play, this, this->cursorPos.x, this->cursorPos.y, this->cursorPos.z, this->drawCursor);
EnOssan_DrawStickDirectionPrompts(play, this);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
index 539906ea85..20d669ea40 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
@@ -35,7 +35,7 @@ typedef struct EnOssan {
/* 0x230 */ f32 cursorAnimTween;
/* 0x234 */ u8 cursorAnimState;
/* 0x235 */ u8 drawCursor;
- /* 0x236 */ u8 cursorIdx;
+ /* 0x236 */ u8 cursorIndex;
/* 0x238 */ StickDirectionPrompt stickLeftPrompt;
/* 0x270 */ StickDirectionPrompt stickRightPrompt;
/* 0x2A8 */ f32 arrowAnimTween;
diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.c b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
index 8c2465585c..bf93b729fb 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
@@ -606,7 +606,7 @@ void func_80B5CB0C(EnOt* this, PlayState* play) {
void func_80B5CBA0(EnOt* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, 0);
+ func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_AP_NONE);
this->actionFunc = func_80B5CBEC;
}
@@ -617,7 +617,7 @@ void func_80B5CBEC(EnOt* this, PlayState* play) {
} else {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0xE38, 0x38E);
this->actor.world.rot.y = this->actor.shape.rot.y;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, 0);
+ func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_AP_NONE);
}
}
@@ -693,7 +693,7 @@ void func_80B5CEC8(EnOt* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0xE38, 0x38E);
if (this->unk_32C & 0x800) {
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, 0);
+ func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_AP_NONE);
} else {
this->actor.flags &= ~ACTOR_FLAG_10000;
if ((player->actor.bgCheckFlags & 1) && !func_801242B4(player) && (this->actor.xzDistToPlayer < 130.0f)) {
@@ -1152,7 +1152,7 @@ void func_80B5E1D8(PlayState* play, EnOtUnkStruct* arg1, s32 arg2) {
Matrix_RotateYS(BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_APPLY);
Matrix_Scale(arg1->unk_04, arg1->unk_04, arg1->unk_04, MTXMODE_APPLY);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gameplay_keep_Tex_05E6F0));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropRecoveryHeartTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_ot_DL_000078);
}
diff --git a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
index 5feb502459..2ff9d814e0 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -163,7 +163,7 @@ static ColliderJntSphInit sJntSphInit = {
static CollisionCheckInfoInit sColChkInit = { 3, 30, 60, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 69, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GEKKO_SNAPPER, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(targetArrowOffset, -13221, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 7, ICHAIN_CONTINUE),
@@ -1191,7 +1191,7 @@ void EnPametfrog_SetupCallSnapper(EnPametfrog* this, PlayState* play) {
// Zooms in on Gekko
Play_SetCameraAtEye(play, this->subCamId, &subCamAt, &subCamEye);
this->timer = 0;
- this->actor.hintId = 0x5F;
+ this->actor.hintId = TATL_HINT_ID_GEKKO_GIANT_SLIME;
this->actionFunc = EnPametfrog_CallSnapper;
}
diff --git a/src/overlays/actors/ovl_En_Part/z_en_part.c b/src/overlays/actors/ovl_En_Part/z_en_part.c
index a2f2c618fa..ef348f4cc5 100644
--- a/src/overlays/actors/ovl_En_Part/z_en_part.c
+++ b/src/overlays/actors/ovl_En_Part/z_en_part.c
@@ -5,6 +5,7 @@
*/
#include "z_en_part.h"
+#include "overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -96,7 +97,7 @@ void func_808654C4(EnPart* this, PlayState* play) {
effectVelocity.y = Rand_ZeroOne() + 1.0f;
effectScale = Rand_S16Offset(80, 100);
EffectSsDtBubble_SpawnColorProfile(play, &effectPos, &effectVelocity, &gZeroVec3f, effectScale, 25,
- 0, 1);
+ DTBUBBLE_COLOR_PROFILE_RED, true);
}
break;
}
diff --git a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
index d0598ce79b..02e660f147 100644
--- a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
+++ b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
@@ -194,7 +194,7 @@ void EnPeehat_Init(Actor* thisx, PlayState* play) {
this->actor.shape.yOffset = -1000.0f;
}
Actor_SetScale(&this->actor, 0.036f);
- this->actor.hintId = 0x48;
+ this->actor.hintId = TATL_HINT_ID_PEAHAT;
func_80897498(this);
} else {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit2);
@@ -205,7 +205,7 @@ void EnPeehat_Init(Actor* thisx, PlayState* play) {
this->colliderCylinder.dim.radius = 20;
this->colliderCylinder.dim.height = 15;
this->colliderCylinder.dim.yShift = -5;
- this->actor.hintId = 0x49;
+ this->actor.hintId = TATL_HINT_ID_PEAHAT_LARVA;
this->colliderCylinder.base.ocFlags1 &= ~OC1_ON;
func_80897A34(this);
@@ -788,7 +788,7 @@ void EnPeehat_Update(Actor* thisx, PlayState* play2) {
}
if (this->colliderTris.base.atFlags & AT_ON) {
- thisx->flags |= 0x1000000;
+ thisx->flags |= ACTOR_FLAG_1000000;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderTris.base);
if (thisx->params == 0) {
Vec3f sp74;
diff --git a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
index 955b7d5249..a2c5376063 100644
--- a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
+++ b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
@@ -129,7 +129,7 @@ void EnPoFusen_Init(Actor* thisx, PlayState* play) {
this->limb9Rot = 0x71C;
this->randBaseRotChange = 0;
- if (GET_IS_FUSE_TYPE_PARAM(&this->actor)) {
+ if (ENPOFUSEN_IS_FUSE_TYPE(&this->actor)) {
EnPoFusen_InitFuse(this);
return;
}
@@ -147,7 +147,7 @@ u16 EnPoFusen_CheckParent(EnPoFusen* this, PlayState* play) {
Actor* actorPtr;
actorPtr = play->actorCtx.actorLists[ACTORCAT_NPC].first;
- if (GET_IS_FUSE_TYPE_PARAM(&this->actor)) {
+ if (ENPOFUSEN_IS_FUSE_TYPE(&this->actor)) {
return true;
}
@@ -168,7 +168,7 @@ u16 EnPoFusen_CheckCollision(EnPoFusen* this, PlayState* play) {
}
this->collider.dim.worldSphere.center.x = this->actor.world.pos.x;
- this->collider.dim.worldSphere.center.y = (this->actor.world.pos.y + 20.0f);
+ this->collider.dim.worldSphere.center.y = this->actor.world.pos.y + 20.0f;
this->collider.dim.worldSphere.center.z = this->actor.world.pos.z;
if ((this->collider.base.acFlags & AC_HIT) && (this->actor.colChkInfo.damageEffect == 0xF)) {
@@ -243,7 +243,7 @@ void EnPoFusen_Pop(EnPoFusen* this, PlayState* play) {
void EnPoFusen_InitFuse(EnPoFusen* this) {
s16 rotZ = this->actor.shape.rot.z;
- this->fuse = GET_FUSE_LEN_PARAM(&this->actor);
+ this->fuse = ENPOFUSEN_GET_FUSE_LEN(&this->actor);
this->actor.shape.rot.z = 0;
this->randScaleChange = rotZ & 0xFFFF;
this->actionFunc = EnPoFusen_IdleFuse;
diff --git a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.h b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.h
index 92f75afabb..991b0cf9e1 100644
--- a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.h
+++ b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.h
@@ -5,8 +5,8 @@
struct EnPoFusen;
-#define GET_FUSE_LEN_PARAM(thisx) ((thisx)->params & 0x3FF)
-#define GET_IS_FUSE_TYPE_PARAM(thisx) ((thisx)->params & 0x8000)
+#define ENPOFUSEN_GET_FUSE_LEN(thisx) ((thisx)->params & 0x3FF)
+#define ENPOFUSEN_IS_FUSE_TYPE(thisx) ((thisx)->params & 0x8000)
typedef void (*EnPoFusenActionFunc)(struct EnPoFusen*, PlayState*);
diff --git a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
index b9afa5229d..57e32a5541 100644
--- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
+++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
@@ -177,7 +177,7 @@ void EnPoSisters_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->type = ENPOSISTERS_GET_TYPE(thisx);
- this->actor.hintId = this->type + 80;
+ this->actor.hintId = this->type + TATL_HINT_ID_POE_SISTER_MEG;
this->megCloneId = ENPOSISTERS_GET_MEG_CLONE_ID(thisx);
this->floatingBobbingTimer = 32;
this->zTargetTimer = 20;
diff --git a/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
index 9d1dca75ef..dde6236b52 100644
--- a/src/overlays/actors/ovl_En_Poh/z_en_poh.c
+++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
@@ -143,7 +143,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 25, 50, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 68, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_POE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3200, ICHAIN_STOP),
};
@@ -388,7 +388,7 @@ void func_80B2D2C0(EnPoh* this) {
this->actor.speedXZ = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->unk_18E = 0;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.flags &= ~ACTOR_FLAG_1;
this->actionFunc = func_80B2D300;
}
diff --git a/src/overlays/actors/ovl_En_Pp/z_en_pp.c b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
index 7766fa8fa5..7587e38ca7 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.c
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
@@ -1110,7 +1110,7 @@ void EnPp_Mask_SetupDetach(EnPp* this, PlayState* play) {
* Moves the mask through the air and eventually makes it burst into flames.
*/
void EnPp_Mask_Detach(EnPp* this, PlayState* play) {
- if (((this->actor.flags & ACTOR_FLAG_2000) != ACTOR_FLAG_2000) || (this->action == EN_PP_ACTION_MASK_DEAD)) {
+ if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_2000) || (this->action == EN_PP_ACTION_MASK_DEAD)) {
switch (this->actionVar.maskDetachState) {
case EN_PP_MASK_DETACH_STATE_START:
this->action = EN_PP_ACTION_MASK_DEAD;
diff --git a/src/overlays/actors/ovl_En_Pr/z_en_pr.c b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
index c7fae7c884..724b2c19fe 100644
--- a/src/overlays/actors/ovl_En_Pr/z_en_pr.c
+++ b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
@@ -118,7 +118,7 @@ void EnPr_Init(Actor* thisx, PlayState* play2) {
this->actor.colChkInfo.health = 3;
this->actor.colChkInfo.mass = 50;
- this->actor.hintId = 0x5C;
+ this->actor.hintId = TATL_HINT_ID_DESBREKO;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
diff --git a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
index 2454639c5b..4564c679f0 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
@@ -109,7 +109,7 @@ void EnPr2_Init(Actor* thisx, PlayState* play) {
EnPr2* this = THIS;
this->actor.targetMode = 3;
- this->actor.hintId = 0x5B;
+ this->actor.hintId = TATL_HINT_ID_SKULLFISH;
this->unk_1EC = 255;
this->actor.colChkInfo.health = 1;
this->actor.colChkInfo.damageTable = &sDamageTable;
diff --git a/src/overlays/actors/ovl_En_Prz/z_en_prz.c b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
index 6fc5ea24a2..e5c6115783 100644
--- a/src/overlays/actors/ovl_En_Prz/z_en_prz.c
+++ b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
@@ -110,7 +110,7 @@ void EnPrz_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 3;
this->unk_1E8 = 255;
- this->actor.hintId = 0x5B;
+ this->actor.hintId = TATL_HINT_ID_SKULLFISH;
this->actor.colChkInfo.damageTable = &sDamageTable;
this->actor.colChkInfo.health = 1;
diff --git a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
index 095ee3feca..56201271b4 100644
--- a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
+++ b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
@@ -282,7 +282,7 @@ void EnRailSkb_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actor.speedXZ = 1.6f;
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->unk_3F2 = 0;
this->unk_2E4 = -1;
this->unk_3FC = 0;
@@ -825,7 +825,7 @@ void func_80B723F8(EnRailSkb* this) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags |= ACTOR_FLAG_100000;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
}
@@ -926,7 +926,7 @@ void func_80B72880(EnRailSkb* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags |= ACTOR_FLAG_100000;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
func_80B71650(this);
}
@@ -934,7 +934,7 @@ void func_80B72880(EnRailSkb* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags &= ~ACTOR_FLAG_100000;
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.textId = 0;
func_80B70FA0(this);
}
diff --git a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
index 10bbf2f83a..58ab51cf83 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -246,7 +246,7 @@ void EnRailgibud_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actor.targetMode = 0;
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
this->actor.textId = 0;
if (ENRAILGIBUD_IS_CUTSCENE_TYPE(&this->actor)) {
EnRailgibud_InitCutsceneGibdo(this, play);
@@ -580,7 +580,7 @@ void EnRailgibud_Damage(EnRailgibud* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
if ((this->drawDmgEffTimer > 0) && (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) &&
(this->type == EN_RAILGIBUD_TYPE_GIBDO)) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
SkelAnime_InitFlex(play, &this->skelAnime, &gRedeadSkel, NULL, this->jointTable, this->morphTable,
GIBDO_LIMB_MAX);
this->type = EN_RAILGIBUD_TYPE_REDEAD;
@@ -933,7 +933,7 @@ void EnRailgibud_CheckForGibdoMask(EnRailgibud* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
this->actor.flags &= ~(ACTOR_FLAG_4 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_8 | ACTOR_FLAG_1);
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
if ((this->actionFunc != EnRailgibud_WalkInCircles) && (this->actionFunc != EnRailgibud_WalkToHome)) {
EnRailgibud_SetupWalkToHome(this);
@@ -943,9 +943,9 @@ void EnRailgibud_CheckForGibdoMask(EnRailgibud* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
if (this->type == EN_RAILGIBUD_TYPE_REDEAD) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
} else {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
}
this->actor.textId = 0;
}
diff --git a/src/overlays/actors/ovl_En_Rat/z_en_rat.c b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
index 1054876aab..9057fdb4c2 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.c
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
@@ -118,7 +118,7 @@ static TexturePtr sSparkTextures[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 97, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_REAL_BOMBCHU, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 15, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 5000, ICHAIN_STOP),
};
@@ -822,7 +822,7 @@ void EnRat_Update(Actor* thisx, PlayState* play) {
if (this->damageReaction.hookedState == EN_RAT_HOOK_STARTED) {
// The player just hit the Real Bombchu with the Hookshot.
this->damageReaction.hookedState = EN_RAT_HOOKED;
- } else if ((this->actor.flags & ACTOR_FLAG_2000) != ACTOR_FLAG_2000) {
+ } else if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_2000)) {
// The player has hooked the Real Bombchu for more than one frame, but
// the actor flag indicating that the Hookshot is attached is *not* set.
EnRat_Explode(this, play);
diff --git a/src/overlays/actors/ovl_En_Rd/z_en_rd.c b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
index 1f4c102817..0092189c5c 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.c
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
@@ -223,7 +223,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
if (!EnRd_ShouldNotDance(play)) {
EnRd_SetupSquattingDance(this);
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
EnRd_SetupIdle(this);
}
this->setupDanceFunc = EnRd_SetupSquattingDance;
@@ -233,7 +233,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
if (!EnRd_ShouldNotDance(play)) {
EnRd_SetupClappingDance(this);
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
EnRd_SetupIdle(this);
}
this->setupDanceFunc = EnRd_SetupClappingDance;
@@ -243,7 +243,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
if (!EnRd_ShouldNotDance(play)) {
EnRd_SetupPirouette(this);
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
EnRd_SetupIdle(this);
}
this->setupDanceFunc = EnRd_SetupPirouette;
@@ -251,9 +251,9 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
default:
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
this->setupDanceFunc = EnRd_SetupIdle;
@@ -436,9 +436,9 @@ void EnRd_SquattingDance(EnRd* this, PlayState* play) {
this->isMourning = false;
if ((this->actor.xzDistToPlayer <= 150.0f) && EnRd_ShouldNotDance(play) && func_800B715C(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
Animation_Change(&this->skelAnime, &gGibdoRedeadLookBackAnim, 0.0f, 0.0f, 19.0f, ANIMMODE_ONCE, -10.0f);
this->actionFunc = EnRd_EndClappingOrSquattingDanceWhenPlayerIsClose;
@@ -446,9 +446,9 @@ void EnRd_SquattingDance(EnRd* this, PlayState* play) {
if (EnRd_ShouldNotDance(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
}
@@ -480,9 +480,9 @@ void EnRd_ClappingDance(EnRd* this, PlayState* play) {
this->isMourning = false;
if ((this->actor.xzDistToPlayer <= 150.0f) && EnRd_ShouldNotDance(play) && func_800B715C(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
Animation_Change(&this->skelAnime, &gGibdoRedeadLookBackAnim, 0.0f, 0.0f, 19.0f, ANIMMODE_ONCE, -10.0f);
this->actionFunc = EnRd_EndClappingOrSquattingDanceWhenPlayerIsClose;
@@ -490,9 +490,9 @@ void EnRd_ClappingDance(EnRd* this, PlayState* play) {
if (EnRd_ShouldNotDance(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
}
@@ -541,18 +541,18 @@ void EnRd_Pirouette(EnRd* this, PlayState* play) {
this->isMourning = false;
if ((this->actor.xzDistToPlayer <= 150.0f) && EnRd_ShouldNotDance(play) && func_800B715C(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
this->actionFunc = EnRd_EndPirouetteWhenPlayerIsClose;
}
if (EnRd_ShouldNotDance(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
}
diff --git a/src/overlays/actors/ovl_En_Rg/z_en_rg.c b/src/overlays/actors/ovl_En_Rg/z_en_rg.c
index 896947fa60..2d976bdd5c 100644
--- a/src/overlays/actors/ovl_En_Rg/z_en_rg.c
+++ b/src/overlays/actors/ovl_En_Rg/z_en_rg.c
@@ -123,8 +123,8 @@ AnimationInfoS D_80BF5914[] = {
{ &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, 0 },
};
-TexturePtr D_80BF5934[] = {
- gDust8Tex, gDust7Tex, gDust6Tex, gDust5Tex, gDust4Tex, gDust3Tex, gDust2Tex, gDust1Tex,
+static TexturePtr sDustTextures[] = {
+ gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
Color_RGBA8 D_80BF5954[] = {
@@ -190,7 +190,7 @@ void func_80BF3920(EnRgStruct* ptr, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
idx = temp_f20 * 7.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BF5934[idx]));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
Matrix_Pop();
diff --git a/src/overlays/actors/ovl_En_Rr/z_en_rr.c b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
index 8fc202dddc..4a61e62b9c 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.c
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
@@ -118,7 +118,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 45, 60, 250 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 55, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_LIKE_LIKE, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -400, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 2000, ICHAIN_CONTINUE),
diff --git a/src/overlays/actors/ovl_En_Sb/z_en_sb.c b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
index acd645d63a..adcb781150 100644
--- a/src/overlays/actors/ovl_En_Sb/z_en_sb.c
+++ b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
@@ -92,7 +92,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 39, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_SHELLBLADE, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
index 5aa54307ad..3eb978314d 100644
--- a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
+++ b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
@@ -36,12 +36,12 @@ const ActorInit En_Sc_Ruppe_InitVars = {
};
RuppeInfo sRupeeInfo[] = {
- { gameplay_keep_Tex_061FC0, 1 }, // Green rupee
- { gameplay_keep_Tex_061FE0, 5 }, // Blue rupee
- { gameplay_keep_Tex_062000, 20 }, // Red rupee
- { gameplay_keep_Tex_062040, 200 }, // Orange rupee
- { gameplay_keep_Tex_062020, 50 }, // Purple rupee
- { gameplay_keep_Tex_062060, 10 }, // (unused)
+ { gRupeeGreenTex, 1 }, // Green rupee
+ { gRupeeBlueTex, 5 }, // Blue rupee
+ { gRupeeRedTex, 20 }, // Red rupee
+ { gRupeeOrangeTex, 200 }, // Orange rupee
+ { gRupeePurpleTex, 50 }, // Purple rupee
+ { gRupeeSilverTex, 10 }, // (unused)
};
static ColliderCylinderInit sCylinderInit = {
@@ -185,7 +185,7 @@ void EnScRuppe_Draw(Actor* thisx, PlayState* play) {
func_800B8050(&this->actor, play, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeInfo[this->ruppeIndex].tex));
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_0622C0);
+ gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
index 2265fd22ed..4bccdb846c 100644
--- a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
+++ b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
@@ -16,9 +16,6 @@ void EnScopecoin_Destroy(Actor* thisx, PlayState* play);
void EnScopecoin_Update(Actor* thisx, PlayState* play);
void EnScopecoin_Draw(Actor* thisx, PlayState* play);
-void func_80BFCFA0(EnScopecoin* this, PlayState* play);
-void func_80BFCFB8(EnScopecoin* this, PlayState* play);
-
const ActorInit En_Scopecoin_InitVars = {
ACTOR_EN_SCOPECOIN,
ACTORCAT_NPC,
@@ -31,12 +28,12 @@ const ActorInit En_Scopecoin_InitVars = {
(ActorFunc)EnScopecoin_Draw,
};
-void func_80BFCFA0(EnScopecoin* this, PlayState* play) {
- this->actor.shape.rot.y += 500;
+void EnScopecoin_Spin(EnScopecoin* this, PlayState* play) {
+ this->actor.shape.rot.y += 0x1F4;
}
-void func_80BFCFB8(EnScopecoin* this, PlayState* play) {
- if (Flags_GetCollectible(play, (this->actor.params & 0x7F0) >> 4)) {
+void EnScopecoin_CheckCollectible(EnScopecoin* this, PlayState* play) {
+ if (Flags_GetCollectible(play, OBJMUPICT_GET_RUPEE_FLAG(&this->actor))) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_RUPEE_RED);
Actor_MarkForDeath(&this->actor);
}
@@ -47,31 +44,32 @@ void EnScopecoin_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
ActorShape_Init(&this->actor.shape, 0, ActorShadow_DrawCircle, 10.0f);
- this->unk148 = (this->actor.params & 0xF);
- if (this->unk148 < 0 || this->unk148 >= 8) {
- this->unk148 = 0;
+
+ this->rupeeIndex = OBJMUPICT_GET_RUPEE_INDEX(&this->actor);
+ if ((this->rupeeIndex < 0) || (this->rupeeIndex > 7)) {
+ this->rupeeIndex = 0;
}
- if (play->actorCtx.unk5 & 2) {
- if (this->unk148 == 2 || this->unk148 == 6) {
- if (Flags_GetCollectible(play, (this->actor.params & 0x7F0) >> 4)) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ if ((this->rupeeIndex == 2) || (this->rupeeIndex == 6)) {
+ if (Flags_GetCollectible(play, OBJMUPICT_GET_RUPEE_FLAG(&this->actor))) {
Actor_MarkForDeath(&this->actor);
return;
}
}
this->actor.shape.yOffset = 700.0f;
- this->actionFunc = func_80BFCFA0;
- return;
- }
- if (this->unk148 == 2 || this->unk148 == 6) {
- if (Flags_GetCollectible(play, (this->actor.params & 0x7F0) >> 4)) {
- Actor_MarkForDeath(&this->actor);
- } else {
- this->actor.draw = NULL;
- this->actionFunc = func_80BFCFB8;
- }
+ this->actionFunc = EnScopecoin_Spin;
} else {
- Actor_MarkForDeath(&this->actor);
+ if ((this->rupeeIndex == 2) || (this->rupeeIndex == 6)) {
+ if (Flags_GetCollectible(play, OBJMUPICT_GET_RUPEE_FLAG(&this->actor))) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ this->actor.draw = NULL;
+ this->actionFunc = EnScopecoin_CheckCollectible;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
}
}
@@ -84,9 +82,8 @@ void EnScopecoin_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
}
-static TexturePtr D_80BFD280[] = {
- gameplay_keep_Tex_061FC0, gameplay_keep_Tex_061FE0, gameplay_keep_Tex_062000, gameplay_keep_Tex_062040,
- gameplay_keep_Tex_062020, gameplay_keep_Tex_062060, gameplay_keep_Tex_062000,
+static TexturePtr sRupeeTextures[] = {
+ gRupeeGreenTex, gRupeeBlueTex, gRupeeRedTex, gRupeeOrangeTex, gRupeePurpleTex, gRupeeSilverTex, gRupeeRedTex,
};
void EnScopecoin_Draw(Actor* thisx, PlayState* play) {
@@ -95,11 +92,12 @@ void EnScopecoin_Draw(Actor* thisx, PlayState* play) {
func_8012C28C(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
+
OPEN_DISPS(gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BFD280[this->unk148]));
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_0622C0);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeTextures[this->rupeeIndex]));
+ gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
CLOSE_DISPS(gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.h b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.h
index 37a6bbf8eb..8fd9b142c5 100644
--- a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.h
+++ b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.h
@@ -5,13 +5,15 @@
struct EnScopecoin;
+#define OBJMUPICT_GET_RUPEE_INDEX(thisx) ((thisx)->params & 0xF)
+#define OBJMUPICT_GET_RUPEE_FLAG(thisx) (((thisx)->params & 0x7F0) >> 4)
+
typedef void (*EnScopecoinActionFunc)(struct EnScopecoin*, PlayState*);
typedef struct EnScopecoin {
/* 0x000 */ Actor actor;
/* 0x144 */ EnScopecoinActionFunc actionFunc;
- /* 0x148 */ s16 unk148;
- /* 0x14A */ s16 unk14A;
+ /* 0x148 */ s16 rupeeIndex;
} EnScopecoin; // size = 0x14C
extern const ActorInit En_Scopecoin_InitVars;
diff --git a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
index fce03f2b8e..a4fcb6cb3e 100644
--- a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
+++ b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
@@ -300,7 +300,7 @@ void EnScopecrow_Init(Actor* thisx, PlayState* play) {
return;
}
- if (play->actorCtx.unk5 & 2) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
SkelAnime_InitFlex(play, &this->skelAnime, &gGuaySkel, &gGuayFlyAnim, this->jointTable, this->morphTable,
OBJECT_CROW_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 2000.0f, ActorShadow_DrawCircle, 20.0f);
diff --git a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
index 2553962f94..fd0ced593b 100644
--- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
+++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
@@ -707,7 +707,7 @@ void EnScopenuts_Init(Actor* thisx, PlayState* play) {
if (ENSCOPENUTS_GET_3E0(&this->actor) == ENSCOPENUTS_3E0_0) {
if (gSaveContext.save.weekEventReg[52] & 0x40) {
Actor_MarkForDeath(&this->actor);
- } else if (play->actorCtx.unk5 & 2) {
+ } else if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
this->path = SubS_GetPathByIndex(play, ENSCOPENUTS_GET_FC00(&this->actor), 0x3F);
this->actor.draw = NULL;
this->actionFunc = func_80BCAFA8;
diff --git a/src/overlays/actors/ovl_En_Skb/z_en_skb.c b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
index e3c5b17306..62cb638d94 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -249,7 +249,7 @@ void EnSkb_Init(Actor* thisx, PlayState* play) {
default:
this->actor.flags &= ~ACTOR_FLAG_100000;
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
func_8099495C(this, play);
break;
}
@@ -353,7 +353,7 @@ void func_80995068(EnSkb* this, PlayState* play) {
} else if (Player_GetMask(play) != PLAYER_MASK_CAPTAIN) {
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
func_80995A30(this);
} else if (!(this->collider.base.acFlags & AC_HIT)) {
@@ -427,7 +427,7 @@ void func_8099533C(EnSkb* this, PlayState* play) {
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f)) {
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
func_8099571C(this);
}
@@ -449,7 +449,7 @@ void func_8099544C(EnSkb* this, PlayState* play) {
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f)) {
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
func_8099571C(this);
}
@@ -487,7 +487,7 @@ void func_8099556C(EnSkb* this, PlayState* play) {
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f) &&
(this->skelAnime.curFrame > 24.0f) && (this->skelAnime.curFrame < 28.0f)) {
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
this->actor.targetArrowOffset = 2000.0f;
func_8099571C(this);
@@ -571,7 +571,7 @@ void func_80995A8C(EnSkb* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.colChkInfo.mass = MASS_HEAVY;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
func_8099504C(this);
diff --git a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
index b07a1667e8..e2dd8b54b7 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
@@ -178,7 +178,7 @@ static Gfx* sSnowballFragmentDLs[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 20, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_EENO, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3000, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
index aa8f651ec5..4f17b98806 100644
--- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
+++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
@@ -1479,6 +1479,7 @@ void EnSob1_DrawCursor(PlayState* play, EnSob1* this, f32 x, f32 y, f32 z, u8 dr
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
+
if (drawCursor != 0) {
func_8012C654(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
@@ -1493,6 +1494,7 @@ void EnSob1_DrawCursor(PlayState* play, EnSob1* this, f32 x, f32 y, f32 z, u8 dr
dsdx = (1.0f / z) * 1024.0f;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, 0, 0, dsdx, dsdx);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1511,6 +1513,7 @@ void EnSob1_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32
(void)"../z_en_soB1.c";
OPEN_DISPS(play->state.gfxCtx);
+
gDPPipeSync(OVERLAY_DISP++);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, r, g, b, a);
@@ -1527,6 +1530,7 @@ void EnSob1_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32
dtdy = dy * unk;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, dsdx, dtdy);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1537,6 +1541,7 @@ void EnSob1_DrawStickDirectionPrompt(PlayState* play, EnSob1* this) {
(void)"../z_en_soB1.c";
OPEN_DISPS(play->state.gfxCtx);
+
if (drawStickRightPrompt || drawStickLeftPrompt) {
func_8012C654(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -1571,6 +1576,7 @@ void EnSob1_DrawStickDirectionPrompt(PlayState* play, EnSob1* this) {
this->stickRightPrompt.texZ, 0, 0, 1.0f, 1.0f);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1596,9 +1602,11 @@ s32 EnSob1_BombShopkeeper_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx**
void EnSob1_BombShopkeeper_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
OPEN_DISPS(play->state.gfxCtx);
+
if (limbIndex == BOMB_SHOPKEEPER_LIMB_LEFT_HAND) {
gSPDisplayList(POLY_OPA_DISP++, gBombShopkeeperBombDL);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1619,6 +1627,7 @@ void EnSob1_ZoraShopkeeper_Draw(Actor* thisx, PlayState* play) {
s32 i;
OPEN_DISPS(play->state.gfxCtx);
+
func_8012C28C(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x0C, EnSob1_EndDList(play->state.gfxCtx));
@@ -1632,6 +1641,7 @@ void EnSob1_ZoraShopkeeper_Draw(Actor* thisx, PlayState* play) {
}
EnSob1_DrawCursor(play, this, this->cursorPos.x, this->cursorPos.y, this->cursorPos.z, this->drawCursor);
EnSob1_DrawStickDirectionPrompt(play, this);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1642,6 +1652,7 @@ void EnSob1_GoronShopkeeper_Draw(Actor* thisx, PlayState* play) {
s32 i;
OPEN_DISPS(play->state.gfxCtx);
+
func_8012C28C(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sGoronShopkeeperEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
@@ -1653,6 +1664,7 @@ void EnSob1_GoronShopkeeper_Draw(Actor* thisx, PlayState* play) {
}
EnSob1_DrawCursor(play, this, this->cursorPos.x, this->cursorPos.y, this->cursorPos.z, this->drawCursor);
EnSob1_DrawStickDirectionPrompt(play, this);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1663,6 +1675,7 @@ void EnSob1_BombShopkeeper_Draw(Actor* thisx, PlayState* play) {
s32 i;
OPEN_DISPS(play->state.gfxCtx);
+
func_8012C28C(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gBombShopkeeperEyeTex));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
@@ -1683,5 +1696,6 @@ void EnSob1_BombShopkeeper_Draw(Actor* thisx, PlayState* play) {
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, -frames * 20, 32, 128));
gDPSetPrimColor(POLY_XLU_DISP++, 128, 128, 255, 255, 0, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_St/z_en_st.c b/src/overlays/actors/ovl_En_St/z_en_st.c
index b3c353f1f3..7d0dcbf114 100644
--- a/src/overlays/actors/ovl_En_St/z_en_st.c
+++ b/src/overlays/actors/ovl_En_St/z_en_st.c
@@ -704,7 +704,7 @@ void func_808A6A78(EnSt* this, PlayState* play) {
Actor_SetScale(&this->actor, 0.04f);
this->actor.draw = func_808A7478;
- this->actor.hintId = 4;
+ this->actor.hintId = TATL_HINT_ID_SKULLTULA;
this->actor.gravity = 0.0f;
func_808A63E8(this);
this->unk_18C = 0;
diff --git a/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/src/overlays/actors/ovl_En_Sth/z_en_sth.c
index 664a74aa1d..4354e7f58d 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.c
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.c
@@ -103,7 +103,7 @@ void EnSth_Init(Actor* thisx, PlayState* play) {
switch (ENSTH_GET_F(&this->actor)) {
case ENSTH_F_1:
- if (play->actorCtx.unk5 & 2) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
this->actor.flags |= (ACTOR_FLAG_10 | ACTOR_FLAG_20);
this->actionFunc = func_80B67958;
} else {
@@ -275,7 +275,7 @@ void func_80B67348(EnSth* this, PlayState* play) {
}
Message_StartTextbox(play, phi_a1, &this->actor);
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
}
@@ -286,7 +286,7 @@ void func_80B67458(EnSth* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = func_80B67348;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
if (CURRENT_DAY == 3) {
func_80B670A4(this, 6);
} else {
@@ -470,7 +470,7 @@ void func_80B67AB4(EnSth* this, PlayState* play) {
gSaveContext.save.weekEventReg[34] |= 0x40;
Message_StartTextbox(play, 0x918, &this->actor);
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
}
@@ -481,7 +481,7 @@ void func_80B67B50(EnSth* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = func_80B67AB4;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
} else {
this->unk_29C &= ~1;
gSaveContext.save.weekEventReg[34] |= 8;
diff --git a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
index 3ce5ba447a..1bf91af6bb 100644
--- a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
+++ b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
@@ -40,7 +40,7 @@ void EnSth2_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
this->unused = 0;
- if (play->actorCtx.unk5 & 2) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
this->actor.flags |= (ACTOR_FLAG_10 | ACTOR_FLAG_20);
} else {
Actor_MarkForDeath(&this->actor);
diff --git a/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
index a69cbe213b..fc3aff029b 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
@@ -1144,11 +1144,11 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetSphere(play, &this->collider, &this->actor, &sSphereInit);
if (!ENSW_GET_3(&this->actor)) {
- this->actor.hintId = 0x1F;
+ this->actor.hintId = TATL_HINT_ID_SKULLWALLTULA;
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->collider.info.toucher.damage = 8;
} else {
- this->actor.hintId = 0x20;
+ this->actor.hintId = TATL_HINT_ID_GOLD_SKULLTULA;
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable2, &sColChkInfoInit2);
this->collider.info.toucher.damage = 16;
}
diff --git a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
index a8d76a7a8e..ef89732958 100644
--- a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
+++ b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
@@ -67,7 +67,7 @@ static ColliderJntSphInit sJntSphInit = {
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 3000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 88, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GUAY, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
index fcb1e83305..51a941b284 100644
--- a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
@@ -79,7 +79,7 @@ static AnimationInfo sAnimationInfo[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 77, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_MAD_SCRUB, ICHAIN_CONTINUE),
ICHAIN_F32(gravity, 0, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2600, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
index 9077b38c45..d9059577cc 100644
--- a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
+++ b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
@@ -72,7 +72,7 @@ static AnimationInfo sAnimationInfo[] = {
#include "assets/overlays/ovl_En_Syateki_Okuta/ovl_En_Syateki_Okuta.c"
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 66, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_OCTOROK, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6500, ICHAIN_STOP),
};
@@ -285,7 +285,7 @@ void func_80A365EC(EnSyatekiOkuta* this, PlayState* play) {
sp84.y = Rand_ZeroOne() * 7.0f;
sp84.z = (Rand_ZeroOne() - 0.5f) * 7.0f;
EffectSsDtBubble_SpawnCustomColor(play, &this->actor.world.pos, &sp84, &D_80A37B98, &D_80A37BA4,
- &D_80A37BA8, Rand_S16Offset(100, 50), 25, 0);
+ &D_80A37BA8, Rand_S16Offset(100, 50), 25, false);
}
func_80A362F8(this);
diff --git a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
index d15859a749..647b211829 100644
--- a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
+++ b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
@@ -186,7 +186,7 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
Actor_SetScale(&this->actor, 0.01f);
- this->actor.hintId = 0x4C;
+ this->actor.hintId = TATL_HINT_ID_WOLFOS;
func_80A201CC(this);
}
diff --git a/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.c b/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.c
index db6a9d172d..0d39a0db2e 100644
--- a/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.c
+++ b/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.c
@@ -1,7 +1,7 @@
/*
* File: z_en_tag_obj.c
* Overlay: ovl_En_Tag_Obj
- * Description:
+ * Description: Unused Seahorse Spawner
*/
#include "z_en_tag_obj.h"
diff --git a/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.h b/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.h
index 7a9fe909ae..a58b2b1d3d 100644
--- a/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.h
+++ b/src/overlays/actors/ovl_En_Tag_Obj/z_en_tag_obj.h
@@ -7,7 +7,7 @@ struct EnTagObj;
typedef struct EnTagObj {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x50];
+ /* 0x144 */ UNK_TYPE1 unk_144[0x50];
/* 0x194 */ s32 hasSpawnedSeahorse;
} EnTagObj; // size = 0x198
diff --git a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
index f1268e1e01..393caa1d9f 100644
--- a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
+++ b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
@@ -229,7 +229,7 @@ void EnTalkGibud_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actor.targetMode = 0;
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
this->actor.textId = 0;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 28.0f);
@@ -566,7 +566,7 @@ void EnTalkGibud_Damage(EnTalkGibud* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
if ((this->drawDmgEffTimer > 0) && (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) &&
(this->type == EN_TALK_GIBUD_TYPE_GIBDO)) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
SkelAnime_InitFlex(play, &this->skelAnime, &gRedeadSkel, NULL, this->jointTable, this->morphTable,
@@ -926,7 +926,7 @@ void EnTalkGibud_CheckForGibdoMask(EnTalkGibud* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
this->actor.flags &= ~(ACTOR_FLAG_4 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_8 | ACTOR_FLAG_1);
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
EnTalkGibud_SetupPassiveIdle(this);
}
@@ -934,9 +934,9 @@ void EnTalkGibud_CheckForGibdoMask(EnTalkGibud* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
if (this->type == EN_TALK_GIBUD_TYPE_REDEAD) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
} else {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
}
this->actor.textId = 0;
EnTalkGibud_SetupWalkToHome(this);
diff --git a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
index 4f19b73a81..542a564f52 100644
--- a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
+++ b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
@@ -371,7 +371,7 @@ void func_80BB71C8(EnTanron2* this, PlayState* play) {
sp9C.z = spA8.z * -0.03f;
EffectSsDtBubble_SpawnCustomColor(play, &sp90, &spA8, &sp9C, &D_80BB81E8, &D_80BB81EC,
- Rand_ZeroFloat(100.0f) + 200.0f, Rand_ZeroFloat(5.0f) + 15.0f, 0);
+ Rand_ZeroFloat(100.0f) + 200.0f, Rand_ZeroFloat(5.0f) + 15.0f, false);
}
}
diff --git a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
index 64d8b2dd79..d683cde8ce 100644
--- a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
+++ b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
@@ -142,7 +142,8 @@ void EnTanron3_SpawnBubbles(EnTanron3* this, PlayState* play) {
acceleration.y = velocity.y * -0.05f;
acceleration.z = velocity.z * -0.05f;
EffectSsDtBubble_SpawnCustomColor(play, &this->actor.world.pos, &velocity, &acceleration, &sPrimColor,
- &sEnvColor, Rand_ZeroFloat(30.0f) + 70.0f, Rand_ZeroFloat(5.0f) + 15.0f, 0);
+ &sEnvColor, Rand_ZeroFloat(30.0f) + 70.0f, Rand_ZeroFloat(5.0f) + 15.0f,
+ false);
}
}
diff --git a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
index dc74fa4618..45f88ffb72 100644
--- a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
+++ b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
@@ -508,9 +508,9 @@ void func_80BE5C10(Actor* thisx, PlayState* play) {
func_8012C28C(play->state.gfxCtx);
if (this->unk_1A0 == 0) {
- texture = gameplay_keep_Tex_05BEF0;
+ texture = gDropArrows1Tex;
} else {
- texture = gameplay_keep_Tex_0617C0;
+ texture = gDropMagicLargeTex;
}
POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
@@ -521,7 +521,7 @@ void func_80BE5C10(Actor* thisx, PlayState* play) {
Matrix_RotateZS(this->unk_198, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_05F6F0);
+ gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
index 45459e8b38..ceac1e116e 100644
--- a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
+++ b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
@@ -1,7 +1,7 @@
/*
* File: z_en_tanron6.c
* Overlay: ovl_En_Tanron6
- * Description: Swarm of Giant Bees
+ * Description: Unused invisible enemy. Only draws a circle shadow.
*/
#include "z_en_tanron6.h"
diff --git a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.h b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.h
index 13d060e2e5..fb565a5c82 100644
--- a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.h
+++ b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.h
@@ -9,7 +9,7 @@ typedef void (*EnTanron6ActionFunc)(struct EnTanron6*, PlayState*);
typedef struct EnTanron6 {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0xBC];
+ /* 0x144 */ UNK_TYPE1 unk_144[0xBC];
/* 0x200 */ EnTanron6ActionFunc actionFunc;
} EnTanron6; // size = 0x204
diff --git a/src/overlays/actors/ovl_En_Test2/z_en_test2.c b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
index 4a051fc235..54c3f0609c 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
@@ -107,7 +107,7 @@ void EnTest2_Update(Actor* thisx, PlayState* play) {
void EnTest2_UpdateForLens(Actor* thisx, PlayState* play) {
EnTest2* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
this->actor.flags |= ACTOR_FLAG_80;
} else {
this->actor.flags &= ~ACTOR_FLAG_80;
diff --git a/src/overlays/actors/ovl_En_Test4/z_en_test4.c b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
index fd5ffa12f3..2329c022f7 100644
--- a/src/overlays/actors/ovl_En_Test4/z_en_test4.c
+++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
@@ -48,8 +48,8 @@ static s16 sCurrentCs;
void func_80A41D70(EnTest4* this, PlayState* play) {
if (this->unk_144 != 0) {
func_80151A68(play, sNightMessages1[CURRENT_DAY - 1]);
- } else if ((sCutscenes[this->unk_144] < 0) || ((play->actorCtx.unk5 & 2) != 0)) {
- if (play->actorCtx.unk5 & 2) {
+ } else if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
Sram_IncrementDay();
gSaveContext.save.time = CLOCK_TIME(6, 0);
func_80151A68(play, sDayMessages1[CURRENT_DAY - 1]);
@@ -66,7 +66,7 @@ void func_80A41D70(EnTest4* this, PlayState* play) {
}
if (gSaveContext.cutsceneTrigger == 0) {
- if ((sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.unk5 & 2)) {
+ if ((sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
this->actionFunc = func_80A42F20;
sCurrentCs = sCutscenes[this->unk_144];
this->transitionCsTimer = 0;
@@ -91,7 +91,7 @@ void func_80A41D70(EnTest4* this, PlayState* play) {
void func_80A41FA4(EnTest4* this, PlayState* play) {
if (this->unk_144 != 0) {
func_80151A68(play, sNightMessages2[CURRENT_DAY - 1]);
- } else if ((sCutscenes[this->unk_144] < 0) || ((play->actorCtx.unk5 & 2) != 0)) {
+ } else if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
Sram_IncrementDay();
gSaveContext.save.time = CLOCK_TIME(6, 0);
func_8010EE74(play, CURRENT_DAY);
@@ -103,7 +103,7 @@ void func_80A41FA4(EnTest4* this, PlayState* play) {
}
if (gSaveContext.cutsceneTrigger == 0) {
- if ((sCutscenes[this->unk_144] >= 0) && ((play->actorCtx.unk5 & 2) == 0)) {
+ if ((sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
this->actionFunc = func_80A42F20;
sCurrentCs = sCutscenes[this->unk_144];
this->transitionCsTimer = 0;
@@ -277,7 +277,7 @@ void func_80A425E4(EnTest4* this, PlayState* play) {
this->nextBellTime = CLOCK_TIME(17, 30);
}
- if ((sCutscenes[this->unk_144] < 0) || ((play->actorCtx.unk5 & 2) != 0) || (CURRENT_DAY == 3) ||
+ if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1) || (CURRENT_DAY == 3) ||
(gSaveContext.save.time >= CLOCK_TIME(17, 0))) {
gSaveContext.screenScale = 1000.0f;
}
@@ -315,12 +315,8 @@ void EnTest4_Init(Actor* thisx, PlayState* play) {
if (gSaveContext.save.time < CLOCK_TIME(6, 1)) {
gSaveContext.save.time = CLOCK_TIME(6, 0);
gSaveContext.gameMode = 0;
- {
- GameState* state = &play->state;
- state->running = false;
- }
- SET_NEXT_GAMESTATE(&play->state, Daytelop_Init, DaytelopContext);
- if (this && this && this) {}
+ STOP_GAMESTATE(&play->state);
+ SET_NEXT_GAMESTATE(&play->state, DayTelop_Init, sizeof(DayTelopState));
this->unk_144 = 1;
gSaveContext.save.time = CLOCK_TIME(6, 0);
Actor_MarkForDeath(&this->actor);
@@ -335,7 +331,8 @@ void EnTest4_Init(Actor* thisx, PlayState* play) {
} else if (gSaveContext.save.time == CLOCK_TIME(6, 0)) {
this->unk_144 = 0;
func_80A41D70(this, play);
- if ((gSaveContext.cutsceneTrigger == 0) && (sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.unk5 & 2)) {
+ if ((gSaveContext.cutsceneTrigger == 0) && (sCutscenes[this->unk_144] >= 0) &&
+ !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
player->stateFlags1 |= 0x200;
}
} else {
@@ -356,7 +353,7 @@ void EnTest4_Init(Actor* thisx, PlayState* play) {
}
this->lastBellTime = gSaveContext.save.time;
- if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.unk5 & 2)) {
+ if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
gSaveContext.screenScaleFlag = false;
gSaveContext.screenScale = 1000.0f;
}
@@ -383,8 +380,8 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
if ((temp_a3 * temp_a2) <= 0) {
gSaveContext.unk_3CA7 = 1;
- if (play->actorCtx.unk5 & 0x4) {
- play->actorCtx.unk5 &= ~0x4;
+ if (play->actorCtx.flags & ACTORCTX_FLAG_2) {
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_2;
}
if (temp_a0 != CLOCK_TIME(6, 0)) {
@@ -394,7 +391,8 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
func_8011C808(play);
Actor_MarkForDeath(&this->actor);
gSaveContext.eventInf[1] |= 0x80;
- } else if (((sCutscenes[this->unk_144] < 0) || (play->actorCtx.unk5 & 2)) && CURRENT_DAY != 3) {
+ } else if (((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) &&
+ (CURRENT_DAY != 3)) {
func_80A41FA4(this, play);
} else {
gSaveContext.screenScale = 0.0f;
@@ -419,7 +417,7 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
}
}
- if ((sCutscenes[this->unk_144] >= 0) && ((play->actorCtx.unk5 & 2) == 0)) {
+ if ((sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
player->stateFlags1 |= 0x200;
this->unk_146 = gSaveContext.save.time;
} else {
@@ -442,7 +440,7 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
s32 playerParams;
u32 entrance = gSaveContext.save.entrance;
- if ((play->actorCtx.unk5 & 2)) {
+ if ((play->actorCtx.flags & ACTORCTX_FLAG_1)) {
playerParams = 0xCFF;
} else {
playerParams = 0xBFF;
diff --git a/src/overlays/actors/ovl_En_Test6/z_en_test6.c b/src/overlays/actors/ovl_En_Test6/z_en_test6.c
index c99d008a64..145046b2f1 100644
--- a/src/overlays/actors/ovl_En_Test6/z_en_test6.c
+++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.c
@@ -80,13 +80,7 @@ u8 D_80A93E80[] = {
};
TexturePtr D_80A9402C[] = {
- NULL,
- gameplay_keep_Tex_05B6F0,
- gameplay_keep_Tex_05CEF0,
- gameplay_keep_Tex_0607C0,
- gameplay_keep_Tex_060FC0,
- gameplay_keep_Tex_061FC0,
- gameplay_keep_Tex_061FE0,
+ NULL, gDropArrows2Tex, gDropBombTex, gDropDekuNutTex, gDropDekuStickTex, gRupeeGreenTex, gRupeeBlueTex,
};
Color_RGB8 D_80A94048 = { 230, 230, 220 };
@@ -221,7 +215,7 @@ void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A9402C[ptr->unk_00]));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_05F6F0);
+ gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
}
Matrix_Translate(ptr->unk_08 * ptr->unk_04, ptr->unk_0C, ptr->unk_10 * ptr->unk_04, MTXMODE_NEW);
@@ -273,7 +267,7 @@ void func_80A90FC0(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A9402C[ptr->unk_00]));
- gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_0622C0);
+ gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
}
Matrix_Translate(ptr->unk_08 * ptr->unk_04, ptr->unk_0C, ptr->unk_10 * ptr->unk_04, MTXMODE_NEW);
@@ -1126,7 +1120,7 @@ void func_80A93298(EnTest6* this, PlayState* play) {
gDPSetPrimColor(this->unk_148++, 0, 0xFF, 28, 28, 28, 255);
gDPSetEnvColor(this->unk_148++, 255, 255, 255, 255);
gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
- gSPDisplayList(this->unk_148++, gameplay_keep_DL_07AFB0);
+ gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
temp_s4 += 0x1000;
cos = Math_CosS(temp_s4) * this->unk_150;
@@ -1140,7 +1134,7 @@ void func_80A93298(EnTest6* this, PlayState* play) {
gDPSetPrimColor(this->unk_148++, 0, 0xFF, 28, 28, 28, 255);
gDPSetEnvColor(this->unk_148++, 255, 255, 255, 255);
gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
- gSPDisplayList(this->unk_148++, gameplay_keep_DL_07AFB0);
+ gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
phi_f24 -= this->unk_14C;
phi_s2 += this->unk_27E;
@@ -1213,7 +1207,7 @@ void func_80A9369C(Actor* thisx, PlayState* play2) {
gDPSetPrimColor(this->unk_148++, 0, 0xFF, this->unk_280, this->unk_280, this->unk_280, 255);
gDPSetEnvColor(this->unk_148++, 235, 238, 235, 255);
gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
- gSPDisplayList(this->unk_148++, gameplay_keep_DL_07AFB0);
+ gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
phi_s2 += 0x505;
}
@@ -1257,7 +1251,7 @@ void func_80A939E8(EnTest6* this, PlayState* play2) {
gDPSetPrimColor(this->unk_148++, 0, 0xFF, 28, 28, 28, 255);
gDPSetEnvColor(this->unk_148++, 245, 245, 200, this->unk_282);
gDPSetRenderMode(this->unk_148++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
- gSPDisplayList(this->unk_148++, gameplay_keep_DL_07AFB0);
+ gSPDisplayList(this->unk_148++, gSongOfTimeClockDL);
POLY_XLU_DISP = this->unk_148;
}
diff --git a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
index 03c7d0e1da..dd4890d537 100644
--- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
+++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
@@ -136,7 +136,7 @@ static s16 D_80C13664[] = { ITEM00_ARROWS_10, ITEM00_BOMBS_B, ITEM00_RUPEE_GR
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 1000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 35, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_TAKKURI, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Tite/z_en_tite.c b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
index 2b13859651..b912f6f38d 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -125,7 +125,7 @@ static Color_RGBA8 D_80896B40 = { 180, 180, 180, 255 };
static Vec3f D_80896B44 = { 0.0f, 0.45f, 0.0f };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 70, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BLUE_TEKTITE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
ICHAIN_F32(terminalVelocity, -40, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_STOP),
diff --git a/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
index 2b8cbef826..60c4b4dd0f 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
@@ -699,7 +699,7 @@ void func_80AED940(EnTk* this, PlayState* play) {
func_8013E8F8(&this->actor, play, 100.0f, 100.0f, PLAYER_AP_NONE, 0x4000, 0x4000);
}
} else {
- func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, 0);
+ func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel, PLAYER_AP_NONE);
}
}
diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.c b/src/overlays/actors/ovl_En_Toto/z_en_toto.c
index 473ff1edd6..6dda48fc7f 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c
@@ -315,7 +315,7 @@ void func_80BA3D38(EnToto* this, PlayState* play) {
this->cutscene = this->actor.cutscene;
this->text = ENTOTO_WEEK_EVENT_FLAGS ? D_80BA50BC : D_80BA5088;
func_80BA4C0C(this, play);
- play->actorCtx.unk5 |= 0x20;
+ play->actorCtx.flags |= ACTORCTX_FLAG_5;
this->unk260[0] = 0;
}
@@ -344,7 +344,7 @@ void func_80BA3DBC(EnToto* this, PlayState* play) {
func_80BA36C0(this, play, 0);
ActorCutscene_Stop(this->cutscene);
- play->actorCtx.unk5 &= ~0x20;
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_5;
}
s32 func_80BA3EC0(EnToto* this, PlayState* play) {
diff --git a/src/overlays/actors/ovl_En_Trt/z_en_trt.c b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
index 6402e5920b..39a16dea9e 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -23,7 +23,7 @@ void EnTrt_Draw(Actor* thisx, PlayState* play);
void EnTrt_GetCutscenes(EnTrt* this, PlayState* play);
void EnTrt_ResetItemPosition(EnTrt* this);
-void EnTrt_UpdateHeadYawAndPitch(EnTrt* this, PlayState* play);
+void EnTrt_TrackPlayer(EnTrt* this, PlayState* play);
s32 EnTrt_ReturnItemToShelf(EnTrt* this);
s32 EnTrt_FacingShopkeeperDialogResult(EnTrt* this, PlayState* play);
s32 EnTrt_TakeItemOffShelf(EnTrt* this);
@@ -64,17 +64,30 @@ void EnTrt_Blink(EnTrt* this);
void EnTrt_OpenEyes2(EnTrt* this);
void EnTrt_NodOff(EnTrt* this);
+typedef enum {
+ /* 0 */ TRT_ANIM_IDLE,
+ /* 1 */ TRT_ANIM_HALF_AWAKE,
+ /* 2 */ TRT_ANIM_SLEEPING,
+ /* 3 */ TRT_ANIM_WAKE_UP,
+ /* 4 */ TRT_ANIM_SURPRISED,
+ /* 5 */ TRT_ANIM_HANDS_ON_COUNTER,
+ /* 6 */ TRT_ANIM_HOVER,
+ /* 7 */ TRT_ANIM_FLY_LOOK_AROUND,
+ /* 8 */ TRT_ANIM_FLY_DOWN,
+ /* 9 */ TRT_ANIM_FLY
+} TrtAnimation;
+
static AnimationInfoS sAnimationInfo[] = {
- { &object_trt_Anim_00DE68, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_00EE98, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_00FD34, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_0030EC, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_003D78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_00D52C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_000A44, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_001EF4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_002224, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_002CB0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeIdleAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeHalfAwakeAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeSleepingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeWakeUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeHandsOnCounterAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeHoverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeFlyLookAroundAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeFlyDownAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeFlyAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
};
const ActorInit En_Trt_InitVars = {
@@ -149,7 +162,7 @@ void EnTrt_UpdateCursorPos(PlayState* play, EnTrt* this) {
f32 xOffset = 0.0f;
f32 yOffset = 17.0f;
- Actor_GetScreenPos(play, &this->items[this->cursorIdx]->actor, &x, &y);
+ Actor_GetScreenPos(play, &this->items[this->cursorIndex]->actor, &x, &y);
this->cursorPos.x = x + xOffset;
this->cursorPos.y = y + yOffset;
this->cursorPos.z = 1.2f;
@@ -178,18 +191,18 @@ void EnTrt_SetupGetMushroomCutscene(EnTrt* this) {
}
u16 EnTrt_GetItemTextId(EnTrt* this) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
- if (item->actor.params == SI_POTION_BLUE && !(this->flags & ENTRT_GIVEN_MUSHROOM)) {
+ if ((item->actor.params == SI_POTION_BLUE) && !(this->flags & ENTRT_GIVEN_MUSHROOM)) {
return 0x880;
}
return item->actor.textId;
}
u16 EnTrt_GetItemChoiceTextId(EnTrt* this) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
- if (item->actor.params == SI_POTION_BLUE && !(gSaveContext.save.weekEventReg[53] & 0x10)) {
+ if ((item->actor.params == SI_POTION_BLUE) && !(gSaveContext.save.weekEventReg[53] & 0x10)) {
this->textId = 0x881;
return 0x881;
}
@@ -384,7 +397,7 @@ void EnTrt_Goodbye(EnTrt* this, PlayState* play) {
}
}
-void EnTrt_SetupTryToGiveRedPotion(EnTrt* this, PlayState* play) {
+void EnTrt_StartRedPotionConversation(EnTrt* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->textId == 0x88F) {
if (Inventory_HasEmptyBottle() || !(gSaveContext.save.weekEventReg[12] & 0x10)) {
@@ -501,7 +514,7 @@ s32 EnTrt_FacingShopkeeperDialogResult(EnTrt* this, PlayState* play) {
void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
- u8 cursorIdx;
+ u8 cursorIndex;
if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
@@ -523,9 +536,9 @@ void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
if (!EnTrt_TestEndInteraction(this, play, CONTROLLER1(&play->state))) {
if ((!Message_ShouldAdvance(play) || !EnTrt_FacingShopkeeperDialogResult(this, play)) &&
(this->stickAccumX > 0)) {
- cursorIdx = EnTrt_SetCursorIndexFromNeutral(this, 2);
- if (cursorIdx != CURSOR_INVALID) {
- this->cursorIdx = cursorIdx;
+ cursorIndex = EnTrt_SetCursorIndexFromNeutral(this, 2);
+ if (cursorIndex != CURSOR_INVALID) {
+ this->cursorIndex = cursorIndex;
this->actionFunc = EnTrt_LookToShelf;
func_8011552C(play, 6);
this->stickRightPrompt.isEnabled = false;
@@ -562,7 +575,7 @@ void EnTrt_LookToShelf(EnTrt* this, PlayState* play) {
}
void EnTrt_CursorLeftRight(PlayState* play, EnTrt* this) {
- u8 curTemp = this->cursorIdx;
+ u8 curTemp = this->cursorIndex;
if (this->stickAccumX < 0) {
if (curTemp != 2) {
@@ -571,20 +584,20 @@ void EnTrt_CursorLeftRight(PlayState* play, EnTrt* this) {
EnTrt_SetupLookToShopkeeperFromShelf(play, this);
}
if (this->items[curTemp] != NULL) {
- this->cursorIdx = curTemp;
+ this->cursorIndex = curTemp;
}
} else if (this->stickAccumX > 0) {
if (curTemp != 0) {
curTemp--;
}
if (this->items[curTemp] != NULL) {
- this->cursorIdx = curTemp;
+ this->cursorIndex = curTemp;
}
}
}
s32 EnTrt_HasPlayerSelectedItem(PlayState* play, EnTrt* this, Input* input) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
if (EnTrt_TestEndInteraction(this, play, input)) {
return true;
@@ -609,8 +622,8 @@ s32 EnTrt_HasPlayerSelectedItem(PlayState* play, EnTrt* this, Input* input) {
void EnTrt_BrowseShelf(EnTrt* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
s32 pad;
- u8 prevCursorIdx = this->cursorIdx;
- u8 cursorIdx;
+ u8 prevCursorIdx = this->cursorIndex;
+ u8 cursorIndex;
if (!EnTrt_ReturnItemToShelf(this)) {
this->delayTimer = 3;
@@ -624,7 +637,7 @@ void EnTrt_BrowseShelf(EnTrt* this, PlayState* play) {
func_8011552C(play, 6);
if (!EnTrt_HasPlayerSelectedItem(play, this, CONTROLLER1(&play->state))) {
EnTrt_CursorLeftRight(play, this);
- if (this->cursorIdx != prevCursorIdx) {
+ if (this->cursorIndex != prevCursorIdx) {
func_80151938(play, EnTrt_GetItemTextId(this));
play_sound(NA_SE_SY_CURSOR);
}
@@ -636,7 +649,7 @@ void EnTrt_BrowseShelf(EnTrt* this, PlayState* play) {
void EnTrt_SetupBuyItemWithFanfare(PlayState* play, EnTrt* this) {
Player* player = GET_PLAYER(play);
- Actor_PickUp(&this->actor, play, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
player->stateFlags2 &= ~0x20000000;
@@ -656,7 +669,7 @@ void EnTrt_SetupCanBuy(PlayState* play, EnTrt* this, u16 textId) {
}
void EnTrt_HandleCanBuyItem(PlayState* play, EnTrt* this) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
EnGirlA* item2;
switch (item->canBuyFunc(play, item)) {
@@ -666,13 +679,14 @@ void EnTrt_HandleCanBuyItem(PlayState* play, EnTrt* this) {
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
func_8019F208();
- item2 = this->items[this->cursorIdx];
+ item2 = this->items[this->cursorIndex];
item2->buyFanfareFunc(play, item2);
EnTrt_SetupBuyItemWithFanfare(play, this);
this->drawCursor = 0;
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
item->buyFunc(play, item);
@@ -681,27 +695,34 @@ void EnTrt_HandleCanBuyItem(PlayState* play, EnTrt* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_NO_ROOM:
play_sound(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x641);
break;
+
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
play_sound(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x846);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x847);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
EnTrt_SetupCannotBuy(play, this, 0x643);
break;
+
+ default:
+ break;
}
}
void EnTrt_SelectItem(EnTrt* this, PlayState* play) {
- EnGirlA* item = this->items[this->cursorIdx];
+ EnGirlA* item = this->items[this->cursorIndex];
u8 talkState = Message_GetState(&play->msgCtx);
if (EnTrt_TakeItemOffShelf(this)) {
@@ -757,8 +778,8 @@ void EnTrt_IdleSleeping(EnTrt* this, PlayState* play) {
}
this->prevTextId = this->textId;
- if (player->transformation == PLAYER_FORM_GORON || player->transformation == PLAYER_FORM_ZORA ||
- player->transformation == PLAYER_FORM_DEKU) {
+ if ((player->transformation == PLAYER_FORM_GORON) || (player->transformation == PLAYER_FORM_ZORA) ||
+ (player->transformation == PLAYER_FORM_DEKU)) {
this->textId = 0x850;
}
if (Player_GetMask(play) == PLAYER_MASK_SCENTS) {
@@ -779,14 +800,14 @@ void EnTrt_IdleSleeping(EnTrt* this, PlayState* play) {
player->stateFlags2 |= 0x20000000;
this->timer = 45;
this->actionFunc = EnTrt_BeginInteraction;
- } else if ((player->actor.world.pos.x >= -50.0f && player->actor.world.pos.x <= -25.0f) &&
- (player->actor.world.pos.z >= -19.0f && player->actor.world.pos.z <= 30.0f)) {
+ } else if (((player->actor.world.pos.x >= -50.0f) && (player->actor.world.pos.x <= -25.0f)) &&
+ ((player->actor.world.pos.z >= -19.0f) && (player->actor.world.pos.z <= 30.0f))) {
func_800B8614(&this->actor, play, 200.0f);
}
if (DECR(this->timer) == 0) {
this->timer = 40;
- EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, 1);
- this->animIndex = 1;
+ EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_HALF_AWAKE);
+ this->animIndex = TRT_ANIM_HALF_AWAKE;
this->actionFunc = EnTrt_IdleAwake;
this->blinkFunc = EnTrt_OpenThenCloseEyes;
}
@@ -799,7 +820,7 @@ void EnTrt_IdleAwake(EnTrt* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->flags &= ~ENTRT_FULLY_AWAKE;
- if (player->transformation == PLAYER_FORM_HUMAN || player->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ if ((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_FIERCE_DEITY)) {
if (Player_GetMask(play) == PLAYER_MASK_SCENTS) {
this->textId = 0x890;
} else {
@@ -821,7 +842,7 @@ void EnTrt_IdleAwake(EnTrt* this, PlayState* play) {
if (player->transformation == PLAYER_FORM_HUMAN) {
this->flags |= ENTRT_MET;
}
- EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, 2);
+ EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_SLEEPING);
this->blinkFunc = EnTrt_EyesClosed;
this->timer = 45;
this->actionFunc = EnTrt_BeginInteraction;
@@ -831,8 +852,8 @@ void EnTrt_IdleAwake(EnTrt* this, PlayState* play) {
}
if (DECR(this->timer) == 0) {
this->timer = Rand_S16Offset(150, 100);
- EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, 2);
- this->animIndex = 2;
+ EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_SLEEPING);
+ this->animIndex = TRT_ANIM_SLEEPING;
this->sleepSoundTimer = 10;
this->actor.textId = 0;
this->actionFunc = EnTrt_IdleSleeping;
@@ -842,7 +863,7 @@ void EnTrt_IdleAwake(EnTrt* this, PlayState* play) {
void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
s16 curFrame = this->skelAnime.curFrame / this->skelAnime.playSpeed;
- s16 animLastFrame = Animation_GetLastFrame(&object_trt_Anim_0030EC) / (s16)this->skelAnime.playSpeed;
+ s16 animLastFrame = Animation_GetLastFrame(&gKotakeWakeUpAnim) / (s16)this->skelAnime.playSpeed;
if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
@@ -852,10 +873,10 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
ActorCutscene_SetIntentToPlay(this->cutscene);
}
} else if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
- if (this->animIndex != 5) {
+ if (this->animIndex != TRT_ANIM_HANDS_ON_COUNTER) {
if (curFrame == animLastFrame) {
- EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, 3);
- this->animIndex = 3;
+ EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_WAKE_UP);
+ this->animIndex = TRT_ANIM_WAKE_UP;
this->blinkFunc = EnTrt_OpenEyesThenSetToBlink;
this->timer = 10;
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
@@ -868,9 +889,9 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
}
} else if (DECR(this->timer) == 0) {
this->timer = Rand_S16Offset(40, 20);
- EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, 5);
+ EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_HANDS_ON_COUNTER);
Message_StartTextbox(play, this->textId, &this->actor);
- this->animIndex = 5;
+ this->animIndex = TRT_ANIM_HANDS_ON_COUNTER;
switch (this->textId) {
case 0x834:
if (!(gSaveContext.save.weekEventReg[12] & 8) && !(gSaveContext.save.weekEventReg[84] & 0x40) &&
@@ -880,7 +901,7 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
this->stickRightPrompt.isEnabled = true;
this->actionFunc = EnTrt_Hello;
} else {
- this->actionFunc = EnTrt_SetupTryToGiveRedPotion;
+ this->actionFunc = EnTrt_StartRedPotionConversation;
}
break;
case 0x83E:
@@ -894,7 +915,7 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
this->actionFunc = EnTrt_SetupEndInteraction;
break;
case 0x88F:
- this->actionFunc = EnTrt_SetupTryToGiveRedPotion;
+ this->actionFunc = EnTrt_StartRedPotionConversation;
break;
}
}
@@ -910,8 +931,8 @@ void EnTrt_Surprised(EnTrt* this, PlayState* play) {
}
} else if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
if (DECR(this->timer) == 0) {
- EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, 4);
- this->animIndex = 4;
+ EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_SURPRISED);
+ this->animIndex = TRT_ANIM_SURPRISED;
this->blinkFunc = EnTrt_OpenEyes2;
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOTAKE_SURPRISED);
this->timer = 30;
@@ -919,9 +940,9 @@ void EnTrt_Surprised(EnTrt* this, PlayState* play) {
}
} else if (DECR(this->timer) == 0) {
this->timer = Rand_S16Offset(40, 20);
- EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, 5);
+ EnTrt_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT_ANIM_HANDS_ON_COUNTER);
Message_StartTextbox(play, this->textId, &this->actor);
- this->animIndex = 5;
+ this->animIndex = TRT_ANIM_HANDS_ON_COUNTER;
this->actionFunc = EnTrt_TryToGiveRedPotionAfterSurprised;
}
}
@@ -1057,7 +1078,7 @@ void EnTrt_CanBuy(EnTrt* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->shopItemSelectedTween = 0.0f;
EnTrt_ResetItemPosition(this);
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->restockFunc(play, item);
this->actionFunc = this->prevActionFunc;
func_80151938(play, EnTrt_GetItemTextId(this));
@@ -1069,7 +1090,7 @@ void EnTrt_BuyItemWithFanfare(EnTrt* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = EnTrt_SetupItemGiven;
} else {
- Actor_PickUp(&this->actor, play, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, this->items[this->cursorIndex]->getItemId, 300.0f, 300.0f);
}
}
@@ -1096,7 +1117,7 @@ void EnTrt_ContinueShopping(EnTrt* this, PlayState* play) {
func_8011552C(play, 6);
if (Message_ShouldAdvance(play)) {
EnTrt_ResetItemPosition(this);
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->restockFunc(play, item);
if (!EnTrt_TestEndInteraction(this, play, CONTROLLER1(&play->state))) {
switch (play->msgCtx.choiceIndex) {
@@ -1119,7 +1140,7 @@ void EnTrt_ContinueShopping(EnTrt* this, PlayState* play) {
} else if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
EnTrt_ResetItemPosition(this);
- item = this->items[this->cursorIdx];
+ item = this->items[this->cursorIndex];
item->restockFunc(play, item);
EnTrt_EndInteraction(play, this);
}
@@ -1128,7 +1149,7 @@ void EnTrt_ContinueShopping(EnTrt* this, PlayState* play) {
void EnTrt_PositionSelectedItem(EnTrt* this) {
static Vec3f sSelectedItemPosition = { 6.0f, 35.0f, -12.0f };
- u8 i = this->cursorIdx;
+ u8 i = this->cursorIndex;
EnGirlA* item;
ShopItem* shopItem = &sShop[i];
Vec3f worldPos;
@@ -1189,7 +1210,7 @@ void EnTrt_UpdateItemSelectedProperty(EnTrt* this) {
(this->drawCursor == 0)) {
item->isSelected = false;
} else {
- item->isSelected = this->cursorIdx == i ? true : false;
+ item->isSelected = this->cursorIndex == i ? true : false;
}
}
}
@@ -1278,53 +1299,53 @@ void EnTrt_UpdateStickDirectionPromptAnim(EnTrt* this) {
}
void EnTrt_OpenEyes(EnTrt* this) {
- if (this->eyeTextureIdx <= 0) {
- this->eyeTextureIdx = 0;
+ if (this->eyeTexIndex <= 0) {
+ this->eyeTexIndex = 0;
} else {
- this->eyeTextureIdx--;
+ this->eyeTexIndex--;
}
}
void EnTrt_CloseEyes(EnTrt* this) {
- if (this->eyeTextureIdx >= 2) {
- this->eyeTextureIdx = 2;
+ if (this->eyeTexIndex >= 2) {
+ this->eyeTexIndex = 2;
} else {
- this->eyeTextureIdx++;
+ this->eyeTexIndex++;
}
}
void EnTrt_Blink(EnTrt* this) {
s16 decr = this->blinkTimer - 1;
- s16 eyeTextureIdxTemp;
+ s16 eyeTexIndex;
if (decr != 0) {
this->blinkTimer = decr;
return;
}
- eyeTextureIdxTemp = this->eyeTextureIdx + 1;
- if (eyeTextureIdxTemp > 2) {
- this->eyeTextureIdx = 0;
+ eyeTexIndex = this->eyeTexIndex + 1;
+ if (eyeTexIndex > 2) {
+ this->eyeTexIndex = 0;
this->blinkTimer = (s32)(Rand_ZeroOne() * 60.0f) + 20;
} else {
- this->eyeTextureIdx = eyeTextureIdxTemp;
+ this->eyeTexIndex = eyeTexIndex;
this->blinkTimer = 1;
}
}
void EnTrt_NodOff(EnTrt* this) {
s16 decr = this->blinkTimer - 1;
- s16 eyeTextureIdxTemp;
+ s16 eyeTexIndex;
if (decr != 0) {
this->blinkTimer = decr;
return;
}
- eyeTextureIdxTemp = this->eyeTextureIdx + 1;
- if (eyeTextureIdxTemp > 2) {
- this->eyeTextureIdx = 1;
+ eyeTexIndex = this->eyeTexIndex + 1;
+ if (eyeTexIndex > 2) {
+ this->eyeTexIndex = 1;
this->blinkTimer = 20;
} else {
- this->eyeTextureIdx = eyeTextureIdxTemp;
+ this->eyeTexIndex = eyeTexIndex;
this->blinkTimer = 3;
}
}
@@ -1333,14 +1354,14 @@ void EnTrt_OpenThenCloseEyes(EnTrt* this) {
if (this->skelAnime.curFrame >= 40.0f) {
EnTrt_CloseEyes(this);
} else if (this->skelAnime.curFrame >= 35.0f) {
- this->eyeTextureIdx = 1;
+ this->eyeTexIndex = 1;
} else if (this->skelAnime.curFrame >= 10.0f) {
EnTrt_OpenEyes(this);
}
}
void EnTrt_EyesClosed(EnTrt* this) {
- this->eyeTextureIdx = 2;
+ this->eyeTexIndex = 2;
}
void EnTrt_OpenEyes2(EnTrt* this) {
@@ -1350,7 +1371,7 @@ void EnTrt_OpenEyes2(EnTrt* this) {
void EnTrt_OpenEyesThenSetToBlink(EnTrt* this) {
if (this->skelAnime.curFrame >= 7.0f) {
EnTrt_OpenEyes(this);
- if (this->eyeTextureIdx == 0) {
+ if (this->eyeTexIndex == 0) {
this->blinkFunc = EnTrt_Blink;
}
}
@@ -1363,7 +1384,7 @@ void EnTrt_TalkToShopkeeper(EnTrt* this, PlayState* play) {
if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
- if (this->talkOptionTextId == 0x845 || this->talkOptionTextId == 0x882) {
+ if ((this->talkOptionTextId == 0x845) || (this->talkOptionTextId == 0x882)) {
func_80151938(play, 0xFF);
} else {
EnTrt_StartShopping(play, this);
@@ -1441,9 +1462,9 @@ void EnTrt_LookToShopkeeperFromShelf(EnTrt* this, PlayState* play) {
}
void EnTrt_InitShopkeeper(EnTrt* this, PlayState* play) {
- SkelAnime_InitFlex(play, &this->skelAnime, &object_trt_Skel_00FEF0, &object_trt_Anim_00FD34, NULL, NULL, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gKotakeSkel, &gKotakeSleepingAnim, NULL, NULL, 0);
if (!(gSaveContext.save.weekEventReg[12] & 8) && !(gSaveContext.save.weekEventReg[84] & 0x40) &&
- gSaveContext.save.day >= 2) {
+ (gSaveContext.save.day >= 2)) {
this->actor.draw = NULL;
} else {
this->actor.draw = EnTrt_Draw;
@@ -1472,7 +1493,7 @@ void EnTrt_InitShop(EnTrt* this, PlayState* play) {
this->stickAccumY = 0;
this->stickAccumX = 0;
- this->cursorIdx = 0;
+ this->cursorIndex = 0;
this->cursorPos.z = 1.2f;
this->cursorColor.r = 0;
this->cursorColor.g = 80;
@@ -1522,7 +1543,7 @@ void EnTrt_InitShop(EnTrt* this, PlayState* play) {
Actor_SetScale(&this->actor, sActorScale);
EnTrt_SpawnShopItems(this, play, sShop);
this->blinkTimer = 20;
- this->eyeTextureIdx = 0;
+ this->eyeTexIndex = 0;
this->blinkFunc = EnTrt_EyesClosed;
if (gSaveContext.save.weekEventReg[53] & 8) {
this->flags |= ENTRT_GIVEN_MUSHROOM;
@@ -1548,6 +1569,7 @@ void EnTrt_DrawCursor(PlayState* play, EnTrt* this, f32 x, f32 y, f32 z, u8 draw
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
+
if (drawCursor != 0) {
func_8012C654(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
@@ -1562,6 +1584,7 @@ void EnTrt_DrawCursor(PlayState* play, EnTrt* this, f32 x, f32 y, f32 z, u8 draw
dsdx = (1.0f / z) * 1024.0f;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, 0, 0, dsdx, dsdx);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1579,6 +1602,7 @@ void EnTrt_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32 y
(void)"../z_en_trt.c";
OPEN_DISPS(play->state.gfxCtx);
+
gDPPipeSync(OVERLAY_DISP++);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, r, g, b, a);
@@ -1595,6 +1619,7 @@ void EnTrt_DrawTextRec(PlayState* play, s32 r, s32 g, s32 b, s32 a, f32 x, f32 y
dtdy = dy * unk;
gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, dsdx, dtdy);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1605,6 +1630,7 @@ void EnTrt_DrawStickDirectionPrompt(PlayState* play, EnTrt* this) {
(void)"../z_en_trt.c";
OPEN_DISPS(play->state.gfxCtx);
+
if (drawStickRightPrompt || drawStickLeftPrompt) {
func_8012C654(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -1639,6 +1665,7 @@ void EnTrt_DrawStickDirectionPrompt(PlayState* play, EnTrt* this) {
this->stickRightPrompt.texZ, 0, 0, 1.0f, 1.0f);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1668,14 +1695,14 @@ void EnTrt_Update(Actor* thisx, PlayState* play) {
EnTrt_UpdateItemSelectedProperty(this);
EnTrt_UpdateStickDirectionPromptAnim(this);
EnTrt_UpdateCursorAnim(this);
- EnTrt_UpdateHeadYawAndPitch(this, play);
+ EnTrt_TrackPlayer(this, play);
this->actionFunc(this, play);
Actor_SetFocus(&this->actor, 90.0f);
SkelAnime_Update(&this->skelAnime);
EnTrt_UpdateCollider(this, play);
}
-void EnTrt_UpdateHeadYawAndPitch(EnTrt* this, PlayState* play) {
+void EnTrt_TrackPlayer(EnTrt* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f playerPos;
Vec3f pos;
@@ -1690,7 +1717,7 @@ void EnTrt_UpdateHeadYawAndPitch(EnTrt* this, PlayState* play) {
this->headPitch = CLAMP(this->headPitch, -0x1C70, 0x1C70);
}
-void EnTrt_UpdateHeadPosAndRot(s16 pitch, s16 yaw, Vec3f* pos, Vec3s* rot, s32 isFullyAwake) {
+void EnTrt_UpdateLimb(s16 pitch, s16 yaw, Vec3f* pos, Vec3s* rot, s32 overrideRot) {
Vec3f newPos;
Vec3f zeroVec = gZeroVec3f;
Vec3s newRot;
@@ -1700,7 +1727,7 @@ void EnTrt_UpdateHeadPosAndRot(s16 pitch, s16 yaw, Vec3f* pos, Vec3s* rot, s32 i
Matrix_Get(¤tState);
Matrix_MtxFToYXZRot(¤tState, &newRot, false);
*pos = newPos;
- if (isFullyAwake) {
+ if (overrideRot) {
newRot.x += pitch;
newRot.y += yaw;
Math_SmoothStepToS(&rot->x, newRot.x, 4, 0x1FFE, 1);
@@ -1723,7 +1750,7 @@ s32 EnTrt_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
this->items[i]->actor.scale.z = 0.2f;
}
- if (limbIndex == 14) {
+ if (limbIndex == KOTAKE_LIMB_BROOM) {
*dList = NULL;
}
return false;
@@ -1731,14 +1758,14 @@ s32 EnTrt_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnTrt_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnTrt* this = THIS;
- s32 isFullyAwake;
+ s32 overrideRot;
- isFullyAwake = false;
+ overrideRot = false;
if (this->flags & ENTRT_FULLY_AWAKE) {
- isFullyAwake = true;
+ overrideRot = true;
}
- if (limbIndex == 21) {
- EnTrt_UpdateHeadPosAndRot(this->headPitch, this->headYaw, &this->headPos, &this->headRot, isFullyAwake);
+ if (limbIndex == KOTAKE_LIMB_HEAD) {
+ EnTrt_UpdateLimb(this->headPitch, this->headYaw, &this->headPos, &this->headRot, overrideRot);
Matrix_Translate(this->headPos.x, this->headPos.y, this->headPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
Matrix_RotateYS(this->headRot.y, MTXMODE_APPLY);
@@ -1750,7 +1777,7 @@ void EnTrt_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnTrt_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
EnTrt* this = THIS;
- if (limbIndex == 21) {
+ if (limbIndex == KOTAKE_LIMB_HEAD) {
Matrix_Translate(this->headPos.x, this->headPos.y, this->headPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
Matrix_RotateYS(this->headRot.y, MTXMODE_APPLY);
@@ -1760,15 +1787,15 @@ void EnTrt_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
}
void EnTrt_Draw(Actor* thisx, PlayState* play) {
- static TexturePtr sEyeTextures[] = { object_trt_Tex_00B0B8, object_trt_Tex_00B8B8, object_trt_Tex_00C0B8 };
+ static TexturePtr sEyeTextures[] = { gKotakeEyeOpenTex, gKotakeEyeHalfTex, gKotakeEyeClosedTex };
EnTrt* this = THIS;
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTextureIdx]));
- gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTextureIdx]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnTrt_OverrideLimbDraw, EnTrt_PostLimbDraw,
EnTrt_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Trt/z_en_trt.h b/src/overlays/actors/ovl_En_Trt/z_en_trt.h
index 46f0707979..9cbf5d51ca 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.h
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.h
@@ -22,7 +22,7 @@ typedef struct EnTrt {
/* 0x338 */ s32 stickAccumX;
/* 0x33C */ s32 stickAccumY;
/* 0x340 */ EnGirlA* items[3];
- /* 0x34C */ u8 cursorIdx;
+ /* 0x34C */ u8 cursorIndex;
/* 0x350 */ StickDirectionPrompt stickLeftPrompt;
/* 0x388 */ StickDirectionPrompt stickRightPrompt;
/* 0x3C0 */ f32 shopItemSelectedTween;
@@ -33,7 +33,7 @@ typedef struct EnTrt {
/* 0x3D4 */ u8 arrowAnimState;
/* 0x3D5 */ u8 stickAnimState;
/* 0x3D6 */ s16 blinkTimer;
- /* 0x3D8 */ s16 eyeTextureIdx;
+ /* 0x3D8 */ s16 eyeTexIndex;
/* 0x3DC */ EnTrtBlinkFunc blinkFunc;
/* 0x3E0 */ s16 cutscene;
/* 0x3E2 */ s16 tmpGetMushroomCutscene;
diff --git a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
index 9e791dbeab..1f521d250a 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
@@ -26,17 +26,30 @@ void func_80AD4FE4(EnTrt2* this, PlayState* play);
void func_80AD5234(EnTrt2* this, PlayState* play);
void func_80AD56E8(Actor* thisx, PlayState* play);
+typedef enum {
+ /* 0 */ TRT2_ANIM_IDLE,
+ /* 1 */ TRT2_ANIM_HALF_AWAKE,
+ /* 2 */ TRT2_ANIM_SLEEPING,
+ /* 3 */ TRT2_ANIM_WAKE_UP,
+ /* 4 */ TRT2_ANIM_SURPRISED,
+ /* 5 */ TRT2_ANIM_HANDS_ON_COUNTER,
+ /* 6 */ TRT2_ANIM_HOVER,
+ /* 7 */ TRT2_ANIM_FLY_LOOK_AROUND,
+ /* 8 */ TRT2_ANIM_FLY_DOWN,
+ /* 9 */ TRT2_ANIM_FLY
+} Trt2Animation;
+
static AnimationInfoS sAnimationInfo[] = {
- { &object_trt_Anim_00DE68, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_00EE98, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_00FD34, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_0030EC, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_003D78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_trt_Anim_00D52C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_000A44, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_001EF4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_002224, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_trt_Anim_002CB0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeIdleAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeHalfAwakeAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeSleepingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeWakeUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gKotakeHandsOnCounterAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeHoverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeFlyLookAroundAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeFlyDownAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gKotakeFlyAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
};
const ActorInit En_Trt2_InitVars = {
@@ -108,18 +121,18 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0x0),
};
-void func_80AD3380(SkelAnime* skelAnime, AnimationInfoS* animation, s32 arg2) {
- f32 phi_f0;
+void EnTrt2_ChangeAnim(SkelAnime* skelAnime, AnimationInfoS* animationInfo, s32 animIndex) {
+ f32 endFrame;
- animation += arg2;
+ animationInfo += animIndex;
- if (animation->frameCount < 0) {
- phi_f0 = Animation_GetLastFrame(animation->animation);
+ if (animationInfo->frameCount < 0) {
+ endFrame = Animation_GetLastFrame(animationInfo->animation);
} else {
- phi_f0 = animation->frameCount;
+ endFrame = animationInfo->frameCount;
}
- Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, phi_f0,
- animation->mode, animation->morphFrames);
+ Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame, endFrame,
+ animationInfo->mode, animationInfo->morphFrames);
}
void func_80AD341C(EnTrt2* this, PlayState* play) {
@@ -170,7 +183,7 @@ void func_80AD3530(EnTrt2* this, PlayState* play) {
if (DECR(this->unk_3AE) == 0) {
this->unk_3AE = Rand_S16Offset(20, 20);
- func_80AD3380(&this->skelAnime, sAnimationInfo, 7);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_FLY_LOOK_AROUND);
this->unk_3B2 = 5;
}
}
@@ -277,7 +290,7 @@ void func_80AD3A24(EnTrt2* this, PlayState* play) {
Math_ApproachF(&this->actor.speedXZ, 0.0f, 0.2f, 1.0f);
} else if (DECR(this->unk_3AE) == 0) {
this->unk_3AE = Rand_S16Offset(100, 50);
- func_80AD3380(&this->skelAnime, sAnimationInfo, 6);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
this->unk_3B2 = 4;
}
Actor_MoveWithGravity(&this->actor);
@@ -288,7 +301,7 @@ void func_80AD3AE4(EnTrt2* this, PlayState* play) {
Math_ApproachF(&this->actor.velocity.y, 0.5f, 0.2f, 0.1f);
} else {
this->actor.velocity.y = 0.0f;
- func_80AD3380(&this->skelAnime, sAnimationInfo, 6);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
this->unk_3B2 = 4;
}
Actor_MoveWithGravity(&this->actor);
@@ -298,7 +311,7 @@ void func_80AD3B6C(EnTrt2* this, PlayState* play) {
if (DECR(this->unk_3B0) == 0) {
this->unk_3B0 = 10;
this->actor.velocity.y = -1.0f;
- func_80AD3380(&this->skelAnime, sAnimationInfo, 8);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_FLY_DOWN);
this->unk_3B2 = 8;
}
}
@@ -311,7 +324,7 @@ void func_80AD3BE4(EnTrt2* this, PlayState* play) {
this->actor.world.rot.y += this->unk_3C0;
this->actor.shape.rot.y = this->actor.world.rot.y;
if (this->actor.world.pos.y < 5.0f) {
- func_80AD3380(&this->skelAnime, sAnimationInfo, 9);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_FLY);
this->unk_3B2 = 9;
}
}
@@ -335,7 +348,7 @@ void func_80AD3CEC(EnTrt2* this, PlayState* play) {
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- func_80AD3380(&this->skelAnime, sAnimationInfo, 6);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
this->unk_3B2 = 4;
}
}
@@ -436,7 +449,7 @@ void func_80AD417C(EnTrt2* this, PlayState* play) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
if (this->unk_3A8 == 0x84C) {
- func_80AD3380(&this->skelAnime, sAnimationInfo, 6);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
this->path = SubS_GetPathByIndex(play, ENTRT2_GET_FC00(&this->actor), 0x3F);
this->unk_3B2 = 18;
} else if (this->unk_3A8 == 0x88F) {
@@ -510,7 +523,7 @@ void func_80AD4550(EnTrt2* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if ((player->transformation != PLAYER_FORM_HUMAN) && (player->transformation != PLAYER_FORM_FIERCE_DEITY)) {
- func_80AD3380(&this->skelAnime, sAnimationInfo, 7);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_FLY_LOOK_AROUND);
this->unk_3B2 = 17;
}
@@ -539,7 +552,7 @@ void func_80AD4608(EnTrt2* this) {
}
void func_80AD469C(EnTrt2* this, PlayState* play) {
- SkelAnime_InitFlex(play, &this->skelAnime, &object_trt_Skel_00FEF0, &object_trt_Anim_000A44, NULL, NULL, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gKotakeSkel, &gKotakeHoverAnim, NULL, NULL, 0);
this->actor.draw = func_80AD56E8;
}
@@ -665,7 +678,7 @@ s32 func_80AD4B4C(EnTrt2* this, PlayState* play) {
} else {
this->unk_3A8 = 0x84F;
this->unk_3D8 = true;
- func_80AD3380(&this->skelAnime, sAnimationInfo, 7);
+ EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_FLY_LOOK_AROUND);
this->unk_3B2 = 7;
}
}
@@ -876,7 +889,8 @@ void func_80AD5394(s16 arg0, s16 arg1, Vec3f* arg2, Vec3s* arg3, s32 arg4) {
s32 EnTrt2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnTrt2* this = THIS;
- if ((limbIndex == 8) || (limbIndex == 13) || (limbIndex == 19)) {
+ if ((limbIndex == KOTAKE_LIMB_TORSO_LIMB) || (limbIndex == KOTAKE_LIMB_LEFT_HAND) ||
+ (limbIndex == KOTAKE_LIMB_RIGHT_HAND)) {
rot->y += (s16)Math_SinS(this->unk_33C[limbIndex]) * 200;
rot->z += (s16)Math_CosS(this->unk_372[limbIndex]) * 200;
}
@@ -892,7 +906,7 @@ void EnTrt2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
phi_v0 = true;
}
- if (limbIndex == 21) {
+ if (limbIndex == KOTAKE_LIMB_HEAD) {
func_80AD5394(this->unk_3D4, this->unk_3D6, &this->unk_3C8, &this->unk_3C2, phi_v0);
Matrix_Translate(this->unk_3C8.x, this->unk_3C8.y, this->unk_3C8.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
@@ -906,7 +920,7 @@ void EnTrt2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
void EnTrt2_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
EnTrt2* this = THIS;
- if (limbIndex == 21) {
+ if (limbIndex == KOTAKE_LIMB_HEAD) {
Matrix_Translate(this->unk_3C8.x, this->unk_3C8.y, this->unk_3C8.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
Matrix_RotateYS(this->unk_3C2.y, MTXMODE_APPLY);
@@ -917,9 +931,9 @@ void EnTrt2_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void func_80AD56E8(Actor* thisx, PlayState* play) {
static TexturePtr D_80AD5978[] = {
- object_trt_Tex_00B0B8,
- object_trt_Tex_00B8B8,
- object_trt_Tex_00C0B8,
+ gKotakeEyeOpenTex,
+ gKotakeEyeHalfTex,
+ gKotakeEyeClosedTex,
};
s32 pad;
EnTrt2* this = THIS;
diff --git a/src/overlays/actors/ovl_En_Tru/z_en_tru.c b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
index 996a32befe..42cbdc22a1 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.c
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
@@ -80,8 +80,8 @@ static Color_RGBA8 D_80A8B25C[] = {
static f32 D_80A8B274[] = { 60.0f, 255.0f, 60.0f };
-static TexturePtr D_80A8B280[] = {
- gDust8Tex, gDust7Tex, gDust6Tex, gDust5Tex, gDust4Tex, gDust3Tex, gDust2Tex, gDust1Tex,
+static TexturePtr sDustTextures[] = {
+ gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
static ColliderSphereInit sSphereInit = {
@@ -307,7 +307,7 @@ void func_80A85F84(EnTruUnkStruct* arg0, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
idx = ((f32)arg0->unk_02 / arg0->unk_01) * 8.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A8B280[idx]));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
gSPDisplayList(POLY_XLU_DISP++, object_tru_DL_01A830);
Matrix_Pop();
diff --git a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.h b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.h
index ce61376495..396918fdb4 100644
--- a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.h
+++ b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.h
@@ -10,7 +10,7 @@ typedef void (*EnTsnActionFunc)(struct EnTsn*, PlayState*);
#define ENTSN_GET_F(thisx) ((thisx)->params & 0xF)
#define ENTSN_GET_100(thisx) ((thisx)->params & 0x100)
#define ENTSN_GET_Z(thisx) ((thisx)->home.rot.z)
-#define ENTSN_SET_Z(thisx, state) ((thisx)->home.rot.z = state)
+#define ENTSN_SET_Z(thisx, state) ((thisx)->home.rot.z = (state))
#define ENTSN_F_0 0
#define ENTSN_F_1 1
diff --git a/src/overlays/actors/ovl_En_Twig/z_en_twig.c b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
index 182db56591..5df9cee3c5 100644
--- a/src/overlays/actors/ovl_En_Twig/z_en_twig.c
+++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
@@ -5,6 +5,7 @@
*/
#include "z_en_twig.h"
+#include "objects/object_twig/object_twig.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -12,10 +13,18 @@
void EnTwig_Init(Actor* thisx, PlayState* play);
void EnTwig_Destroy(Actor* thisx, PlayState* play);
-void EnTwig_Update(Actor* thisx, PlayState* play);
-void EnTwig_Draw(Actor* thisx, PlayState* play);
+void EnTwig_Update(Actor* this, PlayState* play);
+void EnTwig_Draw(EnTwig* this, PlayState* play);
+
+void func_80AC0A54(EnTwig* this, PlayState* play);
+void func_80AC0A6C(EnTwig* this, PlayState* play);
+
+void func_80AC0A7C(EnTwig* this, PlayState* play);
+void func_80AC0AC8(EnTwig* this, PlayState* play);
+
+void func_80AC0CC4(EnTwig* this, PlayState* play);
+void func_80AC0D2C(EnTwig* this, PlayState* play);
-#if 0
const ActorInit En_Twig_InitVars = {
ACTOR_EN_TWIG,
ACTORCAT_MISC,
@@ -28,36 +37,205 @@ const ActorInit En_Twig_InitVars = {
(ActorFunc)EnTwig_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80AC10C0[] = {
+static s32 sCurrentRing;
+static s16 sRingCount;
+static s16 sRingNotCollected[25];
+
+static CollisionHeader* sColHeaders[] = {
+ NULL,
+ &object_twig_Colheader_0020A0,
+ &object_twig_Colheader_0016C0,
+};
+
+static s16 sRingsHaveSpawned = false;
+
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 40, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 40, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
};
-#endif
+void EnTwig_Init(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnTwig* this = THIS;
+ s32 i;
-extern InitChainEntry D_80AC10C0[];
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ this->unk_160 = RACERING_GET_PARAM_F(&this->dyna.actor);
+ DynaPolyActor_Init(&this->dyna, 1);
+ if (sColHeaders[this->unk_160] != NULL) {
+ DynaPolyActor_LoadMesh(play, &this->dyna, sColHeaders[this->unk_160]);
+ }
+ this->dyna.actor.bgCheckFlags |= 0x400;
+ switch (this->unk_160) {
+ case 0:
+ Actor_MarkForDeath(&this->dyna.actor);
+ break;
+ case 1:
+ if (!sRingsHaveSpawned) {
+ sRingCount = (gSaveContext.save.weekEventReg[24] & 4) ? 25 : 20;
+ for (i = 0; i < sRingCount; i++) {
+ sRingNotCollected[i] = false;
+ }
+ sRingsHaveSpawned = true;
+ }
+ if (RACERING_GET_PARAM_1F0(&this->dyna.actor) != 0) {
+ if (!(gSaveContext.save.weekEventReg[24] & 4)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
+ } else if (gSaveContext.save.weekEventReg[24] & 4) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
+ Actor_SetScale(&this->dyna.actor, 4.2f);
+ this->dyna.actor.uncullZoneScale = this->dyna.actor.uncullZoneDownward = this->dyna.actor.scale.x * 60.0f;
+ func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ func_80AC0A7C(this, play);
+ break;
+ case 2:
+ Actor_SetScale(&this->dyna.actor, 1.0f);
+ this->dyna.actor.uncullZoneScale = this->dyna.actor.uncullZoneDownward = this->dyna.actor.scale.x * 880.0f;
+ func_80AC0A54(this, play);
+ break;
+ }
+}
-extern UNK_TYPE D_06001C38;
+void EnTwig_Destroy(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnTwig* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Init.s")
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Destroy.s")
+void func_80AC0A54(EnTwig* this, PlayState* play) {
+ this->actionFunc = func_80AC0A6C;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0A54.s")
+void func_80AC0A6C(EnTwig* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0A6C.s")
+void func_80AC0A7C(EnTwig* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0A7C.s")
+ Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[0]);
+ this->unk_178 = 0;
+ this->unk_17A = 0;
+ this->actionFunc = func_80AC0AC8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0AC8.s")
+void func_80AC0AC8(EnTwig* this, PlayState* play) {
+ static Vec3f D_80AC10D0 = { 0.0f, 0.0f, 1.0f };
+ Player* player = GET_PLAYER(play);
+ Plane sp4C;
+ Vec3f sp40;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0CC4.s")
+ if (sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) {
+ if (this->unk_17A == 3) {
+ this->unk_17A = 0;
+ this->dyna.actor.shape.rot.z += 0x2000;
+ } else {
+ this->unk_17A++;
+ }
+ }
+ SubS_ConstructPlane(&this->dyna.actor.world.pos, &D_80AC10D0, &this->dyna.actor.shape.rot, &sp4C);
+ if ((sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) &&
+ Math3D_LineSegVsPlane(sp4C.normal.x, sp4C.normal.y, sp4C.normal.z, sp4C.originDist, &this->unk_180,
+ &player->bodyPartsPos[0], &sp40, 0)) {
+ if (Math3D_Vec3fDistSq(&this->dyna.actor.world.pos, &sp40) <= SQ(this->dyna.actor.scale.x * 0.345f * 40.0f)) {
+ func_80AC0CC4(this, play);
+ return;
+ }
+ } else {
+ if (this->dyna.actor.xyzDistToPlayerSq <= SQ((this->dyna.actor.scale.x * 40.0f) + 40)) {
+ func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ } else {
+ func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ }
+ if (this->dyna.actor.xyzDistToPlayerSq >= (this->dyna.actor.scale.x * 10.0f * 40.0f * 40.0f)) {
+ this->dyna.actor.shape.rot.y = this->dyna.actor.yawTowardsPlayer;
+ this->dyna.actor.world.rot.y = this->dyna.actor.yawTowardsPlayer;
+ }
+ }
+ Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[0]);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0D2C.s")
+void func_80AC0CC4(EnTwig* this, PlayState* play) {
+ this->unk_170 = 3458.0f;
+ this->unk_174 = 0.2f;
+ this->unk_16C |= 1;
+ func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ this->actionFunc = func_80AC0D2C;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Update.s")
+void func_80AC0D2C(EnTwig* this, PlayState* play) {
+ static Vec3f sKiraVel = { 0.0f, -0.05f, 0.0f };
+ static Vec3f sKiraAccel = { 0.0f, -0.025f, 0.0f };
+ static Color_RGBA8 sColorWhite = { 255, 255, 255, 130 };
+ static Color_RGBA8 sColorYellow = { 255, 255, 0, 0 };
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Draw.s")
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.x, player->bodyPartsPos[0].x, 0.5f, 100.0f, 0.01f);
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.y, player->bodyPartsPos[0].y, 0.5f, 100.0f, 0.01f);
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.z, player->bodyPartsPos[0].z, 0.5f, 100.0f, 0.01f);
+ this->dyna.actor.shape.rot.z += (s16)this->unk_170;
+ this->dyna.actor.scale.x -= this->unk_174;
+ if (this->dyna.actor.scale.x < 0.0f) {
+ Actor_SetScale(&this->dyna.actor, 0.0f);
+ } else {
+ Actor_SetScale(&this->dyna.actor, this->dyna.actor.scale.x);
+ }
+ if (this->dyna.actor.scale.x <= 0.0f) {
+ s32 j;
+ Vec3f sp6C;
+
+ for (j = 0; j < 7; j++) {
+ sp6C.x = (Rand_Centered() * 10.0f) + this->dyna.actor.world.pos.x;
+ sp6C.y = (Rand_Centered() * 10.0f) + this->dyna.actor.world.pos.y;
+ sp6C.z = (Rand_Centered() * 10.0f) + this->dyna.actor.world.pos.z;
+ EffectSsKirakira_SpawnDispersed(play, &sp6C, &sKiraVel, &sKiraAccel, &sColorWhite, &sColorYellow, 1000,
+ (s32)(Rand_ZeroOne() * 10.0f) + 20);
+ }
+ play_sound(NA_SE_SY_GET_ITEM);
+ play->interfaceCtx.unk_25C--;
+ sRingNotCollected[RACERING_GET_PARAM_FE0(&this->dyna.actor)] = true;
+ if (sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) {
+ s32 i;
+
+ for (i = 0; i < sRingCount; i++) {
+ if (!sRingNotCollected[i]) {
+ sCurrentRing = i;
+ break;
+ }
+ }
+ if (i == sRingCount) {
+ sCurrentRing = -1;
+ }
+ }
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
+ this->unk_170 += 180.0f / 0x10000;
+ this->unk_174 += 0.15f;
+}
+
+void EnTwig_Update(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnTwig* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void EnTwig_Draw(EnTwig* thisx, PlayState* play) {
+ EnTwig* this = THIS;
+
+ switch (this->unk_160) {
+ case 1:
+ Gfx_DrawDListOpa(play, object_twig_DL_001C38);
+ break;
+ case 2:
+ Gfx_DrawDListOpa(play, object_twig_DL_0014C8);
+ break;
+ }
+}
diff --git a/src/overlays/actors/ovl_En_Twig/z_en_twig.h b/src/overlays/actors/ovl_En_Twig/z_en_twig.h
index 2caebeb82c..3de7f8f4b9 100644
--- a/src/overlays/actors/ovl_En_Twig/z_en_twig.h
+++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.h
@@ -7,11 +7,22 @@ struct EnTwig;
typedef void (*EnTwigActionFunc)(struct EnTwig*, PlayState*);
+#define RACERING_GET_PARAM_F(thisx) ((thisx)->params & 0xF)
+#define RACERING_GET_PARAM_1F0(thisx) (((thisx)->params >> 4) & 0x1F)
+#define RACERING_GET_PARAM_FE0(thisx) (((thisx)->params >> 9) & 0x7F)
+
typedef struct EnTwig {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x18];
+ /* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ EnTwigActionFunc actionFunc;
- /* 0x160 */ char unk_160[0x2C];
+ /* 0x160 */ s32 unk_160;
+ /* 0x160 */ UNK_TYPE1 unk164[8];
+ /* 0x16C */ s32 unk_16C;
+ /* 0x170 */ f32 unk_170;
+ /* 0x174 */ f32 unk_174;
+ /* 0x178 */ s16 unk_178;
+ /* 0x17A */ u16 unk_17A;
+ /* 0x17C */ UNK_TYPE1 unk17C[4];
+ /* 0x180 */ Vec3f unk_180;
} EnTwig; // size = 0x18C
extern const ActorInit En_Twig_InitVars;
diff --git a/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
index 4e7e851470..2dedc7c2ac 100644
--- a/src/overlays/actors/ovl_En_Vm/z_en_vm.c
+++ b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
@@ -144,14 +144,14 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 2, 25, 100, MASS_IMMOVABLE };
TexturePtr D_808CD58C[] = {
- gameplay_keep_Tex_03F300, gameplay_keep_Tex_03FB00, gameplay_keep_Tex_040300, gameplay_keep_Tex_040B00,
- gameplay_keep_Tex_041300, gameplay_keep_Tex_041B00, gameplay_keep_Tex_042300, gameplay_keep_Tex_042B00,
+ gEffEnemyDeathFlame1Tex, gEffEnemyDeathFlame2Tex, gEffEnemyDeathFlame3Tex, gEffEnemyDeathFlame4Tex,
+ gEffEnemyDeathFlame5Tex, gEffEnemyDeathFlame6Tex, gEffEnemyDeathFlame7Tex, gEffEnemyDeathFlame8Tex,
};
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 14, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 1000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 57, ICHAIN_STOP),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BEAMOS, ICHAIN_STOP),
};
s32 D_808CD5B8 = false;
@@ -532,7 +532,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play) {
gDPSetPrimColor(&gfx[3], 0, 0, 255, 255, 255, 168);
gDPSetEnvColor(&gfx[4], 0, 0, 255, 0);
gSPSegment(&gfx[5], 0x08, D_808CD58C[play->gameplayFrames & 7]);
- gSPDisplayList(&gfx[6], gameplay_keep_DL_044300);
+ gSPDisplayList(&gfx[6], gEffEnemyDeathFlameDL);
POLY_XLU_DISP = &gfx[7];
}
diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
index 16cfa6a4b3..9dca3642f3 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
@@ -123,7 +123,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 30, 40, 150 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 48, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_WALLMASTER, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 5500, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
index a7df95fb83..4f302e2687 100644
--- a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
+++ b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
@@ -51,10 +51,10 @@ void EnWarptag_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
Actor_SetFocus(&this->dyna.actor, 0.0f);
- if (GET_WARPTAG_3C0_MAX(thisx) == WARPTAG_3C0_MAX) {
+ if (WARPTAG_GET_3C0_MAX(thisx) == WARPTAG_3C0_MAX) {
this->dyna.actor.flags &= ~ACTOR_FLAG_1;
- if (GET_WARPTAG_INVISIBLE(&this->dyna.actor)) {
+ if (WARPTAG_GET_INVISIBLE(&this->dyna.actor)) {
this->actionFunc = EnWarpTag_WaitForPlayer;
} else {
@@ -93,7 +93,7 @@ void EnWarpTag_CheckDungeonKeepObject(EnWarptag* this, PlayState* play) {
void EnWarpTag_WaitForPlayer(EnWarptag* this, PlayState* play) {
if (!Player_InCsMode(play) && (this->dyna.actor.xzDistToPlayer <= 30.0f) &&
(this->dyna.actor.playerHeightRel <= 10.0f)) {
- if (GET_WARPTAG_INVISIBLE(&this->dyna.actor)) {
+ if (WARPTAG_GET_INVISIBLE(&this->dyna.actor)) {
func_800B7298(play, NULL, 0x51);
this->actionFunc = EnWarpTag_GrottoReturn;
} else {
@@ -112,8 +112,8 @@ void EnWarpTag_Unused809C09A0(EnWarptag* this, PlayState* play) {
// this actor doesnt have that flag set default, or in init, and this is called shortly after init
// and I doubt its set externally by another actor, so I believe this is unused
// might be a bug, they might have meant to set actor flag (0x2000 0000) up above but mistyped (0x200 0000)
- // also GET_WARPTAG_3C0 should always return 2C0 -> 0xF for all known in-game uses, which is OOB
- func_80152434(play, D_809C1000[GET_WARPTAG_3C0(&this->dyna.actor)]); // unk message function
+ // also WARPTAG_GET_3C0 should always return 2C0 -> 0xF for all known in-game uses, which is OOB
+ func_80152434(play, D_809C1000[WARPTAG_GET_3C0(&this->dyna.actor)]); // unk message function
this->actionFunc = EnWarpTag_Unused809C0A20;
} else {
@@ -180,7 +180,7 @@ void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
player->actor.gravity = -0.5f;
if (this->dyna.actor.playerHeightRel < -80.0f) {
- playerSpawnIndexPerForm[PLAYER_FORM_FIERCE_DEITY] = GET_WARPTAG_EXIT_INDEX(&this->dyna.actor);
+ playerSpawnIndexPerForm[PLAYER_FORM_FIERCE_DEITY] = WARPTAG_GET_EXIT_INDEX(&this->dyna.actor);
playerSpawnIndexPerForm[PLAYER_FORM_HUMAN] = playerSpawnIndexPerForm[PLAYER_FORM_FIERCE_DEITY];
playerSpawnIndexPerForm[PLAYER_FORM_GORON] = this->dyna.actor.world.rot.x;
playerSpawnIndexPerForm[PLAYER_FORM_ZORA] = this->dyna.actor.world.rot.y;
@@ -200,7 +200,7 @@ void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
newRespawnPos.y = playerActorEntry->pos.y;
newRespawnPos.z = playerActorEntry->pos.z;
- if (GET_WARPTAG_3C0_MAX(&this->dyna.actor) == WARPTAG_3C0_MAX) {
+ if (WARPTAG_GET_3C0_MAX(&this->dyna.actor) == WARPTAG_3C0_MAX) {
playerParams = 0x9FF;
} else { // not used by any known variant
playerParams = 0x8FF;
@@ -241,7 +241,7 @@ void EnWarpTag_GrottoReturn(EnWarptag* this, PlayState* play) {
}
if (this->grottoExitDelay++ == 10) {
- play->nextEntrance = play->setupExitList[GET_WARPTAG_EXIT_INDEX(&this->dyna.actor)];
+ play->nextEntrance = play->setupExitList[WARPTAG_GET_EXIT_INDEX(&this->dyna.actor)];
Scene_SetExitFade(play);
play->transitionTrigger = TRANS_TRIGGER_START;
func_8019F128(NA_SE_OC_SECRET_HOLE_OUT);
diff --git a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.h b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.h
index 8bc521f15e..ea7eff8ab5 100644
--- a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.h
+++ b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.h
@@ -24,10 +24,10 @@ extern const ActorInit En_Warp_tag_InitVars;
// Goron Trial (MOON): 0x03C1
// Deku Playground: 0x83C0
-#define GET_WARPTAG_3C0_MAX(thisx) ((thisx)->params & 0x3C0)
-#define GET_WARPTAG_3C0(thisx) (((thisx)->params >> 6) & 0xF)
-#define GET_WARPTAG_EXIT_INDEX(thisx) ((thisx)->params & 0x3F)
-#define GET_WARPTAG_INVISIBLE(thisx) ((thisx)->params < 0) // 0x8000 flag
+#define WARPTAG_GET_3C0_MAX(thisx) ((thisx)->params & 0x3C0)
+#define WARPTAG_GET_3C0(thisx) (((thisx)->params >> 6) & 0xF)
+#define WARPTAG_GET_EXIT_INDEX(thisx) ((thisx)->params & 0x3F)
+#define WARPTAG_GET_INVISIBLE(thisx) ((thisx)->params < 0) // 0x8000 flag
#define WARPTAG_3C0_MAX 0x3C0
diff --git a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
index 499ca365f2..fc1ad7279b 100644
--- a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
+++ b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
@@ -1,7 +1,15 @@
/*
* File: z_en_water_effect.c
* Overlay: ovl_En_Water_Effect
- * Description: Water splashing effect (used for Gyorg)
+ * Description: Water/rock drop spawner and Gyorg water splashing effect
+ *
+ * This actor serves two purposes:
+ * - It can act as a "spawner" for either water drops or flaming rocks. This
+ * spawner can be placed in the ceiling to drop these repeatedly.
+ * - It is also used to control various water splashing effects for the Gyorg
+ * fight. Specifically, it handles the splashing that is caused when it
+ * enters or exits the water, and it handles the shockwave that is created
+ * when it rams the center platform.
*/
#include "z_en_water_effect.h"
@@ -85,27 +93,30 @@ void EnWaterEffect_Init(Actor* thisx, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_1;
this->unk_DC4 = Rand_ZeroFloat(100.0f);
- if (this->actor.params == ENWATEREFFECT_1) {
+ if (this->actor.params == ENWATEREFFECT_TYPE_FALLING_ROCK_SPAWNER) {
this->actor.update = func_80A59C04;
this->actor.draw = func_80A5A184;
this->unk_DC6 = Rand_ZeroFloat(100.0f) + 60.0f;
- } else if ((this->actor.params == ENWATEREFFECT_309) || (this->actor.params == ENWATEREFFECT_30A) ||
- (this->actor.params == ENWATEREFFECT_30B) || (this->actor.params == ENWATEREFFECT_30C)) {
+ } else if ((this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) ||
+ (this->actor.params == ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY) ||
+ (this->actor.params == ENWATEREFFECT_TYPE_GYORG_SECONDARY_SPRAY) ||
+ (this->actor.params == ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE)) {
this->actor.update = func_80A5A534;
this->actor.draw = func_80A5A6B8;
this->actor.shape.rot.y = Rand_ZeroFloat(0x10000);
Actor_SetScale(&this->actor, this->actor.shape.rot.z * 0.0002f);
- if (this->actor.params == ENWATEREFFECT_309) {
+ if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, this->actor.shape.rot.z, 0x30A);
+ this->actor.world.pos.z, 0, 0, this->actor.shape.rot.z, ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, this->actor.shape.rot.z, 0x30B);
- } else if (this->actor.params == ENWATEREFFECT_30A) {
+ this->actor.world.pos.z, 0, 0, this->actor.shape.rot.z,
+ ENWATEREFFECT_TYPE_GYORG_SECONDARY_SPRAY);
+ } else if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY) {
this->unk_DC4 = -3;
- } else if (this->actor.params == ENWATEREFFECT_30B) {
+ } else if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_SECONDARY_SPRAY) {
this->unk_DC4 = -6;
- } else if (this->actor.params == ENWATEREFFECT_30C) {
+ } else if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE) {
this->unk_DC4 = 23;
}
@@ -285,7 +296,7 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) {
if (!phi_s4) {
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gDust1Tex));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
phi_s4++;
@@ -317,7 +328,7 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) {
if (!phi_s4) {
func_8012C448(gfxCtx);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gDust1Tex));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
phi_s4++;
@@ -620,7 +631,8 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
Matrix_Push();
Matrix_Push();
- if ((this->actor.params == ENWATEREFFECT_309) || (this->actor.params == ENWATEREFFECT_30A)) {
+ if ((this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) ||
+ (this->actor.params == ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY)) {
if (this->unk_E2C > 1.0f) {
func_8012C2DC(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000DE0));
@@ -648,7 +660,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
Matrix_Pop();
}
- if ((this->unk_E34 > 1.0f) && (this->actor.params != ENWATEREFFECT_30C)) {
+ if ((this->unk_E34 > 1.0f) && (this->actor.params != ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE)) {
func_8012C2DC(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E40));
Matrix_Scale(this->unk_DC8[3].y, this->unk_DC8[3].z, this->unk_DC8[3].y, MTXMODE_APPLY);
@@ -660,7 +672,8 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
Matrix_Pop();
- if ((this->actor.params == ENWATEREFFECT_309) || (this->actor.params == ENWATEREFFECT_30C)) {
+ if ((this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) ||
+ (this->actor.params == ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE)) {
func_8012C2DC(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E58));
Matrix_Scale(this->unk_DC8[4].y, this->unk_DC8[4].z, this->unk_DC8[4].y, MTXMODE_APPLY);
@@ -670,7 +683,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_000CD8);
}
- if (this->actor.params == ENWATEREFFECT_309) {
+ if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) {
func_8012C2DC(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_144) / 2; i++, ptr++) {
@@ -678,7 +691,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
if (!phi_s4) {
func_8012C448(play->state.gfxCtx);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gDust1Tex));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
phi_s4++;
diff --git a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
index 35aebd83e7..e4fb752dc2 100644
--- a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
+++ b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
@@ -18,13 +18,14 @@ typedef struct {
/* 0x3C */ s16 unk_3C;
} EnWaterEffectStruct; // size = 0x40
-enum {
- /* 0x001 */ ENWATEREFFECT_1 = 1,
- /* 0x309 */ ENWATEREFFECT_309 = 0x309,
- /* 0x30A */ ENWATEREFFECT_30A,
- /* 0x30B */ ENWATEREFFECT_30B,
- /* 0x30C */ ENWATEREFFECT_30C,
-};
+typedef enum {
+ /* 0x001 */ ENWATEREFFECT_TYPE_FALLING_ROCK_SPAWNER = 1, // Spawner for falling flaming rocks,
+ /* 0x0FF */ ENWATEREFFECT_TYPE_FALLING_WATER_SPAWNER = 0xFF, // Spawner for water dripping from the ceiling
+ /* 0x309 */ ENWATEREFFECT_TYPE_GYORG_RIPPLES = 0x309, // Ripples on the surface when Gyrog enters/leaves the water
+ /* 0x30A */ ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY, // Large "funnel" of water that forms when Gyorg enters/leaves the water
+ /* 0x30B */ ENWATEREFFECT_TYPE_GYORG_SECONDARY_SPRAY, // Secondary "funnel" in the middle of the larger "funnel"
+ /* 0x30C */ ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE, // Shockwave on the surface when Gyorg rams into the central platform
+} EnWaterEffectType;
typedef struct EnWaterEffect {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
index 21302d5121..092c693f2c 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
@@ -69,7 +69,7 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
// flag: is targetable. Should do nothing as not set by default above
this->actor.flags &= ~ACTOR_FLAG_1;
- switch (WEATHER_TAG_TYPE(this)) {
+ switch (WEATHER_TAG_TYPE(&this->actor)) {
case WEATHERTAG_TYPE_UNK0:
this->unk154 = 0;
this->fadeDistance = this->actor.world.rot.x;
@@ -101,7 +101,7 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
EnWeatherTag_SetupAction(this, func_80966BF4);
break;
case WEATHERTAG_TYPE_WATERMURK:
- pathID = WEATHER_TAG_PATHID(this);
+ pathID = WEATHER_TAG_PATHID(&this->actor);
path = &play->setupPathList[pathID];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
this->pathCount = path->count;
@@ -119,7 +119,7 @@ u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4,
Player* player = GET_PLAYER(play);
u8 returnVal = 0;
- if (WEATHER_TAG_RANGE100(this) > Actor_XZDistanceBetweenActors(&player->actor, &this->actor)) {
+ if (WEATHER_TAG_RANGE100(&this->actor) > Actor_XZDistanceBetweenActors(&player->actor, &this->actor)) {
if (play->envCtx.unk_1F == play->envCtx.unk_20) {
D_801BDBB8 = 1;
if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
@@ -147,7 +147,7 @@ u8 func_80966758(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4,
Player* player = GET_PLAYER(play);
u8 returnVal = 0;
- if (WEATHER_TAG_RANGE100(this) < Actor_XZDistanceBetweenActors(&player->actor, &this->actor)) {
+ if (WEATHER_TAG_RANGE100(&this->actor) < Actor_XZDistanceBetweenActors(&player->actor, &this->actor)) {
if (play->envCtx.unk_1F == play->envCtx.unk_20) {
D_801BDBB8 = 1;
if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
@@ -199,7 +199,7 @@ void func_8096689C(EnWeatherTag* this, PlayState* play) {
// WEATHERTAG_TYPE_UNK0
void func_80966A08(EnWeatherTag* this, PlayState* play) {
this->unk154 += this->unk158;
- if (this->unk154 >= 0x8001) {
+ if (this->unk154 > 0x8000) {
this->unk154 = 0x8000;
EnWeatherTag_SetupAction(this, func_80966A68);
}
@@ -346,13 +346,13 @@ void func_80966F74(EnWeatherTag* this, PlayState* play) {
// all of them have shorter distances though, like 0xA and 0x6, so their locations are important
void func_80966FEC(EnWeatherTag* this, PlayState* play) {
// weirdly, not the same as the other param lookup used in the rest of the file, which is float
- s32 distance = WEATHER_TAG_RANGE100INT(this);
+ s32 distance = WEATHER_TAG_RANGE100INT(&this->actor);
if (distance > 0) {
D_801F4E7A = distance;
}
// unique pirates fortress behavior?
- if ((play->sceneNum == SCENE_KAIZOKU) && (play->actorCtx.unk5 & 2)) {
+ if ((play->sceneNum == SCENE_KAIZOKU) && (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
EnWeatherTag_SetupAction(this, func_80967060);
}
}
@@ -424,7 +424,7 @@ void func_809672DC(EnWeatherTag* this, PlayState* play) {
&this->actor.world.pos, false);
distance = Actor_XZDistanceBetweenActors(&player->actor, &this->actor);
- range = WEATHER_TAG_RANGE100(this);
+ range = WEATHER_TAG_RANGE100(&this->actor);
if (distance < range) {
play->envCtx.sandstormState = 6;
@@ -448,7 +448,7 @@ void func_809672DC(EnWeatherTag* this, PlayState* play) {
void func_809674C8(EnWeatherTag* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (Actor_XZDistanceBetweenActors(&player->actor, &this->actor) < WEATHER_TAG_RANGE100(this)) {
+ if (Actor_XZDistanceBetweenActors(&player->actor, &this->actor) < WEATHER_TAG_RANGE100(&this->actor)) {
if (CURRENT_DAY == 2) {
if ((gSaveContext.save.time >= CLOCK_TIME(7, 0)) && (gSaveContext.save.time < CLOCK_TIME(17, 30)) &&
(play->envCtx.unk_F2[2] == 0)) {
@@ -471,7 +471,8 @@ void func_809674C8(EnWeatherTag* this, PlayState* play) {
// WEATHERTAG_TYPE_LOCALDAY2RAIN 2
void func_80967608(EnWeatherTag* this, PlayState* play) {
- if ((WEATHER_TAG_RANGE100(this) + 10.0f) < Actor_XZDistanceBetweenActors(&GET_PLAYER(play)->actor, &this->actor)) {
+ if ((WEATHER_TAG_RANGE100(&this->actor) + 10.0f) <
+ Actor_XZDistanceBetweenActors(&GET_PLAYER(play)->actor, &this->actor)) {
gWeatherMode = 0;
EnWeatherTag_SetupAction(this, func_809674C8);
}
@@ -481,9 +482,10 @@ void EnWeatherTag_Update(Actor* thisx, PlayState* play) {
EnWeatherTag* this = THIS;
this->actionFunc(this, play);
- if ((play->actorCtx.unk5 & 2) && (play->msgCtx.msgMode != 0) && (play->msgCtx.currentTextId == 0x5E6) &&
- (!FrameAdvance_IsEnabled(&play->state)) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
- (ActorCutscene_GetCurrentIndex() == -1) && (play->csCtx.state == 0)) {
+ if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != 0) &&
+ (play->msgCtx.currentTextId == 0x5E6) && !FrameAdvance_IsEnabled(&play->state) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (ActorCutscene_GetCurrentIndex() == -1) &&
+ (play->csCtx.state == 0)) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)REG(15);
if (REG(15) != 0) {
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
index fe18c8e1ba..84aa36b031 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
@@ -21,10 +21,10 @@ typedef struct EnWeatherTag {
extern const ActorInit En_Weather_Tag_InitVars;
-#define WEATHER_TAG_TYPE(x) (x->actor.params & 0xF)
-#define WEATHER_TAG_PATHID(x) (x->actor.params >> 4 & 0xF)
-#define WEATHER_TAG_RANGE100(x) ((u8)(((x->actor.params >> 8) & 0xFF)) * 100.0f)
-#define WEATHER_TAG_RANGE100INT(x) ((u8)(((x->actor.params >> 8))) * 100)
+#define WEATHER_TAG_TYPE(thisx) ((thisx)->params & 0xF)
+#define WEATHER_TAG_PATHID(thisx) (((thisx)->params >> 4) & 0xF)
+#define WEATHER_TAG_RANGE100(thisx) ((u8)(((thisx)->params >> 8) & 0xFF) * 100.0f)
+#define WEATHER_TAG_RANGE100INT(thisx) ((u8)(((thisx)->params >> 8) & 0xFF) * 100)
typedef enum {
/* 0 */ WEATHERTAG_TYPE_UNK0,
diff --git a/src/overlays/actors/ovl_En_Wf/z_en_wf.c b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
index 8a5da16c5f..811f828a8b 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -319,7 +319,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
if (this->actor.params == 0) {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
- this->actor.hintId = 0x4C;
+ this->actor.hintId = TATL_HINT_ID_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable2, &sColChkInfoInit);
this->collider1.elements[0].info.toucher.damage = 8;
this->collider1.elements[1].info.toucher.damage = 8;
@@ -327,7 +327,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
} else {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosWhiteSkel, &gWolfosWaitingAnim, this->jointTable,
this->morphTable, WOLFOS_WHITE_LIMB_MAX);
- this->actor.hintId = 0x57;
+ this->actor.hintId = TATL_HINT_ID_WHITE_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable1, &sColChkInfoInit);
}
diff --git a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
index 3098b9a6a7..67faa1f3c3 100644
--- a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
+++ b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
@@ -364,7 +364,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
// Despawn extra trees in a group if out of range
if ((this->spawnType == WOOD_SPAWN_SPAWNED) && (thisx->parent != NULL)) {
- if (!(thisx->flags & 0x40) && (this->unk_151 != 2)) {
+ if (!(thisx->flags & ACTOR_FLAG_40) && (this->unk_151 != 2)) {
s32 index = this->unk_14A[0];
s32 phi_v0 = 0;
diff --git a/src/overlays/actors/ovl_En_Yb/z_en_yb.c b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
index d0fda7dfd9..d28a06fa0b 100644
--- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c
+++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
@@ -263,7 +263,7 @@ void EnYb_SetupLeaving(EnYb* this, PlayState* play) {
Message_StartTextbox(play, 0x147D, &this->actor);
func_80BFA2FC(play);
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
EnYb_EnableProximityMusic(this);
}
@@ -275,7 +275,7 @@ void EnYb_ReceiveMask(EnYb* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = EnYb_SetupLeaving;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
} else {
Actor_PickUp(&this->actor, play, GI_MASK_KAMARO, 10000.0f, 100.0f);
}
@@ -326,7 +326,7 @@ void EnYb_TeachingDanceFinish(EnYb* this, PlayState* play) {
Message_StartTextbox(play, 0x147C, &this->actor);
this->actor.flags &= ~ACTOR_FLAG_10000;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
EnYb_EnableProximityMusic(this);
}
@@ -341,7 +341,7 @@ void EnYb_TeachingDance(EnYb* this, PlayState* play) {
EnYb_FinishTeachingCutscene(this);
this->actionFunc = EnYb_TeachingDanceFinish;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
EnYb_EnableProximityMusic(this);
}
diff --git a/src/overlays/actors/ovl_En_Zos/z_en_zos.c b/src/overlays/actors/ovl_En_Zos/z_en_zos.c
index cf1913e1c6..1419a7ecd9 100644
--- a/src/overlays/actors/ovl_En_Zos/z_en_zos.c
+++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.c
@@ -227,7 +227,7 @@ void func_80BBB2C4(EnZos* this, PlayState* play) {
this->actionFunc = func_80BBB8AC;
this->actor.flags &= ~ACTOR_FLAG_10000;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
}
@@ -239,7 +239,7 @@ void func_80BBB354(EnZos* this, PlayState* play) {
this->actionFunc = func_80BBB2C4;
gSaveContext.save.weekEventReg[39] |= 0x20;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
} else {
if (gSaveContext.save.weekEventReg[39] & 0x20) {
getItemId = GI_RUPEE_PURPLE;
@@ -498,7 +498,7 @@ void func_80BBBCBC(EnZos* this, PlayState* play) {
Message_StartTextbox(play, 0x124D, &this->actor);
this->actionFunc = func_80BBB574;
} else {
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
}
@@ -507,7 +507,7 @@ void func_80BBBD5C(EnZos* this, PlayState* play) {
if (!Cutscene_CheckActorAction(play, 0x1F5)) {
this->actionFunc = func_80BBBCBC;
this->actor.flags |= ACTOR_FLAG_10000;
- func_800B8500(&this->actor, play, 1000.0f, 1000.0f, -1);
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
}
}
diff --git a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
index ccf7b43bdc..b89e10eddf 100644
--- a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
+++ b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
@@ -7,7 +7,7 @@ struct ItemBHeart;
typedef struct ItemBHeart {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x20];
+ /* 0x144 */ UNK_TYPE1 unk_144[0x20];
/* 0x164 */ f32 unk_164;
/* 0x168 */ f32 unk_168;
} ItemBHeart; // size = 0x16C
diff --git a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
index d2fa8e3a0d..0bd1fd30c2 100644
--- a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
+++ b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
@@ -123,7 +123,7 @@ void ItemEtcetera_Update(Actor* thisx, PlayState* play) {
void ItemEtcetera_DrawThroughLens(Actor* thisx, PlayState* play) {
ItemEtcetera* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
func_800B8050(&this->actor, play, 0);
func_800B8118(&this->actor, play, 0);
GetItem_Draw(play, this->getItemDrawId);
diff --git a/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c b/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c
index cdf0447e67..1f3fae3ac9 100644
--- a/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c
+++ b/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c
@@ -1,7 +1,7 @@
/*
* File: z_item_inbox.c
* Overlay: ovl_Item_Inbox
- * Description:
+ * Description: Unused, can draw GetItem models. Perhaps intended to draw items inside chests.
*/
#include "z_item_inbox.h"
diff --git a/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.h b/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.h
index 76265bcec2..c55381ad34 100644
--- a/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.h
+++ b/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.h
@@ -14,10 +14,10 @@ typedef struct ObjBell {
/* 0x210 */ s16 unk_210;
/* 0x212 */ s16 unk_212;
/* 0x214 */ s16 unk_214;
- /* 0x216 */ char unk_216[0x06];
+ /* 0x216 */ UNK_TYPE1 unk_216[0x06];
/* 0x21C */ f32 unk_21C; // bell speed?
/* 0x220 */ f32 unk_220;
- /* 0x224 */ char unk_224[0x04];
+ /* 0x224 */ UNK_TYPE1 unk_224[0x04];
} ObjBell; // size = 0x228
extern const ActorInit Obj_Bell_InitVars;
diff --git a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
index db26a87d29..8e555a19f2 100644
--- a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
+++ b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
@@ -231,7 +231,7 @@ void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
}
this->actor.shape.rot.z = (Math_SinS(this->unk1D4) * this->unk1D0);
if ((this->stateFlags & OBJCHAN_STATE_START_CUTSCENE) &&
- SubS_StartActorCutscene(&this->actor, this->cutscenes[0], -1, 0)) {
+ SubS_StartActorCutscene(&this->actor, this->cutscenes[0], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
this->stateFlags |= OBJCHAN_STATE_CUTSCENE;
this->stateFlags &= ~OBJCHAN_STATE_START_CUTSCENE;
}
diff --git a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
index 2ce8f6ef36..ef1feb1a92 100644
--- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
+++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
@@ -545,7 +545,7 @@ void ObjComb_Update(Actor* thisx, PlayState* play) {
}
if (this->unk_1B7 != 0) {
- play->actorCtx.unk5 |= 8;
+ play->actorCtx.flags |= ACTORCTX_FLAG_3;
this->actor.flags |= ACTOR_FLAG_10;
}
}
diff --git a/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c b/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c
index cbbdf82ed0..0c0177d2f7 100644
--- a/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c
+++ b/src/overlays/actors/ovl_Obj_Dowsing/z_obj_dowsing.c
@@ -1,7 +1,7 @@
/*
* File: z_obj_dowsing.c
* Overlay: ovl_Obj_Dowsing
- * Description:
+ * Description: Rumbles controller if switch or collectible/chest flag is unset
*/
#include "z_obj_dowsing.h"
diff --git a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.h b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.h
index 275928f47a..34c71f6b81 100644
--- a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.h
+++ b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.h
@@ -10,7 +10,7 @@ typedef void (*ObjGhakaActionFunc)(struct ObjGhaka*, PlayState*);
typedef struct ObjGhaka {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ObjGhakaActionFunc actionFunc;
- /* 0x160 */ char unk160[0x8];
+ /* 0x160 */ UNK_TYPE1 unk160[0x8];
/* 0x168 */ s16 unk_168;
} ObjGhaka; // size = 0x16C
diff --git a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
index a013560a44..3289699b0c 100644
--- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
+++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
@@ -213,7 +213,7 @@ void ObjHunsui_Init(Actor* thisx, PlayState* play) {
D_80B9DED0 = Lib_SegmentedToVirtual(object_hunsui_Matanimheader_000BF0);
D_80B9DED4 = Lib_SegmentedToVirtual(object_hunsui_Matanimheader_001888);
- SubS_FillCutscenesList(&this->dyna.actor, &this->unk_170, 1);
+ SubS_FillCutscenesList(&this->dyna.actor, this->unk_170, ARRAY_COUNT(this->unk_170));
this->unk_18C = 0;
switch (this->unk_160) {
@@ -326,7 +326,8 @@ void ObjHunsui_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if ((this->unk_172 & 0x40) && SubS_StartActorCutscene(&this->dyna.actor, this->unk_17C, -1, 0)) {
+ if ((this->unk_172 & 0x40) &&
+ SubS_StartActorCutscene(&this->dyna.actor, this->unk_17C, -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
this->unk_172 &= ~0x40;
}
@@ -354,7 +355,7 @@ void func_80B9CE64(ObjHunsui* this, PlayState* play) {
if (!(this->unk_172 & 1)) {
if (sp2C != this->unk_180) {
- this->unk_17C = this->unk_170;
+ this->unk_17C = this->unk_170[0];
this->unk_172 |= 0x40;
}
}
@@ -446,7 +447,7 @@ void func_80B9D120(ObjHunsui* this, PlayState* play) {
}
if (func_80B9C450(play, this->unk_168, this->unk_164)) {
- this->unk_17C = this->unk_170;
+ this->unk_17C = this->unk_170[0];
this->unk_172 |= 0x40;
func_80B9D4D0(this, play);
}
@@ -559,7 +560,7 @@ void func_80B9D508(ObjHunsui* this, PlayState* play) {
}
if (!(this->unk_172 & 1) && !func_80B9C450(play, this->unk_168, this->unk_164)) {
- this->unk_17C = this->unk_170;
+ this->unk_17C = this->unk_170[0];
this->unk_172 |= 0x40;
func_80B9D0FC(this, play);
}
diff --git a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
index d84069ec06..2f3d968a67 100644
--- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
+++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
@@ -31,7 +31,7 @@ typedef struct ObjHunsui {
/* 0x16C */ s8 unk_16C;
/* 0x16D */ s8 unk_16D;
/* 0x16E */ s8 unk_16E;
- /* 0x170 */ s16 unk_170;
+ /* 0x170 */ s16 unk_170[1];
/* 0x172 */ u16 unk_172;
/* 0x174 */ f32 unk_174;
/* 0x178 */ f32 unk_178;
diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
index 394172d72b..b01f22ae67 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
@@ -914,7 +914,7 @@ void ObjIceblock_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.z = 0;
this->dyna.actor.home.rot.x = 0;
this->dyna.actor.home.rot.z = 0;
- if (!GET_ICEBLOCK_SNAP_ROT(&this->dyna.actor)) {
+ if (!ICEBLOCK_GET_SNAP_ROT(&this->dyna.actor)) {
this->dyna.actor.shape.rot.y = (this->dyna.actor.shape.rot.y + 0x2000) & 0xC000;
this->dyna.actor.home.rot.y = this->dyna.actor.shape.rot.y;
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y;
@@ -926,7 +926,7 @@ void ObjIceblock_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor)) {
this->collider.dim.yShift = -100;
this->collider.dim.height = 126;
this->collider.dim.radius = 29;
@@ -948,7 +948,7 @@ void ObjIceblock_Init(Actor* thisx, PlayState* play) {
}
}
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor)) {
this->unk_2B4 = -1.0f;
}
@@ -997,7 +997,7 @@ void func_80A2586C(ObjIceblock* this, PlayState* play) {
if (Math_StepToF(&this->dyna.actor.scale.x, 0.1f, 0.02f)) {
Actor_SetScale(&this->dyna.actor, 0.1f);
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor)) {
this->unk_2B4 = 0.05f;
}
func_80A25978(this);
@@ -1030,7 +1030,7 @@ void func_80A25994(ObjIceblock* this, PlayState* play) {
if (this->dyna.actor.flags & ACTOR_FLAG_40) {
func_80A2339C(play, &this->dyna.actor.world.pos, this->dyna.actor.scale.x, 1.2f, 15);
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor)) {
sp30.x = this->dyna.actor.world.pos.x;
sp30.y = this->dyna.actor.world.pos.y - 30.0f;
sp30.z = this->dyna.actor.world.pos.z;
@@ -1038,7 +1038,7 @@ void func_80A25994(ObjIceblock* this, PlayState* play) {
}
}
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor)) {
this->unk_2B4 = 0.1f;
}
@@ -1074,7 +1074,7 @@ void func_80A25AA8(ObjIceblock* this, PlayState* play) {
this->dyna.actor.shape.yOffset = 300.0f;
this->unk_248.y += sp24;
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor)) {
this->collider.dim.yShift = -69;
} else {
this->collider.dim.yShift = 0;
@@ -1400,7 +1400,7 @@ void func_80A266E0(ObjIceblock* this, PlayState* play) {
actor->scale.z = actor->scale.x;
}
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor)) {
this->unk_2B4 = actor->scale.y;
this->collider.dim.height = (s32)(actor->scale.y * 1230.0f) + 1;
this->collider.dim.yShift = actor->scale.y * -1000.0f;
@@ -1483,7 +1483,7 @@ void ObjIceblock_Update(Actor* thisx, PlayState* play) {
Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
if (this->unk_1B0 & 0x10) {
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
this->collider.base.ocFlags1 &= ~OC1_NO_PUSH;
this->collider.base.ocFlags1 |= (OC1_TYPE_2 | OC1_TYPE_1 | OC1_TYPE_PLAYER);
this->collider.info.bumper.dmgFlags |=
@@ -1511,7 +1511,7 @@ void func_80A26B64(ObjIceblock* this, PlayState* play) {
// draw func
void func_80A26B74(ObjIceblock* this, PlayState* play) {
Gfx_DrawDListXlu(play, gIceBlockCubeDL);
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gIceBlockIceBergSublimatingAirTexAnim));
Gfx_DrawDListXlu(play, gIceBlockIceBergDL);
}
@@ -1541,7 +1541,7 @@ void func_80A26BF8(ObjIceblock* this, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, gIceBlockCubeDL);
}
- if (GET_ICEBLOCK_ICEBERG(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
+ if (ICEBLOCK_GET_ICEBERG(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gIceBlockIceBergSublimatingAirTexAnim));
Matrix_SetTranslateRotateYXZ(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y - 20.0f,
this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot);
diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h
index fa817781a9..46ebc0c40c 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h
@@ -8,8 +8,8 @@ struct ObjIceblock;
typedef void (*ObjIceblockActionFunc)(struct ObjIceblock*, PlayState*);
typedef void (*ObjIceblockExtendedDrawFunc)(struct ObjIceblock*, PlayState*);
-#define GET_ICEBLOCK_SNAP_ROT(thisx) (((thisx)->params >> 1) & 1)
-#define GET_ICEBLOCK_ICEBERG(thisx) ((thisx)->params & 1)
+#define ICEBLOCK_GET_SNAP_ROT(thisx) (((thisx)->params >> 1) & 1)
+#define ICEBLOCK_GET_ICEBERG(thisx) ((thisx)->params & 1)
typedef struct {
/* 0x00 */ s16 unk_00;
diff --git a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
index bc1d353fd3..cbe3cecfcb 100644
--- a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
+++ b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
@@ -1,7 +1,7 @@
/*
* File: z_obj_kendo_kanban.c
* Overlay: ovl_Obj_Kendo_Kanban
- * Description: Swordsman's School - Cuttable Board
+ * Description: Swordsman's School - Cuttable Board at back of school
*/
#include "z_obj_kendo_kanban.h"
@@ -9,20 +9,40 @@
#define FLAGS 0x00000000
+// Board Fragment Flags: Identify which of the 4 quadrants of the board are present.
+#define OBJKENDOKANBAN_PART_FULL 0
+#define OBJKENDOKANBAN_PART_TOP_RIGHT (1 << 0)
+#define OBJKENDOKANBAN_PART_TOP_LEFT (1 << 1)
+#define OBJKENDOKANBAN_PART_BOTTOM_RIGHT (1 << 2)
+#define OBJKENDOKANBAN_PART_BOTTOM_LEFT (1 << 3)
+#define OBJKENDOKANBAN_RIGHT_HALF (OBJKENDOKANBAN_PART_TOP_RIGHT | OBJKENDOKANBAN_PART_BOTTOM_RIGHT)
+#define OBJKENDOKANBAN_LEFT_HALF (OBJKENDOKANBAN_PART_TOP_LEFT | OBJKENDOKANBAN_PART_BOTTOM_LEFT)
+#define OBJKENDOKANBAN_TOP_HALF (OBJKENDOKANBAN_PART_TOP_RIGHT | OBJKENDOKANBAN_PART_TOP_LEFT)
+#define OBJKENDOKANBAN_BOTTOM_HALF (OBJKENDOKANBAN_PART_BOTTOM_RIGHT | OBJKENDOKANBAN_PART_BOTTOM_LEFT)
+
+// Number of bounces the board takes before settling.
+#define MAX_BOUNCE_COUNT (7)
+
#define THIS ((ObjKendoKanban*)thisx)
+typedef enum {
+ /* -1 */ OBJKENDOKANBAN_DIR_DOWN = -1,
+ /* 0 */ OBJKENDOKANBAN_DIR_UNDETERMINED,
+ /* 1 */ OBJKENDOKANBAN_DIR_UP,
+} ObjKendoKanbanDirection;
+
void ObjKendoKanban_Init(Actor* thisx, PlayState* play);
void ObjKendoKanban_Destroy(Actor* thisx, PlayState* play);
void ObjKendoKanban_Update(Actor* thisx, PlayState* play);
void ObjKendoKanban_Draw(Actor* thisx, PlayState* play);
-void func_80B65880(ObjKendoKanban* this);
-void func_80B65894(ObjKendoKanban* this, PlayState* play);
-void func_80B658A4(ObjKendoKanban* this, PlayState* play);
-void func_80B65CE0(ObjKendoKanban* this, PlayState* play);
-void func_80B65D68(ObjKendoKanban* this, PlayState* play);
-void func_80B65DA8(ObjKendoKanban* this, PlayState* play);
-s32 func_80B6618C(ObjKendoKanban* this, PlayState* play);
+void ObjKendoKanban_SetupDoNothing(ObjKendoKanban* this);
+void ObjKendoKanban_DoNothing(ObjKendoKanban* this, PlayState* play);
+void ObjKendoKanban_SetupTumble(ObjKendoKanban* this, PlayState* play);
+void ObjKendoKanban_Tumble(ObjKendoKanban* this, PlayState* play);
+void ObjKendoKanban_Settled(ObjKendoKanban* this, PlayState* play);
+void ObjKendoKanban_HandlePhysics(ObjKendoKanban* this, PlayState* play);
+s32 ObjKendoKanban_IsPlayerOnTop(ObjKendoKanban* this, PlayState* play);
const ActorInit Obj_Kendo_Kanban_InitVars = {
ACTOR_OBJ_KENDO_KANBAN,
@@ -36,29 +56,36 @@ const ActorInit Obj_Kendo_Kanban_InitVars = {
(ActorFunc)ObjKendoKanban_Draw,
};
-Vec3f D_80B66660 = { -1.5f, 10.0f, 0.5f };
-Vec3f D_80B6666C = { 1.5f, 10.0f, 0.5f };
-Vec3f D_80B66678 = { 0.0f, 4.0f, -1.0f };
-Vec3f D_80B66684 = { 1.0f, 7.0f, 4.0f };
-Vec3f D_80B66690 = { -150.0f, 425.0f, 40.0f };
-Vec3f D_80B6669C = { 150.0f, 425.0f, 40.0f };
-Vec3f D_80B666A8 = { 0.0f, 140.0f, 40.0f };
-Vec3f D_80B666B4 = { 0.0f, 565.0f, 40.0f };
+// Directly applied to the velocity of the actor upon object creation.
+static Vec3f sVelocityLeftHalf = { -1.5f, 10.0f, 0.5f }; // Push Left/Up/Forward (Left side Breakaway)
+static Vec3f sVelocityRightHalf = { 1.5f, 10.0f, 0.5f }; // Push Right/Up/Forward (Right side Breakaway)
+static Vec3f sVelocityBottomHalf = { 0.0f, 4.0f, -1.0f }; // Push _/Up/Back (Bottom Breakaway)
+static Vec3f sVelocityTopHalf = { 1.0f, 7.0f, 4.0f }; // Push Right/Up/Forward (Top Breakaway)
-Gfx* D_80B666C0 = gKendoKanbanTopRightDL;
-Gfx* D_80B666C4 = gKendoKanbanTopLeftDL;
-Gfx* D_80B666C8 = gKendoKanbanBottomRightDL;
-Gfx* D_80B666CC = gKendoKanbanBottomLeftDL;
+// Centerpoint of the piece
+static Vec3f sCenterPointLeftHalf = { -150.0f, 425.0f, 40.0f };
+static Vec3f sCenterPointRightHalf = { 150.0f, 425.0f, 40.0f };
+static Vec3f sCenterPointBottomHalf = { 0.0f, 140.0f, 40.0f };
+static Vec3f sCenterPointTopHalf = { 0.0f, 565.0f, 40.0f };
-Vec3f D_80B666D0 = { -300.0f, 850.0f, 40.0f };
-Vec3f D_80B666DC = { 10.0f, 850.0f, 40.0f };
-Vec3f D_80B666E8 = { 300.0f, 850.0f, 40.0f };
-Vec3f D_80B666F4 = { -300.0f, 310.0f, 40.0f };
-Vec3f D_80B66700 = { 0.0f, 280.0f, 40.0f };
-Vec3f D_80B6670C = { 300.0f, 250.0f, 40.0f };
-Vec3f D_80B66718 = { -300.0f, 10.0f, 40.0f };
-Vec3f D_80B66724 = { 0.0f, 10.0f, 40.0f };
-Vec3f D_80B66730 = { 300.0f, 10.0f, 40.0f };
+// Displaylists for the 4 pieces.
+static Gfx* sDisplayLists[] = {
+ gKendoKanbanTopRightDL,
+ gKendoKanbanTopLeftDL,
+ gKendoKanbanBottomRightDL,
+ gKendoKanbanBottomLeftDL,
+};
+
+// Coordinates on the object face upon which the board can break
+static Vec3f sPointTL = { -300.0f, 850.0f, 40.0f };
+static Vec3f sPointTC = { 10.0f, 850.0f, 40.0f };
+static Vec3f sPointTR = { 300.0f, 850.0f, 40.0f };
+static Vec3f sPointCL = { -300.0f, 310.0f, 40.0f };
+static Vec3f sPointCC = { 0.0f, 280.0f, 40.0f }; // Unused
+static Vec3f sPointCR = { 300.0f, 250.0f, 40.0f };
+static Vec3f sPointBL = { -300.0f, 10.0f, 40.0f };
+static Vec3f sPointBC = { 0.0f, 10.0f, 40.0f };
+static Vec3f sPointBR = { 300.0f, 10.0f, 40.0f };
static ColliderTrisElementInit sTrisElementsInit[] = {
{
@@ -155,13 +182,13 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 8, 0, 0, 0, MASS_HEAVY };
-Vec3f D_80B6681C = { 0.0f, 0.0f, 0.0f };
-Vec3f D_80B66828 = { 1.0f, 0.0f, 0.0f };
+static Vec3f sZeroVec = { 0.0f, 0.0f, 0.0f };
+static Vec3f sUnitVecX = { 1.0f, 0.0f, 0.0f };
void ObjKendoKanban_Init(Actor* thisx, PlayState* play) {
s32 pad[2];
ObjKendoKanban* this = THIS;
- Vec3f sp70[3];
+ Vec3f vertices[3];
s32 i;
s32 j;
@@ -178,35 +205,35 @@ void ObjKendoKanban_Init(Actor* thisx, PlayState* play) {
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
for (i = 0; i < ARRAY_COUNT(this->colliderTrisElements); i++) {
- for (j = 0; j < ARRAY_COUNT(sp70); j++) {
- Matrix_MultVec3f(&sTrisElementsInit[i].dim.vtx[j], &sp70[j]);
+ for (j = 0; j < ARRAY_COUNT(vertices); j++) {
+ Matrix_MultVec3f(&sTrisElementsInit[i].dim.vtx[j], &vertices[j]);
}
- Collider_SetTrisVertices(&this->colliderTris, i, &sp70[0], &sp70[1], &sp70[2]);
+ Collider_SetTrisVertices(&this->colliderTris, i, &vertices[0], &vertices[1], &vertices[2]);
}
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
- this->unk_30C = OBJKENDOKANBAN_GET_F(&this->actor);
+ this->boardFragments = OBJKENDOKANBAN_GET_BOARD_FRAGMENTS(&this->actor);
this->actor.gravity = -2.0f;
- this->unk_2CC = D_80B6681C;
- this->unk_2D8 = D_80B6681C;
- this->unk_2E4 = D_80B6681C;
- this->unk_2F0 = D_80B66828;
- this->unk_302 = 0;
- this->unk_304 = 0;
- this->unk_2FC = -1;
- this->unk_300 = 0;
- this->unk_308 = 0;
+ this->centerPoint = sZeroVec;
+ this->centerPos = sZeroVec;
+ this->rootCornerPos = sZeroVec;
+ this->rotAxis = sUnitVecX;
+ this->rotAngle = 0;
+ this->rotVelocity = 0;
+ this->indexLastRootCornerPos = -1;
+ this->hasNewRootCornerPos = false;
+ this->numBounces = 0;
- for (i = 0; i < ARRAY_COUNT(this->unk_26C); i++) {
- this->unk_26C[i] = this->unk_29C[i] = D_80B6681C;
+ for (i = 0; i < ARRAY_COUNT(this->cornerPos); i++) {
+ this->cornerPos[i] = this->cornerPoints[i] = sZeroVec;
}
this->unk_30A = 0;
- if (this->unk_30C == OBJKENDOKANBAN_F_0) {
- func_80B65880(this);
+ if (this->boardFragments == OBJKENDOKANBAN_PART_FULL) {
+ ObjKendoKanban_SetupDoNothing(this);
} else {
- func_80B658A4(this, play);
+ ObjKendoKanban_SetupTumble(this, play);
}
}
@@ -217,135 +244,138 @@ void ObjKendoKanban_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyTris(play, &this->colliderTris);
}
-void func_80B65880(ObjKendoKanban* this) {
- this->actionFunc = func_80B65894;
+void ObjKendoKanban_SetupDoNothing(ObjKendoKanban* this) {
+ this->actionFunc = ObjKendoKanban_DoNothing;
}
-void func_80B65894(ObjKendoKanban* this, PlayState* play) {
+void ObjKendoKanban_DoNothing(ObjKendoKanban* this, PlayState* play) {
}
-void func_80B658A4(ObjKendoKanban* this, PlayState* play) {
+void ObjKendoKanban_SetupTumble(ObjKendoKanban* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->unk_30C == OBJKENDOKANBAN_F_0) {
+ if (this->boardFragments == OBJKENDOKANBAN_PART_FULL) {
if ((player->meleeWeaponAnimation == PLAYER_MWA_FORWARD_SLASH_1H) ||
(player->meleeWeaponAnimation == PLAYER_MWA_FORWARD_SLASH_2H) ||
(player->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_FINISH)) {
- this->unk_30C = (OBJKENDOKANBAN_F_4 | OBJKENDOKANBAN_F_1);
- this->unk_304 = 0x71C;
- this->actor.velocity = D_80B6666C;
- this->unk_2CC = D_80B6669C;
+
+ // Vertical cuts initialize the right half, spawn the left half.
+ this->boardFragments = OBJKENDOKANBAN_RIGHT_HALF;
+ this->rotVelocity = 0x71C; // 10 degrees
+ this->actor.velocity = sVelocityRightHalf;
+ this->centerPoint = sCenterPointRightHalf;
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_OBJ_KENDO_KANBAN,
this->actor.home.pos.x - 5.0f, this->actor.home.pos.y, this->actor.home.pos.z, 0, 0, 0,
- 0xA);
+ OBJKENDOKANBAN_LEFT_HALF);
- this->unk_29C[0] = D_80B666DC;
- this->unk_29C[1] = D_80B666E8;
- this->unk_29C[2] = D_80B66730;
- this->unk_29C[3] = D_80B66724;
+ this->cornerPoints[0] = sPointTC;
+ this->cornerPoints[1] = sPointTR;
+ this->cornerPoints[2] = sPointBR;
+ this->cornerPoints[3] = sPointBC;
} else {
- this->unk_30C = (OBJKENDOKANBAN_F_8 | OBJKENDOKANBAN_F_4);
- this->unk_304 = -0x71C;
- this->actor.velocity = D_80B66678;
- this->unk_2CC = D_80B666A8;
+ // Horizontal cuts initialize the bottom half, spawn the top half.
+ this->boardFragments = OBJKENDOKANBAN_BOTTOM_HALF;
+ this->rotVelocity = -0x71C; // -10 degrees
+ this->actor.velocity = sVelocityBottomHalf;
+ this->centerPoint = sCenterPointBottomHalf;
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_OBJ_KENDO_KANBAN, this->actor.home.pos.x,
- this->actor.home.pos.y + 5.0f, this->actor.home.pos.z, 0, 0, 0, 3);
+ this->actor.home.pos.y + 5.0f, this->actor.home.pos.z, 0, 0, 0, OBJKENDOKANBAN_TOP_HALF);
- this->unk_29C[0] = D_80B666F4;
- this->unk_29C[1] = D_80B6670C;
- this->unk_29C[2] = D_80B66730;
- this->unk_29C[3] = D_80B66718;
+ this->cornerPoints[0] = sPointCL;
+ this->cornerPoints[1] = sPointCR;
+ this->cornerPoints[2] = sPointBR;
+ this->cornerPoints[3] = sPointBL;
}
- } else if (this->unk_30C == (OBJKENDOKANBAN_F_8 | OBJKENDOKANBAN_F_2)) {
- this->unk_304 = 0x71C;
- this->actor.velocity = D_80B66660;
- this->unk_2CC = D_80B66690;
+ } else if (this->boardFragments == OBJKENDOKANBAN_LEFT_HALF) {
+ // Initialize the newly spawned left half
+ this->rotVelocity = 0x71C; // 10 degrees
+ this->actor.velocity = sVelocityLeftHalf;
+ this->centerPoint = sCenterPointLeftHalf;
- this->unk_29C[0] = D_80B666D0;
- this->unk_29C[1] = D_80B666DC;
- this->unk_29C[2] = D_80B66724;
- this->unk_29C[3] = D_80B66718;
- } else if (this->unk_30C == (OBJKENDOKANBAN_F_2 | OBJKENDOKANBAN_F_1)) {
- this->unk_304 = 0x71C;
- this->actor.velocity = D_80B66684;
- this->unk_2CC = D_80B666B4;
+ this->cornerPoints[0] = sPointTL;
+ this->cornerPoints[1] = sPointTC;
+ this->cornerPoints[2] = sPointBC;
+ this->cornerPoints[3] = sPointBL;
+ } else if (this->boardFragments == OBJKENDOKANBAN_TOP_HALF) {
+ // Initialize the newly spawned top half
+ this->rotVelocity = 0x71C; // 10 degrees
+ this->actor.velocity = sVelocityTopHalf;
+ this->centerPoint = sCenterPointTopHalf;
- this->unk_29C[0] = D_80B666D0;
- this->unk_29C[1] = D_80B666E8;
- this->unk_29C[2] = D_80B6670C;
- this->unk_29C[3] = D_80B666F4;
+ this->cornerPoints[0] = sPointTL;
+ this->cornerPoints[1] = sPointTR;
+ this->cornerPoints[2] = sPointCR;
+ this->cornerPoints[3] = sPointCL;
}
this->unk_30A = 0;
- this->actionFunc = func_80B65CE0;
+ this->actionFunc = ObjKendoKanban_Tumble;
}
-void func_80B65CE0(ObjKendoKanban* this, PlayState* play) {
+void ObjKendoKanban_Tumble(ObjKendoKanban* this, PlayState* play) {
this->actor.velocity.y += this->actor.gravity;
Actor_UpdatePos(&this->actor);
- this->unk_302 += this->unk_304;
- func_80B65DA8(this, play);
+ this->rotAngle += this->rotVelocity;
+ ObjKendoKanban_HandlePhysics(this, play);
if (this->actor.world.pos.y < -200.0f) {
this->actor.world.pos.y = -200.0f;
}
}
-void func_80B65D54(ObjKendoKanban* this) {
- this->actionFunc = func_80B65D68;
+void ObjKendoKanban_SetupSettled(ObjKendoKanban* this) {
+ this->actionFunc = ObjKendoKanban_Settled;
}
-void func_80B65D68(ObjKendoKanban* this, PlayState* play) {
+void ObjKendoKanban_Settled(ObjKendoKanban* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (func_80B6618C(this, play) == 1) {
+ if (ObjKendoKanban_IsPlayerOnTop(this, play) == true) {
player->unk_AC0 = 700.0f;
}
}
-void func_80B65DA8(ObjKendoKanban* this, PlayState* play) {
- Vec3f sp5C;
+void ObjKendoKanban_HandlePhysics(ObjKendoKanban* this, PlayState* play) {
+ Vec3f rootCornerPos = this->cornerPos[0];
s32 pad[2];
- Vec3f sp48;
+ Vec3f vecCenterOut = this->actor.world.pos;
s32 pad2;
- s32 index = 0;
+ s32 indexRootCornerPos = 0;
s32 i;
- f32 sp38;
+ f32 verticalScalar;
- sp5C = this->unk_26C[0];
- sp48 = this->actor.world.pos;
-
- sp48.x -= this->unk_2D8.x;
- sp48.y -= this->unk_2D8.y;
- sp48.z -= this->unk_2D8.z;
-
- sp38 = (this->unk_2F0.x * sp48.z) + (this->unk_2F0.z * -sp48.x);
-
- if (sp38 < 0.0f) {
- this->unk_304 += 0x64;
+ // Calculate an affect on the rotation from gravity.
+ vecCenterOut.x -= this->centerPos.x;
+ vecCenterOut.y -= this->centerPos.y;
+ vecCenterOut.z -= this->centerPos.z;
+ verticalScalar = (this->rotAxis.x * vecCenterOut.z) + (this->rotAxis.z * -vecCenterOut.x);
+ if (verticalScalar < 0.0f) {
+ this->rotVelocity += 0x64;
} else {
- this->unk_304 -= 0x64;
+ this->rotVelocity -= 0x64;
}
- for (i = 0; i < ARRAY_COUNT(this->unk_26C); i++) {
- if (this->unk_26C[i].y < sp5C.y) {
- sp5C = this->unk_26C[i];
- index = i;
+ // Find the lowest point
+ for (i = 0; i < ARRAY_COUNT(this->cornerPos); i++) {
+ if (this->cornerPos[i].y < rootCornerPos.y) {
+ rootCornerPos = this->cornerPos[i];
+ indexRootCornerPos = i;
}
}
- if (index != this->unk_2FC) {
- this->unk_300 = 1;
- this->unk_2FC = index;
- this->unk_2E4 = this->unk_29C[index];
+ // When the lowest point changes, re-initialize the actor position to that point
+ if (indexRootCornerPos != this->indexLastRootCornerPos) {
+ this->hasNewRootCornerPos = true;
+ this->indexLastRootCornerPos = indexRootCornerPos;
+ this->rootCornerPos = this->cornerPoints[indexRootCornerPos];
Matrix_Push();
Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z,
&this->actor.shape.rot);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_MultVec3f(&this->unk_2E4, &this->actor.world.pos);
- this->actor.world.pos = sp5C;
+ Matrix_MultVec3f(&this->rootCornerPos, &this->actor.world.pos);
+ this->actor.world.pos = rootCornerPos;
this->actor.prevPos = this->actor.world.pos;
Matrix_Pop();
}
@@ -353,102 +383,105 @@ void func_80B65DA8(ObjKendoKanban* this, PlayState* play) {
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
if (this->actor.bgCheckFlags & 1) {
+ // When on the ground, apply some friction.
this->actor.velocity.x *= 0.8f;
this->actor.velocity.z *= 0.8f;
}
- if (this->unk_300 == 1) {
- if (this->unk_308 >= 7) {
- s16 temp_v0_3 = this->unk_302 & 0x3FFF;
+ if (this->hasNewRootCornerPos == true) {
+ if (this->numBounces >= MAX_BOUNCE_COUNT) {
+ s16 deltaRotAngle = this->rotAngle & 0x3FFF;
- if (temp_v0_3 >= 0x2000) {
- temp_v0_3 -= 0x4000;
+ if (deltaRotAngle >= 0x2000) { // 45 degrees
+ deltaRotAngle -= 0x4000; // 90 degrees
}
- this->unk_302 -= temp_v0_3;
- this->unk_304 = 0;
- func_80B65D54(this);
+ this->rotAngle -= deltaRotAngle;
+ this->rotVelocity = 0;
+ ObjKendoKanban_SetupSettled(this);
return;
}
if (this->actor.bgCheckFlags & 2) {
+ // Upon touching the ground...
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
- this->unk_300 = 0;
+ this->hasNewRootCornerPos = false;
this->actor.velocity.y *= 0.5f;
} else if (this->actor.bgCheckFlags & 1) {
- this->unk_308++;
- this->unk_300 = 0;
+ // When on the ground...
+ this->numBounces++;
+ this->hasNewRootCornerPos = false;
this->actor.velocity.x *= 0.3f;
this->actor.velocity.z *= 0.3f;
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
- if (sp38 > 0.0f) {
- if (this->unk_304 > 0) {
- this->unk_304 *= 1.2f;
+ // Adjust and (potentially) reverse rotation depending on the current
+ // facing of the board and the direction in which it is rotating.
+ if (verticalScalar > 0.0f) {
+ if (this->rotVelocity > 0) {
+ this->rotVelocity *= 1.2f;
} else {
- this->unk_304 *= -0.6f;
+ this->rotVelocity *= -0.6f;
}
- } else if (this->unk_304 < 0) {
- this->unk_304 *= 1.2f;
} else {
- this->unk_304 *= -0.6f;
+ if (this->rotVelocity < 0) {
+ this->rotVelocity *= 1.2f;
+ } else {
+ this->rotVelocity *= -0.6f;
+ }
}
}
}
}
-s32 func_80B6618C(ObjKendoKanban* this, PlayState* play) {
+s32 ObjKendoKanban_IsPlayerOnTop(ObjKendoKanban* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 phi_v0;
- s32 phi_v1 = 0;
s32 i;
- f32 x;
- f32 z;
- f32 x2;
- f32 z2;
+ s32 j;
+ Vec2f playerToCornerA;
+ Vec2f playerToCornerB;
+ s32 priorDir = OBJKENDOKANBAN_DIR_UNDETERMINED;
- for (i = 0; i < ARRAY_COUNT(this->unk_26C); i++) {
- if (i != 3) {
- phi_v0 = i + 1;
- } else {
- phi_v0 = 0;
- }
+ for (i = 0; i < ARRAY_COUNT(this->cornerPos); i++) {
+ j = (i != 3) ? (i + 1) : 0;
- z = this->unk_26C[i].z - player->actor.world.pos.z;
- x = this->unk_26C[i].x - player->actor.world.pos.x;
-
- z2 = (this->unk_26C[phi_v0].z - player->actor.world.pos.z);
- x2 = (this->unk_26C[phi_v0].x - player->actor.world.pos.x);
-
- if ((x * z2) < (z * x2)) {
- if (phi_v1 == 0) {
- phi_v1 = 1;
- } else if (phi_v1 != 1) {
+ // For each pair of points (moving clockwise around the shape), verify that the normal
+ // vector's magnitute is in the same direction. This condition being true means
+ // the player is within the bounds of the four cornerPoints.
+ playerToCornerA.z = this->cornerPos[i].z - player->actor.world.pos.z;
+ playerToCornerA.x = this->cornerPos[i].x - player->actor.world.pos.x;
+ playerToCornerB.z = this->cornerPos[j].z - player->actor.world.pos.z;
+ playerToCornerB.x = this->cornerPos[j].x - player->actor.world.pos.x;
+ if ((playerToCornerA.x * playerToCornerB.z) < (playerToCornerA.z * playerToCornerB.x)) {
+ if (priorDir == OBJKENDOKANBAN_DIR_UNDETERMINED) {
+ priorDir = OBJKENDOKANBAN_DIR_UP;
+ } else if (priorDir != OBJKENDOKANBAN_DIR_UP) {
+ return false;
+ }
+ } else {
+ if (priorDir == OBJKENDOKANBAN_DIR_UNDETERMINED) {
+ priorDir = OBJKENDOKANBAN_DIR_DOWN;
+ } else if (priorDir != OBJKENDOKANBAN_DIR_DOWN) {
return false;
}
- } else if (phi_v1 == 0) {
- phi_v1 = -1;
- } else if (phi_v1 != -1) {
- return false;
}
}
return true;
}
-void func_80B66304(ObjKendoKanban* this, PlayState* play) {
- if ((this->actionFunc != func_80B65CE0) && (this->actionFunc != func_80B65D68)) {
+void ObjKendoKanban_UpdateCollision(ObjKendoKanban* this, PlayState* play) {
+ if ((this->actionFunc != ObjKendoKanban_Tumble) && (this->actionFunc != ObjKendoKanban_Settled)) {
if (this->colliderTris.base.acFlags & AC_HIT) {
this->colliderTris.base.acFlags &= ~AC_HIT;
- func_80B658A4(this, play);
+ ObjKendoKanban_SetupTumble(this, play);
}
Collider_UpdateCylinder(&this->actor, &this->colliderCylinder);
this->colliderCylinder.dim.pos.z -= (s16)(20.0f * Math_CosS(this->actor.shape.rot.y));
this->colliderCylinder.dim.pos.x -= (s16)(20.0f * Math_SinS(this->actor.shape.rot.y));
- if (this->actionFunc == func_80B65894) {
+ if (this->actionFunc == ObjKendoKanban_DoNothing) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderTris.base);
}
-
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
}
}
@@ -457,54 +490,38 @@ void ObjKendoKanban_Update(Actor* thisx, PlayState* play) {
ObjKendoKanban* this = THIS;
this->actionFunc(this, play);
-
- func_80B66304(this, play);
+ ObjKendoKanban_UpdateCollision(this, play);
}
-#ifdef NON_MATCHING
void ObjKendoKanban_Draw(Actor* thisx, PlayState* play) {
ObjKendoKanban* this = THIS;
s32 i;
- Gfx* poly;
OPEN_DISPS(play->state.gfxCtx);
func_8012C28C(play->state.gfxCtx);
- if (this->unk_30C == OBJKENDOKANBAN_F_0) {
+ if (this->boardFragments == OBJKENDOKANBAN_PART_FULL) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gKendoKanbanDL);
} else {
- Matrix_RotateAxisS(this->unk_302, &this->unk_2F0, MTXMODE_APPLY);
- Matrix_Translate(-this->unk_2E4.x, -this->unk_2E4.y, -this->unk_2E4.z, MTXMODE_APPLY);
-
+ Matrix_RotateAxisS(this->rotAngle, &this->rotAxis, MTXMODE_APPLY);
+ Matrix_Translate(-this->rootCornerPos.x, -this->rootCornerPos.y, -this->rootCornerPos.z, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- if (this->unk_30C & OBJKENDOKANBAN_F_1) {
- gSPDisplayList(POLY_OPA_DISP++, D_80B666C0);
- }
-
- if (this->unk_30C & OBJKENDOKANBAN_F_2) {
- gSPDisplayList(POLY_OPA_DISP++, D_80B666C4);
- }
-
- if (this->unk_30C & OBJKENDOKANBAN_F_4) {
- gSPDisplayList(POLY_OPA_DISP++, D_80B666C8);
- }
-
- if (this->unk_30C & OBJKENDOKANBAN_F_8) {
- gSPDisplayList(POLY_OPA_DISP++, D_80B666CC);
+ // Display only the fragments of the board which are present
+ for (i = 0; i < ARRAY_COUNT(sDisplayLists); i++) {
+ if ((1 << i) & this->boardFragments) {
+ gSPDisplayList(POLY_OPA_DISP++, sDisplayLists[i]);
+ }
}
}
CLOSE_DISPS(play->state.gfxCtx);
- for (i = 0; i < ARRAY_COUNT(this->unk_26C); i++) {
- Matrix_MultVec3f(&this->unk_29C[i], &this->unk_26C[i]);
+ // Update the alternate position trackers (Corners and Center of the board)
+ for (i = 0; i < ARRAY_COUNT(this->cornerPos); i++) {
+ Matrix_MultVec3f(&this->cornerPoints[i], &this->cornerPos[i]);
}
-
- Matrix_MultVec3f(&this->unk_2CC, &this->unk_2D8);
+ Matrix_MultVec3f(&this->centerPoint, &this->centerPos);
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Kendo_Kanban/ObjKendoKanban_Draw.s")
-#endif
diff --git a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.h b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.h
index 8526f49765..9d01b63fcc 100644
--- a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.h
+++ b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.h
@@ -7,13 +7,7 @@ struct ObjKendoKanban;
typedef void (*ObjKendoKanbanActionFunc)(struct ObjKendoKanban*, PlayState*);
-#define OBJKENDOKANBAN_GET_F(thisx) ((thisx)->params & 0xF)
-
-#define OBJKENDOKANBAN_F_0 0
-#define OBJKENDOKANBAN_F_1 (1 << 0)
-#define OBJKENDOKANBAN_F_2 (1 << 1)
-#define OBJKENDOKANBAN_F_4 (1 << 2)
-#define OBJKENDOKANBAN_F_8 (1 << 3)
+#define OBJKENDOKANBAN_GET_BOARD_FRAGMENTS(thisx) ((thisx)->params & 0xF)
typedef struct ObjKendoKanban {
/* 0x000 */ Actor actor;
@@ -21,20 +15,20 @@ typedef struct ObjKendoKanban {
/* 0x190 */ ColliderTris colliderTris;
/* 0x1B0 */ ColliderTrisElement colliderTrisElements[2];
/* 0x268 */ ObjKendoKanbanActionFunc actionFunc;
- /* 0x26C */ Vec3f unk_26C[4];
- /* 0x29C */ Vec3f unk_29C[4];
- /* 0x2CC */ Vec3f unk_2CC;
- /* 0x2D8 */ Vec3f unk_2D8;
- /* 0x2E4 */ Vec3f unk_2E4;
- /* 0x2F0 */ Vec3f unk_2F0;
- /* 0x2FC */ s32 unk_2FC;
- /* 0x300 */ s16 unk_300;
- /* 0x302 */ s16 unk_302;
- /* 0x304 */ s16 unk_304;
+ /* 0x26C */ Vec3f cornerPos[4];
+ /* 0x29C */ Vec3f cornerPoints[4];
+ /* 0x2CC */ Vec3f centerPoint;
+ /* 0x2D8 */ Vec3f centerPos;
+ /* 0x2E4 */ Vec3f rootCornerPos;
+ /* 0x2F0 */ Vec3f rotAxis;
+ /* 0x2FC */ s32 indexLastRootCornerPos;
+ /* 0x300 */ s16 hasNewRootCornerPos;
+ /* 0x302 */ s16 rotAngle;
+ /* 0x304 */ s16 rotVelocity;
/* 0x306 */ UNK_TYPE1 pad306[2];
- /* 0x308 */ s16 unk_308;
+ /* 0x308 */ s16 numBounces;
/* 0x30A */ s16 unk_30A;
- /* 0x30C */ u8 unk_30C;
+ /* 0x30C */ u8 boardFragments;
} ObjKendoKanban; // size = 0x310
extern const ActorInit Obj_Kendo_Kanban_InitVars;
diff --git a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
index fcbdfbad49..d32e7a2cda 100644
--- a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
+++ b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
@@ -228,7 +228,7 @@ void ObjKibako2_Update(Actor* thisx, PlayState* play) {
ObjKibako2* this = THIS;
if (this->unk_1AC != 0) {
- play->actorCtx.unk5 |= 8;
+ play->actorCtx.flags |= ACTORCTX_FLAG_3;
}
if (this->skulltulaNoiseTimer >= 0) {
diff --git a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
index deb315bc42..24597e4aa1 100644
--- a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
+++ b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
@@ -41,11 +41,11 @@ void ObjKinoko_Update(Actor* thisx, PlayState* play) {
if (player->currentMask != PLAYER_MASK_SCENTS) {
thisx->draw = NULL;
- thisx->hintId = 0xFF;
+ thisx->hintId = TATL_HINT_ID_NONE;
thisx->flags &= ~ACTOR_FLAG_1;
} else {
thisx->draw = ObjKinoko_Draw;
- thisx->hintId = 0x64;
+ thisx->hintId = TATL_HINT_ID_MUSHROOM;
thisx->flags |= ACTOR_FLAG_1;
if (Actor_HasParent(thisx, play)) {
Flags_SetCollectible(play, OBJ_KINOKO_GET_FLAG(thisx));
diff --git a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
index b6fd674ef1..dafd9bc2c6 100644
--- a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
+++ b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
@@ -100,9 +100,9 @@ void ObjLightswitch_UpdateSwitchFlags(ObjLightswitch* this, PlayState* play, s32
if (this) {}
if (set) {
- Flags_SetSwitch(play, GET_LIGHTSWITCH_SWITCHFLAG(&this->actor));
+ Flags_SetSwitch(play, LIGHTSWITCH_GET_SWITCHFLAG(&this->actor));
} else {
- Flags_UnsetSwitch(play, GET_LIGHTSWITCH_SWITCHFLAG(&this->actor));
+ Flags_UnsetSwitch(play, LIGHTSWITCH_GET_SWITCHFLAG(&this->actor));
}
}
@@ -150,13 +150,13 @@ void ObjLightswitch_Init(Actor* thisx, PlayState* play) {
u32 isSwitchActivated;
s32 isTriggered;
- isSwitchActivated = Flags_GetSwitch(play, GET_LIGHTSWITCH_SWITCHFLAG(&this->actor));
+ isSwitchActivated = Flags_GetSwitch(play, LIGHTSWITCH_GET_SWITCHFLAG(&this->actor));
isTriggered = false;
Actor_ProcessInitChain(&this->actor, sInitChain);
Actor_SetFocus(&this->actor, 0.0f);
if (isSwitchActivated) {
- if (GET_LIGHTSWITCH_TYPE(&this->actor) == LIGHTSWITCH_TYPE_FAKE) {
+ if (LIGHTSWITCH_GET_TYPE(&this->actor) == LIGHTSWITCH_TYPE_FAKE) {
isTriggered = true;
} else {
ObjLightSwitch_SetupEnabled(this);
@@ -167,7 +167,7 @@ void ObjLightswitch_Init(Actor* thisx, PlayState* play) {
ObjLightswitch_InitCollider(this, play);
- if (GET_LIGHTSWITCH_INVISIBLE(&this->actor)) {
+ if (LIGHTSWITCH_GET_INVISIBLE(&this->actor)) {
// the stone tower exterior switch is part of the scene mesh, the actor is invisble on top
this->actor.draw = NULL;
}
@@ -209,7 +209,7 @@ void ObjLightswitch_SetupIdle(ObjLightswitch* this) {
}
void ObjLightswitch_Idle(ObjLightswitch* this, PlayState* play) {
- s32 actorType = GET_LIGHTSWITCH_TYPE(&this->actor);
+ s32 actorType = LIGHTSWITCH_GET_TYPE(&this->actor);
if (this->hitState >= 10) {
if (actorType == LIGHTSWITCH_TYPE_FAKE) {
@@ -260,11 +260,11 @@ void ObjLightSwitch_SetupEnabled(ObjLightswitch* this) {
}
void ObjLightSwitch_Enabled(ObjLightswitch* this, PlayState* play) {
- s32 actorType = GET_LIGHTSWITCH_TYPE(&this->actor);
+ s32 actorType = LIGHTSWITCH_GET_TYPE(&this->actor);
if (actorType == LIGHTSWITCH_TYPE_REGULAR) {
// switch can be disabled outside of this actor by flag
- if (!Flags_GetSwitch(play, GET_LIGHTSWITCH_SWITCHFLAG(&this->actor))) {
+ if (!Flags_GetSwitch(play, LIGHTSWITCH_GET_SWITCHFLAG(&this->actor))) {
ObjLightSwitch_SetupDisabled(this);
}
} else if (actorType == LIGHTSWITCH_TYPE_FLIP) {
@@ -329,7 +329,7 @@ void ObjLightswitch_Update(Actor* thisx, PlayState* play) {
// dmgFlags enum doesn't exist yet, 0x2000 is light arrows
if ((this->collider.elements->info.acHitInfo->toucher.dmgFlags & 0x2000) != 0) {
this->hitState = 10;
- } else if (GET_LIGHTSWITCH_TYPE(&this->actor) == LIGHTSWITCH_TYPE_FLIP) {
+ } else if (LIGHTSWITCH_GET_TYPE(&this->actor) == LIGHTSWITCH_TYPE_FLIP) {
if (this->hitState == 0) {
if ((this->previousACFlags & AC_HIT) == 0) {
this->hitState = 1;
@@ -438,7 +438,7 @@ void ObjLightswitch_Draw(Actor* thisx, PlayState* play) {
ObjLightswitch* this = THIS;
s32 alpha = (u8)(this->colorAlpha >> 6);
- if ((GET_LIGHTSWITCH_TYPE(&this->actor) == LIGHTSWITCH_TYPE_FAKE) && (alpha > 0) && (alpha < 255)) {
+ if ((LIGHTSWITCH_GET_TYPE(&this->actor) == LIGHTSWITCH_TYPE_FAKE) && (alpha > 0) && (alpha < 255)) {
ObjLightSwitch_DrawXlu(this, play);
} else {
ObjLightSwitch_DrawOpa(this, play);
diff --git a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.h b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.h
index 7a8e0043fb..a079001381 100644
--- a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.h
+++ b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.h
@@ -40,8 +40,8 @@ extern const ActorInit Obj_Lightswitch_InitVars;
#define LIGHTSWITCH_TYPE_UNK2 2
#define LIGHTSWITCH_TYPE_FAKE 3
-#define GET_LIGHTSWITCH_TYPE(thisx) (((thisx)->params >> 4) & 0x3)
-#define GET_LIGHTSWITCH_INVISIBLE(thisx) (((thisx)->params >> 3) & 1)
-#define GET_LIGHTSWITCH_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0x7F)
+#define LIGHTSWITCH_GET_TYPE(thisx) (((thisx)->params >> 4) & 0x3)
+#define LIGHTSWITCH_GET_INVISIBLE(thisx) (((thisx)->params >> 3) & 1)
+#define LIGHTSWITCH_GET_SWITCHFLAG(thisx) (((thisx)->params >> 8) & 0x7F)
#endif // Z_OBJ_LIGHTSWITCH_H
diff --git a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
index 8e2756f0b7..b5f9d67b29 100644
--- a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
+++ b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
@@ -27,8 +27,8 @@ const ActorInit Obj_Makeoshihiki_InitVars = {
s32 ObjMakeoshihiki_GetChildSpawnPointIndex(ObjMakeoshihiki* this, PlayState* play) {
s32 pad;
- s32 pathIndexOffset1 = Flags_GetSwitch(play, OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(this)) ? 1 : 0;
- s32 pathIndexOffset2 = Flags_GetSwitch(play, OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(this)) ? 2 : 0;
+ s32 pathIndexOffset1 = Flags_GetSwitch(play, OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(&this->actor)) ? 1 : 0;
+ s32 pathIndexOffset2 = Flags_GetSwitch(play, OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(&this->actor)) ? 2 : 0;
return pathIndexOffset1 + pathIndexOffset2;
}
@@ -39,8 +39,8 @@ void ObjMakeoshihiki_SetSwitchFlags(ObjMakeoshihiki* this, PlayState* play, s32
s32 switchFlag1;
s32 switchFlag2;
- switchFlag2 = OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(this);
- switchFlag1 = OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(this);
+ switchFlag2 = OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(&this->actor);
+ switchFlag1 = OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(&this->actor);
if (pathIndex & 2) {
Flags_SetSwitch(play, switchFlag2);
@@ -61,7 +61,7 @@ void ObjMakeoshihiki_Init(Actor* thisx, PlayState* play) {
Path* path;
s32 childPointIndex;
- path = &play->setupPathList[OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(this)];
+ path = &play->setupPathList[OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(&this->actor)];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
this->pathCount = path->count;
childPointIndex = ObjMakeoshihiki_GetChildSpawnPointIndex(this, play);
diff --git a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
index 708da99d64..8a419c5507 100644
--- a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
+++ b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
@@ -5,9 +5,9 @@
struct ObjMakeoshihiki;
-#define OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(this) (((this)->actor.params >> 7) & 0x7F)
-#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(this) ((this)->actor.home.rot.z & 0x7F)
-#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(this) ((this)->actor.params & 0x7F)
+#define OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(thisx) (((thisx)->params >> 7) & 0x7F)
+#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(thisx) ((thisx)->home.rot.z & 0x7F)
+#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(thisx) ((thisx)->params & 0x7F)
typedef struct ObjMakeoshihiki {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.h b/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.h
index 6bba9c014e..c5f313661a 100644
--- a/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.h
+++ b/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.h
@@ -7,7 +7,7 @@ struct ObjMilkBin;
typedef struct ObjMilkBin {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x4];
+ /* 0x144 */ UNK_TYPE1 unk_144[0x4];
/* 0x148 */ ColliderCylinder collider;
/* 0x194 */ s32 disableDraw;
/* 0x198 */ s32 type;
diff --git a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.h b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.h
index fbdf402808..375d40fad9 100644
--- a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.h
+++ b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.h
@@ -9,7 +9,7 @@ typedef void (*ObjMoonStoneActionFunc)(struct ObjMoonStone*, PlayState*);
typedef struct ObjMoonStone {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x4C];
+ /* 0x144 */ UNK_TYPE1 unk_144[0x4C];
/* 0x190 */ ObjMoonStoneActionFunc actionFunc;
/* 0x194 */ s16 unk194;
} ObjMoonStone; // size = 0x198
diff --git a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
index 65a1734986..9a8072edd8 100644
--- a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
+++ b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
@@ -91,10 +91,10 @@ s32 func_808D7928(ObjMure* this, PlayState* play) {
void ObjMure_Init(Actor* thisx, PlayState* play) {
ObjMure* this = THIS;
- this->chNum = OBJ_MURE_GET_CHNUM(this->actor.params);
- this->ptn = OBJ_MURE_GET_PTN(this->actor.params);
- this->svNum = OBJ_MURE_GET_SVNUM(this->actor.params);
- this->type = OBJ_MURE_GET_TYPE(this->actor.params);
+ this->chNum = OBJ_MURE_GET_CHNUM(&this->actor);
+ this->ptn = OBJ_MURE_GET_PTN(&this->actor);
+ this->svNum = OBJ_MURE_GET_SVNUM(&this->actor);
+ this->type = OBJ_MURE_GET_TYPE(&this->actor);
if (this->ptn >= 4) {
Actor_MarkForDeath(&this->actor);
return;
diff --git a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.h b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.h
index 03ed6dc4e1..bc3669697d 100644
--- a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.h
+++ b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.h
@@ -11,7 +11,7 @@ typedef void (*ObjMureActionFunc)(struct ObjMure*, PlayState*);
typedef struct {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x53];
+ /* 0x144 */ UNK_TYPE1 unk_144[0x53];
/* 0x197 */ u8 unk_197;
} ObjMureChild; // size = 0x198
@@ -31,9 +31,9 @@ typedef struct ObjMure {
extern const ActorInit Obj_Mure_InitVars;
-#define OBJ_MURE_GET_CHNUM(params) ((params >> 12) & 0xF)
-#define OBJ_MURE_GET_PTN(params) ((params >> 8) & 0x7)
-#define OBJ_MURE_GET_SVNUM(params) ((params >> 5) & 0x3)
-#define OBJ_MURE_GET_TYPE(params) (params & 0x1F)
+#define OBJ_MURE_GET_CHNUM(thisx) (((thisx)->params >> 12) & 0xF)
+#define OBJ_MURE_GET_PTN(thisx) (((thisx)->params >> 8) & 0x7)
+#define OBJ_MURE_GET_SVNUM(thisx) (((thisx)->params >> 5) & 0x3)
+#define OBJ_MURE_GET_TYPE(thisx) ((thisx)->params & 0x1F)
#endif // Z_OBJ_MURE_H
diff --git a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
index 681faf3c15..4c56bb794e 100644
--- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
+++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
@@ -164,14 +164,14 @@ void func_80BA2790(ObjNozoki* this) {
}
void func_80BA27C4(ObjNozoki* this, PlayState* play) {
- if (!(play->actorCtx.unk5 & 0x20)) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_5)) {
if (OBJNOZOKI_GET_200(&this->dyna.actor)) {
if (!func_80BA2708(this, play)) {
return;
}
} else {
if (D_80BA36B0 != 0) {
- play->actorCtx.unk5 |= 0x80;
+ play->actorCtx.flags |= ACTORCTX_FLAG_7;
}
if (!Flags_GetSwitch(play, OBJNOZOKI_GET_SWITCHFLAG1(&this->dyna.actor))) {
@@ -189,7 +189,7 @@ void func_80BA27C4(ObjNozoki* this, PlayState* play) {
if (this->unk_15E < 0) {
this->unk_15E = 50;
}
- play->actorCtx.unk5 |= 0x10;
+ play->actorCtx.flags |= ACTORCTX_FLAG_4;
}
}
GET_PLAYER(play)->linearVelocity = 0.0f;
@@ -204,7 +204,7 @@ void func_80BA28DC(ObjNozoki* this, PlayState* play) {
return;
}
- if (!(play->actorCtx.unk5 & 0x20)) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_5)) {
Math_StepToF(&this->dyna.actor.velocity.y, 15.0f, 3.0f);
Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 200.0f, this->dyna.actor.velocity.y);
@@ -250,7 +250,7 @@ void func_80BA2AB4(ObjNozoki* this, PlayState* play) {
D_80BA36B0 = 1;
}
- if (!(play->actorCtx.unk5 & 0x20)) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_5)) {
if (!(OBJNOZOKI_GET_200(&this->dyna.actor)) &&
Flags_GetSwitch(play, OBJNOZOKI_GET_SWITCHFLAG1(&this->dyna.actor))) {
func_80BA2790(this);
@@ -316,7 +316,7 @@ void func_80BA2C94(ObjNozoki* this, PlayState* play) {
Math_StepToF(&this->dyna.actor.speedXZ, D_80BA34E4[this->unk_15D], 0.1f);
- if ((play->actorCtx.unk5 & 0x40) || (play->actorCtx.unk5 & 0x20)) {
+ if ((play->actorCtx.flags & ACTORCTX_FLAG_6) || (play->actorCtx.flags & ACTORCTX_FLAG_5)) {
temp_f0 = 0.5f;
} else {
temp_f0 = this->dyna.actor.speedXZ;
@@ -326,20 +326,20 @@ void func_80BA2C94(ObjNozoki* this, PlayState* play) {
D_80BA36B8 += this->dyna.actor.speedXZ;
- if (play->actorCtx.unk5 & 0x40) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_6) {
if (sp34 <= 5.0f) {
Actor_MarkForDeath(&this->dyna.actor);
}
- } else if (!(play->actorCtx.unk5 & 0x20) && (GET_PLAYER(play)->actor.id == ACTOR_PLAYER) &&
+ } else if (!(play->actorCtx.flags & ACTORCTX_FLAG_5) && (GET_PLAYER(play)->actor.id == ACTOR_PLAYER) &&
Flags_GetSwitch(play, OBJNOZOKI_GET_SWITCHFLAG2(&this->dyna.actor)) && (sp38 < 20.0f)) {
static Vec3f D_80BA34F0 = { 0.0f, 0.0f, 50.0f };
- play->actorCtx.unk5 |= 0x40;
+ play->actorCtx.flags |= ACTORCTX_FLAG_6;
Lib_Vec3f_TranslateAndRotateY(&this->dyna.actor.home.pos, this->dyna.actor.shape.rot.y, &D_80BA34F0,
&this->dyna.actor.world.pos);
this->dyna.actor.shape.rot.x = -0x1F40;
} else if (sp34 < 50.0f) {
- play->actorCtx.unk5 |= 0x20;
+ play->actorCtx.flags |= ACTORCTX_FLAG_5;
if (sp34 < 20.0f) {
this->dyna.actor.velocity.y -= 0.4f;
@@ -369,11 +369,11 @@ void func_80BA3044(ObjNozoki* this, PlayState* play) {
Vec3f* sp1C = &this->dyna.actor.focus.pos;
if (this->unk_15D == 0) {
- if (play->actorCtx.unk5 & 0x40) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_6) {
this->unk_15D = 1;
this->unk_15E = 20;
Math_Vec3f_Copy(&this->dyna.actor.world.pos, sp1C);
- } else if (!(play->actorCtx.unk5 & 0x20) &&
+ } else if (!(play->actorCtx.flags & ACTORCTX_FLAG_5) &&
Flags_GetSwitch(play, OBJNOZOKI_GET_SWITCHFLAG1(&this->dyna.actor))) {
sp1C = &this->dyna.actor.home.pos;
}
diff --git a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
index 801cfc3ce4..02743db291 100644
--- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
+++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
@@ -296,7 +296,7 @@ void ObjSwitch_FloorSwitchSnapPlayerToSwitchEdge(ObjSwitch* this, PlayState* pla
s16 yaw;
f32 cos;
- if (play->actorCtx.unk5 & 0x80) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_7) {
player = GET_PLAYER(play);
// compute yawTowardsPlayer relative to model space
yaw = BINANG_SUB(this->dyna.actor.yawTowardsPlayer, this->dyna.actor.shape.rot.y);
diff --git a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h
index 618b86ed51..d1a0be1c88 100644
--- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h
+++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h
@@ -50,10 +50,10 @@ typedef enum {
#define OBJ_SYOKUDAI_SNUFF_TIMER_JUST_LIT_BONUS 10
#define OBJ_SYOKUDAI_LIGHT_RADIUS_MAX 250
-#define OBJ_SYOKUDAI_GET_TYPE(thisx) (thisx->params >> 0xC)
-#define OBJ_SYOKUDAI_GET_START_LIT(thisx) (thisx->params & 0x800)
-#define OBJ_SYOKUDAI_GET_GROUP_SIZE(thisx) ((thisx->params >> 7) & 0xF)
-#define OBJ_SYOKUDAI_GET_SWITCH_FLAG(thisx) (thisx->params & 0x7F)
+#define OBJ_SYOKUDAI_GET_TYPE(thisx) ((thisx)->params >> 0xC)
+#define OBJ_SYOKUDAI_GET_START_LIT(thisx) ((thisx)->params & 0x800)
+#define OBJ_SYOKUDAI_GET_GROUP_SIZE(thisx) (((thisx)->params >> 7) & 0xF)
+#define OBJ_SYOKUDAI_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
#define OBJ_SYOKUDAI_SNUFF_TIMER_INITIAL(groupSize) ((groupSize * 50) + 100)
diff --git a/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c b/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
index 9aadc668c8..c7aa4549d6 100644
--- a/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
+++ b/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
@@ -310,7 +310,7 @@ void ObjTaru_Update(Actor* thisx, PlayState* play) {
if (!OBJ_TARU_GET_80(thisx)) {
if (this->unk_1AC != 0) {
- play->actorCtx.unk5 |= 8;
+ play->actorCtx.flags |= ACTORCTX_FLAG_3;
}
if (this->unk_1AD >= 0) {
switch (this->unk_1AD) {
diff --git a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
index 51deb7370c..8cb13e7026 100644
--- a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
+++ b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
@@ -701,7 +701,7 @@ void ObjTokeidai_TowerClock_Idle(ObjTokeidai* this, PlayState* play) {
this->clockTime += 3;
this->actor.draw = ObjTokeidai_Clock_Draw;
} else {
- if (!(play->actorCtx.unk5 & 2) &&
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_1) &&
OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_TOWER_CLOCK_TERMINA_FIELD &&
ActorCutscene_GetCurrentIndex() == -1) {
this->actor.draw = NULL;
@@ -734,9 +734,9 @@ void ObjTokeidai_ExteriorGear_Idle(ObjTokeidai* this, PlayState* play) {
this->clockTime += 3;
this->actor.draw = ObjTokeidai_ExteriorGear_Draw;
} else {
- if ((play->actorCtx.unk5 & 2) == 0 &&
- OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_EXTERIOR_GEAR_TERMINA_FIELD &&
- ActorCutscene_GetCurrentIndex() == -1) {
+ if (!(play->actorCtx.flags & ACTORCTX_FLAG_1) &&
+ (OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_EXTERIOR_GEAR_TERMINA_FIELD) &&
+ (ActorCutscene_GetCurrentIndex() == -1)) {
this->actor.draw = NULL;
}
this->clockTime = gSaveContext.save.time;
diff --git a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
index c2cc74a82a..acba9ec31c 100644
--- a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
+++ b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
@@ -665,7 +665,7 @@ void ObjTsubo_Update(Actor* thisx, PlayState* play) {
}
if (!this->unk_197) {
if (this->unk_198) {
- play->actorCtx.unk5 |= 8;
+ play->actorCtx.flags |= ACTORCTX_FLAG_3;
this->actor.flags |= ACTOR_FLAG_10;
}
if (this->unk_19A >= 0) {
diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
index 7f011e497a..916038a863 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
@@ -679,8 +679,8 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
this->wheelRot = 0;
ObjUm_DefaultAnim(this, play);
- this->type = OBJ_UM_PARSE_TYPE(thisx);
- this->initialPathIndex = OBJ_UM_PARSE_PATH_INDEX(thisx);
+ this->type = OBJ_UM_GET_TYPE(thisx);
+ this->initialPathIndex = OBJ_UM_GET_PATH_INDEX(thisx);
// if (!AliensDefeated)
if (!(gSaveContext.save.weekEventReg[22] & 1)) {
diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.h b/src/overlays/actors/ovl_Obj_Um/z_obj_um.h
index 74eb5f5216..a6644009ee 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.h
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.h
@@ -72,8 +72,8 @@ typedef enum {
/* 4 */ OBJ_UM_TYPE_POST_MILK_RUN // milk road, post-minigame
} ObjUmType;
-#define OBJ_UM_PARSE_TYPE(thisx) (((thisx)->params & 0xFF00) >> 8)
-#define OBJ_UM_PARSE_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
+#define OBJ_UM_GET_TYPE(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define OBJ_UM_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
#define OBJ_UM_FLAG_NONE (0)
#define OBJ_UM_FLAG_0001 (1 << 0)
diff --git a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
index e895eeba9b..33ebf1e500 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_usiyane.h"
+#include "objects/object_obj_usiyane/object_obj_usiyane.h"
#define FLAGS (ACTOR_FLAG_20)
@@ -15,7 +16,6 @@ void ObjUsiyane_Destroy(Actor* thisx, PlayState* play);
void ObjUsiyane_Update(Actor* thisx, PlayState* play);
void ObjUsiyane_Draw(Actor* thisx, PlayState* play);
-#if 0
const ActorInit Obj_Usiyane_InitVars = {
ACTOR_OBJ_USIYANE,
ACTORCAT_PROP,
@@ -28,40 +28,245 @@ const ActorInit Obj_Usiyane_InitVars = {
(ActorFunc)ObjUsiyane_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80C086B0[] = {
+PosRot D_80C08660[] = {
+ { { 800.0f, -940.0f, 2000.0f }, { 0, 0, 0x2AF8 } },
+ { { 560.0f, -790.0f, -2000.0f }, { 0, 0, 0x2EE0 } },
+ { { -480.0f, -780.0f, -1990.0f }, { 0, 0, -0x2710 } },
+ { { -470.0f, -850.0f, 2000.0f }, { 0, 0, -0x2710 } },
+};
+
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 1200, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 900, ICHAIN_STOP),
};
-#endif
+s32 func_80C07C80(s32 arg0) {
+ s32 var_v1;
-extern InitChainEntry D_80C086B0[];
+ if (!(arg0 & 1)) {
+ var_v1 = gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF;
+ } else {
+ var_v1 = (gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF0000) >> 0x10;
+ }
+ return var_v1 + CLOCK_TIME(2, 30);
+}
-extern UNK_TYPE D_06000838;
-extern UNK_TYPE D_060022AC;
+s32 func_80C07CD0(void) {
+ if (CURRENT_DAY <= 0) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07C80.s")
+ if (CURRENT_DAY == 1) {
+ s32 time = gSaveContext.save.time;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07CD0.s")
+ if ((time < CLOCK_TIME(2, 30)) || (time >= CLOCK_TIME(6, 0))) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07DC4.s")
+ if (time < CLOCK_TIME(5, 15)) {
+ s32 var_s1 = CLOCK_TIME(5, 15);
+ s32 temp_v0_2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07DFC.s")
+ for (i = 0; i < 8; i++) {
+ temp_v0_2 = func_80C07C80(i);
+ var_s1 = CLAMP_MAX(var_s1, temp_v0_2);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07F30.s")
+ if (time < (var_s1 + 0xE11)) {
+ return false;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C081C8.s")
+ if (gSaveContext.save.weekEventReg[22] & 1) {
+ return false;
+ }
+ return true;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C082CC.s")
+void func_80C07DC4(ObjUsiyane* this, PlayState* play) {
+ if (func_80C07CD0()) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C082E0.s")
+void func_80C07DFC(Vec3f* arg0, Vec3s* arg1, Vec3f* arg2, Vec3s* arg3, s32 arg4, s32 arg5, Vec3f* arg6, Vec3s* arg7) {
+ f32 temp_fv0 = (f32)arg4 / arg5;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Init.s")
+ // VEC3F_LERPIMPDST
+ arg6->x = ((arg2->x - arg0->x) * temp_fv0) + arg0->x;
+ arg6->y = ((arg2->y - arg0->y) * temp_fv0) + arg0->y;
+ arg6->z = ((arg2->z - arg0->z) * temp_fv0) + arg0->z;
+ arg7->x = (((f32)arg3->x - (f32)arg1->x) * temp_fv0) + arg1->x;
+ arg7->y = (((f32)arg3->y - (f32)arg1->y) * temp_fv0) + arg1->y;
+ arg7->z = (((f32)arg3->z - (f32)arg1->z) * temp_fv0) + arg1->z;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Destroy.s")
+void func_80C07F30(ObjUsiyane* this, PlayState* play) {
+ s32 i;
+ s32 j;
+ Vec3f sp94;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Update.s")
+ for (i = 0; i < ARRAY_COUNT(this->unk_168[0]); i++) {
+ for (j = 0; j < ARRAY_COUNT(this->unk_168); j++) {
+ if (i != ARRAY_COUNT(this->unk_168[0]) - 1) {
+ func_80C07DFC(&this->unk_710[i], &D_80C08660[i].rot, &this->unk_710[i + 1], &D_80C08660[i + 1].rot, j,
+ 10, &this->unk_168[j][i].unk_00, &this->unk_168[j][i].unk_18);
+ } else {
+ func_80C07DFC(&this->unk_710[i], &D_80C08660[i].rot, &this->unk_710[0], &D_80C08660[0].rot, j, 10,
+ &this->unk_168[j][i].unk_00, &this->unk_168[j][i].unk_18);
+ }
+ func_800B12F0(play, &this->unk_168[j][i].unk_00, &gZeroVec3f, &gZeroVec3f, 100, 30, 7);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Draw.s")
+ this->unk_168[j][i].unk_18.y = (s32)Rand_Next() >> 0x10;
+
+ sp94.x = this->unk_168[j][i].unk_00.x - this->unk_708;
+ sp94.y = 0.0f;
+ sp94.z = this->unk_168[j][i].unk_00.z - this->unk_70C;
+ Math3D_Normalize(&sp94);
+
+ sp94.x *= 5.0f;
+ sp94.y = 19.0f;
+ sp94.z *= 5.0f;
+
+ this->unk_168[j][i].unk_0C = sp94;
+
+ this->unk_168[j][i].unk_1E.x = Rand_Centered() * 4000.0f;
+ this->unk_168[j][i].unk_1E.y = Rand_Centered() * 4000.0f;
+ this->unk_168[j][i].unk_1E.z = Rand_Centered() * 4000.0f;
+ }
+ }
+
+ Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_HOUSE_BROKEN);
+ this->unk_740 = 0;
+ this->unk_744 |= 4;
+}
+
+void func_80C081C8(ObjUsiyane* this, PlayState* play) {
+ s32 i;
+ s32 j;
+
+ this->unk_744 |= 1;
+
+ if (this->unk_740 <= 70) {
+ for (i = 0; i < ARRAY_COUNT(this->unk_168[0]); i++) {
+ for (j = 0; j < ARRAY_COUNT(this->unk_168); j++) {
+ this->unk_168[j][i].unk_0C.y += -0.8f;
+
+ this->unk_168[j][i].unk_00.x += this->unk_168[j][i].unk_0C.x;
+ this->unk_168[j][i].unk_00.y += this->unk_168[j][i].unk_0C.y;
+ this->unk_168[j][i].unk_00.z += this->unk_168[j][i].unk_0C.z;
+
+ this->unk_168[j][i].unk_18.x += this->unk_168[j][i].unk_1E.x;
+ this->unk_168[j][i].unk_18.y += this->unk_168[j][i].unk_1E.y;
+ this->unk_168[j][i].unk_18.z += this->unk_168[j][i].unk_1E.z;
+ }
+ }
+
+ } else if (this->unk_740 >= 70) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ }
+ this->unk_740++;
+}
+
+void func_80C082CC(ObjUsiyane* this, PlayState* play) {
+ this->unk_164 = -1;
+}
+
+void func_80C082E0(ObjUsiyane* this, PlayState* play) {
+ CsCmdActorAction* csAction;
+
+ if (Cutscene_CheckActorAction(play, 0x228)) {
+ this->unk_160 = Cutscene_GetActorActionIndex(play, 0x228);
+ csAction = play->csCtx.actorActions[this->unk_160];
+ if (this->unk_164 != csAction->action) {
+ this->unk_164 = csAction->action;
+ if (this->unk_164 == 2) {
+ func_80C07F30(this, play);
+ this->actionFunc = func_80C081C8;
+ }
+ }
+ }
+}
+
+void ObjUsiyane_Init(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ Actor_SetScale(&this->dyna.actor, 0.1f);
+
+ this->unk_744 = 0;
+
+ DynaPolyActor_Init(&this->dyna, 0);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &object_obj_usiyane_Colheader_0022AC);
+
+ switch (OBJUSIYANE_GET_F(&this->dyna.actor)) {
+ case OBJUSIYANE_F_0:
+ this->actionFunc = func_80C07DC4;
+ break;
+
+ case OBJUSIYANE_F_1:
+ func_80C082CC(this, play);
+ this->actionFunc = func_80C082E0;
+ break;
+
+ default:
+ Actor_MarkForDeath(&this->dyna.actor);
+ break;
+ }
+}
+
+void ObjUsiyane_Destroy(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
+
+void ObjUsiyane_Update(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void ObjUsiyane_Draw(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+ MtxF mf;
+
+ if (!(this->unk_744 & 1)) {
+ Gfx_DrawDListOpa(play, object_obj_usiyane_DL_000838);
+ }
+
+ if (!(this->unk_744 & 2)) {
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(D_80C08660); i++) {
+ Vec3f sp74;
+
+ Matrix_MultVec3f(&D_80C08660[i].pos, &this->unk_710[i]);
+ Matrix_MultVec3f(&gZeroVec3f, &sp74);
+ this->unk_708 = sp74.x;
+ this->unk_70C = sp74.z;
+ }
+ this->unk_744 |= 2;
+ }
+
+ if ((this->unk_744 & 4) && !(this->unk_744 & 8)) {
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_168[0]); i++) {
+ for (j = 0; j < ARRAY_COUNT(this->unk_168); j++) {
+ Matrix_Push();
+ SkinMatrix_SetScaleRotateRPYTranslate(&mf, 0.1f, 0.1f, 0.1f, this->unk_168[j][i].unk_18.x,
+ this->unk_168[j][i].unk_18.y, this->unk_168[j][i].unk_18.z,
+ this->unk_168[j][i].unk_00.x, this->unk_168[j][i].unk_00.y,
+ this->unk_168[j][i].unk_00.z);
+ Matrix_Put(&mf);
+ Gfx_DrawDListOpa(play, object_obj_usiyane_DL_000098);
+ Matrix_Pop();
+ }
+ }
+ }
+}
diff --git a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
index 7c4cdd8a5a..c38a08ed9f 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
@@ -7,11 +7,31 @@ struct ObjUsiyane;
typedef void (*ObjUsiyaneActionFunc)(struct ObjUsiyane*, PlayState*);
+#define OBJUSIYANE_GET_F(thisx) ((thisx)->params & 0xF)
+
+enum {
+ /* 0 */ OBJUSIYANE_F_0,
+ /* 1 */ OBJUSIYANE_F_1,
+};
+
+typedef struct {
+ /* 0x00 */ Vec3f unk_00;
+ /* 0x0C */ Vec3f unk_0C;
+ /* 0x18 */ Vec3s unk_18;
+ /* 0x1E */ Vec3s unk_1E;
+} ObjUsiyaneStruct; // size = 0x24
+
typedef struct ObjUsiyane {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x18];
+ /* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ObjUsiyaneActionFunc actionFunc;
- /* 0x160 */ char unk_160[0x5E8];
+ /* 0x160 */ s32 unk_160;
+ /* 0x164 */ s32 unk_164;
+ /* 0x168 */ ObjUsiyaneStruct unk_168[10][4];
+ /* 0x708 */ f32 unk_708;
+ /* 0x70C */ f32 unk_70C;
+ /* 0x710 */ Vec3f unk_710[4];
+ /* 0x740 */ s32 unk_740;
+ /* 0x744 */ s32 unk_744;
} ObjUsiyane; // size = 0x748
extern const ActorInit Obj_Usiyane_InitVars;
diff --git a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
index 0247cd23a7..4057ff8175 100644
--- a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
+++ b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
@@ -554,7 +554,7 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) {
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gDust5Tex));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust5Tex));
}
Matrix_Translate(worldPos.x, worldPos.y, worldPos.z, MTXMODE_NEW);
@@ -569,7 +569,7 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) {
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_023130);
+ gSPDisplayList(POLY_XLU_DISP++, gEffDustDL);
}
}
@@ -629,14 +629,14 @@ void func_808DD970(Actor* thisx, PlayState* play2) {
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gDust5Tex));
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust5Tex));
gSPClearGeometryMode(POLY_XLU_DISP++, G_LIGHTING);
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_023130);
+ gSPDisplayList(POLY_XLU_DISP++, gEffDustDL);
}
}
diff --git a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
index 91a5d3e661..7eaf78c209 100644
--- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
+++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
@@ -10,17 +10,17 @@
#define THIS ((OceffSpot*)thisx)
-void OceffSpot_Init(Actor* thisx, PlayState* play);
-void OceffSpot_Destroy(Actor* thisx, PlayState* play);
+void OceffSpot_Init(Actor* thisx, PlayState* play2);
+void OceffSpot_Destroy(Actor* thisx, PlayState* play2);
void OceffSpot_Update(Actor* thisx, PlayState* play);
void OceffSpot_Draw(Actor* thisx, PlayState* play);
-void func_809728F8(OceffSpot* this, PlayState* play);
-void func_80972934(OceffSpot* this, PlayState* play);
+void OceffSpot_Wait(OceffSpot* this, PlayState* play);
+void OceffSpot_GrowCylinder(OceffSpot* this, PlayState* play);
+void OceffSpot_End(OceffSpot* this, PlayState* play);
void OceffSpot_SetupAction(OceffSpot* this, OceffSpotActionFunc actionFunc);
-#if 0
const ActorInit Oceff_Spot_InitVars = {
ACTOR_OCEFF_SPOT,
ACTORCAT_ITEMACTION,
@@ -33,28 +33,140 @@ const ActorInit Oceff_Spot_InitVars = {
(ActorFunc)OceffSpot_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80973478[] = {
+#include "assets/overlays/ovl_Oceff_Spot/ovl_Oceff_Spot.c"
+
+static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 0, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1500, ICHAIN_STOP),
};
-#endif
+void OceffSpot_SetupAction(OceffSpot* this, OceffSpotActionFunc actionFunc) {
+ this->actionFunc = actionFunc;
+}
-extern InitChainEntry D_80973478[];
+void OceffSpot_Init(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ OceffSpot* this = THIS;
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_SetupAction.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ OceffSpot_SetupAction(this, OceffSpot_GrowCylinder);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Init.s")
+ Lights_PointNoGlowSetInfo(&this->lightInfo1, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, 0);
+ this->lightNode1 = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Destroy.s")
+ Lights_PointNoGlowSetInfo(&this->lightInfo2, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, 0);
+ this->lightNode2 = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo2);
+ this->actor.scale.y = 0.3f;
+ this->unk16C = 0.0f;
+ this->actor.world.pos.y = player->actor.world.pos.y;
+ this->actor.world.pos.x = player->bodyPartsPos[0].x;
+ this->actor.world.pos.z = player->bodyPartsPos[0].z;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_80972844.s")
+void OceffSpot_Destroy(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ OceffSpot* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_809728F8.s")
+ LightContext_RemoveLight(play, &play->lightCtx, this->lightNode1);
+ LightContext_RemoveLight(play, &play->lightCtx, this->lightNode2);
+ Magic_Reset(play);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_80972934.s")
+void OceffSpot_End(OceffSpot* this, PlayState* play) {
+ if (this->unk16C > 0.0f) {
+ this->unk16C -= 0.05f;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ if ((REG(15) != 0x190) && (play->msgCtx.unk12046 == 0)) {
+ if ((play->msgCtx.ocarinaAction != 0x39) || (play->msgCtx.ocarinaMode != 0xA)) {
+ gSaveContext.sunsSongState = SUNSSONG_START;
+ }
+ } else {
+ play->msgCtx.ocarinaMode = 4;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Update.s")
+void OceffSpot_Wait(OceffSpot* this, PlayState* play) {
+ if (this->timer > 0) {
+ this->timer--;
+ } else {
+ OceffSpot_SetupAction(this, OceffSpot_End);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Draw.s")
+void OceffSpot_GrowCylinder(OceffSpot* this, PlayState* play) {
+ if (this->unk16C < 1.0f) {
+ this->unk16C += 0.05f;
+ } else {
+ OceffSpot_SetupAction(this, OceffSpot_Wait);
+ this->timer = 60;
+ }
+}
+
+void OceffSpot_Update(Actor* thisx, PlayState* play) {
+ f32 scale;
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+ f32 temp;
+ OceffSpot* this = THIS;
+
+ temp = (1.0f - cosf(this->unk16C * M_PI)) * 0.5f;
+ this->actionFunc(this, play);
+
+ switch (gSaveContext.save.playerForm) {
+ default:
+ scale = 1.0f;
+ break;
+
+ case PLAYER_FORM_DEKU:
+ scale = 1.3f;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ scale = 1.2f;
+ break;
+
+ case PLAYER_FORM_GORON:
+ scale = 2.0f;
+ break;
+ }
+
+ this->actor.scale.z = (scale * 0.42f) * temp;
+ this->actor.scale.x = (scale * 0.42f) * temp;
+
+ this->actor.world.pos = player->actor.world.pos;
+ this->actor.world.pos.y = this->actor.world.pos.y + 5.0f;
+
+ temp = (2.0f - this->unk16C) * this->unk16C;
+
+ func_800FD2B4(play, temp * 0.5f, 880.0f, 0.2f, 0.9f);
+
+ Lights_PointNoGlowSetInfo(&this->lightInfo1, this->actor.world.pos.x, this->actor.world.pos.y + 55.0f,
+ this->actor.world.pos.z, (s32)(255.0f * temp), (s32)(255.0f * temp), (s32)(200.0f * temp),
+ 100.0f * temp);
+ Lights_PointNoGlowSetInfo(
+ &this->lightInfo2, this->actor.world.pos.x + (Math_SinS(player->actor.shape.rot.y) * 20.0f),
+ this->actor.world.pos.y + 20.0f, this->actor.world.pos.z + (Math_CosS(player->actor.shape.rot.y) * 20.0f),
+ (s32)(255.0f * temp), (s32)(255.0f * temp), (s32)(200.0f * temp), 100.0f * temp);
+}
+
+void OceffSpot_Draw(Actor* thisx, PlayState* play) {
+ OceffSpot* this = THIS;
+ u32 scroll = play->state.frames & 0xFFFF;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &sSunSongEffectCylinderMaterialDL);
+ gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, 0, scroll * 2, scroll * -2, 0x20, 0x20, 1, 0,
+ scroll * -8, 0x20, 0x20));
+ gSPDisplayList(POLY_XLU_DISP++, &sSunSongEffectCylinderModelDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h
index 922b1f89b8..0a770ee9d3 100644
--- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h
+++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h
@@ -9,7 +9,12 @@ typedef void (*OceffSpotActionFunc)(struct OceffSpot*, PlayState*);
typedef struct OceffSpot {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x30];
+ /* 0x144 */ LightNode* lightNode1;
+ /* 0x148 */ LightInfo lightInfo1;
+ /* 0x158 */ LightNode* lightNode2;
+ /* 0x15C */ LightInfo lightInfo2;
+ /* 0x16C */ f32 unk16C;
+ /* 0x170 */ u16 timer;
/* 0x174 */ OceffSpotActionFunc actionFunc;
} OceffSpot; // size = 0x178
diff --git a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
index ca7ff8de2e..54672f173d 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
@@ -15,7 +15,6 @@ void OceffWipe2_Destroy(Actor* thisx, PlayState* play);
void OceffWipe2_Update(Actor* thisx, PlayState* play);
void OceffWipe2_Draw(Actor* thisx, PlayState* play);
-#if 0
const ActorInit Oceff_Wipe2_InitVars = {
ACTOR_OCEFF_WIPE2,
ACTORCAT_ITEMACTION,
@@ -28,12 +27,83 @@ const ActorInit Oceff_Wipe2_InitVars = {
(ActorFunc)OceffWipe2_Draw,
};
-#endif
+#include "assets/overlays/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.c"
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Init.s")
+s32 D_809879D0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Destroy.s")
+void OceffWipe2_Init(Actor* thisx, PlayState* play) {
+ OceffWipe2* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Update.s")
+ Actor_SetScale(&this->actor, 0.1f);
+ this->timer = 0;
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Draw.s")
+void OceffWipe2_Destroy(Actor* thisx, PlayState* play) {
+ OceffWipe2* this = THIS;
+
+ Magic_Reset(play);
+ play->msgCtx.unk120B0 = 0;
+}
+
+void OceffWipe2_Update(Actor* thisx, PlayState* play) {
+ OceffWipe2* this = THIS;
+
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+ if (this->timer < 100) {
+ this->timer++;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void OceffWipe2_Draw(Actor* thisx, PlayState* play) {
+ u32 scroll = play->state.frames & 0xFF;
+ OceffWipe2* this = THIS;
+ f32 z;
+ u8 alpha;
+ s32 pad[2];
+ Vec3f eye = GET_ACTIVE_CAM(play)->eye;
+ Vtx* vtxPtr;
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play));
+
+ vtxPtr = sEponaSongFrustumVtx;
+
+ if (this->timer < 32) {
+ z = Math_SinS(this->timer << 9) * 1220.0f;
+ } else {
+ z = 1220.0f;
+ }
+
+ if (this->timer >= 80) {
+ alpha = 12 * (100 - this->timer);
+ } else {
+ alpha = 255;
+ }
+
+ vtxPtr[1].v.cn[3] = vtxPtr[3].v.cn[3] = vtxPtr[5].v.cn[3] = vtxPtr[7].v.cn[3] = vtxPtr[9].v.cn[3] =
+ vtxPtr[11].v.cn[3] = vtxPtr[13].v.cn[3] = vtxPtr[15].v.cn[3] = vtxPtr[16].v.cn[3] = vtxPtr[18].v.cn[3] =
+ vtxPtr[20].v.cn[3] = alpha;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+
+ Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
+ Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_RotateXS(0x708, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 170, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 100, 0, 128);
+ gSPDisplayList(POLY_XLU_DISP++, sEponaSongFrustumMaterialDL);
+ gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, scroll * 6, scroll * -6, 64,
+ 64, 1, scroll * -6, 0, 64, 64));
+ gSPDisplayList(POLY_XLU_DISP++, sEponaSongFrustumModelDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h
index 79d3665253..c213dfe382 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h
+++ b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h
@@ -7,7 +7,7 @@ struct OceffWipe2;
typedef struct OceffWipe2 {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x4];
+ /* 0x144 */ s16 timer;
} OceffWipe2; // size = 0x148
extern const ActorInit Oceff_Wipe2_InitVars;
diff --git a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
index fb1f2a45d1..4837f69493 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
@@ -16,7 +16,6 @@ void OceffWipe3_Destroy(Actor* thisx, PlayState* play);
void OceffWipe3_Update(Actor* thisx, PlayState* play);
void OceffWipe3_Draw(Actor* thisx, PlayState* play);
-#if 0
const ActorInit Oceff_Wipe3_InitVars = {
ACTOR_OCEFF_WIPE3,
ACTORCAT_ITEMACTION,
@@ -29,12 +28,82 @@ const ActorInit Oceff_Wipe3_InitVars = {
(ActorFunc)OceffWipe3_Draw,
};
-#endif
+#include "assets/overlays/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.c"
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Init.s")
+s32 D_80989130;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Destroy.s")
+void OceffWipe3_Init(Actor* thisx, PlayState* play) {
+ OceffWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Update.s")
+ Actor_SetScale(&this->actor, 0.1f);
+ this->counter = 0;
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Draw.s")
+void OceffWipe3_Destroy(Actor* thisx, PlayState* play) {
+ OceffWipe3* this = THIS;
+
+ Magic_Reset(play);
+ play->msgCtx.unk120B0 = 0;
+}
+
+void OceffWipe3_Update(Actor* thisx, PlayState* play) {
+ OceffWipe3* this = THIS;
+
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+ if (this->counter < 100) {
+ this->counter++;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void OceffWipe3_Draw(Actor* thisx, PlayState* play) {
+ u32 scroll = play->state.frames & 0xFFF;
+ OceffWipe3* this = THIS;
+ f32 z;
+ u8 alpha;
+ s32 pad[2];
+ Vec3f eye = GET_ACTIVE_CAM(play)->eye;
+ Vtx* vtxPtr;
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play));
+
+ vtxPtr = sSariaSongFrustumVtx;
+
+ if (this->counter < 32) {
+ z = Math_SinS(this->counter * 512) * 1220.0f;
+ } else {
+ z = 1220.0f;
+ }
+
+ if (this->counter >= 80) {
+ alpha = 12 * (100 - this->counter);
+ } else {
+ alpha = 255;
+ }
+
+ vtxPtr[1].v.cn[3] = vtxPtr[3].v.cn[3] = vtxPtr[5].v.cn[3] = vtxPtr[7].v.cn[3] = vtxPtr[9].v.cn[3] =
+ vtxPtr[11].v.cn[3] = vtxPtr[13].v.cn[3] = vtxPtr[15].v.cn[3] = vtxPtr[17].v.cn[3] = vtxPtr[19].v.cn[3] =
+ vtxPtr[21].v.cn[3] = alpha;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+ Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
+ Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_RotateXS(0x708, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 170, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, 100, 200, 0, 128);
+ gSPDisplayList(POLY_XLU_DISP++, &sSariaSongFrustrumMaterialDL);
+ gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, 0, scroll * 12, scroll * -12, 64, 64, 1,
+ scroll * 8, scroll * -8, 64, 64));
+ gSPDisplayList(POLY_XLU_DISP++, &sSariaSongFrustumModelDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h
index b9f41bb09c..f29ca92780 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h
+++ b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h
@@ -7,7 +7,7 @@ struct OceffWipe3;
typedef struct OceffWipe3 {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x4];
+ /* 0x144 */ s16 counter;
} OceffWipe3; // size = 0x148
extern const ActorInit Oceff_Wipe3_InitVars;
diff --git a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
index 3dd701dbf5..97c688434b 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
@@ -38,7 +38,7 @@ void OceffWipe6_Init(Actor* thisx, PlayState* play) {
}
void OceffWipe6_Destroy(Actor* thisx, PlayState* play) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
play->msgCtx.unk120B0 = 0;
}
diff --git a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
index 5a71ef0d1e..abd01e1ff6 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
@@ -42,7 +42,7 @@ void OceffWipe7_Init(Actor* thisx, PlayState* play) {
void OceffWipe7_Destroy(Actor* thisx, PlayState* play) {
OceffWipe7* this = THIS;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
play->msgCtx.unk120B0 = 0;
}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
index bb4cada883..93353f28cc 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
@@ -1,27 +1,90 @@
/*
* File: z_eff_ss_blast.c
* Overlay: ovl_Effect_Ss_Blast
- * Description:
+ * Description: Shockwave Effect
*/
#include "z_eff_ss_blast.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define rPrimColorR regs[0]
+#define rPrimColorG regs[1]
+#define rPrimColorB regs[2]
+#define rPrimColorA regs[3]
+#define rEnvColorR regs[4]
+#define rEnvColorG regs[5]
+#define rEnvColorB regs[6]
+#define rEnvColorA regs[7]
+#define rAlphaStep regs[8]
+#define rScale regs[9]
+#define rScaleStep regs[10]
+#define rScaleStepDecay regs[11]
#define PARAMS ((EffectSsBlastInitParams*)initParamsx)
-s32 EffectSsBlast_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsBlast_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsBlast_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsBlast_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_Blast_InitVars = {
EFFECT_SS_BLAST,
EffectSsBlast_Init,
};
-#endif
+u32 EffectSsBlast_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsBlastInitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Blast/EffectSsBlast_Init.s")
+ this->pos = initParams->pos;
+ this->pos.y += 5.0f;
+ this->velocity = initParams->velocity;
+ this->accel = initParams->accel;
+ this->gfx = gEffShockwaveDL;
+ this->life = initParams->life;
+ this->draw = EffectSsBlast_Draw;
+ this->update = EffectSsBlast_Update;
+ this->rPrimColorR = initParams->primColor.r;
+ this->rPrimColorG = initParams->primColor.g;
+ this->rPrimColorB = initParams->primColor.b;
+ this->rPrimColorA = initParams->primColor.a;
+ this->rEnvColorR = initParams->envColor.r;
+ this->rEnvColorG = initParams->envColor.g;
+ this->rEnvColorB = initParams->envColor.b;
+ this->rEnvColorA = initParams->envColor.a;
+ this->rAlphaStep = initParams->primColor.a / initParams->life;
+ this->rScale = initParams->scale;
+ this->rScaleStep = initParams->scaleStep;
+ this->rScaleStepDecay = initParams->scaleStepDecay;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Blast/EffectSsBlast_Draw.s")
+ return 1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Blast/EffectSsBlast_Update.s")
+void EffectSsBlast_Draw(PlayState* play, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ MtxF mf;
+ s32 pad;
+ f32 radius;
+
+ OPEN_DISPS(gfxCtx);
+
+ radius = this->rScale * 0.0025f;
+
+ func_8012C2DC(play->state.gfxCtx);
+ gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
+ func_801691F0(play, &mf, &this->pos);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, this->rPrimColorA);
+ Matrix_Put(&mf);
+ Matrix_Scale(radius, radius, radius, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, this->gfx);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectSsBlast_Update(PlayState* play, u32 index, EffectSs* this) {
+ Math_StepToS(&this->rPrimColorA, 0, this->rAlphaStep);
+ this->rScale += this->rScaleStep;
+
+ if (this->rScaleStep != 0) {
+ this->rScaleStep -= this->rScaleStepDecay;
+ }
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.h b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.h
index 2a13227c36..72a264c038 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.h
@@ -11,7 +11,7 @@ typedef struct {
/* 0x28 */ Color_RGBA8 envColor;
/* 0x2C */ s16 scale;
/* 0x2E */ s16 scaleStep;
- /* 0x30 */ s16 sclaeStepDecay;
+ /* 0x30 */ s16 scaleStepDecay;
/* 0x32 */ s16 life;
} EffectSsBlastInitParams; // size = 0x34
diff --git a/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c b/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
index 7903deffab..d15151d49e 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
@@ -1,30 +1,195 @@
/*
* File: z_eff_ss_bomb2.c
* Overlay: ovl_Effect_Ss_Bomb2
- * Description:
+ * Description: Bomb Blast
*/
#include "z_eff_ss_bomb2.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define rScale regs[0]
+#define rTexIndex regs[1]
+#define rPrimColorR regs[2]
+#define rPrimColorG regs[3]
+#define rPrimColorB regs[4]
+#define rPrimColorA regs[5]
+#define rEnvColorR regs[6]
+#define rEnvColorG regs[7]
+#define rEnvColorB regs[8]
+#define rScaleStep regs[9]
+#define rDepth regs[10]
#define PARAMS ((EffectSsBomb2InitParams*)initParamsx)
-s32 EffectSsBomb2_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsBomb2_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+void EffectSsBomb2_DrawFade(PlayState* play, u32 index, EffectSs* this);
+void EffectSsBomb2_DrawLayered(PlayState* play, u32 index, EffectSs* this);
void EffectSsBomb2_Update(PlayState* play, u32 index, EffectSs* this);
-void func_80978138(PlayState* play, u32 index, EffectSs* this);
-void func_80978304(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_Bomb2_InitVars = {
EFFECT_SS_BOMB2,
EffectSsBomb2_Init,
};
-#endif
+static EffectSsDrawFunc sDrawFuncs[] = {
+ EffectSsBomb2_DrawFade,
+ EffectSsBomb2_DrawLayered,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Bomb2/EffectSsBomb2_Init.s")
+static TexturePtr sTextures[] = {
+ gEffBombExplosion1Tex, gEffBombExplosion2Tex, gEffBombExplosion3Tex, gEffBombExplosion4Tex,
+ gEffBombExplosion5Tex, gEffBombExplosion6Tex, gEffBombExplosion7Tex, gEffBombExplosion8Tex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Bomb2/func_80978138.s")
+static TexturePtr sLayeredTextures[] = {
+ gEffBombExplosion1Tex, gEffBombExplosion2Tex, gEffBombExplosion3Tex, gEffBombExplosion4Tex,
+ gEffBombExplosion5Tex, gEffBombExplosion6Tex, gEffBombExplosion7Tex, gEffBombExplosion8Tex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Bomb2/func_80978304.s")
+u32 EffectSsBomb2_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsBomb2InitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Bomb2/EffectSsBomb2_Update.s")
+ Math_Vec3f_Copy(&this->pos, &initParams->pos);
+ Math_Vec3f_Copy(&this->velocity, &initParams->velocity);
+ Math_Vec3f_Copy(&this->accel, &initParams->accel);
+ this->gfx = gEffBombExplosion1DL;
+ this->life = 24;
+ this->update = EffectSsBomb2_Update;
+ this->draw = sDrawFuncs[initParams->drawMode];
+ this->rScale = initParams->scale;
+ this->rScaleStep = initParams->scaleStep;
+ this->rPrimColorR = 255;
+ this->rPrimColorG = 255;
+ this->rPrimColorB = 255;
+ this->rPrimColorA = 255;
+ this->rEnvColorR = 0;
+ this->rEnvColorG = 0;
+ this->rEnvColorB = 200;
+
+ return 1;
+}
+
+// unused in the original game. looks like EffectSsBomb but with color
+void EffectSsBomb2_DrawFade(PlayState* play, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ MtxF mfTrans;
+ MtxF mfScale;
+ MtxF mfResult;
+ MtxF mfTransBillboard;
+ Mtx* mtx;
+ s32 pad;
+ f32 scale;
+
+ OPEN_DISPS(gfxCtx);
+
+ scale = this->rScale * 0.01f;
+ SkinMatrix_SetTranslate(&mfTrans, this->pos.x, this->pos.y, this->pos.z);
+ SkinMatrix_SetScale(&mfScale, scale, scale, 1.0f);
+ SkinMatrix_MtxFMtxFMult(&mfTrans, &play->billboardMtxF, &mfTransBillboard);
+ SkinMatrix_MtxFMtxFMult(&mfTransBillboard, &mfScale, &mfResult);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
+
+ if (mtx != NULL) {
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ func_8012C974(gfxCtx);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
+ this->rPrimColorA);
+ gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sTextures[this->rTexIndex]));
+ gSPDisplayList(POLY_XLU_DISP++, this->gfx);
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectSsBomb2_DrawLayered(PlayState* play, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ MtxF mfTrans;
+ MtxF mfScale;
+ MtxF mfResult;
+ MtxF mfTransBillboard;
+ MtxF mtx2F;
+ Mtx* mtx2;
+ Mtx* mtx;
+ s32 pad[3];
+ f32 scale;
+ f32 depth;
+ f32 layer2Scale = 0.925f;
+ s32 i;
+
+ OPEN_DISPS(gfxCtx);
+
+ depth = this->rDepth;
+ scale = this->rScale * 0.01f;
+ SkinMatrix_SetTranslate(&mfTrans, this->pos.x, this->pos.y, this->pos.z);
+ SkinMatrix_SetScale(&mfScale, scale, scale, 1.0f);
+ SkinMatrix_MtxFMtxFMult(&mfTrans, &play->billboardMtxF, &mfTransBillboard);
+ SkinMatrix_MtxFMtxFMult(&mfTransBillboard, &mfScale, &mfResult);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
+
+ if (mtx != NULL) {
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ mtx2 = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
+
+ if (mtx2 != NULL) {
+ func_8012C974(gfxCtx);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
+ this->rPrimColorA);
+ gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sLayeredTextures[this->rTexIndex]));
+ gSPDisplayList(POLY_XLU_DISP++, gEffBombExplosion2DL);
+ gSPDisplayList(POLY_XLU_DISP++, gEffBombExplosion3DL);
+
+ Matrix_MtxToMtxF(mtx2, &mtx2F);
+ Matrix_Put(&mtx2F);
+
+ for (i = 1; i >= 0; i--) {
+ Matrix_Translate(0.0f, 0.0f, depth, MTXMODE_APPLY);
+ Matrix_RotateZF((this->life * 0.02f) + 180.0f, MTXMODE_APPLY);
+ Matrix_Scale(layer2Scale, layer2Scale, layer2Scale, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gEffBombExplosion3DL);
+ layer2Scale -= 0.15f;
+ }
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectSsBomb2_Update(PlayState* play, u32 index, EffectSs* this) {
+ s32 divisor;
+
+ this->rTexIndex = (23 - this->life) / 3;
+ this->rScale += this->rScaleStep;
+
+ if (this->rScaleStep == 30) {
+ this->rDepth += 4;
+ } else {
+ this->rDepth += 2;
+ }
+
+ if ((this->life < 23) && (this->life > 13)) {
+ divisor = this->life - 13;
+ this->rPrimColorR = func_800B096C(this->rPrimColorR, 255, divisor);
+ this->rPrimColorG = func_800B096C(this->rPrimColorG, 255, divisor);
+ this->rPrimColorB = func_800B096C(this->rPrimColorB, 150, divisor);
+ this->rPrimColorA = func_800B096C(this->rPrimColorA, 255, divisor);
+ this->rEnvColorR = func_800B096C(this->rEnvColorR, 150, divisor);
+ this->rEnvColorG = func_800B096C(this->rEnvColorG, 0, divisor);
+ this->rEnvColorB = func_800B096C(this->rEnvColorB, 0, divisor);
+ } else if ((this->life < 14) && (this->life > -1)) {
+ divisor = this->life + 1;
+ this->rPrimColorR = func_800B096C(this->rPrimColorR, 50, divisor);
+ this->rPrimColorG = func_800B096C(this->rPrimColorG, 50, divisor);
+ this->rPrimColorB = func_800B096C(this->rPrimColorB, 50, divisor);
+ this->rPrimColorA = func_800B096C(this->rPrimColorA, 150, divisor);
+ this->rEnvColorR = func_800B096C(this->rEnvColorR, 10, divisor);
+ this->rEnvColorG = func_800B096C(this->rEnvColorG, 10, divisor);
+ this->rEnvColorB = func_800B096C(this->rEnvColorB, 10, divisor);
+ }
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
index 011d8a101c..9dab9c61ad 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
@@ -1,7 +1,7 @@
/*
* File: z_eff_ss_bubble.c
* Overlay: ovl_Effect_Ss_Bubble
- * Description:
+ * Description: Water Bubbles
*/
#include "z_eff_ss_bubble.h"
diff --git a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c
index ff8c54053e..9d8eecfbc4 100644
--- a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c
+++ b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c
@@ -1,31 +1,115 @@
/*
* File: z_eff_ss_d_fire.c
* Overlay: ovl_Effect_Ss_D_Fire
- * Description:
+ * Description: Dodongo Fire
*/
#include "z_eff_ss_d_fire.h"
+#include "objects/object_dodongo/object_dodongo.h"
+
+#define rScale regs[0]
+#define rTexIndex regs[1]
+#define rAlpha regs[5]
+#define rAlphaStep regs[6]
+#define rFadeDelay regs[7]
+#define rScaleStep regs[8]
+#define rObjectIndex regs[9]
#define PARAMS ((EffectSsDFireInitParams*)initParamsx)
-s32 EffectSsDFire_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsDFire_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsDFire_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsDFire_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_D_Fire_InitVars = {
EFFECT_SS_D_FIRE,
EffectSsDFire_Init,
};
-#endif
+static TexturePtr sFireTextures[] = { gDodongoFire0Tex, gDodongoFire1Tex, gDodongoFire2Tex, gDodongoFire3Tex };
-extern UNK_TYPE D_060098A0;
+s32 EffectSsDFire_CheckForObject(EffectSs* this, PlayState* play) {
+ if (((this->rObjectIndex = Object_GetIndex(&play->objectCtx, OBJECT_DODONGO)) < 0) ||
+ !Object_IsLoaded(&play->objectCtx, this->rObjectIndex)) {
+ this->life = -1;
+ this->draw = NULL;
+ return false;
+ }
+ return true;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_D_Fire/func_809791B0.s")
+u32 EffectSsDFire_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsDFireInitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_D_Fire/EffectSsDFire_Init.s")
+ if (EffectSsDFire_CheckForObject(this, play)) {
+ Math_Vec3f_Copy(&this->pos, &initParams->pos);
+ Math_Vec3f_Copy(&this->velocity, &initParams->velocity);
+ Math_Vec3f_Copy(&this->accel, &initParams->accel);
+ this->gfx = gDodongoFireDL;
+ this->life = initParams->life;
+ this->rScale = initParams->scale;
+ this->rScaleStep = initParams->scaleStep;
+ this->draw = EffectSsDFire_Draw;
+ this->update = EffectSsDFire_Update;
+ this->rTexIndex = (play->state.frames & 3) ^ 3; // The xor reverses order, i.e 3 -> 2 -> 1 -> 0 -> 3
+ this->rAlpha = initParams->alpha;
+ this->rFadeDelay = this->life - initParams->fadeDelay;
+ this->rAlphaStep = initParams->alphaStep;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_D_Fire/EffectSsDFire_Draw.s")
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_D_Fire/EffectSsDFire_Update.s")
+ return 0;
+}
+
+void EffectSsDFire_Draw(PlayState* play, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ s32 pad;
+ void* object;
+ f32 scale;
+
+ if (EffectSsDFire_CheckForObject(this, play)) {
+ object = play->objectCtx.status[this->rObjectIndex].segment;
+
+ OPEN_DISPS(gfxCtx);
+
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(object);
+ gSPSegment(POLY_XLU_DISP++, 0x06, object);
+
+ scale = this->rScale / 100.0f;
+
+ Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ func_8012C974(gfxCtx);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 50, this->rAlpha);
+
+ {
+ TexturePtr* tex = sFireTextures[this->rTexIndex];
+
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(tex));
+ }
+
+ gSPDisplayList(POLY_XLU_DISP++, this->gfx);
+
+ CLOSE_DISPS(gfxCtx);
+ }
+}
+
+void EffectSsDFire_Update(PlayState* play, u32 index, EffectSs* this) {
+ this->rTexIndex++;
+ this->rTexIndex &= 3;
+ this->rScale += this->rScaleStep;
+ if (this->life < this->rFadeDelay) {
+ this->rAlpha -= this->rAlphaStep;
+ if (this->rAlpha < 0) {
+ this->rAlpha = 0;
+ this->life = -1;
+ }
+ }
+
+ EffectSsDFire_CheckForObject(this, play);
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.h b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.h
index 09298249de..2d657bc432 100644
--- a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.h
+++ b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.h
@@ -10,8 +10,8 @@ typedef struct {
/* 0x24 */ s16 scale;
/* 0x26 */ s16 scaleStep;
/* 0x28 */ s16 alpha;
- /* 0x2A */ s16 fadeDelay;
- /* 0x2C */ s16 unk_2C;
+ /* 0x2A */ s16 alphaStep;
+ /* 0x2C */ s16 fadeDelay;
/* 0x30 */ s32 life;
} EffectSsDFireInitParams; // size = 0x34
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
index 616d30d03c..54963eb3bb 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
@@ -1,27 +1,129 @@
/*
* File: z_eff_ss_dead_db.c
* Overlay: ovl_Effect_Ss_Dead_Db
- * Description:
+ * Description: Enemy Death Flames
*/
#include "z_eff_ss_dead_db.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define rScale regs[0]
+#define rTexIndex regs[1]
+#define rPrimColorR regs[2]
+#define rPrimColorG regs[3]
+#define rPrimColorB regs[4]
+#define rPrimColorA regs[5]
+#define rEnvColorR regs[6]
+#define rEnvColorG regs[7]
+#define rEnvColorB regs[8]
+#define rScaleStep regs[9]
+#define rTotalLife regs[11]
#define PARAMS ((EffectSsDeadDbInitParams*)initParamsx)
-s32 EffectSsDeadDb_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsDeadDb_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsDeadDb_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsDeadDb_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_Dead_Db_InitVars = {
EFFECT_SS_DEAD_DB,
EffectSsDeadDb_Init,
};
-#endif
+static TexturePtr sTextures[] = {
+ gEffEnemyDeathFlame1Tex, gEffEnemyDeathFlame2Tex, gEffEnemyDeathFlame3Tex, gEffEnemyDeathFlame4Tex,
+ gEffEnemyDeathFlame5Tex, gEffEnemyDeathFlame6Tex, gEffEnemyDeathFlame7Tex, gEffEnemyDeathFlame8Tex,
+ gEffEnemyDeathFlame9Tex, gEffEnemyDeathFlame10Tex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dead_Db/EffectSsDeadDb_Init.s")
+u32 EffectSsDeadDb_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsDeadDbInitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dead_Db/EffectSsDeadDb_Draw.s")
+ Math_Vec3f_Copy(&this->pos, &initParams->pos);
+ Math_Vec3f_Copy(&this->velocity, &initParams->velocity);
+ Math_Vec3f_Copy(&this->accel, &initParams->accel);
+ this->gfx = gEffEnemyDeathFlameDL;
+ this->life = initParams->life;
+ this->flags = 4;
+ this->rScaleStep = initParams->scaleStep;
+ this->rTotalLife = initParams->life;
+ this->draw = EffectSsDeadDb_Draw;
+ this->update = EffectSsDeadDb_Update;
+ this->rScale = initParams->scale;
+ this->rTexIndex = 0;
+ this->rPrimColorR = initParams->primColor.r;
+ this->rPrimColorG = initParams->primColor.g;
+ this->rPrimColorB = initParams->primColor.b;
+ this->rPrimColorA = initParams->primColor.a;
+ this->rEnvColorR = initParams->envColor.r;
+ this->rEnvColorG = initParams->envColor.g;
+ this->rEnvColorB = initParams->envColor.b;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dead_Db/EffectSsDeadDb_Update.s")
+ return 1;
+}
+
+void EffectSsDeadDb_Draw(PlayState* play, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ MtxF mfTrans;
+ MtxF mfScale;
+ MtxF mfResult;
+ Mtx* mtx;
+ f32 scale;
+
+ OPEN_DISPS(gfxCtx);
+
+ scale = this->rScale * 0.01f;
+
+ SkinMatrix_SetTranslate(&mfTrans, this->pos.x, this->pos.y, this->pos.z);
+ SkinMatrix_SetScale(&mfScale, scale, scale, scale);
+ SkinMatrix_MtxFMtxFMult(&mfTrans, &mfScale, &mfResult);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
+
+ if (mtx != NULL) {
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ func_8012C974(gfxCtx);
+ gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
+ this->rPrimColorA);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sTextures[this->rTexIndex]));
+ gSPDisplayList(POLY_XLU_DISP++, this->gfx);
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectSsDeadDb_Update(PlayState* play, u32 index, EffectSs* this) {
+ this->rTexIndex = (f32)((this->rTotalLife - this->life) * 9) / this->rTotalLife;
+ this->rScale += this->rScaleStep;
+
+ this->rPrimColorR -= 10;
+ if (this->rPrimColorR < 0) {
+ this->rPrimColorR = 0;
+ }
+
+ this->rPrimColorG -= 10;
+ if (this->rPrimColorG < 0) {
+ this->rPrimColorG = 0;
+ }
+
+ this->rPrimColorB -= 10;
+ if (this->rPrimColorB < 0) {
+ this->rPrimColorB = 0;
+ }
+
+ this->rEnvColorR -= 10;
+ if (this->rEnvColorR < 0) {
+ this->rEnvColorR = 0;
+ }
+
+ this->rEnvColorG -= 10;
+ if (this->rEnvColorG < 0) {
+ this->rEnvColorG = 0;
+ }
+
+ this->rEnvColorB -= 10;
+ if (this->rEnvColorB < 0) {
+ this->rEnvColorB = 0;
+ }
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.h b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.h
index bbdf3c2909..a1ac62167d 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.h
@@ -11,8 +11,8 @@ typedef struct {
/* 0x26 */ s16 scaleStep;
/* 0x28 */ Color_RGBA8 primColor;
/* 0x2C */ Color_RGBA8 envColor;
- /* 0x30 */ s32 unk_30;
-} EffectSsDeadDbInitParams; // size = 0x30
+ /* 0x30 */ s32 life;
+} EffectSsDeadDbInitParams; // size = 0x34
extern const EffectSsInit Effect_Ss_Dead_Db_InitVars;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
index 6dfbce5a19..5e8a1e4514 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
@@ -116,14 +116,13 @@ void EffectSsDeadDd_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
PRIMITIVE, 0);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_054940);
+ gSPDisplayList(POLY_XLU_DISP++, gLensFlareCircleDL);
}
CLOSE_DISPS(gfxCtx);
}
void EffectSsDeadDd_Update(PlayState* play, u32 index, EffectSs* this) {
-
this->rScale += this->rScaleStep;
if (this->rScale < 0) {
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
index e5079f55d7..7bf60c2a19 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
@@ -1,27 +1,124 @@
/*
* File: z_eff_ss_dead_ds.c
* Overlay: ovl_Effect_Ss_Dead_Ds
- * Description:
+ * Description: Burn mark on the floor
*/
#include "z_eff_ss_dead_ds.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define rScale regs[0]
+#define rTimer regs[1]
+#define rRoll regs[2]
+#define rPitch regs[3]
+#define rYaw regs[4]
+#define rAlpha regs[5]
+#define rScaleStep regs[9]
+#define rAlphaStep regs[10]
+#define rHalfOfLife regs[11]
#define PARAMS ((EffectSsDeadDsInitParams*)initParamsx)
-s32 EffectSsDeadDs_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsDeadDs_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsDeadDs_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsDeadDs_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_Dead_Ds_InitVars = {
EFFECT_SS_DEAD_DS,
EffectSsDeadDs_Init,
};
-#endif
+u32 EffectSsDeadDs_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsDeadDsInitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dead_Ds/EffectSsDeadDs_Init.s")
+ this->pos = initParams->pos;
+ this->velocity = initParams->velocity;
+ this->accel = initParams->accel;
+ this->life = initParams->life;
+ this->rScaleStep = initParams->scaleStep;
+ this->rHalfOfLife = initParams->life / 2;
+ this->rAlphaStep = initParams->alpha / this->rHalfOfLife;
+ this->draw = EffectSsDeadDs_Draw;
+ this->update = EffectSsDeadDs_Update;
+ this->rScale = initParams->scale;
+ this->rAlpha = initParams->alpha;
+ this->rTimer = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dead_Ds/EffectSsDeadDs_Draw.s")
+ return 1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dead_Ds/EffectSsDeadDs_Update.s")
+void EffectSsDeadDs_Draw(PlayState* play, u32 index, EffectSs* this) {
+ s32 pad;
+ f32 scale;
+ s32 pad2[2];
+ MtxF mf;
+ f32 yIntersect;
+ Vec3f pos;
+ CollisionPoly* floorPoly;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ scale = this->rScale * 0.01f;
+ func_8012C974(play->state.gfxCtx);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, this->rAlpha);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
+ pos = this->pos;
+
+ if (this->rTimer == 0) {
+ Vec3s rot;
+ Vec3f prevPos;
+
+ prevPos.x = pos.x - this->velocity.x;
+ prevPos.y = pos.y - this->velocity.y;
+ prevPos.z = pos.z - this->velocity.z;
+
+ if (BgCheck_EntitySphVsWall1(&play->colCtx, &this->pos, &pos, &prevPos, 1.5f, &floorPoly, 1.0f)) {
+ func_800C0094(floorPoly, this->pos.x, this->pos.y, this->pos.z, &mf);
+ Matrix_Put(&mf);
+ } else {
+ pos.y++;
+ yIntersect = BgCheck_EntityRaycastFloor1(&play->colCtx, &floorPoly, &pos);
+
+ if (floorPoly != NULL) {
+ func_800C0094(floorPoly, this->pos.x, yIntersect + 1.5f, this->pos.z, &mf);
+ Matrix_Put(&mf);
+ } else {
+ Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
+ Matrix_Get(&mf);
+ }
+ }
+
+ Matrix_MtxFToZYXRot(&mf, &rot, false);
+ this->rRoll = rot.x;
+ this->rPitch = rot.y;
+ this->rYaw = rot.z;
+ this->pos.y = mf.yw;
+ this->rTimer++;
+ }
+
+ Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
+ Matrix_RotateZYX(this->rRoll, this->rPitch, this->rYaw, MTXMODE_APPLY);
+ Matrix_RotateXFApply(1.57f); // (M_PI / 2)
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gSPDisplayList(POLY_XLU_DISP++, gLensFlareCircleDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void EffectSsDeadDs_Update(PlayState* play, u32 index, EffectSs* this) {
+ if (this->life < this->rHalfOfLife) {
+
+ this->rScale += this->rScaleStep;
+ if (this->rScale < 0) {
+ this->rScale = 0;
+ }
+
+ this->rAlpha -= this->rAlphaStep;
+ if (this->rAlpha < 0) {
+ this->rAlpha = 0;
+ }
+ }
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
index a4aed47329..4d009c00ac 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
@@ -1,27 +1,116 @@
/*
* File: z_eff_ss_dt_bubble.c
* Overlay: ovl_Effect_Ss_Dt_Bubble
- * Description:
+ * Description: Non-Water Bubbles (a random mix of translucent and opaque)
*/
#include "z_eff_ss_dt_bubble.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define rPrimColorR regs[0]
+#define rPrimColorG regs[1]
+#define rPrimColorB regs[2]
+#define rPrimColorA regs[3]
+#define rEnvColorR regs[4]
+#define rEnvColorG regs[5]
+#define rEnvColorB regs[6]
+#define rEnvColorA regs[7]
+#define rRandXZ regs[8]
+#define rScale regs[9]
+#define rLifespan regs[10]
#define PARAMS ((EffectSsDtBubbleInitParams*)initParamsx)
-s32 EffectSsDtBubble_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsDtBubble_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsDtBubble_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsDtBubble_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
+static Color_RGBA8 sPrimColors[] = {
+ { 255, 255, 100, 255 },
+ { 150, 255, 255, 255 },
+ { 100, 255, 255, 255 },
+ { 255, 255, 255, 255 },
+};
+
+static Color_RGBA8 sEnvColors[] = {
+ { 170, 0, 0, 255 },
+ { 0, 100, 0, 255 },
+ { 0, 0, 255, 255 },
+ { 150, 150, 150, 0 },
+};
+
const EffectSsInit Effect_Ss_Dt_Bubble_InitVars = {
EFFECT_SS_DT_BUBBLE,
EffectSsDtBubble_Init,
};
-#endif
+u32 EffectSsDtBubble_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsDtBubbleInitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dt_Bubble/EffectSsDtBubble_Init.s")
+ {
+ TexturePtr tex = (Rand_ZeroOne() < 0.5f) ? gEffBubble1Tex : gEffBubble2Tex;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dt_Bubble/EffectSsDtBubble_Draw.s")
+ this->gfx = VIRTUAL_TO_PHYSICAL(SEGMENTED_TO_VIRTUAL(tex));
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dt_Bubble/EffectSsDtBubble_Update.s")
+ Math_Vec3f_Copy(&this->pos, &initParams->pos);
+ Math_Vec3f_Copy(&this->velocity, &initParams->velocity);
+ Math_Vec3f_Copy(&this->accel, &initParams->accel);
+ this->life = initParams->life;
+
+ if (!initParams->customColor) {
+ this->rPrimColorR = sPrimColors[initParams->colorProfile].r;
+ this->rPrimColorG = sPrimColors[initParams->colorProfile].g;
+ this->rPrimColorB = sPrimColors[initParams->colorProfile].b;
+ this->rPrimColorA = sPrimColors[initParams->colorProfile].a;
+ this->rEnvColorR = sEnvColors[initParams->colorProfile].r;
+ this->rEnvColorG = sEnvColors[initParams->colorProfile].g;
+ this->rEnvColorB = sEnvColors[initParams->colorProfile].b;
+ this->rEnvColorA = sEnvColors[initParams->colorProfile].a;
+ } else {
+ this->rPrimColorR = initParams->primColor.r;
+ this->rPrimColorG = initParams->primColor.g;
+ this->rPrimColorB = initParams->primColor.b;
+ this->rPrimColorA = initParams->primColor.a;
+ this->rEnvColorR = initParams->envColor.r;
+ this->rEnvColorG = initParams->envColor.g;
+ this->rEnvColorB = initParams->envColor.b;
+ this->rEnvColorA = initParams->envColor.a;
+ }
+
+ this->rRandXZ = initParams->randXZ;
+ this->rScale = initParams->scale;
+ this->rLifespan = initParams->life;
+ this->draw = EffectSsDtBubble_Draw;
+ this->update = EffectSsDtBubble_Update;
+
+ return 1;
+}
+
+void EffectSsDtBubble_Draw(PlayState* play, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ f32 scale;
+
+ OPEN_DISPS(gfxCtx);
+
+ scale = this->rScale * 0.004f;
+ Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ func_8012C28C(gfxCtx);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
+ (this->rPrimColorA * this->life) / this->rLifespan);
+ gDPSetEnvColor(POLY_OPA_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB,
+ (this->rEnvColorA * this->life) / this->rLifespan);
+ gSPSegment(POLY_OPA_DISP++, 0x08, this->gfx);
+ gSPDisplayList(POLY_OPA_DISP++, gEffBubbleDL);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectSsDtBubble_Update(PlayState* play, u32 index, EffectSs* this) {
+ if (this->rRandXZ == true) {
+ this->pos.x += (Rand_ZeroOne() * 2.0f) - 1.0f;
+ this->pos.z += (Rand_ZeroOne() * 2.0f) - 1.0f;
+ }
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.h b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.h
index 75847c0c47..e572f4a2c3 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.h
@@ -3,6 +3,13 @@
#include "global.h"
+typedef enum {
+ /* 0 */ DTBUBBLE_COLOR_PROFILE_RED,
+ /* 1 */ DTBUBBLE_COLOR_PROFILE_GREEN,
+ /* 2 */ DTBUBBLE_COLOR_PROFILE_BLUE,
+ /* 3 */ DTBUBBLE_COLOR_PROFILE_CLEAR
+} DtBubbleColorProfile;
+
typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f velocity;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
index c3a72bb7fb..7a2274a5df 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
@@ -1,30 +1,192 @@
/*
* File: z_eff_ss_dust.c
* Overlay: ovl_Effect_Ss_Dust
- * Description:
+ * Description: Dust Particle Effect
*/
#include "z_eff_ss_dust.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define rPrimColorR regs[0]
+#define rPrimColorG regs[1]
+#define rPrimColorB regs[2]
+#define rPrimColorA regs[3]
+#define rEnvColorR regs[4]
+#define rEnvColorG regs[5]
+#define rEnvColorB regs[6]
+#define rEnvColorA regs[7]
+#define rTexIndex regs[8] // this reg is also used to set specific colors in the fire update function
+#define rScale regs[9]
+#define rScaleStep regs[10]
+#define rDrawFlags regs[11]
+#define rLifespan regs[12]
#define PARAMS ((EffectSsDustInitParams*)initParamsx)
-s32 EffectSsDust_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
-void func_809776BC(PlayState* play, u32 index, EffectSs* this);
-void func_809777B4(PlayState* play, u32 index, EffectSs* this);
+u32 EffectSsDust_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+void EffectSsDust_Update(PlayState* play, u32 index, EffectSs* this);
+void EffectSsDust_UpdateFire(PlayState* play, u32 index, EffectSs* this);
void EffectSsDust_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_Dust_InitVars = {
EFFECT_SS_DUST,
EffectSsDust_Init,
};
-#endif
+static EffectSsUpdateFunc sUpdateFuncs[] = {
+ EffectSsDust_Update,
+ EffectSsDust_UpdateFire,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dust/EffectSsDust_Init.s")
+static TexturePtr sDustTextures[] = {
+ gEffDust1Tex, gEffDust2Tex, gEffDust3Tex, gEffDust4Tex, gEffDust5Tex, gEffDust6Tex, gEffDust7Tex, gEffDust8Tex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dust/EffectSsDust_Draw.s")
+u32 EffectSsDust_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsDustInitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dust/func_809776BC.s")
+ Math_Vec3f_Copy(&this->pos, &initParams->pos);
+ Math_Vec3f_Copy(&this->velocity, &initParams->velocity);
+ Math_Vec3f_Copy(&this->accel, &initParams->accel);
+ this->gfx = gEffDustDL;
+ this->life = initParams->life;
+ this->update = sUpdateFuncs[initParams->updateMode];
+ this->draw = EffectSsDust_Draw;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Dust/func_809777B4.s")
+ if (initParams->drawFlags & DUST_DRAWFLAG_RAND_COLOR_OFFSET) {
+ s32 randColorOffset = Rand_ZeroOne() * 20.0f - 10.0f;
+
+ this->rPrimColorR = initParams->primColor.r + randColorOffset;
+ this->rPrimColorG = initParams->primColor.g + randColorOffset;
+ this->rPrimColorB = initParams->primColor.b + randColorOffset;
+ this->rEnvColorR = initParams->envColor.r + randColorOffset;
+ this->rEnvColorG = initParams->envColor.g + randColorOffset;
+ this->rEnvColorB = initParams->envColor.b + randColorOffset;
+ } else {
+ this->rPrimColorR = initParams->primColor.r;
+ this->rPrimColorG = initParams->primColor.g;
+ this->rPrimColorB = initParams->primColor.b;
+ this->rEnvColorR = initParams->envColor.r;
+ this->rEnvColorG = initParams->envColor.g;
+ this->rEnvColorB = initParams->envColor.b;
+ }
+
+ this->rPrimColorA = initParams->primColor.a;
+ this->rEnvColorA = initParams->envColor.a;
+ this->rTexIndex = 0;
+ this->rScale = initParams->scale;
+ this->rScaleStep = initParams->scaleStep;
+ this->rLifespan = initParams->life;
+ this->rDrawFlags = initParams->drawFlags;
+
+ return 1;
+}
+
+void EffectSsDust_Draw(PlayState* play, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ MtxF mfTrans;
+ MtxF mfScale;
+ MtxF mfResult;
+ MtxF mfTransBillboard;
+ s32 pad;
+ Mtx* mtx;
+ f32 scale;
+
+ OPEN_DISPS(gfxCtx);
+
+ scale = this->rScale * 0.0025f;
+ SkinMatrix_SetTranslate(&mfTrans, this->pos.x, this->pos.y, this->pos.z);
+ SkinMatrix_SetScale(&mfScale, scale, scale, 1.0f);
+ SkinMatrix_MtxFMtxFMult(&mfTrans, &play->billboardMtxF, &mfTransBillboard);
+ SkinMatrix_MtxFMtxFMult(&mfTransBillboard, &mfScale, &mfResult);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
+
+ if (mtx != NULL) {
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[this->rTexIndex]));
+ POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ if (this->rDrawFlags & DUST_DRAWFLAG1) {
+ gDPSetCombineLERP(POLY_XLU_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0,
+ COMBINED, 0, SHADE, 0, 0, 0, 0, COMBINED);
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
+ gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
+ } else if (this->rDrawFlags & DUST_DRAWFLAG2) {
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
+ gSPClearGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
+ } else { // DUST_DRAWFLAG0
+ gSPClearGeometryMode(POLY_XLU_DISP++, G_LIGHTING);
+ }
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
+ gSPDisplayList(POLY_XLU_DISP++, this->gfx);
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectSsDust_Update(PlayState* play, u32 index, EffectSs* this) {
+ this->accel.x = (Rand_ZeroOne() * 0.4f) - 0.2f;
+ this->accel.z = (Rand_ZeroOne() * 0.4f) - 0.2f;
+
+ if ((this->life <= this->rLifespan) && (this->life >= (this->rLifespan - 7))) {
+ if (this->rLifespan >= 5) {
+ this->rTexIndex = this->rLifespan - this->life;
+ } else {
+ this->rTexIndex = ((this->rLifespan - this->life) * (ARRAY_COUNT(sDustTextures) / this->rLifespan));
+ }
+ } else {
+ this->rTexIndex = ARRAY_COUNT(sDustTextures) - 1;
+ }
+
+ this->rScale += this->rScaleStep;
+}
+
+// this update mode is unused in the original game
+void EffectSsDust_UpdateFire(PlayState* play, u32 index, EffectSs* this) {
+ this->accel.x = (Rand_ZeroOne() * 0.4f) - 0.2f;
+ this->accel.z = (Rand_ZeroOne() * 0.4f) - 0.2f;
+
+ switch (this->rTexIndex) {
+ case 0:
+ this->rPrimColorR = 255;
+ this->rPrimColorG = 150;
+ this->rPrimColorB = 0;
+ this->rEnvColorR = 150;
+ this->rEnvColorG = 50;
+ this->rEnvColorB = 0;
+ break;
+ case 1:
+ this->rPrimColorR = 200;
+ this->rPrimColorG = 50;
+ this->rPrimColorB = 0;
+ this->rEnvColorR = 100;
+ this->rEnvColorG = 0;
+ this->rEnvColorB = 0;
+ break;
+ case 2:
+ this->rPrimColorR = 50;
+ this->rPrimColorG = 0;
+ this->rPrimColorB = 0;
+ this->rEnvColorR = 0;
+ this->rEnvColorG = 0;
+ this->rEnvColorB = 0;
+ break;
+ case 3:
+ this->rPrimColorR = 50;
+ this->rEnvColorR = this->rPrimColorG = this->rEnvColorG = this->rPrimColorB = this->rEnvColorB = 0;
+ break;
+ }
+
+ if (this->rTexIndex < (ARRAY_COUNT(sDustTextures) - 1)) {
+ this->rTexIndex++;
+ }
+
+ this->rScale += this->rScaleStep;
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.h b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.h
index 7e8bfbfb8e..410a143521 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.h
@@ -3,6 +3,16 @@
#include "global.h"
+#define DUST_DRAWFLAG0 (0)
+#define DUST_DRAWFLAG1 (1 << 0)
+#define DUST_DRAWFLAG2 (1 << 1)
+#define DUST_DRAWFLAG_RAND_COLOR_OFFSET (1 << 2)
+
+typedef enum {
+ /* 0 */ DUST_UPDATE_NORMAL,
+ /* 1 */ DUST_UPDATE_FIRE
+} DustUpdateMode;
+
typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f velocity;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c b/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
index 32d457d74e..ebc28b4694 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
@@ -66,7 +66,7 @@ void EffectSsIcePiece_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_RotateXS(this->rPitch, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
func_8012C2DC(play->state.gfxCtx);
- gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (s32)alpha & 0xFF);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)(s32)alpha);
func_800BCC68(&this->pos, play);
gSPSegment(
POLY_XLU_DISP++, 0x08,
diff --git a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
index 268f8e1a6e..4584cfab24 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
@@ -5,6 +5,7 @@
*/
#include "z_fbdemo_triforce.h"
+#include "assets/objects/object_fbdemo_triforce/ovl_fbdemo_triforce.c"
void* TransitionTriforce_Init(void* thisx);
void TransitionTriforce_Destroy(void* thisx);
@@ -15,35 +16,132 @@ void TransitionTriforce_SetType(void* thisx, s32 type);
void TransitionTriforce_SetColor(void* thisx, u32 color);
s32 TransitionTriforce_IsDone(void* thisx);
-#if 0
const TransitionInit TransitionTriforce_InitVars = {
- TransitionTriforce_Init,
- TransitionTriforce_Destroy,
- TransitionTriforce_Update,
- TransitionTriforce_Draw,
- TransitionTriforce_Start,
- TransitionTriforce_SetType,
- TransitionTriforce_SetColor,
- NULL,
+ TransitionTriforce_Init, TransitionTriforce_Destroy, TransitionTriforce_Update, TransitionTriforce_Draw,
+ TransitionTriforce_Start, TransitionTriforce_SetType, TransitionTriforce_SetColor, NULL,
TransitionTriforce_IsDone,
};
-#endif
+void TransitionTriforce_Start(void* thisx) {
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_Start.s")
+ switch (this->state) {
+ case STATE_SPIRAL_IN_SLOW:
+ case STATE_SPIRAL_IN_FAST:
+ this->transPos = 1.0f;
+ return;
+ }
+ this->transPos = 0.03f;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_Init.s")
+void* TransitionTriforce_Init(void* thisx) {
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_Destroy.s")
+ bzero(this, sizeof(TransitionTriforce));
+ guOrtho(&this->projection, -SCREEN_WIDTH / 2, SCREEN_WIDTH / 2, -SCREEN_HEIGHT / 2, SCREEN_HEIGHT / 2, -1000.0f,
+ 1000.0f, 1.0f);
+ this->transPos = 1.0f;
+ this->state = STATE_SPIRAL_IN_FAST;
+ this->step = 0.015f;
+ this->fadeType = TYPE_TRANSPARENT_TRIFORCE;
+ return this;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_Update.s")
+void TransitionTriforce_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_SetColor.s")
+void TransitionTriforce_Update(void* thisx, s32 updateRate) {
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_SetType.s")
+ for (i = updateRate; i > 0; i--) {
+ if (this->state == STATE_SPIRAL_IN_SLOW) {
+ this->transPos = CLAMP_MIN(this->transPos * (1.0f - this->step), 0.03f);
+ } else if (this->state == STATE_SPIRAL_IN_FAST) {
+ this->transPos = CLAMP_MIN(this->transPos - this->step, 0.03f);
+ } else if (this->state == STATE_SPIRAL_OUT_SLOW) {
+ this->transPos = CLAMP_MAX(this->transPos / (1.0f - this->step), 1.0f);
+ } else if (this->state == STATE_SPIRAL_OUT_FAST) {
+ this->transPos = CLAMP_MAX(this->transPos + this->step, 1.0f);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/func_80AC5280.s")
+void TransitionTriforce_SetColor(void* thisx, u32 color) {
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_Draw.s")
+ this->color.rgba = color;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_triforce/TransitionTriforce_IsDone.s")
+void TransitionTriforce_SetType(void* thisx, s32 type) {
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
+
+ this->fadeType = type;
+}
+
+void TransitionTriforce_SetState(void* thisx, s32 state) {
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
+
+ this->state = state;
+}
+
+void TransitionTriforce_Draw(void* thisx, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ Mtx* modelView;
+ s32 pad[2];
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
+ f32 rotation = this->transPos * 360.0f;
+
+ modelView = this->modelView[this->frame];
+ this->frame ^= 1;
+ guScale(&modelView[0], this->transPos * 0.625f, this->transPos * 0.625f, 1.0f);
+ guRotate(&modelView[1], rotation, 0.0f, 0.0f, 1.0f);
+ guTranslate(&modelView[2], 0.0f, 0.0f, 0.0f);
+ gDPPipeSync(gfx++);
+ gSPDisplayList(gfx++, sTriforceWipeDL);
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, this->color.rgba);
+ gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
+ gSPMatrix(gfx++, &this->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ gSPMatrix(gfx++, &modelView[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPMatrix(gfx++, &modelView[1], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+ gSPMatrix(gfx++, &modelView[2], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+ gSPVertex(gfx++, &sTriforceWipeVtx, ARRAY_COUNT(sTriforceWipeVtx), 0);
+ if (!TransitionTriforce_IsDone(this)) {
+ switch (this->fadeType) {
+ case TYPE_TRANSPARENT_TRIFORCE:
+ gSP2Triangles(gfx++, 0, 4, 5, 0, 4, 1, 3, 0);
+ gSP1Triangle(gfx++, 5, 3, 2, 0);
+ break;
+
+ case TYPE_FILLED_TRIFORCE:
+ gSP2Triangles(gfx++, 3, 4, 5, 0, 0, 2, 6, 0);
+ gSP2Triangles(gfx++, 0, 6, 7, 0, 1, 0, 7, 0);
+ gSP2Triangles(gfx++, 1, 7, 8, 0, 1, 8, 9, 0);
+ gSP2Triangles(gfx++, 1, 9, 2, 0, 2, 9, 6, 0);
+ break;
+ }
+
+ } else {
+ switch (this->fadeType) {
+ case TYPE_TRANSPARENT_TRIFORCE:
+ break;
+
+ case TYPE_FILLED_TRIFORCE:
+ gSP1Quadrangle(gfx++, 6, 7, 8, 9, 0);
+ break;
+ }
+ }
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+s32 TransitionTriforce_IsDone(void* thisx) {
+ TransitionTriforce* this = (TransitionTriforce*)thisx;
+
+ if ((this->state == STATE_SPIRAL_IN_SLOW) || (this->state == STATE_SPIRAL_IN_FAST)) {
+ return this->transPos <= 0.03f;
+ } else if ((this->state == STATE_SPIRAL_OUT_SLOW) || (this->state == STATE_SPIRAL_OUT_FAST)) {
+ return (this->transPos >= 1.0f);
+ }
+ return false;
+}
diff --git a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h
index 7d7dcae561..2637b32cfe 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h
+++ b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h
@@ -3,8 +3,29 @@
#include "global.h"
+typedef enum {
+ /* 0 */ STATE_NONE,
+ /* 1 */ STATE_SPIRAL_IN_SLOW,
+ /* 2 */ STATE_SPIRAL_IN_FAST,
+ /* 3 */ STATE_SPIRAL_OUT_SLOW,
+ /* 4 */ STATE_SPIRAL_OUT_FAST
+} FbTriforceState;
+
+typedef enum {
+ /* 0 */ TYPE_NONE,
+ /* 1 */ TYPE_TRANSPARENT_TRIFORCE,
+ /* 2 */ TYPE_FILLED_TRIFORCE
+} TriforceFadeType;
+
typedef struct {
- /* 0x0000 */ char unk_0[0x1E0];
+ /* 0x000 */ Color_RGBA8_u32 color;
+ /* 0x004 */ f32 transPos;
+ /* 0x008 */ f32 step;
+ /* 0x00C */ s32 state;
+ /* 0x010 */ s32 fadeType;
+ /* 0x018 */ Mtx projection;
+ /* 0x058 */ s32 frame;
+ /* 0x060 */ Mtx modelView[2][3];
} TransitionTriforce; // size = 0x1E0
extern const TransitionInit TransitionTriforce_InitVars;
diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
index eac0b8f59b..ad5230253a 100644
--- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
+++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
@@ -63,7 +63,7 @@ UNK_TYPE D_808158E0[] = {
0x00000001, 0x00000000,
};
-void Daytelop_Update(DaytelopContext* this, GameState* gameState) {
+void DayTelop_Update(DayTelopState* this, GameState* thisx) {
static u8 D_80815FF0 = 0;
s16 new_var;
u8 temp_v0_2;
@@ -77,12 +77,9 @@ void Daytelop_Update(DaytelopContext* this, GameState* gameState) {
gSaveContext.save.day = 1;
}
- {
- GameState* state = &this->state;
- state->running = 0;
- }
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
- SET_NEXT_GAMESTATE(&this->state, Play_Init, PlayState);
gSaveContext.save.time = CLOCK_TIME(6, 0);
D_801BDBC8 = 0xFE;
} else if (this->transitionCountdown == 90) {
@@ -126,7 +123,7 @@ TexturePtr sHoursLeftTextures[] = {
gDaytelop24HoursNESTex,
};
-void Daytelop_Draw(DaytelopContext* this) {
+void DayTelop_Draw(DayTelopState* this) {
GraphicsContext* gfxCtx = this->state.gfxCtx;
OPEN_DISPS(gfxCtx);
@@ -187,11 +184,11 @@ void Daytelop_Draw(DaytelopContext* this) {
0x0400, 0x0400);
}
- CLOSE_DISPS(this->state.gfxCtx);
+ CLOSE_DISPS(gfxCtx);
}
-void Daytelop_Main(GameState* thisx) {
- DaytelopContext* this = (DaytelopContext*)thisx;
+void DayTelop_Main(GameState* thisx) {
+ DayTelopState* this = (DayTelopState*)thisx;
func_8012CF0C(this->state.gfxCtx, true, true, 0, 0, 0);
@@ -200,18 +197,18 @@ void Daytelop_Main(GameState* thisx) {
gSPSegment(POLY_OPA_DISP++, 0x0C, this->gameoverStaticFile);
CLOSE_DISPS(this->state.gfxCtx);
- Daytelop_Draw(this);
- Daytelop_Update(this, &this->state);
+ DayTelop_Draw(this);
+ DayTelop_Update(this, &this->state);
}
-void Daytelop_Destroy(GameState* thisx) {
+void DayTelop_Destroy(GameState* thisx) {
ShrinkWindow_Destroy();
}
-void Daytelop_nop80815770(DaytelopContext* this) {
+void DayTelop_Noop(DayTelopState* this) {
}
-void Daytelop_LoadGraphics(DaytelopContext* this) {
+void DayTelop_LoadGraphics(DayTelopState* this) {
size_t segmentSize = SEGMENT_ROM_SIZE(daytelop_static);
this->daytelopStaticFile = THA_AllocEndAlign16(&this->state.heap, segmentSize);
@@ -222,15 +219,15 @@ void Daytelop_LoadGraphics(DaytelopContext* this) {
DmaMgr_SendRequest0(this->gameoverStaticFile, SEGMENT_ROM_START(icon_item_gameover_static), segmentSize);
}
-void Daytelop_Init(GameState* thisx) {
- DaytelopContext* this = (DaytelopContext*)thisx;
+void DayTelop_Init(GameState* thisx) {
+ DayTelopState* this = (DayTelopState*)thisx;
- Game_SetFramerateDivisor(thisx, 1);
- Matrix_Init(thisx);
+ Game_SetFramerateDivisor(&this->state, 1);
+ Matrix_Init(&this->state);
ShrinkWindow_Destroy();
- View_Init(&this->view, thisx->gfxCtx);
- thisx->main = Daytelop_Main;
- thisx->destroy = Daytelop_Destroy;
+ View_Init(&this->view, this->state.gfxCtx);
+ this->state.main = DayTelop_Main;
+ this->state.destroy = DayTelop_Destroy;
this->transitionCountdown = 140;
this->fadeInState = DAYTELOP_HOURSTEXT_OFF;
@@ -241,7 +238,7 @@ void Daytelop_Init(GameState* thisx) {
Sram_IncrementDay();
}
- Daytelop_nop80815770(this);
- Daytelop_LoadGraphics(this);
+ DayTelop_Noop(this);
+ DayTelop_LoadGraphics(this);
play_sound(NA_SE_OC_TELOP_IMPACT);
}
diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.h b/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
index d77a5f334f..a7350e8984 100644
--- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
+++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
@@ -3,8 +3,8 @@
#include "global.h"
-void Daytelop_Init(GameState* thisx);
-void Daytelop_Destroy(GameState* thisx);
+void DayTelop_Init(GameState* thisx);
+void DayTelop_Destroy(GameState* thisx);
typedef struct {
/* 0x000 */ GameState state;
@@ -16,12 +16,12 @@ typedef struct {
/* 0x240 */ s16 transitionCountdown;
/* 0x242 */ s16 fadeInState;
/* 0x244 */ s16 alpha;
-} DaytelopContext; // size = 0x248
+} DayTelopState; // size = 0x248
typedef enum {
/* 0 */ DAYTELOP_HOURSTEXT_OFF,
/* 1 */ DAYTELOP_HOURSTEXT_FADEIN,
/* 2 */ DAYTELOP_HOURSTEXT_ON
-} Daytelop_FadeState;
+} DaytelopFadeState;
#endif
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose.h b/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
index 4184ca5760..f3231ec56b 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
@@ -3,10 +3,10 @@
#include "global.h"
-void FileChoose_Init(GameState* thisx);
-void FileChoose_Destroy(GameState* thisx);
+void FileSelect_Init(GameState* thisx);
+void FileSelect_Destroy(GameState* thisx);
-typedef struct FileChooseContext {
+typedef struct FileSelectState {
/* 0x00000 */ GameState state;
/* 0x000A4 */ Vtx* unk_A4;
/* 0x000A8 */ u8* staticSegment;
@@ -110,6 +110,6 @@ typedef struct FileChooseContext {
/* 0x2454C */ s16 unk_2454C;
/* 0x2454E */ s16 unk_2454E;
/* 0x24550 */ s16 unk_24550;
-} FileChooseContext; // size = 0x24558
+} FileSelectState; // size = 0x24558
#endif
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
index 62ea8ef7e1..657a2530f0 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
@@ -19,15 +19,15 @@ extern GfxMasterList D_0E000000;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BC20.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileChoose_nop8080bc44.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_nop8080bc44.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileChoose_nop8080BC4C.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_nop8080BC4C.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BC58.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BDAC.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileChoose_RenderView.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_RenderView.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BE60.s")
@@ -85,13 +85,13 @@ extern GfxMasterList D_0E000000;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812ED0.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileChoose_UpdateAndDrawSkybox.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_UpdateAndDrawSkybox.s")
-void FileChoose_Main(GameState* thisx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileChoose_Main.s")
+void FileSelect_Main(GameState* thisx);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Main.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80813908.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileChoose_Destroy.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Destroy.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileChoose_Init.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Init.s")
diff --git a/src/overlays/gamestates/ovl_opening/z_opening.c b/src/overlays/gamestates/ovl_opening/z_opening.c
index bc5e469407..b7e5ec3788 100644
--- a/src/overlays/gamestates/ovl_opening/z_opening.c
+++ b/src/overlays/gamestates/ovl_opening/z_opening.c
@@ -6,55 +6,53 @@
#include "z_opening.h"
-void Opening_SetupForTitleCutscene(OpeningContext* this) {
- static s32 openingEntrances[] = { ENTRANCE(CUTSCENE, 0), ENTRANCE(CUTSCENE, 1) };
- static s32 openingCutscenes[] = { 0xFFFA, 0xFFFA };
+void TitleSetup_SetupTitleScreen(TitleSetupState* this) {
+ static s32 sOpeningEntrances[] = { ENTRANCE(CUTSCENE, 0), ENTRANCE(CUTSCENE, 1) };
+ static s32 sOpeningCutscenes[] = { 0xFFFA, 0xFFFA };
gSaveContext.eventInf[1] &= (u8)~0x80;
gSaveContext.gameMode = 1;
Sram_InitNewSave();
- gSaveContext.save.entrance = openingEntrances[D_801BB12C];
- gSaveContext.nextCutsceneIndex = gSaveContext.save.cutscene = openingCutscenes[D_801BB12C];
+ gSaveContext.save.entrance = sOpeningEntrances[D_801BB12C];
+ gSaveContext.nextCutsceneIndex = gSaveContext.save.cutscene = sOpeningCutscenes[D_801BB12C];
gSaveContext.sceneSetupIndex = 0;
gSaveContext.save.time = CLOCK_TIME(8, 0);
gSaveContext.save.day = 1;
- {
- GameState* thisx = &this->gameState;
- thisx->running = false;
- }
- SET_NEXT_GAMESTATE(&this->gameState, Play_Init, PlayState);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
+
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
}
-void func_80803EA0(OpeningContext* this) {
+void func_80803EA0(TitleSetupState* this) {
SREG(33) |= 1;
}
-void Opening_Main(GameState* thisx) {
- OpeningContext* this = (OpeningContext*)thisx;
+void TitleSetup_Main(GameState* thisx) {
+ TitleSetupState* this = (TitleSetupState*)thisx;
- func_8012CF0C(this->gameState.gfxCtx, false, true, 0, 0, 0);
- Opening_SetupForTitleCutscene(this);
+ func_8012CF0C(this->state.gfxCtx, false, true, 0, 0, 0);
+ TitleSetup_SetupTitleScreen(this);
func_80803EA0(this);
}
-void Opening_Destroy(GameState* thisx) {
+void TitleSetup_Destroy(GameState* thisx) {
ShrinkWindow_Destroy();
}
-void Opening_Init(GameState* thisx) {
- OpeningContext* this = (OpeningContext*)thisx;
+void TitleSetup_Init(GameState* thisx) {
+ TitleSetupState* this = (TitleSetupState*)thisx;
- Game_SetFramerateDivisor(&this->gameState, 1);
- Matrix_Init(&this->gameState);
+ Game_SetFramerateDivisor(&this->state, 1);
+ Matrix_Init(&this->state);
ShrinkWindow_Init();
- View_Init(&this->view, this->gameState.gfxCtx);
- this->gameState.main = Opening_Main;
- this->gameState.destroy = Opening_Destroy;
+ View_Init(&this->view, this->state.gfxCtx);
+ this->state.main = TitleSetup_Main;
+ this->state.destroy = TitleSetup_Destroy;
gSaveContext.respawnFlag = 0;
gSaveContext.respawn[RESPAWN_MODE_GORON].entrance = 0xFF;
diff --git a/src/overlays/gamestates/ovl_opening/z_opening.h b/src/overlays/gamestates/ovl_opening/z_opening.h
index 809767fe48..36a01ffe93 100644
--- a/src/overlays/gamestates/ovl_opening/z_opening.h
+++ b/src/overlays/gamestates/ovl_opening/z_opening.h
@@ -3,13 +3,13 @@
#include "global.h"
-void Opening_Init(GameState* thisx);
-void Opening_Destroy(GameState* thisx);
+void TitleSetup_Init(GameState* thisx);
+void TitleSetup_Destroy(GameState* thisx);
typedef struct {
- /* 0x000 */ GameState gameState;
+ /* 0x000 */ GameState state;
/* 0x0A4 */ UNK_TYPE1 unk_A4[0x4];
/* 0x0A8 */ View view;
-} OpeningContext; // size = 0x210
+} TitleSetupState; // size = 0x210
#endif
diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c
index 1860dc5056..9fd81dcd85 100644
--- a/src/overlays/gamestates/ovl_select/z_select.c
+++ b/src/overlays/gamestates/ovl_select/z_select.c
@@ -8,13 +8,9 @@
#include "libc/alloca.h"
#include "overlays/gamestates/ovl_title/z_title.h"
-void MapSelect_LoadTitle(MapSelectState* this) {
- {
- GameState* gameState = &this->state;
- gameState->running = false;
- }
-
- SET_NEXT_GAMESTATE(&this->state, Title_Init, TitleContext);
+void MapSelect_LoadConsoleLogo(MapSelectState* this) {
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, ConsoleLogo_Init, sizeof(ConsoleLogoState));
}
void MapSelect_LoadGame(MapSelectState* this, u32 entrance, s32 spawn) {
@@ -55,11 +51,8 @@ void MapSelect_LoadGame(MapSelectState* this, u32 entrance, s32 spawn) {
gSaveContext.respawn[RESPAWN_MODE_HUMAN].entrance = 0xFF;
gWeatherMode = 0;
- do {
- GameState* gameState = &this->state;
- gameState->running = false;
- } while (0);
- SET_NEXT_GAMESTATE(&this->state, Play_Init, PlayState);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
}
// "Translation" (Actual name)
@@ -501,7 +494,7 @@ static SceneSelectEntry sScenes[] = {
{ "X 1:SPOT00", MapSelect_LoadGame, ENTRANCE(CUTSCENE, 0) },
// "Title" (Title Screen)
- { "title", (void*)MapSelect_LoadTitle, 0 },
+ { "title", (void*)MapSelect_LoadConsoleLogo, 0 },
};
void MapSelect_UpdateMenu(MapSelectState* this) {
diff --git a/src/overlays/gamestates/ovl_select/z_select.h b/src/overlays/gamestates/ovl_select/z_select.h
index efe5f99455..69312e9869 100644
--- a/src/overlays/gamestates/ovl_select/z_select.h
+++ b/src/overlays/gamestates/ovl_select/z_select.h
@@ -5,11 +5,11 @@
struct MapSelectState;
-typedef void (*Select_LoadFunc)(struct MapSelectState*, u32, s32);
+typedef void (*SelectLoadFunc)(struct MapSelectState*, u32, s32);
typedef struct {
/* 0x00 */ char* name;
- /* 0x04 */ Select_LoadFunc loadFunc;
+ /* 0x04 */ SelectLoadFunc loadFunc;
/* 0x08 */ s32 entrance;
} SceneSelectEntry; // size = 0xC
diff --git a/src/overlays/gamestates/ovl_title/z_title.c b/src/overlays/gamestates/ovl_title/z_title.c
index 027c57cea0..c439333b24 100644
--- a/src/overlays/gamestates/ovl_title/z_title.c
+++ b/src/overlays/gamestates/ovl_title/z_title.c
@@ -8,7 +8,7 @@
#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "misc/nintendo_rogo_static/nintendo_rogo_static.h"
-void Title_UpdateCounters(TitleContext* this) {
+void ConsoleLogo_UpdateCounters(ConsoleLogoState* this) {
if ((this->coverAlpha == 0) && (this->visibleDuration != 0)) {
this->timer--;
this->visibleDuration--;
@@ -32,7 +32,7 @@ void Title_UpdateCounters(TitleContext* this) {
this->ult++;
}
-void Title_RenderView(TitleContext* this, f32 x, f32 y, f32 z) {
+void ConsoleLogo_RenderView(ConsoleLogoState* this, f32 x, f32 y, f32 z) {
View* view = &this->view;
Vec3f eye;
Vec3f at;
@@ -49,10 +49,10 @@ void Title_RenderView(TitleContext* this, f32 x, f32 y, f32 z) {
View_RenderView(view, 0xF);
}
-void Title_Draw(GameState* thisx) {
- static s16 titleRotation = 0;
+void ConsoleLogo_Draw(GameState* thisx) {
+ static s16 sTitleRotation = 0;
static Lights1 sTitleLights = gdSPDefLights1(100, 100, 100, 255, 255, 255, 69, 69, 69);
- TitleContext* this = (TitleContext*)thisx;
+ ConsoleLogoState* this = (ConsoleLogoState*)thisx;
u16 y;
u16 idx;
Vec3f lightDir;
@@ -60,7 +60,7 @@ void Title_Draw(GameState* thisx) {
Vec3f eye;
s32 pad[2];
- OPEN_DISPS(this->gameState.gfxCtx);
+ OPEN_DISPS(this->state.gfxCtx);
lightDir.x = 69.0f;
lightDir.y = 69.0f;
@@ -74,20 +74,20 @@ void Title_Draw(GameState* thisx) {
eye.y = 4002.5417f;
eye.z = 1119.0837f;
- Hilite_DrawOpa(&object, &eye, &lightDir, this->gameState.gfxCtx);
+ Hilite_DrawOpa(&object, &eye, &lightDir, this->state.gfxCtx);
gSPSetLights1(POLY_OPA_DISP++, sTitleLights);
- Title_RenderView(this, 0.0f, 150.0f, 300.0f);
- func_8012C28C(this->gameState.gfxCtx);
+ ConsoleLogo_RenderView(this, 0.0f, 150.0f, 300.0f);
+ func_8012C28C(this->state.gfxCtx);
Matrix_Translate(-53.0f, -5.0f, 0.0f, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZYX(0, titleRotation, 0, MTXMODE_APPLY);
+ Matrix_RotateZYX(0, sTitleRotation, 0, MTXMODE_APPLY);
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->gameState.gfxCtx), G_MTX_LOAD);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, gNintendo64LogoNDL);
- func_8012C628(this->gameState.gfxCtx);
+ func_8012C628(this->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
@@ -109,62 +109,58 @@ void Title_Draw(GameState* thisx) {
1 << 10, 1 << 10);
}
- Environment_FillScreen(this->gameState.gfxCtx, 0, 0, 0, this->coverAlpha, 2);
+ Environment_FillScreen(this->state.gfxCtx, 0, 0, 0, this->coverAlpha, 2);
- titleRotation += 300;
+ sTitleRotation += 300;
- CLOSE_DISPS(this->gameState.gfxCtx);
+ CLOSE_DISPS(this->state.gfxCtx);
}
-void Title_Main(GameState* thisx) {
- TitleContext* this = (TitleContext*)thisx;
+void ConsoleLogo_Main(GameState* thisx) {
+ ConsoleLogoState* this = (ConsoleLogoState*)thisx;
- func_8012CF0C(this->gameState.gfxCtx, true, true, 0, 0, 0);
+ func_8012CF0C(this->state.gfxCtx, true, true, 0, 0, 0);
- OPEN_DISPS(this->gameState.gfxCtx);
+ OPEN_DISPS(this->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x01, this->staticSegment);
- Title_UpdateCounters(this);
- Title_Draw(&this->gameState);
+ ConsoleLogo_UpdateCounters(this);
+ ConsoleLogo_Draw(&this->state);
if (this->exit) {
gSaveContext.seqIndex = (u8)NA_BGM_DISABLED;
gSaveContext.nightSeqIndex = 0xFF;
gSaveContext.gameMode = 1;
- {
- GameState* gameState = &this->gameState;
- gameState->running = false;
- }
- SET_NEXT_GAMESTATE(&this->gameState, Opening_Init, OpeningContext);
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, sizeof(TitleSetupState));
}
- CLOSE_DISPS(this->gameState.gfxCtx);
+ CLOSE_DISPS(this->state.gfxCtx);
}
-void Title_Destroy(GameState* thisx) {
- TitleContext* this = (TitleContext*)thisx;
+void ConsoleLogo_Destroy(GameState* thisx) {
+ ConsoleLogoState* this = (ConsoleLogoState*)thisx;
- Sram_InitSram(&this->gameState, &this->sramCtx);
+ Sram_InitSram(&this->state, &this->sramCtx);
ShrinkWindow_Destroy();
CIC6105_Nop80081828();
}
-void Title_Init(GameState* thisx) {
- TitleContext* this = (TitleContext*)thisx;
- uintptr_t segmentSize =
- (uintptr_t)_nintendo_rogo_staticSegmentRomEnd - (uintptr_t)_nintendo_rogo_staticSegmentRomStart;
+void ConsoleLogo_Init(GameState* thisx) {
+ ConsoleLogoState* this = (ConsoleLogoState*)thisx;
+ uintptr_t segmentSize = SEGMENT_ROM_SIZE(nintendo_rogo_static);
- this->staticSegment = THA_AllocEndAlign16(&this->gameState.heap, segmentSize);
- DmaMgr_SendRequest0(this->staticSegment, (uintptr_t)_nintendo_rogo_staticSegmentRomStart, segmentSize);
+ this->staticSegment = THA_AllocEndAlign16(&this->state.heap, segmentSize);
+ DmaMgr_SendRequest0(this->staticSegment, SEGMENT_ROM_START(nintendo_rogo_static), segmentSize);
- Game_SetFramerateDivisor(thisx, 1);
- Matrix_Init(thisx);
+ Game_SetFramerateDivisor(&this->state, 1);
+ Matrix_Init(&this->state);
ShrinkWindow_Init();
- View_Init(&this->view, thisx->gfxCtx);
+ View_Init(&this->view, this->state.gfxCtx);
- thisx->main = Title_Main;
- thisx->destroy = Title_Destroy;
+ this->state.main = ConsoleLogo_Main;
+ this->state.destroy = ConsoleLogo_Destroy;
this->exit = false;
if (!(Padmgr_GetControllerBitmask() & 1)) {
diff --git a/src/overlays/gamestates/ovl_title/z_title.h b/src/overlays/gamestates/ovl_title/z_title.h
index 7f2f344254..0cb19da1a6 100644
--- a/src/overlays/gamestates/ovl_title/z_title.h
+++ b/src/overlays/gamestates/ovl_title/z_title.h
@@ -3,11 +3,11 @@
#include "global.h"
-void Title_Init(GameState* thisx);
-void Title_Destroy(GameState* thisx);
+void ConsoleLogo_Init(GameState* thisx);
+void ConsoleLogo_Destroy(GameState* thisx);
typedef struct {
- /* 0x000 */ GameState gameState;
+ /* 0x000 */ GameState state;
/* 0x0A4 */ u8* staticSegment;
/* 0x0A8 */ View view;
/* 0x210 */ SramContext sramCtx;
@@ -18,6 +18,6 @@ typedef struct {
/* 0x240 */ s16 ult;
/* 0x242 */ s16 uls;
/* 0x244 */ u8 exit;
-} TitleContext; // size = 0x248
+} ConsoleLogoState; // size = 0x248
#endif
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
index aa24bf2e22..f8f61c5dc4 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
@@ -50,18 +50,10 @@ s16 D_8082B6DC[] = {
0x0000,
};
-s32 D_8082B6E4[] = { 0, 0, 0 };
-
-s16 D_8082B6F0[] = { 100, 255 };
-
-s32 D_8082B6F4 = 0;
-
-s16 D_8082B6F8[] = { 10, 0, 0, 0 };
+s16 D_8082B6E4 = 0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_8081FF80.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808204AC.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80820FA4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821730.s")
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
new file mode 100644
index 0000000000..53453e8e78
--- /dev/null
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
@@ -0,0 +1,49 @@
+/*
+ * File: z_kaleido_prompt.c
+ * Overlay: ovl_kaleido_scope
+ * Description: Pause Menu - Save and Continue Prompt
+ */
+
+#include "z_kaleido_scope.h"
+
+s16 sPromptAlphaTargets[] = { 100, 255 };
+
+// Unused remnant of OoT
+void KaleidoScope_UpdatePrompt(PlayState* play) {
+ static s16 sPromptAlphaTargetIndex = 0;
+ static s16 sPromptAlphaTimer = 10;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ Input* input = CONTROLLER1(&play->state);
+ s8 relStickX = input->rel.stick_x;
+ s16 alphaStep;
+
+ if (((pauseCtx->state == 7) && (pauseCtx->unk_208 == 1)) || (pauseCtx->state == 0xE) || (pauseCtx->state == 0x11)) {
+
+ // Move the prompt
+ if ((pauseCtx->promptChoice == PAUSE_PROMPT_YES) && (relStickX >= 30)) {
+ // Move right to the no prompt
+ play_sound(NA_SE_SY_CURSOR);
+ pauseCtx->promptChoice = PAUSE_PROMPT_NO;
+ } else if ((pauseCtx->promptChoice != PAUSE_PROMPT_YES) && (relStickX <= -30)) {
+ // Move left to the yes prompt
+ play_sound(NA_SE_SY_CURSOR);
+ pauseCtx->promptChoice = PAUSE_PROMPT_YES;
+ }
+
+ // Update the alpha for the green glowing orb above the prompt
+ alphaStep = ABS_ALT(pauseCtx->promptAlpha - sPromptAlphaTargets[sPromptAlphaTargetIndex]) / sPromptAlphaTimer;
+
+ if (pauseCtx->promptAlpha >= sPromptAlphaTargets[sPromptAlphaTargetIndex]) {
+ pauseCtx->promptAlpha -= alphaStep;
+ } else {
+ pauseCtx->promptAlpha += alphaStep;
+ }
+
+ sPromptAlphaTimer--;
+ if (sPromptAlphaTimer == 0) {
+ pauseCtx->promptAlpha = sPromptAlphaTargets[sPromptAlphaTargetIndex];
+ sPromptAlphaTimer = sPromptAlphaTargetIndex + 20;
+ sPromptAlphaTargetIndex ^= 1;
+ }
+ }
+}
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
index f4c91e9e88..b4d2a192fe 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
@@ -18,6 +18,9 @@ typedef enum {
/* 3 */ DEBUG_EDITOR_EVENTS
} DebugEditor;
+#define PAUSE_PROMPT_YES 0
+#define PAUSE_PROMPT_NO 4
+
// Debug
void KaleidoScope_DrawInventoryEditor(PlayState* play);
void KaleidoScope_UpdateInventoryEditor(PlayState* play);
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index b60a767f5c..89196ea982 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -811,7 +811,7 @@
0x800B9084:("func_800B9084",),
0x800B9098:("func_800B9098",),
0x800B90AC:("func_800B90AC",),
- 0x800B90F4:("func_800B90F4",),
+ 0x800B90F4:("Actor_DeactivateLens",),
0x800B9120:("func_800B9120",),
0x800B9170:("Actor_InitContext",),
0x800B9334:("Actor_SpawnSetupActors",),
@@ -821,8 +821,8 @@
0x800B9D1C:("func_800B9D1C",),
0x800B9E3C:("Actor_DrawAllSetup",),
0x800B9E4C:("Actor_RecordUndrawnActor",),
- 0x800B9E84:("func_800B9E84",),
- 0x800B9EF4:("func_800B9EF4",),
+ 0x800B9E84:("Actor_DrawLensOverlay",),
+ 0x800B9EF4:("Actor_DrawLensActors",),
0x800BA2D8:("func_800BA2D8",),
0x800BA2FC:("func_800BA2FC",),
0x800BA42C:("Actor_DrawAll",),
@@ -2134,13 +2134,13 @@
0x801159C0:("Health_GiveHearts",),
0x801159EC:("Rupees_ChangeBy",),
0x80115A14:("Inventory_ChangeAmmo",),
- 0x80115D14:("Parameter_AddMagic",),
- 0x80115D5C:("func_80115D5C",),
- 0x80115DB4:("func_80115DB4",),
- 0x80116088:("func_80116088",),
- 0x80116114:("func_80116114",),
- 0x80116348:("func_80116348",),
- 0x80116918:("func_80116918",),
+ 0x80115D14:("Magic_Add",),
+ 0x80115D5C:("Magic_Reset",),
+ 0x80115DB4:("Magic_Consume",),
+ 0x80116088:("Magic_UpdateAddRequest",),
+ 0x80116114:("Magic_FlashMeterBorder",),
+ 0x80116348:("Magic_Update",),
+ 0x80116918:("Magic_DrawMeter",),
0x80116FD8:("func_80116FD8",),
0x801170B8:("func_801170B8",),
0x80117100:("func_80117100",),
@@ -3116,10 +3116,10 @@
0x80172ED0:("AudioMgr_ThreadEntry",),
0x80173048:("AudioMgr_Unlock",),
0x80173074:("AudioMgr_Init",),
- 0x80173130:("TitleSetup_GameStateResetContext",),
- 0x801732DC:("TitleSetup_InitImpl",),
- 0x8017332C:("TitleSetup_Destroy",),
- 0x80173338:("TitleSetup_Init",),
+ 0x80173130:("Setup_SetRegs",),
+ 0x801732DC:("Setup_InitImpl",),
+ 0x8017332C:("Setup_Destroy",),
+ 0x80173338:("Setup_Init",),
0x80173360:("Game_UpdateFramerateVariables",),
0x801733A8:("Game_SetFramerateDivisor",),
0x801733DC:("GameState_SetFBFilter",),
@@ -3134,8 +3134,8 @@
0x80173880:("GameState_Realloc",),
0x80173950:("GameState_Init",),
0x80173A50:("GameState_Destroy",),
- 0x80173B00:("GameState_GetNextStateInit",),
- 0x80173B0C:("GameState_GetNextStateSize",),
+ 0x80173B00:("GameState_GetInit",),
+ 0x80173B0C:("GameState_GetSize",),
0x80173B18:("GameState_IsRunning",),
0x80173B24:("GameState_GetArenaSize",),
0x80173B48:("func_80173B48",),
@@ -3546,8 +3546,8 @@
0x8018A808:("func_8018A808",),
0x8018ACC4:("func_8018ACC4",),
0x8018AE34:("func_8018AE34",),
- 0x8018B0F0:("func_8018B0F0",),
- 0x8018B10C:("func_8018B10C",),
+ 0x8018B0F0:("AudioHeap_CalculateAdsrDecay",),
+ 0x8018B10C:("AudioHeap_InitAdsrDecayTable",),
0x8018B250:("AudioHeap_ResetLoadStatus",),
0x8018B318:("AudioHeap_DiscardFont",),
0x8018B3FC:("AudioHeap_ReleaseNotesForFont",),
@@ -3560,16 +3560,16 @@
0x8018B640:("AudioHeap_AllocZeroed",),
0x8018B69C:("AudioHeap_TestAlloc",),
0x8018B6E8:("AudioHeap_Alloc",),
- 0x8018B740:("AudioHeap_AllocPoolInit",),
- 0x8018B768:("AudioHeap_ClearPersistentCache",),
- 0x8018B77C:("AudioHeap_ClearTemporaryCache",),
+ 0x8018B740:("AudioHeap_InitPool",),
+ 0x8018B768:("AudioHeap_InitPersistentCache",),
+ 0x8018B77C:("AudioHeap_InitTemporaryCache",),
0x8018B7AC:("AudioHeap_ResetPool",),
- 0x8018B7BC:("AudioHeap_PopCache",),
+ 0x8018B7BC:("AudioHeap_PopPersistentCache",),
0x8018B8FC:("AudioHeap_InitMainPool",),
0x8018B95C:("AudioHeap_InitSessionPool",),
0x8018B9E0:("AudioHeap_InitCachePool",),
- 0x8018BA64:("AudioHeap_InitPersistentCache",),
- 0x8018BB28:("AudioHeap_InitTemporaryCache",),
+ 0x8018BA64:("AudioHeap_InitPersistentPoolsAndCaches",),
+ 0x8018BB28:("AudioHeap_InitTemporaryPoolsAndCaches",),
0x8018BBEC:("AudioHeap_AllocCached",),
0x8018C380:("AudioHeap_SearchCaches",),
0x8018C3D8:("AudioHeap_SearchRegularCaches",),
@@ -3645,7 +3645,7 @@
0x80190B08:("AudioLoad_ProcessLoads",),
0x80190B38:("AudioLoad_SetDmaHandler",),
0x80190B44:("AudioLoad_SetUnusedHandler",),
- 0x80190B50:("AudioLoad_InitSoundFontMeta",),
+ 0x80190B50:("AudioLoad_InitSoundFont",),
0x80190BB0:("AudioLoad_Init",),
0x80190F50:("AudioLoad_InitSlowLoads",),
0x80190F64:("AudioLoad_SlowLoadSample",),
@@ -3731,10 +3731,10 @@
0x80194E60:("AudioPlayback_NoteInit",),
0x80194F20:("AudioPlayback_NoteDisable",),
0x80194F84:("AudioPlayback_ProcessNotes",),
- 0x801954CC:("AudioPlayback_InstrumentGetSound",),
+ 0x801954CC:("AudioPlayback_GetInstrumentTunedSample",),
0x80195508:("AudioPlayback_GetInstrumentInner",),
0x801955DC:("AudioPlayback_GetDrum",),
- 0x801956C0:("AudioPlayback_GetSfx",),
+ 0x801956C0:("AudioPlayback_GetSoundEffect",),
0x801957B4:("AudioPlayback_SetFontInstrument",),
0x801958F8:("AudioPlayback_SeqLayerDecayRelease",),
0x80195C40:("AudioPlayback_SeqLayerNoteDecay",),
@@ -4083,13 +4083,13 @@
0x801AA624:("GameOver_FadeLights",),
0x801AA68C:("GameOver_Update",),
0x801AAAA0:("func_801AAAA0",),
- 0x80800000:("Title_UpdateCounters",),
- 0x8080009C:("Title_RenderView",),
- 0x80800134:("Title_Draw",),
- 0x8080066C:("Title_Main",),
- 0x8080071C:("Title_Destroy",),
- 0x8080074C:("Title_Init",),
- 0x80800910:("MapSelect_LoadTitle",),
+ 0x80800000:("ConsoleLogo_UpdateCounters",),
+ 0x8080009C:("ConsoleLogo_RenderView",),
+ 0x80800134:("ConsoleLogo_Draw",),
+ 0x8080066C:("ConsoleLogo_Main",),
+ 0x8080071C:("ConsoleLogo_Destroy",),
+ 0x8080074C:("ConsoleLogo_Init",),
+ 0x80800910:("MapSelect_LoadConsoleLogo",),
0x80800930:("MapSelect_LoadGame",),
0x80800A44:("MapSelect_UpdateMenu",),
0x808013B8:("MapSelect_PrintMenu",),
@@ -4102,11 +4102,11 @@
0x80801AFC:("MapSelect_Main",),
0x80801B28:("MapSelect_Destroy",),
0x80801B4C:("MapSelect_Init",),
- 0x80803DF0:("Opening_SetupForTitleCutscene",),
+ 0x80803DF0:("TitleSetup_SetupTitleScreen",),
0x80803EA0:("func_80803EA0",),
- 0x80803EC0:("Opening_Main",),
- 0x80803F0C:("Opening_Destroy",),
- 0x80803F30:("Opening_Init",),
+ 0x80803EC0:("TitleSetup_Main",),
+ 0x80803F0C:("TitleSetup_Destroy",),
+ 0x80803F30:("TitleSetup_Init",),
0x80804010:("func_80804010",),
0x808041A0:("func_808041A0",),
0x80804654:("func_80804654",),
@@ -4152,11 +4152,11 @@
0x8080A708:("func_8080A708",),
0x8080BBFC:("func_8080BBFC",),
0x8080BC20:("func_8080BC20",),
- 0x8080BC44:("FileChoose_nop8080bc44",),
- 0x8080BC4C:("FileChoose_nop8080BC4C",),
+ 0x8080BC44:("FileSelect_nop8080bc44",),
+ 0x8080BC4C:("FileSelect_nop8080BC4C",),
0x8080BC58:("func_8080BC58",),
0x8080BDAC:("func_8080BDAC",),
- 0x8080BDDC:("FileChoose_RenderView",),
+ 0x8080BDDC:("FileSelect_RenderView",),
0x8080BE60:("func_8080BE60",),
0x8080C040:("func_8080C040",),
0x8080C228:("func_8080C228",),
@@ -4185,18 +4185,18 @@
0x80812D94:("func_80812D94",),
0x80812E94:("func_80812E94",),
0x80812ED0:("func_80812ED0",),
- 0x8081313C:("FileChoose_UpdateAndDrawSkybox",),
- 0x80813268:("FileChoose_Main",),
+ 0x8081313C:("FileSelect_UpdateAndDrawSkybox",),
+ 0x80813268:("FileSelect_Main",),
0x80813908:("func_80813908",),
- 0x80813C74:("FileChoose_Destroy",),
- 0x80813C98:("FileChoose_Init",),
- 0x80814EB0:("Daytelop_Update",),
- 0x80814FE8:("Daytelop_Draw",),
- 0x808156B4:("Daytelop_Main",),
- 0x8081574C:("Daytelop_Destroy",),
- 0x80815770:("Daytelop_nop80815770",),
- 0x8081577C:("Daytelop_LoadGraphics",),
- 0x80815820:("Daytelop_Init",),
+ 0x80813C74:("FileSelect_Destroy",),
+ 0x80813C98:("FileSelect_Init",),
+ 0x80814EB0:("DayTelop_Update",),
+ 0x80814FE8:("DayTelop_Draw",),
+ 0x808156B4:("DayTelop_Main",),
+ 0x8081574C:("DayTelop_Destroy",),
+ 0x80815770:("DayTelop_Noop",),
+ 0x8081577C:("DayTelop_LoadGraphics",),
+ 0x80815820:("DayTelop_Init",),
0x808160A0:("func_808160A0",),
0x80817B5C:("func_80817B5C",),
0x80818904:("func_80818904",),
@@ -4217,7 +4217,7 @@
0x8081FF80:("func_8081FF80",),
0x808204AC:("func_808204AC",),
0x80820FA4:("func_80820FA4",),
- 0x80821730:("func_80821730",),
+ 0x80821730:("KaleidoScope_UpdatePrompt",),
0x80821900:("func_80821900",),
0x8082192C:("func_8082192C",),
0x80821958:("func_80821958",),
@@ -5621,25 +5621,25 @@
0x8089F2C4:("func_8089F2C4",),
0x8089F380:("EnViewer_Update",),
0x8089F3C8:("EnViewer_Draw",),
- 0x8089F4E0:("func_8089F4E0",),
+ 0x8089F4E0:("EnBubble_SetDimensions",),
0x8089F59C:("func_8089F59C",),
0x8089F5D0:("func_8089F5D0",),
- 0x8089F5F4:("func_8089F5F4",),
- 0x8089F660:("func_8089F660",),
+ 0x8089F5F4:("EnBubble_DamagePlayer",),
+ 0x8089F660:("EnBubble_Explosion",),
0x8089F8BC:("func_8089F8BC",),
0x8089F908:("func_8089F908",),
- 0x8089F95C:("func_8089F95C",),
- 0x8089F9E4:("func_8089F9E4",),
- 0x8089FA54:("func_8089FA54",),
+ 0x8089F95C:("EnBubble_Vec3fNormalizedReflect",),
+ 0x8089F9E4:("EnBubble_Vec3fNormalize",),
+ 0x8089FA54:("EnBubble_Fly",),
0x8089FF30:("func_8089FF30",),
- 0x8089FFCC:("func_8089FFCC",),
+ 0x8089FFCC:("EnBubble_IsPopped",),
0x808A005C:("func_808A005C",),
0x808A0170:("EnBubble_Init",),
0x808A0270:("EnBubble_Destroy",),
- 0x808A029C:("func_808A029C",),
- 0x808A0350:("func_808A0350",),
- 0x808A03A0:("func_808A03A0",),
- 0x808A03E8:("func_808A03E8",),
+ 0x808A029C:("EnBubble_Wait",),
+ 0x808A0350:("EnBubble_Pop",),
+ 0x808A03A0:("EnBubble_Disappear",),
+ 0x808A03E8:("EnBubble_Regrow",),
0x808A0458:("EnBubble_Update",),
0x808A04D4:("EnBubble_Draw",),
0x808A08F0:("DoorShutter_SetupAction",),
@@ -7955,8 +7955,8 @@
0x80968CB8:("func_80968CB8",),
0x80968DD0:("func_80968DD0",),
0x80968E38:("func_80968E38",),
- 0x80968F48:("func_80968F48",),
- 0x809691B8:("func_809691B8",),
+ 0x80968F48:("EnJs_GetRemainingMasks",),
+ 0x809691B8:("EnJs_TakeMask",),
0x809692A8:("func_809692A8",),
0x8096933C:("func_8096933C",),
0x80969400:("func_80969400",),
@@ -8057,9 +8057,9 @@
0x80972680:("OceffSpot_SetupAction",),
0x8097268C:("OceffSpot_Init",),
0x809727EC:("OceffSpot_Destroy",),
- 0x80972844:("func_80972844",),
- 0x809728F8:("func_809728F8",),
- 0x80972934:("func_80972934",),
+ 0x80972844:("OceffSpot_End",),
+ 0x809728F8:("OceffSpot_Wait",),
+ 0x80972934:("OceffSpot_GrowCylinder",),
0x80972998:("OceffSpot_Update",),
0x80972C54:("OceffSpot_Draw",),
0x80973550:("EnTorch_Init",),
@@ -8129,16 +8129,16 @@
0x809765A0:("OceffWipe_Draw",),
0x80977210:("EffectSsDust_Init",),
0x80977394:("EffectSsDust_Draw",),
- 0x809776BC:("func_809776BC",),
- 0x809777B4:("func_809777B4",),
+ 0x809776BC:("EffectSsDust_Update",),
+ 0x809777B4:("EffectSsDust_UpdateFire",),
0x80977A00:("EffectSsKirakira_Init",),
0x80977B5C:("EffectSsKirakira_Draw",),
0x80977DB4:("func_80977DB4",),
0x80977E6C:("func_80977E6C",),
0x80977F28:("func_80977F28",),
0x80978070:("EffectSsBomb2_Init",),
- 0x80978138:("func_80978138",),
- 0x80978304:("func_80978304",),
+ 0x80978138:("EffectSsBomb2_DrawFade",),
+ 0x80978304:("EffectSsBomb2_DrawLayered",),
0x80978628:("EffectSsBomb2_Update",),
0x809788D0:("EffectSsBlast_Init",),
0x809789FC:("EffectSsBlast_Draw",),
@@ -8147,7 +8147,7 @@
0x80978D70:("EffectSsGSpk_Draw",),
0x80978F40:("EffectSsGSpk_Update",),
0x80979068:("EffectSsGSpk_UpdateNoAccel",),
- 0x809791B0:("func_809791B0",),
+ 0x809791B0:("EffectSsDFire_CheckForObject",),
0x80979228:("EffectSsDFire_Init",),
0x8097930C:("EffectSsDFire_Draw",),
0x809794D4:("EffectSsDFire_Update",),
@@ -11270,7 +11270,7 @@
0x80A8BFE0:("EnTrt_GetMushroom",),
0x80A8C168:("EnTrt_PayForMushroom",),
0x80A8C1E8:("EnTrt_Goodbye",),
- 0x80A8C288:("EnTrt_SetupTryToGiveRedPotion",),
+ 0x80A8C288:("EnTrt_StartRedPotionConversation",),
0x80A8C488:("EnTrt_GiveRedPotionForKoume",),
0x80A8C564:("EnTrt_GivenRedPotionForKoume",),
0x80A8C64C:("EnTrt_EndConversation",),
@@ -11327,8 +11327,8 @@
0x80A8F7AC:("EnTrt_Init",),
0x80A8F7E8:("EnTrt_Destroy",),
0x80A8F828:("EnTrt_Update",),
- 0x80A8F8C4:("EnTrt_UpdateHeadYawAndPitch",),
- 0x80A8FA00:("EnTrt_UpdateHeadPosAndRot",),
+ 0x80A8F8C4:("EnTrt_TrackPlayer",),
+ 0x80A8FA00:("EnTrt_UpdateLimb",),
0x80A8FB34:("EnTrt_OverrideLimbDraw",),
0x80A8FBB4:("EnTrt_PostLimbDraw",),
0x80A8FC64:("EnTrt_TransformLimbDraw",),
@@ -11956,7 +11956,7 @@
0x80AC5154:("TransitionTriforce_Update",),
0x80AC5268:("TransitionTriforce_SetColor",),
0x80AC5274:("TransitionTriforce_SetType",),
- 0x80AC5280:("func_80AC5280",),
+ 0x80AC5280:("TransitionTriforce_SetState",),
0x80AC528C:("TransitionTriforce_Draw",),
0x80AC559C:("TransitionTriforce_IsDone",),
0x80AC57B0:("TransitionWipe1_Start",),
@@ -12163,7 +12163,7 @@
0x80AD3054:("BgCtowerGear_UpdateOrgan",),
0x80AD3124:("BgCtowerGear_Draw",),
0x80AD3164:("BgCtowerGear_DrawOrgan",),
- 0x80AD3380:("func_80AD3380",),
+ 0x80AD3380:("EnTrt2_ChangeAnim",),
0x80AD341C:("func_80AD341C",),
0x80AD349C:("func_80AD349C",),
0x80AD3530:("func_80AD3530",),
@@ -14230,15 +14230,15 @@
0x80B64DFC:("func_80B64DFC",),
0x80B654C0:("ObjKendoKanban_Init",),
0x80B65840:("ObjKendoKanban_Destroy",),
- 0x80B65880:("func_80B65880",),
- 0x80B65894:("func_80B65894",),
- 0x80B658A4:("func_80B658A4",),
- 0x80B65CE0:("func_80B65CE0",),
- 0x80B65D54:("func_80B65D54",),
- 0x80B65D68:("func_80B65D68",),
- 0x80B65DA8:("func_80B65DA8",),
- 0x80B6618C:("func_80B6618C",),
- 0x80B66304:("func_80B66304",),
+ 0x80B65880:("ObjKendoKanban_SetupDoNothing",),
+ 0x80B65894:("ObjKendoKanban_DoNothing",),
+ 0x80B658A4:("ObjKendoKanban_SetupTumble",),
+ 0x80B65CE0:("ObjKendoKanban_Tumble",),
+ 0x80B65D54:("ObjKendoKanban_SetupSettled",),
+ 0x80B65D68:("ObjKendoKanban_Settled",),
+ 0x80B65DA8:("ObjKendoKanban_HandlePhysics",),
+ 0x80B6618C:("ObjKendoKanban_IsPlayerOnTop",),
+ 0x80B66304:("ObjKendoKanban_UpdateCollision",),
0x80B66418:("ObjKendoKanban_Update",),
0x80B66454:("ObjKendoKanban_Draw",),
0x80B66A20:("ObjHariko_Init",),
@@ -16430,8 +16430,8 @@
0x80BFC9E4:("EnRz_Update",),
0x80BFCAD0:("func_80BFCAD0",),
0x80BFCB3C:("EnRz_Draw",),
- 0x80BFCFA0:("func_80BFCFA0",),
- 0x80BFCFB8:("func_80BFCFB8",),
+ 0x80BFCFA0:("EnScopecoin_Spin",),
+ 0x80BFCFB8:("EnScopecoin_CheckCollectible",),
0x80BFD010:("EnScopecoin_Init",),
0x80BFD148:("EnScopecoin_Destroy",),
0x80BFD158:("EnScopecoin_Update",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index 18a6cae872..88712ed088 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -377,12 +377,12 @@
0x801ADEC0:("En_Item00_InitVars","ActorInit","",0x20),
0x801ADEE0:("enItem00CylinderInit","ColliderCylinderInit","",0x2c),
0x801ADF0C:("enItem00InitVars","ActorInitVar","[1]",0x4),
- 0x801ADF10:("D_801ADF10","ColorRGBA8","",0x4),
- 0x801ADF14:("D_801ADF14","ColorRGBA8","",0x4),
- 0x801ADF18:("D_801ADF18","Vec3f","",0xc),
- 0x801ADF24:("D_801ADF24","Vec3f","",0xc),
- 0x801ADF30:("D_801ADF30","UNK_PTR","[5]",0x14),
- 0x801ADF44:("D_801ADF44","UNK_PTR","[12]",0x30),
+ 0x801ADF10:("sEffectPrimColor","ColorRGBA8","",0x4),
+ 0x801ADF14:("sEffectEnvColor","ColorRGBA8","",0x4),
+ 0x801ADF18:("sEffectVelocity","Vec3f","",0xc),
+ 0x801ADF24:("sEffectAccel","Vec3f","",0xc),
+ 0x801ADF30:("sRupeeTextures","UNK_PTR","[5]",0x14),
+ 0x801ADF44:("sItemDropTextures","UNK_PTR","[12]",0x30),
0x801ADF74:("sDropTable","u8","[272]",0x110),
0x801AE084:("sDropTableAmounts","u8","[272]",0x110),
0x801AE194:("D_801AE194","s32","[32]",0x80),
@@ -1069,11 +1069,11 @@
0x801BF890:("sMinigameScoreDigits","UNK_TYPE2","",0x2),
0x801BF898:("sCUpInvisible","UNK_TYPE2","",0x2),
0x801BF89C:("sCUpTimer","UNK_TYPE2","",0x2),
- 0x801BF8A0:("sMagicBarOutlinePrimRed","UNK_TYPE2","",0x2),
- 0x801BF8A4:("sMagicBarOutlinePrimGreen","UNK_TYPE2","",0x2),
- 0x801BF8A8:("sMagicBarOutlinePrimBlue","UNK_TYPE2","",0x2),
- 0x801BF8AC:("D_801BF8AC","UNK_TYPE2","",0x2),
- 0x801BF8B0:("D_801BF8B0","UNK_TYPE2","",0x2),
+ 0x801BF8A0:("sMagicMeterOutlinePrimRed","UNK_TYPE2","",0x2),
+ 0x801BF8A4:("sMagicMeterOutlinePrimGreen","UNK_TYPE2","",0x2),
+ 0x801BF8A8:("sMagicMeterOutlinePrimBlue","UNK_TYPE2","",0x2),
+ 0x801BF8AC:("sMagicBorderRatio","UNK_TYPE2","",0x2),
+ 0x801BF8B0:("sMagicBorderStep","UNK_TYPE2","",0x2),
0x801BF8DC:("D_801BF8DC","UNK_TYPE2","",0x2),
0x801BF8E0:("D_801BF8E0","UNK_TYPE2","",0x2),
0x801BF8E4:("D_801BF8E4","UNK_TYPE2","",0x2),
@@ -3434,7 +3434,7 @@
0x801DE868:("D_801DE868","f32","",0x4),
0x801DE86C:("jtbl_801DE86C","UNK_PTR","",0x4),
0x801DE884:("D_801DE884","f32","",0x4),
- 0x801DE890:("D_801DE890","UNK_TYPE1","",0x1),
+ 0x801DE890:("gCircleTex","UNK_TYPE1","",0x1),
0x801DF090:("D_801DF090","f32","",0x4),
0x801DF094:("D_801DF094","f32","",0x4),
0x801DF0A0:("D_801DF0A0","f32","",0x4),
@@ -3814,7 +3814,7 @@
0x801E10B0:("jtbl_801E10B0","UNK_PTR","",0x4),
0x801E10C4:("jtbl_801E10C4","UNK_PTR","",0x4),
0x801E1100:("gAudioTatumInit","s16","[2]",0x4),
- 0x801E1104:("gAudioContextInitSizes","AudioContextInitSizes","",0xC),
+ 0x801E1104:("gAudioHeapInitSizes","AudioHeapInitSizes","",0xC),
0x801E1110:("sGameOverTimer","UNK_TYPE2","",0x2),
0x801E1120:("jtbl_801E1120","UNK_PTR","",0x4),
0x801E1180:("gSoundFontTable","UNK_TYPE2","",0x2),
@@ -4734,9 +4734,9 @@
0x8082B6D4:("D_8082B6D4","UNK_TYPE1","",0x1),
0x8082B6DC:("D_8082B6DC","UNK_TYPE1","",0x1),
0x8082B6E4:("D_8082B6E4","UNK_TYPE2","",0x2),
- 0x8082B6F0:("D_8082B6F0","UNK_TYPE1","",0x1),
- 0x8082B6F4:("D_8082B6F4","UNK_TYPE2","",0x2),
- 0x8082B6F8:("D_8082B6F8","UNK_TYPE2","",0x2),
+ 0x8082B6F0:("sPromptAlphaTargets","UNK_TYPE1","",0x1),
+ 0x8082B6F4:("sPromptAlphaTargetIndex","UNK_TYPE2","",0x2),
+ 0x8082B6F8:("sPromptAlphaTimer","UNK_TYPE2","",0x2),
0x8082B700:("D_8082B700","UNK_TYPE1","",0x1),
0x8082B73C:("D_8082B73C","UNK_TYPE1","",0x1),
0x8082B778:("D_8082B778","UNK_TYPE1","",0x1),
@@ -11090,10 +11090,10 @@
0x80A297D0:("D_80A297D0","f32","",0x4),
0x80A2B870:("D_80A2B870","UNK_TYPE1","",0x1),
0x80A2B88C:("Bg_Dblue_Movebg_InitVars","UNK_TYPE1","",0x1),
- 0x80A2B8AC:("D_80A2B8AC","UNK_TYPE1","",0x1),
- 0x80A2B8DC:("D_80A2B8DC","UNK_TYPE1","",0x1),
- 0x80A2B90C:("D_80A2B90C","UNK_TYPE1","",0x1),
- 0x80A2B93C:("D_80A2B93C","UNK_TYPE1","",0x1),
+ 0x80A2B8AC:("sOpaDLists","UNK_TYPE1","",0x1),
+ 0x80A2B8DC:("sXluDLists","UNK_TYPE1","",0x1),
+ 0x80A2B90C:("sColHeaders","UNK_TYPE1","",0x1),
+ 0x80A2B93C:("sTexAnims","UNK_TYPE1","",0x1),
0x80A2B96C:("D_80A2B96C","UNK_TYPE1","",0x1),
0x80A2B974:("D_80A2B974","UNK_TYPE2","",0x2),
0x80A2B978:("D_80A2B978","UNK_TYPE1","",0x1),
@@ -12339,7 +12339,7 @@
0x80A8B188:("D_80A8B188","UNK_TYPE1","",0x1),
0x80A8B250:("D_80A8B250","UNK_TYPE4","",0x4),
0x80A8B25C:("D_80A8B25C","Color_RGBA8","[6]",0x18),
- 0x80A8B280:("D_80A8B280","UNK_TYPE1","",0x1),
+ 0x80A8B280:("sDustTextures","UNK_TYPE1","",0x1),
0x80A8B2A0:("D_80A8B2A0","UNK_TYPE1","",0x1),
0x80A8B2CC:("D_80A8B2CC","UNK_TYPE1","",0x1),
0x80A8B2D8:("sAnimationInfo","UNK_TYPE1","",0x1),
@@ -12442,8 +12442,8 @@
0x80A9930C:("D_80A9930C","UNK_TYPE1","",0x1),
0x80A993AC:("D_80A993AC","UNK_TYPE1","",0x1),
0x80A993D0:("D_80A993D0","UNK_TYPE1","",0x1),
- 0x80A993F4:("D_80A993F4","UNK_TYPE1","",0x1),
- 0x80A99404:("D_80A99404","UNK_TYPE1","",0x1),
+ 0x80A993F4:("sYoungerBrotherEyeTextures","UNK_TYPE1","",0x1),
+ 0x80A99404:("sYoungerBrotherBeltTextures","UNK_TYPE1","",0x1),
0x80A99410:("D_80A99410","UNK_TYPE1","",0x1),
0x80A9941C:("D_80A9941C","UNK_TYPE1","",0x1),
0x80A99428:("D_80A99428","UNK_TYPE1","",0x1),
@@ -12926,8 +12926,8 @@
0x80AC4F60:("D_80AC4F60","f32","",0x4),
0x80AC4F64:("D_80AC4F64","f32","",0x4),
0x80AC5060:("D_80AC5060","UNK_TYPE1","",0x1),
- 0x80AC5630:("D_80AC5630","UNK_TYPE1","",0x1),
- 0x80AC5660:("D_80AC5660","UNK_TYPE1","",0x1),
+ 0x80AC5630:("sTriforceWipeDL","UNK_TYPE1","",0x1),
+ 0x80AC5660:("sTriforceWipeVtx","UNK_TYPE1","",0x1),
0x80AC5700:("TransitionTriforce_InitVars","UNK_PTR","",0x4),
0x80AC5730:("D_80AC5730","f32","",0x4),
0x80AC5734:("D_80AC5734","f32","",0x4),
@@ -13328,8 +13328,8 @@
0x80AF0050:("D_80AF0050","UNK_TYPE1","",0x1),
0x80AF00F0:("Bg_Market_Step_InitVars","UNK_TYPE1","",0x1),
0x80AF0110:("D_80AF0110","UNK_TYPE1","",0x1),
- 0x80AF0120:("D_80AF0120","UNK_TYPE1","",0x1),
- 0x80AF0128:("D_80AF0128","UNK_TYPE1","",0x1),
+ 0x80AF0120:("sMarketDLs","UNK_TYPE1","",0x1),
+ 0x80AF0128:("sBankAdvertisementsAndFakeDoorDLs","UNK_TYPE1","",0x1),
0x80AF0720:("Obj_Lupygamelift_InitVars","UNK_TYPE1","",0x1),
0x80AF0740:("D_80AF0740","UNK_TYPE1","",0x1),
0x80AF0750:("D_80AF0750","f32","",0x4),
@@ -15082,7 +15082,7 @@
0x80B82228:("D_80B82228","f32","",0x4),
0x80B8222C:("D_80B8222C","f32","",0x4),
0x80B83A00:("Bg_Dblue_Balance_InitVars","UNK_TYPE1","",0x1),
- 0x80B83A20:("D_80B83A20","UNK_TYPE4","",0x4),
+ 0x80B83A20:("sTypeInfo","UNK_TYPE4","",0x4),
0x80B83A74:("D_80B83A74","UNK_TYPE1","",0x1),
0x80B83A90:("D_80B83A90","UNK_TYPE1","",0x1),
0x80B83A92:("D_80B83A92","UNK_TYPE1","",0x1),
@@ -15288,9 +15288,9 @@
0x80B96178:("D_80B96178","UNK_TYPE1","",0x1),
0x80B963C0:("Obj_Jg_Gakki_InitVars","UNK_TYPE1","",0x1),
0x80B96540:("Bg_Inibs_Movebg_InitVars","UNK_TYPE1","",0x1),
- 0x80B96560:("D_80B96560","UNK_TYPE1","",0x1),
- 0x80B96568:("D_80B96568","UNK_TYPE1","",0x1),
- 0x80B96570:("D_80B96570","UNK_TYPE1","",0x1),
+ 0x80B96560:("sOpaDLists","UNK_TYPE1","",0x1),
+ 0x80B96568:("sXluDLists","UNK_TYPE1","",0x1),
+ 0x80B96570:("sSandTexAnims","UNK_TYPE1","",0x1),
0x80B96578:("D_80B96578","UNK_TYPE1","",0x1),
0x80B998C0:("En_Zot_InitVars","UNK_TYPE1","",0x1),
0x80B998E0:("D_80B998E0","UNK_TYPE1","",0x1),
@@ -16250,7 +16250,7 @@
0x80BFCD78:("D_80BFCD78","f32","",0x4),
0x80BFCD7C:("D_80BFCD7C","f32","",0x4),
0x80BFD260:("En_Scopecoin_InitVars","UNK_TYPE1","",0x1),
- 0x80BFD280:("D_80BFD280","UNK_TYPE1","",0x1),
+ 0x80BFD280:("sRupeeTextures","UNK_TYPE1","",0x1),
0x80BFDEA0:("D_80BFDEA0","UNK_TYPE1","",0x1),
0x80BFDEB4:("D_80BFDEB4","UNK_TYPE1","",0x1),
0x80BFDF28:("En_Bjt_InitVars","UNK_TYPE1","",0x1),
diff --git a/tools/namefixer.py b/tools/namefixer.py
index e7b0a10e02..af17edc3c7 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -283,6 +283,7 @@ wordReplace = {
"Actor_IsFacingPlayerAndWithinRange": "Actor_IsFacingAndNearPlayer",
"func_800BC8B8": "Actor_DrawDoorLock",
"func_800B86C8": "Actor_ChangeFocus",
+ "func_800B90F4": "Actor_DeactivateLens",
"zelda_malloc": "ZeldaArena_Malloc",
"zelda_mallocR": "ZeldaArena_MallocR",
"zelda_realloc": "ZeldaArena_Realloc",
@@ -498,6 +499,9 @@ wordReplace = {
"func_801159c0": "Health_GiveHearts",
"func_801159EC": "Rupees_ChangeBy",
"func_80115A14": "Inventory_ChangeAmmo",
+ "Parameter_AddMagic": "Magic_Add",
+ "func_80115D5C": "Magic_Reset",
+ "func_80115DB4": "Magic_Consume",
"func_8013EC44": "Rumble_Override",
"func_8013ECE0": "Rumble_Request",
"func_8017D2FC": "Math3D_LineSegVsPlane",
@@ -648,8 +652,8 @@ wordReplace = {
"gSaveContext.naviTimer": "gSaveContext.save.playerData.tatlTimer",
"gSaveContext.tatlTimer": "gSaveContext.save.playerData.tatlTimer",
"gSaveContext.rupees": "gSaveContext.save.playerData.rupees",
- "gSaveContext.magicAcquired": "gSaveContext.save.playerData.magicAcquired",
- "gSaveContext.doubleMagic": "gSaveContext.save.playerData.doubleMagic",
+ "gSaveContext.magicAcquired": "gSaveContext.save.playerData.isMagicAcquired",
+ "gSaveContext.doubleMagic": "gSaveContext.save.playerData.isDoubleMagicAcquired",
"gSaveContext.doubleDefense": "gSaveContext.save.playerData.doubleDefense",
"gSaveContext.playerName": "gSaveContext.save.playerData.playerName",
"gSaveContext.inventory": "gSaveContext.save.inventory",
@@ -671,6 +675,11 @@ wordReplace = {
"gSaveContext.unk_1016": "gSaveContext.jinxTimer",
"gSaveContext.unk_3F58": "gSaveContext.sunsSongState",
"gSaveContext.unk_48C8": "gSaveContext.dungeonIndex",
+ "gSaveContext.save.playerData.magicAcquired": "gSaveContext.save.playerData.isMagicAcquired",
+ "gSaveContext.save.playerDatadoubleMagic": "gSaveContext.save.playerData.isDoubleMagicAcquired",
+ "gSaveContext.unk_3F28": "gSaveContext.magicState",
+ "gSaveContext.unk_3F30": "gSaveContext.magicFillTarget",
+ "gSaveContext.unk_3F2C": "gSaveContext.magicFlag",
"gSaveContext.save.entranceIndex": "gSaveContext.save.entrance",
"player->unk_A87": "player->exchangeItemId",
@@ -698,12 +707,17 @@ wordReplace = {
"globalCtx->envCtx.unk_DC": "play->envCtx.lightBlend",
"globalCtx->interfaceCtx.unk_21E": "play->interfaceCtx.bButtonDoAction",
+ # "play->actorCtx.flags": "play->actorCtx.sceneFlags",
+ # "play->actorCtx.unk5": "play->actorCtx.flags",
"play->msgCtx.unk11F04": "play->msgCtx.currentTextId",
"play->msgCtx.unk11F10": "play->msgCtx.msgLength",
"play->msgCtx.unk11F22": "play->msgCtx.msgMode",
"play->msgCtx.unk12023": "play->msgCtx.stateTimer",
"play->msgCtx.unk1202A": "play->msgCtx.ocarinaMode",
"play->msgCtx.unk1202C": "play->msgCtx.ocarinaAction",
+ "play->msgCtx.unk11F04": "play->msgCtx.currentTextId",
+ "play->actorCtx.unk3": "play->actorCtx.lensActive",
+ "play->actorCtx.unk4": "play->actorCtx.lensMaskSize",
"play->nextEntranceIndex": "play->nextEntrance",
"play->sceneLoadFlag": "play->transitionTrigger",
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index 8c986e485c..ac48760a54 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -325,7 +325,7 @@ asm/non_matchings/code/z_actor/func_800B9038.s,func_800B9038,0x800B9038,0x13
asm/non_matchings/code/z_actor/func_800B9084.s,func_800B9084,0x800B9084,0x5
asm/non_matchings/code/z_actor/func_800B9098.s,func_800B9098,0x800B9098,0x5
asm/non_matchings/code/z_actor/func_800B90AC.s,func_800B90AC,0x800B90AC,0x12
-asm/non_matchings/code/z_actor/func_800B90F4.s,func_800B90F4,0x800B90F4,0xB
+asm/non_matchings/code/z_actor/Actor_DeactivateLens.s,Actor_DeactivateLens,0x800B90F4,0xB
asm/non_matchings/code/z_actor/func_800B9120.s,func_800B9120,0x800B9120,0x14
asm/non_matchings/code/z_actor/Actor_InitContext.s,Actor_InitContext,0x800B9170,0x71
asm/non_matchings/code/z_actor/Actor_SpawnSetupActors.s,Actor_SpawnSetupActors,0x800B9334,0x56
@@ -335,8 +335,8 @@ asm/non_matchings/code/z_actor/Actor_Draw.s,Actor_Draw,0x800B9A04,0xC6
asm/non_matchings/code/z_actor/func_800B9D1C.s,func_800B9D1C,0x800B9D1C,0x48
asm/non_matchings/code/z_actor/Actor_DrawAllSetup.s,Actor_DrawAllSetup,0x800B9E3C,0x4
asm/non_matchings/code/z_actor/Actor_RecordUndrawnActor.s,Actor_RecordUndrawnActor,0x800B9E4C,0xE
-asm/non_matchings/code/z_actor/func_800B9E84.s,func_800B9E84,0x800B9E84,0x1C
-asm/non_matchings/code/z_actor/func_800B9EF4.s,func_800B9EF4,0x800B9EF4,0xF9
+asm/non_matchings/code/z_actor/Actor_DrawLensOverlay.s,Actor_DrawLensOverlay,0x800B9E84,0x1C
+asm/non_matchings/code/z_actor/Actor_DrawLensActors.s,Actor_DrawLensActors,0x800B9EF4,0xF9
asm/non_matchings/code/z_actor/func_800BA2D8.s,func_800BA2D8,0x800BA2D8,0x9
asm/non_matchings/code/z_actor/func_800BA2FC.s,func_800BA2FC,0x800BA2FC,0x4C
asm/non_matchings/code/z_actor/Actor_DrawAll.s,Actor_DrawAll,0x800BA42C,0xB4
@@ -1648,13 +1648,13 @@ asm/non_matchings/code/z_parameter/Health_ChangeBy.s,Health_ChangeBy,0x80115908,
asm/non_matchings/code/z_parameter/Health_GiveHearts.s,Health_GiveHearts,0x801159C0,0xB
asm/non_matchings/code/z_parameter/Rupees_ChangeBy.s,Rupees_ChangeBy,0x801159EC,0xA
asm/non_matchings/code/z_parameter/Inventory_ChangeAmmo.s,Inventory_ChangeAmmo,0x80115A14,0xC0
-asm/non_matchings/code/z_parameter/Parameter_AddMagic.s,Parameter_AddMagic,0x80115D14,0x12
-asm/non_matchings/code/z_parameter/func_80115D5C.s,func_80115D5C,0x80115D5C,0x16
-asm/non_matchings/code/z_parameter/func_80115DB4.s,func_80115DB4,0x80115DB4,0xB5
-asm/non_matchings/code/z_parameter/func_80116088.s,func_80116088,0x80116088,0x23
-asm/non_matchings/code/z_parameter/func_80116114.s,func_80116114,0x80116114,0x8D
-asm/non_matchings/code/z_parameter/func_80116348.s,func_80116348,0x80116348,0x174
-asm/non_matchings/code/z_parameter/func_80116918.s,func_80116918,0x80116918,0x1B0
+asm/non_matchings/code/z_parameter/Magic_Add.s,Magic_Add,0x80115D14,0x12
+asm/non_matchings/code/z_parameter/Magic_Reset.s,Magic_Reset,0x80115D5C,0x16
+asm/non_matchings/code/z_parameter/Magic_Consume.s,Magic_Consume,0x80115DB4,0xB5
+asm/non_matchings/code/z_parameter/Magic_UpdateAddRequest.s,Magic_UpdateAddRequest,0x80116088,0x23
+asm/non_matchings/code/z_parameter/Magic_FlashMeterBorder.s,Magic_FlashMeterBorder,0x80116114,0x8D
+asm/non_matchings/code/z_parameter/Magic_Update.s,Magic_Update,0x80116348,0x174
+asm/non_matchings/code/z_parameter/Magic_DrawMeter.s,Magic_DrawMeter,0x80116918,0x1B0
asm/non_matchings/code/z_parameter/func_80116FD8.s,func_80116FD8,0x80116FD8,0x38
asm/non_matchings/code/z_parameter/func_801170B8.s,func_801170B8,0x801170B8,0x12
asm/non_matchings/code/z_parameter/func_80117100.s,func_80117100,0x80117100,0x248
@@ -2630,10 +2630,10 @@ asm/non_matchings/code/audioMgr/AudioMgr_HandlePRENMI.s,AudioMgr_HandlePRENMI,0x
asm/non_matchings/code/audioMgr/AudioMgr_ThreadEntry.s,AudioMgr_ThreadEntry,0x80172ED0,0x5E
asm/non_matchings/code/audioMgr/AudioMgr_Unlock.s,AudioMgr_Unlock,0x80173048,0xB
asm/non_matchings/code/audioMgr/AudioMgr_Init.s,AudioMgr_Init,0x80173074,0x2F
-asm/non_matchings/code/title_setup/TitleSetup_GameStateResetContext.s,TitleSetup_GameStateResetContext,0x80173130,0x6B
-asm/non_matchings/code/title_setup/TitleSetup_InitImpl.s,TitleSetup_InitImpl,0x801732DC,0x14
-asm/non_matchings/code/title_setup/TitleSetup_Destroy.s,TitleSetup_Destroy,0x8017332C,0x3
-asm/non_matchings/code/title_setup/TitleSetup_Init.s,TitleSetup_Init,0x80173338,0xA
+asm/non_matchings/code/title_setup/Setup_SetRegs.s,Setup_SetRegs,0x80173130,0x6B
+asm/non_matchings/code/title_setup/Setup_InitImpl.s,Setup_InitImpl,0x801732DC,0x14
+asm/non_matchings/code/title_setup/Setup_Destroy.s,Setup_Destroy,0x8017332C,0x3
+asm/non_matchings/code/title_setup/Setup_Init.s,Setup_Init,0x80173338,0xA
asm/non_matchings/code/game/Game_UpdateFramerateVariables.s,Game_UpdateFramerateVariables,0x80173360,0x12
asm/non_matchings/code/game/Game_SetFramerateDivisor.s,Game_SetFramerateDivisor,0x801733A8,0xD
asm/non_matchings/code/game/GameState_SetFBFilter.s,GameState_SetFBFilter,0x801733DC,0x56
@@ -2648,8 +2648,8 @@ asm/non_matchings/code/game/Game_InitHeap.s,Game_InitHeap,0x80173810,0x1C
asm/non_matchings/code/game/Game_ResizeHeap.s,Game_ResizeHeap,0x80173880,0x34
asm/non_matchings/code/game/GameState_Init.s,GameState_Init,0x80173950,0x40
asm/non_matchings/code/game/GameState_Destroy.s,GameState_Destroy,0x80173A50,0x2C
-asm/non_matchings/code/game/GameState_GetNextStateInit.s,GameState_GetNextStateInit,0x80173B00,0x3
-asm/non_matchings/code/game/GameState_GetNextStateSize.s,GameState_GetNextStateSize,0x80173B0C,0x3
+asm/non_matchings/code/game/GameState_GetInit.s,GameState_GetInit,0x80173B00,0x3
+asm/non_matchings/code/game/GameState_GetSize.s,GameState_GetSize,0x80173B0C,0x3
asm/non_matchings/code/game/GameState_IsRunning.s,GameState_IsRunning,0x80173B18,0x3
asm/non_matchings/code/game/Game_GetHeapFreeSize.s,Game_GetHeapFreeSize,0x80173B24,0x9
asm/non_matchings/code/game/func_80173B48.s,func_80173B48,0x80173B48,0x2A
@@ -3076,16 +3076,16 @@ asm/non_matchings/code/audio_heap/AudioHeap_AllocDmaMemoryZeroed.s,AudioHeap_All
asm/non_matchings/code/audio_heap/AudioHeap_AllocZeroed.s,AudioHeap_AllocZeroed,0x8018B640,0x17
asm/non_matchings/code/audio_heap/AudioHeap_TestAlloc.s,AudioHeap_TestAlloc,0x8018B69C,0x13
asm/non_matchings/code/audio_heap/Audio_Alloc.s,Audio_Alloc,0x8018B6E8,0x16
-asm/non_matchings/code/audio_heap/AudioHeap_AllocPoolInit.s,AudioHeap_AllocPoolInit,0x8018B740,0xA
-asm/non_matchings/code/audio_heap/AudioHeap_ClearPersistentCache.s,AudioHeap_ClearPersistentCache,0x8018B768,0x5
-asm/non_matchings/code/audio_heap/AudioHeap_ClearTemporaryCache.s,AudioHeap_ClearTemporaryCache,0x8018B77C,0xC
+asm/non_matchings/code/audio_heap/AudioHeap_InitPool.s,AudioHeap_InitPool,0x8018B740,0xA
+asm/non_matchings/code/audio_heap/AudioHeap_InitPersistentCache.s,AudioHeap_InitPersistentCache,0x8018B768,0x5
+asm/non_matchings/code/audio_heap/AudioHeap_InitTemporaryCache.s,AudioHeap_InitTemporaryCache,0x8018B77C,0xC
asm/non_matchings/code/audio_heap/AudioHeap_ResetPool.s,AudioHeap_ResetPool,0x8018B7AC,0x4
-asm/non_matchings/code/audio_heap/AudioHeap_PopCache.s,AudioHeap_PopCache,0x8018B7BC,0x50
+asm/non_matchings/code/audio_heap/AudioHeap_PopPersistentCache.s,AudioHeap_PopPersistentCache,0x8018B7BC,0x50
asm/non_matchings/code/audio_heap/AudioHeap_InitMainPool.s,AudioHeap_InitMainPool,0x8018B8FC,0x18
asm/non_matchings/code/audio_heap/AudioHeap_InitSessionPool.s,AudioHeap_InitSessionPool,0x8018B95C,0x21
asm/non_matchings/code/audio_heap/AudioHeap_InitCachePool.s,AudioHeap_InitCachePool,0x8018B9E0,0x21
-asm/non_matchings/code/audio_heap/AudioHeap_InitPersistentCache.s,AudioHeap_InitPersistentCache,0x8018BA64,0x31
-asm/non_matchings/code/audio_heap/AudioHeap_InitTemporaryCache.s,AudioHeap_InitTemporaryCache,0x8018BB28,0x31
+asm/non_matchings/code/audio_heap/AudioHeap_InitPersistentPoolsAndCaches.s,AudioHeap_InitPersistentPoolsAndCaches,0x8018BA64,0x31
+asm/non_matchings/code/audio_heap/AudioHeap_InitTemporaryPoolsAndCaches.s,AudioHeap_InitTemporaryPoolsAndCaches,0x8018BB28,0x31
asm/non_matchings/code/audio_heap/AudioHeap_AllocCached.s,AudioHeap_AllocCached,0x8018BBEC,0x1E5
asm/non_matchings/code/audio_heap/AudioHeap_SearchCaches.s,AudioHeap_SearchCaches,0x8018C380,0x16
asm/non_matchings/code/audio_heap/AudioHeap_SearchRegularCaches.s,AudioHeap_SearchRegularCaches,0x8018C3D8,0x43
@@ -3161,7 +3161,7 @@ asm/non_matchings/code/audio_load/AudioLoad_AsyncLoadInner.s,AudioLoad_AsyncLoad
asm/non_matchings/code/audio_load/AudioLoad_ProcessLoads.s,AudioLoad_ProcessLoads,0x80190B08,0xC
asm/non_matchings/code/audio_load/AudioLoad_SetDmaHandler.s,AudioLoad_SetDmaHandler,0x80190B38,0x3
asm/non_matchings/code/audio_load/AudioLoad_SetUnusedHandler.s,AudioLoad_SetUnusedHandler,0x80190B44,0x3
-asm/non_matchings/code/audio_load/AudioLoad_InitSoundFontMeta.s,AudioLoad_InitSoundFontMeta,0x80190B50,0x18
+asm/non_matchings/code/audio_load/AudioLoad_InitSoundFont.s,AudioLoad_InitSoundFont,0x80190B50,0x18
asm/non_matchings/code/audio_load/AudioLoad_Init.s,AudioLoad_Init,0x80190BB0,0xE8
asm/non_matchings/code/audio_load/AudioLoad_InitSlowLoads.s,AudioLoad_InitSlowLoads,0x80190F50,0x5
asm/non_matchings/code/audio_load/AudioLoad_SlowLoadSample.s,AudioLoad_SlowLoadSample,0x80190F64,0x74
@@ -3247,10 +3247,10 @@ asm/non_matchings/code/audio_playback/AudioPlayback_NoteSetResamplingRate.s,Audi
asm/non_matchings/code/audio_playback/AudioPlayback_NoteInit.s,AudioPlayback_NoteInit,0x80194E60,0x30
asm/non_matchings/code/audio_playback/AudioPlayback_NoteDisable.s,AudioPlayback_NoteDisable,0x80194F20,0x19
asm/non_matchings/code/audio_playback/AudioPlayback_ProcessNotes.s,AudioPlayback_ProcessNotes,0x80194F84,0x152
-asm/non_matchings/code/audio_playback/AudioPlayback_InstrumentGetSound.s,AudioPlayback_InstrumentGetSound,0x801954CC,0xF
+asm/non_matchings/code/audio_playback/AudioPlayback_GetInstrumentTunedSample.s,AudioPlayback_GetInstrumentTunedSample,0x801954CC,0xF
asm/non_matchings/code/audio_playback/AudioPlayback_GetInstrumentInner.s,AudioPlayback_GetInstrumentInner,0x80195508,0x35
asm/non_matchings/code/audio_playback/AudioPlayback_GetDrum.s,AudioPlayback_GetDrum,0x801955DC,0x39
-asm/non_matchings/code/audio_playback/AudioPlayback_GetSfx.s,AudioPlayback_GetSfx,0x801956C0,0x3D
+asm/non_matchings/code/audio_playback/AudioPlayback_GetSoundEffect.s,AudioPlayback_GetSoundEffect,0x801956C0,0x3D
asm/non_matchings/code/audio_playback/AudioPlayback_SetFontInstrument.s,AudioPlayback_SetFontInstrument,0x801957B4,0x51
asm/non_matchings/code/audio_playback/AudioPlayback_SeqLayerDecayRelease.s,AudioPlayback_SeqLayerDecayRelease,0x801958F8,0xD2
asm/non_matchings/code/audio_playback/AudioPlayback_SeqLayerNoteDecay.s,AudioPlayback_SeqLayerNoteDecay,0x80195C40,0x8
diff --git a/undefined_syms.txt b/undefined_syms.txt
index faf0aba385..5cb5cdf0b6 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -385,9 +385,6 @@ D_04014560 = 0x04014560;
D_04015DB0 = 0x04015DB0;
D_04015FA0 = 0x04015FA0;
D_04016360 = 0x04016360;
-D_0401A4D0 = 0x0401A4D0;
-D_0401A538 = 0x0401A538;
-D_0401A590 = 0x0401A590;
D_0401ACF0 = 0x0401ACF0;
D_0401ED00 = 0x0401ED00;
D_0401F0F0 = 0x0401F0F0;
@@ -428,7 +425,6 @@ D_040377B0 = 0x040377B0;
D_04037850 = 0x04037850;
D_0403A0F0 = 0x0403A0F0;
D_0403F230 = 0x0403F230;
-D_04044300 = 0x04044300;
D_0404F250 = 0x0404F250;
D_04050550 = 0x04050550;
D_04050D10 = 0x04050D10;
@@ -845,14 +841,6 @@ D_060057D8 = 0x060057D8;
D_060058C8 = 0x060058C8;
D_06007238 = 0x06007238;
-// ovl_Effect_Ss_D_Fire
-
-D_060098A0 = 0x060098A0;
-
-// ovl_Effect_Ss_Extra
-
-D_06000DC0 = 0x06000DC0;
-
// ovl_Eff_Kamejima_Wave
D_06000000 = 0x06000000;
@@ -1450,12 +1438,6 @@ D_06001100 = 0x06001100;
D_06001140 = 0x06001140;
D_06001CB0 = 0x06001CB0;
-// ovl_Obj_Usiyane
-
-D_06000098 = 0x06000098;
-D_06000838 = 0x06000838;
-D_060022AC = 0x060022AC;
-
// ovl_player_actor
D_06008860 = 0x06008860;