diff --git a/README.md b/README.md
index badca09fd..0dfb48d9f 100644
--- a/README.md
+++ b/README.md
@@ -144,4 +144,4 @@ Please note that is is our strict policy that *Anyone who wishes to contribute t
Most discussions happen on our [Discord Server](https://discord.zelda64.dev), where you are welcome to ask if you need help getting started, or if you have any questions regarding this project or ZeldaRET's other decompilation projects.
-For more information on getting started, see our [Contributing Guide](CONTRIBUTING.md), [Style Guide](docs/STYLE.md) and our [Code Review Guidelines](docs/REVIEWING.md) to see what code quality guidelines we follow.
+For more information on getting started, see our [Contributing Guide](docs/CONTRIBUTING.md), [Style Guide](docs/STYLE.md) and our [Code Review Guidelines](docs/REVIEWING.md) to see what code quality guidelines we follow.
diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml
index d87ef3f31..11b6a0861 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -972,16 +972,16 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_ani.xml b/assets/xml/objects/object_ani.xml
index f039e0114..3d8f7c385 100644
--- a/assets/xml/objects/object_ani.xml
+++ b/assets/xml/objects/object_ani.xml
@@ -36,13 +36,13 @@
-
+
-
+
diff --git a/assets/xml/objects/object_bigokuta.xml b/assets/xml/objects/object_bigokuta.xml
index 21ead0501..2c54c6a61 100644
--- a/assets/xml/objects/object_bigokuta.xml
+++ b/assets/xml/objects/object_bigokuta.xml
@@ -34,25 +34,25 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bigslime.xml b/assets/xml/objects/object_bigslime.xml
index 5b7530add..7195c20c7 100644
--- a/assets/xml/objects/object_bigslime.xml
+++ b/assets/xml/objects/object_bigslime.xml
@@ -65,30 +65,30 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bji.xml b/assets/xml/objects/object_bji.xml
index b41ac1546..0fec0c8c3 100644
--- a/assets/xml/objects/object_bji.xml
+++ b/assets/xml/objects/object_bji.xml
@@ -3,21 +3,23 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -36,22 +38,27 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bsmask.xml b/assets/xml/objects/object_bsmask.xml
index e776cde1a..ea94aa89e 100644
--- a/assets/xml/objects/object_bsmask.xml
+++ b/assets/xml/objects/object_bsmask.xml
@@ -1,28 +1,36 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_fsn.xml b/assets/xml/objects/object_fsn.xml
index 2ed2b5d08..e3ae8db1b 100644
--- a/assets/xml/objects/object_fsn.xml
+++ b/assets/xml/objects/object_fsn.xml
@@ -53,8 +53,8 @@
-
-
+
+
diff --git a/assets/xml/objects/object_gi_arrow.xml b/assets/xml/objects/object_gi_arrow.xml
index ab3bcbde9..5fcfeb6eb 100644
--- a/assets/xml/objects/object_gi_arrow.xml
+++ b/assets/xml/objects/object_gi_arrow.xml
@@ -1,7 +1,13 @@
+
+
+
+
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_arrowcase.xml b/assets/xml/objects/object_gi_arrowcase.xml
index ae10b4faa..87d8c29fb 100644
--- a/assets/xml/objects/object_gi_arrowcase.xml
+++ b/assets/xml/objects/object_gi_arrowcase.xml
@@ -1,12 +1,20 @@
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bean.xml b/assets/xml/objects/object_gi_bean.xml
index e19b48d14..ed9d2b7a6 100644
--- a/assets/xml/objects/object_gi_bean.xml
+++ b/assets/xml/objects/object_gi_bean.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_bigbomb.xml b/assets/xml/objects/object_gi_bigbomb.xml
index 27d2a0741..042736edc 100644
--- a/assets/xml/objects/object_gi_bigbomb.xml
+++ b/assets/xml/objects/object_gi_bigbomb.xml
@@ -1,10 +1,17 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bomb_1.xml b/assets/xml/objects/object_gi_bomb_1.xml
index 98af21873..174927ca6 100644
--- a/assets/xml/objects/object_gi_bomb_1.xml
+++ b/assets/xml/objects/object_gi_bomb_1.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_bomb_2.xml b/assets/xml/objects/object_gi_bomb_2.xml
index ecd07c048..f5b3af67f 100644
--- a/assets/xml/objects/object_gi_bomb_2.xml
+++ b/assets/xml/objects/object_gi_bomb_2.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_bombpouch.xml b/assets/xml/objects/object_gi_bombpouch.xml
index 06eff7ced..2e9969cbd 100644
--- a/assets/xml/objects/object_gi_bombpouch.xml
+++ b/assets/xml/objects/object_gi_bombpouch.xml
@@ -1,12 +1,20 @@
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bosskey.xml b/assets/xml/objects/object_gi_bosskey.xml
index ae5ac2e75..5d4bda5c0 100644
--- a/assets/xml/objects/object_gi_bosskey.xml
+++ b/assets/xml/objects/object_gi_bosskey.xml
@@ -1,6 +1,12 @@
+
+
+
+
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bottle.xml b/assets/xml/objects/object_gi_bottle.xml
index 95a7b8bce..e978697ab 100644
--- a/assets/xml/objects/object_gi_bottle.xml
+++ b/assets/xml/objects/object_gi_bottle.xml
@@ -1,6 +1,12 @@
+
+
+
+
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bottle_04.xml b/assets/xml/objects/object_gi_bottle_04.xml
index f215d4059..ab90eb89d 100644
--- a/assets/xml/objects/object_gi_bottle_04.xml
+++ b/assets/xml/objects/object_gi_bottle_04.xml
@@ -1,12 +1,21 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bottle_15.xml b/assets/xml/objects/object_gi_bottle_15.xml
index afea0f6ca..486e042a9 100644
--- a/assets/xml/objects/object_gi_bottle_15.xml
+++ b/assets/xml/objects/object_gi_bottle_15.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bottle_16.xml b/assets/xml/objects/object_gi_bottle_16.xml
index 7ee7f3640..ab736f087 100644
--- a/assets/xml/objects/object_gi_bottle_16.xml
+++ b/assets/xml/objects/object_gi_bottle_16.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bottle_21.xml b/assets/xml/objects/object_gi_bottle_21.xml
index 779b474cd..32cbd8e75 100644
--- a/assets/xml/objects/object_gi_bottle_21.xml
+++ b/assets/xml/objects/object_gi_bottle_21.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bottle_22.xml b/assets/xml/objects/object_gi_bottle_22.xml
index d61397014..bbc2ea452 100644
--- a/assets/xml/objects/object_gi_bottle_22.xml
+++ b/assets/xml/objects/object_gi_bottle_22.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bottle_red.xml b/assets/xml/objects/object_gi_bottle_red.xml
index c2f189dce..b52781d8d 100644
--- a/assets/xml/objects/object_gi_bottle_red.xml
+++ b/assets/xml/objects/object_gi_bottle_red.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_bow.xml b/assets/xml/objects/object_gi_bow.xml
index b7d62e12d..f5ba88dfa 100644
--- a/assets/xml/objects/object_gi_bow.xml
+++ b/assets/xml/objects/object_gi_bow.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_camera.xml b/assets/xml/objects/object_gi_camera.xml
index 81641ca30..5e94bf88b 100644
--- a/assets/xml/objects/object_gi_camera.xml
+++ b/assets/xml/objects/object_gi_camera.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_compass.xml b/assets/xml/objects/object_gi_compass.xml
index 49f7cf87e..9c724fc59 100644
--- a/assets/xml/objects/object_gi_compass.xml
+++ b/assets/xml/objects/object_gi_compass.xml
@@ -1,6 +1,12 @@
+
+
+
+
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gi_fieldmap.xml b/assets/xml/objects/object_gi_fieldmap.xml
index bdb77ad0b..f4d6369a9 100644
--- a/assets/xml/objects/object_gi_fieldmap.xml
+++ b/assets/xml/objects/object_gi_fieldmap.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_fish.xml b/assets/xml/objects/object_gi_fish.xml
index 339f2d144..7c9f4be1f 100644
--- a/assets/xml/objects/object_gi_fish.xml
+++ b/assets/xml/objects/object_gi_fish.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_ghost.xml b/assets/xml/objects/object_gi_ghost.xml
index 813ba7d4e..3ea6ca582 100644
--- a/assets/xml/objects/object_gi_ghost.xml
+++ b/assets/xml/objects/object_gi_ghost.xml
@@ -1,11 +1,21 @@
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_glasses.xml b/assets/xml/objects/object_gi_glasses.xml
index 571f0ea6d..e089e2c8d 100644
--- a/assets/xml/objects/object_gi_glasses.xml
+++ b/assets/xml/objects/object_gi_glasses.xml
@@ -1,6 +1,12 @@
+
+
+
+
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gi_gold_dust.xml b/assets/xml/objects/object_gi_gold_dust.xml
index ed787b2b2..523134bae 100644
--- a/assets/xml/objects/object_gi_gold_dust.xml
+++ b/assets/xml/objects/object_gi_gold_dust.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_golonmask.xml b/assets/xml/objects/object_gi_golonmask.xml
index c845fd0bd..87e65396e 100644
--- a/assets/xml/objects/object_gi_golonmask.xml
+++ b/assets/xml/objects/object_gi_golonmask.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_heart.xml b/assets/xml/objects/object_gi_heart.xml
index 0917876aa..1d9e72459 100644
--- a/assets/xml/objects/object_gi_heart.xml
+++ b/assets/xml/objects/object_gi_heart.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_hearts.xml b/assets/xml/objects/object_gi_hearts.xml
index 442ba21c7..0f5387cae 100644
--- a/assets/xml/objects/object_gi_hearts.xml
+++ b/assets/xml/objects/object_gi_hearts.xml
@@ -1,7 +1,13 @@
+
+
+
+
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_hookshot.xml b/assets/xml/objects/object_gi_hookshot.xml
index 37a0b4642..54dbcdd74 100644
--- a/assets/xml/objects/object_gi_hookshot.xml
+++ b/assets/xml/objects/object_gi_hookshot.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_insect.xml b/assets/xml/objects/object_gi_insect.xml
index a7c3107ea..bba46991d 100644
--- a/assets/xml/objects/object_gi_insect.xml
+++ b/assets/xml/objects/object_gi_insect.xml
@@ -1,6 +1,12 @@
+
+
+
+
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gi_key.xml b/assets/xml/objects/object_gi_key.xml
index bf4cdb727..2f4511f1d 100644
--- a/assets/xml/objects/object_gi_key.xml
+++ b/assets/xml/objects/object_gi_key.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_ki_tan_mask.xml b/assets/xml/objects/object_gi_ki_tan_mask.xml
index 313576631..3898630da 100644
--- a/assets/xml/objects/object_gi_ki_tan_mask.xml
+++ b/assets/xml/objects/object_gi_ki_tan_mask.xml
@@ -1,7 +1,15 @@
+
+
+
+
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_liquid.xml b/assets/xml/objects/object_gi_liquid.xml
index bec768cfe..ed26c4267 100644
--- a/assets/xml/objects/object_gi_liquid.xml
+++ b/assets/xml/objects/object_gi_liquid.xml
@@ -1,19 +1,29 @@
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_loach.xml b/assets/xml/objects/object_gi_loach.xml
index c9c81f0b9..4ffcbfe73 100644
--- a/assets/xml/objects/object_gi_loach.xml
+++ b/assets/xml/objects/object_gi_loach.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_longsword.xml b/assets/xml/objects/object_gi_longsword.xml
index 6be60d411..5385b9639 100644
--- a/assets/xml/objects/object_gi_longsword.xml
+++ b/assets/xml/objects/object_gi_longsword.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_m_arrow.xml b/assets/xml/objects/object_gi_m_arrow.xml
index 6351783b5..595ad25d6 100644
--- a/assets/xml/objects/object_gi_m_arrow.xml
+++ b/assets/xml/objects/object_gi_m_arrow.xml
@@ -1,9 +1,17 @@
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_magicmushroom.xml b/assets/xml/objects/object_gi_magicmushroom.xml
index ae6cbeb49..1d26dfa63 100644
--- a/assets/xml/objects/object_gi_magicmushroom.xml
+++ b/assets/xml/objects/object_gi_magicmushroom.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_magicpot.xml b/assets/xml/objects/object_gi_magicpot.xml
index 2abd48eef..459f010f4 100644
--- a/assets/xml/objects/object_gi_magicpot.xml
+++ b/assets/xml/objects/object_gi_magicpot.xml
@@ -1,6 +1,12 @@
+
+
+
+
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gi_map.xml b/assets/xml/objects/object_gi_map.xml
index 250bb4613..c0cb2e070 100644
--- a/assets/xml/objects/object_gi_map.xml
+++ b/assets/xml/objects/object_gi_map.xml
@@ -1,7 +1,17 @@
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask03.xml b/assets/xml/objects/object_gi_mask03.xml
index 561ddef83..3bc62ba8e 100644
--- a/assets/xml/objects/object_gi_mask03.xml
+++ b/assets/xml/objects/object_gi_mask03.xml
@@ -1,13 +1,20 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask05.xml b/assets/xml/objects/object_gi_mask05.xml
index 307a3b2f4..c6bf0baad 100644
--- a/assets/xml/objects/object_gi_mask05.xml
+++ b/assets/xml/objects/object_gi_mask05.xml
@@ -1,11 +1,18 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask06.xml b/assets/xml/objects/object_gi_mask06.xml
index 256d9a91e..7d24b1d92 100644
--- a/assets/xml/objects/object_gi_mask06.xml
+++ b/assets/xml/objects/object_gi_mask06.xml
@@ -1,10 +1,17 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask09.xml b/assets/xml/objects/object_gi_mask09.xml
index d6db047d5..76efc6922 100644
--- a/assets/xml/objects/object_gi_mask09.xml
+++ b/assets/xml/objects/object_gi_mask09.xml
@@ -1,12 +1,19 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask10.xml b/assets/xml/objects/object_gi_mask10.xml
index adb3ee1d2..e7083f94b 100644
--- a/assets/xml/objects/object_gi_mask10.xml
+++ b/assets/xml/objects/object_gi_mask10.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask11.xml b/assets/xml/objects/object_gi_mask11.xml
index 46de5c2cd..e7b175b4d 100644
--- a/assets/xml/objects/object_gi_mask11.xml
+++ b/assets/xml/objects/object_gi_mask11.xml
@@ -1,14 +1,21 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask12.xml b/assets/xml/objects/object_gi_mask12.xml
index dced8d8eb..2f1508b9d 100644
--- a/assets/xml/objects/object_gi_mask12.xml
+++ b/assets/xml/objects/object_gi_mask12.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask13.xml b/assets/xml/objects/object_gi_mask13.xml
index b6d2c7733..8f5e7bf8f 100644
--- a/assets/xml/objects/object_gi_mask13.xml
+++ b/assets/xml/objects/object_gi_mask13.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask14.xml b/assets/xml/objects/object_gi_mask14.xml
index a3c96bb9d..0b9b5be28 100644
--- a/assets/xml/objects/object_gi_mask14.xml
+++ b/assets/xml/objects/object_gi_mask14.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask15.xml b/assets/xml/objects/object_gi_mask15.xml
index bc612c075..1f29f1bef 100644
--- a/assets/xml/objects/object_gi_mask15.xml
+++ b/assets/xml/objects/object_gi_mask15.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask16.xml b/assets/xml/objects/object_gi_mask16.xml
index 57124d4d4..4a0650cdd 100644
--- a/assets/xml/objects/object_gi_mask16.xml
+++ b/assets/xml/objects/object_gi_mask16.xml
@@ -1,11 +1,16 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask17.xml b/assets/xml/objects/object_gi_mask17.xml
index a509ca27e..a4df99986 100644
--- a/assets/xml/objects/object_gi_mask17.xml
+++ b/assets/xml/objects/object_gi_mask17.xml
@@ -1,13 +1,20 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask18.xml b/assets/xml/objects/object_gi_mask18.xml
index 8e1c8ca54..ad0364290 100644
--- a/assets/xml/objects/object_gi_mask18.xml
+++ b/assets/xml/objects/object_gi_mask18.xml
@@ -1,12 +1,19 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask20.xml b/assets/xml/objects/object_gi_mask20.xml
index 8b87c44fa..f04bb157e 100644
--- a/assets/xml/objects/object_gi_mask20.xml
+++ b/assets/xml/objects/object_gi_mask20.xml
@@ -1,11 +1,18 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask21.xml b/assets/xml/objects/object_gi_mask21.xml
index 175d22b85..4696963ad 100644
--- a/assets/xml/objects/object_gi_mask21.xml
+++ b/assets/xml/objects/object_gi_mask21.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask22.xml b/assets/xml/objects/object_gi_mask22.xml
index 7b3a49e53..54b0c5595 100644
--- a/assets/xml/objects/object_gi_mask22.xml
+++ b/assets/xml/objects/object_gi_mask22.xml
@@ -1,13 +1,20 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mask23.xml b/assets/xml/objects/object_gi_mask23.xml
index 458b7c825..6efa0147b 100644
--- a/assets/xml/objects/object_gi_mask23.xml
+++ b/assets/xml/objects/object_gi_mask23.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_melody.xml b/assets/xml/objects/object_gi_melody.xml
index d7617e7a6..4d4696528 100644
--- a/assets/xml/objects/object_gi_melody.xml
+++ b/assets/xml/objects/object_gi_melody.xml
@@ -1,11 +1,14 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_milk.xml b/assets/xml/objects/object_gi_milk.xml
index 137dae777..0e2c37efa 100644
--- a/assets/xml/objects/object_gi_milk.xml
+++ b/assets/xml/objects/object_gi_milk.xml
@@ -1,7 +1,15 @@
+
+
+
+
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_mssa.xml b/assets/xml/objects/object_gi_mssa.xml
index 6b61b00f5..ce1ae8c42 100644
--- a/assets/xml/objects/object_gi_mssa.xml
+++ b/assets/xml/objects/object_gi_mssa.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_nuts.xml b/assets/xml/objects/object_gi_nuts.xml
index 073e7db8f..d142cc8bd 100644
--- a/assets/xml/objects/object_gi_nuts.xml
+++ b/assets/xml/objects/object_gi_nuts.xml
@@ -1,6 +1,14 @@
+
+
+
+
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_nutsmask.xml b/assets/xml/objects/object_gi_nutsmask.xml
index e34a593f2..c6df5804a 100644
--- a/assets/xml/objects/object_gi_nutsmask.xml
+++ b/assets/xml/objects/object_gi_nutsmask.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_ocarina.xml b/assets/xml/objects/object_gi_ocarina.xml
index 7b968a491..5856529e6 100644
--- a/assets/xml/objects/object_gi_ocarina.xml
+++ b/assets/xml/objects/object_gi_ocarina.xml
@@ -1,7 +1,15 @@
+
+
+
+
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_purse.xml b/assets/xml/objects/object_gi_purse.xml
index 49cf9fd37..d24da1add 100644
--- a/assets/xml/objects/object_gi_purse.xml
+++ b/assets/xml/objects/object_gi_purse.xml
@@ -1,17 +1,24 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_rabit_mask.xml b/assets/xml/objects/object_gi_rabit_mask.xml
index 172c080f1..16f536976 100644
--- a/assets/xml/objects/object_gi_rabit_mask.xml
+++ b/assets/xml/objects/object_gi_rabit_mask.xml
@@ -1,7 +1,15 @@
+
+
+
+
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_reserve00.xml b/assets/xml/objects/object_gi_reserve00.xml
index 1527a2630..3476ab719 100644
--- a/assets/xml/objects/object_gi_reserve00.xml
+++ b/assets/xml/objects/object_gi_reserve00.xml
@@ -1,11 +1,20 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_reserve01.xml b/assets/xml/objects/object_gi_reserve01.xml
index c31c76698..5c6bb4d18 100644
--- a/assets/xml/objects/object_gi_reserve01.xml
+++ b/assets/xml/objects/object_gi_reserve01.xml
@@ -1,14 +1,21 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_reserve_b_00.xml b/assets/xml/objects/object_gi_reserve_b_00.xml
index 1c1e54390..1e2c37821 100644
--- a/assets/xml/objects/object_gi_reserve_b_00.xml
+++ b/assets/xml/objects/object_gi_reserve_b_00.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_reserve_b_01.xml b/assets/xml/objects/object_gi_reserve_b_01.xml
index 574763ee9..2bd1b2af2 100644
--- a/assets/xml/objects/object_gi_reserve_b_01.xml
+++ b/assets/xml/objects/object_gi_reserve_b_01.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_reserve_c_00.xml b/assets/xml/objects/object_gi_reserve_c_00.xml
index 86c6b15fb..f9cca9676 100644
--- a/assets/xml/objects/object_gi_reserve_c_00.xml
+++ b/assets/xml/objects/object_gi_reserve_c_00.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_reserve_c_01.xml b/assets/xml/objects/object_gi_reserve_c_01.xml
index da1530970..b88f74df5 100644
--- a/assets/xml/objects/object_gi_reserve_c_01.xml
+++ b/assets/xml/objects/object_gi_reserve_c_01.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_rupy.xml b/assets/xml/objects/object_gi_rupy.xml
index 69cd8bf5c..98d5714d6 100644
--- a/assets/xml/objects/object_gi_rupy.xml
+++ b/assets/xml/objects/object_gi_rupy.xml
@@ -1,18 +1,26 @@
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_schedule.xml b/assets/xml/objects/object_gi_schedule.xml
index e5025a993..9350bdcc3 100644
--- a/assets/xml/objects/object_gi_schedule.xml
+++ b/assets/xml/objects/object_gi_schedule.xml
@@ -1,11 +1,16 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_seahorse.xml b/assets/xml/objects/object_gi_seahorse.xml
index f35e2edc9..acc1e184d 100644
--- a/assets/xml/objects/object_gi_seahorse.xml
+++ b/assets/xml/objects/object_gi_seahorse.xml
@@ -1,12 +1,19 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_shield_2.xml b/assets/xml/objects/object_gi_shield_2.xml
index eb9fec8d2..e3b990bcf 100644
--- a/assets/xml/objects/object_gi_shield_2.xml
+++ b/assets/xml/objects/object_gi_shield_2.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_shield_3.xml b/assets/xml/objects/object_gi_shield_3.xml
index 8e011bb92..19f23203b 100644
--- a/assets/xml/objects/object_gi_shield_3.xml
+++ b/assets/xml/objects/object_gi_shield_3.xml
@@ -1,10 +1,15 @@
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_soldout.xml b/assets/xml/objects/object_gi_soldout.xml
index 8a733af02..109a65072 100644
--- a/assets/xml/objects/object_gi_soldout.xml
+++ b/assets/xml/objects/object_gi_soldout.xml
@@ -1,6 +1,11 @@
+
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_soul.xml b/assets/xml/objects/object_gi_soul.xml
index 945670888..942062535 100644
--- a/assets/xml/objects/object_gi_soul.xml
+++ b/assets/xml/objects/object_gi_soul.xml
@@ -1,8 +1,16 @@
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_stick.xml b/assets/xml/objects/object_gi_stick.xml
index c038af357..859e4f641 100644
--- a/assets/xml/objects/object_gi_stick.xml
+++ b/assets/xml/objects/object_gi_stick.xml
@@ -1,5 +1,11 @@
+
+
+
+
-
+
+
+
diff --git a/assets/xml/objects/object_gi_stonemask.xml b/assets/xml/objects/object_gi_stonemask.xml
index 9d3b62b8c..497ace2df 100644
--- a/assets/xml/objects/object_gi_stonemask.xml
+++ b/assets/xml/objects/object_gi_stonemask.xml
@@ -1,8 +1,13 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_sutaru.xml b/assets/xml/objects/object_gi_sutaru.xml
index 3b991123e..1a425dd2a 100644
--- a/assets/xml/objects/object_gi_sutaru.xml
+++ b/assets/xml/objects/object_gi_sutaru.xml
@@ -1,6 +1,12 @@
+
+
+
+
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_gi_sword_1.xml b/assets/xml/objects/object_gi_sword_1.xml
index a03de82d5..3f1bd41c0 100644
--- a/assets/xml/objects/object_gi_sword_1.xml
+++ b/assets/xml/objects/object_gi_sword_1.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_sword_2.xml b/assets/xml/objects/object_gi_sword_2.xml
index 045936ef2..6a2bb445b 100644
--- a/assets/xml/objects/object_gi_sword_2.xml
+++ b/assets/xml/objects/object_gi_sword_2.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_sword_3.xml b/assets/xml/objects/object_gi_sword_3.xml
index 79a207991..b347c33cf 100644
--- a/assets/xml/objects/object_gi_sword_3.xml
+++ b/assets/xml/objects/object_gi_sword_3.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_sword_4.xml b/assets/xml/objects/object_gi_sword_4.xml
index b5c826dc3..7732259c6 100644
--- a/assets/xml/objects/object_gi_sword_4.xml
+++ b/assets/xml/objects/object_gi_sword_4.xml
@@ -1,9 +1,14 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_truth_mask.xml b/assets/xml/objects/object_gi_truth_mask.xml
index 52fdaaf65..cbc818cea 100644
--- a/assets/xml/objects/object_gi_truth_mask.xml
+++ b/assets/xml/objects/object_gi_truth_mask.xml
@@ -1,8 +1,16 @@
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_gi_zoramask.xml b/assets/xml/objects/object_gi_zoramask.xml
index c5ba218b4..7deefdf71 100644
--- a/assets/xml/objects/object_gi_zoramask.xml
+++ b/assets/xml/objects/object_gi_zoramask.xml
@@ -1,11 +1,16 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_harfgibud.xml b/assets/xml/objects/object_harfgibud.xml
index a97e42c00..361bbe74c 100644
--- a/assets/xml/objects/object_harfgibud.xml
+++ b/assets/xml/objects/object_harfgibud.xml
@@ -5,23 +5,25 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -35,47 +37,51 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -91,25 +97,27 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_ma1.xml b/assets/xml/objects/object_ma1.xml
index 3d0ea1fcc..4d60bb95f 100644
--- a/assets/xml/objects/object_ma1.xml
+++ b/assets/xml/objects/object_ma1.xml
@@ -1,96 +1,116 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_ma2.xml b/assets/xml/objects/object_ma2.xml
index a61eff4e0..5e642f340 100644
--- a/assets/xml/objects/object_ma2.xml
+++ b/assets/xml/objects/object_ma2.xml
@@ -1,85 +1,101 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_nnh.xml b/assets/xml/objects/object_nnh.xml
index 1bb833cf0..f7f546e25 100644
--- a/assets/xml/objects/object_nnh.xml
+++ b/assets/xml/objects/object_nnh.xml
@@ -1,10 +1,15 @@
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_osn.xml b/assets/xml/objects/object_osn.xml
index b31660e6a..2cb8315ea 100644
--- a/assets/xml/objects/object_osn.xml
+++ b/assets/xml/objects/object_osn.xml
@@ -112,6 +112,6 @@
-
+
diff --git a/assets/xml/objects/object_pamera.xml b/assets/xml/objects/object_pamera.xml
index 6b457ab8b..28f73983e 100644
--- a/assets/xml/objects/object_pamera.xml
+++ b/assets/xml/objects/object_pamera.xml
@@ -1,26 +1,28 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -38,29 +40,31 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_po_sisters.xml b/assets/xml/objects/object_po_sisters.xml
index f42fe1664..61bc0b404 100644
--- a/assets/xml/objects/object_po_sisters.xml
+++ b/assets/xml/objects/object_po_sisters.xml
@@ -1,53 +1,70 @@
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_sdn.xml b/assets/xml/objects/object_sdn.xml
index 219436b02..88c62434e 100644
--- a/assets/xml/objects/object_sdn.xml
+++ b/assets/xml/objects/object_sdn.xml
@@ -44,23 +44,23 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_st.xml b/assets/xml/objects/object_st.xml
index 2dabce2f8..b8b39f94f 100644
--- a/assets/xml/objects/object_st.xml
+++ b/assets/xml/objects/object_st.xml
@@ -33,8 +33,8 @@
-
-
+
+
diff --git a/assets/xml/objects/object_stk2.xml b/assets/xml/objects/object_stk2.xml
index 2aab5947e..d9bde796d 100644
--- a/assets/xml/objects/object_stk2.xml
+++ b/assets/xml/objects/object_stk2.xml
@@ -27,10 +27,10 @@
-
-
-
-
+
+
+
+
@@ -96,7 +96,7 @@
-
+
diff --git a/assets/xml/objects/object_um.xml b/assets/xml/objects/object_um.xml
index 5717124a7..aa979bf75 100644
--- a/assets/xml/objects/object_um.xml
+++ b/assets/xml/objects/object_um.xml
@@ -10,26 +10,31 @@
-
+
+
+
-
+
-
+
+
+
+
@@ -49,31 +54,35 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -85,7 +94,19 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -100,6 +121,6 @@
-
+
diff --git a/assets/xml/overlays/ovl_En_Bigslime.xml b/assets/xml/overlays/ovl_En_Bigslime.xml
index 9526daea6..fe92a87fb 100644
--- a/assets/xml/overlays/ovl_En_Bigslime.xml
+++ b/assets/xml/overlays/ovl_En_Bigslime.xml
@@ -1,20 +1,14 @@
-
+
-
-
-
-
-
-
diff --git a/include/PR/gbi.h b/include/PR/gbi.h
index f7b249af8..2c29420ea 100644
--- a/include/PR/gbi.h
+++ b/include/PR/gbi.h
@@ -17,24 +17,24 @@
# define F3DEX_GBI
# endif
#define G_NOOP 0x00
-#define G_RDPHALF_2 0xf1
-#define G_SETOTHERMODE_H 0xe3
-#define G_SETOTHERMODE_L 0xe2
-#define G_RDPHALF_1 0xe1
-#define G_SPNOOP 0xe0
-#define G_ENDDL 0xdf
-#define G_DL 0xde
-#define G_LOAD_UCODE 0xdd
-#define G_MOVEMEM 0xdc
-#define G_MOVEWORD 0xdb
-#define G_MTX 0xda
-#define G_GEOMETRYMODE 0xd9
-#define G_POPMTX 0xd8
-#define G_TEXTURE 0xd7
-#define G_DMA_IO 0xd6
-#define G_SPECIAL_1 0xd5
-#define G_SPECIAL_2 0xd4
-#define G_SPECIAL_3 0xd3
+#define G_RDPHALF_2 0xF1
+#define G_SETOTHERMODE_H 0xE3
+#define G_SETOTHERMODE_L 0xE2
+#define G_RDPHALF_1 0xE1
+#define G_SPNOOP 0xE0
+#define G_ENDDL 0xDF
+#define G_DL 0xDE
+#define G_LOAD_UCODE 0xDD
+#define G_MOVEMEM 0xDC
+#define G_MOVEWORD 0xDB
+#define G_MTX 0xDA
+#define G_GEOMETRYMODE 0xD9
+#define G_POPMTX 0xD8
+#define G_TEXTURE 0xD7
+#define G_DMA_IO 0xD6
+#define G_SPECIAL_1 0xD5
+#define G_SPECIAL_2 0xD4
+#define G_SPECIAL_3 0xD3
#define G_VTX 0x01
#define G_MODIFYVTX 0x02
@@ -89,38 +89,38 @@
#define G_SPRITE2D_DRAW (G_IMMFIRST-2)
/* RDP commands: */
-#define G_NOOP 0xc0 /* 0 */
+#define G_NOOP 0xC0 /* 0 */
#endif /* F3DEX_GBI_2 */
/* RDP commands: */
-#define G_SETCIMG 0xff /* -1 */
-#define G_SETZIMG 0xfe /* -2 */
-#define G_SETTIMG 0xfd /* -3 */
-#define G_SETCOMBINE 0xfc /* -4 */
-#define G_SETENVCOLOR 0xfb /* -5 */
-#define G_SETPRIMCOLOR 0xfa /* -6 */
-#define G_SETBLENDCOLOR 0xf9 /* -7 */
-#define G_SETFOGCOLOR 0xf8 /* -8 */
-#define G_SETFILLCOLOR 0xf7 /* -9 */
-#define G_FILLRECT 0xf6 /* -10 */
-#define G_SETTILE 0xf5 /* -11 */
-#define G_LOADTILE 0xf4 /* -12 */
-#define G_LOADBLOCK 0xf3 /* -13 */
-#define G_SETTILESIZE 0xf2 /* -14 */
-#define G_LOADTLUT 0xf0 /* -16 */
-#define G_RDPSETOTHERMODE 0xef /* -17 */
-#define G_SETPRIMDEPTH 0xee /* -18 */
-#define G_SETSCISSOR 0xed /* -19 */
-#define G_SETCONVERT 0xec /* -20 */
-#define G_SETKEYR 0xeb /* -21 */
-#define G_SETKEYGB 0xea /* -22 */
-#define G_RDPFULLSYNC 0xe9 /* -23 */
-#define G_RDPTILESYNC 0xe8 /* -24 */
-#define G_RDPPIPESYNC 0xe7 /* -25 */
-#define G_RDPLOADSYNC 0xe6 /* -26 */
-#define G_TEXRECTFLIP 0xe5 /* -27 */
-#define G_TEXRECT 0xe4 /* -28 */
+#define G_SETCIMG 0xFF /* -1 */
+#define G_SETZIMG 0xFE /* -2 */
+#define G_SETTIMG 0xFD /* -3 */
+#define G_SETCOMBINE 0xFC /* -4 */
+#define G_SETENVCOLOR 0xFB /* -5 */
+#define G_SETPRIMCOLOR 0xFA /* -6 */
+#define G_SETBLENDCOLOR 0xF9 /* -7 */
+#define G_SETFOGCOLOR 0xF8 /* -8 */
+#define G_SETFILLCOLOR 0xF7 /* -9 */
+#define G_FILLRECT 0xF6 /* -10 */
+#define G_SETTILE 0xF5 /* -11 */
+#define G_LOADTILE 0xF4 /* -12 */
+#define G_LOADBLOCK 0xF3 /* -13 */
+#define G_SETTILESIZE 0xF2 /* -14 */
+#define G_LOADTLUT 0xF0 /* -16 */
+#define G_RDPSETOTHERMODE 0xEF /* -17 */
+#define G_SETPRIMDEPTH 0xEE /* -18 */
+#define G_SETSCISSOR 0xED /* -19 */
+#define G_SETCONVERT 0xEC /* -20 */
+#define G_SETKEYR 0xEB /* -21 */
+#define G_SETKEYGB 0xEA /* -22 */
+#define G_RDPFULLSYNC 0xE9 /* -23 */
+#define G_RDPTILESYNC 0xE8 /* -24 */
+#define G_RDPPIPESYNC 0xE7 /* -25 */
+#define G_RDPLOADSYNC 0xE6 /* -26 */
+#define G_TEXRECTFLIP 0xE5 /* -27 */
+#define G_TEXRECT 0xE4 /* -28 */
/*
@@ -131,14 +131,14 @@
* These id's are -56, -52, -54, -50, -55, -51, -53, -49, ...
* edge, shade, texture, zbuff bits: estz
*/
-#define G_TRI_FILL 0xc8 /* fill triangle: 11001000 */
-#define G_TRI_SHADE 0xcc /* shade triangle: 11001100 */
-#define G_TRI_TXTR 0xca /* texture triangle: 11001010 */
-#define G_TRI_SHADE_TXTR 0xce /* shade, texture triangle: 11001110 */
-#define G_TRI_FILL_ZBUFF 0xc9 /* fill, zbuff triangle: 11001001 */
-#define G_TRI_SHADE_ZBUFF 0xcd /* shade, zbuff triangle: 11001101 */
-#define G_TRI_TXTR_ZBUFF 0xcb /* texture, zbuff triangle: 11001011 */
-#define G_TRI_SHADE_TXTR_ZBUFF 0xcf /* shade, txtr, zbuff trngl: 11001111 */
+#define G_TRI_FILL 0xC8 /* fill triangle: 11001000 */
+#define G_TRI_SHADE 0xCC /* shade triangle: 11001100 */
+#define G_TRI_TXTR 0xCA /* texture triangle: 11001010 */
+#define G_TRI_SHADE_TXTR 0xCE /* shade, texture triangle: 11001110 */
+#define G_TRI_FILL_ZBUFF 0xC9 /* fill, zbuff triangle: 11001001 */
+#define G_TRI_SHADE_ZBUFF 0xCD /* shade, zbuff triangle: 11001101 */
+#define G_TRI_TXTR_ZBUFF 0xCB /* texture, zbuff triangle: 11001011 */
+#define G_TRI_SHADE_TXTR_ZBUFF 0xCF /* shade, txtr, zbuff trngl: 11001111 */
/*
* A TRI_FILL triangle is just the edges. You need to set the DP
@@ -178,13 +178,13 @@
/* gets added to RDP command, in order to test for addres fixup: */
#define G_RDP_ADDR_FIXUP 3 /* |RDP cmds| <= this, do addr fixup */
#ifdef _LANGUAGE_ASSEMBLY
-#define G_RDP_TEXRECT_CHECK ((-1*G_TEXRECTFLIP)& 0xff)
+#define G_RDP_TEXRECT_CHECK ((-1*G_TEXRECTFLIP)& 0xFF)
#endif
/* macros for command parsing: */
#define GDMACMD(x) (x)
#define GIMMCMD(x) (G_IMMFIRST-(x))
-#define GRDPCMD(x) (0xff-(x))
+#define GRDPCMD(x) (0xFF-(x))
#define G_DMACMDSIZ 128
#define G_IMMCMDSIZ 64
@@ -211,11 +211,11 @@
* Note : this number is NOT the viewport z-scale constant.
* See the comment next to G_MAXZ for more info.
*/
-#define G_MAXFBZ 0x3fff /* 3b exp, 11b mantissa */
+#define G_MAXFBZ 0x3FFF /* 3b exp, 11b mantissa */
-#define GPACK_RGBA5551(r, g, b, a) ((((r)<<8) & 0xf800) | \
- (((g)<<3) & 0x7c0) | \
- (((b)>>2) & 0x3e) | ((a) & 0x1))
+#define GPACK_RGBA5551(r, g, b, a) ((((r)<<8) & 0xF800) | \
+ (((g)<<3) & 0x7C0) | \
+ (((b)>>2) & 0x3E) | ((a) & 0x1))
#define GPACK_IA16(i, a) (((i) << 8) | (a))
#define GPACK_ZDZ(z, dz) ((z) << 2 | (dz))
@@ -590,7 +590,7 @@
#define ZMODE_OPA 0
#define ZMODE_INTER 0x400
#define ZMODE_XLU 0x800
-#define ZMODE_DEC 0xc00
+#define ZMODE_DEC 0xC00
#define CVG_X_ALPHA 0x1000
#define ALPHA_CVG_SEL 0x2000
#define FORCE_BL 0x4000
@@ -1075,7 +1075,7 @@ typedef struct {
* but we don't have the ucode to do that...
*
*/
-#define G_MAXZ 0x03ff /* 10 bits of integer screen-Z precision */
+#define G_MAXZ 0x03FF /* 10 bits of integer screen-Z precision */
/*
* The viewport structure elements have 2 bits of fraction, necessary
@@ -1131,17 +1131,17 @@ typedef union {
# define G_MV_LOOKATX 0x84
# define G_MV_L0 0x86
# define G_MV_L1 0x88
-# define G_MV_L2 0x8a
-# define G_MV_L3 0x8c
-# define G_MV_L4 0x8e
+# define G_MV_L2 0x8A
+# define G_MV_L3 0x8C
+# define G_MV_L4 0x8E
# define G_MV_L5 0x90
# define G_MV_L6 0x92
# define G_MV_L7 0x94
# define G_MV_TXTATT 0x96
-# define G_MV_MATRIX_1 0x9e /* NOTE: this is in moveword table */
+# define G_MV_MATRIX_1 0x9E /* NOTE: this is in moveword table */
# define G_MV_MATRIX_2 0x98
-# define G_MV_MATRIX_3 0x9a
-# define G_MV_MATRIX_4 0x9c
+# define G_MV_MATRIX_3 0x9A
+# define G_MV_MATRIX_4 0x9C
#endif /* F3DEX_GBI_2 */
/*
@@ -1157,22 +1157,22 @@ typedef union {
#define G_MW_CLIP 0x04
#define G_MW_SEGMENT 0x06
#define G_MW_FOG 0x08
-#define G_MW_LIGHTCOL 0x0a
+#define G_MW_LIGHTCOL 0x0A
#ifdef F3DEX_GBI_2
-# define G_MW_FORCEMTX 0x0c
+# define G_MW_FORCEMTX 0x0C
#else /* F3DEX_GBI_2 */
-# define G_MW_POINTS 0x0c
+# define G_MW_POINTS 0x0C
#endif /* F3DEX_GBI_2 */
-#define G_MW_PERSPNORM 0x0e
+#define G_MW_PERSPNORM 0x0E
/*
* These are offsets from the address in the dmem table
*/
#define G_MWO_NUMLIGHT 0x00
#define G_MWO_CLIP_RNX 0x04
-#define G_MWO_CLIP_RNY 0x0c
+#define G_MWO_CLIP_RNY 0x0C
#define G_MWO_CLIP_RPX 0x14
-#define G_MWO_CLIP_RPY 0x1c
+#define G_MWO_CLIP_RPY 0x1C
#define G_MWO_SEGMENT_0 0x00
#define G_MWO_SEGMENT_1 0x01
#define G_MWO_SEGMENT_2 0x02
@@ -1183,30 +1183,30 @@ typedef union {
#define G_MWO_SEGMENT_7 0x07
#define G_MWO_SEGMENT_8 0x08
#define G_MWO_SEGMENT_9 0x09
-#define G_MWO_SEGMENT_A 0x0a
-#define G_MWO_SEGMENT_B 0x0b
-#define G_MWO_SEGMENT_C 0x0c
-#define G_MWO_SEGMENT_D 0x0d
-#define G_MWO_SEGMENT_E 0x0e
-#define G_MWO_SEGMENT_F 0x0f
+#define G_MWO_SEGMENT_A 0x0A
+#define G_MWO_SEGMENT_B 0x0B
+#define G_MWO_SEGMENT_C 0x0C
+#define G_MWO_SEGMENT_D 0x0D
+#define G_MWO_SEGMENT_E 0x0E
+#define G_MWO_SEGMENT_F 0x0F
#define G_MWO_FOG 0x00
#define G_MWO_aLIGHT_1 0x00
#define G_MWO_bLIGHT_1 0x04
#ifdef F3DEX_GBI_2
#define G_MWO_aLIGHT_2 0x18
-#define G_MWO_bLIGHT_2 0x1c
+#define G_MWO_bLIGHT_2 0x1C
#define G_MWO_aLIGHT_3 0x30
#define G_MWO_bLIGHT_3 0x34
#define G_MWO_aLIGHT_4 0x48
-#define G_MWO_bLIGHT_4 0x4c
+#define G_MWO_bLIGHT_4 0x4C
#define G_MWO_aLIGHT_5 0x60
#define G_MWO_bLIGHT_5 0x64
#define G_MWO_aLIGHT_6 0x78
-#define G_MWO_bLIGHT_6 0x7c
+#define G_MWO_bLIGHT_6 0x7C
#define G_MWO_aLIGHT_7 0x90
#define G_MWO_bLIGHT_7 0x94
-#define G_MWO_aLIGHT_8 0xa8
-#define G_MWO_bLIGHT_8 0xac
+#define G_MWO_aLIGHT_8 0xA8
+#define G_MWO_bLIGHT_8 0xAC
#else
#define G_MWO_aLIGHT_2 0x20
#define G_MWO_bLIGHT_2 0x24
@@ -1216,33 +1216,33 @@ typedef union {
#define G_MWO_bLIGHT_4 0x64
#define G_MWO_aLIGHT_5 0x80
#define G_MWO_bLIGHT_5 0x84
-#define G_MWO_aLIGHT_6 0xa0
-#define G_MWO_bLIGHT_6 0xa4
-#define G_MWO_aLIGHT_7 0xc0
-#define G_MWO_bLIGHT_7 0xc4
-#define G_MWO_aLIGHT_8 0xe0
-#define G_MWO_bLIGHT_8 0xe4
+#define G_MWO_aLIGHT_6 0xA0
+#define G_MWO_bLIGHT_6 0xA4
+#define G_MWO_aLIGHT_7 0xC0
+#define G_MWO_bLIGHT_7 0xC4
+#define G_MWO_aLIGHT_8 0xE0
+#define G_MWO_bLIGHT_8 0xE4
#endif
#define G_MWO_MATRIX_XX_XY_I 0x00
#define G_MWO_MATRIX_XZ_XW_I 0x04
#define G_MWO_MATRIX_YX_YY_I 0x08
-#define G_MWO_MATRIX_YZ_YW_I 0x0c
+#define G_MWO_MATRIX_YZ_YW_I 0x0C
#define G_MWO_MATRIX_ZX_ZY_I 0x10
#define G_MWO_MATRIX_ZZ_ZW_I 0x14
#define G_MWO_MATRIX_WX_WY_I 0x18
-#define G_MWO_MATRIX_WZ_WW_I 0x1c
+#define G_MWO_MATRIX_WZ_WW_I 0x1C
#define G_MWO_MATRIX_XX_XY_F 0x20
#define G_MWO_MATRIX_XZ_XW_F 0x24
#define G_MWO_MATRIX_YX_YY_F 0x28
-#define G_MWO_MATRIX_YZ_YW_F 0x2c
+#define G_MWO_MATRIX_YZ_YW_F 0x2C
#define G_MWO_MATRIX_ZX_ZY_F 0x30
#define G_MWO_MATRIX_ZZ_ZW_F 0x34
#define G_MWO_MATRIX_WX_WY_F 0x38
-#define G_MWO_MATRIX_WZ_WW_F 0x3c
+#define G_MWO_MATRIX_WZ_WW_F 0x3C
#define G_MWO_POINT_RGBA 0x10
#define G_MWO_POINT_ST 0x14
#define G_MWO_POINT_XYSCREEN 0x18
-#define G_MWO_POINT_ZSCREEN 0x1c
+#define G_MWO_POINT_ZSCREEN 0x1C
/*
* Light structure.
@@ -2373,14 +2373,14 @@ _DW({ \
Gfx *_g = (Gfx *)(pkt); \
\
_g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | \
- ((0x0f & (vstart))*40); \
- _g->words.w1 = (unsigned int)((0x0f & ((vend)+1))*40); \
+ ((0x0FF& (vstart))*40); \
+ _g->words.w1 = (unsigned int)((0x0F & ((vend)+1))*40); \
}
#define gsSPCullDisplayList(vstart,vend) \
{ \
- _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart))*40), \
- ((0x0f & ((vend)+1))*40) \
+ _SHIFTL(G_CULLDL, 24, 8) | ((0x0F & (vstart))*40), \
+ ((0x0F & ((vend)+1))*40) \
}
#endif
@@ -2393,17 +2393,17 @@ _DW({ \
* Clipping Macros
*/
#define FR_NEG_FRUSTRATIO_1 0x00000001
-#define FR_POS_FRUSTRATIO_1 0x0000ffff
+#define FR_POS_FRUSTRATIO_1 0x0000FFFF
#define FR_NEG_FRUSTRATIO_2 0x00000002
-#define FR_POS_FRUSTRATIO_2 0x0000fffe
+#define FR_POS_FRUSTRATIO_2 0x0000FFFE
#define FR_NEG_FRUSTRATIO_3 0x00000003
-#define FR_POS_FRUSTRATIO_3 0x0000fffd
+#define FR_POS_FRUSTRATIO_3 0x0000FFFD
#define FR_NEG_FRUSTRATIO_4 0x00000004
-#define FR_POS_FRUSTRATIO_4 0x0000fffc
+#define FR_POS_FRUSTRATIO_4 0x0000FFFC
#define FR_NEG_FRUSTRATIO_5 0x00000005
-#define FR_POS_FRUSTRATIO_5 0x0000fffb
+#define FR_POS_FRUSTRATIO_5 0x0000FFFB
#define FR_NEG_FRUSTRATIO_6 0x00000006
-#define FR_POS_FRUSTRATIO_6 0x0000fffa
+#define FR_POS_FRUSTRATIO_6 0x0000FFFA
/*
* r should be one of: FRUSTRATIO_1, FRUSTRATIO_2, FRUSTRATIO_3, ... FRUSTRATIO_6
*/
@@ -2867,18 +2867,18 @@ _DW({ \
gsSPLookAtY((char *)(la)+16)
#define gDPSetHilite1Tile(pkt, tile, hilite, width, height) \
- gDPSetTileSize(pkt, tile, (hilite)->h.x1 & 0xfff, (hilite)->h.y1 & 0xfff, \
- ((((width)-1)*4)+(hilite)->h.x1) & 0xfff, ((((height)-1)*4)+(hilite)->h.y1) & 0xfff)
+ gDPSetTileSize(pkt, tile, (hilite)->h.x1 & 0xFFF, (hilite)->h.y1 & 0xFFF, \
+ ((((width)-1)*4)+(hilite)->h.x1) & 0xFFF, ((((height)-1)*4)+(hilite)->h.y1) & 0xFFF)
#define gsDPSetHilite1Tile(tile, hilite, width, height) \
- gsDPSetTileSize(tile, (hilite)->h.x1 & 0xfff, (hilite)->h.y1 & 0xfff, \
- ((((width)-1)*4)+(hilite)->h.x1) & 0xfff, ((((height)-1)*4)+(hilite)->h.y1) & 0xfff)
+ gsDPSetTileSize(tile, (hilite)->h.x1 & 0xFFF, (hilite)->h.y1 & 0xFFF, \
+ ((((width)-1)*4)+(hilite)->h.x1) & 0xFFF, ((((height)-1)*4)+(hilite)->h.y1) & 0xFFF)
#define gDPSetHilite2Tile(pkt, tile, hilite, width, height) \
- gDPSetTileSize(pkt, tile, (hilite)->h.x2 & 0xfff, (hilite)->h.y2 & 0xfff, \
- ((((width)-1)*4)+(hilite)->h.x2) & 0xfff, ((((height)-1)*4)+(hilite)->h.y2) & 0xfff)
+ gDPSetTileSize(pkt, tile, (hilite)->h.x2 & 0xFFF, (hilite)->h.y2 & 0xFFF, \
+ ((((width)-1)*4)+(hilite)->h.x2) & 0xFFF, ((((height)-1)*4)+(hilite)->h.y2) & 0xFFF)
#define gsDPSetHilite2Tile(tile, hilite, width, height) \
- gsDPSetTileSize(tile, (hilite)->h.x2 & 0xfff, (hilite)->h.y2 & 0xfff, \
- ((((width)-1)*4)+(hilite)->h.x2) & 0xfff, ((((height)-1)*4)+(hilite)->h.y2) & 0xfff)
+ gsDPSetTileSize(tile, (hilite)->h.x2 & 0xFFF, (hilite)->h.y2 & 0xFFF, \
+ ((((width)-1)*4)+(hilite)->h.x2) & 0xFFF, ((((height)-1)*4)+(hilite)->h.y2) & 0xFFF)
/*
* FOG macros
@@ -4333,7 +4333,7 @@ _DW({ \
{ \
gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
gDPTileSync(pkt); \
- gDPSetTile(pkt, 0, 0, 0, (256+(((pal)&0xf)*16)), \
+ gDPSetTile(pkt, 0, 0, 0, (256+(((pal)&0xF)*16)), \
G_TX_LOADTILE, 0 , 0, 0, 0, 0, 0, 0); \
gDPLoadSync(pkt); \
gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 15); \
@@ -4344,7 +4344,7 @@ _DW({ \
#define gDPLoadTLUT_pal16(pkt, pal, dram) \
\
- _gDPLoadTextureBlock(pkt, dram, (256+(((pal)&0xf)*16)), \
+ _gDPLoadTextureBlock(pkt, dram, (256+(((pal)&0xF)*16)), \
G_IM_FMT_RGBA, G_IM_SIZ_16b, 4*16, 1, \
pal, 0, 0, 0, 0, 0, 0)
@@ -4361,7 +4361,7 @@ _DW({ \
\
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), \
gsDPTileSync(), \
- gsDPSetTile(0, 0, 0, (256+(((pal)&0xf)*16)), \
+ gsDPSetTile(0, 0, 0, (256+(((pal)&0xF)*16)), \
G_TX_LOADTILE, 0 , 0, 0, 0, 0, 0, 0), \
gsDPLoadSync(), \
gsDPLoadTLUTCmd(G_TX_LOADTILE, 15), \
@@ -4371,7 +4371,7 @@ _DW({ \
#define gsDPLoadTLUT_pal16(pal, dram) \
\
- _gsDPLoadTextureBlock(dram, (256+(((pal)&0xf)*16)), \
+ _gsDPLoadTextureBlock(dram, (256+(((pal)&0xF)*16)), \
G_IM_FMT_RGBA, G_IM_SIZ_16b, 4*16, 1, \
pal, 0, 0, 0, 0, 0, 0)
diff --git a/include/PR/mbi.h b/include/PR/mbi.h
index 736018c56..0577165e7 100644
--- a/include/PR/mbi.h
+++ b/include/PR/mbi.h
@@ -87,7 +87,7 @@
**************************************************************************/
#define NUM_SEGMENTS (16)
-#define SEGMENT_OFFSET(a) ((unsigned int)(a) & 0x00ffffff)
+#define SEGMENT_OFFSET(a) ((unsigned int)(a) & 0x00FFFFFF)
#define SEGMENT_NUMBER(a) (((unsigned int)(a) << 4) >> 28)
#define SEGMENT_ADDR(num, off) (((num) << 24) + (off))
diff --git a/include/functions.h b/include/functions.h
index ddc94564e..7160a95fe 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -130,6 +130,7 @@ u32 StackCheck_Check(StackEntry* entry);
void MtxConv_F2L(Mtx* m1, MtxF* m2);
void MtxConv_L2F(MtxF* m1, Mtx* m2);
+
void __assert(const char* file, u32 lineNum);
// void func_800862B4(void);
void* SystemArena_MallocMin1(u32 size);
@@ -893,11 +894,15 @@ void DynaPoly_UpdateBgActorTransforms(PlayState* play, DynaCollisionContext* dyn
void CollisionHeader_SegmentedToVirtual(CollisionHeader* header);
void CollisionHeader_GetVirtual(CollisionHeader* meshSegPtr, CollisionHeader** param_2);
void BgCheck_InitCollisionHeaders(CollisionContext* colCtx, PlayState* play);
-u32 SurfaceType_GetData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId, s32 dataIdx);
-u32 SurfaceType_GetCamDataIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u16 SurfaceType_GetCameraSType(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u16 SurfaceType_GetNumCameras(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-Vec3s* SurfaceType_GetCamPosData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+
+u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
+u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u16 BgCheck_GetBgCamCountImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
+u16 BgCheck_GetBgCamCount(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+Vec3s* BgCheck_GetBgCamFuncDataImpl(CollisionContext* colCtx, s32 bgCamIndex, s32 bgId);
+Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+
u32 SurfaceType_GetSceneExitIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u32 func_800C99D4(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u32 func_800C99FC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
@@ -929,8 +934,8 @@ s32 WaterBox_GetSurface1(PlayState* play, CollisionContext* colCtx, f32 x, f32 z
s32 WaterBox_GetSurface1_2(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceChkDist, WaterBox** outWaterBox, s32* bgId);
f32 func_800CA568(CollisionContext* colCtx, s32 waterBoxId, s32 bgId);
-u16 WaterBox_GetCameraSType(CollisionContext* colCtx, WaterBox* waterBox, s32 bgId);
-void func_800CA6B8(CollisionContext* colCtx, WaterBox* waterBox);
+u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox, s32 bgId);
+void WaterBox_GetSceneBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox);
u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox);
s32 func_800CA6F0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox, s32* bgId);
s32 func_800CA9D0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
@@ -974,7 +979,7 @@ f32 func_800CB700(Camera* camera);
// void func_800CB7F8(void);
// void func_800CB828(void);
// void func_800CB854(void);
-// void func_800CB880(void);
+// void Camera_IsSwimming(void);
// void func_800CB8C8(void);
// void func_800CB8F4(void);
// void func_800CB924(void);
@@ -997,10 +1002,10 @@ f32 func_800CB700(Camera* camera);
// void func_800CC488(void);
// void func_800CC56C(void);
// void func_800CC5C8(void);
-// void func_800CC740(void);
-// void func_800CC7A8(void);
-// void func_800CC804(void);
-// void func_800CC874(void);
+// void Camera_GetBgCamOrActorCsCamSetting(void);
+// void Camera_GetBgCamOrActorCsCamFuncData(void);
+// void Camera_GetBgCamIndex(void);
+// void Camera_GetWaterBoxBgCamSetting(void);
// void func_800CC938(void);
// void func_800CC958(void);
// void func_800CC9C0(void);
@@ -1389,30 +1394,8 @@ s32 Cutscene_GetActorActionIndex(PlayState* play, u16 actorActionCmd);
s32 Cutscene_CheckActorAction(PlayState* play, u16 actorActionCmd);
u8 Cutscene_IsPlaying(PlayState* play);
-void GetItem_Draw(PlayState* play, s16 index);
-void func_800EE364(PlayState* play, s16 index);
-void func_800EE400(PlayState* play, s16 index);
-void func_800EE5FC(PlayState* play, s16 index);
-void func_800EE7D8(PlayState* play, s16 index);
-void func_800EE940(PlayState* play, s16 index);
-void func_800EEA48(PlayState* play, s16 index);
-void func_800EEC18(PlayState* play, s16 index);
-void func_800EED20(PlayState* play, s16 index);
-void func_800EEE34(PlayState* play, s16 index);
-void func_800EEF4C(PlayState* play, s16 index);
-void func_800EF054(PlayState* play, s16 index);
-void func_800EF0F0(PlayState* play, s16 index);
-void func_800EF1F4(PlayState* play, s16 index);
-void func_800EF2AC(PlayState* play, s16 index);
-void func_800EF364(PlayState* play, s16 index);
-void func_800EF4D4(PlayState* play, s16 index);
-void func_800EF65C(PlayState* play, s16 index);
-void func_800EF780(PlayState* play, s16 index);
-void func_800EF89C(PlayState* play, s16 index);
-void func_800EF984(PlayState* play, s16 index);
-void func_800EFAB8(PlayState* play, s16 index);
-void func_800EFBFC(PlayState* play, s16 index);
-void func_800EFD44(PlayState* play, s16 index);
+void GetItem_Draw(PlayState* play, s16 drawId);
+
void EffFootmark_Init(PlayState* play);
void EffFootmark_Add(PlayState* play, MtxF* displayMatrix, Actor* actor, u8 id, Vec3f* location, u16 size, u8 red, u8 green, u8 blue, u16 alpha, u16 alphaChange, u16 fadeoutDelay);
void EffFootmark_Update(PlayState* play);
@@ -1447,7 +1430,7 @@ s16 ActorCutscene_GetCurrentIndex(void);
ActorCutscene* ActorCutscene_GetCutscene(s16 index);
s16 ActorCutscene_GetAdditionalCutscene(s16 index);
s16 ActorCutscene_GetLength(s16 index);
-s32 func_800F2138(s8 arg0);
+s32 func_800F2138(s32 arg0);
s32 func_800F2178(s16 arg0);
s16 ActorCutscene_GetCurrentSubCamId(s16 index);
s16 func_800F21CC(void);
@@ -2632,8 +2615,8 @@ void Play_CopyCamera(PlayState* play, s16 dstCamId, s16 srcCamId);
// void func_80169A50(void);
void Play_CameraChangeSetting(PlayState* play, s16 camId, s16 setting);
void func_80169AFC(PlayState* play, s16 camId, s16 arg2);
-s16 Play_GetCsCamDataSetting(PlayState* play, s32 camId);
-Vec3s* Play_GetCsCamDataVec3s(PlayState* play, s32 camId);
+u16 Play_GetActorCsCamSetting(PlayState* play, s32 csCamDataIndex);
+Vec3s* Play_GetActorCsCamFuncData(PlayState* play, s32 csCamDataIndex);
s16 Play_GetOriginalSceneNumber(s16 sceneNum);
void Play_SaveCycleSceneFlags(GameState* gameState);
void Play_SetRespawnData(GameState* gameState, s32 respawnNumber, u16 sceneSetup, s32 roomIndex, s32 playerParams, Vec3f* pos, s16 yaw);
diff --git a/include/libc/stdint.h b/include/libc/stdint.h
index 1696615a7..20288d40d 100644
--- a/include/libc/stdint.h
+++ b/include/libc/stdint.h
@@ -11,19 +11,19 @@ typedef u32 uintptr_t;
#define INT32_MIN (-0x80000000)
#define INT64_MIN (-0x8000000000000000)
-#define INT8_MAX 0x7f
-#define INT16_MAX 0x7fff
-#define INT32_MAX 0x7fffffff
-#define INT64_MAX 0x7fffffffffffffff
+#define INT8_MAX 0x7F
+#define INT16_MAX 0x7FFF
+#define INT32_MAX 0x7FFFFFFF
+#define INT64_MAX 0x7FFFFFFFFFFFFFFF
-#define UINT8_MAX 0xff
-#define UINT16_MAX 0xffff
-#define UINT32_MAX 0xffffffff
-#define UINT64_MAX 0xffffffffffffffff
+#define UINT8_MAX 0xFF
+#define UINT16_MAX 0xFFFF
+#define UINT32_MAX 0xFFFFFFFF
+#define UINT64_MAX 0xFFFFFFFFFFFFFFFF
#define INTPTR_MIN (-0x80000000)
-#define INTPTR_MAX 0x7fffffff
-#define UINTPTR_MAX 0xffffffff
+#define INTPTR_MAX 0x7FFFFFFF
+#define UINTPTR_MAX 0xFFFFFFFF
#endif /* STDINT_H */
diff --git a/include/macros.h b/include/macros.h
index fd6f0e62a..5d1829c4c 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -29,13 +29,6 @@
#define GET_FIRST_ENEMY(play) ((Actor*)(play)->actorCtx.actorLists[ACTORCAT_ENEMY].first)
-// linkAge still exists in MM, but is always set to 0 (always adult)
-// There are remnants of these macros from OOT, but they are essentially useless
-#define LINK_IS_CHILD (gSaveContext.save.linkAge == 1)
-#define LINK_IS_ADULT (gSaveContext.save.linkAge == 0)
-
-#define CURRENT_DAY (((void)0, gSaveContext.save.day) % 5)
-
#define CLOCK_TIME(hr, min) (s32)(((hr) * 60 + (min)) * 0x10000 / (24 * 60))
#define CLOCK_TIME_MINUTE (CLOCK_TIME(0, 1))
#define DAY_LENGTH (CLOCK_TIME(24, 0))
@@ -46,66 +39,6 @@
#define TIME_TO_MINUTES_ALT_F(time) ((time) / (0x10000 / (24.0f * 60.0f)))
#define CLOCK_TIME_ALT_F(hr, min) (((hr) * 60.0f + (min)) / (24.0f * 60.0f / 0x10000))
-#define SLOT(item) gItemSlots[item]
-#define AMMO(item) gSaveContext.save.inventory.ammo[SLOT(item)]
-#define INV_CONTENT(item) gSaveContext.save.inventory.items[SLOT(item)]
-#define GET_INV_CONTENT(item) ((void)0, gSaveContext.save.inventory.items)[SLOT(item)]
-
-#define CUR_FORM ((gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) ? 0 : gSaveContext.save.playerForm)
-
-#define GET_SAVE_EQUIPS_EQUIPMENT ((void)0, gSaveContext.save.equips.equipment)
-#define GET_SAVE_INVENTORY_UPGRADES ((void)0, gSaveContext.save.inventory.upgrades)
-#define GET_SAVE_INVENTORY_QUEST_ITEMS ((void)0, gSaveContext.save.inventory.questItems)
-
-#define GET_CUR_EQUIP_VALUE(equip) ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipMasks[equip]) >> gEquipShifts[equip])
-
-#define CUR_UPG_VALUE(upg) ((gSaveContext.save.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
-#define GET_CUR_UPG_VALUE(upg) ((GET_SAVE_INVENTORY_UPGRADES & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
-
-#define SET_EQUIP_VALUE(equip, value) (gSaveContext.save.equips.equipment = ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipNegMasks[equip]) | (u16)((u16)(value) << gEquipShifts[equip])))
-
-#define BUTTON_ITEM_EQUIP(form, button) (gSaveContext.save.equips.buttonItems[form][button])
-#define CUR_FORM_EQUIP(button) BUTTON_ITEM_EQUIP(CUR_FORM, button)
-
-#define C_SLOT_EQUIP(form, button) (gSaveContext.save.equips.cButtonSlots[form][button])
-#define CHECK_QUEST_ITEM(item) (GET_SAVE_INVENTORY_QUEST_ITEMS & gBitFlags[item])
-#define SET_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS | gBitFlags[item]))
-#define REMOVE_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS & (-1 - gBitFlags[item])))
-
-#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] & gBitFlags[item])
-#define SET_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] |= (u8)gBitFlags[item])
-#define DUNGEON_KEY_COUNT(dungeonIndex) (gSaveContext.save.inventory.dungeonKeys[(void)0, dungeonIndex])
-
-#define GET_CUR_FORM_BTN_ITEM(btn) ((u8)((btn) == EQUIP_SLOT_B ? BUTTON_ITEM_EQUIP(CUR_FORM, btn) : BUTTON_ITEM_EQUIP(0, btn)))
-#define GET_CUR_FORM_BTN_SLOT(btn) ((u8)((btn) == EQUIP_SLOT_B ? C_SLOT_EQUIP(CUR_FORM, btn) : C_SLOT_EQUIP(0, btn)))
-
-
-#define SET_CUR_FORM_BTN_ITEM(btn, item) \
- if ((btn) == EQUIP_SLOT_B) { \
- BUTTON_ITEM_EQUIP(CUR_FORM, (btn)) = (item); \
- } else { \
- BUTTON_ITEM_EQUIP(0, (btn)) = (item); \
- } \
- (void)0
-
-#define SET_CUR_FORM_BTN_SLOT(btn, item) \
- if ((btn) == EQUIP_SLOT_B) { \
- C_SLOT_EQUIP(CUR_FORM, (btn)) = (item); \
- } else { \
- C_SLOT_EQUIP(0, (btn)) = (item); \
- } \
- (void)0
-
-#define STOLEN_ITEM_NONE (0)
-
-#define STOLEN_ITEM_1 ((gSaveContext.save.stolenItems & 0xFF000000) >> 0x18)
-#define STOLEN_ITEM_2 ((gSaveContext.save.stolenItems & 0x00FF0000) >> 0x10)
-
-#define SET_STOLEN_ITEM_1(itemId) \
- (gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0xFF000000) | ((itemId & 0xFF) << 0x18))
-#define SET_STOLEN_ITEM_2(itemId) \
- (gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0x00FF0000) | ((itemId & 0xFF) << 0x10))
-
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
diff --git a/include/ultra64/gs2dex.h b/include/ultra64/gs2dex.h
index 5c0bc7175..1e77f1cd3 100644
--- a/include/ultra64/gs2dex.h
+++ b/include/ultra64/gs2dex.h
@@ -20,7 +20,7 @@ extern "C" {
* Background
*---------------------------------------------------------------------------*/
#define G_BGLT_LOADBLOCK 0x0033
-#define G_BGLT_LOADTILE 0xfff4
+#define G_BGLT_LOADTILE 0xFFF4
#define G_BG_FLAG_FLIPS 0x01
#define G_BG_FLAG_FLIPT 0x10
@@ -155,7 +155,7 @@ typedef union {
* Loading into TMEM
*---------------------------------------------------------------------------*/
#define G_OBJLT_TXTRBLOCK 0x00001033
-#define G_OBJLT_TXTRTILE 0x00fc1034
+#define G_OBJLT_TXTRTILE 0x00FC1034
#define G_OBJLT_TLUT 0x00000030
#define GS_TB_TSIZE(pix,siz) (GS_PIX2TMEM((pix),(siz))-1)
@@ -220,9 +220,9 @@ typedef struct {
*===========================================================================*/
/* GBI Header */
#ifdef F3DEX_GBI_2
-#define G_OBJ_RECTANGLE_R 0xda
-#define G_OBJ_MOVEMEM 0xdc
-#define G_RDPHALF_0 0xe4
+#define G_OBJ_RECTANGLE_R 0xDA
+#define G_OBJ_MOVEMEM 0xDC
+#define G_RDPHALF_0 0xE4
#define G_OBJ_RECTANGLE 0x01
#define G_OBJ_SPRITE 0x02
#define G_SELECT_DL 0x04
@@ -231,22 +231,22 @@ typedef struct {
#define G_OBJ_LDTX_RECT 0x07
#define G_OBJ_LDTX_RECT_R 0x08
#define G_BG_1CYC 0x09
-#define G_BG_COPY 0x0a
-#define G_OBJ_RENDERMODE 0x0b
+#define G_BG_COPY 0x0A
+#define G_OBJ_RENDERMODE 0x0B
#else
#define G_BG_1CYC 0x01
#define G_BG_COPY 0x02
#define G_OBJ_RECTANGLE 0x03
#define G_OBJ_SPRITE 0x04
#define G_OBJ_MOVEMEM 0x05
-#define G_SELECT_DL 0xb0
-#define G_OBJ_RENDERMODE 0xb1
-#define G_OBJ_RECTANGLE_R 0xb2
-#define G_OBJ_LOADTXTR 0xc1
-#define G_OBJ_LDTX_SPRITE 0xc2
-#define G_OBJ_LDTX_RECT 0xc3
-#define G_OBJ_LDTX_RECT_R 0xc4
-#define G_RDPHALF_0 0xe4
+#define G_SELECT_DL 0xB0
+#define G_OBJ_RENDERMODE 0xB1
+#define G_OBJ_RECTANGLE_R 0xB2
+#define G_OBJ_LOADTXTR 0xC1
+#define G_OBJ_LDTX_SPRITE 0xC2
+#define G_OBJ_LDTX_RECT 0xC3
+#define G_OBJ_LDTX_RECT_R 0xC4
+#define G_RDPHALF_0 0xE4
#endif
/*---------------------------------------------------------------------------*
@@ -293,16 +293,16 @@ typedef struct {
* Select Display List
*---------------------------------------------------------------------------*/
#define gSPSelectDL(pkt, mptr, sid, flag, mask) \
-{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
+{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xFFFF, (sid)); \
gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); }
#define gsSPSelectDL(mptr, sid, flag, mask) \
-{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
+{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xFFFF, (sid)); \
gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); }
#define gSPSelectBranchDL(pkt, mptr, sid, flag, mask) \
-{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
+{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xFFFF, (sid)); \
gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); }
#define gsSPSelectBranchDL(mptr, sid, flag, mask) \
-{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
+{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xFFFF, (sid)); \
gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); }
/*---------------------------------------------------------------------------*
diff --git a/include/ultra64/vi.h b/include/ultra64/vi.h
index ca9b8e45e..7737b58b4 100644
--- a/include/ultra64/vi.h
+++ b/include/ultra64/vi.h
@@ -63,7 +63,7 @@ typedef struct {
/* 0x02 */ u16 retraceCount;
/* 0x04 */ void* buffer;
/* 0x08 */ OSViMode* modep;
- /* 0x0c */ u32 features;
+ /* 0x0C */ u32 features;
/* 0x10 */ OSMesgQueue* mq;
/* 0x14 */ OSMesg* msg;
/* 0x18 */ __OSViScale x;
diff --git a/include/variables.h b/include/variables.h
index 0f1324135..7c1733512 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -870,7 +870,6 @@ extern EffectShieldParticleInit shieldParticleInitWood;
extern u8 D_801BB12C;
-extern s801BB170 D_801BB170[118];
// extern UNK_TYPE1 D_801BC210;
extern Gfx D_801BC240[9];
extern Gfx D_801BC288[3];
@@ -917,7 +916,7 @@ extern u8 kanfontOrdering[92];
// extern UNK_TYPE1 D_801BDBA0;
// extern UNK_TYPE1 D_801BDBA4;
// extern UNK_TYPE1 D_801BDBA8;
-extern u8 D_801BDBB0;
+extern u8 gWeatherMode;
// extern UNK_TYPE1 D_801BDBB4;
// extern UNK_TYPE1 D_801BDBB8;
// extern UNK_TYPE1 D_801BDBBC;
diff --git a/include/z64.h b/include/z64.h
index 06204a172..c9cbeb1bc 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -424,7 +424,7 @@ typedef struct {
/* 0x1D0 */ OSMesgQueue loadQueue;
/* 0x1E8 */ OSMesg loadMsg;
/* 0x1EC */ u16 state;
- /* 0x1EE */ u16 debugState;
+ /* 0x1EE */ u16 debugEditor;
/* 0x1F0 */ u8 unk_1F0;
/* 0x1F4 */ Vec3f eye;
/* 0x200 */ u16 unk_200;
@@ -442,8 +442,8 @@ typedef struct {
/* 0x226 */ s16 offsetY;
/* 0x228 */ s32 unk_228;
/* 0x22C */ s32 unk_22C;
- /* 0x230 */ s32 unk_230;
- /* 0x234 */ s32 unk_234;
+ /* 0x230 */ s32 stickRelX;
+ /* 0x234 */ s32 stickRelY;
/* 0x238 */ s16 unk_238[5];
/* 0x242 */ s16 unk_242[5];
/* 0x24C */ s16 unk_24C[5];
@@ -901,22 +901,8 @@ typedef void (*ColChkApplyFunc)(PlayState*, CollisionCheckContext*, Collider*);
typedef void (*ColChkVsFunc)(PlayState*, CollisionCheckContext*, Collider*, Collider*);
typedef s32 (*ColChkLineFunc)(PlayState*, CollisionCheckContext*, Collider*, Vec3f*, Vec3f*);
-typedef void(*draw_func)(PlayState* play, s16 index);
-
typedef void(*room_draw_func)(PlayState* play, Room* room, u32 flags);
-typedef struct {
- /* 0x00 */ draw_func unk0;
- /* 0x04 */ u32 unk4;
- /* 0x08 */ u32 unk8;
- /* 0x0C */ u32 unkC;
- /* 0x10 */ u32 unk10;
- /* 0x14 */ u32 unk14;
- /* 0x18 */ u32 unk18;
- /* 0x1C */ u32 unk1C;
- /* 0x20 */ u32 unk20;
-} s801BB170; // size = 0x24
-
typedef struct {
/* 0x00 */ Vec3f atOffset;
/* 0x0C */ Vec3f eyeOffset;
@@ -1161,7 +1147,7 @@ struct PlayState {
/* 0x1884C */ RomFile* roomList;
/* 0x18850 */ ActorEntry* linkActorEntry;
/* 0x18854 */ ActorEntry* setupActorList;
- /* 0x18858 */ CsCamData* csCamData;
+ /* 0x18858 */ ActorCsCamInfo* actorCsCamList;
/* 0x1885C */ EntranceEntry* setupEntranceList;
/* 0x18860 */ u16* setupExitList;
/* 0x18864 */ Path* setupPathList;
@@ -1266,21 +1252,21 @@ enum fram_command {
Writes Contents in FLASHRAM_MODE_WRITE
After execution, sets FRAM_MODE to FRAM_MODE_NOP */
FRAM_COMMAND_EXECUTE = 0xD2000000,
- /* flashram->erase_offset = (command & 0xffff) * 128; */
+ /* flashram->erase_offset = (command & 0xFFFF) * 128; */
FRAM_COMMAND_SET_ERASE_SECTOR_OFFSET = 0x4B000000,
/* flashram->mode = FLASHRAM_MODE_ERASE;
- flashram->status = 0x1111800800c20000LL; */
+ flashram->status = 0x1111800800C20000LL; */
FRAM_COMMAND_SET_MODE_ERASE_AND_STATUS = 0x78000000,
- /* flashram->erase_offset = (command & 0xffff) * 128;
- flashram->status = 0x1111800400c20000LL; */
+ /* flashram->erase_offset = (command & 0xFFFF) * 128;
+ flashram->status = 0x1111800400C20000LL; */
FRAM_COMMAND_SET_ERASE_SECTOR_OFFSET_AND_STATUS = 0xA5000000,
/* flashram->mode = FLASHRAM_MODE_WRITE; */
FRAM_COMMAND_SET_MODE_WRITE = 0xB4000000,
/* flashram->mode = FLASHRAM_MODE_STATUS;
- flashram->status = 0x1111800100c20000LL; */
+ flashram->status = 0x1111800100C20000LL; */
FRAM_COMMAND_SET_MODE_STATUS_AND_STATUS = 0xE1000000,
/* flashram->mode = FLASHRAM_MODE_READ;
- flashram->status = 0x11118004f0000000LL; */
+ flashram->status = 0x11118004F0000000LL; */
FRAM_COMMAND_SET_MODE_READ_AND_STATUS = 0xF0000000,
/* unk */
FRAM_COMMAND_UNK_ERASE_OPERATION = 0x3C000000
diff --git a/include/z64actor.h b/include/z64actor.h
index 866b92dbb..baec8e81a 100644
--- a/include/z64actor.h
+++ b/include/z64actor.h
@@ -226,7 +226,7 @@ typedef enum {
/* 0x00 */ ITEM00_RUPEE_GREEN,
/* 0x01 */ ITEM00_RUPEE_BLUE,
/* 0x02 */ ITEM00_RUPEE_RED,
- /* 0x03 */ ITEM00_HEART,
+ /* 0x03 */ ITEM00_RECOVERY_HEART,
/* 0x04 */ ITEM00_BOMBS_A,
/* 0x05 */ ITEM00_ARROWS_10,
/* 0x06 */ ITEM00_HEART_PIECE,
@@ -268,7 +268,7 @@ typedef struct EnItem00 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnItem00ActionFunc actionFunc;
/* 0x148 */ s16 collectibleFlag;
- /* 0x14A */ s16 unk14A;
+ /* 0x14A */ s16 getItemId;
/* 0x14C */ s16 unk14C;
/* 0x14E */ s16 unk14E;
/* 0x150 */ s16 unk150;
diff --git a/include/z64bgcheck.h b/include/z64bgcheck.h
index 2849ce490..f0d24fd6f 100644
--- a/include/z64bgcheck.h
+++ b/include/z64bgcheck.h
@@ -89,10 +89,21 @@ typedef struct CollisionPoly {
} CollisionPoly; // size = 0x10
typedef struct {
- /* 0x0 */ u16 setting;
- /* 0x2 */ s16 numData;
- /* 0x4 */ Vec3s* data;
-} CamData; // size = 0x8 (BgCamData)
+ /* 0x0 */ u16 setting; // camera setting described by CameraSettingType enum
+ /* 0x2 */ s16 count; // only used when `bgCamFuncData` is a list of points used for crawlspaces (unused oot legacy)
+ /* 0x4 */ Vec3s* bgCamFuncData; // s16 data grouped in threes (ex. Vec3s), is usually of type `BgCamFuncData`
+} BgCamInfo; // size = 0x8
+
+typedef BgCamInfo CamData; // TODO: ZAPD compatibility
+
+// The structure used for all instances of s16 data from `BgCamInfo`.
+typedef struct {
+ /* 0x00 */ Vec3s pos;
+ /* 0x06 */ Vec3s rot;
+ /* 0x0C */ s16 fov;
+ /* 0x0E */ s16 unk_0E;
+ /* 0x10 */ s16 unk_10;
+} BgCamFuncData; // size = 0x12
typedef struct {
/* 0x0 */ Vec3s minPos;
@@ -137,7 +148,7 @@ typedef struct {
/* 0x14 */ u16 numPolygons;
/* 0x18 */ CollisionPoly* polyList;
/* 0x1C */ SurfaceType* surfaceTypeList;
- /* 0x20 */ CamData* cameraDataList;
+ /* 0x20 */ CamData* bgCamList;
/* 0x24 */ u16 numWaterBoxes;
/* 0x28 */ WaterBox* waterBoxes;
} CollisionHeader; // size = 0x2C
diff --git a/include/z64item.h b/include/z64item.h
index cc05b528e..5e8e3a656 100644
--- a/include/z64item.h
+++ b/include/z64item.h
@@ -154,7 +154,7 @@ typedef enum {
/* 0x21 */ ITEM_ZORA_EGG,
/* 0x22 */ ITEM_GOLD_DUST,
/* 0x23 */ ITEM_MUSHROOM,
- /* 0x24 */ ITEM_SEA_HORSE,
+ /* 0x24 */ ITEM_SEAHORSE,
/* 0x25 */ ITEM_CHATEAU,
/* 0x26 */ ITEM_HYLIAN_LOACH,
/* 0x27 */ ITEM_OBABA_DRINK,
@@ -166,7 +166,7 @@ typedef enum {
/* 0x2D */ ITEM_ROOM_KEY,
/* 0x2E */ ITEM_LETTER_MAMA,
/* 0x2F */ ITEM_LETTER_TO_KAFEI,
- /* 0x30 */ ITEM_PENDANT_MEMORIES,
+ /* 0x30 */ ITEM_PENDANT_OF_MEMORIES,
/* 0x31 */ ITEM_TINGLE_MAP,
/* 0x32 */ ITEM_MASK_DEKU,
/* 0x33 */ ITEM_MASK_GORON,
@@ -247,7 +247,7 @@ typedef enum {
/* 0x80 */ ITEM_INVALID_5,
/* 0x81 */ ITEM_INVALID_6,
/* 0x82 */ ITEM_INVALID_7,
- /* 0x83 */ ITEM_HEART,
+ /* 0x83 */ ITEM_RECOVERY_HEART,
/* 0x84 */ ITEM_RUPEE_GREEN,
/* 0x85 */ ITEM_RUPEE_BLUE,
/* 0x86 */ ITEM_RUPEE_10,
@@ -279,7 +279,7 @@ typedef enum {
/* 0xA0 */ ITEM_MILK,
/* 0xA1 */ ITEM_GOLD_DUST_2,
/* 0xA2 */ ITEM_HYLIAN_LOACH_2,
- /* 0xA3 */ ITEM_SEA_HORSE_CAUGHT,
+ /* 0xA3 */ ITEM_SEAHORSE_CAUGHT,
/* 0xF0 */ ITEM_F0 = 0xF0,
/* 0xF1 */ ITEM_F1,
/* 0xF2 */ ITEM_F2,
@@ -304,11 +304,15 @@ typedef enum {
/* 0x0A */ GI_RECOVERY_HEART,
/* 0x0C */ GI_HEART_PIECE = 0x0C,
/* 0x0D */ GI_HEART_CONTAINER,
+ /* 0x0E */ GI_MAGIC_SMALL,
+ /* 0x0F */ GI_MAGIC_LARGE,
/* 0x11 */ GI_STRAY_FAIRY = 0x11,
/* 0x14 */ GI_BOMBS_1 = 0x14,
/* 0x15 */ GI_BOMBS_5,
/* 0x16 */ GI_BOMBS_10,
- /* 0x19 */ GI_STICKS_1 = 0x19,
+ /* 0x17 */ GI_BOMBS_20,
+ /* 0x18 */ GI_BOMBS_30,
+ /* 0x19 */ GI_STICKS_1,
/* 0x1A */ GI_BOMBCHUS_10,
/* 0x1B */ GI_BOMB_BAG_20,
/* 0x1C */ GI_BOMB_BAG_30,
@@ -320,28 +324,58 @@ typedef enum {
/* 0x22 */ GI_QUIVER_30,
/* 0x23 */ GI_QUIVER_40,
/* 0x24 */ GI_QUIVER_50,
- /* 0x25 */ GI_25 = 0x25,
- /* 0x28 */ GI_NUTS_1 = 0x28,
- /* 0x2A */ GI_NUTS_10 = 0x2A,
+ /* 0x25 */ GI_ARROW_FIRE,
+ /* 0x26 */ GI_ARROW_ICE,
+ /* 0x27 */ GI_ARROW_LIGHT,
+ /* 0x28 */ GI_NUTS_1,
+ /* 0x29 */ GI_NUTS_5,
+ /* 0x2A */ GI_NUTS_10,
+ /* 0x2E */ GI_BOMBCHUS_20 = 0x2E,
/* 0x32 */ GI_SHIELD_HERO = 0x32,
/* 0x33 */ GI_SHIELD_MIRROR,
- /* 0x35 */ GI_MAGIC_BEANS = 0x35,
+ /* 0x34 */ GI_POWDER_KEG,
+ /* 0x35 */ GI_MAGIC_BEANS,
/* 0x36 */ GI_BOMBCHUS_1,
- /* 0x3A */ GI_BOMBCHUS_5 = 0x3A,
- /* 0x3C */ GI_KEY_SMALL = 0x3C,
+ /* 0x37 */ GI_SWORD_KOKIRI,
+ /* 0x38 */ GI_SWORD_RAZOR,
+ /* 0x39 */ GI_SWORD_GILDED,
+ /* 0x3A */ GI_BOMBCHUS_5,
+ /* 0x3B */ GI_SWORD_GREAT_FAIRY,
+ /* 0x3C */ GI_KEY_SMALL,
/* 0x3D */ GI_KEY_BOSS,
/* 0x3E */ GI_MAP,
/* 0x3F */ GI_COMPASS,
+ /* 0x41 */ GI_HOOKSHOT = 0x41,
+ /* 0x42 */ GI_LENS,
+ /* 0x43 */ GI_PICTO_BOX,
/* 0x4C */ GI_OCARINA = 0x4C,
- /* 0x50 */ GI_50 = 0x50,
- /* 0x52 */ GI_SCALE_GOLD = 0x52, // Assumed, used in En_Fishing
- /* 0x59 */ GI_BOTTLE_POTION_RED = 0x59,
+ /* 0x50 */ GI_BOMBERS_NOTEBOOK = 0x50,
+ /* 0x52 */ GI_SKULL_TOKEN = 0x52,
+ /* 0x55 */ GI_REMAINS_ODOLWA = 0x55,
+ /* 0x56 */ GI_REMAINS_GOHT,
+ /* 0x57 */ GI_REMAINS_GYORG,
+ /* 0x58 */ GI_REMAINS_TWINMOLD,
+ /* 0x59 */ GI_POTION_RED_BOTTLE, // ITEM_LONGSHOT
/* 0x5A */ GI_BOTTLE,
/* 0x5B */ GI_POTION_RED,
/* 0x5C */ GI_POTION_GREEN,
/* 0x5D */ GI_POTION_BLUE,
/* 0x5E */ GI_FAIRY,
- /* 0x60 */ GI_MILK_BOTTLE = 0x60,
+ /* 0x5F */ GI_DEKU_PRINCESS,
+ /* 0x60 */ GI_MILK_BOTTLE,
+ /* 0x61 */ GI_MILK_HALF,
+ /* 0x62 */ GI_FISH,
+ /* 0x63 */ GI_BUG,
+ /* 0x64 */ GI_BLUE_FIRE,
+ /* 0x65 */ GI_POE,
+ /* 0x66 */ GI_BIG_POE,
+ /* 0x67 */ GI_SPRING_WATER,
+ /* 0x68 */ GI_HOT_SPRING_WATER,
+ /* 0x69 */ GI_ZORA_EGG,
+ /* 0x6A */ GI_GOLD_DUST,
+ /* 0x6B */ GI_MUSHROOM,
+ /* 0x6E */ GI_SEAHORSE = 0x6E,
+ /* 0x6F */ GI_CHATEAU_BOTTLE,
/* 0x76 */ GI_ICE_TRAP = 0x76,
/* 0x78 */ GI_MASK_DEKU = 0x78,
/* 0x79 */ GI_MASK_GORON,
@@ -369,71 +403,153 @@ typedef enum {
/* 0x8F */ GI_MASK_KAFEIS_MASK,
/* 0x91 */ GI_CHATEAU = 0x91,
/* 0x92 */ GI_MILK,
- /* 0x93 */ GI_GOLD_DUST,
- /* 0x94 */ GI_EEL, // Unused bottled eel
- /* 0x95 */ GI_SEAHORSE,
+ /* 0x93 */ GI_GOLD_DUST_2,
+ /* 0x94 */ GI_HYLIAN_LOACH, // Unused bottled eel
+ /* 0x95 */ GI_SEAHORSE_CAUGHT,
/* 0x96 */ GI_MOON_TEAR,
/* 0x97 */ GI_DEED_LAND,
/* 0x98 */ GI_DEED_SWAMP,
/* 0x99 */ GI_DEED_MOUNTAIN,
/* 0x9A */ GI_DEED_OCEAN,
- /* 0x9B */ GI_SWORD_GREAT_FAIRY,
- /* 0x9C */ GI_SWORD_KOKIRI,
- /* 0x9D */ GI_SWORD_RAZOR,
- /* 0x9E */ GI_SWORD_GILDED,
- /* 0x9F */ GI_SHIELD_HERO_2, // Code that treats this as hero's shield is unused, so take with a grain of salt
- /* 0xA1 */ GI_LETTER_TO_MAMA = 0xA1,
+ /* 0x9B */ GI_SWORD_GREAT_FAIRY_STOLEN,
+ /* 0x9C */ GI_SWORD_KOKIRI_STOLEN,
+ /* 0x9D */ GI_SWORD_RAZOR_STOLEN,
+ /* 0x9E */ GI_SWORD_GILDED_STOLEN,
+ /* 0x9F */ GI_SHIELD_HERO_STOLEN, // Code that treats this as hero's shield is unused, implied as intended to be stolen
+ /* 0xA0 */ GI_ROOM_KEY,
+ /* 0xA1 */ GI_LETTER_TO_MAMA,
/* 0xA9 */ GI_BOTTLE_STOLEN = 0xA9, // buy back stolen bottle
/* 0xAA */ GI_LETTER_TO_KAFEI,
/* 0xAB */ GI_PENDANT_OF_MEMORIES,
- /* 0xBA */ GI_MAX = 0xBA
+ /* 0xB4 */ GI_TINGLE_MAP_CLOCK_TOWN = 0xB4,
+ /* 0xB5 */ GI_TINGLE_MAP_WOODFALL,
+ /* 0xB6 */ GI_TINGLE_MAP_SNOWHEAD,
+ /* 0xB7 */ GI_TINGLE_MAP_ROMANI_RANCH,
+ /* 0xB8 */ GI_TINGLE_MAP_GREAT_BAY,
+ /* 0xB9 */ GI_TINGLE_MAP_STONE_TOWER,
+ /* 0xBA */ GI_MAX
} GetItemID;
typedef enum {
/* 0x00 */ GID_BOTTLE,
- /* 0x01 */ GID_01,
- /* 0x02 */ GID_02,
- /* 0x03 */ GID_03,
- /* 0x0A */ GID_COMPASS = 0x0A,
- /* 0x0E */ GID_0E = 0x0E,
- /* 0x0F */ GID_0F,
- /* 0x10 */ GID_MASK_ALL_NIGHT = 0x10,
+ /* 0x01 */ GID_KEY_SMALL,
+ /* 0x02 */ GID_MASK_KAMARO,
+ /* 0x03 */ GID_MASK_COUPLE,
+ /* 0x04 */ GID_04,
+ /* 0x05 */ GID_05,
+ /* 0x06 */ GID_06,
+ /* 0x07 */ GID_07,
+ /* 0x08 */ GID_RECOVERY_HEART,
+ /* 0x09 */ GID_KEY_BOSS,
+ /* 0x0A */ GID_COMPASS,
+ /* 0x0B */ GID_BOMBERS_NOTEBOOK,
+ /* 0x0C */ GID_MASK_STONE,
+ /* 0x0D */ GID_MASK_KAFEIS_MASK,
+ /* 0x0E */ GID_MASK_CIRCUS_LEADER,
+ /* 0x0F */ GID_MASK_BREMEN,
+ /* 0x10 */ GID_MASK_ALL_NIGHT,
/* 0x11 */ GID_NUTS,
- /* 0x13 */ GID_13 = 0x13,
- /* 0x17 */ GID_BOMB_BAG_20 = 0x17,
+ /* 0x12 */ GID_HEART_CONTAINER,
+ /* 0x13 */ GID_HEART_PIECE,
+ /* 0x14 */ GID_QUIVER_30,
+ /* 0x15 */ GID_QUIVER_40,
+ /* 0x16 */ GID_QUIVER_50,
+ /* 0x17 */ GID_BOMB_BAG_20,
/* 0x18 */ GID_BOMB_BAG_30,
/* 0x19 */ GID_BOMB_BAG_40,
- /* 0x1A */ GID_STICK = 0x1A,
+ /* 0x1A */ GID_STICK,
/* 0x1B */ GID_DUNGEON_MAP,
- /* 0x1E */ GID_BOMB = 0x1E,
- /* 0x23 */ GID_ARROWS_SMALL = 0x23,
+ /* 0x1C */ GID_MAGIC_SMALL,
+ /* 0x1D */ GID_MAGIC_LARGE,
+ /* 0x1E */ GID_BOMB,
+ /* 0x1F */ GID_STONE_OF_AGONY,
+ /* 0x20 */ GID_WALLET_ADULT,
+ /* 0x21 */ GID_WALLET_GIANT,
+ /* 0x22 */ GID_MASK_DON_GERO,
+ /* 0x23 */ GID_ARROWS_SMALL,
/* 0x24 */ GID_ARROWS_MEDIUM,
/* 0x25 */ GID_ARROWS_LARGE,
/* 0x26 */ GID_BOMBCHU,
/* 0x27 */ GID_SHIELD_HERO,
- /* 0x30 */ GID_POTION_GREEN = 0x30,
+ /* 0x28 */ GID_HOOKSHOT,
+ /* 0x29 */ GID_29,
+ /* 0x2A */ GID_OCARINA,
+ /* 0x2B */ GID_MILK,
+ /* 0x2C */ GID_MASK_KEATON,
+ /* 0x2D */ GID_TINGLE_MAP,
+ /* 0x2E */ GID_BOW,
+ /* 0x2F */ GID_LENS,
+ /* 0x30 */ GID_POTION_GREEN,
/* 0x31 */ GID_POTION_RED,
/* 0x32 */ GID_POTION_BLUE,
/* 0x33 */ GID_SHIELD_MIRROR,
- /* 0x39 */ GID_39 = 0x39,
- /* 0x3A */ GID_3A,
+ /* 0x34 */ GID_MAGIC_BEANS,
+ /* 0x35 */ GID_FISH,
+ /* 0x36 */ GID_LETTER_MAMA,
+ /* 0x37 */ GID_37,
+ /* 0x38 */ GID_SWORD_BGS,
+ /* 0x39 */ GID_MASK_SUN,
+ /* 0x3A */ GID_MASK_BLAST,
/* 0x3B */ GID_FAIRY,
- /* 0x3E */ GID_3E = 0x3E,
- /* 0x44 */ GID_44 = 0x44,
- /* 0x45 */ GID_45,
- /* 0x47 */ GID_47 = 0x47,
- /* 0x4F */ GID_4F = 0x4F,
- /* 0x50 */ GID_50,
- /* 0x51 */ GID_51,
- /* 0x53 */ GID_53 = 0x53,
- /* 0x55 */ GID_SWORD_KOKIRI = 0x55,
- /* 0x66 */ GID_SWORD_RAZOR = 0x66,
+ /* 0x3C */ GID_MASK_SCENTS,
+ /* 0x3D */ GID_MASK_CAPTAIN,
+ /* 0x3E */ GID_MASK_BUNNY,
+ /* 0x3F */ GID_MASK_TRUTH,
+ /* 0x40 */ GID_DEED_SWAMP,
+ /* 0x41 */ GID_DEED_MOUNTAIN,
+ /* 0x42 */ GID_RUPEE_HUGE,
+ /* 0x43 */ GID_DEED_OCEAN,
+ /* 0x44 */ GID_MASK_GORON,
+ /* 0x45 */ GID_MASK_ZORA,
+ /* 0x46 */ GID_46,
+ /* 0x47 */ GID_ARROW_FIRE,
+ /* 0x48 */ GID_ARROW_ICE,
+ /* 0x49 */ GID_ARROW_LIGHT,
+ /* 0x4A */ GID_SKULL_TOKEN,
+ /* 0x4B */ GID_BUG,
+ /* 0x4C */ GID_4C,
+ /* 0x4D */ GID_POE,
+ /* 0x4E */ GID_FAIRY_2,
+ /* 0x4F */ GID_RUPEE_GREEN,
+ /* 0x50 */ GID_RUPEE_BLUE,
+ /* 0x51 */ GID_RUPEE_RED,
+ /* 0x52 */ GID_BIG_POE,
+ /* 0x53 */ GID_RUPEE_PURPLE,
+ /* 0x54 */ GID_RUPEE_SILVER,
+ /* 0x55 */ GID_SWORD_KOKIRI,
+ /* 0x56 */ GID_SKULL_TOKEN_2,
+ /* 0x57 */ GID_57,
+ /* 0x58 */ GID_ZORA_EGG,
+ /* 0x59 */ GID_MOON_TEAR,
+ /* 0x5A */ GID_DEED_LAND,
+ /* 0x5B */ GID_MASK_DEKU,
+ /* 0x5C */ GID_REMAINS_ODOLWA,
+ /* 0x5D */ GID_POWDER_KEG,
+ /* 0x5E */ GID_GOLD_DUST,
+ /* 0x5F */ GID_SEAHORSE,
+ /* 0x60 */ GID_60,
+ /* 0x61 */ GID_HYLIAN_LOACH,
+ /* 0x62 */ GID_SEAHORSE_CAUGHT,
+ /* 0x63 */ GID_REMAINS_GOHT,
+ /* 0x64 */ GID_REMAINS_GYORG,
+ /* 0x65 */ GID_REMAINS_TWINMOLD,
+ /* 0x66 */ GID_SWORD_RAZOR,
/* 0x67 */ GID_SWORD_GILDED,
/* 0x68 */ GID_SWORD_GREAT_FAIRY,
- /* 0x6A */ GID_MASK_GREAT_FAIRY = 0x6A,
- /* 0x6B */ GID_6B,
- /* 0x70 */ GID_70 = 0x70,
- /* 0x71 */ GID_71
+ /* 0x69 */ GID_MASK_GARO,
+ /* 0x6A */ GID_MASK_GREAT_FAIRY,
+ /* 0x6B */ GID_MASK_GIBDO,
+ /* 0x6C */ GID_ROOM_KEY,
+ /* 0x6D */ GID_LETTER_TO_KAFEI,
+ /* 0x6E */ GID_PENDANT_OF_MEMORIES,
+ /* 0x6F */ GID_MUSHROOM,
+ /* 0x70 */ GID_MASK_ROMANI,
+ /* 0x71 */ GID_MASK_POSTMAN,
+ /* 0x72 */ GID_MASK_GIANT,
+ /* 0x73 */ GID_CHATEAU,
+ /* 0x74 */ GID_PICTO_BOX,
+ /* 0x75 */ GID_MASK_FIERCE_DEITY,
+ /* 0x76 */ GID_MAX
} GetItemDrawID;
// This enum may not be real, and actionparam is just used directly.
diff --git a/include/z64message.h b/include/z64message.h
index 19657d838..590074339 100644
--- a/include/z64message.h
+++ b/include/z64message.h
@@ -121,7 +121,7 @@ typedef struct MessageContext {
/* 0x12028 */ u16 songPlayed;
/* 0x1202A */ u16 ocarinaMode;
/* 0x1202C */ u16 ocarinaAction;
- /* 0x1202E */ u16 unk1202E;
+ /* 0x1202E */ u16 lastPlayedSong;
/* 0x12030 */ s16 unk_12030;
/* 0x12032 */ UNK_TYPE1 unk_12032[0x2];
/* 0x12034 */ s16 unk12034;
diff --git a/include/z64object.h b/include/z64object.h
index 34035306b..3b221088a 100644
--- a/include/z64object.h
+++ b/include/z64object.h
@@ -207,7 +207,7 @@ typedef enum {
/* 0x0C3 */ OBJECT_GI_SHIELD_3,
/* 0x0C4 */ OBJECT_UNSET_C4,
/* 0x0C5 */ OBJECT_UNSET_C5,
- /* 0x0C6 */ OBJECT_GI_MAGIC_BEANS,
+ /* 0x0C6 */ OBJECT_GI_BEAN,
/* 0x0C7 */ OBJECT_GI_FISH,
/* 0x0C8 */ OBJECT_UNSET_C8,
/* 0x0C9 */ OBJECT_UNSET_C9,
diff --git a/include/z64player.h b/include/z64player.h
index 86adaea1e..0f74f5a6c 100644
--- a/include/z64player.h
+++ b/include/z64player.h
@@ -98,7 +98,7 @@ typedef enum {
/* 0x19 */ PLAYER_AP_BOTTLE_ZORA_EGG,
/* 0x1A */ PLAYER_AP_BOTTLE_DEKU_PRINCESS,
/* 0x1B */ PLAYER_AP_BOTTLE_GOLD_DUST,
- /* 0x1D */ PLAYER_AP_BOTTLE_SEA_HORSE = 0x1D,
+ /* 0x1D */ PLAYER_AP_BOTTLE_SEAHORSE = 0x1D,
/* 0x1E */ PLAYER_AP_BOTTLE_MUSHROOM,
/* 0x1F */ PLAYER_AP_BOTTLE_HYLIAN_LOACH,
/* 0x20 */ PLAYER_AP_BOTTLE_BUG,
@@ -120,7 +120,7 @@ typedef enum {
/* 0x30 */ PLAYER_AP_DEED_MOUNTAIN,
/* 0x31 */ PLAYER_AP_DEED_OCEAN,
/* 0x33 */ PLAYER_AP_LETTER_MAMA = 0x33,
- /* 0x36 */ PLAYER_AP_PENDANT_MEMORIES = 0x36,
+ /* 0x36 */ PLAYER_AP_PENDANT_OF_MEMORIES = 0x36,
/* 0x3A */ PLAYER_AP_MASK_TRUTH = 0x3A,
/* 0x3B */ PLAYER_AP_MASK_KAFEIS_MASK,
/* 0x3C */ PLAYER_AP_MASK_ALL_NIGHT,
diff --git a/include/z64save.h b/include/z64save.h
index d0b5d7fd2..43260b277 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -49,7 +49,8 @@ typedef struct Inventory {
/* 0x48 */ u32 upgrades; // "non_equip_register" some bits are wallet upgrades
/* 0x4C */ u32 questItems; // "collect_register"
/* 0x50 */ u8 dungeonItems[10]; // "key_compass_map"
- /* 0x5A */ s8 dungeonKeys[10]; // "key_register"
+ /* 0x5A */ s8 dungeonKeys[9]; // "key_register"
+ /* 0x63 */ s8 defenseHearts;
/* 0x64 */ s8 strayFairies[10]; // "orange_fairy"
/* 0x6E */ char dekuPlaygroundPlayerName[3][8]; // "degnuts_memory_name" Stores playerName (8 char) over (3 days) when getting a new high score
} Inventory; // size = 0x88
@@ -160,7 +161,7 @@ typedef struct Save {
/* 0x0EE8 */ u32 unk_EE8;
/* 0x0EEC */ u32 horseBackBalloonHighScore;
/* 0x0EF0 */ u32 lotteryCodeGuess; // Lottery code chosen by player (only uses lower three hex digits)
- /* 0x0EF4 */ u32 unk_EF4; // Shooting Gallery Man Flags
+ /* 0x0EF4 */ u32 shootingGalleryHighScores; // High scores for both shooting galleries. Town uses lower 16 bits, Swamp uses higher 16 bits.
/* 0x0EF8 */ u8 weekEventReg[100]; // "week_event_reg"
/* 0x0F5C */ u32 mapsVisited; // "area_arrival"
/* 0x0F60 */ u32 mapsVisible; // "cloud_clear"
@@ -247,7 +248,7 @@ typedef struct SaveContext {
/* 0x3F4E */ u16 nextDayTime; // "next_zelda_time"
/* 0x3F50 */ u8 transFadeDuration; // "fade_speed"
/* 0x3F51 */ u8 transWipeSpeed; // "wipe_speed" transition related
- /* 0x3F52 */ u16 environmentTime; // "kankyo_time"
+ /* 0x3F52 */ u16 skyboxTime; // "kankyo_time"
/* 0x3F54 */ u8 dogIsLost; // "dog_event_flag"
/* 0x3F55 */ u8 nextTransitionType; // "next_wipe"
/* 0x3F56 */ s16 worldMapArea; // "area_type"
@@ -273,6 +274,85 @@ typedef enum SunsSongState {
/* 3 */ SUNSSONG_SPECIAL // time does not advance, but signals the song was played. used for freezing redeads
} SunsSongState;
+// linkAge still exists in MM, but is always set to 0 (always adult)
+// There are remnants of these macros from OOT, but they are essentially useless
+#define LINK_IS_CHILD (gSaveContext.save.linkAge == 1)
+#define LINK_IS_ADULT (gSaveContext.save.linkAge == 0)
+
+#define CURRENT_DAY (((void)0, gSaveContext.save.day) % 5)
+
+#define SLOT(item) gItemSlots[item]
+#define AMMO(item) gSaveContext.save.inventory.ammo[SLOT(item)]
+#define INV_CONTENT(item) gSaveContext.save.inventory.items[SLOT(item)]
+#define GET_INV_CONTENT(item) ((void)0, gSaveContext.save.inventory.items)[SLOT(item)]
+
+#define CUR_FORM ((gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) ? 0 : gSaveContext.save.playerForm)
+
+#define GET_SAVE_EQUIPS_EQUIPMENT ((void)0, gSaveContext.save.equips.equipment)
+#define GET_SAVE_INVENTORY_UPGRADES ((void)0, gSaveContext.save.inventory.upgrades)
+#define GET_SAVE_INVENTORY_QUEST_ITEMS ((void)0, gSaveContext.save.inventory.questItems)
+
+#define GET_CUR_EQUIP_VALUE(equip) ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipMasks[equip]) >> gEquipShifts[equip])
+
+#define CUR_UPG_VALUE(upg) ((gSaveContext.save.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
+#define GET_CUR_UPG_VALUE(upg) ((GET_SAVE_INVENTORY_UPGRADES & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
+
+#define SET_EQUIP_VALUE(equip, value) (gSaveContext.save.equips.equipment = ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipNegMasks[equip]) | (u16)((u16)(value) << gEquipShifts[equip])))
+
+#define BUTTON_ITEM_EQUIP(form, button) (gSaveContext.save.equips.buttonItems[form][button])
+#define CUR_FORM_EQUIP(button) BUTTON_ITEM_EQUIP(CUR_FORM, button)
+
+#define C_SLOT_EQUIP(form, button) (gSaveContext.save.equips.cButtonSlots[form][button])
+#define CHECK_QUEST_ITEM(item) (GET_SAVE_INVENTORY_QUEST_ITEMS & gBitFlags[item])
+#define SET_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS | gBitFlags[item]))
+#define REMOVE_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS & (-1 - gBitFlags[item])))
+
+#define GET_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) >> QUEST_HEART_PIECE_COUNT)
+#define EQ_MAX_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) == (4 << QUEST_HEART_PIECE_COUNT))
+#define LEQ_MAX_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) <= (4 << QUEST_HEART_PIECE_COUNT))
+#define INCREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems += (1 << QUEST_HEART_PIECE_COUNT))
+#define DECREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems -= (1 << QUEST_HEART_PIECE_COUNT))
+#define RESET_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems ^= (4 << QUEST_HEART_PIECE_COUNT))
+
+#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] & gBitFlags[item])
+#define SET_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] |= (u8)gBitFlags[item])
+#define DUNGEON_KEY_COUNT(dungeonIndex) (gSaveContext.save.inventory.dungeonKeys[(void)0, dungeonIndex])
+
+#define GET_CUR_FORM_BTN_ITEM(btn) ((u8)((btn) == EQUIP_SLOT_B ? BUTTON_ITEM_EQUIP(CUR_FORM, btn) : BUTTON_ITEM_EQUIP(0, btn)))
+#define GET_CUR_FORM_BTN_SLOT(btn) ((u8)((btn) == EQUIP_SLOT_B ? C_SLOT_EQUIP(CUR_FORM, btn) : C_SLOT_EQUIP(0, btn)))
+
+
+#define SET_CUR_FORM_BTN_ITEM(btn, item) \
+ if ((btn) == EQUIP_SLOT_B) { \
+ BUTTON_ITEM_EQUIP(CUR_FORM, (btn)) = (item); \
+ } else { \
+ BUTTON_ITEM_EQUIP(0, (btn)) = (item); \
+ } \
+ (void)0
+
+#define SET_CUR_FORM_BTN_SLOT(btn, item) \
+ if ((btn) == EQUIP_SLOT_B) { \
+ C_SLOT_EQUIP(CUR_FORM, (btn)) = (item); \
+ } else { \
+ C_SLOT_EQUIP(0, (btn)) = (item); \
+ } \
+ (void)0
+
+#define STOLEN_ITEM_NONE (0)
+
+#define STOLEN_ITEM_1 ((gSaveContext.save.stolenItems & 0xFF000000) >> 0x18)
+#define STOLEN_ITEM_2 ((gSaveContext.save.stolenItems & 0x00FF0000) >> 0x10)
+
+#define SET_STOLEN_ITEM_1(itemId) \
+ (gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0xFF000000) | ((itemId & 0xFF) << 0x18))
+#define SET_STOLEN_ITEM_2(itemId) \
+ (gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0x00FF0000) | ((itemId & 0xFF) << 0x10))
+
+#define GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() ((s32)(gSaveContext.save.shootingGalleryHighScores & 0xFFFF))
+#define GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() ((s32)((gSaveContext.save.shootingGalleryHighScores & 0xFFFF0000) >> 0x10))
+#define SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.shootingGalleryHighScores = (gSaveContext.save.shootingGalleryHighScores & 0xFFFF0000) | ((u16)(score)))
+#define SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.shootingGalleryHighScores = ((gSaveContext.save.shootingGalleryHighScores) & 0xFFFF) | ((u16)(score) << 0x10))
+
typedef enum {
/* 0 */ DUNGEON_INDEX_WOODFALL_TEMPLE,
/* 1 */ DUNGEON_INDEX_SNOWHEAD_TEMPLE,
@@ -307,7 +387,7 @@ void func_80147150(SramContext* sramCtx);
void func_80147198(SramContext* sramCtx);
extern s32 D_801C6798[];
-extern u8 D_801C67B0[24];
+extern u8 gAmmoItems[];
extern s32 D_801C67C8[];
extern s32 D_801C67E8[];
extern s32 D_801C67F0[];
diff --git a/include/z64scene.h b/include/z64scene.h
index d35aa9e6e..14a238917 100644
--- a/include/z64scene.h
+++ b/include/z64scene.h
@@ -477,19 +477,20 @@ typedef struct {
/* 0x08 */ UNK_TYPE2 unk8;
} MinimapChest; // size = 0xA
+// TODO: consider merging with bgCamInfo?
typedef struct {
- /* 0x0 */ s16 setting;
- /* 0x2 */ s16 numData;
- /* 0x4 */ Vec3s* data;
-} CsCamData; // size = 0x8
+ /* 0x0 */ s16 setting; // camera setting described by CameraSettingType enum
+ /* 0x2 */ s16 count;
+ /* 0x4 */ Vec3s* actorCsCamFuncData; // s16 data grouped in threes
+} ActorCsCamInfo; // size = 0x8
-typedef CsCamData CsCameraEntry; // TODO: Remove once ZAPD updates its structs
+typedef ActorCsCamInfo CsCameraEntry; // TODO: Remove once ZAPD updates its structs
typedef union {
/* Command: N/A */ SCmdBase base;
/* Command: 0x00 */ SCmdSpawnList spawnList;
/* Command: 0x01 */ SCmdActorList actorList;
- /* Command: 0x02 */ SCmdCsCameraList csCameraList;
+ /* Command: 0x02 */ SCmdCsCameraList actorCsCamList;
/* Command: 0x03 */ SCmdColHeader colHeader;
/* Command: 0x04 */ SCmdRoomList roomList;
/* Command: 0x05 */ SCmdWindSettings windSettings;
diff --git a/spec b/spec
index 209727c3d..a488e0dbd 100644
--- a/spec
+++ b/spec
@@ -461,7 +461,6 @@ beginseg
include "build/data/code/z_debug_mode.bss.o"
include "build/src/code/z_demo.o"
include "build/src/code/z_draw.o"
- include "build/data/code/z_draw.data.o"
include "build/src/code/z_eff_footmark.o"
include "build/data/code/z_eff_footmark.data.o"
include "build/src/code/z_sound_source.o"
@@ -708,7 +707,6 @@ beginseg
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_scope_NES.o"
- include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.data.o"
include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.bss.o"
include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.reloc.o"
endseg
@@ -1468,8 +1466,7 @@ beginseg
name "ovl_En_Okarina_Tag"
compress
include "build/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.o"
- include "build/data/ovl_En_Okarina_Tag/ovl_En_Okarina_Tag.data.o"
- include "build/data/ovl_En_Okarina_Tag/ovl_En_Okarina_Tag.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Okarina_Tag/ovl_En_Okarina_Tag_reloc.o"
endseg
beginseg
@@ -1724,8 +1721,7 @@ beginseg
name "ovl_Shot_Sun"
compress
include "build/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.o"
- include "build/data/ovl_Shot_Sun/ovl_Shot_Sun.data.o"
- include "build/data/ovl_Shot_Sun/ovl_Shot_Sun.reloc.o"
+ include "build/src/overlays/actors/ovl_Shot_Sun/ovl_Shot_Sun_reloc.o"
endseg
beginseg
@@ -3134,8 +3130,7 @@ beginseg
name "ovl_Dm_Char03"
compress
include "build/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.o"
- include "build/data/ovl_Dm_Char03/ovl_Dm_Char03.data.o"
- include "build/data/ovl_Dm_Char03/ovl_Dm_Char03.reloc.o"
+ include "build/src/overlays/actors/ovl_Dm_Char03/ovl_Dm_Char03_reloc.o"
endseg
beginseg
@@ -4064,8 +4059,7 @@ beginseg
name "ovl_Obj_Um"
compress
include "build/src/overlays/actors/ovl_Obj_Um/z_obj_um.o"
- include "build/data/ovl_Obj_Um/ovl_Obj_Um.data.o"
- include "build/data/ovl_Obj_Um/ovl_Obj_Um.reloc.o"
+ include "build/src/overlays/actors/ovl_Obj_Um/ovl_Obj_Um_reloc.o"
endseg
beginseg
diff --git a/src/boot_O2/gfxprint.c b/src/boot_O2/gfxprint.c
index 557887abd..b52675829 100644
--- a/src/boot_O2/gfxprint.c
+++ b/src/boot_O2/gfxprint.c
@@ -83,7 +83,7 @@ void GfxPrint_PrintCharImpl(GfxPrint* this, u8 c) {
if (this->flags & GFXP_FLAG_RAINBOW) {
gDPSetTextureLUT(this->dList++, G_TT_RGBA16);
gDPSetCycleType(this->dList++, G_CYC_2CYCLE);
- gDPSetRenderMode(this->dList++, G_RM_OPA_CI, G_RM_XLU_SURF2);
+ gDPSetRenderMode(this->dList++, G_RM_PASS, G_RM_XLU_SURF2);
gDPSetCombineMode(this->dList++, G_CC_INTERFERENCE, G_CC_PASS2);
} else {
gDPSetTextureLUT(this->dList++, G_TT_IA16);
diff --git a/src/boot_O2_g3/fault.c b/src/boot_O2_g3/fault.c
index bc7e8d34a..e648275b6 100644
--- a/src/boot_O2_g3/fault.c
+++ b/src/boot_O2_g3/fault.c
@@ -269,9 +269,9 @@ void Fault_DrawCornerRec(u16 color) {
void Fault_PrintFReg(s32 idx, f32* value) {
u32 raw = *(u32*)value;
- s32 v0 = ((raw & 0x7f800000) >> 0x17) - 0x7f;
+ s32 v0 = ((raw & 0x7F800000) >> 0x17) - 0x7F;
- if ((v0 >= -0x7e && v0 < 0x80) || raw == 0) {
+ if ((v0 >= -0x7E && v0 < 0x80) || raw == 0) {
FaultDrawer_Printf("F%02d:%14.7e ", idx, *value);
} else {
FaultDrawer_Printf("F%02d: %08x(16) ", idx, raw);
@@ -320,7 +320,7 @@ void osSyncPrintfFPCR(u32 value) {
void Fault_PrintThreadContext(OSThread* t) {
__OSThreadContext* ctx;
- s32 causeStrIdx = (s32)((((u32)t->context.cause >> 2) & 0x1f) << 0x10) >> 0x10;
+ s32 causeStrIdx = (s32)((((u32)t->context.cause >> 2) & 0x1F) << 0x10) >> 0x10;
if (causeStrIdx == 0x17) {
causeStrIdx = 0x10;
}
@@ -383,11 +383,11 @@ void Fault_PrintThreadContext(OSThread* t) {
void osSyncPrintfThreadContext(OSThread* t) {
__OSThreadContext* ctx;
- s32 causeStrIdx = (s32)((((u32)t->context.cause >> 2) & 0x1f) << 0x10) >> 0x10;
+ s32 causeStrIdx = (s32)((((u32)t->context.cause >> 2) & 0x1F) << 0x10) >> 0x10;
if (causeStrIdx == 0x17) {
causeStrIdx = 0x10;
}
- if (causeStrIdx == 0x1f) {
+ if (causeStrIdx == 0x1F) {
causeStrIdx = 0x11;
}
@@ -416,29 +416,29 @@ void osSyncPrintfThreadContext(OSThread* t) {
osSyncPrintfFReg(6, &ctx->fp6.f.f_even);
osSyncPrintf("\n");
osSyncPrintfFReg(8, &ctx->fp8.f.f_even);
- osSyncPrintfFReg(0xa, &ctx->fp10.f.f_even);
+ osSyncPrintfFReg(10, &ctx->fp10.f.f_even);
osSyncPrintf("\n");
- osSyncPrintfFReg(0xc, &ctx->fp12.f.f_even);
- osSyncPrintfFReg(0xe, &ctx->fp14.f.f_even);
+ osSyncPrintfFReg(12, &ctx->fp12.f.f_even);
+ osSyncPrintfFReg(14, &ctx->fp14.f.f_even);
osSyncPrintf("\n");
- osSyncPrintfFReg(0x10, &ctx->fp16.f.f_even);
- osSyncPrintfFReg(0x12, &ctx->fp18.f.f_even);
+ osSyncPrintfFReg(16, &ctx->fp16.f.f_even);
+ osSyncPrintfFReg(18, &ctx->fp18.f.f_even);
osSyncPrintf("\n");
- osSyncPrintfFReg(0x14, &ctx->fp20.f.f_even);
- osSyncPrintfFReg(0x16, &ctx->fp22.f.f_even);
+ osSyncPrintfFReg(20, &ctx->fp20.f.f_even);
+ osSyncPrintfFReg(22, &ctx->fp22.f.f_even);
osSyncPrintf("\n");
- osSyncPrintfFReg(0x18, &ctx->fp24.f.f_even);
- osSyncPrintfFReg(0x1a, &ctx->fp26.f.f_even);
+ osSyncPrintfFReg(24, &ctx->fp24.f.f_even);
+ osSyncPrintfFReg(26, &ctx->fp26.f.f_even);
osSyncPrintf("\n");
- osSyncPrintfFReg(0x1c, &ctx->fp28.f.f_even);
- osSyncPrintfFReg(0x1e, &ctx->fp30.f.f_even);
+ osSyncPrintfFReg(28, &ctx->fp28.f.f_even);
+ osSyncPrintfFReg(30, &ctx->fp30.f.f_even);
osSyncPrintf("\n");
}
OSThread* Fault_FindFaultedThread() {
OSThread* iter = __osGetActiveQueue();
while (iter->priority != -1) {
- if (iter->priority > 0 && iter->priority < 0x7f && (iter->flags & 3)) {
+ if (iter->priority > 0 && iter->priority < 0x7F && (iter->flags & 3)) {
return iter;
}
iter = iter->tlnext;
@@ -459,7 +459,7 @@ void Fault_Wait5Seconds(void) {
void Fault_WaitForButtonCombo(void) {
Input* input = &sFaultContext->padInput[0];
- FaultDrawer_SetForeColor(0xffff);
+ FaultDrawer_SetForeColor(0xFFFF);
FaultDrawer_SetBackColor(1);
do {
do {
@@ -480,8 +480,8 @@ void Fault_DrawMemDumpPage(const char* title, u32* addr, u32 param_3) {
if (alignedAddr < (u32*)0x80000000) {
alignedAddr = (u32*)0x80000000;
}
- if (alignedAddr > (u32*)0x807fff00) {
- alignedAddr = (u32*)0x807fff00;
+ if (alignedAddr > (u32*)0x807FFF00) {
+ alignedAddr = (u32*)0x807FFF00;
}
alignedAddr = (u32*)((u32)alignedAddr & ~3);
@@ -513,8 +513,8 @@ void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1) {
if (addr < 0x80000000) {
addr = 0x80000000;
}
- if (addr > 0x807fff00) {
- addr = 0x807fff00;
+ if (addr > 0x807FFF00) {
+ addr = 0x807FFF00;
}
addr &= ~0xF;
@@ -696,7 +696,7 @@ void Fault_ResumeThread(OSThread* t) {
t->context.cause = 0;
t->context.fpcsr = 0;
t->context.pc += 4;
- *(u32*)t->context.pc = 0xd;
+ *(u32*)t->context.pc = 0x0000000D; // write in a break instruction
osWritebackDCache((void*)t->context.pc, 4);
osInvalICache((void*)t->context.pc, 4);
osStartThread(t);
diff --git a/src/code/PreRender.c b/src/code/PreRender.c
index 0afb1df68..46fd8ee6b 100644
--- a/src/code/PreRender.c
+++ b/src/code/PreRender.c
@@ -191,8 +191,6 @@ void func_80170774(PreRender* this, Gfx** gfxp) {
func_8016FF70(this, gfxp, this->zbufSave, this->zbuf);
}
-#ifdef NON_MATCHING
-// just regalloc
void func_80170798(PreRender* this, Gfx** gfxp) {
Gfx* gfx;
s32 y;
@@ -235,6 +233,10 @@ void func_80170798(PreRender* this, Gfx** gfxp) {
gDPLoadMultiTile(gfx++, this->cvgSave, 0x0160, rtile, G_IM_FMT_I, G_IM_SIZ_8b, this->width, this->height,
uls, ult, lrs, lrt, 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);
+ //! FAKE
+ if (1) {}
+ // The two if (1) {}'s above can be removed with do {} while(0) around macros
+ if (1) {}
if (1) {}
gSPTextureRectangle(gfx++, uls << 2, ult << 2, (lrs + 1) << 2, (lrt + 1) << 2, G_TX_RENDERTILE, uls << 5,
ult << 5, 1 << 10, 1 << 10);
@@ -247,9 +249,6 @@ void func_80170798(PreRender* this, Gfx** gfxp) {
*gfxp = gfx;
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/PreRender/func_80170798.s")
-#endif
void func_80170AE0(PreRender* this, Gfx** gfxp, s32 alpha) {
func_8016FF90(this, gfxp, this->fbufSave, this->fbuf, 255, 255, 255, alpha);
diff --git a/src/code/code_8012EC80.c b/src/code/code_8012EC80.c
index 07cb436cf..5649ae80c 100644
--- a/src/code/code_8012EC80.c
+++ b/src/code/code_8012EC80.c
@@ -133,7 +133,7 @@ void* gItemIcons[] = {
0x08021000, // ITEM_ZORA_EGG
0x08022000, // ITEM_GOLD_DUST
0x08023000, // ITEM_MUSHROOM
- 0x08024000, // ITEM_SEA_HORSE
+ 0x08024000, // ITEM_SEAHORSE
0x08025000, // ITEM_CHATEAU
0x08026000, // ITEM_HYLIAN_LOACH
0x08027000, // ITEM_OBABA_DRINK
@@ -145,7 +145,7 @@ void* gItemIcons[] = {
0x0802D000, // ITEM_ROOM_KEY
0x0802E000, // ITEM_LETTER_MAMA
0x0802F000, // ITEM_LETTER_TO_KAFEI
- 0x08030000, // ITEM_PENDANT_MEMORIES
+ 0x08030000, // ITEM_PENDANT_OF_MEMORIES
0x08031000, // ITEM_TINGLE_MAP
0x08032000, // ITEM_MASK_DEKU
0x08033000, // ITEM_MASK_GORON
@@ -268,7 +268,7 @@ u8 gItemSlots[] = {
SLOT_BOTTLE_1, // ITEM_ZORA_EGG
SLOT_BOTTLE_1, // ITEM_GOLD_DUST
SLOT_BOTTLE_1, // ITEM_MUSHROOM
- SLOT_BOTTLE_1, // ITEM_SEA_HORSE
+ SLOT_BOTTLE_1, // ITEM_SEAHORSE
SLOT_BOTTLE_1, // ITEM_CHATEAU
SLOT_BOTTLE_1, // ITEM_HYLIAN_LOACH
SLOT_BOTTLE_1, // ITEM_OBABA_DRINK
@@ -280,7 +280,7 @@ u8 gItemSlots[] = {
SLOT_TRADE_KEY_MAMA, // ITEM_ROOM_KEY
SLOT_TRADE_KEY_MAMA, // ITEM_LETTER_MAMA
SLOT_TRADE_COUPLE, // ITEM_LETTER_TO_KAFEI
- SLOT_TRADE_COUPLE, // ITEM_PENDANT_MEMORIES
+ SLOT_TRADE_COUPLE, // ITEM_PENDANT_OF_MEMORIES
SLOT_TRADE_COUPLE, // ITEM_TINGLE_MAP
SLOT_MASK_DEKU, // ITEM_MASK_DEKU
SLOT_MASK_GORON, // ITEM_MASK_GORON
@@ -348,7 +348,7 @@ s16 gItemPrices[] = {
20, // ITEM_ZORA_EGG
200, // ITEM_GOLD_DUST
5, // ITEM_MUSHROOM
- 0, // ITEM_SEA_HORSE
+ 0, // ITEM_SEAHORSE
200, // ITEM_CHATEAU
20, // ITEM_HYLIAN_LOACH
0, // ITEM_OBABA_DRINK
@@ -360,7 +360,7 @@ s16 gItemPrices[] = {
0, // ITEM_ROOM_KEY
0, // ITEM_LETTER_MAMA
0, // ITEM_LETTER_KAFEI
- 0, // ITEM_PENDANT_MEMORIES
+ 0, // ITEM_PENDANT_OF_MEMORIES
0, // ITEM_TINGLE_MAP
};
diff --git a/src/code/flg_set.c b/src/code/flg_set.c
index 20818c06e..0bc978160 100644
--- a/src/code/flg_set.c
+++ b/src/code/flg_set.c
@@ -10,6 +10,7 @@
* Hold Start and press B: clear all weekEventReg and eventInf flags
*/
#include "global.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
static FlagSetEntry sFlagEntries[] = {
{ &gSaveContext.save.weekEventReg[0], "week_event_reg[0]" },
@@ -255,7 +256,7 @@ void FlagSet_Update(GameState* gameState) {
// Pressing B will exit
} else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
- play->pauseCtx.debugState = 0;
+ play->pauseCtx.debugEditor = DEBUG_EDITOR_NONE;
}
}
diff --git a/src/code/graph.c b/src/code/graph.c
index 28327c35f..f625cb7b6 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -67,7 +67,7 @@ GameStateOverlay* Graph_GetNextGameState(GameState* gameState) {
if (gameStateInit == (GameStateFunc)TitleSetup_Init) {
return &gGameStateOverlayTable[0];
}
- if (gameStateInit == (GameStateFunc)Select_Init) {
+ if (gameStateInit == (GameStateFunc)MapSelect_Init) {
return &gGameStateOverlayTable[1];
}
if (gameStateInit == (GameStateFunc)Title_Init) {
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index ff3bb411f..d792b276a 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -4514,7 +4514,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
currentMatrix = Matrix_GetCurrent();
// Apply sfx along with damage effect
- if ((actor != NULL) && (effectAlpha > 0.05f) && (play->gameOverCtx.state == 0)) {
+ if ((actor != NULL) && (effectAlpha > 0.05f) && (play->gameOverCtx.state == GAMEOVER_INACTIVE)) {
if (type == ACTOR_DRAW_DMGEFF_FIRE) {
Actor_PlaySfxAtPos(actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
} else if (type == ACTOR_DRAW_DMGEFF_BLUE_FIRE) {
diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c
index 7aaae22bc..4b7c1d893 100644
--- a/src/code/z_bgcheck.c
+++ b/src/code/z_bgcheck.c
@@ -1,5 +1,7 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "vt.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#define DYNA_RAYCAST_FLOORS 1
#define DYNA_RAYCAST_WALLS 2
@@ -1191,7 +1193,7 @@ void BgCheck_GetSubdivisionMinBounds(CollisionContext* colCtx, Vec3f* pos, s32*
/**
* Get positive bias subdivision indices
- * increments indicies if `pos` is within BGCHECK_SUBDIV_OVERLAP units of the postive subdivision boundary
+ * increments indices if `pos` is within BGCHECK_SUBDIV_OVERLAP units of the positive subdivision boundary
* `sx`, `sy`, `sz` returns the subdivision x, y, z indices
*/
void BgCheck_GetSubdivisionMaxBounds(CollisionContext* colCtx, Vec3f* pos, s32* sx, s32* sy, s32* sz) {
@@ -3295,7 +3297,7 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) {
if ((result != BGCHECK_Y_MIN) && (dynaActor != NULL) && (dynaRaycast->play != NULL)) {
pauseState = dynaRaycast->play->pauseCtx.state != 0;
if (!pauseState) {
- pauseState = dynaRaycast->play->pauseCtx.debugState != 0;
+ pauseState = dynaRaycast->play->pauseCtx.debugEditor != DEBUG_EDITOR_NONE;
}
if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & 2)) {
curTransform = &dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].curTransform;
@@ -3961,8 +3963,8 @@ void CollisionHeader_SegmentedToVirtual(CollisionHeader* colHeader) {
if (colHeader->surfaceTypeList) {
colHeader->surfaceTypeList = Lib_SegmentedToVirtual(colHeader->surfaceTypeList);
}
- if (colHeader->cameraDataList) {
- colHeader->cameraDataList = Lib_SegmentedToVirtual(colHeader->cameraDataList);
+ if (colHeader->bgCamList) {
+ colHeader->bgCamList = Lib_SegmentedToVirtual(colHeader->bgCamList);
}
if (colHeader->waterBoxes) {
colHeader->waterBoxes = Lib_SegmentedToVirtual(colHeader->waterBoxes);
@@ -4025,128 +4027,142 @@ u32 SurfaceType_GetData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId,
}
/**
- * SurfaceType return CamData Index
+ * SurfaceType get index of bgCam
*/
-u32 SurfaceType_GetCamDataIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) & 0xFF;
}
/**
- * CamData return camera setting
+ * BgCam get setting of bgCam
*/
-u16 func_800C9728(CollisionContext* colCtx, u32 camId, s32 bgId) {
- u16 result;
+u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId) {
+ u16 camSetting;
CollisionHeader* colHeader;
- CamData* camData;
+ BgCamInfo* bgCamList;
colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
if (colHeader == NULL) {
- return 0;
+ return CAM_SET_NONE;
}
- camData = colHeader->cameraDataList;
- result = camData[camId].setting;
- return result;
+
+ bgCamList = colHeader->bgCamList;
+ camSetting = bgCamList[bgCamIndex].setting;
+
+ return camSetting;
}
/**
- * SurfaceType return camera setting
+ * BgCam Get the camera setting of bgCam
*/
-u16 SurfaceType_GetCameraSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
- CamData* camData;
+ BgCamInfo* bgCamList;
+ SurfaceType* surfaceTypes;
+
+ if (colHeader == NULL) {
+ return CAM_SET_NONE;
+ }
+
+ bgCamList = colHeader->bgCamList;
+ if (bgCamList == NULL) {
+ return CAM_SET_NONE;
+ }
+
+ surfaceTypes = colHeader->surfaceTypeList;
+ if (surfaceTypes == NULL) {
+ return CAM_SET_NONE;
+ }
+
+ return BgCheck_GetBgCamSettingImpl(colCtx, SurfaceType_GetBgCamIndex(colCtx, poly, bgId), bgId);
+}
+
+/**
+ * BgCam Get the total count of Vec3s data from bgCamFuncData
+ */
+u16 BgCheck_GetBgCamCountImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId) {
+ CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
+ BgCamInfo* bgCamList;
+
+ if (colHeader == NULL) {
+ return 0;
+ }
+
+ bgCamList = colHeader->bgCamList;
+ if (bgCamList == NULL) {
+ return 0;
+ }
+
+ return bgCamList[bgCamIndex].count;
+}
+
+/**
+ * BgCam Get the total count of Vec3s data from bgCamFuncData
+ */
+u16 BgCheck_GetBgCamCount(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+ CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
+ BgCamInfo* bgCamList;
SurfaceType* surfaceTypes;
if (colHeader == NULL) {
return 0;
}
- camData = colHeader->cameraDataList;
- if (camData == NULL) {
+
+ bgCamList = colHeader->bgCamList;
+ if (bgCamList == NULL) {
return 0;
}
+
surfaceTypes = colHeader->surfaceTypeList;
if (surfaceTypes == NULL) {
return 0;
}
- return func_800C9728(colCtx, SurfaceType_GetCamDataIndex(colCtx, poly, bgId), bgId);
+
+ return BgCheck_GetBgCamCountImpl(colCtx, SurfaceType_GetBgCamIndex(colCtx, poly, bgId), bgId);
}
/**
- * CamData get number of camera data blocks
+ * BgCam Get Vec3s data from bgCamFuncData
*/
-u16 func_800C97F8(CollisionContext* colCtx, u32 camId, s32 bgId) {
+Vec3s* BgCheck_GetBgCamFuncDataImpl(CollisionContext* colCtx, s32 bgCamIndex, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
- CamData* camData;
-
- if (colHeader == NULL) {
- return 0;
- }
-
- camData = colHeader->cameraDataList;
- if (camData == NULL) {
- return 0;
- }
- return camData[camId].numData;
-}
-
-/**
- * SurfaceType get number of camera data blocks
- */
-u16 func_800C9844(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
- CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
- CamData* camData;
- SurfaceType* surfaceTypes;
-
- if (colHeader == NULL) {
- return 0;
- }
- camData = colHeader->cameraDataList;
- if (camData == NULL) {
- return 0;
- }
- surfaceTypes = colHeader->surfaceTypeList;
- if (surfaceTypes == NULL) {
- return 0;
- }
- return func_800C97F8(colCtx, SurfaceType_GetCamDataIndex(colCtx, poly, bgId), bgId);
-}
-
-/**
- * CamData get data
- */
-Vec3s* func_800C98CC(CollisionContext* colCtx, s32 camId, s32 bgId) {
- CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
- CamData* cameraDataList;
+ BgCamInfo* bgCamList;
if (colHeader == NULL) {
return NULL;
}
- cameraDataList = colHeader->cameraDataList;
- if (cameraDataList == NULL) {
+
+ bgCamList = colHeader->bgCamList;
+ if (bgCamList == NULL) {
return NULL;
}
- return Lib_SegmentedToVirtual(cameraDataList[camId].data);
+
+ return Lib_SegmentedToVirtual(bgCamList[bgCamIndex].bgCamFuncData);
}
/**
- * SurfaceType Get data
+ * BgCam Get Vec3s data from bgCamFuncData
*/
-Vec3s* SurfaceType_GetCamPosData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
- CamData* camData;
+ BgCamInfo* bgCamList;
SurfaceType* surfaceTypes;
if (colHeader == NULL) {
return NULL;
}
- camData = colHeader->cameraDataList;
- if (camData == NULL) {
+
+ bgCamList = colHeader->bgCamList;
+ if (bgCamList == NULL) {
return NULL;
}
+
surfaceTypes = colHeader->surfaceTypeList;
if (surfaceTypes == NULL) {
return NULL;
}
- return func_800C98CC(colCtx, SurfaceType_GetCamDataIndex(colCtx, poly, bgId), bgId);
+
+ return BgCheck_GetBgCamFuncDataImpl(colCtx, SurfaceType_GetBgCamIndex(colCtx, poly, bgId), bgId);
}
/**
@@ -4540,41 +4556,46 @@ f32 func_800CA568(CollisionContext* colCtx, s32 waterBoxId, s32 bgId) {
}
/**
- * WaterBox get CamData index
+ * WaterBox get BgCam index
*/
-u32 WaterBox_GetCamDataIndex(CollisionContext* colCtx, WaterBox* waterBox) {
+u32 WaterBox_GetBgCamIndex(CollisionContext* colCtx, WaterBox* waterBox) {
u32 prop = waterBox->properties >> 0;
return prop & 0xFF;
}
/**
- * WaterBox get CamData camera setting
+ * WaterBox get BgCam setting
*/
-u16 WaterBox_GetCameraSetting(CollisionContext* colCtx, WaterBox* waterBox, s32 bgId) {
+u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox, s32 bgId) {
s32 pad[2];
- u16 result = 0;
+ u16 camSetting = CAM_SET_NONE;
CollisionHeader* colHeader;
- CamData* camData;
- s32 camId;
+ BgCamInfo* bgCamList;
+ s32 bgCamIndex;
colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
if (colHeader == NULL) {
- return result;
- }
- camId = WaterBox_GetCamDataIndex(colCtx, waterBox);
- camData = colHeader->cameraDataList;
-
- if (camData == NULL) {
- return result;
+ return camSetting;
}
- result = camData[camId].setting;
- return result;
+ bgCamIndex = WaterBox_GetBgCamIndex(colCtx, waterBox);
+ bgCamList = colHeader->bgCamList;
+
+ if (bgCamList == NULL) {
+ return camSetting;
+ }
+
+ camSetting = bgCamList[bgCamIndex].setting;
+
+ return camSetting;
}
-void func_800CA6B8(CollisionContext* colCtx, WaterBox* waterBox) {
- WaterBox_GetCameraSetting(colCtx, waterBox, BGCHECK_SCENE);
+/**
+ * WaterBox get scene BgCam setting
+ */
+void WaterBox_GetSceneBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox) {
+ WaterBox_GetBgCamSetting(colCtx, waterBox, BGCHECK_SCENE);
}
/**
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index aaf68c759..63a06b512 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -38,7 +38,22 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB854.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB880.s")
+s32 Camera_IsSwimming(Camera* camera) {
+ Actor* focalActor = camera->focalActor;
+
+ if (focalActor == &GET_PLAYER(camera->play)->actor) {
+ if (((Player*)focalActor)->stateFlags3 & PLAYER_STATE3_8000) {
+ // Swimming as Zora
+ return 999;
+ } else {
+ // Swimming as Human or Fierce Deity
+ return ((Player*)focalActor)->stateFlags1 & PLAYER_STATE1_8000000;
+ }
+ } else {
+ // Camera not focused on player
+ return 0;
+ }
+}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB8C8.s")
@@ -84,13 +99,78 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC5C8.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC740.s")
+#define CAM_DATA_IS_BG (1 << 12) // if not set, then cam data is for actor cutscenes
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC7A8.s")
+/**
+ * Returns the CameraSettingType of the camera from either the bgCam or the actorCsCam at index `camDataId`
+ */
+s16 Camera_GetBgCamOrActorCsCamSetting(Camera* camera, u32 camDataId) {
+ if (camDataId & CAM_DATA_IS_BG) {
+ return BgCheck_GetBgCamSettingImpl(&camera->play->colCtx, camDataId & ~CAM_DATA_IS_BG, BGCHECK_SCENE);
+ } else {
+ return Play_GetActorCsCamSetting(camera->play, camDataId);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC804.s")
+/**
+ * Returns either the bgCam data or the actorCsCam data at index `camDataId`
+ */
+Vec3s* Camera_GetBgCamOrActorCsCamFuncData(Camera* camera, u32 camDataId) {
+ if (camDataId & CAM_DATA_IS_BG) {
+ return BgCheck_GetBgCamFuncDataImpl(&camera->play->colCtx, camDataId & ~CAM_DATA_IS_BG, BGCHECK_SCENE);
+ } else {
+ return Play_GetActorCsCamFuncData(camera->play, camDataId);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC874.s")
+/**
+ * Gets the bgCam index for the poly `poly`, returns -1 if
+ * there is no camera data for that poly.
+ */
+s32 Camera_GetBgCamIndex(Camera* camera, s32* bgId, CollisionPoly* poly) {
+ s32 bgCamIndex = SurfaceType_GetBgCamIndex(&camera->play->colCtx, poly, *bgId);
+ s32 ret;
+
+ if (BgCheck_GetBgCamSettingImpl(&camera->play->colCtx, bgCamIndex, *bgId) == CAM_SET_NONE) {
+ ret = -1;
+ } else {
+ ret = bgCamIndex;
+ }
+
+ return ret;
+}
+
+/**
+ * Gets the Camera setting for the water box the player is in.
+ * Returns -1 if the player is not in a water box, or does not have a swimming state.
+ * Returns -2 if there is no bgCam index for the water box.
+ * Returns the camera setting otherwise.
+ */
+s32 Camera_GetWaterBoxBgCamSetting(Camera* camera, f32* waterY) {
+ PosRot playerPosShape;
+ WaterBox* waterBox;
+ s32 camSetting;
+ s32 bgId;
+
+ Actor_GetWorldPosShapeRot(&playerPosShape, camera->focalActor);
+ *waterY = playerPosShape.pos.y;
+
+ if (!WaterBox_GetSurfaceImpl(camera->play, &camera->play->colCtx, playerPosShape.pos.x, playerPosShape.pos.z,
+ waterY, &waterBox, &bgId)) {
+ // player's position is not in a waterbox
+ *waterY = playerPosShape.pos.y;
+ return -1;
+ }
+
+ if (!Camera_IsSwimming(camera)) {
+ return -1;
+ }
+
+ camSetting = WaterBox_GetBgCamSetting(&camera->play->colCtx, waterBox, bgId);
+
+ // -2: no bgCam index
+ return (camSetting == CAM_SET_NONE) ? -2 : camSetting;
+}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC938.s")
diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c
index 7c8b7cf99..955f54870 100644
--- a/src/code/z_common_data.c
+++ b/src/code/z_common_data.c
@@ -13,7 +13,7 @@ void SaveContext_Init(void) {
gSaveContext.cutsceneTrigger = 0;
gSaveContext.unk_3F4D = 0;
gSaveContext.nextDayTime = 0xFFFF;
- gSaveContext.environmentTime = 0;
+ gSaveContext.skyboxTime = 0;
gSaveContext.dogIsLost = true;
gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT;
gSaveContext.unk_3F26 = 50;
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 1827acc85..383f8928a 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -554,7 +554,7 @@ void Cutscene_Command_SetTime(PlayState* play, CutsceneContext* csCtx, CsCmdDayT
nextTime = hourAsMinutes + minutes;
gSaveContext.save.time = nextTime;
- gSaveContext.environmentTime = nextTime;
+ gSaveContext.skyboxTime = nextTime;
}
}
@@ -1494,11 +1494,9 @@ void func_800EDA84(PlayState* play, CutsceneContext* csCtx) {
}
}
-#ifdef NON_MATCHING
// HandleFlags?
-// regalloc
void func_800EDBE0(PlayState* play) {
- CutsceneEntry* temp_a3;
+ s32 pad;
s16 sp2A;
SceneTableEntry* sp24;
s32 temp_v0_3;
@@ -1508,15 +1506,16 @@ void func_800EDBE0(PlayState* play) {
if (sp2A != -1) {
temp_v0_3 = func_800F2138(sp2A);
if (temp_v0_3 != -1) {
- temp_a3 = ((void)0, play->csCtx.sceneCsList);
- if ((temp_a3[temp_v0_3].unk7 != 0xFF) && (gSaveContext.respawnFlag == 0)) {
- if (temp_a3[temp_v0_3].unk7 == 0xFE) {
+ if ((play->csCtx.sceneCsList[temp_v0_3].unk7 != 0xFF) && (gSaveContext.respawnFlag == 0)) {
+ if (play->csCtx.sceneCsList[temp_v0_3].unk7 == 0xFE) {
ActorCutscene_Start(sp2A, NULL);
gSaveContext.showTitleCard = false;
- } else if (!((1 << (temp_a3[temp_v0_3].unk7 % 8)) &
- gSaveContext.save.weekEventReg[temp_a3[temp_v0_3].unk7 / 8])) {
- gSaveContext.save.weekEventReg[(temp_a3[temp_v0_3].unk7 / 8)] |=
- 1 << (temp_a3[temp_v0_3].unk7 % 8);
+ } else if (!(((void)0,
+ gSaveContext.save.weekEventReg[(play->csCtx.sceneCsList[temp_v0_3].unk7 / 8)]) &
+ (1 << (play->csCtx.sceneCsList[temp_v0_3].unk7 % 8)))) {
+ gSaveContext.save.weekEventReg[(play->csCtx.sceneCsList[temp_v0_3].unk7 / 8)] =
+ ((void)0, gSaveContext.save.weekEventReg[(play->csCtx.sceneCsList[temp_v0_3].unk7 / 8)]) |
+ (1 << (play->csCtx.sceneCsList[temp_v0_3].unk7 % 8));
ActorCutscene_Start(sp2A, NULL);
gSaveContext.showTitleCard = false;
}
@@ -1530,7 +1529,8 @@ void func_800EDBE0(PlayState* play) {
if ((gSaveContext.respawnFlag == 0) || (gSaveContext.respawnFlag == -2)) {
sp24 = play->loadedScene;
if ((sp24->titleTextId != 0) && gSaveContext.showTitleCard) {
- if ((Entrance_GetTransitionFlags(gSaveContext.sceneSetupIndex + gSaveContext.save.entranceIndex) &
+ if ((Entrance_GetTransitionFlags(((void)0, gSaveContext.save.entranceIndex) +
+ ((void)0, gSaveContext.sceneSetupIndex)) &
0x4000) != 0) {
func_80151A68(play, sp24->titleTextId);
}
@@ -1539,9 +1539,6 @@ void func_800EDBE0(PlayState* play) {
gSaveContext.showTitleCard = true;
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_demo/func_800EDBE0.s")
-#endif
void func_800EDDB0(PlayState* play) {
}
diff --git a/src/code/z_draw.c b/src/code/z_draw.c
index b31f796b7..4167b4cea 100644
--- a/src/code/z_draw.c
+++ b/src/code/z_draw.c
@@ -1,49 +1,843 @@
+/**
+ * @file z_draw.c
+ * @brief Draw get-item models
+ */
#include "global.h"
+#include "assets/objects/object_gi_arrow/object_gi_arrow.h"
+#include "assets/objects/object_gi_arrowcase/object_gi_arrowcase.h"
+#include "assets/objects/object_gi_bean/object_gi_bean.h"
+#include "assets/objects/object_gi_bigbomb/object_gi_bigbomb.h"
+#include "assets/objects/object_gi_bomb_1/object_gi_bomb_1.h"
+#include "assets/objects/object_gi_bomb_2/object_gi_bomb_2.h"
+#include "assets/objects/object_gi_bombpouch/object_gi_bombpouch.h"
+#include "assets/objects/object_gi_bosskey/object_gi_bosskey.h"
+#include "assets/objects/object_gi_bottle_04/object_gi_bottle_04.h"
+#include "assets/objects/object_gi_bottle_15/object_gi_bottle_15.h"
+#include "assets/objects/object_gi_bottle_16/object_gi_bottle_16.h"
+#include "assets/objects/object_gi_bottle_21/object_gi_bottle_21.h"
+#include "assets/objects/object_gi_bottle_22/object_gi_bottle_22.h"
+#include "assets/objects/object_gi_bottle_red/object_gi_bottle_red.h"
+#include "assets/objects/object_gi_bottle/object_gi_bottle.h"
+#include "assets/objects/object_gi_bow/object_gi_bow.h"
+#include "assets/objects/object_gi_camera/object_gi_camera.h"
+#include "assets/objects/object_gi_compass/object_gi_compass.h"
+#include "assets/objects/object_gi_fieldmap/object_gi_fieldmap.h"
+#include "assets/objects/object_gi_fish/object_gi_fish.h"
+#include "assets/objects/object_gi_ghost/object_gi_ghost.h"
+#include "assets/objects/object_gi_glasses/object_gi_glasses.h"
+#include "assets/objects/object_gi_gold_dust/object_gi_gold_dust.h"
+#include "assets/objects/object_gi_golonmask/object_gi_golonmask.h"
+#include "assets/objects/object_gi_heart/object_gi_heart.h"
+#include "assets/objects/object_gi_hearts/object_gi_hearts.h"
+#include "assets/objects/object_gi_hookshot/object_gi_hookshot.h"
+#include "assets/objects/object_gi_insect/object_gi_insect.h"
+#include "assets/objects/object_gi_key/object_gi_key.h"
+#include "assets/objects/object_gi_ki_tan_mask/object_gi_ki_tan_mask.h"
+#include "assets/objects/object_gi_liquid/object_gi_liquid.h"
+#include "assets/objects/object_gi_loach/object_gi_loach.h"
+#include "assets/objects/object_gi_longsword/object_gi_longsword.h"
+#include "assets/objects/object_gi_m_arrow/object_gi_m_arrow.h"
+#include "assets/objects/object_gi_magicmushroom/object_gi_magicmushroom.h"
+#include "assets/objects/object_gi_magicpot/object_gi_magicpot.h"
+#include "assets/objects/object_gi_map/object_gi_map.h"
+#include "assets/objects/object_gi_mask03/object_gi_mask03.h"
+#include "assets/objects/object_gi_mask05/object_gi_mask05.h"
+#include "assets/objects/object_gi_mask06/object_gi_mask06.h"
+#include "assets/objects/object_gi_mask09/object_gi_mask09.h"
+#include "assets/objects/object_gi_mask10/object_gi_mask10.h"
+#include "assets/objects/object_gi_mask11/object_gi_mask11.h"
+#include "assets/objects/object_gi_mask12/object_gi_mask12.h"
+#include "assets/objects/object_gi_mask13/object_gi_mask13.h"
+#include "assets/objects/object_gi_mask14/object_gi_mask14.h"
+#include "assets/objects/object_gi_mask15/object_gi_mask15.h"
+#include "assets/objects/object_gi_mask16/object_gi_mask16.h"
+#include "assets/objects/object_gi_mask17/object_gi_mask17.h"
+#include "assets/objects/object_gi_mask18/object_gi_mask18.h"
+#include "assets/objects/object_gi_mask20/object_gi_mask20.h"
+#include "assets/objects/object_gi_mask21/object_gi_mask21.h"
+#include "assets/objects/object_gi_mask22/object_gi_mask22.h"
+#include "assets/objects/object_gi_mask23/object_gi_mask23.h"
+#include "assets/objects/object_gi_melody/object_gi_melody.h"
+#include "assets/objects/object_gi_milk/object_gi_milk.h"
+#include "assets/objects/object_gi_mssa/object_gi_mssa.h"
+#include "assets/objects/object_gi_nuts/object_gi_nuts.h"
+#include "assets/objects/object_gi_nutsmask/object_gi_nutsmask.h"
+#include "assets/objects/object_gi_ocarina/object_gi_ocarina.h"
+#include "assets/objects/object_gi_purse/object_gi_purse.h"
+#include "assets/objects/object_gi_rabit_mask/object_gi_rabit_mask.h"
+#include "assets/objects/object_gi_reserve_b_00/object_gi_reserve_b_00.h"
+#include "assets/objects/object_gi_reserve_b_01/object_gi_reserve_b_01.h"
+#include "assets/objects/object_gi_reserve_c_00/object_gi_reserve_c_00.h"
+#include "assets/objects/object_gi_reserve_c_01/object_gi_reserve_c_01.h"
+#include "assets/objects/object_gi_reserve00/object_gi_reserve00.h"
+#include "assets/objects/object_gi_reserve01/object_gi_reserve01.h"
+#include "assets/objects/object_gi_rupy/object_gi_rupy.h"
+#include "assets/objects/object_gi_schedule/object_gi_schedule.h"
+#include "assets/objects/object_gi_seahorse/object_gi_seahorse.h"
+#include "assets/objects/object_gi_shield_2/object_gi_shield_2.h"
+#include "assets/objects/object_gi_shield_3/object_gi_shield_3.h"
+#include "assets/objects/object_gi_soldout/object_gi_soldout.h"
+#include "assets/objects/object_gi_soul/object_gi_soul.h"
+#include "assets/objects/object_gi_stick/object_gi_stick.h"
+#include "assets/objects/object_gi_stonemask/object_gi_stonemask.h"
+#include "assets/objects/object_gi_sutaru/object_gi_sutaru.h"
+#include "assets/objects/object_gi_sword_1/object_gi_sword_1.h"
+#include "assets/objects/object_gi_sword_2/object_gi_sword_2.h"
+#include "assets/objects/object_gi_sword_3/object_gi_sword_3.h"
+#include "assets/objects/object_gi_sword_4/object_gi_sword_4.h"
+#include "assets/objects/object_gi_truth_mask/object_gi_truth_mask.h"
+#include "assets/objects/object_gi_zoramask/object_gi_zoramask.h"
+#include "assets/objects/object_bsmask/object_bsmask.h"
+#include "assets/objects/object_st/object_st.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/GetItem_Draw.s")
+void GetItem_DrawBombchu(PlayState* play, s16 drawId);
+void GetItem_DrawPoes(PlayState* play, s16 drawId);
+void GetItem_DrawFairyBottle(PlayState* play, s16 drawId);
+void GetItem_DrawSkullToken(PlayState* play, s16 drawId);
+void GetItem_DrawCompass(PlayState* play, s16 drawId);
+void GetItem_DrawPotion(PlayState* play, s16 drawId);
+void GetItem_DrawGoronSword(PlayState* play, s16 drawId);
+void GetItem_DrawDekuNuts(PlayState* play, s16 drawId);
+void GetItem_DrawRecoveryHeart(PlayState* play, s16 drawId);
+void GetItem_DrawFish(PlayState* play, s16 drawId);
+void GetItem_DrawOpa0(PlayState* play, s16 drawId);
+void GetItem_DrawOpa0Xlu1(PlayState* play, s16 drawId);
+void GetItem_DrawOpa01(PlayState* play, s16 drawId);
+void GetItem_DrawXlu01(PlayState* play, s16 drawId);
+void GetItem_DrawSeahorse(PlayState* play, s16 drawId);
+void GetItem_DrawFairyContainer(PlayState* play, s16 drawId);
+void GetItem_DrawMoonsTear(PlayState* play, s16 drawId);
+void GetItem_DrawMagicArrow(PlayState* play, s16 drawId);
+void GetItem_DrawUpgrades(PlayState* play, s16 drawId);
+void GetItem_DrawRupee(PlayState* play, s16 drawId);
+void GetItem_DrawSmallRupee(PlayState* play, s16 drawId);
+void GetItem_DrawWallet(PlayState* play, s16 drawId);
+void GetItem_DrawRemains(PlayState* play, s16 drawId);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EE364.s")
+typedef struct {
+ /* 0x00 */ void (*drawFunc)(PlayState*, s16);
+ /* 0x04 */ void* drawResources[8]; // Either display lists (Gfx*) or matrices (Mtx*)
+} DrawItemTableEntry; // size = 0x24
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EE400.s")
+static DrawItemTableEntry sDrawItemTable[] = {
+ // GID_BOTTLE, OBJECT_GI_BOTTLE
+ { GetItem_DrawOpa0Xlu1, { gGiEmptyBottleCorkDL, gGiEmptyBottleGlassDL } },
+ // GID_KEY_SMALL, OBJECT_GI_KEY
+ { GetItem_DrawOpa0, { gGiSmallKeyDL } },
+ // GID_MASK_KAMARO, OBJECT_GI_MASK17
+ { GetItem_DrawOpa01, { gGiKamaroMaskDL, gGiKamaroMaskEmptyDL } },
+ // GID_MASK_COUPLE, OBJECT_GI_MASK13
+ { GetItem_DrawOpa0Xlu1, { gGiCouplesMaskFullDL, gGiCouplesMaskHalfDL } },
+ // GID_04, OBJECT_GI_MELODY
+ { GetItem_DrawXlu01, { gGiSerenadeColorDL, gGiSongNoteDL } },
+ // GID_05, OBJECT_GI_MELODY
+ { GetItem_DrawXlu01, { gGiRequiemColorDL, gGiSongNoteDL } },
+ // GID_06, OBJECT_GI_MELODY
+ { GetItem_DrawXlu01, { gGiNocturneColorDL, gGiSongNoteDL } },
+ // GID_07, OBJECT_GI_MELODY
+ { GetItem_DrawXlu01, { gGiPreludeColorDL, gGiSongNoteDL } },
+ // GID_RECOVERY_HEART, OBJECT_GI_HEART
+ { GetItem_DrawRecoveryHeart, { gGiRecoveryHeartDL } },
+ // GID_KEY_BOSS, OBJECT_GI_KEY_BOSS
+ { GetItem_DrawOpa0Xlu1, { gGiBossKeyDL, gGiBossKeyGemDL } },
+ // GID_COMPASS, OBJECT_GI_COMPASS
+ { GetItem_DrawCompass, { gGiCompassDL, gGiCompassGlassDL } },
+ // GID_BOMBERS_NOTEBOOK, OBJECT_GI_SCHEDULE
+ { GetItem_DrawOpa0Xlu1, { gGiBombersNotebookEmptyDL, gGiBombersNotebookDL } },
+ // GID_MASK_STONE, OBJECT_GI_STONEMASK
+ { GetItem_DrawOpa0Xlu1, { gGiStoneMaskEmptyDL, gGiStoneMaskDL } },
+ // GID_MASK_KAFEIS_MASK, OBJECT_GI_MASK05
+ { GetItem_DrawOpa01, { gGiKafeiMaskDL, gGiKafeiMaskEmptyDL } },
+ // GID_MASK_CIRCUS_LEADER, OBJECT_GI_MASK11
+ { GetItem_DrawOpa0Xlu1, { gGiCircusLeaderMaskFaceDL, gGiCircusLeaderMaskEyebrowsDL } },
+ // GID_MASK_BREMEN, OBJECT_GI_MASK20
+ { GetItem_DrawOpa01, { gGiBremenMaskDL, gGiBremenMaskEmptyDL } },
+ // GID_MASK_ALL_NIGHT, OBJECT_GI_MASK06
+ { GetItem_DrawOpa0Xlu1, { gGiAllNightMaskEyesDL, gGiAllNightMaskFaceDL } },
+ // GID_NUTS, OBJECT_GI_NUTS
+ { GetItem_DrawDekuNuts, { gGiNutDL } },
+ // GID_HEART_CONTAINER, OBJECT_GI_HEARTS
+ { GetItem_DrawXlu01, { gGiHeartBorderDL, gGiHeartContainerDL } },
+ // GID_HEART_PIECE, OBJECT_GI_HEARTS
+ { GetItem_DrawXlu01, { gGiHeartBorderDL, gGiHeartPieceDL } },
+ // GID_QUIVER_30, OBJECT_GI_ARROWCASE
+ { GetItem_DrawUpgrades, { gGiQuiverInnerDL, gGiQuiver30InnerColorDL, gGiQuiver30OuterColorDL, gGiQuiverOuterDL } },
+ // GID_QUIVER_40, OBJECT_GI_ARROWCASE
+ { GetItem_DrawUpgrades, { gGiQuiverInnerDL, gGiQuiver40InnerColorDL, gGiQuiver40OuterColorDL, gGiQuiverOuterDL } },
+ // GID_QUIVER_50, OBJECT_GI_ARROWCASE
+ { GetItem_DrawUpgrades, { gGiQuiverInnerDL, gGiQuiver50InnerColorDL, gGiQuiver50OuterColorDL, gGiQuiverOuterDL } },
+ // GID_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH
+ { GetItem_DrawUpgrades, { gGiBombBagDL, gGiBombBag20BagColorDL, gGiBombBag20RingColorDL, gGiBombBagRingDL } },
+ // GID_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH
+ { GetItem_DrawUpgrades, { gGiBombBagDL, gGiBombBag30BagColorDL, gGiBombBag30RingColorDL, gGiBombBagRingDL } },
+ // GID_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH
+ { GetItem_DrawUpgrades, { gGiBombBagDL, gGiBombBag40BagColorDL, gGiBombBag40RingColorDL, gGiBombBagRingDL } },
+ // GID_STICK, OBJECT_GI_STICK
+ { GetItem_DrawOpa0, { gGiStickDL } },
+ // GID_DUNGEON_MAP, OBJECT_GI_MAP
+ { GetItem_DrawOpa0, { gGiDungeonMapDL } },
+ // GID_MAGIC_SMALL, OBJECT_GI_MAGICPOT
+ { GetItem_DrawOpa0, { gGiMagicJarSmallDL } },
+ // GID_MAGIC_LARGE, OBJECT_GI_MAGICPOT
+ { GetItem_DrawOpa0, { gGiMagicJarLargeDL } },
+ // GID_BOMB, OBJECT_GI_BOMB_1
+ { GetItem_DrawOpa0, { gGiBombDL } },
+ // GID_STONE_OF_AGONY, OBJECT_GI_MAP
+ { GetItem_DrawOpa0, { gGiStoneOfAgonyDL } },
+ // GID_WALLET_ADULT, OBJECT_GI_PURSE
+ { GetItem_DrawWallet,
+ { gGiWalletDL, gGiAdultWalletColorDL, gGiAdultWalletRupeeOuterColorDL, gGiWalletRupeeOuterDL,
+ gGiAdultWalletStringColorDL, gGiWalletStringDL, gGiAdultWalletRupeeInnerColorDL, gGiWalletRupeeInnerDL } },
+ // GID_WALLET_GIANT, OBJECT_GI_PURSE
+ { GetItem_DrawWallet,
+ { gGiWalletDL, gGiGiantsWalletColorDL, gGiGiantsWalletRupeeOuterColorDL, gGiWalletRupeeOuterDL,
+ gGiGiantsWalletStringColorDL, gGiWalletStringDL, gGiGiantsWalletRupeeInnerColorDL, gGiWalletRupeeInnerDL } },
+ // GID_MASK_DON_GERO, OBJECT_GI_MASK16
+ { GetItem_DrawOpa0Xlu1, { gGiDonGeroMaskFaceDL, gGiDonGeroMaskBodyDL } },
+ // GID_ARROWS_SMALL, OBJECT_GI_ARROW
+ { GetItem_DrawOpa0, { gGiArrowSmallDL } },
+ // GID_ARROWS_MEDIUM, OBJECT_GI_ARROW
+ { GetItem_DrawOpa0, { gGiArrowMediumDL } },
+ // GID_ARROWS_LARGE, OBJECT_GI_ARROW
+ { GetItem_DrawOpa0, { gGiArrowLargeDL } },
+ // GID_BOMBCHU, OBJECT_GI_BOMB_2
+ { GetItem_DrawBombchu, { gGiBombchuDL } },
+ // GID_SHIELD_HERO, OBJECT_GI_SHIELD_2
+ { GetItem_DrawOpa0Xlu1, { gGiHerosShieldEmblemDL, gGiHerosShieldDL } },
+ // GID_HOOKSHOT, OBJECT_GI_HOOKSHOT
+ { GetItem_DrawOpa01, { gGiHookshotEmptyDL, gGiHookshotDL } },
+ // GID_29, OBJECT_GI_HOOKSHOT
+ { GetItem_DrawOpa01, { gGiHookshotEmptyDL, gGiHookshotDL } },
+ // GID_OCARINA, OBJECT_GI_OCARINA
+ { GetItem_DrawOpa0Xlu1, { gGiOcarinaOfTimeDL, gGiOcarinaOfTimeHolesDL } },
+ // GID_MILK, OBJECT_GI_MILK
+ { GetItem_DrawOpa0Xlu1, { gGiMilkBottleContentsDL, gGiMilkBottleGlassDL } },
+ // GID_MASK_KEATON, OBJECT_GI_KI_TAN_MASK
+ { GetItem_DrawOpa0Xlu1, { gGiKeatonMaskDL, gGiKeatonMaskEyesDL } },
+ // GID_TINGLE_MAP, OBJECT_GI_FIELDMAP
+ { GetItem_DrawOpa01, { gGiTingleMapDL, gGiTingleMapEmptyDL } },
+ // GID_BOW, OBJECT_GI_BOW
+ { GetItem_DrawOpa01, { gGiBowHandleDL, gGiBowStringDL } },
+ // GID_LENS, OBJECT_GI_GLASSES
+ { GetItem_DrawOpa0Xlu1, { gGiLensDL, gGiLensGlassDL } },
+ // GID_POTION_GREEN, OBJECT_GI_LIQUID
+ { GetItem_DrawPotion,
+ { gGiPotionContainerPotDL, gGiPotionContainerGreenPotColorDL, gGiPotionContainerGreenLiquidColorDL,
+ gGiPotionContainerLiquidDL, gGiPotionContainerGreenPatternColorDL, gGiPotionContainerPatternDL } },
+ // GID_POTION_RED, OBJECT_GI_LIQUID
+ { GetItem_DrawPotion,
+ { gGiPotionContainerPotDL, gGiPotionContainerRedPotColorDL, gGiPotionContainerRedLiquidColorDL,
+ gGiPotionContainerLiquidDL, gGiPotionContainerRedPatternColorDL, gGiPotionContainerPatternDL } },
+ // GID_POTION_BLUE, OBJECT_GI_LIQUID
+ { GetItem_DrawPotion,
+ { gGiPotionContainerPotDL, gGiPotionContainerBluePotColorDL, gGiPotionContainerBlueLiquidColorDL,
+ gGiPotionContainerLiquidDL, gGiPotionContainerBluePatternColorDL, gGiPotionContainerPatternDL } },
+ // GID_SHIELD_MIRROR, OBJECT_GI_SHIELD_3
+ { GetItem_DrawOpa0Xlu1, { gGiMirrorShieldEmptyDL, gGiMirrorShieldDL } },
+ // GID_MAGIC_BEANS, OBJECT_GI_BEAN
+ { GetItem_DrawOpa0, { gGiBeanDL } },
+ // GID_FISH, OBJECT_GI_FISH
+ { GetItem_DrawFish, { gGiFishContainerDL } },
+ // GID_LETTER_MAMA, OBJECT_GI_RESERVE_B_01
+ { GetItem_DrawOpa0Xlu1, { gGiLetterToMamaEnvelopeLetterDL, gGiLetterToMamaInscriptionsDL } },
+ // GID_37
+ { GetItem_DrawOpa0, { NULL } },
+ // GID_SWORD_BGS, OBJECT_GI_LONGSWORD
+ { GetItem_DrawGoronSword, { gGiBiggoronSwordDL } },
+ // GID_MASK_SUN, OBJECT_GI_MSSA
+ { GetItem_DrawOpa0Xlu1, { gGiSunMaskFaceDL, gGiSunMaskEyesSidePatternsDL } },
+ // GID_MASK_BLAST, OBJECT_GI_MASK21
+ { GetItem_DrawOpa0Xlu1, { gGiBlastMaskEmptyDL, gGiBlastMaskDL } },
+ // GID_FAIRY, OBJECT_GI_BOTTLE_04
+ { GetItem_DrawFairyContainer,
+ { gGiFairyBottleEmptyDL, gGiFairyBottleGlassCorkDL, gGiFairyBottleContentsDL, &gGiFairyBottleBillboardRotMtx } },
+ // GID_MASK_SCENTS, OBJECT_GI_MASK22
+ { GetItem_DrawOpa01, { gGiMaskOfScentsFaceDL, gGiMaskOfScentsTeethDL } },
+ // GID_MASK_CAPTAIN, OBJECT_GI_MASK18
+ { GetItem_DrawOpa01, { gGiCaptainsHatBodyDL, gGiCaptainsHatFaceDL } },
+ // GID_MASK_BUNNY, OBJECT_GI_RABIT_MASK
+ { GetItem_DrawOpa0Xlu1, { gGiBunnyHoodDL, gGiBunnyHoodEyesDL } },
+ // GID_MASK_TRUTH, OBJECT_GI_TRUTH_MASK
+ { GetItem_DrawOpa0Xlu1, { gGiMaskOfTruthDL, gGiMaskOfTruthAccentsDL } },
+ // GID_DEED_SWAMP, OBJECT_GI_RESERVE01
+ { GetItem_DrawOpa01, { gGiTitleDeedEmptyDL, gGiTitleDeedSwampColorDL } },
+ // GID_DEED_MOUNTAIN, OBJECT_GI_RESERVE01
+ { GetItem_DrawOpa01, { gGiTitleDeedEmptyDL, gGiTitleDeedMountainColorDL } },
+ // GID_RUPEE_HUGE, OBJECT_GI_RUPY
+ { GetItem_DrawRupee, { gGiRupeeInnerDL, gGiGoldRupeeInnerColorDL, gGiRupeeOuterDL, gGiGoldRupeeOuterColorDL } },
+ // GID_DEED_OCEAN, OBJECT_GI_RESERVE01
+ { GetItem_DrawOpa01, { gGiTitleDeedEmptyDL, gGiTitleDeedOceanColorDL } },
+ // GID_MASK_GORON, OBJECT_GI_GOLONMASK
+ { GetItem_DrawOpa0Xlu1, { gGiGoronMaskEmptyDL, gGiGoronMaskDL } },
+ // GID_MASK_ZORA, OBJECT_GI_ZORAMASK
+ { GetItem_DrawOpa01, { gGiZoraMaskEmptyDL, gGiZoraMaskDL } },
+ // GID_46
+ { GetItem_DrawBombchu, { NULL } },
+ // GID_ARROW_FIRE, OBJECT_GI_M_ARROW
+ { GetItem_DrawMagicArrow, { gGiMagicArrowAmmoDL, gGiMagicArrowFireColorDL, gGiMagicArrowGlowDL } },
+ // GID_ARROW_ICE, OBJECT_GI_M_ARROW
+ { GetItem_DrawMagicArrow, { gGiMagicArrowAmmoDL, gGiMagicArrowIceColorDL, gGiMagicArrowGlowDL } },
+ // GID_ARROW_LIGHT, OBJECT_GI_M_ARROW
+ { GetItem_DrawMagicArrow, { gGiMagicArrowAmmoDL, gGiMagicArrowLightColorDL, gGiMagicArrowGlowDL } },
+ // GID_SKULL_TOKEN, OBJECT_GI_SUTARU
+ { GetItem_DrawSkullToken, { gGiSkulltulaTokenDL, gGiSkulltulaTokenFlameDL } },
+ // GID_BUG, OBJECT_GI_INSECT
+ { GetItem_DrawOpa0Xlu1, { gGiBugContainerContentsDL, gGiBugContainerGlassDL } },
+ // GID_4C
+ { GetItem_DrawOpa0Xlu1, { NULL } },
+ // GID_POE, OBJECT_GI_GHOST
+ { GetItem_DrawPoes,
+ { gGiPoeContainerLidDL, gGiPoeContainerGlassDL, gGiPoeContainerContentsDL, gGiPoeContainerPoeColorDL } },
+ // GID_FAIRY_2, OBJECT_GI_SOUL
+ { GetItem_DrawFairyBottle, { gGiFairyContainerBaseCapDL, gGiFairyContainerGlassDL, gGiFairyContainerContentsDL } },
+ // GID_RUPEE_GREEN, OBJECT_GI_RUPY
+ { GetItem_DrawSmallRupee,
+ { gGiRupeeInnerDL, gGiGreenRupeeInnerColorDL, gGiRupeeOuterDL, gGiGreenRupeeOuterColorDL } },
+ // GID_RUPEE_BLUE, OBJECT_GI_RUPY
+ { GetItem_DrawSmallRupee,
+ { gGiRupeeInnerDL, gGiBlueRupeeInnerColorDL, gGiRupeeOuterDL, gGiBlueRupeeOuterColorDL } },
+ // GID_RUPEE_RED, OBJECT_GI_RUPY
+ { GetItem_DrawSmallRupee, { gGiRupeeInnerDL, gGiRedRupeeInnerColorDL, gGiRupeeOuterDL, gGiRedRupeeOuterColorDL } },
+ // GID_BIG_POE, OBJECT_GI_GHOST
+ { GetItem_DrawPoes,
+ { gGiPoeContainerLidDL, gGiPoeContainerGlassDL, gGiPoeContainerContentsDL, gGiPoeContainerBigPoeColorDL } },
+ // GID_RUPEE_PURPLE, OBJECT_GI_RUPY
+ { GetItem_DrawRupee, { gGiRupeeInnerDL, gGiPurpleRupeeInnerColorDL, gGiRupeeOuterDL, gGiPurpleRupeeOuterColorDL } },
+ // GID_RUPEE_SILVER, OBJECT_GI_RUPY
+ { GetItem_DrawRupee, { gGiRupeeInnerDL, gGiSilverRupeeInnerColorDL, gGiRupeeOuterDL, gGiSilverRupeeOuterColorDL } },
+ // GID_SWORD_KOKIRI, OBJECT_GI_SWORD_1
+ { GetItem_DrawOpa01, { gGiKokiriSwordBladeHiltDL, gGiKokiriSwordGuardDL } },
+ // GID_SKULL_TOKEN_2, OBJECT_ST
+ { GetItem_DrawSkullToken, { gSkulltulaTokenDL, gSkulltulaTokenFlameDL } },
+ // GID_57, OBJECT_GI_BOTTLE_RED
+ { GetItem_DrawOpa0Xlu1, { gGiRedPotionBottleEmptyDL, gGiRedPotionBottleDL } },
+ // GID_ZORA_EGG, OBJECT_GI_BOTTLE_15
+ { GetItem_DrawOpa0Xlu1, { gGiZoraEggBottleContentsDL, gGiZoraEggBottleGlassAndCorkDL } },
+ // GID_MOON_TEAR, OBJECT_GI_RESERVE00
+ { GetItem_DrawMoonsTear, { gGiMoonsTearItemDL, gGiMoonsTearGlowDL } },
+ // GID_DEED_LAND, OBJECT_GI_RESERVE01
+ { GetItem_DrawOpa01, { gGiTitleDeedEmptyDL, gGiTitleDeedLandColorDL } },
+ // GID_MASK_DEKU, OBJECT_GI_NUTSMASK
+ { GetItem_DrawOpa0Xlu1, { gGiDekuMaskEmptyDL, gGiDekuMaskDL } },
+ // GID_REMAINS_ODOLWA, OBJECT_BSMASK
+ { GetItem_DrawRemains, { gRemainsOdolwaDL, gRemainsOdolwaDL } },
+ // GID_POWDER_KEG, OBJECT_GI_BIGBOMB
+ { GetItem_DrawOpa0Xlu1, { gGiPowderKegBarrelDL, gGiPowderKegGoronSkullAndFuseDL } },
+ // GID_GOLD_DUST, OBJECT_GI_GOLD_DUST
+ { GetItem_DrawOpa01, { gGiGoldDustPowderDL, gGiGoldDustPowderEmptyDL } },
+ // GID_SEAHORSE, OBJECT_GI_BOTTLE_16
+ { GetItem_DrawOpa0Xlu1, { gGiSeahorseBottleEmptyDL, gGiSeahorseBottleGlassAndCorkDL } },
+ // GID_60, OBJECT_GI_BOTTLE_22
+ { GetItem_DrawOpa0Xlu1, { gGiHylianLoachBottleContentsDL, gGiHylianLoachBottleGlassCorkWaterDL } },
+ // GID_HYLIAN_LOACH, OBJECT_GI_LOACH
+ { GetItem_DrawOpa0Xlu1, { gGiHylianLoachEmptyDL, gGiHylianLoachDL } },
+ // GID_SEAHORSE_CAUGHT, OBJECT_GI_SEAHORSE
+ { GetItem_DrawSeahorse, { gGiSeahorseEmptyDL, gGiSeahorseBodyDL, gGiSeahorseGlowDL, &gGiSeahorseBillboardRotMtx } },
+ // GID_REMAINS_GOHT, OBJECT_BSMASK
+ { GetItem_DrawRemains, { gRemainsGohtDL, gRemainsGohtDL } },
+ // GID_REMAINS_GYORG, OBJECT_BSMASK
+ { GetItem_DrawRemains, { gRemainsGyorgDL, gRemainsGyorgDL } },
+ // GID_REMAINS_TWINMOLD, OBJECT_BSMASK
+ { GetItem_DrawRemains, { gRemainsTwinmoldDL, gRemainsTwinmoldDL } },
+ // GID_SWORD_RAZOR, OBJECT_GI_SWORD_2
+ { GetItem_DrawOpa01, { gGiRazorSwordDL, gGiRazorSwordEmptyDL } },
+ // GID_SWORD_GILDED, OBJECT_GI_SWORD_3
+ { GetItem_DrawOpa01, { gGiGildedSwordDL, gGiGildedSwordEmptyDL } },
+ // GID_SWORD_GREAT_FAIRY, OBJECT_GI_SWORD_4
+ { GetItem_DrawOpa0Xlu1, { gGiGreatFairySwordBladeDL, gGiGreatFairySwordHiltEmblemDL } },
+ // GID_MASK_GARO, OBJECT_GI_MASK09
+ { GetItem_DrawOpa0Xlu1, { gGiGarosMaskCloakDL, gGiGarosMaskFaceDL } },
+ // GID_MASK_GREAT_FAIRY, OBJECT_GI_MASK14
+ { GetItem_DrawOpa0Xlu1, { gGiGreatFairyMaskFaceDL, gGiGreatFairyMaskLeavesDL } },
+ // GID_MASK_GIBDO, OBJECT_GI_MASK15
+ { GetItem_DrawOpa0Xlu1, { gGiGibdoMaskEmptyDL, gGiGibdoMaskDL } },
+ // GID_ROOM_KEY, OBJECT_GI_RESERVE_B_00
+ { GetItem_DrawOpa0Xlu1, { gGiRoomKeyEmptyDL, gGiRoomKeyDL } },
+ // GID_LETTER_TO_KAFEI, OBJECT_GI_RESERVE_C_00
+ { GetItem_DrawOpa0Xlu1, { gGiLetterToKafeiEnvelopeLetterDL, gGiLetterToKafeiInscriptionsDL } },
+ // GID_PENDANT_OF_MEMORIES, OBJECT_GI_RESERVE_C_01
+ { GetItem_DrawOpa0Xlu1, { gGiPendantOfMemoriesEmptyDL, gGiPendantOfMemoriesDL } },
+ // GID_MUSHROOM, OBJECT_GI_MAGICMUSHROOM
+ { GetItem_DrawOpa0Xlu1, { gGiMagicMushroomEmptyDL, gGiMagicMushroomDL } },
+ // GID_MASK_ROMANI, OBJECT_GI_MASK10
+ { GetItem_DrawOpa0Xlu1, { gGiRomaniMaskCapDL, gGiRomaniMaskNoseEyeDL } },
+ // GID_MASK_POSTMAN, OBJECT_GI_MASK12
+ { GetItem_DrawOpa0Xlu1, { gGiPostmanHatCapDL, gGiPostmanHatBunnyLogoDL } },
+ // GID_MASK_GIANT, OBJECT_GI_MASK23
+ { GetItem_DrawOpa01, { gGiGiantMaskEmptyDL, gGiGiantMaskDL } },
+ // GID_CHATEAU, OBJECT_GI_BOTTLE_21
+ { GetItem_DrawOpa0Xlu1, { gGiChateauRomaniBottleEmptyDL, gGiChateauRomaniBottleDL } },
+ // GID_PICTO_BOX, OBJECT_GI_CAMERA
+ { GetItem_DrawOpa0Xlu1, { gGiPictoBoxFrameDL, gGiPictoBoxBodyAndLensDL } },
+ // GID_MASK_FIERCE_DEITY, OBJECT_GI_MASK03
+ { GetItem_DrawOpa01, { gGiFierceDeityMaskFaceDL, gGiFierceDeityMaskHairAndHatDL } },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EE5FC.s")
+/**
+ * Draw "Get Item" Model
+ * Calls the corresponding draw function for the given draw ID
+ */
+void GetItem_Draw(PlayState* play, s16 drawId) {
+ sDrawItemTable[drawId].drawFunc(play, drawId);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EE7D8.s")
+void GetItem_DrawBombchu(PlayState* play, s16 drawId) {
+ s32 pad;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EE940.s")
+ OPEN_DISPS(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EEA48.s")
+ func_8012C214(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EEC18.s")
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EED20.s")
+ CLOSE_DISPS(play->state.gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EEE34.s")
+void GetItem_DrawPoes(PlayState* play, s16 drawId) {
+ s32 pad;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EEF4C.s")
+ OPEN_DISPS(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF054.s")
+ func_8012C28C(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF0F0.s")
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF1F4.s")
+ func_8012C2DC(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF2AC.s")
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF364.s")
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, play->state.frames * 0, 16,
+ 32, 1, play->state.frames, -(play->state.frames * 6), 16, 32));
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF4D4.s")
+ Matrix_Push();
+ Matrix_ReplaceRotation(&play->billboardMtxF);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF65C.s")
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[3]);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[2]);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF780.s")
+ Matrix_Pop();
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF89C.s")
+ CLOSE_DISPS(play->state.gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EF984.s")
+void GetItem_DrawFairyBottle(PlayState* play, s16 drawId) {
+ s32 pad;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EFAB8.s")
+ OPEN_DISPS(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EFBFC.s")
+ func_8012C28C(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_draw/func_800EFD44.s")
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, play->state.frames * 0, 32,
+ 32, 1, play->state.frames, -(play->state.frames * 6), 32, 32));
+
+ Matrix_Push();
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[2]);
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawSkullToken(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+
+ func_8012C2DC(play->state.gfxCtx);
+
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, -(play->state.frames * 5),
+ 32, 32, 1, play->state.frames * 0, play->state.frames * 0, 32, 64));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawCompass(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+
+ POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 5);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawPotion(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C28C(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, -play->state.frames, play->state.frames, 32, 32, 1,
+ -play->state.frames, play->state.frames, 32, 32));
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[2]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[3]);
+
+ 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++, sDrawItemTable[drawId].drawResources[4]);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[5]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawGoronSword(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C28C(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 1, play->state.frames * 0, 32,
+ 32, 1, play->state.frames * 0, play->state.frames * 0, 32, 32));
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawDekuNuts(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C28C(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 6, play->state.frames * 6, 32,
+ 32, 1, play->state.frames * 6, play->state.frames * 6, 32, 32));
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawRecoveryHeart(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, -(play->state.frames * 3),
+ 32, 32, 1, play->state.frames * 0, -(play->state.frames * 2), 32, 32));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawFish(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, play->state.frames * 1, 32,
+ 32, 1, play->state.frames * 0, play->state.frames * 1, 32, 32));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+/**
+ * Draw `drawResources[0]` as Opa
+ */
+void GetItem_DrawOpa0(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+/**
+ * Draw `drawResources[0]` as Opa and `drawResources[1]` as Xlu
+ */
+void GetItem_DrawOpa0Xlu1(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+/**
+ * Draw `drawResources[0]` and `drawResources[1]` as Opa
+ */
+void GetItem_DrawOpa01(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+/**
+ * Draw `drawResources[0]` and `drawResources[1]` as Xlu
+ */
+void GetItem_DrawXlu01(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawSeahorse(PlayState* play, s16 drawId) {
+ s32 pad;
+ MtxF mtx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+
+ Matrix_MtxToMtxF(Lib_SegmentedToVirtual(sDrawItemTable[drawId].drawResources[3]), &mtx);
+ Matrix_Mult(&mtx, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[2]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawFairyContainer(PlayState* play, s16 drawId) {
+ s32 pad;
+ MtxF mtx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C28C(play->state.gfxCtx);
+ func_8012C2DC(play->state.gfxCtx);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiFairyBottleTexAnim));
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
+
+ Matrix_MtxToMtxF(Lib_SegmentedToVirtual(sDrawItemTable[drawId].drawResources[3]), &mtx);
+ Matrix_Mult(&mtx, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[2]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawMoonsTear(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C28C(play->state.gfxCtx);
+ func_8012C2DC(play->state.gfxCtx);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiMoonsTearTexAnim));
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawMagicArrow(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[0]);
+
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[2]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawUpgrades(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[2]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[3]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawRupee(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ 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++, sDrawItemTable[drawId].drawResources[3]);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[2]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawSmallRupee(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Scale(0.7f, 0.7f, 0.7f, MTXMODE_APPLY);
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ 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++, sDrawItemTable[drawId].drawResources[3]);
+ gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[2]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawWallet(PlayState* play, s16 drawId) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ 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++, sDrawItemTable[drawId].drawResources[1]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[2]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[3]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[4]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[5]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[6]);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[7]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void GetItem_DrawRemains(PlayState* play, s16 drawId) {
+ s32 pad;
+ s8 objectIndex;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ objectIndex = Object_GetIndex(&play->objectCtx, OBJECT_BSMASK);
+
+ gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment);
+
+ func_8012C28C(play->state.gfxCtx);
+ Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
+
+ POLY_OPA_DISP = func_801660B8(play, POLY_OPA_DISP);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 10c33090c..0637f6392 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_gi_hearts/object_gi_hearts.h"
+#include "overlays/actors/ovl_En_Elforg/z_en_elforg.h"
#define FLAGS 0x00000000
@@ -78,14 +79,14 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
if (this->actor.params == ITEM00_HEART_PIECE) {
sp30 = 0;
this->collectibleFlag = 0;
- this->actor.params = ITEM00_HEART;
+ this->actor.params = ITEM00_RECOVERY_HEART;
} else {
Actor_MarkForDeath(&this->actor);
return;
}
}
if (this->actor.params == ITEM00_3_HEARTS) {
- this->actor.params = ITEM00_HEART;
+ this->actor.params = ITEM00_RECOVERY_HEART;
}
Actor_ProcessInitChain(&this->actor, sInitChain);
@@ -117,7 +118,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
sp30 = -1;
}
break;
- case ITEM00_HEART:
+ case ITEM00_RECOVERY_HEART:
this->actor.home.rot.z = randPlusMinusPoint5Scaled(65535.0f);
shadowOffset = 430.0f;
Actor_SetScale(&this->actor, 0.02f);
@@ -183,7 +184,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, shadowOffset, ActorShadow_DrawCircle, shadowScale);
this->actor.shape.shadowAlpha = 180;
this->actor.focus.pos = this->actor.world.pos;
- this->unk14A = GI_NONE;
+ this->getItemId = GI_NONE;
if (sp30 < 0) {
this->actionFunc = EnItem00_WaitForHeartObject;
@@ -219,8 +220,8 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
case ITEM00_RUPEE_HUGE:
Item_Give(play, ITEM_RUPEE_HUGE);
break;
- case ITEM00_HEART:
- Item_Give(play, ITEM_HEART);
+ case ITEM00_RECOVERY_HEART:
+ Item_Give(play, ITEM_RECOVERY_HEART);
break;
case ITEM00_FLEXIBLE:
case ITEM00_BIG_FAIRY:
@@ -286,7 +287,8 @@ void EnItem00_WaitForHeartObject(EnItem00* this, PlayState* play) {
}
void func_800A640C(EnItem00* this, PlayState* play) {
- if ((this->actor.params <= ITEM00_RUPEE_RED) || ((this->actor.params == ITEM00_HEART) && (this->unk152 < 0)) ||
+ if ((this->actor.params <= ITEM00_RUPEE_RED) ||
+ ((this->actor.params == ITEM00_RECOVERY_HEART) && (this->unk152 < 0)) ||
(this->actor.params == ITEM00_HEART_PIECE) || (this->actor.params == ITEM00_HEART_CONTAINER)) {
this->actor.shape.rot.y = this->actor.shape.rot.y + 960;
} else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_NUTS_10) &&
@@ -366,7 +368,7 @@ void func_800A6780(EnItem00* this, PlayState* play) {
this->unk152++;
- if (this->actor.params == ITEM00_HEART) {
+ if (this->actor.params == ITEM00_RECOVERY_HEART) {
if (this->actor.velocity.y < 0.0f) {
this->actor.speedXZ = 0.0f;
this->actor.gravity = -0.4f;
@@ -416,12 +418,12 @@ void func_800A6780(EnItem00* this, PlayState* play) {
void func_800A6A40(EnItem00* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->unk14A != GI_NONE) {
+ if (this->getItemId != GI_NONE) {
if (Actor_HasParent(&this->actor, play) == 0) {
- Actor_PickUp(&this->actor, play, this->unk14A, 50.0f, 80.0f);
+ Actor_PickUp(&this->actor, play, this->getItemId, 50.0f, 80.0f);
this->unk152++;
} else {
- this->unk14A = GI_NONE;
+ this->getItemId = GI_NONE;
}
}
@@ -434,7 +436,7 @@ void func_800A6A40(EnItem00* this, PlayState* play) {
if (this->actor.params <= ITEM00_RUPEE_RED) {
this->actor.shape.rot.y = this->actor.shape.rot.y + 960;
- } else if (this->actor.params == ITEM00_HEART) {
+ } else if (this->actor.params == ITEM00_RECOVERY_HEART) {
this->actor.shape.rot.y = 0;
}
@@ -532,8 +534,8 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
case ITEM00_NUTS_10:
getItemId = GI_NUTS_10;
break;
- case ITEM00_HEART:
- Item_Give(play, ITEM_HEART);
+ case ITEM00_RECOVERY_HEART:
+ Item_Give(play, ITEM_RECOVERY_HEART);
break;
case ITEM00_FLEXIBLE:
case ITEM00_BIG_FAIRY:
@@ -628,7 +630,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, this->unk154);
- this->unk14A = GI_NONE;
+ this->getItemId = GI_NONE;
this->actionFunc = func_800A6A40;
}
@@ -656,7 +658,7 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
case ITEM00_HEART_CONTAINER:
EnItem00_DrawHeartContainer(this, play);
break;
- case ITEM00_HEART:
+ case ITEM00_RECOVERY_HEART:
if (this->unk152 < 0) {
if (this->unk152 == -1) {
s8 bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEART);
@@ -667,7 +669,7 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) {
}
} else {
Matrix_Scale(16.0f, 16.0f, 16.0f, MTXMODE_APPLY);
- GetItem_Draw(play, 8);
+ GetItem_Draw(play, GID_RECOVERY_HEART);
}
break;
}
@@ -792,8 +794,8 @@ void EnItem00_DrawHeartContainer(EnItem00* actor, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPDisplayList(POLY_XLU_DISP++, object_gi_hearts_DL_001290);
- gSPDisplayList(POLY_XLU_DISP++, object_gi_hearts_DL_001470);
+ gSPDisplayList(POLY_XLU_DISP++, gGiHeartBorderDL);
+ gSPDisplayList(POLY_XLU_DISP++, gGiHeartContainerDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -825,7 +827,7 @@ s16 func_800A7650(s16 dropId) {
return ITEM00_NO_DROP;
}
- if (dropId == ITEM00_HEART) {
+ if (dropId == ITEM00_RECOVERY_HEART) {
if (((void)0, gSaveContext.save.playerData.healthCapacity) == ((void)0, gSaveContext.save.playerData.health)) {
return ITEM00_RUPEE_GREEN;
}
@@ -850,7 +852,7 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) {
if (paramFF == ITEM00_3_HEARTS) {
for (i = 0; i < 3; i++) {
- spawnedActor = Item_DropCollectible(play, spawnPos, param7F00 | ITEM00_HEART | param8000);
+ spawnedActor = Item_DropCollectible(play, spawnPos, param7F00 | ITEM00_RECOVERY_HEART | param8000);
}
} else if (paramFF == ITEM00_MUSHROOM_CLOUD) {
param7F00 >>= 8;
@@ -867,8 +869,9 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) {
SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
}
} else {
- spawnedActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f,
- spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
+ spawnedActor =
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0,
+ 0, STRAY_FAIRY_PARAMS(((param7F00 >> 8) & 0x7F), 0, STRAY_FAIRY_TYPE_COLLECTIBLE));
if (param20000 == 0) {
if (!Flags_GetCollectible(play, (param7F00 >> 8) & 0x7F)) {
SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
@@ -924,8 +927,9 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
spawnedActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102);
} else {
- spawnedActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f,
- spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
+ spawnedActor =
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0,
+ 0, STRAY_FAIRY_PARAMS(((param7F00 >> 8) & 0x7F), 0, STRAY_FAIRY_TYPE_COLLECTIBLE));
}
if (Flags_GetCollectible(play, (param7F00 >> 8) & 0x7F) == 0) {
SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
@@ -955,61 +959,61 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
}
u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = {
- ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A,
- ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_HEART,
- ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_HEART, ITEM00_HEART,
- ITEM00_HEART, ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE,
- ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP,
- ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, ITEM00_MASK,
- ITEM00_MASK, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART,
- ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART,
- ITEM00_HEART, ITEM00_FLEXIBLE, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART,
- ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART,
- ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART,
- ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN,
- ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_RUPEE_BLUE,
- ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE,
- ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED,
- ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED,
- ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10,
- ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10,
- ITEM00_ARROWS_30, ITEM00_ARROWS_30, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE,
- ITEM00_MAGIC_LARGE, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_BOMBS_A,
- ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A,
- ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE,
- ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NUTS_1, ITEM00_NUTS_1,
- ITEM00_NO_DROP, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_STICK,
- ITEM00_STICK, ITEM00_NO_DROP, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE,
- ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP,
- ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_30, ITEM00_BOMBS_A, ITEM00_NO_DROP,
- ITEM00_STICK, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_HEART, ITEM00_HEART,
- ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_HEART, ITEM00_HEART, ITEM00_MAGIC_SMALL,
- ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A,
+ ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE,
+ ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP,
+ ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_MASK,
+ ITEM00_MASK, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
+ ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN,
+ ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE,
+ ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED,
+ ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10,
+ ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10,
+ ITEM00_ARROWS_30, ITEM00_ARROWS_30, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE,
+ ITEM00_MAGIC_LARGE, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A,
+ ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
+ ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
+ ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL,
+ ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE,
+ ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NUTS_1, ITEM00_NUTS_1,
+ ITEM00_NO_DROP, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_STICK,
+ ITEM00_STICK, ITEM00_NO_DROP, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_FLEXIBLE,
+ ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP,
+ ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_30, ITEM00_BOMBS_A, ITEM00_NO_DROP,
+ ITEM00_STICK, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART,
+ ITEM00_FLEXIBLE, ITEM00_RUPEE_GREEN, ITEM00_RECOVERY_HEART, ITEM00_RECOVERY_HEART, ITEM00_MAGIC_SMALL,
+ ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_NO_DROP, ITEM00_NO_DROP,
};
u8 sDropTableAmounts[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = {
@@ -1050,7 +1054,7 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
dropId = ITEM00_ARROWS_10;
break;
case PLAYER_FORM_ZORA:
- dropId = ITEM00_HEART;
+ dropId = ITEM00_RECOVERY_HEART;
break;
case PLAYER_FORM_GORON:
dropId = ITEM00_MAGIC_SMALL;
@@ -1071,7 +1075,7 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
dropQuantity = 1;
} else if (fromActor->dropFlag & 2) {
params = 0x10;
- dropId = ITEM00_HEART;
+ dropId = ITEM00_RECOVERY_HEART;
dropQuantity = 1;
} else if (fromActor->dropFlag & 0x20) {
dropId = ITEM00_RUPEE_PURPLE;
@@ -1090,11 +1094,11 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
if (gSaveContext.save.playerData.health <= 0x30) {
params = 0x10;
- dropId = ITEM00_HEART;
+ dropId = ITEM00_RECOVERY_HEART;
dropQuantity = 3;
} else if (gSaveContext.save.playerData.health <= 0x50) {
params = 0x10;
- dropId = ITEM00_HEART;
+ dropId = ITEM00_RECOVERY_HEART;
dropQuantity = 1;
} else if ((gSaveContext.save.playerData.magicLevel != 0) && (gSaveContext.save.playerData.magic == 0)) {
params = 0xD0;
@@ -1156,13 +1160,13 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
}
s32 D_801AE194[32] = {
- ITEM00_NO_DROP, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_RUPEE_RED,
- ITEM00_RUPEE_PURPLE, ITEM00_NO_DROP, ITEM00_RUPEE_HUGE, ITEM00_COMPASS, ITEM00_MUSHROOM_CLOUD,
- ITEM00_HEART, ITEM00_3_HEARTS, ITEM00_HEART_PIECE, ITEM00_HEART_CONTAINER, ITEM00_MAGIC_SMALL,
- ITEM00_MAGIC_LARGE, ITEM00_FLEXIBLE, ITEM00_BIG_FAIRY, ITEM00_NO_DROP, ITEM00_NUTS_10,
- ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_STICK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
- ITEM00_ARROWS_10, ITEM00_ARROWS_30,
+ ITEM00_NO_DROP, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_RUPEE_RED,
+ ITEM00_RUPEE_PURPLE, ITEM00_NO_DROP, ITEM00_RUPEE_HUGE, ITEM00_COMPASS, ITEM00_MUSHROOM_CLOUD,
+ ITEM00_RECOVERY_HEART, ITEM00_3_HEARTS, ITEM00_HEART_PIECE, ITEM00_HEART_CONTAINER, ITEM00_MAGIC_SMALL,
+ ITEM00_MAGIC_LARGE, ITEM00_FLEXIBLE, ITEM00_BIG_FAIRY, ITEM00_NO_DROP, ITEM00_NUTS_10,
+ ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_STICK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
+ ITEM00_ARROWS_10, ITEM00_ARROWS_30,
};
s32 func_800A8150(s32 index) {
diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c
index e1fb63fa1..f77fc5158 100644
--- a/src/code/z_fireobj.c
+++ b/src/code/z_fireobj.c
@@ -187,7 +187,7 @@ void FireObj_UpdateLight(PlayState* play, FireObjLight* light, FireObj* fire) {
if (fire->state == FIRE_STATE_3) {
Lights_PointSetColorAndRadius(&light->lightInfo, 0, 0, 0, -1);
} else {
- radius = ((fire->yScale * 140.0f * fire->sizeInv) + 60.0f);
+ radius = (fire->yScale * 140.0f * fire->sizeInv) + 60.0f;
Lights_PointGlowSetInfo(&light->lightInfo, fire->position.x, (fire->position.y + (fire->yScale * 6500.0f)),
fire->position.z,
diff --git a/src/code/z_game_dlftbls.c b/src/code/z_game_dlftbls.c
index 26a17a84a..2df62a054 100644
--- a/src/code/z_game_dlftbls.c
+++ b/src/code/z_game_dlftbls.c
@@ -15,7 +15,7 @@
GameStateOverlay gGameStateOverlayTable[] = {
GAMESTATE_OVERLAY_INTERNAL(TitleSetup_Init, TitleSetup_Destroy, sizeof(GameState)),
- GAMESTATE_OVERLAY(select, Select_Init, Select_Destroy, sizeof(SelectContext)),
+ GAMESTATE_OVERLAY(select, MapSelect_Init, MapSelect_Destroy, sizeof(MapSelectState)),
GAMESTATE_OVERLAY(title, Title_Init, Title_Destroy, sizeof(TitleContext)),
GAMESTATE_OVERLAY_INTERNAL(Play_Init, Play_Fini, sizeof(PlayState)),
GAMESTATE_OVERLAY(opening, Opening_Init, Opening_Destroy, sizeof(OpeningContext)),
diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c
index c40154bc7..d7905e4dd 100644
--- a/src/code/z_kaleido_scope_call.c
+++ b/src/code/z_kaleido_scope_call.c
@@ -1,5 +1,6 @@
#include "prevent_bss_reordering.h"
#include "global.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
void (*sKaleidoScopeUpdateFunc)(PlayState* play);
void (*sKaleidoScopeDrawFunc)(PlayState* play);
@@ -33,7 +34,7 @@ void KaleidoScopeCall_Update(PlayState* play) {
PauseContext* pauseCtx = &play->pauseCtx;
KaleidoMgrOverlay* kaleidoScopeOvl = &gKaleidoMgrOverlayTable[KALEIDO_OVL_KALEIDO_SCOPE];
- if ((play->pauseCtx.state != 0) || (play->pauseCtx.debugState != 0)) {
+ if ((play->pauseCtx.state != 0) || (play->pauseCtx.debugEditor != DEBUG_EDITOR_NONE)) {
if (pauseCtx->state == 1 || pauseCtx->state == 19) {
if (ShrinkWindow_GetLetterboxMagnitude() == 0) {
R_PAUSE_MENU_MODE = 1;
@@ -62,7 +63,7 @@ void KaleidoScopeCall_Update(PlayState* play) {
if (gKaleidoMgrCurOvl == kaleidoScopeOvl) {
sKaleidoScopeUpdateFunc(play);
- if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0)) {
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
KaleidoManager_ClearOvl(kaleidoScopeOvl);
KaleidoScopeCall_LoadPlayer();
}
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index 342fd1bb0..625adf20f 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -1,8 +1,8 @@
#include "global.h"
#include "z64rumble.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
-s16 D_801BDB00[] = { PAUSE_1, PAUSE_2, PAUSE_3, PAUSE_0 };
+s16 D_801BDB00[] = { PAUSE_MAP, PAUSE_QUEST, PAUSE_MASK, PAUSE_ITEM };
f32 sKaleidoSetupEyeX[] = { -64.0f, 0.0f, 64.0f, 0.0f };
f32 sKaleidoSetupEyeZ[] = { 0.0f, -64.0f, 0.0f, 64.0f };
@@ -70,7 +70,8 @@ void KaleidoSetup_Update(PlayState* play) {
if (msgCtx && msgCtx) {}
}
- if ((pauseCtx->state == 0) && (pauseCtx->debugState == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE)) {
+ if ((pauseCtx->state == 0) && (pauseCtx->debugEditor == DEBUG_EDITOR_NONE) &&
+ (play->gameOverCtx.state == GAMEOVER_INACTIVE)) {
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))) {
@@ -108,7 +109,7 @@ void KaleidoSetup_Init(PlayState* play) {
bzero(pauseCtx, sizeof(PauseContext));
- pauseCtx->pageIndex = PAUSE_0;
+ pauseCtx->pageIndex = PAUSE_ITEM;
pauseCtx->unk_21C = 160.0f;
pauseCtx->unk_218 = 160.0f;
@@ -119,18 +120,18 @@ void KaleidoSetup_Init(PlayState* play) {
pauseCtx->unk_20C = 936.0f;
pauseCtx->unk_220 = -314.0f;
- pauseCtx->unk_238[PAUSE_1] = XREG(94) + 3;
+ pauseCtx->unk_238[PAUSE_MAP] = XREG(94) + 3;
pauseCtx->unk_258 = 11;
pauseCtx->unk_25A = 0;
- pauseCtx->cursorItem[PAUSE_0] = 999;
- pauseCtx->cursorItem[PAUSE_1] = XREG(94) + 3;
- pauseCtx->cursorItem[PAUSE_2] = 999;
- pauseCtx->cursorItem[PAUSE_3] = 999;
+ pauseCtx->cursorItem[PAUSE_ITEM] = 999;
+ pauseCtx->cursorItem[PAUSE_MAP] = XREG(94) + 3;
+ pauseCtx->cursorItem[PAUSE_QUEST] = 999;
+ pauseCtx->cursorItem[PAUSE_MASK] = 999;
- pauseCtx->unk_268[PAUSE_0] = 0;
- pauseCtx->unk_268[PAUSE_1] = XREG(94) + 3;
+ pauseCtx->unk_268[PAUSE_ITEM] = 0;
+ pauseCtx->unk_268[PAUSE_MAP] = XREG(94) + 3;
pauseCtx->unk_284 = 2;
pauseCtx->unk_2A0 = -1;
diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c
index f33a949d8..d2a3a254c 100644
--- a/src/code/z_lifemeter.c
+++ b/src/code/z_lifemeter.c
@@ -1,5 +1,6 @@
#include "prevent_bss_reordering.h"
#include "global.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#include "interface/parameter_static/parameter_static.h"
s16 sHeartsPrimColors[3][3] = { { 255, 70, 50 }, { 255, 190, 0 }, { 100, 100, 255 } };
@@ -222,7 +223,7 @@ void LifeMeter_Draw(PlayState* play) {
f32 lifesize = interfaceCtx->lifeSizeChange * 0.1f;
u32 curCombineModeSet = 0;
TexturePtr temp = NULL;
- s32 ddCount = gSaveContext.save.inventory.dungeonKeys[9] - 1;
+ s32 ddCount = gSaveContext.save.inventory.defenseHearts - 1;
OPEN_DISPS(gfxCtx);
@@ -398,8 +399,8 @@ void LifeMeter_UpdateSizeAndBeep(PlayState* play) {
if (interfaceCtx->lifeSizeChange <= 0) {
interfaceCtx->lifeSizeChange = 0;
interfaceCtx->lifeSizeChangeDirection = 0;
- if (!Player_InCsMode(play) && (play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) &&
- LifeMeter_IsCritical() && !Play_InCsMode(play)) {
+ if (!Player_InCsMode(play) && (play->pauseCtx.state == 0) &&
+ (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && LifeMeter_IsCritical() && !Play_InCsMode(play)) {
play_sound(NA_SE_SY_HITPOINT_ALARM);
}
}
diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c
index 9baff91f1..5135a3c41 100644
--- a/src/code/z_map_exp.c
+++ b/src/code/z_map_exp.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
s16 sMinimapInitPosX = 0;
s16 sMinimapInitPosZ = 0;
@@ -238,7 +239,7 @@ void Map_Update(PlayState* play) {
func_80105B34(play);
- if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0)) {
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
if (Map_IsInDungeonArea(play)) {
floor = func_80109124(player->actor.world.pos.y);
if (floor != -1) {
diff --git a/src/code/z_message.c b/src/code/z_message.c
index 1e76578bb..14fe241c4 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "message_data_static.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#if 0
@@ -229,7 +230,7 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3)
s32 k = *offset;
f32 f = *arg3;
- Font_LoadChar(play, 0x838B, k); // 0x838b = ル in JISX0213
+ Font_LoadChar(play, 0x838B, k); // 0x838B = ル in JISX0213
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x838B;
t += 1;
@@ -279,7 +280,7 @@ void func_8014D62C(PlayState* play, s32* arg1, f32* arg2, s16* arg3) {
if ((func_8010A0A4(play) != 0) || (play->sceneNum == 0x4F)) {
phi_v0 = 0xA;
} else {
- phi_v0 = play->pauseCtx.unk_238[4];
+ phi_v0 = play->pauseCtx.unk_238[PAUSE_WORLD_MAP];
}
temp_s6 = *(&D_801D0250 + (phi_v0 * 2));
phi_s0 = 0;
diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c
index 491427cef..9231ca9b9 100644
--- a/src/code/z_message_nes.c
+++ b/src/code/z_message_nes.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "message_data_static.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#if 0
@@ -256,7 +257,7 @@ void Message_LoadAreaTextNES(PlayState* play, s32* offset, f32* arg2, s16* decod
if ((func_8010A0A4(play) != 0) || (play->sceneNum == SCENE_SECOM)) {
currentArea = 10;
} else {
- currentArea = play->pauseCtx.unk_238[4];
+ currentArea = play->pauseCtx.unk_238[PAUSE_WORLD_MAP];
}
stringLimit = D_801D07C4[currentArea];
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index a76cb36e0..b63af9038 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -2,7 +2,7 @@
#include "interface/parameter_static/parameter_static.h"
#include "interface/do_action_static/do_action_static.h"
#include "misc/story_static/story_static.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
typedef struct {
/* 0x00 */ u8 scene;
@@ -330,9 +330,9 @@ u8 Item_Give(PlayState* play, u8 item) {
return ITEM_NONE;
} else if ((item == ITEM_HEART_PIECE_2) || (item == ITEM_HEART_PIECE)) {
- gSaveContext.save.inventory.questItems += (1 << QUEST_HEART_PIECE_COUNT);
- if ((gSaveContext.save.inventory.questItems & 0xF0000000) == (4 << QUEST_HEART_PIECE_COUNT)) {
- gSaveContext.save.inventory.questItems ^= (4 << QUEST_HEART_PIECE_COUNT);
+ INCREMENT_QUEST_HEART_PIECE_COUNT;
+ if (EQ_MAX_QUEST_HEART_PIECE_COUNT) {
+ RESET_HEART_PIECE_COUNT;
gSaveContext.save.playerData.healthCapacity += 0x10;
gSaveContext.save.playerData.health += 0x10;
}
@@ -595,7 +595,7 @@ u8 Item_Give(PlayState* play, u8 item) {
SET_QUEST_ITEM(item - ITEM_REMAINS_ODOLWA + QUEST_REMAINS_ODOWLA);
return ITEM_NONE;
- } else if (item == ITEM_HEART) {
+ } else if (item == ITEM_RECOVERY_HEART) {
Health_ChangeBy(play, 0x10);
return item;
@@ -655,7 +655,7 @@ u8 Item_Give(PlayState* play, u8 item) {
} else if (((item >= ITEM_POTION_RED) && (item <= ITEM_OBABA_DRINK)) || (item == ITEM_CHATEAU_2) ||
(item == ITEM_MILK) || (item == ITEM_GOLD_DUST_2) || (item == ITEM_HYLIAN_LOACH_2) ||
- (item == ITEM_SEA_HORSE_CAUGHT)) {
+ (item == ITEM_SEAHORSE_CAUGHT)) {
slot = SLOT(item);
if ((item != ITEM_MILK_BOTTLE) && (item != ITEM_MILK_HALF)) {
@@ -671,8 +671,8 @@ u8 Item_Give(PlayState* play, u8 item) {
} else if (item == ITEM_HYLIAN_LOACH_2) {
item = ITEM_HYLIAN_LOACH;
- } else if (item == ITEM_SEA_HORSE_CAUGHT) {
- item = ITEM_SEA_HORSE;
+ } else if (item == ITEM_SEAHORSE_CAUGHT) {
+ item = ITEM_SEAHORSE;
}
slot = SLOT(item);
@@ -712,7 +712,7 @@ u8 Item_Give(PlayState* play, u8 item) {
} else if ((item >= ITEM_MOON_TEAR) && (item <= ITEM_MASK_GIANT)) {
temp = INV_CONTENT(item);
INV_CONTENT(item) = item;
- if ((item >= ITEM_MOON_TEAR) && (item <= ITEM_PENDANT_MEMORIES) && (temp != ITEM_NONE)) {
+ if ((item >= ITEM_MOON_TEAR) && (item <= ITEM_PENDANT_OF_MEMORIES) && (temp != ITEM_NONE)) {
for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
if (temp == GET_CUR_FORM_BTN_ITEM(i)) {
SET_CUR_FORM_BTN_ITEM(i, item);
@@ -816,8 +816,8 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
} else if (item == ITEM_HEART_CONTAINER) {
return ITEM_NONE;
- } else if (item == ITEM_HEART) {
- return ITEM_HEART;
+ } else if (item == ITEM_RECOVERY_HEART) {
+ return ITEM_RECOVERY_HEART;
} else if ((item == ITEM_MAGIC_SMALL) || (item == ITEM_MAGIC_LARGE)) {
if (!(gSaveContext.save.weekEventReg[12] & 0x80)) {
@@ -843,7 +843,7 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
} else if (((item >= ITEM_POTION_RED) && (item <= ITEM_OBABA_DRINK)) || (item == ITEM_CHATEAU_2) ||
(item == ITEM_MILK) || (item == ITEM_GOLD_DUST_2) || (item == ITEM_HYLIAN_LOACH_2) ||
- (item == ITEM_SEA_HORSE_CAUGHT)) {
+ (item == ITEM_SEAHORSE_CAUGHT)) {
bottleSlot = SLOT(item);
if ((item != ITEM_MILK_BOTTLE) && (item != ITEM_MILK_HALF)) {
@@ -859,8 +859,8 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
} else if (item == ITEM_HYLIAN_LOACH_2) {
item = ITEM_HYLIAN_LOACH;
- } else if (item == ITEM_SEA_HORSE_CAUGHT) {
- item = ITEM_SEA_HORSE;
+ } else if (item == ITEM_SEAHORSE_CAUGHT) {
+ item = ITEM_SEAHORSE;
}
bottleSlot = SLOT(item);
@@ -989,7 +989,7 @@ void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 btn) {
Interface_LoadItemIconImpl(play, btn);
- play->pauseCtx.cursorItem[PAUSE_0] = item;
+ play->pauseCtx.cursorItem[PAUSE_ITEM] = item;
gSaveContext.buttonStatus[btn] = BTN_ENABLED;
if (item == ITEM_HOT_SPRING_WATER) {
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 49ed31bf4..6d90048f5 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -108,9 +108,17 @@ s32 Play_InCsMode(PlayState* this) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80169BF8.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/Play_GetCsCamDataSetting.s")
+u16 Play_GetActorCsCamSetting(PlayState* this, s32 csCamDataIndex) {
+ ActorCsCamInfo* actorCsCamList = &this->actorCsCamList[csCamDataIndex];
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/Play_GetCsCamDataVec3s.s")
+ return actorCsCamList->setting;
+}
+
+Vec3s* Play_GetActorCsCamFuncData(PlayState* this, s32 csCamDataIndex) {
+ ActorCsCamInfo* actorCsCamList = &this->actorCsCamList[csCamDataIndex];
+
+ return Lib_SegmentedToVirtual(actorCsCamList->actorCsCamFuncData);
+}
/**
* Converts the number of a scene to its "original" equivalent, the default version of the area which the player first
diff --git a/src/code/z_room.c b/src/code/z_room.c
index 3507765a5..169d6d5b5 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -58,7 +58,7 @@ void Room_DrawType1Mesh(PlayState* play, Room* room, u32 flags) {
} else if (mesh->format == 2) {
func_8012E32C(play, room, flags);
} else {
- __assert("../z_room.c", 0x3c5);
+ __assert("../z_room.c", 965);
}
}
@@ -85,9 +85,8 @@ s32 Room_StartRoomTransition(PlayState* play, RoomContext* roomCtx, s32 index) {
roomCtx->unk31 = 1;
size = play->roomList[index].vromEnd - play->roomList[index].vromStart;
- roomCtx->activeRoomVram =
- (void*)(((s32)roomCtx->roomMemPages[roomCtx->activeMemPage] - (size + 8) * roomCtx->activeMemPage + 8) &
- 0xfffffff0);
+ roomCtx->activeRoomVram = (void*)(ALIGN16((u32)roomCtx->roomMemPages[roomCtx->activeMemPage] -
+ (size + 8) * roomCtx->activeMemPage - 7));
osCreateMesgQueue(&roomCtx->loadQueue, roomCtx->loadMsg, 1);
DmaMgr_SendRequestImpl(&roomCtx->dmaRequest, roomCtx->activeRoomVram, play->roomList[index].vromStart, size, 0,
@@ -114,7 +113,7 @@ s32 Room_HandleLoadCallbacks(PlayState* play, RoomContext* roomCtx) {
if (((play->sceneNum != SCENE_IKANA) || (roomCtx->currRoom.num != 1)) &&
(play->sceneNum != SCENE_IKNINSIDE)) {
- play->envCtx.lightSettingOverride = 0xff;
+ play->envCtx.lightSettingOverride = 0xFF;
play->envCtx.unk_E0 = 0;
}
func_800FEAB0();
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index b4ba212d5..cf40d6049 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -173,9 +173,9 @@ void Scene_HeaderCmdActorList(PlayState* play, SceneCmd* cmd) {
play->actorCtx.unkC = 0;
}
-// SceneTableEntry Header Command 0x02: List of cameras for actor cutscenes
+// SceneTableEntry Header Command 0x02: List of camera data for actor cutscenes
void Scene_HeaderCmdActorCutsceneCamList(PlayState* play, SceneCmd* cmd) {
- play->csCamData = Lib_SegmentedToVirtual(cmd->csCameraList.segment);
+ play->actorCsCamList = Lib_SegmentedToVirtual(cmd->actorCsCamList.segment);
}
// SceneTableEntry Header Command 0x03: Collision Header
@@ -192,8 +192,8 @@ void Scene_HeaderCmdColHeader(PlayState* play, SceneCmd* cmd) {
colHeader->surfaceTypeList = Lib_SegmentedToVirtual(colHeader->surfaceTypeList);
}
- if (colHeader->cameraDataList != NULL) {
- colHeader->cameraDataList = Lib_SegmentedToVirtual(colHeader->cameraDataList);
+ if (colHeader->bgCamList != NULL) {
+ colHeader->bgCamList = Lib_SegmentedToVirtual(colHeader->bgCamList);
}
if (colHeader->waterBoxes != NULL) {
@@ -237,9 +237,9 @@ void Scene_HeaderCmdRoomBehavior(PlayState* play, SceneCmd* cmd) {
play->roomCtx.currRoom.unk3 = cmd->roomBehavior.gpFlag1;
play->roomCtx.currRoom.unk2 = cmd->roomBehavior.gpFlag2 & 0xFF;
play->roomCtx.currRoom.unk5 = (cmd->roomBehavior.gpFlag2 >> 8) & 1;
- play->msgCtx.unk12044 = (cmd->roomBehavior.gpFlag2 >> 0xa) & 1;
- play->roomCtx.currRoom.enablePosLights = (cmd->roomBehavior.gpFlag2 >> 0xb) & 1;
- play->envCtx.unk_E2 = (cmd->roomBehavior.gpFlag2 >> 0xc) & 1;
+ play->msgCtx.unk12044 = (cmd->roomBehavior.gpFlag2 >> 0xA) & 1;
+ play->roomCtx.currRoom.enablePosLights = (cmd->roomBehavior.gpFlag2 >> 0xB) & 1;
+ play->envCtx.unk_E2 = (cmd->roomBehavior.gpFlag2 >> 0xC) & 1;
}
// SceneTableEntry Header Command 0x0A: Mesh Header
@@ -376,7 +376,7 @@ void Scene_HeaderCmdSkyboxDisables(PlayState* play, SceneCmd* cmd) {
// SceneTableEntry Header Command 0x10: Time Settings
void Scene_HeaderCmdTimeSettings(PlayState* play, SceneCmd* cmd) {
if (cmd->timeSettings.hour != 0xFF && cmd->timeSettings.min != 0xFF) {
- gSaveContext.environmentTime = gSaveContext.save.time =
+ gSaveContext.skyboxTime = gSaveContext.save.time =
(u16)(((cmd->timeSettings.hour + (cmd->timeSettings.min / 60.0f)) * 60.0f) / 0.021972656f);
}
@@ -398,20 +398,17 @@ void Scene_HeaderCmdTimeSettings(PlayState* play, SceneCmd* cmd) {
play->envCtx.unk_8 = (Math_CosS(((void)0, gSaveContext.save.time) - 0x8000) * 120.0f) * 25.0f;
play->envCtx.unk_C = (Math_CosS(((void)0, gSaveContext.save.time) - 0x8000) * 20.0f) * 25.0f;
- if (play->envCtx.timeIncrement == 0 && gSaveContext.save.cutscene < 0xFFF0) {
- gSaveContext.environmentTime = gSaveContext.save.time;
+ if ((play->envCtx.timeIncrement == 0) && (gSaveContext.save.cutscene < 0xFFF0)) {
+ gSaveContext.skyboxTime = gSaveContext.save.time;
- if (gSaveContext.environmentTime >= CLOCK_TIME(4, 0) && gSaveContext.environmentTime < CLOCK_TIME(6, 30)) {
- gSaveContext.environmentTime = CLOCK_TIME(5, 0);
- } else if (gSaveContext.environmentTime >= CLOCK_TIME(6, 30) &&
- gSaveContext.environmentTime < CLOCK_TIME(8, 0)) {
- gSaveContext.environmentTime = CLOCK_TIME(8, 0);
- } else if (gSaveContext.environmentTime >= CLOCK_TIME(16, 0) &&
- gSaveContext.environmentTime < CLOCK_TIME(17, 0)) {
- gSaveContext.environmentTime = CLOCK_TIME(17, 0);
- } else if (gSaveContext.environmentTime >= CLOCK_TIME(18, 0) &&
- gSaveContext.environmentTime < CLOCK_TIME(19, 0)) {
- gSaveContext.environmentTime = CLOCK_TIME(19, 0);
+ if ((gSaveContext.skyboxTime >= CLOCK_TIME(4, 0)) && (gSaveContext.skyboxTime < CLOCK_TIME(6, 30))) {
+ gSaveContext.skyboxTime = CLOCK_TIME(5, 0);
+ } else if ((gSaveContext.skyboxTime >= CLOCK_TIME(6, 30)) && (gSaveContext.skyboxTime < CLOCK_TIME(8, 0))) {
+ gSaveContext.skyboxTime = CLOCK_TIME(8, 0);
+ } else if ((gSaveContext.skyboxTime >= CLOCK_TIME(16, 0)) && (gSaveContext.skyboxTime < CLOCK_TIME(17, 0))) {
+ gSaveContext.skyboxTime = CLOCK_TIME(17, 0);
+ } else if ((gSaveContext.skyboxTime >= CLOCK_TIME(18, 0)) && (gSaveContext.skyboxTime < CLOCK_TIME(19, 0))) {
+ gSaveContext.skyboxTime = CLOCK_TIME(19, 0);
}
}
}
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index 69a0a4491..bb6308fb6 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -148,10 +148,31 @@ s32 D_801C6798[] = {
0x00000020, 0x00001470, 0x000028C0, 0x00003D10, 0x00005160, 0x000065B0,
};
-u8 D_801C67B0[24] = {
- ITEM_NONE, ITEM_BOW, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_BOMB, ITEM_BOMBCHU,
- ITEM_STICK, ITEM_NUT, ITEM_MAGIC_BEANS, ITEM_NONE, ITEM_POWDER_KEG, ITEM_PICTO_BOX, ITEM_NONE, ITEM_NONE,
- ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+u8 gAmmoItems[] = {
+ ITEM_NONE, // SLOT_OCARINA
+ ITEM_BOW, // SLOT_BOW
+ ITEM_NONE, // SLOT_ARROW_FIRE
+ ITEM_NONE, // SLOT_ARROW_ICE
+ ITEM_NONE, // SLOT_ARROW_LIGHT
+ ITEM_NONE, // SLOT_TRADE_DEED
+ ITEM_BOMB, // SLOT_BOMB
+ ITEM_BOMBCHU, // SLOT_BOMBCHU
+ ITEM_STICK, // SLOT_STICK
+ ITEM_NUT, // SLOT_NUT
+ ITEM_MAGIC_BEANS, // SLOT_MAGIC_BEANS
+ ITEM_NONE, // SLOT_TRADE_KEY_MAMA
+ ITEM_POWDER_KEG, // SLOT_POWDER_KEG
+ ITEM_PICTO_BOX, // SLOT_PICTO_BOX
+ ITEM_NONE, // SLOT_LENS
+ ITEM_NONE, // SLOT_HOOKSHOT
+ ITEM_NONE, // SLOT_SWORD_GREAT_FAIRY
+ ITEM_NONE, // SLOT_TRADE_COUPLE
+ ITEM_NONE, // SLOT_BOTTLE_1
+ ITEM_NONE, // SLOT_BOTTLE_2
+ ITEM_NONE, // SLOT_BOTTLE_3
+ ITEM_NONE, // SLOT_BOTTLE_4
+ ITEM_NONE, // SLOT_BOTTLE_5
+ ITEM_NONE, // SLOT_BOTTLE_6
};
s32 D_801C67C8[] = { 0, 0x40, 0x80, 0xC0, 0x100, 0x180, 0x200, 0x280 };
@@ -199,8 +220,8 @@ void Sram_ClearHighscores(void) {
gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF) | 0x130000;
gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF0000) | 0xA;
gSaveContext.save.horseBackBalloonHighScore = 6000; // 60 seconds
- gSaveContext.save.unk_EF4 = (gSaveContext.save.unk_EF4 & 0xFFFF0000) | 0x27;
- gSaveContext.save.unk_EF4 = (gSaveContext.save.unk_EF4 & 0xFFFF) | 0xA0000;
+ SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(39);
+ SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(10);
gSaveContext.save.dekuPlaygroundHighScores[0] = 7500; // 75 seconds
gSaveContext.save.dekuPlaygroundHighScores[1] = 7500; // 75 seconds
@@ -330,8 +351,8 @@ void Sram_SaveEndOfCycle(PlayState* play) {
}
}
- for (i = 0; i < ARRAY_COUNT(D_801C67B0); i++) {
- if (D_801C67B0[i] != ITEM_NONE) {
+ for (i = 0; i < ARRAY_COUNT(gAmmoItems); i++) {
+ if (gAmmoItems[i] != ITEM_NONE) {
if ((gSaveContext.save.inventory.items[i] != ITEM_NONE) && (i != SLOT_PICTO_BOX)) {
item = gSaveContext.save.inventory.items[i];
AMMO(item) = 0;
@@ -412,7 +433,7 @@ void Sram_SaveEndOfCycle(PlayState* play) {
Inventory_DeleteItem(ITEM_LONGSHOT, SLOT_TRADE_COUPLE);
for (j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++) {
- if (GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOON_TEAR && GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_MEMORIES) {
+ if (GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOON_TEAR && GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_OF_MEMORIES) {
SET_CUR_FORM_BTN_ITEM(j, ITEM_NONE);
Interface_LoadItemIconImpl(play, j);
}
@@ -433,8 +454,8 @@ void Sram_SaveEndOfCycle(PlayState* play) {
Sram_ClearHighscores();
for (i = 0; i < 8; i++) {
- gSaveContext.save.inventory.dungeonItems[i] &= (u8)~1;
- gSaveContext.save.inventory.dungeonKeys[i] = 0;
+ gSaveContext.save.inventory.dungeonItems[i] &= (u8)~1; // remove boss key
+ DUNGEON_KEY_COUNT(i) = 0;
gSaveContext.save.inventory.strayFairies[i] = 0;
}
@@ -624,7 +645,9 @@ Inventory sSaveDefaultInventory = {
// dungeonItems
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
// dungeonKeys
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0 },
+ { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+ // defenceHearts
+ 0,
// strayFairies
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
// dekuPlaygroundPlayerName
@@ -768,7 +791,9 @@ Inventory sSaveDebugInventory = {
// dungeonItems
{ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
// dungeonKeys
- { 8, 8, 8, 8, 8, 8, 8, 8, 8, 0 },
+ { 8, 8, 8, 8, 8, 8, 8, 8, 8 },
+ // defenceHearts
+ 0,
// strayFairies
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
// dekuPlaygroundPlayerName
@@ -808,8 +833,8 @@ void Sram_InitDebugSave(void) {
Lib_MemCpy(&gSaveContext.save.checksum, &sSaveDebugChecksum, sizeof(gSaveContext.save.checksum));
if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
- BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = D_801C6A48[((void)0, gSaveContext.save.playerForm & 0xFF)];
- C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = D_801C6A50[((void)0, gSaveContext.save.playerForm & 0xFF)];
+ BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = D_801C6A48[((void)0, gSaveContext.save.playerForm)];
+ C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = D_801C6A50[((void)0, gSaveContext.save.playerForm)];
}
gSaveContext.save.hasTatl = true;
@@ -887,13 +912,11 @@ void func_80144A94(SramContext* sramCtx) {
u16 D_801C6A58[] = { 0x68B0, 0x6A60, 0xB230, 0x9A80, 0xD890, 0x3E40, 0x8640, 0x84A0, 0x2040, 0xAA30 };
-#ifdef NON_MATCHING
-// Small regalloc between v0/t6/t7
void Sram_OpenSave(FileChooseContext* fileChooseCtx, SramContext* sramCtx) {
s32 i;
s32 pad;
s32 phi_t1;
- s32 pad1[2];
+ s32 pad1;
s32 fileNum;
if (gSaveContext.unk_3F3F) {
@@ -959,12 +982,11 @@ void Sram_OpenSave(FileChooseContext* fileChooseCtx, SramContext* sramCtx) {
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
}
} else {
- gSaveContext.save.entranceIndex = D_801C6A58[gSaveContext.save.owlSaveLocation];
- if (D_801C6A58[gSaveContext.save.owlSaveLocation] == 0x84A0 && (gSaveContext.save.weekEventReg[20] & 2)) {
+ gSaveContext.save.entranceIndex = D_801C6A58[(void)0, gSaveContext.save.owlSaveLocation];
+ if ((gSaveContext.save.entranceIndex == 0x84A0) && (gSaveContext.save.weekEventReg[20] & 2)) {
// Unconfirmed weekEventReg: "Woodfall Temple Prison Entrance raised / Water cleansed"
gSaveContext.save.entranceIndex = 0xCA0;
- } else if (D_801C6A58[gSaveContext.save.owlSaveLocation] == 0x9A80 &&
- (gSaveContext.save.weekEventReg[33] & 0x80)) {
+ } else if ((gSaveContext.save.entranceIndex == 0x9A80) && (gSaveContext.save.weekEventReg[33] & 0x80)) {
// Unconfirmed weekEventReg: "Mountain Village Unfrozen"
gSaveContext.save.entranceIndex = 0xAE80;
}
@@ -988,9 +1010,6 @@ void Sram_OpenSave(FileChooseContext* fileChooseCtx, SramContext* sramCtx) {
func_80147314(sramCtx, fileNum);
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_OpenSave.s")
-#endif
// Similar to func_80145698, but accounts for owl saves?
void func_8014546C(SramContext* sramCtx) {
@@ -1142,7 +1161,7 @@ void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
fileChooseCtx->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
fileChooseCtx->health[sp76] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24454[sp76] = gSaveContext.save.inventory.dungeonKeys[9];
+ 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;
@@ -1237,7 +1256,7 @@ void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
fileChooseCtx->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
fileChooseCtx->health[sp76] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24454[sp76] = gSaveContext.save.inventory.dungeonKeys[9];
+ 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;
@@ -1350,7 +1369,7 @@ void func_80146628(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
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.dungeonKeys[9];
+ 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;
@@ -1393,7 +1412,7 @@ void func_80146628(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
fileChooseCtx->healthCapacity[fileChooseCtx->fileNum] = gSaveContext.save.playerData.healthCapacity;
fileChooseCtx->health[fileChooseCtx->fileNum] = gSaveContext.save.playerData.health;
- fileChooseCtx->unk_24454[fileChooseCtx->fileNum] = gSaveContext.save.inventory.dungeonKeys[9];
+ 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;
@@ -1462,7 +1481,7 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
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.dungeonKeys[9];
+ 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;
diff --git a/src/libultra/gu/lookathil.c b/src/libultra/gu/lookathil.c
index 823ff0982..dcb05b3d9 100644
--- a/src/libultra/gu/lookathil.c
+++ b/src/libultra/gu/lookathil.c
@@ -1,6 +1,6 @@
#include "global.h"
-#define FTOFRAC8(x) ((s32)MIN(((x) * (128.0f)), 127.0f) & 0xff)
+#define FTOFRAC8(x) ((s32)MIN(((x) * (128.0f)), 127.0f) & 0xFF)
void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 zAt,
f32 xUp, f32 yUp, f32 zUp, f32 xl1, f32 yl1, f32 zl1, /* light 1 direction */
diff --git a/src/libultra/gu/rotate.c b/src/libultra/gu/rotate.c
index 11d00ff73..46dd605d4 100644
--- a/src/libultra/gu/rotate.c
+++ b/src/libultra/gu/rotate.c
@@ -1,7 +1,7 @@
#include "global.h"
void guRotateF(float m[4][4], float a, float x, float y, float z) {
- static float D_80097F90 = 0.017453292; // TODO this is PI / 180.0, we should define pi somewhere
+ static float D_80097F90 = M_PI / 180.0f;
float sine;
float cosine;
float ab;
diff --git a/src/libultra/io/contreaddata.c b/src/libultra/io/contreaddata.c
index b54d894f3..163756e07 100644
--- a/src/libultra/io/contreaddata.c
+++ b/src/libultra/io/contreaddata.c
@@ -28,7 +28,7 @@ void osContGetReadData(OSContPad* data) {
ptr = (u8*)__osContPifRam.ramarray;
for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContReadFormat), data++) {
readformat = *(__OSContReadFormat*)ptr;
- data->errno = (readformat.rxsize & 0xc0) >> 4;
+ data->errno = (readformat.rxsize & 0xC0) >> 4;
if (data->errno == 0) {
data->button = readformat.button;
data->stick_x = readformat.stick_x;
diff --git a/src/libultra/io/controller.c b/src/libultra/io/controller.c
index bd8270993..245183280 100644
--- a/src/libultra/io/controller.c
+++ b/src/libultra/io/controller.c
@@ -58,7 +58,7 @@ void __osContGetInitData(u8* pattern, OSContStatus* data) {
ptr = (u8*)__osContPifRam.ramarray;
for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestHeader), data++) {
requestHeader = *(__OSContRequestHeader*)ptr;
- data->errno = (requestHeader.rxsize & 0xc0) >> 4;
+ data->errno = (requestHeader.rxsize & 0xC0) >> 4;
if (data->errno == 0) {
data->type = requestHeader.typel << 8 | requestHeader.typeh;
data->status = requestHeader.status;
diff --git a/src/libultra/io/epirawdma.c b/src/libultra/io/epirawdma.c
index cbe43ce82..fd7573151 100644
--- a/src/libultra/io/epirawdma.c
+++ b/src/libultra/io/epirawdma.c
@@ -53,7 +53,7 @@ s32 __osEPiRawStartDma(OSPiHandle* handle, s32 direction, u32 cartAddr, void* dr
}
HW_REG(PI_DRAM_ADDR_REG, void*) = (void*)osVirtualToPhysical(dramAddr);
- HW_REG(PI_CART_ADDR_REG, void*) = (void*)((handle->baseAddress | cartAddr) & 0x1fffffff);
+ HW_REG(PI_CART_ADDR_REG, void*) = (void*)((handle->baseAddress | cartAddr) & 0x1FFFFFFF);
switch (direction) {
case OS_READ:
diff --git a/src/libultra/io/visetxscale.c b/src/libultra/io/visetxscale.c
index e6a9ec6bb..0e2cf762d 100644
--- a/src/libultra/io/visetxscale.c
+++ b/src/libultra/io/visetxscale.c
@@ -10,7 +10,7 @@ void osViSetXScale(f32 value) {
__osViNext->state |= 0x2;
- nomValue = __osViNext->modep->comRegs.xScale & 0xfff;
+ nomValue = __osViNext->modep->comRegs.xScale & 0xFFF;
__osViNext->x.scale = (u32)(__osViNext->x.factor * nomValue) & 0xFFF;
__osRestoreInt(saveMask);
diff --git a/src/libultra/os/initialize.c b/src/libultra/os/initialize.c
index 3174d5c99..9fbf5ff64 100644
--- a/src/libultra/os/initialize.c
+++ b/src/libultra/os/initialize.c
@@ -4,7 +4,7 @@
typedef struct {
/* 0x0 */ u32 ins_00; // lui k0, 0x8000
- /* 0x4 */ u32 ins_04; // addiu k0, k0, 0x39e0
+ /* 0x4 */ u32 ins_04; // addiu k0, k0, 0x39E0
/* 0x8 */ u32 ins_08; // jr k0 ; __osException
/* 0xC */ u32 ins_0C; // nop
} struct_exceptionPreamble;
diff --git a/src/libultra/rmon/xldtob.c b/src/libultra/rmon/xldtob.c
index 65ffc7a92..460d0951c 100644
--- a/src/libultra/rmon/xldtob.c
+++ b/src/libultra/rmon/xldtob.c
@@ -9,13 +9,13 @@ const f64 digs[] = { 10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L
/* float properties */
#define _D0 0
-#define _DBIAS 0x3ff
+#define _DBIAS 0x3FF
#define _DLONG 1
#define _DOFF 4
-#define _FBIAS 0x7e
+#define _FBIAS 0x7E
#define _FOFF 7
#define _FRND 1
-#define _LBIAS 0x3ffe
+#define _LBIAS 0x3FFE
#define _LOFF 15
/* integer properties */
#define _C2 1
@@ -26,7 +26,7 @@ const f64 digs[] = { 10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L
#define INF 1
#define FINITE -1
#define _DFRAC ((1 << _DOFF) - 1)
-#define _DMASK (0x7fff & ~_DFRAC)
+#define _DMASK (0x7FFF & ~_DFRAC)
#define _DMAX ((1 << (15 - _DOFF)) - 1)
#define _DNAN (0x8000 | _DMAX << _DOFF | 1 << (_DOFF - 1))
#define _DSIGN 0x8000
diff --git a/src/libultra/rmon/xprintf.c b/src/libultra/rmon/xprintf.c
index 6c538a2a8..ddb83652d 100644
--- a/src/libultra/rmon/xprintf.c
+++ b/src/libultra/rmon/xprintf.c
@@ -51,8 +51,7 @@ int _Printf(PrintCallback pfn, void* arg, const char* fmt, va_list ap) {
}
fmt = ++s;
x.flags = 0;
- // TODO the cast isn't necessary because strchr should take it in as const, but it currently doesn't
- for (; (t = strchr((char*)fchar, *s)) != NULL; s++) {
+ for (; (t = strchr(fchar, *s)) != NULL; s++) {
x.flags |= fbit[t - fchar];
}
if (*s == '*') {
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 99d5c5a85..555f92798 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
@@ -4,6 +4,7 @@
* Description: Great Bay Temple - See-Saw
*/
+#include "prevent_bss_reordering.h"
#include "z_bg_dblue_balance.h"
#include "objects/object_dblue_object/object_dblue_object.h"
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 89c1be29c..2bd5d103a 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
@@ -4,6 +4,7 @@
* Description: Great Bay Temple - Waterwheels and push switches
*/
+#include "prevent_bss_reordering.h"
#include "z_bg_dblue_movebg.h"
#include "objects/object_dblue_object/object_dblue_object.h"
#include "overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h"
diff --git a/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.h b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.h
index 729dfcea9..c39994d77 100644
--- a/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.h
+++ b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.h
@@ -15,6 +15,7 @@ typedef struct BgKeikokuSaku {
/* 0x160 */ s16 switchFlag;
/* 0x162 */ s16 timer;
} BgKeikokuSaku; // Size = 0x164
+
extern const ActorInit Bg_Keikoku_Saku_InitVars;
#endif // Z_BG_KEIKOKU_SAKU_H
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 449660f7e..4e48d076d 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"
diff --git a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
index 524414e1c..57a6f3312 100644
--- a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
+++ b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
@@ -74,7 +74,7 @@ void DemoSyoten_Init(Actor* thisx, PlayState* play) {
switch (DEMOSYOTEN_GET_F(&this->actor)) {
case DEMOSYOTEN_F_0:
func_80183430(&this->unk_144, &object_syoten_Blob_001328, &object_syoten_Blob_00023C, this->unk_174,
- this->unk_2A6, 0);
+ this->unk_2A6, NULL);
func_801835EC(&this->unk_144, &object_syoten_Blob_00023C);
this->actor.draw = NULL;
this->actionFunc = func_80C16A74;
diff --git a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
index 44905d800..5efd088ae 100644
--- a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
+++ b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
@@ -120,13 +120,13 @@ static AnimationInfo sAnimations[] = {
{ &object_delf_Anim_000E44, 1.0f, 0.0f, -1.0f, 0, 0.0f },
};
-DmChar00Struct D_80AA77A8[] = {
+Color_RGBAf D_80AA77A8[] = {
{ 250.0f, 255.0f, 230.0f, 255.0f },
{ 63.0f, 18.0f, 93.0f, 255.0f },
{ 255.0f, 235.0f, 220.0f, 255.0f },
};
-DmChar00Struct D_80AA77D8[] = {
+Color_RGBAf D_80AA77D8[] = {
{ 220.0f, 160.0f, 80.0f, 255.0f },
{ 250.0f, 40.0f, 10.0f, 255.0f },
{ 255.0f, 235.0f, 220.0f, 255.0f },
@@ -934,13 +934,13 @@ void DmChar00_Draw(Actor* thisx, PlayState* play2) {
gSPSegment(POLY_XLU_DISP++, 0x08, &gfx[0]);
gDPPipeSync(gfx++);
- gDPSetPrimColor(gfx++, 0, 0x01, (u8)this->unk_240.unk_00, (u8)this->unk_240.unk_04, (u8)this->unk_240.unk_08,
- (u8)(this->unk_240.unk_0C * 1));
+ gDPSetPrimColor(gfx++, 0, 0x01, (u8)this->unk_240.r, (u8)this->unk_240.g, (u8)this->unk_240.b,
+ (u8)(this->unk_240.a * 1));
gDPSetRenderMode(gfx++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
gSPEndDisplayList(gfx);
- gDPSetEnvColor(POLY_XLU_DISP++, (u8)(s8)this->unk_250.unk_00, (u8)(s8)this->unk_250.unk_04,
- (u8)(s8)this->unk_250.unk_08, (u8)(s8)((f32)phi_a0 * 1));
+ gDPSetEnvColor(POLY_XLU_DISP++, (u8)(s8)this->unk_250.r, (u8)(s8)this->unk_250.g, (u8)(s8)this->unk_250.b,
+ (u8)(s8)((f32)phi_a0 * 1));
gDPSetDither(POLY_XLU_DISP++, G_CD_BAYER);
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
diff --git a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
index 0a7f2410c..1df0df06d 100644
--- a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
+++ b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
@@ -13,13 +13,6 @@ typedef void (*DmChar00ActionFunc)(struct DmChar00*, PlayState*);
#define DMCHAR00_0 0
#define DMCHAR00_1 1
-typedef struct {
- /* 0x00 */ f32 unk_00;
- /* 0x04 */ f32 unk_04;
- /* 0x08 */ f32 unk_08;
- /* 0x0C */ f32 unk_0C;
-} DmChar00Struct; // size = 0x10
-
typedef struct DmChar00 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -28,8 +21,8 @@ typedef struct DmChar00 {
/* 0x1E2 */ Vec3s morphTable[7];
/* 0x20C */ UNK_TYPE1 unk_20C[0x30];
/* 0x23C */ DmChar00ActionFunc actionFunc;
- /* 0x240 */ DmChar00Struct unk_240;
- /* 0x250 */ DmChar00Struct unk_250;
+ /* 0x240 */ Color_RGBAf unk_240;
+ /* 0x250 */ Color_RGBAf unk_250;
/* 0x260 */ u8 unk_260;
/* 0x261 */ u8 unk_261;
/* 0x262 */ u16 unk_262;
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 35fc84ccf..8c1aebc96 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
@@ -176,7 +176,7 @@ void func_80AA8698(DmChar01* this, PlayState* play) {
}
if ((player->transformation == PLAYER_FORM_DEKU) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.unk1202E == 0)) {
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) {
if ((player2->actor.world.pos.x > -40.0f) && (player2->actor.world.pos.x < 40.0f) &&
(player2->actor.world.pos.z > 1000.0f) && (player2->actor.world.pos.z < 1078.0f)) {
diff --git a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
index 08e6dfbcf..1844783ff 100644
--- a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
+++ b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
@@ -1,7 +1,7 @@
/*
* File: z_dm_char02.c
* Overlay: ovl_Dm_Char02
- * Description: Ocarina of Time (dropped from Skull Kid's hand)
+ * Description: The Ocarina of Time that for the scenes on the Clock Tower's rooftop.
*/
#include "z_dm_char02.h"
@@ -16,7 +16,7 @@ void DmChar02_Destroy(Actor* thisx, PlayState* play);
void DmChar02_Update(Actor* thisx, PlayState* play);
void DmChar02_Draw(Actor* thisx, PlayState* play);
-void func_80AAB04C(DmChar02* this, PlayState* play);
+void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play);
const ActorInit Dm_Char02_InitVars = {
ACTOR_DM_CHAR02,
@@ -31,43 +31,52 @@ const ActorInit Dm_Char02_InitVars = {
};
+typedef enum {
+ /* 0 */ DMCHAR02_ANIMATION_HIT_GROUND,
+ /* 1 */ DMCHAR02_ANIMATION_TURN_AROUND,
+ /* 2 */ DMCHAR02_ANIMATION_JUGGLE,
+ /* 3 */ DMCHAR02_ANIMATION_FALL,
+} DmChar02AnimationIndex;
+
static AnimationInfo sAnimations[] = {
- { &object_stk2_Anim_00A2BC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_stk2_Anim_00A4C4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_stk2_Anim_00A6D4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_stk2_Anim_00A104, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gClockTowerOcarinaOfTimeHitGroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gClockTowerOcarinaOfTimeTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gClockTowerOcarinaOfTimeJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gClockTowerOcarinaOfTimeFallAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
};
-void DmChar02_ChangeAnimationByInfo(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 index) {
+void DmChar02_ChangeAnimation(SkelAnime* skelAnime, AnimationInfo* animation, u16 index) {
f32 frameCount;
- animInfo += index;
+ animation += index;
- if (animInfo->frameCount < 0.0f) {
- frameCount = Animation_GetLastFrame(animInfo->animation);
+ if (animation->frameCount < 0.0f) {
+ frameCount = Animation_GetLastFrame(animation->animation);
} else {
- frameCount = animInfo->frameCount;
+ frameCount = animation->frameCount;
}
- Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, frameCount,
- animInfo->mode, animInfo->morphFrames);
+
+ Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, frameCount,
+ animation->mode, animation->morphFrames);
}
-void func_80AAAECC(Actor* actor, PlayState* play) {
+void DmChar02_PlaySfxForDroppingOcarinaCutscene(DmChar02* this, PlayState* play) {
switch (play->csCtx.frames) {
case 95:
- Actor_PlaySfxAtPos(actor, NA_SE_EV_OCARINA_BOUND_0);
- return;
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OCARINA_BOUND_0);
+ break;
+
case 101:
case 105:
case 112:
- Actor_PlaySfxAtPos(actor, NA_SE_EV_OCARINA_BOUND_1);
- return;
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_OCARINA_BOUND_1);
+ break;
}
}
-void func_80AAAF2C(DmChar02* this, PlayState* play) {
+void DmChar02_PlaySfxForCutscenes(DmChar02* this, PlayState* play) {
if ((play->csCtx.state != 0) && (play->sceneNum == SCENE_OKUJOU) && (play->csCtx.currentCsIndex == 1)) {
- func_80AAAECC(&this->actor, play);
+ DmChar02_PlaySfxForDroppingOcarinaCutscene(this, play);
}
}
@@ -75,13 +84,13 @@ void DmChar02_Init(Actor* thisx, PlayState* play) {
DmChar02* this = THIS;
if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
- this->animIndex = 0;
+ this->animIndex = DMCHAR02_ANIMATION_HIT_GROUND;
this->actor.targetArrowOffset = 3000.0f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gClockTowerOcarinaOfTimeSkel, NULL, NULL, NULL, 0);
- DmChar02_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 0);
+ DmChar02_ChangeAnimation(&this->skelAnime, sAnimations, 0);
Actor_SetScale(&this->actor, 0.01f);
- this->actionFunc = func_80AAB04C;
+ this->actionFunc = DmChar02_PerformCutsceneActions;
} else {
Actor_MarkForDeath(&this->actor);
}
@@ -90,8 +99,8 @@ void DmChar02_Init(Actor* thisx, PlayState* play) {
void DmChar02_Destroy(Actor* thisx, PlayState* play) {
}
-void func_80AAB04C(DmChar02* this, PlayState* play) {
- u8 sp2F = true;
+void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play) {
+ u8 shouldChangeAnimation = true;
s32 actionIndex;
if (Cutscene_CheckActorAction(play, 0x83)) {
@@ -99,29 +108,35 @@ void func_80AAB04C(DmChar02* this, PlayState* play) {
if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
switch (play->csCtx.actorActions[actionIndex]->action) {
default:
- this->animIndex = 0;
- sp2F = false;
+ this->animIndex = DMCHAR02_ANIMATION_HIT_GROUND;
+ shouldChangeAnimation = false;
break;
+
case 1:
- this->animIndex = 0;
+ this->animIndex = DMCHAR02_ANIMATION_HIT_GROUND;
break;
+
case 2:
- this->animIndex = 1;
+ this->animIndex = DMCHAR02_ANIMATION_TURN_AROUND;
break;
+
case 4:
- this->animIndex = 3;
+ this->animIndex = DMCHAR02_ANIMATION_FALL;
break;
}
- if (sp2F) {
- DmChar02_ChangeAnimationByInfo(&this->skelAnime, &sAnimations[this->animIndex], 0);
+
+ if (shouldChangeAnimation) {
+ DmChar02_ChangeAnimation(&this->skelAnime, &sAnimations[this->animIndex], 0);
}
}
+
Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
}
+
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- if (this->animIndex == 1) {
+ if (this->animIndex == DMCHAR02_ANIMATION_TURN_AROUND) {
this->animIndex++;
- DmChar02_ChangeAnimationByInfo(&this->skelAnime, &sAnimations[this->animIndex], 0);
+ DmChar02_ChangeAnimation(&this->skelAnime, &sAnimations[this->animIndex], 0);
}
}
}
@@ -130,7 +145,7 @@ void DmChar02_Update(Actor* thisx, PlayState* play) {
DmChar02* this = THIS;
SkelAnime_Update(&this->skelAnime);
- this->unk2F0 = this->unk2F0;
+ this->unk_2F0 = this->unk_2F0;
this->actionFunc(this, play);
if (!Actor_HasParent(&this->actor, play)) {
Actor_PickUp(&this->actor, play, GI_OCARINA, 30.0f, 80.0f);
@@ -138,7 +153,8 @@ void DmChar02_Update(Actor* thisx, PlayState* play) {
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
Actor_MarkForDeath(&this->actor);
}
- func_80AAAF2C(this, play);
+
+ DmChar02_PlaySfxForCutscenes(this, play);
}
s32 DmChar02_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
@@ -154,19 +170,21 @@ void DmChar02_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void DmChar02_Draw(Actor* thisx, PlayState* play) {
s32 pad[2];
DmChar02* this = THIS;
- s32 sp30 = false;
+ s32 shouldDraw = false;
if ((play->csCtx.state == 0) && (this->actor.world.pos.y < 100.0f)) {
- sp30 = true;
+ shouldDraw = true;
} else if (Cutscene_CheckActorAction(play, 0x6B)) {
switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x6B)]->action) {
case 0x17:
case 0x1C:
case 0x26:
- sp30 = true;
+ shouldDraw = true;
+ break;
}
}
- if (sp30) {
+
+ if (shouldDraw) {
func_8012C28C(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmChar02_OverrideLimbDraw, DmChar02_PostLimbDraw,
diff --git a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.h b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.h
index 246fd5531..697989496 100644
--- a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.h
+++ b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.h
@@ -10,12 +10,12 @@ typedef void (*DmChar02ActionFunc)(struct DmChar02*, PlayState*);
typedef struct DmChar02 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ UNK_TYPE1 pad188[0x108];
+ /* 0x188 */ UNK_TYPE1 pad_188[0x108];
/* 0x290 */ DmChar02ActionFunc actionFunc;
- /* 0x294 */ UNK_TYPE1 pad294[0x4C];
+ /* 0x294 */ UNK_TYPE1 pad_294[0x4C];
/* 0x2E0 */ s16 animIndex;
- /* 0x2E2 */ UNK_TYPE1 pad2E2[0xE];
- /* 0x2F0 */ u32 unk2F0;
+ /* 0x2E2 */ UNK_TYPE1 pad_2E2[0xE];
+ /* 0x2F0 */ u32 unk_2F0;
} DmChar02; // size = 0x2F4
extern const ActorInit Dm_Char02_InitVars;
diff --git a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
index 0684dbdec..6c44fb5e6 100644
--- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
+++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
@@ -5,6 +5,7 @@
*/
#include "z_dm_char03.h"
+#include "objects/object_osn/object_osn.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -15,11 +16,10 @@ void DmChar03_Destroy(Actor* thisx, PlayState* play);
void DmChar03_Update(Actor* thisx, PlayState* play);
void DmChar03_Draw(Actor* thisx, PlayState* play);
-void func_80AAB5F8(DmChar03* this, PlayState* play);
void func_80AAB644(DmChar03* this, PlayState* play);
-void func_80AAB700(DmChar03* this, PlayState* play);
+void DmChar03_DoNothing(DmChar03* this, PlayState* play);
+void func_80AABA84(PlayState* play, DmChar03* this);
-#if 0
const ActorInit Dm_Char03_InitVars = {
ACTOR_DM_CHAR03,
ACTORCAT_ITEMACTION,
@@ -32,34 +32,157 @@ const ActorInit Dm_Char03_InitVars = {
(ActorFunc)DmChar03_Draw,
};
-#endif
+AnimationInfo sAnimations[] = { { &object_osn_Anim_020530, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f } };
-extern UNK_TYPE D_06020550;
+void DmChar03_ChangeAnimation(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 index) {
+ f32 frame;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB4A0.s")
+ animInfo += index;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/DmChar03_Init.s")
+ if (animInfo->frameCount < 0.0f) {
+ frame = Animation_GetLastFrame(animInfo->animation);
+ } else {
+ frame = animInfo->frameCount;
+ }
+ Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, frame, animInfo->mode,
+ animInfo->morphFrames);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/DmChar03_Destroy.s")
+void DmChar03_Init(Actor* thisx, PlayState* play) {
+ DmChar03* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB5F8.s")
+ this->animIndex = 0;
+ this->actor.targetArrowOffset = 3000.0f;
+ this->unk_18E = false;
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gDekuMaskSkel, NULL, NULL, NULL, 0);
+ DmChar03_ChangeAnimation(&this->skelAnime, sAnimations, 0);
+ Actor_SetScale(&this->actor, 0.01f);
+ this->actionFunc = DmChar03_DoNothing;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB644.s")
+void DmChar03_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB700.s")
+void func_80AAB5F8(DmChar03* this, PlayState* play) {
+ s32 index = Object_GetIndex(&play->objectCtx, OBJECT_GI_NUTSMASK);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB710.s")
+ if (index >= 0) {
+ this->objectIndex = index;
+ this->actionFunc = func_80AAB644;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB838.s")
+void func_80AAB644(DmChar03* this, PlayState* play) {
+ if (Cutscene_CheckActorAction(play, 0x88)) {
+ s32 index = Cutscene_GetActorActionIndex(play, 0x88);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/DmChar03_Update.s")
+ if (play->csCtx.actorActions[index]->action == 4) {
+ this->unk_18E = true;
+ this->offset.x = play->csCtx.actorActions[index]->startPos.x;
+ this->offset.y = play->csCtx.actorActions[index]->startPos.y;
+ this->offset.z = play->csCtx.actorActions[index]->startPos.z;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB974.s")
+void DmChar03_DoNothing(DmChar03* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB990.s")
+void func_80AAB710(DmChar03* this, PlayState* play) {
+ u8 shouldChangeAnim = true;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AAB9A8.s")
+ if (Cutscene_CheckActorAction(play, 0x88)) {
+ s32 index = Cutscene_GetActorActionIndex(play, 0x88);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/DmChar03_Draw.s")
+ if (play->csCtx.frames == play->csCtx.actorActions[index]->startFrame) {
+ switch (play->csCtx.actorActions[index]->action) {
+ case 1:
+ shouldChangeAnim = false;
+ break;
+ case 2:
+ this->animIndex = 0;
+ break;
+ case 3:
+ this->unk_18E = false;
+ shouldChangeAnim = false;
+ Actor_MarkForDeath(&this->actor);
+ break;
+ case 4:
+ Item_Give(play, ITEM_MASK_DEKU);
+ shouldChangeAnim = false;
+ this->actionFunc = func_80AAB5F8;
+ break;
+ default:
+ shouldChangeAnim = false;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char03/func_80AABA84.s")
+ if (shouldChangeAnim) {
+ DmChar03_ChangeAnimation(&this->skelAnime, &sAnimations[this->animIndex], 0);
+ }
+ }
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, index);
+ }
+}
+
+void func_80AAB838(DmChar03* this, PlayState* play) {
+ if (Animation_OnFrame(&this->skelAnime, 5.0f)) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_0);
+ } else if ((Animation_OnFrame(&this->skelAnime, 10.0f)) || (Animation_OnFrame(&this->skelAnime, 18.0f)) ||
+ (Animation_OnFrame(&this->skelAnime, 30.0f)) || (Animation_OnFrame(&this->skelAnime, 38.0f))) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_IT_MASK_BOUND_1);
+ }
+}
+
+void DmChar03_Update(Actor* thisx, PlayState* play) {
+ DmChar03* this = THIS;
+
+ if (Cutscene_CheckActorAction(play, 0x88) &&
+ (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x88)]->action == 2)) {
+ SkelAnime_Update(&this->skelAnime);
+ }
+ this->actionFunc(this, play);
+ func_80AAB710(this, play);
+ func_80AAB838(this, play);
+}
+
+s32 DmChar03_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ return false;
+}
+
+void DmChar03_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+}
+
+void DmChar03_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
+}
+
+void DmChar03_Draw(Actor* thisx, PlayState* play) {
+ DmChar03* this = THIS;
+
+ if (!this->unk_18E) {
+ if ((Cutscene_CheckActorAction(play, 0x88)) &&
+ (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x88)]->action != 1)) {
+ func_8012C28C(play->state.gfxCtx);
+ SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ this->skelAnime.dListCount, DmChar03_OverrideLimbDraw, DmChar03_PostLimbDraw,
+ DmChar03_TransformLimbDraw, &this->actor);
+ }
+ } else {
+ func_80AABA84(play, this);
+ }
+}
+
+void func_80AABA84(PlayState* play, DmChar03* this) {
+ s32 pad;
+
+ if (this->actor.objBankIndex == this->objectIndex) {
+ Matrix_Translate(this->offset.x, this->offset.y, this->offset.z, MTXMODE_NEW);
+ Matrix_RotateZYX(0, (play->gameplayFrames * 0x3E8), 0, MTXMODE_APPLY);
+ Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
+ GetItem_Draw(play, GID_MASK_DEKU);
+ }
+ if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ this->actor.objBankIndex = this->objectIndex;
+ }
+}
diff --git a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.h b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.h
index 8d2905ad8..f736220c8 100644
--- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.h
+++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.h
@@ -9,9 +9,12 @@ typedef void (*DmChar03ActionFunc)(struct DmChar03*, PlayState*);
typedef struct DmChar03 {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x44];
+ /* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ DmChar03ActionFunc actionFunc;
- /* 0x18C */ char unk_18C[0x10];
+ /* 0x18C */ s16 animIndex;
+ /* 0x18E */ u8 unk_18E;
+ /* 0x18F */ u8 objectIndex;
+ /* 0x190 */ Vec3f offset;
} DmChar03; // size = 0x19C
extern const ActorInit Dm_Char03_InitVars;
diff --git a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
index 7f27b584d..40807c77c 100644
--- a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
+++ b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
@@ -718,7 +718,7 @@ void func_80AADD9C(PlayState* play, DmChar05* this) {
Matrix_Translate(this->unk_190.x, this->unk_190.y, this->unk_190.z, MTXMODE_NEW);
Matrix_RotateZYX(0, play->gameplayFrames * 1000, 0, MTXMODE_APPLY);
Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
- GetItem_Draw(play, GID_44);
+ GetItem_Draw(play, GID_MASK_GORON);
}
if (Object_IsLoaded(&play->objectCtx, this->unk_18F)) {
@@ -731,7 +731,7 @@ void func_80AADE78(PlayState* play, DmChar05* this) {
Matrix_Translate(this->unk_190.x, this->unk_190.y, this->unk_190.z, MTXMODE_NEW);
Matrix_RotateZYX(0, play->gameplayFrames * 1000, 0, MTXMODE_APPLY);
Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
- GetItem_Draw(play, GID_45);
+ GetItem_Draw(play, GID_MASK_ZORA);
}
if (Object_IsLoaded(&play->objectCtx, this->unk_18F)) {
@@ -744,7 +744,7 @@ void func_80AADF54(PlayState* play, DmChar05* this) {
Matrix_Translate(this->unk_190.x, this->unk_190.y, this->unk_190.z, MTXMODE_NEW);
Matrix_RotateZYX(0, play->gameplayFrames * 1000, 0, MTXMODE_APPLY);
Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
- GetItem_Draw(play, GID_6B);
+ GetItem_Draw(play, GID_MASK_GIBDO);
}
if (Object_IsLoaded(&play->objectCtx, this->unk_18F)) {
@@ -758,7 +758,7 @@ void func_80AAE030(PlayState* play, DmChar05* this) {
Matrix_Translate(this->unk_190.x, this->unk_190.y, this->unk_190.z, MTXMODE_NEW);
Matrix_RotateZYX(0, play->gameplayFrames * 1000, 0, MTXMODE_APPLY);
Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
- GetItem_Draw(play, GID_03);
+ GetItem_Draw(play, GID_MASK_COUPLE);
}
if (Object_IsLoaded(&play->objectCtx, this->unk_18F)) {
@@ -768,17 +768,18 @@ void func_80AAE030(PlayState* play, DmChar05* this) {
}
void func_80AAE114(PlayState* play, DmChar05* this) {
- s32 sp34;
- s16 sp24[] = {
- GID_02, GID_MASK_GREAT_FAIRY, GID_70, GID_3A, GID_0E, GID_0F, GID_3E, GID_71,
+ s32 getItemDrawIndex;
+ s16 getItemDrawIds[] = {
+ GID_MASK_KAMARO, GID_MASK_GREAT_FAIRY, GID_MASK_ROMANI, GID_MASK_BLAST,
+ GID_MASK_CIRCUS_LEADER, GID_MASK_BREMEN, GID_MASK_BUNNY, GID_MASK_POSTMAN,
};
- sp34 = DMCHAR05_GET(&this->actor) - DMCHAR05_5;
+ getItemDrawIndex = DMCHAR05_GET(&this->actor) - DMCHAR05_5;
if (this->actor.objBankIndex == this->unk_18F) {
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateZYX(0, play->gameplayFrames * 1000, 0, MTXMODE_APPLY);
Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
- GetItem_Draw(play, sp24[sp34]);
+ GetItem_Draw(play, getItemDrawIds[getItemDrawIndex]);
}
if (Object_IsLoaded(&play->objectCtx, this->unk_18F)) {
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 5ea5fa36c..39f09856a 100644
--- a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.h
+++ b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.h
@@ -10,11 +10,11 @@ typedef void (*DmChar07ActionFunc)(struct DmChar07*, PlayState*);
#define DMCHAR07_GET_SPOTLIGHTFLAGS(thisx) (((thisx)->params >> 8) & 0x1F)
#define DMCHAR07_GET_TYPE(thisx) ((thisx)->params & 0xFF)
-#define DMCHAR07_STAGE_RIGHT_SPOTLIGHT 1 // Deku spotlight
-#define DMCHAR07_UPSTAGE_RIGHT_SPOTLIGHT 2 // Goron spotlight
-#define DMCHAR07_STAGE_CENTER_SPOTLIGHT 4 // Human spotlight
-#define DMCHAR07_UPSTAGE_LEFT_SPOTLIGHT 8 // Zora spotlight
-#define DMCHAR07_DOWNSTAGE_CENTER_SPOTLIGHT 16
+#define DMCHAR07_STAGE_RIGHT_SPOTLIGHT (1 << 0) // Deku spotlight
+#define DMCHAR07_UPSTAGE_RIGHT_SPOTLIGHT (1 << 1) // Goron spotlight
+#define DMCHAR07_STAGE_CENTER_SPOTLIGHT (1 << 2) // Human spotlight
+#define DMCHAR07_UPSTAGE_LEFT_SPOTLIGHT (1 << 3) // Zora spotlight
+#define DMCHAR07_DOWNSTAGE_CENTER_SPOTLIGHT (1 << 4)
typedef enum {
/* 0 */ DMCHAR07_STAGE,
diff --git a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
index 57f1fb0e0..30cf308b6 100644
--- a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
+++ b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
@@ -42,8 +42,8 @@ s32 func_80C1DED0(DmNb* this, s32 arg1) {
void func_80C1DF18(DmNb* this, PlayState* play) {
s32 sp2C[] = { 0, 0, 0, 0, 0 };
- u16 actionUnk0;
- s32 actionIndex;
+ u16 csAction;
+ s32 csActionIndex;
if (play->csCtx.state != 0) {
if (this->unk1F8 == 0) {
@@ -51,14 +51,14 @@ void func_80C1DF18(DmNb* this, PlayState* play) {
this->unk1F8 = 1;
this->unk1F4 = this->unk1F0;
}
- if (Cutscene_CheckActorAction(play, 562)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 562);
- actionUnk0 = play->csCtx.actorActions[actionIndex]->action;
- if (this->unk1EC != (actionUnk0 & 0xFF)) {
- this->unk1EC = actionUnk0;
- func_80C1DED0(this, sp2C[actionUnk0]);
+ if (Cutscene_CheckActorAction(play, 0x232)) {
+ csActionIndex = Cutscene_GetActorActionIndex(play, 0x232);
+ csAction = play->csCtx.actorActions[csActionIndex]->action;
+ if (this->unk1EC != (u8)csAction) {
+ this->unk1EC = csAction;
+ func_80C1DED0(this, sp2C[csAction]);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, csActionIndex);
}
} else if (this->unk1F8 != 0) {
this->unk1F8 = 0;
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 caa2d02b1..0e5f57209 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -300,13 +300,13 @@ static AnimationInfo sAnimations[] = {
void DmStk_LoadObjectForAnimation(DmStk* this, PlayState* play) {
s32 objectIndex;
- if (((this->animationId >= SK_ANIMATION_SHAKE_HEAD) && (this->animationId <= SK_ANIMATION_BENT_OVER_HEAD_TWITCH)) ||
- (this->animationId == SK_ANIMATION_CALL_DOWN_MOON_START) ||
- (this->animationId == SK_ANIMATION_CALL_DOWN_MOON_LOOP) ||
- (this->animationId == SK_ANIMATION_TELESCOPE_LOOK_UP_START) ||
- (this->animationId == SK_ANIMATION_TELESCOPE_LOOK_UP_LOOP)) {
+ if (((this->animIndex >= SK_ANIMATION_SHAKE_HEAD) && (this->animIndex <= SK_ANIMATION_BENT_OVER_HEAD_TWITCH)) ||
+ (this->animIndex == SK_ANIMATION_CALL_DOWN_MOON_START) ||
+ (this->animIndex == SK_ANIMATION_CALL_DOWN_MOON_LOOP) ||
+ (this->animIndex == SK_ANIMATION_TELESCOPE_LOOK_UP_START) ||
+ (this->animIndex == SK_ANIMATION_TELESCOPE_LOOK_UP_LOOP)) {
objectIndex = this->objectStkObjectIndex;
- } else if (this->animationId >= SK_ANIMATION_LOOK_UP_AT_GIANTS) {
+ } else if (this->animIndex >= SK_ANIMATION_LOOK_UP_AT_GIANTS) {
objectIndex = this->objectStk3ObjectIndex;
} else {
objectIndex = this->objectStk2ObjectIndex;
@@ -596,7 +596,7 @@ void DmStk_PlaySfxForClockTowerIntroCutsceneVersion1(DmStk* this, PlayState* pla
break;
}
- if ((this->animationId == SK_ANIMATION_OCARINA_JUGGLE) && (play->csCtx.frames < 700)) {
+ if ((this->animIndex == SK_ANIMATION_OCARINA_JUGGLE) && (play->csCtx.frames < 700)) {
if (Animation_OnFrame(&this->skelAnime, 5.0f) || Animation_OnFrame(&this->skelAnime, 25.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_OTEDAMA1);
} else if (Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 40.0f)) {
@@ -734,7 +734,7 @@ void DmStk_PlaySfxForEndingCutsceneSecondPart(DmStk* this, PlayState* play) {
break;
}
- if (this->animationId == SK_ANIMATION_SHAKE_HEAD) {
+ if (this->animIndex == SK_ANIMATION_SHAKE_HEAD) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 17.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
}
@@ -742,12 +742,12 @@ void DmStk_PlaySfxForEndingCutsceneSecondPart(DmStk* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 28.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_RIDE);
}
- } else if (this->animationId == SK_ANIMATION_LAUGH_AFTER_SNIFF) {
+ } else if (this->animIndex == SK_ANIMATION_LAUGH_AFTER_SNIFF) {
if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f) ||
Animation_OnFrame(&this->skelAnime, 12.0f) || Animation_OnFrame(&this->skelAnime, 18.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_MASK_OFF);
}
- } else if ((this->animationId == SK_ANIMATION_SNIFF) &&
+ } else if ((this->animIndex == SK_ANIMATION_SNIFF) &&
(Animation_OnFrame(&this->skelAnime, 16.0f) || Animation_OnFrame(&this->skelAnime, 23.0f))) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_NOSE);
}
@@ -983,20 +983,20 @@ void DmStk_PlaySfxForCutscenes(DmStk* this, PlayState* play) {
}
}
- if (this->animationId == SK_ANIMATION_WALK) {
+ if (this->animIndex == SK_ANIMATION_WALK) {
if (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_WALK);
}
- } else if (this->animationId == SK_ANIMATION_SEARCH_LINK) {
+ } else if (this->animIndex == SK_ANIMATION_SEARCH_LINK) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 13.0f) ||
Animation_OnFrame(&this->skelAnime, 20.0f) || Animation_OnFrame(&this->skelAnime, 27.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_CALM_HIT);
}
- } else if (this->animationId == SK_ANIMATION_PICK_UP_OCARINA_AND_START_PLAYING) {
+ } else if (this->animIndex == SK_ANIMATION_PICK_UP_OCARINA_AND_START_PLAYING) {
if (Animation_OnFrame(&this->skelAnime, 3.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_PL_PUT_OUT_ITEM);
}
- } else if (this->animationId == SK_ANIMATION_PLAY_OCARINA_AND_LAUGH) {
+ } else if (this->animIndex == SK_ANIMATION_PLAY_OCARINA_AND_LAUGH) {
if (Animation_OnFrame(&this->skelAnime, 14.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_UNSKILLFUL_OCARINA);
}
@@ -1024,7 +1024,7 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
this->tatlMessageTimer = 0;
this->deflectCount = 0;
this->maskType = SK_MASK_TYPE_NORMAL;
- this->animationId = SK_ANIMATION_IDLE;
+ this->animIndex = SK_ANIMATION_IDLE;
this->fogR = play->lightCtx.unk7;
this->fogG = play->lightCtx.unk8;
this->fogB = play->lightCtx.unk9;
@@ -1062,7 +1062,7 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
}
} else if (gSaveContext.sceneSetupIndex == 3) {
- this->animationId = SK_ANIMATION_FLOATING_ARMS_CROSSED;
+ this->animIndex = SK_ANIMATION_FLOATING_ARMS_CROSSED;
if (gSaveContext.unk_3DD0[3] == 0) {
// This code is called when the Giants fail to stop the moon.
// Starts a 1 minute (60 second) timer until the moon falls.
@@ -1075,12 +1075,12 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
sCylinderInit.base.colType = COLTYPE_WOOD;
this->actionFunc = DmStk_ClockTower_Idle;
} else {
- this->animationId = SK_ANIMATION_FLOATING_ARMS_CROSSED;
+ this->animIndex = SK_ANIMATION_FLOATING_ARMS_CROSSED;
this->actionFunc = DmStk_ClockTower_DoNothing;
}
} else {
this->dekuPipesCutsceneState = SK_DEKU_PIPES_CS_STATE_READY;
- this->animationId = SK_ANIMATION_FLOATING_ARMS_CROSSED;
+ this->animIndex = SK_ANIMATION_FLOATING_ARMS_CROSSED;
this->actor.world.pos.y = 120.0f;
sCylinderInit.base.colType = COLTYPE_WOOD;
this->actionFunc = DmStk_ClockTower_Idle;
@@ -1099,7 +1099,7 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
this->fogN = 996;
this->fogF = 1000;
this->fogScale = 0.7f;
- this->animationId = SK_ANIMATION_BENT_OVER_HEAD_TWITCH;
+ this->animIndex = SK_ANIMATION_BENT_OVER_HEAD_TWITCH;
this->actionFunc = DmStk_WaitForTelescope;
} else {
if ((play->sceneNum == SCENE_LOST_WOODS) && !Cutscene_IsPlaying(play)) {
@@ -1123,7 +1123,7 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
this->csAction = 99;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gSkullKidSkel, NULL, NULL, NULL, 0);
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
}
Actor_SetScale(&this->actor, 0.01f);
@@ -1200,9 +1200,9 @@ void DmStk_ClockTower_StartIntroCutsceneVersion1(DmStk* this, PlayState* play) {
void DmStk_ClockTower_WaitForIntroCutsceneVersion1ToEnd(DmStk* this, PlayState* play) {
if (play->csCtx.state == 0) {
- this->animationId = SK_ANIMATION_CALL_DOWN_MOON_LOOP;
+ this->animIndex = SK_ANIMATION_CALL_DOWN_MOON_LOOP;
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
this->actionFunc = DmStk_ClockTower_IdleWithOcarina;
}
}
@@ -1218,8 +1218,8 @@ void DmStk_ClockTower_StartIntroCutsceneVersion2(DmStk* this, PlayState* play) {
void DmStk_ClockTower_WaitForIntroCutsceneVersion2ToEnd(DmStk* this, PlayState* play) {
if (play->csCtx.state == 0) {
- this->animationId = SK_ANIMATION_FLOATING_ARMS_CROSSED;
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ this->animIndex = SK_ANIMATION_FLOATING_ARMS_CROSSED;
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
this->actionFunc = DmStk_ClockTower_Idle;
}
}
@@ -1279,8 +1279,8 @@ void DmStk_ClockTower_DeflectHit(DmStk* this, PlayState* play) {
}
}
- this->animationId = SK_ANIMATION_DEFLECT_ATTACK;
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ this->animIndex = SK_ANIMATION_DEFLECT_ATTACK;
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_DOWN_K);
this->actionFunc = DmStk_ClockTower_WaitForDeflectionToEnd;
}
@@ -1292,8 +1292,8 @@ void DmStk_ClockTower_DeflectHit(DmStk* this, PlayState* play) {
void DmStk_ClockTower_WaitForDeflectionToEnd(DmStk* this, PlayState* play) {
DmStk_ClockTower_AdjustHeightAndRotation(this, play);
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->animationId = SK_ANIMATION_FLOATING_ARMS_CROSSED;
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ this->animIndex = SK_ANIMATION_FLOATING_ARMS_CROSSED;
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
this->actionFunc = DmStk_ClockTower_Idle;
}
@@ -1325,96 +1325,96 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
switch (play->csCtx.actorActions[actorActionIndex]->action) {
case 0:
case 1:
- this->animationId = SK_ANIMATION_IDLE;
+ this->animIndex = SK_ANIMATION_IDLE;
break;
case 2:
- this->animationId = SK_ANIMATION_WALK;
+ this->animIndex = SK_ANIMATION_WALK;
break;
case 3:
- this->animationId = SK_ANIMATION_UNUSED_KICK_OVER_LINK;
+ this->animIndex = SK_ANIMATION_UNUSED_KICK_OVER_LINK;
break;
case 4:
- this->animationId = SK_ANIMATION_KICK_OVER_LINK;
+ this->animIndex = SK_ANIMATION_KICK_OVER_LINK;
break;
case 6:
- this->animationId = SK_ANIMATION_PICK_UP_OCARINA;
+ this->animIndex = SK_ANIMATION_PICK_UP_OCARINA;
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
break;
case 7:
- this->animationId = SK_ANIMATION_PICK_UP_OCARINA_AND_START_PLAYING;
+ this->animIndex = SK_ANIMATION_PICK_UP_OCARINA_AND_START_PLAYING;
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
break;
case 8:
- this->animationId = SK_ANIMATION_SHAKE_HEAD;
+ this->animIndex = SK_ANIMATION_SHAKE_HEAD;
break;
case 9:
- this->animationId = SK_ANIMATION_IDLE;
+ this->animIndex = SK_ANIMATION_IDLE;
this->fadeInState = SK_FADE_IN_STATE_START;
break;
case 12:
- this->animationId = SK_ANIMATION_HIDE_OCARINA_START;
+ this->animIndex = SK_ANIMATION_HIDE_OCARINA_START;
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
break;
case 13:
- this->animationId = SK_ANIMATION_JUMP_WHILE_HIDING_OCARINA;
+ this->animIndex = SK_ANIMATION_JUMP_WHILE_HIDING_OCARINA;
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
break;
case 14:
- this->animationId = SK_ANIMATION_HORSE_RIDE_START;
+ this->animIndex = SK_ANIMATION_HORSE_RIDE_START;
break;
case 15:
- this->animationId = SK_ANIMATION_HORSE_RIDE_LOOP;
+ this->animIndex = SK_ANIMATION_HORSE_RIDE_LOOP;
break;
case 16:
- this->animationId = SK_ANIMATION_HORSE_RIDE_AND_ROTATE;
+ this->animIndex = SK_ANIMATION_HORSE_RIDE_AND_ROTATE;
break;
case 17:
- this->animationId = SK_ANIMATION_RECLINING_FLOAT;
+ this->animIndex = SK_ANIMATION_RECLINING_FLOAT;
break;
case 18:
- this->animationId = SK_ANIMATION_CURSE_START;
+ this->animIndex = SK_ANIMATION_CURSE_START;
break;
case 19:
- this->animationId = SK_ANIMATION_LAUGH_START;
+ this->animIndex = SK_ANIMATION_LAUGH_START;
break;
case 20:
- this->animationId = SK_ANIMATION_RAISE_MASK_START;
+ this->animIndex = SK_ANIMATION_RAISE_MASK_START;
break;
case 21:
- this->animationId = SK_ANIMATION_LOWER_MASK;
+ this->animIndex = SK_ANIMATION_LOWER_MASK;
break;
case 22:
- this->animationId = SK_ANIMATION_PLAY_OCARINA_WHILE_FLOATING;
+ this->animIndex = SK_ANIMATION_PLAY_OCARINA_WHILE_FLOATING;
if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
break;
case 23:
- this->animationId = SK_ANIMATION_FLOATING_TURN_AROUND;
+ this->animIndex = SK_ANIMATION_FLOATING_TURN_AROUND;
this->handType = SK_HAND_TYPE_JUGGLING_OR_DROPPING_OCARINA;
break;
case 24:
- this->animationId = SK_ANIMATION_CALL_DOWN_MOON_START;
+ this->animIndex = SK_ANIMATION_CALL_DOWN_MOON_START;
if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
@@ -1425,148 +1425,148 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
break;
case 26:
- this->animationId = SK_ANIMATION_SMACK_FAIRY_START;
+ this->animIndex = SK_ANIMATION_SMACK_FAIRY_START;
if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
break;
case 27:
- this->animationId = SK_ANIMATION_HIT_BY_BUBBLE;
+ this->animIndex = SK_ANIMATION_HIT_BY_BUBBLE;
if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
break;
case 28:
- this->animationId = SK_ANIMATION_DROP_OCARINA;
+ this->animIndex = SK_ANIMATION_DROP_OCARINA;
this->handType = SK_HAND_TYPE_JUGGLING_OR_DROPPING_OCARINA;
break;
case 30:
- this->animationId = SK_ANIMATION_FLOATING_ARMS_CROSSED;
+ this->animIndex = SK_ANIMATION_FLOATING_ARMS_CROSSED;
break;
case 31:
- this->animationId = SK_ANIMATION_DEFLECT_ATTACK;
+ this->animIndex = SK_ANIMATION_DEFLECT_ATTACK;
break;
case 32:
- this->animationId = SK_ANIMATION_SURPRISE_START;
+ this->animIndex = SK_ANIMATION_SURPRISE_START;
break;
case 33:
- this->animationId = SK_ANIMATION_LOOK_AROUND_FOR_GIANTS_START;
+ this->animIndex = SK_ANIMATION_LOOK_AROUND_FOR_GIANTS_START;
break;
case 34:
- this->animationId = SK_ANIMATION_HOLD_HEAD_AND_SHAKE_START;
+ this->animIndex = SK_ANIMATION_HOLD_HEAD_AND_SHAKE_START;
break;
case 35:
- this->animationId = SK_ANIMATION_HOLD_HEAD_AND_SCREAM_START;
+ this->animIndex = SK_ANIMATION_HOLD_HEAD_AND_SCREAM_START;
break;
case 36:
- this->animationId = SK_ANIMATION_HUDDLE_WITH_FAIRIES;
+ this->animIndex = SK_ANIMATION_HUDDLE_WITH_FAIRIES;
break;
case 37:
- this->animationId = SK_ANIMATION_SEARCH_MASK_SALESMAN;
+ this->animIndex = SK_ANIMATION_SEARCH_MASK_SALESMAN;
break;
case 38:
- this->animationId = SK_ANIMATION_HOLD_UP_MASK_START;
+ this->animIndex = SK_ANIMATION_HOLD_UP_MASK_START;
break;
case 39:
- this->animationId = SK_ANIMATION_SHIVER;
+ this->animIndex = SK_ANIMATION_SHIVER;
break;
case 40:
- this->animationId = SK_ANIMATION_DRAW;
+ this->animIndex = SK_ANIMATION_DRAW;
break;
case 41:
- this->animationId = SK_ANIMATION_TELESCOPE_LOOK_UP_START;
+ this->animIndex = SK_ANIMATION_TELESCOPE_LOOK_UP_START;
break;
case 42:
- this->animationId = SK_ANIMATION_BENT_OVER_HEAD_TWITCH;
+ this->animIndex = SK_ANIMATION_BENT_OVER_HEAD_TWITCH;
break;
case 43:
- this->animationId = SK_ANIMATION_BENT_OVER_LOOK_UP;
+ this->animIndex = SK_ANIMATION_BENT_OVER_LOOK_UP;
break;
case 44:
- this->animationId = SK_ANIMATION_SPANK;
+ this->animIndex = SK_ANIMATION_SPANK;
break;
case 45:
- this->animationId = SK_ANIMATION_HIP_SHAKE_AND_JUMP;
+ this->animIndex = SK_ANIMATION_HIP_SHAKE_AND_JUMP;
this->fadeOutState = SK_FADE_OUT_STATE_FADING_OUT;
break;
case 46:
this->handType = SK_HAND_TYPE_HOLDING_FLUTE;
- this->animationId = SK_ANIMATION_PLAY_FLUTE;
+ this->animIndex = SK_ANIMATION_PLAY_FLUTE;
break;
case 47:
- this->animationId = SK_ANIMATION_CARTWHEEL;
+ this->animIndex = SK_ANIMATION_CARTWHEEL;
break;
case 48:
- this->animationId = SK_ANIMATION_CARTWHEEL;
+ this->animIndex = SK_ANIMATION_CARTWHEEL;
break;
case 49:
- this->animationId = SK_ANIMATION_LOOK_UP_AT_GIANTS;
+ this->animIndex = SK_ANIMATION_LOOK_UP_AT_GIANTS;
break;
case 50:
- this->animationId = SK_ANIMATION_ASHAMED_START;
+ this->animIndex = SK_ANIMATION_ASHAMED_START;
break;
case 51:
- this->animationId = SK_ANIMATION_LOOK_LEFT_START;
+ this->animIndex = SK_ANIMATION_LOOK_LEFT_START;
break;
case 52:
- this->animationId = SK_ANIMATION_SNIFF;
+ this->animIndex = SK_ANIMATION_SNIFF;
break;
case 53:
- this->animationId = SK_ANIMATION_CARTWHEEL;
+ this->animIndex = SK_ANIMATION_CARTWHEEL;
break;
case 54:
- this->animationId = SK_ANIMATION_LIE_FLAT;
+ this->animIndex = SK_ANIMATION_LIE_FLAT;
break;
case 55:
- this->animationId = SK_ANIMATION_DANGLE_FROM_MASK_START;
+ this->animIndex = SK_ANIMATION_DANGLE_FROM_MASK_START;
break;
case 56:
- this->animationId = SK_ANIMATION_DROPPED_FROM_MASK;
+ this->animIndex = SK_ANIMATION_DROPPED_FROM_MASK;
break;
case 57:
- this->animationId = SK_ANIMATION_LOOK_UP_AT_GIANTS;
+ this->animIndex = SK_ANIMATION_LOOK_UP_AT_GIANTS;
break;
case 58:
- this->animationId = SK_ANIMATION_ASHAMED_START;
+ this->animIndex = SK_ANIMATION_ASHAMED_START;
break;
case 59:
- this->animationId = SK_ANIMATION_LOOK_LEFT_START;
+ this->animIndex = SK_ANIMATION_LOOK_LEFT_START;
break;
case 60:
- this->animationId = SK_ANIMATION_SNIFF;
+ this->animIndex = SK_ANIMATION_SNIFF;
break;
case 5:
@@ -1574,11 +1574,11 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
break;
default:
- this->animationId = SK_ANIMATION_SHAKE_HEAD;
+ this->animIndex = SK_ANIMATION_SHAKE_HEAD;
break;
}
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
}
}
@@ -1642,7 +1642,7 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- switch (this->animationId) {
+ switch (this->animIndex) {
case SK_ANIMATION_LOOK_AROUND:
case SK_ANIMATION_CURSE_START:
case SK_ANIMATION_LAUGH_START:
@@ -1666,34 +1666,34 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
case SK_ANIMATION_ASHAMED_START:
case SK_ANIMATION_LOOK_LEFT_START:
case SK_ANIMATION_SNIFF:
- this->animationId++;
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ this->animIndex++;
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
break;
case SK_ANIMATION_LOWER_MASK:
- this->animationId = SK_ANIMATION_IDLE;
+ this->animIndex = SK_ANIMATION_IDLE;
this->maskType = SK_MASK_TYPE_NORMAL;
this->handType = SK_HAND_TYPE_DEFAULT;
- DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animationId], 0);
+ DmStk_ChangeAnimation(this, play, &this->skelAnime, &sAnimations[this->animIndex], 0);
break;
}
}
- if (((this->animationId == SK_ANIMATION_RAISE_MASK_START) && (this->skelAnime.curFrame >= 16.0f)) ||
- (this->animationId == SK_ANIMATION_RAISE_MASK_LOOP) || (this->animationId == SK_ANIMATION_LOWER_MASK)) {
+ if (((this->animIndex == SK_ANIMATION_RAISE_MASK_START) && (this->skelAnime.curFrame >= 16.0f)) ||
+ (this->animIndex == SK_ANIMATION_RAISE_MASK_LOOP) || (this->animIndex == SK_ANIMATION_LOWER_MASK)) {
this->maskType = SK_MASK_TYPE_RAISED;
this->handType = SK_HAND_TYPE_HOLDING_MAJORAS_MASK;
- } else if (((this->animationId >= SK_ANIMATION_HUDDLE_WITH_FAIRIES) && (this->animationId <= SK_ANIMATION_DRAW)) ||
- ((this->animationId >= SK_ANIMATION_PLAY_FLUTE) && (this->animationId <= SK_ANIMATION_CARTWHEEL)) ||
+ } else if (((this->animIndex >= SK_ANIMATION_HUDDLE_WITH_FAIRIES) && (this->animIndex <= SK_ANIMATION_DRAW)) ||
+ ((this->animIndex >= SK_ANIMATION_PLAY_FLUTE) && (this->animIndex <= SK_ANIMATION_CARTWHEEL)) ||
((play->sceneNum == SCENE_00KEIKOKU) && (gSaveContext.sceneSetupIndex == 7))) {
this->maskType = SK_MASK_TYPE_NO_MASK;
- if ((this->animationId == SK_ANIMATION_HOLD_UP_MASK_START) ||
- (this->animationId == SK_ANIMATION_HOLD_UP_MASK_LOOP)) {
+ if ((this->animIndex == SK_ANIMATION_HOLD_UP_MASK_START) ||
+ (this->animIndex == SK_ANIMATION_HOLD_UP_MASK_LOOP)) {
this->handType = SK_HAND_TYPE_HOLDING_MAJORAS_MASK_AND_FLUTE;
}
}
- if (this->animationId == SK_ANIMATION_DROPPED_FROM_MASK) {
+ if (this->animIndex == SK_ANIMATION_DROPPED_FROM_MASK) {
this->maskType = SK_MASK_TYPE_NO_MASK;
}
}
@@ -1745,7 +1745,7 @@ void DmStk_ClockTower_Idle(DmStk* this, PlayState* play) {
DmStk_ClockTower_AdjustHeightAndRotation(this, play);
this->actor.flags |= ACTOR_FLAG_1;
- if (this->animationId == SK_ANIMATION_CALL_DOWN_MOON_LOOP) {
+ if (this->animIndex == SK_ANIMATION_CALL_DOWN_MOON_LOOP) {
this->actor.targetArrowOffset = 3100.0f;
} else {
this->actor.targetArrowOffset = 200.0f;
@@ -1762,7 +1762,7 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
DmStk* this = THIS;
if (DM_STK_GET_TYPE(&this->actor) != DM_STK_TYPE_MAJORAS_MASK) {
- if (this->animationId == SK_ANIMATION_CALL_DOWN_MOON_LOOP) {
+ if (this->animIndex == SK_ANIMATION_CALL_DOWN_MOON_LOOP) {
Actor_SetFocus(&this->actor, 40.0f);
} else {
Actor_SetFocus(&this->actor, 6.0f);
@@ -1770,7 +1770,7 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
DmStk_LoadObjectForAnimation(this, play);
- if (this->animationId != SK_ANIMATION_LIE_FLAT) {
+ if (this->animIndex != SK_ANIMATION_LIE_FLAT) {
SkelAnime_Update(&this->skelAnime);
}
@@ -1874,8 +1874,8 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- if ((this->animationId == SK_ANIMATION_LOOK_LEFT_LOOP) || (this->animationId == SK_ANIMATION_LAUGH_LOOP) ||
- (this->animationId == SK_ANIMATION_LAUGH_AFTER_SNIFF)) {
+ if ((this->animIndex == SK_ANIMATION_LOOK_LEFT_LOOP) || (this->animIndex == SK_ANIMATION_LAUGH_LOOP) ||
+ (this->animIndex == SK_ANIMATION_LAUGH_AFTER_SNIFF)) {
gSPDisplayList(POLY_OPA_DISP++, gSkullKidLaughingHeadDL);
gSPDisplayList(POLY_OPA_DISP++, gSkullKidLaughingEyesDL);
} else {
diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
index 1933c7727..ffea61265 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
@@ -22,7 +22,7 @@ typedef struct DmStk {
/* 0x20C */ Vec3s morphTable[SKULL_KID_LIMB_MAX]; // Not used, since it's allocated dynamically instead.
/* 0x290 */ DmStkActionFunc actionFunc;
/* 0x294 */ ColliderCylinder collider;
- /* 0x2E0 */ s16 animationId;
+ /* 0x2E0 */ s16 animIndex;
/* 0x2E4 */ s32 alpha;
/* 0x2E8 */ u32 fogR;
/* 0x2EC */ u32 fogG;
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 8c28cd1b5..881785fe1 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -546,7 +546,7 @@ void func_808B9CE8(DoorWarp1* this, PlayState* play) {
}
if (!Actor_HasParent(&this->dyna.actor, play)) {
- Actor_PickUp(&this->dyna.actor, play, func_808B849C(this, play) + 84, 30.0f, 80.0f);
+ Actor_PickUp(&this->dyna.actor, play, (GI_REMAINS_ODOLWA - 1) + func_808B849C(this, play), 30.0f, 80.0f);
return;
}
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 60dbab041..2b1111809 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -5,7 +5,6 @@
*/
#include "z_en_bigokuta.h"
-#include "assets/objects/object_bigokuta/object_bigokuta.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4)
@@ -584,7 +583,7 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
}
rot->x -= rotX;
}
- } else if (limbIndex == BIGOKUTA_LIMB_SNOUT_CENTER) {
+ } else if (limbIndex == BIGOKUTA_LIMB_CENTER_SNOUT) {
EnBigokuta* this = THIS;
if (this->actionFunc == EnBigokuta_PlayDeathEffects) {
diff --git a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
index c5cb799a5..ba59e9a97 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
@@ -2,36 +2,13 @@
#define Z_EN_BIGOKUTA_H
#include "global.h"
+#include "assets/objects/object_bigokuta/object_bigokuta.h"
struct EnBigokuta;
typedef void (*EnBigokutaActionFunc)(struct EnBigokuta*, PlayState*);
typedef void (*EnBigokutaUnkFunc)(PlayState*, struct EnBigokuta*);
-typedef enum {
- /* 00 */ BIGOKUTA_LIMB_NONE,
- /* 01 */ BIGOKUTA_LIMB_BODY,
- /* 02 */ BIGOKUTA_LIMB_ARM_BASE_RIGHT_FRONT,
- /* 03 */ BIGOKUTA_LIMB_ARM_END_RIGHT_FRONT,
- /* 04 */ BIGOKUTA_LIMB_ARM_BASE_LEFT_FRONT,
- /* 05 */ BIGOKUTA_LIMB_ARM_END_LEFT_FRONT,
- /* 06 */ BIGOKUTA_LIMB_ARM_BASE_RIGHT_BACK,
- /* 07 */ BIGOKUTA_LIMB_ARM_END_RIGHT_BACK,
- /* 08 */ BIGOKUTA_LIMB_ARM_BASE_LEFT_BACK,
- /* 09 */ BIGOKUTA_LIMB_ARM_END_LEFT_BACK,
- /* 10 */ BIGOKUTA_LIMB_HEAD,
- /* 11 */ BIGOKUTA_LIMB_TENTACLE_BASE_LEFT,
- /* 12 */ BIGOKUTA_LIMB_TENTACLE_TIP_LEFT,
- /* 13 */ BIGOKUTA_LIMB_TENTACLE_BASE_RIGHT,
- /* 14 */ BIGOKUTA_LIMB_TENTACLE_TIP_RIGHT,
- /* 15 */ BIGOKUTA_LIMB_WEAK_POINT_LEFT,
- /* 16 */ BIGOKUTA_LIMB_WEAK_POINT_RIGHT,
- /* 17 */ BIGOKUTA_LIMB_SNOUT_CENTER,
- /* 18 */ BIGOKUTA_LIMB_SNOUT_RIGHT,
- /* 19 */ BIGOKUTA_LIMB_SNOUT_LEFT,
- /* 20 */ BIGOKUTA_LIMB_MAX
-} ObjectBigokutaLimbs;
-
typedef struct EnBigokuta {
/* 0x000 */ Actor actor;
/* 0x144 */ EnBigokutaUnkFunc unkFunc; // possibly something to do with photographing
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 e22457a12..6f48cdb7a 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -153,7 +153,7 @@ static Vtx sBigslimeTargetVtx[BIGSLIME_NUM_VTX] = {
* Purpose: indices to calculate/update normal vector for lighting calculations
* "EnBigslimeTri" struct based on "Tri" struct from gbi.h, but without the flag
*/
-static EnBigslimeTri sEnbigslimeTri[BIGSLIME_NUM_FACES] = {
+static EnBigslimeTri sBigslimeTri[BIGSLIME_NUM_FACES] = {
{ 0, 2, 1 }, { 1, 7, 6 }, { 1, 2, 7 }, { 2, 8, 7 }, { 6, 17, 16 }, { 6, 7, 17 },
{ 8, 19, 18 }, { 7, 8, 18 }, { 7, 18, 17 }, { 9, 21, 20 }, { 0, 3, 2 }, { 2, 9, 8 },
{ 2, 3, 9 }, { 3, 10, 9 }, { 8, 20, 19 }, { 8, 9, 20 }, { 10, 22, 21 }, { 9, 10, 21 },
@@ -436,13 +436,13 @@ void EnBigslime_UpdateSurfaceNorm(EnBigslime* this) {
}
for (i = 0; i < BIGSLIME_NUM_FACES; i++) {
- dynamicVtx0 = &sBigslimeDynamicVtx[this->dynamicVtxState][sEnbigslimeTri[i].v[0]];
- dynamicVtx12 = &sBigslimeDynamicVtx[this->dynamicVtxState][sEnbigslimeTri[i].v[1]];
+ dynamicVtx0 = &sBigslimeDynamicVtx[this->dynamicVtxState][sBigslimeTri[i].v[0]];
+ dynamicVtx12 = &sBigslimeDynamicVtx[this->dynamicVtxState][sBigslimeTri[i].v[1]];
vecTriEdge1.x = dynamicVtx12->n.ob[0] - dynamicVtx0->n.ob[0];
vecTriEdge1.y = dynamicVtx12->n.ob[1] - dynamicVtx0->n.ob[1];
vecTriEdge1.z = dynamicVtx12->n.ob[2] - dynamicVtx0->n.ob[2];
- dynamicVtx12 = &sBigslimeDynamicVtx[this->dynamicVtxState][sEnbigslimeTri[i].v[2]];
+ dynamicVtx12 = &sBigslimeDynamicVtx[this->dynamicVtxState][sBigslimeTri[i].v[2]];
vecTriEdge2.x = dynamicVtx12->n.ob[0] - dynamicVtx0->n.ob[0];
vecTriEdge2.y = dynamicVtx12->n.ob[1] - dynamicVtx0->n.ob[1];
vecTriEdge2.z = dynamicVtx12->n.ob[2] - dynamicVtx0->n.ob[2];
@@ -450,9 +450,9 @@ void EnBigslime_UpdateSurfaceNorm(EnBigslime* this) {
Math3D_CrossProduct(&vecTriEdge1, &vecTriEdge2, &vecTriNorm);
EnBigslime_Vec3fNormalize(&vecTriNorm);
- Math_Vec3f_Sum(&vtxNorm[sEnbigslimeTri[i].v[0]], &vecTriNorm, &vtxNorm[sEnbigslimeTri[i].v[0]]);
- Math_Vec3f_Sum(&vtxNorm[sEnbigslimeTri[i].v[1]], &vecTriNorm, &vtxNorm[sEnbigslimeTri[i].v[1]]);
- Math_Vec3f_Sum(&vtxNorm[sEnbigslimeTri[i].v[2]], &vecTriNorm, &vtxNorm[sEnbigslimeTri[i].v[2]]);
+ Math_Vec3f_Sum(&vtxNorm[sBigslimeTri[i].v[0]], &vecTriNorm, &vtxNorm[sBigslimeTri[i].v[0]]);
+ Math_Vec3f_Sum(&vtxNorm[sBigslimeTri[i].v[1]], &vecTriNorm, &vtxNorm[sBigslimeTri[i].v[1]]);
+ Math_Vec3f_Sum(&vtxNorm[sBigslimeTri[i].v[2]], &vecTriNorm, &vtxNorm[sBigslimeTri[i].v[2]]);
}
for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
@@ -3053,7 +3053,7 @@ void EnBigslime_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultZero(&this->limbPos[limbPosIndex[limbIndex]]);
}
- if (limbIndex == GEKKO_LIMB_R_ANKLE) {
+ if (limbIndex == GEKKO_LIMB_RIGHT_ANKLE) {
Matrix_MultVec3f(&rightFootOffsetRef, &rightFootOffset);
this->gekkoCollider.dim.pos.y = rightFootOffset.y;
}
diff --git a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c
index 63cc7ed57..a84e9e430 100644
--- a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c
+++ b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c
@@ -5,7 +5,6 @@
*/
#include "z_en_bji_01.h"
-#include "objects/object_bji/object_bji.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
@@ -90,7 +89,7 @@ void func_809CCE98(EnBji01* this, PlayState* play) {
void func_809CCEE8(EnBji01* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 0x444);
- if (this->actor.params == ENBJI01_PARAMS_DEFAULT) {
+ if (this->actor.params == SHIKASHI_TYPE_DEFAULT) {
if ((this->actor.xzDistToPlayer <= 60.0f) && (this->actor.playerHeightRel <= 10.0f)) {
this->actor.flags |= ACTOR_FLAG_10000;
} else {
@@ -118,8 +117,8 @@ void func_809CD028(EnBji01* this, PlayState* play) {
f32 timeBeforeMoonCrash;
switch (this->actor.params) {
- case ENBJI01_PARAMS_DEFAULT:
- case ENBJI01_PARAMS_FINISHED_CONVERSATION:
+ case SHIKASHI_TYPE_DEFAULT:
+ case SHIKASHI_TYPE_FINISHED_CONVERSATION:
switch (gSaveContext.save.playerForm) {
case PLAYER_FORM_DEKU:
if (gSaveContext.save.weekEventReg[17] & 0x10) {
@@ -154,7 +153,7 @@ void func_809CD028(EnBji01* this, PlayState* play) {
break;
}
break;
- case ENBJI01_PARAMS_LOOKED_THROUGH_TELESCOPE:
+ case SHIKASHI_TYPE_LOOKED_THROUGH_TELESCOPE:
switch (gSaveContext.save.playerForm) {
case PLAYER_FORM_DEKU:
if (gSaveContext.save.weekEventReg[74] & 0x80) {
@@ -208,7 +207,7 @@ void EnBji01_DialogueHandler(EnBji01* this, PlayState* play) {
case TEXT_STATE_CHOICE:
if (Message_ShouldAdvance(play)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
- this->actor.params = ENBJI01_PARAMS_FINISHED_CONVERSATION;
+ this->actor.params = SHIKASHI_TYPE_FINISHED_CONVERSATION;
switch (play->msgCtx.choiceIndex) {
case 0:
func_8019F208();
@@ -276,14 +275,14 @@ void EnBji01_DialogueHandler(EnBji01* this, PlayState* play) {
case 0x5F8:
func_801477B4(play);
this->actor.flags &= ~ACTOR_FLAG_10000;
- this->actor.params = ENBJI01_PARAMS_FINISHED_CONVERSATION;
+ this->actor.params = SHIKASHI_TYPE_FINISHED_CONVERSATION;
func_809CCE98(this, play);
break;
}
}
break;
case TEXT_STATE_DONE:
- this->actor.params = ENBJI01_PARAMS_FINISHED_CONVERSATION;
+ this->actor.params = SHIKASHI_TYPE_FINISHED_CONVERSATION;
this->actor.flags &= ~ACTOR_FLAG_10000;
func_809CCE98(this, play);
break;
@@ -330,8 +329,8 @@ void EnBji01_Init(Actor* thisx, PlayState* play) {
EnBji01* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_bji_Skel_00578C, &object_bji_Anim_000FDC, this->jointTable,
- this->morphTable, BJI_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gShikashiSkel, &object_bji_Anim_000FDC, this->jointTable,
+ this->morphTable, SHIKASHI_LIMB_MAX);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -346,14 +345,14 @@ void EnBji01_Init(Actor* thisx, PlayState* play) {
switch (gSaveContext.save.entranceIndex) {
case 0x4C00: /* Observatory from ECT */
case 0x4C10: /* Observatory from Termina Field door */
- this->actor.params = ENBJI01_PARAMS_DEFAULT;
+ this->actor.params = SHIKASHI_TYPE_DEFAULT;
func_809CCE98(this, play);
break;
case 0x4C20: /* Observatory from Termina Field telescope */
this->actor.flags |= ACTOR_FLAG_10000;
func_801A5BD0(0);
Audio_QueueSeqCmd(0xE0000100);
- this->actor.params = ENBJI01_PARAMS_LOOKED_THROUGH_TELESCOPE;
+ this->actor.params = SHIKASHI_TYPE_LOOKED_THROUGH_TELESCOPE;
func_809CCE98(this, play);
break;
default:
@@ -374,7 +373,7 @@ void EnBji01_Update(Actor* thisx, PlayState* play) {
s32 pad;
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, (Actor*)this, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
SkelAnime_Update(&this->skelAnime);
if (this->blinkTimer-- <= 0) {
@@ -394,20 +393,20 @@ void EnBji01_Update(Actor* thisx, PlayState* play) {
s32 EnBji01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnBji01* this = THIS;
- if ((limbIndex == BJI_LIMB_NONE) && ((play->gameplayFrames % 2) != 0)) {
+ if ((limbIndex == SHIKASHI_LIMB_NONE) && ((play->gameplayFrames % 2) != 0)) {
*dList = NULL;
}
- if (limbIndex == BJI_LIMB_NONE) {
+ if (limbIndex == SHIKASHI_LIMB_NONE) {
rot->x = rot->x;
rot->y = rot->y;
rot->z = rot->z;
}
switch (limbIndex) {
- case BJI_LIMB_TORSO:
+ case SHIKASHI_LIMB_TORSO:
rot->x += this->torsoXRotStep;
rot->z += this->torsoZRotStep;
break;
- case BJI_LIMB_HEAD:
+ case SHIKASHI_LIMB_HEAD:
rot->x += this->headXRotStep;
rot->z += this->headZRotStep;
break;
@@ -421,7 +420,7 @@ void EnBji01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
Vec3f sp20;
s32 temp_f4 = 0;
- if (limbIndex == BJI_LIMB_HEAD) {
+ if (limbIndex == SHIKASHI_LIMB_HEAD) {
Math_Vec3f_Copy(&sp20, &D_809CDCC8);
sp20.x += temp_f4 * 0.1f;
sp20.y += temp_f4 * 0.1f;
diff --git a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h
index 113db6a38..ac738bc71 100644
--- a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h
+++ b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h
@@ -3,44 +3,25 @@
#include "global.h"
#include "overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.h"
+#include "objects/object_bji/object_bji.h"
struct EnBji01;
typedef void (*EnBji01ActionFunc)(struct EnBji01*, PlayState*);
typedef enum {
- /* 00 */ BJI_LIMB_NONE,
- /* 01 */ BJI_LIMB_ROOT,
- /* 02 */ BJI_LIMB_THIGH_LEFT,
- /* 03 */ BJI_LIMB_LEG_LEFT,
- /* 04 */ BJI_LIMB_FOOT_LEFT,
- /* 05 */ BJI_LIMB_THIGH_RIGHT,
- /* 06 */ BJI_LIMB_LEG_RIGHT,
- /* 07 */ BJI_LIMB_FOOT_RIGHT,
- /* 08 */ BJI_LIMB_TORSO,
- /* 09 */ BJI_LIMB_ARM_LEFT,
- /* 10 */ BJI_LIMB_FOREARM_LEFT,
- /* 11 */ BJI_LIMB_HAND_LEFT,
- /* 12 */ BJI_LIMB_ARM_RIGHT,
- /* 13 */ BJI_LIMB_FOREARM_RIGHT,
- /* 14 */ BJI_LIMB_HAND_RIGHT,
- /* 15 */ BJI_LIMB_HEAD,
- /* 16 */ BJI_LIMB_MAX
-} ObjectBjiLimbs;
-
-typedef enum {
- /* 00 */ ENBJI01_PARAMS_DEFAULT,
- /* 01 */ ENBJI01_PARAMS_FINISHED_CONVERSATION,
- /* 03 */ ENBJI01_PARAMS_LOOKED_THROUGH_TELESCOPE = 3
-} EnBji01Params;
+ /* 0 */ SHIKASHI_TYPE_DEFAULT,
+ /* 1 */ SHIKASHI_TYPE_FINISHED_CONVERSATION,
+ /* 3 */ SHIKASHI_TYPE_LOOKED_THROUGH_TELESCOPE = 3
+} ShikashiType;
typedef struct EnBji01 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnBji01ActionFunc actionFunc;
/* 0x148 */ SkelAnime skelAnime;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ Vec3s jointTable[BJI_LIMB_MAX];
- /* 0x238 */ Vec3s morphTable[BJI_LIMB_MAX];
+ /* 0x1D8 */ Vec3s jointTable[SHIKASHI_LIMB_MAX];
+ /* 0x238 */ Vec3s morphTable[SHIKASHI_LIMB_MAX];
/* 0x298 */ s32 animationIndex;
/* 0x29C */ s16 eyeTexIndex;
/* 0x29E */ s16 blinkSeqIndex;
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 4aaa21bce..b87f43b37 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
@@ -495,7 +495,7 @@ void func_809C5738(EnBomBowlMan* this, PlayState* play) {
}
void func_809C59A4(EnBomBowlMan* this, PlayState* play) {
- Actor_PickUp(&this->actor, play, GI_50, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, GI_BOMBERS_NOTEBOOK, 300.0f, 300.0f);
this->unk_29C = 1;
this->actionFunc = func_809C59F0;
}
@@ -512,7 +512,7 @@ void func_809C59F0(EnBomBowlMan* this, PlayState* play) {
func_800B8500(&this->actor, play, 400.0f, 400.0f, -1);
this->actionFunc = func_809C5AA4;
} else {
- Actor_PickUp(&this->actor, play, GI_50, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, GI_BOMBERS_NOTEBOOK, 300.0f, 300.0f);
}
}
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 81ddc423a..bfc242060 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.c
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.c
@@ -218,9 +218,9 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.x = 0;
}
thisx->shape.rot.x = this->dyna.actor.world.rot.x;
- this->getItem = ENBOX_GET_ITEM(thisx);
+ this->getItemId = ENBOX_GET_ITEM(thisx);
- if (Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor)) || this->getItem == GI_NONE) {
+ if (Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor)) || this->getItemId == GI_NONE) {
this->alpha = 255;
this->iceSmokeTimer = 100;
EnBox_SetupAction(this, EnBox_Open);
@@ -272,7 +272,7 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
this->movementFlags |= ENBOX_MOVE_STICK_TO_GROUND;
}
- if ((this->getItem == GI_STRAY_FAIRY) && !Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor))) {
+ if ((this->getItemId == GI_STRAY_FAIRY) && !Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor))) {
this->dyna.actor.flags |= ACTOR_FLAG_10;
}
@@ -485,10 +485,10 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) {
func_801A3098(0x2B | 0x900);
}
- if (this->getItem == GI_STRAY_FAIRY) {
+ if (this->getItemId == GI_STRAY_FAIRY) {
this->movementFlags |= ENBOX_MOVE_0x20;
} else {
- if ((this->getItem == GI_HEART_PIECE) || (this->getItem == GI_BOTTLE)) {
+ if ((this->getItemId == GI_HEART_PIECE) || (this->getItemId == GI_BOTTLE)) {
Flags_SetCollectible(play, this->collectableFlag);
}
Flags_SetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor));
@@ -498,17 +498,17 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) {
Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &offset, &player->actor.world.pos);
if (offset.z > -50.0f && offset.z < 0.0f && fabsf(offset.y) < 10.0f && fabsf(offset.x) < 20.0f &&
Player_IsFacingActor(&this->dyna.actor, 0x3000, play)) {
- if (((this->getItem == GI_HEART_PIECE) || (this->getItem == GI_BOTTLE)) &&
+ if (((this->getItemId == GI_HEART_PIECE) || (this->getItemId == GI_BOTTLE)) &&
Flags_GetCollectible(play, this->collectableFlag)) {
- this->getItem = GI_RECOVERY_HEART;
+ this->getItemId = GI_RECOVERY_HEART;
}
- if ((this->getItem == GI_MASK_CAPTAIN) && (INV_CONTENT(ITEM_MASK_CAPTAIN) == ITEM_MASK_CAPTAIN)) {
- this->getItem = GI_RECOVERY_HEART;
+ if ((this->getItemId == GI_MASK_CAPTAIN) && (INV_CONTENT(ITEM_MASK_CAPTAIN) == ITEM_MASK_CAPTAIN)) {
+ this->getItemId = GI_RECOVERY_HEART;
}
- if ((this->getItem == GI_MASK_GIANT) && (INV_CONTENT(ITEM_MASK_GIANT) == ITEM_MASK_GIANT)) {
- this->getItem = GI_RECOVERY_HEART;
+ if ((this->getItemId == GI_MASK_GIANT) && (INV_CONTENT(ITEM_MASK_GIANT) == ITEM_MASK_GIANT)) {
+ this->getItemId = GI_RECOVERY_HEART;
}
- Actor_PickUpNearby(&this->dyna.actor, play, -this->getItem);
+ Actor_PickUpNearby(&this->dyna.actor, play, -this->getItemId);
}
if (Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor))) {
EnBox_SetupAction(this, EnBox_Open);
@@ -538,7 +538,7 @@ void EnBox_Open(EnBox* this, PlayState* play) {
Actor_SpawnAsChild(&play->actorCtx, &this->dyna.actor, play, ACTOR_EN_ELFORG, this->dyna.actor.world.pos.x,
this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z, this->dyna.actor.world.rot.x,
this->dyna.actor.world.rot.y, this->dyna.actor.world.rot.z,
- ((ENBOX_GET_CHEST_FLAG(&this->dyna.actor) & 0x7F) << 9) | STRAY_FAIRY_TYPE_CHEST);
+ STRAY_FAIRY_PARAMS(ENBOX_GET_CHEST_FLAG(&this->dyna.actor), 0, STRAY_FAIRY_TYPE_CHEST));
} else if (this->movementFlags & ENBOX_MOVE_0x40) {
this->movementFlags &= ~ENBOX_MOVE_0x40;
}
@@ -603,7 +603,7 @@ void EnBox_Update(Actor* thisx, PlayState* play) {
this->movementFlags &= ~ENBOX_MOVE_STICK_TO_GROUND;
EnBox_ClipToGround(this, play);
}
- if ((this->getItem == GI_STRAY_FAIRY) && !Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor))) {
+ if ((this->getItemId == GI_STRAY_FAIRY) && !Flags_GetTreasure(play, ENBOX_GET_CHEST_FLAG(&this->dyna.actor))) {
play->actorCtx.unk5 |= 8;
}
this->actionFunc(this, play);
@@ -615,7 +615,7 @@ void EnBox_Update(Actor* thisx, PlayState* play) {
Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 0x1C);
}
Actor_SetFocus(&this->dyna.actor, 40.0f);
- if ((this->getItem == GI_ICE_TRAP) && (this->actionFunc == EnBox_Open) && (this->skelAnime.curFrame > 45.0f) &&
+ if ((this->getItemId == GI_ICE_TRAP) && (this->actionFunc == EnBox_Open) && (this->skelAnime.curFrame > 45.0f) &&
(this->iceSmokeTimer < 100)) {
EnBox_SpawnIceSmoke(this, play);
}
@@ -633,7 +633,7 @@ void EnBox_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (this->type == ENBOX_TYPE_BIG_ORNATE) {
gSPDisplayList((*gfx)++, &gBoxChestBaseOrnateDL);
} else if (Actor_IsSmallChest(this)) {
- if (this->getItem == GI_KEY_SMALL) {
+ if (this->getItemId == GI_KEY_SMALL) {
gSPDisplayList((*gfx)++, &gBoxChestBaseGildedDL);
} else {
gSPDisplayList((*gfx)++, &gBoxChestBaseDL);
@@ -646,7 +646,7 @@ void EnBox_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (this->type == ENBOX_TYPE_BIG_ORNATE) {
gSPDisplayList((*gfx)++, &gBoxChestLidOrnateDL);
} else if (Actor_IsSmallChest(this)) {
- if (this->getItem == GI_KEY_SMALL) {
+ if (this->getItemId == GI_KEY_SMALL) {
gSPDisplayList((*gfx)++, &gBoxChestLidGildedDL);
} else {
gSPDisplayList((*gfx)++, &gBoxChestLidDL);
diff --git a/src/overlays/actors/ovl_En_Box/z_en_box.h b/src/overlays/actors/ovl_En_Box/z_en_box.h
index 0ea7fe8de..cd164c924 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.h
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.h
@@ -62,7 +62,7 @@ typedef struct EnBox {
/* 0x1F4 */ func_80867BDC_a0 unk_1F4;
/* 0x218 */ s16 cutsceneIdxA;
/* 0x21A */ s16 cutsceneIdxB;
- /* 0x21C */ s32 getItem;
+ /* 0x21C */ s32 getItemId;
/* 0x220 */ s32 collectableFlag;
} EnBox; // size = 0x224
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 729b96a83..61eefbe1e 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
@@ -412,7 +412,7 @@ void func_80B3EEDC(EnDai* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.unk1202E == 1)) {
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY)) {
func_80B3E5DC(this, 1);
this->actionFunc = func_80B3EE8C;
} else if (!(player->stateFlags2 & 0x08000000)) {
diff --git a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
index 17ee92ede..4b6eae5bb 100644
--- a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
+++ b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
@@ -5,7 +5,6 @@
*/
#include "z_en_demo_heishi.h"
-#include "objects/object_sdn/object_sdn.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
@@ -69,8 +68,8 @@ void EnDemoheishi_Init(Actor* thisx, PlayState* play) {
EnDemoheishi* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkeleton, &gSoldierWave, this->jointTable, this->morphTable,
- 17);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkel, &gSoldierWave, this->jointTable, this->morphTable,
+ SOLDIER_LIMB_MAX);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.targetMode = 6;
this->actor.gravity = -3.0f;
@@ -175,7 +174,7 @@ void EnDemoheishi_Update(Actor* thisx, PlayState* play) {
s32 EnDemoheishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnDemoheishi* this = THIS;
- if (limbIndex == DEMOHEISHI_LIMB_HEAD) {
+ if (limbIndex == SOLDIER_LIMB_HEAD) {
rot->x += this->headRotX;
rot->y += this->headRotY;
rot->z += this->headRotZ;
diff --git a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.h b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.h
index f67cbe074..c14fa5326 100644
--- a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.h
+++ b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.h
@@ -2,37 +2,17 @@
#define Z_EN_DEMO_HEISHI_H
#include "global.h"
+#include "objects/object_sdn/object_sdn.h"
struct EnDemoheishi;
typedef void (*EnDemoheishiActionFunc)(struct EnDemoheishi*, PlayState*);
-typedef enum {
- /* 0 */ DEMOHEISHI_LIMB_NONE,
- /* 1 */ DEMOHEISHI_LIMB_ROOT,
- /* 2 */ DEMOHEISHI_LIMB_PELVIS,
- /* 3 */ DEMOHEISHI_LIMB_LEFT_THIGH,
- /* 4 */ DEMOHEISHI_LIMB_LEFT_SHIN,
- /* 5 */ DEMOHEISHI_LIMB_LEFT_FOOT,
- /* 6 */ DEMOHEISHI_LIMB_RIGHT_THIGH,
- /* 7 */ DEMOHEISHI_LIMB_RIGHT_SHIN,
- /* 8 */ DEMOHEISHI_LIMB_RIGHT_FOOT,
- /* 9 */ DEMOHEISHI_LIMB_TORSO,
- /* 10 */ DEMOHEISHI_LIMB_LEFT_SHOULDER,
- /* 11 */ DEMOHEISHI_LIMB_LEFT_FOREARM,
- /* 12 */ DEMOHEISHI_LIMB_LEFT_HAND,
- /* 13 */ DEMOHEISHI_LIMB_RIGHT_SHOULDER,
- /* 14 */ DEMOHEISHI_LIMB_RIGHT_FOREARM,
- /* 15 */ DEMOHEISHI_LIMB_RIGHT_HAND_WITH_SPEAR,
- /* 16 */ DEMOHEISHI_LIMB_HEAD,
- /* 17 */ DEMOHEISHI_LIMB_MAX
-} EnDemoheishiLimbs;
-
typedef struct EnDemoheishi {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[DEMOHEISHI_LIMB_MAX];
- /* 0x1EE */ Vec3s morphTable[DEMOHEISHI_LIMB_MAX];
+ /* 0x188 */ Vec3s jointTable[SOLDIER_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[SOLDIER_LIMB_MAX];
/* 0x254 */ EnDemoheishiActionFunc actionFunc;
/* 0x258 */ s16 headRotY;
/* 0x25A */ s16 headRotX;
diff --git a/src/overlays/actors/ovl_En_Dno/z_en_dno.c b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
index 646667c05..102fc6d9b 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.c
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
@@ -610,11 +610,11 @@ void func_80A725F8(EnDno* this, PlayState* play) {
case 0x802:
if (Message_ShouldAdvance(play)) {
if (INV_CONTENT(ITEM_MASK_SCENTS) == ITEM_MASK_SCENTS) {
- this->unk_458 = GI_RUPEE_RED;
+ this->getItemId = GI_RUPEE_RED;
} else {
- this->unk_458 = GI_MASK_SCENTS;
+ this->getItemId = GI_MASK_SCENTS;
}
- Actor_PickUp(&this->actor, play, this->unk_458, 60.0f, 60.0f);
+ Actor_PickUp(&this->actor, play, this->getItemId, 60.0f, 60.0f);
func_801477B4(play);
func_80A72B84(this, play);
}
@@ -678,7 +678,7 @@ void func_80A72BA4(EnDno* this, PlayState* play) {
this->actor.parent = NULL;
this->actionFunc = func_80A72598;
} else {
- Actor_PickUp(&this->actor, play, this->unk_458, 60.0f, 60.0f);
+ Actor_PickUp(&this->actor, play, this->getItemId, 60.0f, 60.0f);
}
}
diff --git a/src/overlays/actors/ovl_En_Dno/z_en_dno.h b/src/overlays/actors/ovl_En_Dno/z_en_dno.h
index 9c7861974..bf357cad6 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.h
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.h
@@ -48,7 +48,7 @@ typedef struct EnDno {
/* 0x44F */ UNK_TYPE1 unk_44F[0x3];
/* 0x452 */ s16 unk_452;
/* 0x454 */ f32 unk_454;
- /* 0x458 */ s32 unk_458;
+ /* 0x458 */ s32 getItemId;
/* 0x45C */ s16 unk_45C;
/* 0x460 */ Actor* unk_460;
/* 0x464 */ u16 textId;
diff --git a/src/overlays/actors/ovl_En_Elf/z_en_elf.h b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
index 2ee080fa3..64d53744f 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.h
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
@@ -49,6 +49,17 @@ typedef struct EnElf {
/* 0x270 */ EnElfActionFunc actionFunc;
} EnElf; // size = 0x274
+typedef enum {
+ /* 0x00 */ ENELF_TYPE_0,
+ /* 0x01 */ ENELF_TYPE_1,
+ /* 0x02 */ ENELF_TYPE_2,
+ /* 0x03 */ ENELF_TYPE_3,
+ /* 0x04 */ ENELF_TYPE_4,
+ /* 0x05 */ ENELF_TYPE_5,
+ /* 0x06 */ ENELF_TYPE_6,
+ /* 0x07 */ ENELF_TYPE_7
+} FairyType;
+
extern const ActorInit En_Elf_InitVars;
#endif // Z_EN_ELF_H
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 e02ac1118..d0bc05b8b 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
@@ -73,10 +73,10 @@ void EnElfbub_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- childActor = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ELFORG, this->actor.world.pos.x,
- this->actor.world.pos.y + 12.0f, this->actor.world.pos.z, this->actor.world.rot.x,
- this->actor.world.rot.y, this->actor.world.rot.z,
- ((ENELFBUB_GET_SWITCHFLAG(&this->actor) & 0x7F) << 9) | STRAY_FAIRY_TYPE_BUBBLE);
+ childActor = Actor_SpawnAsChild(
+ &play->actorCtx, &this->actor, play, ACTOR_EN_ELFORG, this->actor.world.pos.x, this->actor.world.pos.y + 12.0f,
+ this->actor.world.pos.z, this->actor.world.rot.x, this->actor.world.rot.y, this->actor.world.rot.z,
+ STRAY_FAIRY_PARAMS(ENELFBUB_GET_SWITCHFLAG(&this->actor), 0, STRAY_FAIRY_TYPE_BUBBLE));
if (childActor != NULL) {
childActor->parent = &this->actor;
}
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 db131058c..ba8cb4f01 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
@@ -241,7 +241,7 @@ void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3) {
s32 pad;
s32 i;
Actor* elforg;
- s32 temp;
+ s32 params;
Vec3f sp6C;
Player* player = GET_PLAYER(play);
@@ -252,16 +252,16 @@ void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3) {
if (arg3 == 0) {
sp6C = this->actor.world.pos;
sp6C.y += 20.0f;
- temp = ((this->unk_147 & 7) << 6) | STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN;
+ params = STRAY_FAIRY_PARAMS(0, this->unk_147, STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN);
} else {
sp6C = player->actor.world.pos;
sp6C.y += 20.0f;
- temp = ((this->unk_147 & 7) << 6) | STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN;
+ params = STRAY_FAIRY_PARAMS(0, this->unk_147, STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN);
}
for (i = 0; i < arg2; i++) {
elforg = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, randPlusMinusPoint5Scaled(20.0f) + sp6C.x, sp6C.y,
- randPlusMinusPoint5Scaled(20.0f) + sp6C.z, 0, 0, 0, temp);
+ randPlusMinusPoint5Scaled(20.0f) + sp6C.z, 0, 0, 0, params);
if (elforg == NULL) {
continue;
}
@@ -284,8 +284,8 @@ s32 func_80A39F50(PlayState* play) {
}
elfOrg = (EnElforg*)itemAction;
- if (!(elfOrg->flags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME)) {
- elfOrg->flags |= STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME;
+ if (!(elfOrg->strayFairyFlags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME)) {
+ elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME;
}
itemAction = itemAction->next;
}
@@ -307,8 +307,8 @@ s32 func_80A39FBC(PlayState* play) {
}
elfOrg = (EnElforg*)itemAction;
- if (!(elfOrg->flags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN)) {
- elfOrg->flags |= STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN;
+ if (!(elfOrg->strayFairyFlags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN)) {
+ elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN;
if (phi_v1 >= 100) {
return phi_v1;
}
@@ -336,7 +336,7 @@ void func_80A3A044(PlayState* play) {
elfOrg = (EnElforg*)itemAction;
elfOrg->actor.home.rot.x = 0x14;
- elfOrg->flags |= STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS;
+ elfOrg->strayFairyFlags |= STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS;
itemAction = itemAction->next;
}
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 915eb1d6c..04ad98f8f 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
@@ -5,7 +5,6 @@
*/
#include "z_en_elforg.h"
-#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -70,34 +69,37 @@ void EnElforg_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnElforg* this = THIS;
- Actor_SetScale(&this->actor, 0.01f);
- this->flags = 0;
+ Actor_SetScale(thisx, 0.01f);
+ this->strayFairyFlags = 0;
this->direction = 0;
SkelAnime_InitFlex(play, &this->skelAnime, &gStrayFairySkel, &gStrayFairyFlyingAnim, this->jointTable,
this->jointTable, STRAY_FAIRY_LIMB_MAX);
this->skelAnime.playSpeed = 1.0f;
- ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
- this->actor.shape.shadowAlpha = 255;
+ ActorShape_Init(&thisx->shape, 0.0f, NULL, 0.0f);
+ thisx->shape.shadowAlpha = 255;
- switch (STRAY_FAIRY_TYPE(&this->actor)) {
+ switch (STRAY_FAIRY_TYPE(thisx)) {
case STRAY_FAIRY_TYPE_CLOCK_TOWN:
if (gSaveContext.save.weekEventReg[8] & 0x80) {
- Actor_MarkForDeath(&this->actor);
+ Actor_MarkForDeath(thisx);
return;
}
break;
+
case STRAY_FAIRY_TYPE_COLLECTIBLE:
- if (Flags_GetCollectible(play, STRAY_FAIRY_FLAG(&this->actor))) {
- Actor_MarkForDeath(&this->actor);
+ if (Flags_GetCollectible(play, STRAY_FAIRY_FLAG(thisx))) {
+ Actor_MarkForDeath(thisx);
return;
}
break;
+
default:
- if (Flags_GetSwitch(play, STRAY_FAIRY_FLAG(&this->actor))) {
- Actor_MarkForDeath(&this->actor);
+ if (Flags_GetSwitch(play, STRAY_FAIRY_FLAG(thisx))) {
+ Actor_MarkForDeath(thisx);
return;
}
break;
+
case STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN:
case STRAY_FAIRY_TYPE_BUBBLE:
case STRAY_FAIRY_TYPE_CHEST:
@@ -108,44 +110,48 @@ void EnElforg_Init(Actor* thisx, PlayState* play) {
if (Map_IsInDungeonOrBossArea(play)) {
this->area = gSaveContext.dungeonIndex + STRAY_FAIRY_AREA_WOODFALL;
} else {
- // Needs to be thisx in order to match
this->area = STRAY_FAIRY_GET_NON_DUNGEON_AREA(thisx);
}
- switch (STRAY_FAIRY_TYPE(&this->actor)) {
+ switch (STRAY_FAIRY_TYPE(thisx)) {
case STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN:
EnElforg_InitializeParams(this);
this->actionFunc = EnElforg_FreeFloatingFairyFountain;
this->targetSpeedXZ = Rand_ZeroFloat(2.0f) + 1.0f;
this->targetDistanceFromHome = Rand_ZeroFloat(100.0f) + 50.0f;
break;
+
case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN:
EnElforg_InitializeParams(this);
this->actionFunc = EnElforg_TurnInFairy;
this->secondaryTimer = 60;
break;
+
case STRAY_FAIRY_TYPE_BUBBLE:
this->timer = 0;
this->actionFunc = EnElforg_TrappedByBubble;
break;
+
case STRAY_FAIRY_TYPE_ENEMY:
this->actionFunc = EnElforg_SetupTrappedByEnemy;
EnElforg_SetupTrappedByEnemy(this, play);
- this->actor.draw = NULL;
+ thisx->draw = NULL;
break;
+
case STRAY_FAIRY_TYPE_COLLIDER:
this->actionFunc = EnElforg_HiddenByCollider;
- this->actor.draw = NULL;
- Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- Collider_UpdateCylinder(&this->actor, &this->collider);
+ thisx->draw = NULL;
+ Collider_InitAndSetCylinder(play, &this->collider, thisx, &sCylinderInit);
+ Collider_UpdateCylinder(thisx, &this->collider);
break;
+
default:
EnElforg_InitializeParams(this);
this->actionFunc = EnElforg_FreeFloating;
break;
}
- this->actor.shape.rot.y = 0;
+ thisx->shape.rot.y = 0;
}
void EnElforg_Destroy(Actor* thisx, PlayState* play) {
@@ -216,6 +222,7 @@ void EnElforg_MoveToTargetFairyFountain(EnElforg* this, Vec3f* homePos) {
zDifference = this->actor.world.pos.z - homePos->z;
targetAngle = Math_FAtan2F(-zDifference, -xDifference);
xzDistance = sqrtf(SQ(xDifference) + SQ(zDifference));
+
if ((this->targetDistanceFromHome + 10.0f) < xzDistance) {
angleAdjustment = 0x1000;
} else if ((this->targetDistanceFromHome - 10.0f) > xzDistance) {
@@ -223,6 +230,7 @@ void EnElforg_MoveToTargetFairyFountain(EnElforg* this, Vec3f* homePos) {
} else {
angleAdjustment = 0x4000;
}
+
targetAngle += angleAdjustment;
Math_SmoothStepToS(&this->actor.world.rot.y, targetAngle, 2, 4000, 1000);
EnElforg_ApproachTargetSpeedXZ(this);
@@ -240,6 +248,7 @@ void EnElforg_MoveToTarget(EnElforg* this, Vec3f* targetPos) {
this->actor.shape.yOffset += 100.0f * Math_SinS(this->timer << 9);
EnElforg_ApproachTargetYPosition(this, targetPos);
targetAngle = Math_FAtan2F(-(this->actor.world.pos.z - targetPos->z), -(this->actor.world.pos.x - targetPos->x));
+
if (this->targetSpeedXZ > 2.0f) {
Math_SmoothStepToS(&this->actor.world.rot.y, targetAngle, 2, 0x400, 0x100);
} else {
@@ -248,6 +257,7 @@ void EnElforg_MoveToTarget(EnElforg* this, Vec3f* targetPos) {
targetAngle += 0x2000;
Math_SmoothStepToS(&this->actor.world.rot.y, targetAngle, 10, 0x200, 0x80);
}
+
EnElforg_ApproachTargetSpeedXZ(this);
Actor_MoveWithGravity(&this->actor);
}
@@ -258,6 +268,7 @@ void func_80ACCBB8(EnElforg* this, PlayState* play) {
void EnElforg_TrappedByBubble(EnElforg* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
+
if ((this->actor.parent == NULL) || (this->actor.parent->update == NULL)) {
EnElforg_InitializeParams(this);
this->actionFunc = EnElforg_FreeFloating;
@@ -266,6 +277,7 @@ void EnElforg_TrappedByBubble(EnElforg* this, PlayState* play) {
this->actor.world.pos = this->actor.parent->world.pos;
this->actor.world.pos.y += 12.0f;
}
+
func_80ACCBB8(this, play);
}
@@ -282,10 +294,12 @@ void EnElforg_TurnInFairy(EnElforg* this, PlayState* play) {
this->actor.shape.yOffset *= 0.9f;
this->actor.speedXZ = 5.0f;
EnElforg_ApproachTargetYPosition(this, &player->bodyPartsPos[0]);
+
xzDistToPlayer = this->actor.xzDistToPlayer;
if (xzDistToPlayer < 0.0f) {
xzDistToPlayer = 10.0f;
}
+
newAngle = 0x28000 / xzDistToPlayer;
Math_SmoothStepToF(&xzDistToPlayer, 40.0f, 0.2f, 100.0f, 1.0f);
rotationTemp = this->actor.yawTowardsPlayer - newAngle;
@@ -303,7 +317,7 @@ void EnElforg_TurnInFairy(EnElforg* this, PlayState* play) {
this->targetSpeedXZ = 3.0f;
this->targetDistanceFromHome = 50.0f;
this->actionFunc = EnElforg_FreeFloatingFairyFountain;
- this->flags &= ~STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN;
+ this->strayFairyFlags &= ~STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN;
}
}
@@ -313,19 +327,21 @@ void EnElforg_QuicklyCircleFairyFountain(EnElforg* this, PlayState* play) {
if (this->secondaryTimer <= 30) {
this->actionFunc = EnElforg_TurnInFairy;
}
+
this->secondaryTimer--;
}
void EnElforg_FreeFloatingFairyFountain(EnElforg* this, PlayState* play) {
s32 pad;
- if (this->flags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME) {
+ if (this->strayFairyFlags & STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME) {
// This happens when "turning in" the last batch of Stray Fairies to
// a Fairy Fountain. The ones being "turned in" will fly very
// quickly to the center of the fountain.
if (this->targetSpeedXZ < 8.0f) {
this->targetSpeedXZ += 0.1f;
}
+
if (this->targetDistanceFromHome > 0.0f) {
this->targetDistanceFromHome -= 2.0f;
}
@@ -335,22 +351,27 @@ void EnElforg_FreeFloatingFairyFountain(EnElforg* this, PlayState* play) {
} else {
this->targetSpeedXZ = Rand_ZeroFloat(2.0f) + 1.0f;
}
+
this->targetDistanceFromHome = Rand_ZeroFloat(100.0f) + 50.0f;
}
+
SkelAnime_Update(&this->skelAnime);
EnElforg_MoveToTargetFairyFountain(this, &this->actor.home.pos);
- if (this->flags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN) {
+
+ if (this->strayFairyFlags & STRAY_FAIRY_FLAG_CIRCLES_QUICKLY_IN_FOUNTAIN) {
// A small number of fairies will do this when the player walks into
// the center of the fountain to be healed.
this->actionFunc = EnElforg_QuicklyCircleFairyFountain;
}
- if (this->flags & STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS) {
+
+ if (this->strayFairyFlags & STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS) {
// This happens right before the Great Fairy appears once all
// Stray Fairies are saved.
if (this->actor.home.rot.x > 0) {
EnElforg_SpawnSparkles(this, play, 10);
this->actor.home.rot.x--;
}
+
Actor_SetScale(&this->actor, this->actor.scale.x * 0.9f);
if (this->actor.scale.x < 0.001f) {
Actor_MarkForDeath(&this->actor);
@@ -369,6 +390,7 @@ void EnElforg_CirclePlayer(EnElforg* this, PlayState* play) {
} else {
distanceFromPlayer = 20.0f;
}
+
this->actor.world.pos.x = (Math_SinS(this->timer << 12) * distanceFromPlayer) + playerActor->world.pos.x;
this->actor.world.pos.z = (Math_CosS(this->timer << 12) * distanceFromPlayer) + playerActor->world.pos.z;
this->actor.world.pos.y = player->bodyPartsPos[0].y;
@@ -381,6 +403,7 @@ void EnElforg_FairyCollected(EnElforg* this, PlayState* play) {
Actor_MarkForDeath(&this->actor);
return;
}
+
func_800B9010(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG);
}
@@ -445,9 +468,11 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) {
case STRAY_FAIRY_TYPE_COLLECTIBLE:
Flags_SetCollectible(play, STRAY_FAIRY_FLAG(&this->actor));
break;
+
case STRAY_FAIRY_TYPE_CHEST:
Flags_SetTreasure(play, STRAY_FAIRY_FLAG(&this->actor));
break;
+
default:
Flags_SetSwitch(play, STRAY_FAIRY_FLAG(&this->actor));
break;
@@ -456,6 +481,7 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) {
if (STRAY_FAIRY_TYPE(&this->actor) == STRAY_FAIRY_TYPE_CLOCK_TOWN) {
player->actor.freezeTimer = 100;
player->stateFlags1 |= 0x20000000;
+ // Bring me back to North Clock Town!
Message_StartTextbox(play, 0x579, NULL);
this->actionFunc = EnElforg_ClockTownFairyCollected;
ActorCutscene_SetIntentToPlay(0x7C);
@@ -464,6 +490,7 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) {
if (Map_IsInDungeonOrBossArea(play)) {
gSaveContext.save.inventory.strayFairies[gSaveContext.dungeonIndex]++;
+ // You found a Stray Fairy!
Message_StartTextbox(play, 0x11, NULL);
if (gSaveContext.save.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] >= 15) {
func_801A3098(NA_BGM_GET_ITEM | 0x900);
@@ -474,12 +501,13 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) {
Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 7);
func_80ACCBB8(this, play);
if (Player_GetMask(play) == PLAYER_MASK_GREAT_FAIRY) {
- if (!(this->flags & STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED)) {
+ if (!(this->strayFairyFlags & STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED)) {
play_sound(NA_SE_SY_FAIRY_MASK_SUCCESS);
}
- this->flags |= STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED;
+
+ this->strayFairyFlags |= STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED;
} else {
- this->flags &= ~STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED;
+ this->strayFairyFlags &= ~STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED;
}
}
}
@@ -499,6 +527,7 @@ Actor* EnElforg_GetHoldingEnemy(EnElforg* this, PlayState* play) {
return enemy;
}
}
+
return NULL;
}
@@ -523,6 +552,7 @@ void EnElforg_TrappedByEnemy(EnElforg* this, PlayState* play) {
this->actor.world.pos.z = posTemp;
this->actor.home.pos.z = posTemp;
}
+
func_80ACCBB8(this, play);
}
@@ -546,6 +576,7 @@ void EnElforg_HiddenByCollider(EnElforg* this, PlayState* play) {
} else {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
+
func_80ACCBB8(this, play);
}
@@ -598,19 +629,24 @@ void EnElforg_Draw(Actor* thisx, PlayState* play) {
case STRAY_FAIRY_AREA_WOODFALL:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyWoodfallTexAnim));
break;
+
case STRAY_FAIRY_AREA_SNOWHEAD:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairySnowheadTexAnim));
break;
+
case STRAY_FAIRY_AREA_GREAT_BAY:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyGreatBayTexAnim));
break;
+
case STRAY_FAIRY_AREA_STONE_TOWER:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyStoneTowerTexAnim));
break;
+
default:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyClockTownTexAnim));
break;
}
+
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
POLY_XLU_DISP =
diff --git a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h
index 55695240f..5de48e955 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.h
@@ -2,10 +2,12 @@
#define Z_EN_ELFORG_H
#include "global.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define STRAY_FAIRY_TYPE(thisx) ((thisx)->params & 0xF)
#define STRAY_FAIRY_GET_NON_DUNGEON_AREA(thisx) (((thisx)->params & 0x1C0) >> 6)
#define STRAY_FAIRY_FLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define STRAY_FAIRY_PARAMS(flag, nonDungeonArea, type) (((flag & 0x7F) << 9) | ((nonDungeonArea & 7) << 6) | (type & 0xF))
#define STRAY_FAIRY_FLAG_MOVES_QUICKLY_TO_HOME (1 << 0)
#define STRAY_FAIRY_FLAG_SPARKLES_AND_SHRINKS (1 << 1)
@@ -13,40 +15,26 @@
#define STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED (1 << 3)
typedef enum {
- STRAY_FAIRY_TYPE_FREE_FLOATING, // The ones just floating around
- STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN, // The ones already present when you enter a Fairy Fountain
- STRAY_FAIRY_TYPE_BUBBLE, // The ones trapped in bubbles
- STRAY_FAIRY_TYPE_CLOCK_TOWN, // The free-floating Stray Fairies in Clock Town
- STRAY_FAIRY_TYPE_ENEMY, // The ones trapped inside enemies
- STRAY_FAIRY_TYPE_COLLIDER, // Unused in retail. The fairy is hidden until the collider is hit
- STRAY_FAIRY_TYPE_CHEST, // The ones in treasure chests
- STRAY_FAIRY_TYPE_COLLECTIBLE, // The ones in boxes, pots, beehives, etc.
- STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN // The ones you "turn in" by walking into a Fairy Fountain
+ /* 0 */ STRAY_FAIRY_TYPE_FREE_FLOATING, // The ones just floating around
+ /* 1 */ STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN, // The ones already present when you enter a Fairy Fountain
+ /* 2 */ STRAY_FAIRY_TYPE_BUBBLE, // The ones trapped in bubbles
+ /* 3 */ STRAY_FAIRY_TYPE_CLOCK_TOWN, // The free-floating Stray Fairies in Clock Town
+ /* 4 */ STRAY_FAIRY_TYPE_ENEMY, // The ones trapped inside enemies
+ /* 5 */ STRAY_FAIRY_TYPE_COLLIDER, // Unused in retail. The fairy is hidden until the collider is hit
+ /* 6 */ STRAY_FAIRY_TYPE_CHEST, // The ones in treasure chests
+ /* 7 */ STRAY_FAIRY_TYPE_COLLECTIBLE, // The ones in boxes, pots, beehives, etc.
+ /* 8 */ STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN // The ones you "turn in" by walking into a Fairy Fountain
} StrayFairyType;
typedef enum {
- STRAY_FAIRY_AREA_CLOCK_TOWN,
- STRAY_FAIRY_AREA_WOODFALL,
- STRAY_FAIRY_AREA_SNOWHEAD,
- STRAY_FAIRY_AREA_GREAT_BAY,
- STRAY_FAIRY_AREA_STONE_TOWER,
- STRAY_FAIRY_AREA_MAX
+ /* 0 */ STRAY_FAIRY_AREA_CLOCK_TOWN,
+ /* 1 */ STRAY_FAIRY_AREA_WOODFALL,
+ /* 2 */ STRAY_FAIRY_AREA_SNOWHEAD,
+ /* 3 */ STRAY_FAIRY_AREA_GREAT_BAY,
+ /* 4 */ STRAY_FAIRY_AREA_STONE_TOWER,
+ /* 5 */ STRAY_FAIRY_AREA_MAX
} StrayFairyArea;
-typedef enum {
- /* 0 */ STRAY_FAIRY_LIMB_NONE,
- /* 1 */ STRAY_FAIRY_LIMB_RIGHT_FACING_HEAD,
- /* 2 */ STRAY_FAIRY_LIMB_LEFT_WING,
- /* 3 */ STRAY_FAIRY_LIMB_RIGHT_WING,
- /* 4 */ STRAY_FAIRY_LIMB_GLOW,
- /* 5 */ STRAY_FAIRY_LIMB_TORSO,
- /* 6 */ STRAY_FAIRY_LIMB_RIGHT_ARM,
- /* 7 */ STRAY_FAIRY_LIMB_PELVIS_AND_LEGS,
- /* 8 */ STRAY_FAIRY_LIMB_LEFT_ARM,
- /* 9 */ STRAY_FAIRY_LIMB_LEFT_FACING_HEAD,
- /* 10 */ STRAY_FAIRY_LIMB_MAX,
-} StrayFairyLimbs;
-
struct EnElforg;
typedef void (*EnElforgActionFunc)(struct EnElforg*, PlayState*);
@@ -57,7 +45,7 @@ typedef struct EnElforg {
/* 0x188 */ Vec3s jointTable[STRAY_FAIRY_LIMB_MAX];
/* 0x1C4 */ ColliderCylinder collider;
/* 0x210 */ Actor* enemy;
- /* 0x214 */ u16 flags;
+ /* 0x214 */ u16 strayFairyFlags;
/* 0x216 */ s16 direction; // negative when facing right, positive when facing left
/* 0x218 */ s16 area;
/* 0x21C */ s32 timer;
diff --git a/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
index 9a58673d0..716237321 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
@@ -38,7 +38,7 @@ void EnEndingHero4_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
this->actor.targetMode = 6;
this->actor.gravity = -3.0f;
- SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkeleton, &gSoldierCheerWithSpear, this->jointTable,
+ SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkel, &gSoldierCheerWithSpear, this->jointTable,
this->morphTable, 17);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
func_80C23748(this);
diff --git a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
index e22603b4e..d6da2f978 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
@@ -37,9 +37,9 @@ const ActorInit En_Ending_Hero6_InitVars = {
};
static FlexSkeletonHeader* sSkeletons[] = {
- &object_dt_Skel_00B0CC, &object_bai_Skel_007908, &object_toryo_Skel_007150,
- &gSoldierSkeleton, &object_daiku_Skel_00A850, &object_daiku_Skel_00A850,
- &object_daiku_Skel_00A850, &object_daiku_Skel_00A850, &object_daiku_Skel_00A850,
+ &object_dt_Skel_00B0CC, &object_bai_Skel_007908, &object_toryo_Skel_007150, &gSoldierSkel,
+ &object_daiku_Skel_00A850, &object_daiku_Skel_00A850, &object_daiku_Skel_00A850, &object_daiku_Skel_00A850,
+ &object_daiku_Skel_00A850,
};
static AnimationHeader* sAnimations[] = {
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 7463eaab1..0aabfc969 100644
--- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
+++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
@@ -4938,7 +4938,7 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
} else {
if ((D_809171CC >= 60.0f) && !(gSaveContext.save.unk_EE4 & 0x800)) {
gSaveContext.save.unk_EE4 |= 0x800;
- getItemId = GI_SCALE_GOLD;
+ getItemId = GI_SKULL_TOKEN;
sSinkingLureLocation = Rand_ZeroFloat(3.999f) + 1.0f;
}
}
@@ -4997,7 +4997,7 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->unk_154 = 24;
} else {
- Actor_PickUp(&this->actor, play, GI_SCALE_GOLD, 2000.0f, 1000.0f);
+ Actor_PickUp(&this->actor, play, GI_SKULL_TOKEN, 2000.0f, 1000.0f);
}
break;
diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
index 03a15ad5b..38ef56ecb 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
@@ -370,7 +370,7 @@ void func_80B0FE7C(PlayState* play) {
}
void func_80B0FEBC(EnGb2* this, PlayState* play) {
- if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.unk1202E == 7)) {
+ if ((play->msgCtx.ocarinaMode == OCARINA_SONG_ELEGY) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
play->msgCtx.ocarinaMode = 4;
gSaveContext.eventInf[4] |= 0x80;
this->unk_26E = 0x14D1;
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 7e7c7306e..04acac9dc 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
@@ -399,7 +399,7 @@ void func_80B359DC(EnGg* this, PlayState* play) {
}
if ((player->transformation == PLAYER_FORM_HUMAN) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.unk1202E == 7)) {
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
if (!(gSaveContext.save.weekEventReg[19] & 0x80)) {
gSaveContext.save.weekEventReg[19] |= 0x80;
}
diff --git a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
index bc95efecd..74486b30c 100644
--- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
+++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
@@ -138,16 +138,16 @@ static ShopItemEntry sShopItemEntries[] = {
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOTTLE, GID_BOTTLE, func_800B8050, 1, 0x29F8, 0x29F9, GI_BOTTLE_STOLEN, EnGirlA_CanBuyBottleStolen,
EnGirlA_BuyBottle, EnGirlA_BuyFanfare },
- { OBJECT_GI_SWORD_4, GID_SWORD_GREAT_FAIRY, func_800B8050, 4, 0x29F2, 0x29F3, GI_SWORD_GREAT_FAIRY,
+ { OBJECT_GI_SWORD_4, GID_SWORD_GREAT_FAIRY, func_800B8050, 4, 0x29F2, 0x29F3, GI_SWORD_GREAT_FAIRY_STOLEN,
EnGirlA_CanBuySword, EnGirlA_BuySword, EnGirlA_BuyFanfare },
- { OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, func_800B8050, 1, 0x29F4, 0x29F5, GI_SWORD_KOKIRI, EnGirlA_CanBuySword,
+ { OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, func_800B8050, 1, 0x29F4, 0x29F5, GI_SWORD_KOKIRI_STOLEN,
+ EnGirlA_CanBuySword, EnGirlA_BuySword, EnGirlA_BuyFanfare },
+ { OBJECT_GI_SWORD_2, GID_SWORD_RAZOR, func_800B8050, 2, 0x29F4, 0x29F5, GI_SWORD_RAZOR_STOLEN, EnGirlA_CanBuySword,
EnGirlA_BuySword, EnGirlA_BuyFanfare },
- { OBJECT_GI_SWORD_2, GID_SWORD_RAZOR, func_800B8050, 2, 0x29F4, 0x29F5, GI_SWORD_RAZOR, EnGirlA_CanBuySword,
- EnGirlA_BuySword, EnGirlA_BuyFanfare },
- { OBJECT_GI_SWORD_3, GID_SWORD_GILDED, func_800B8050, 3, 0x29F4, 0x29F5, GI_SWORD_GILDED, EnGirlA_CanBuySword,
- EnGirlA_BuySword, EnGirlA_BuyFanfare },
- { OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0x29F6, 0x29F7, GI_SHIELD_HERO_2, EnGirlA_CanBuyShieldHero,
- EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
+ { OBJECT_GI_SWORD_3, GID_SWORD_GILDED, func_800B8050, 3, 0x29F4, 0x29F5, GI_SWORD_GILDED_STOLEN,
+ EnGirlA_CanBuySword, EnGirlA_BuySword, EnGirlA_BuyFanfare },
+ { OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0x29F6, 0x29F7, GI_SHIELD_HERO_STOLEN,
+ EnGirlA_CanBuyShieldHero, EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, func_800B8050, 1, 0x29F6, 0x29F7, GI_SHIELD_MIRROR,
EnGirlA_CanBuyShieldMirror, EnGirlA_BuyShieldMirror, EnGirlA_BuyFanfare },
};
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 2ab7b2694..3f00e0c0c 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -256,7 +256,7 @@ s32 func_80B50854(EnGk* this, PlayState* play) {
}
if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.unk1202E == 1)) {
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY)) {
Flags_SetSwitch(play, ENGK_GET_3F00(&this->actor));
this->unk_2E4 = 3;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 3);
@@ -506,7 +506,7 @@ void func_80B51410(EnGk* this, PlayState* play) {
if (this->actor.xzDistToPlayer < 100.0f) {
if ((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.unk1202E == 0xE)) {
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY_INTRO)) {
this->unk_1E4 |= 0x20;
}
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 8bd09d36f..1019062c6 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.c
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.c
@@ -535,7 +535,8 @@ s32 func_80A1222C(EnGo* this, PlayState* play) {
s32 ret = false;
if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.unk1202E == 1) && (this->unk_3EC == 0) && (this->actor.xzDistToPlayer < 400.0f)) ||
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->unk_3EC == 0) &&
+ (this->actor.xzDistToPlayer < 400.0f)) ||
(!(gSaveContext.save.weekEventReg[22] & 4) && (play->sceneNum == SCENE_16GORON_HOUSE) &&
(gSaveContext.sceneSetupIndex == 0) && (this->unk_3EC == 0) && (play->csCtx.currentCsIndex == 1))) {
ret = true;
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 db3639c27..1fa6a22a7 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c
@@ -275,9 +275,9 @@ void func_80998040(EnGs* this, PlayState* play) {
void func_8099807C(EnGs* this, PlayState* play) {
switch (play->msgCtx.ocarinaMode) {
case 3:
- switch (play->msgCtx.unk1202E) {
- case 7:
- case 8:
+ switch (play->msgCtx.lastPlayedSong) {
+ case OCARINA_SONG_HEALING:
+ case OCARINA_SONG_EPONAS:
if (!Flags_GetSwitch(play, this->unk_196)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, this->actor.world.pos.x,
this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0, 2);
@@ -286,7 +286,7 @@ void func_8099807C(EnGs* this, PlayState* play) {
}
break;
- case 10:
+ case OCARINA_SONG_STORMS:
if (!Flags_GetSwitch(play, this->unk_196)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, this->actor.world.pos.x,
this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0, 7);
@@ -295,7 +295,7 @@ void func_8099807C(EnGs* this, PlayState* play) {
}
break;
- case 0:
+ case OCARINA_SONG_SONATA:
if ((this->actor.params == ENGS_1) && (gSaveContext.save.playerForm == PLAYER_FORM_DEKU)) {
this->unk_194 = 1;
this->unk_19C = 5;
@@ -305,7 +305,7 @@ void func_8099807C(EnGs* this, PlayState* play) {
}
break;
- case 2:
+ case OCARINA_SONG_NEW_WAVE:
if ((this->actor.params == ENGS_1) && (gSaveContext.save.playerForm == PLAYER_FORM_ZORA)) {
this->unk_194 = 3;
this->unk_19C = 5;
@@ -315,7 +315,7 @@ void func_8099807C(EnGs* this, PlayState* play) {
}
break;
- case 1:
+ case OCARINA_SONG_GORON_LULLABY:
if ((this->actor.params == ENGS_1) && (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
this->unk_194 = 2;
this->unk_19C = 5;
@@ -657,7 +657,7 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
if (this->unk_19D == 2) {
this->unk_19E[0].y += (s32)(this->unk_1DC * (0x10000 / 360.0f));
- if ((this->unk_1D4++ <= 40) ^ 1) {
+ if (this->unk_1D4++ > 40) {
this->unk_1DC = this->unk_1B0[0].y - 1.0f;
this->unk_1E0 = 1.5f;
this->unk_1E4 = this->unk_1B0[1].y - 1.0f;
@@ -825,7 +825,7 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
func_800B9010(&this->actor, NA_SE_EV_FIRE_PILLAR - SFX_FLAG);
- if ((this->unk_1D4++ < 40) ^ 1) {
+ if (this->unk_1D4++ >= 40) {
this->unk_19A |= 0x10;
this->actor.uncullZoneForward = 12000.0f;
diff --git a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
index 74693be4e..aba6b4f90 100644
--- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
+++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
@@ -5,7 +5,6 @@
*/
#include "z_en_heishi.h"
-#include "objects/object_sdn/object_sdn.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
@@ -65,8 +64,8 @@ void EnHeishi_Init(Actor* thisx, PlayState* play) {
EnHeishi* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkeleton, &gSoldierWave, this->jointTable, this->morphTable,
- HEISHI_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gSoldierSkel, &gSoldierWave, this->jointTable, this->morphTable,
+ SOLDIER_LIMB_MAX);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->paramsCopy = this->actor.params;
this->yawTowardsPlayer = this->actor.world.rot.y;
@@ -174,7 +173,7 @@ void EnHeishi_Update(Actor* thisx, PlayState* play) {
s32 EnHeishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnHeishi* this = THIS;
- if (limbIndex == HEISHI_LIMB_HEAD) {
+ if (limbIndex == SOLDIER_LIMB_HEAD) {
rot->x += this->headRotX;
rot->y += this->headRotY;
rot->z += this->headRotZ;
diff --git a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h
index 6e5d65e8f..1758ceae6 100644
--- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h
+++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.h
@@ -2,37 +2,17 @@
#define Z_EN_HEISHI_H
#include "global.h"
+#include "objects/object_sdn/object_sdn.h"
struct EnHeishi;
typedef void (*EnHeishiActionFunc)(struct EnHeishi*, PlayState*);
-typedef enum {
- /* 0 */ HEISHI_LIMB_NONE,
- /* 1 */ HEISHI_LIMB_ROOT,
- /* 2 */ HEISHI_LIMB_PELVIS,
- /* 3 */ HEISHI_LIMB_LEFT_THIGH,
- /* 4 */ HEISHI_LIMB_LEFT_CALF,
- /* 5 */ HEISHI_LIMB_LEFT_FOOT,
- /* 6 */ HEISHI_LIMB_RIGHT_THIGH,
- /* 7 */ HEISHI_LIMB_RIGHT_CALF,
- /* 8 */ HEISHI_LIMB_RIGHT_FOOT,
- /* 9 */ HEISHI_LIMB_TORSO,
- /* 10 */ HEISHI_LIMB_LEFT_SHOULDER,
- /* 11 */ HEISHI_LIMB_LEFT_FOREARM,
- /* 12 */ HEISHI_LIMB_LEFT_HAND,
- /* 13 */ HEISHI_LIMB_RIGHT_SHOULDER,
- /* 14 */ HEISHI_LIMB_RIGHT_FOREARM,
- /* 15 */ HEISHI_LIMB_RIGHT_HAND_WITH_SPEAR,
- /* 16 */ HEISHI_LIMB_HEAD,
- /* 17 */ HEISHI_LIMB_MAX
-} EnHeishiLimbs;
-
typedef struct EnHeishi {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
- /* 0x188 */ Vec3s jointTable[HEISHI_LIMB_MAX];
- /* 0x1EE */ Vec3s morphTable[HEISHI_LIMB_MAX];
+ /* 0x188 */ Vec3s jointTable[SOLDIER_LIMB_MAX];
+ /* 0x1EE */ Vec3s morphTable[SOLDIER_LIMB_MAX];
/* 0x254 */ EnHeishiActionFunc actionFunc;
/* 0x258 */ s16 headRotY;
/* 0x25A */ s16 headRotX;
diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.c b/src/overlays/actors/ovl_En_Hg/z_en_hg.c
index d3af20a41..8c0be4adf 100644
--- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c
+++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c
@@ -1,11 +1,10 @@
/*
* File: z_en_hg.c
* Overlay: ovl_En_Hg
- * Description: Pamela's Father (Human)
+ * Description: Pamela's Father (Gibdo)
*/
#include "z_en_hg.h"
-#include "objects/object_harfgibud/object_harfgibud.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
@@ -121,8 +120,8 @@ void EnHg_Init(Actor* thisx, PlayState* play) {
s32 i;
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 36.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_harfgibud_Skel_008580, &object_harfgibud_Anim_00260C,
- this->jointTable, this->morphTable, HG_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gHarfgibudGibdoSkel, &object_harfgibud_Anim_00260C, this->jointTable,
+ this->morphTable, HARFGIBUD_GIBDO_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit2);
@@ -358,7 +357,8 @@ void func_80BCFC0C(EnHg* this, PlayState* play) {
D_80BD00C8 = false;
}
if (play->msgCtx.ocarinaMode == 3) {
- if (play->msgCtx.unk1202E == 7 && gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING &&
+ gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
if (INV_CONTENT(ITEM_MASK_GIBDO) == ITEM_MASK_GIBDO) {
this->unk218 = 3;
} else {
@@ -401,9 +401,9 @@ s32 EnHg_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
void EnHg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnHg* this = THIS;
- if (limbIndex == HG_LIMB_HEAD) {
+ if (limbIndex == HARFGIBUD_GIBDO_LIMB_EYEBROWS) {
Matrix_Get(&this->unk1D8);
- } else if (limbIndex == HG_LIMB_PELVIS) {
+ } else if (limbIndex == HARFGIBUD_GIBDO_LIMB_HEAD) {
Matrix_MultZero(&this->actor.focus.pos);
}
}
@@ -417,6 +417,6 @@ void EnHg_Draw(Actor* thisx, PlayState* play) {
EnHg_OverrideLimbDraw, EnHg_PostLimbDraw, &this->actor);
Matrix_Put(&this->unk1D8);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, object_harfgibud_DL_005E28);
+ gSPDisplayList(POLY_OPA_DISP++, gHarfgibudGibdoEyebrowsDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.h b/src/overlays/actors/ovl_En_Hg/z_en_hg.h
index 75703ccbd..288314379 100644
--- a/src/overlays/actors/ovl_En_Hg/z_en_hg.h
+++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.h
@@ -2,34 +2,13 @@
#define Z_EN_HG_H
#include "global.h"
+#include "objects/object_harfgibud/object_harfgibud.h"
+
struct EnHg;
typedef void (*EnHgActionFunc)(struct EnHg*, PlayState*);
-typedef enum {
- /* 00 */ HG_LIMB_NONE,
- /* 01 */ HG_LIMB_ABDOMEN,
- /* 02 */ HG_LIMB_CHEST,
- /* 03 */ HG_LIMB_SHOULDER_LEFT,
- /* 04 */ HG_LIMB_ARM_LEFT,
- /* 05 */ HG_LIMB_HAND_LEFT,
- /* 06 */ HG_LIMB_SHOULDER_RIGHT,
- /* 07 */ HG_LIMB_ARM_RIGHT,
- /* 08 */ HG_LIMB_HAND_RIGHT,
- /* 09 */ HG_LIMB_EYEBROW,
- /* 10 */ HG_LIMB_HEAD,
- /* 11 */ HG_LIMB_PELVIS,
- /* 12 */ HG_LIMB_THIGH_LEFT,
- /* 13 */ HG_LIMB_LEG_LEFT,
- /* 14 */ HG_LIMB_FOOT_LEFT,
- /* 15 */ HG_LIMB_THIGH_RIGHT,
- /* 16 */ HG_LIMB_LEG_RIGHT,
- /* 17 */ HG_LIMB_FOOT_RIGHT,
- /* 19 */ HG_LIMB_UNK,
- /* 20 */ HG_LIMB_MAX,
-} ObjectHgLimbs;
-
typedef struct EnHg {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
@@ -38,8 +17,8 @@ typedef struct EnHg {
/* 0x1D8 */ MtxF unk1D8;
/* 0x218 */ s32 unk218;
/* 0x21C */ s32 currentAnimation;
- /* 0x220 */ Vec3s jointTable[HG_LIMB_MAX];
- /* 0x292 */ Vec3s morphTable[HG_LIMB_MAX];
+ /* 0x220 */ Vec3s jointTable[HARFGIBUD_GIBDO_LIMB_MAX];
+ /* 0x292 */ Vec3s morphTable[HARFGIBUD_GIBDO_LIMB_MAX];
/* 0x304 */ UNK_TYPE1 pad304[0xC];
/* 0x310 */ u16 cutscenes[4];
} EnHg; // size = 0x318
diff --git a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
index 0c9952149..c8de1f210 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
@@ -1,11 +1,10 @@
/*
* File: z_en_hgo.c
* Overlay: ovl_En_Hgo
- * Description: Pamela's Father (Gibdo)
+ * Description: Pamela's Father (Human)
*/
#include "z_en_hgo.h"
-#include "objects/object_harfgibud/object_harfgibud.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
@@ -83,8 +82,8 @@ void EnHgo_Init(Actor* thisx, PlayState* play) {
s32 pad;
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_harfgibud_Skel_012A58, &object_harfgibud_Anim_00B644,
- this->jointTable, this->morphTable, HGO_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gHarfgibudHumanSkel, &object_harfgibud_Anim_00B644, this->jointTable,
+ this->morphTable, HARFGIBUD_HUMAN_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&thisx->colChkInfo, NULL, &sColChkInfoInit);
@@ -319,7 +318,7 @@ s32 func_80BD0898(EnHgo* this, PlayState* play) {
}
void func_80BD0B8C(EnHgo* this, PlayState* play) {
- Actor_TrackPlayer(play, &this->actor, &this->unk_300, &this->unk_306, this->actor.focus.pos);
+ Actor_TrackPlayer(play, &this->actor, &this->headRot, &this->torsoRot, this->actor.focus.pos);
if (this->unk_30E > 2) {
this->unk_30E--;
} else if (this->unk_30E == 2) {
@@ -341,7 +340,7 @@ void EnHgo_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
SkelAnime_Update(&this->skelAnime);
if (func_80BD0898(this, play)) {
- Actor_TrackNone(&this->unk_300, &this->unk_306);
+ Actor_TrackNone(&this->headRot, &this->torsoRot);
} else if (this->actionFunc != func_80BD0410) {
if (this->actionFunc != func_80BD0434) {
Collider_UpdateCylinder(&this->actor, &this->collider);
@@ -354,9 +353,9 @@ void EnHgo_Update(Actor* thisx, PlayState* play) {
s32 EnHgo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnHgo* this = THIS;
- if (limbIndex == HGO_LIMB_PELVIS) {
- rot->x += this->unk_300.y;
- rot->z += this->unk_300.x;
+ if (limbIndex == HARFGIBUD_HUMAN_LIMB_HEAD) {
+ rot->x += this->headRot.y;
+ rot->z += this->headRot.x;
}
return false;
}
@@ -364,7 +363,7 @@ s32 EnHgo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnHgo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* pos, Actor* thisx) {
EnHgo* this = THIS;
- if (limbIndex == HGO_LIMB_PELVIS) {
+ if (limbIndex == HARFGIBUD_HUMAN_LIMB_HEAD) {
Matrix_Get(&this->unk_1D8);
Matrix_MultZero(&this->actor.focus.pos);
}
@@ -380,6 +379,6 @@ void EnHgo_Draw(Actor* thisx, PlayState* play) {
EnHgo_OverrideLimbDraw, &EnHgo_PostLimbDraw, &this->actor);
Matrix_Put(&this->unk_1D8);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, object_harfgibud_DL_00F248);
+ gSPDisplayList(POLY_OPA_DISP++, gHarfgibudHumanEyebrowsDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h
index 994dabcfb..34e4ebdc4 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h
@@ -2,35 +2,12 @@
#define Z_EN_HGO_H
#include "global.h"
+#include "objects/object_harfgibud/object_harfgibud.h"
struct EnHgo;
typedef void (*EnHgoActionFunc)(struct EnHgo*, PlayState*);
-// Shares the same setup as en_hg
-typedef enum {
- /* 00 */ HGO_LIMB_NONE,
- /* 01 */ HGO_LIMB_ABDOMEN,
- /* 02 */ HGO_LIMB_CHEST,
- /* 03 */ HGO_LIMB_SHOULDER_LEFT,
- /* 04 */ HGO_LIMB_ARM_LEFT,
- /* 05 */ HGO_LIMB_HAND_LEFT,
- /* 06 */ HGO_LIMB_SHOULDER_RIGHT,
- /* 07 */ HGO_LIMB_ARM_RIGHT,
- /* 08 */ HGO_LIMB_HAND_RIGHT,
- /* 09 */ HGO_LIMB_EYEBROW,
- /* 10 */ HGO_LIMB_HEAD,
- /* 11 */ HGO_LIMB_PELVIS,
- /* 12 */ HGO_LIMB_THIGH_LEFT,
- /* 13 */ HGO_LIMB_LEG_LEFT,
- /* 14 */ HGO_LIMB_FOOT_LEFT,
- /* 15 */ HGO_LIMB_THIGH_RIGHT,
- /* 16 */ HGO_LIMB_LEG_RIGHT,
- /* 17 */ HGO_LIMB_FOOT_RIGHT,
- /* 18 */ HGO_LIMB_UNK,
- /* 19 */ HGO_LIMB_MAX,
-} ObjectHgoLimbs;
-
typedef struct EnHgo {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
@@ -38,10 +15,10 @@ typedef struct EnHgo {
/* 0x1D4 */ EnHgoActionFunc actionFunc;
/* 0x1D8 */ MtxF unk_1D8;
/* 0x218 */ s32 unk_218;
- /* 0x21C */ Vec3s jointTable[HGO_LIMB_MAX];
- /* 0x28E */ Vec3s morphTable[HGO_LIMB_MAX];
- /* 0x300 */ Vec3s unk_300;
- /* 0x306 */ Vec3s unk_306;
+ /* 0x21C */ Vec3s jointTable[HARFGIBUD_HUMAN_LIMB_MAX];
+ /* 0x28E */ Vec3s morphTable[HARFGIBUD_HUMAN_LIMB_MAX];
+ /* 0x300 */ Vec3s headRot;
+ /* 0x306 */ Vec3s torsoRot; // Set, but not used
/* 0x30C */ s16 unk_30C;
/* 0x30E */ s16 unk_30E;
/* 0x310 */ s16 unk_310;
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 e07b8ac70..50f0c1e1e 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
@@ -182,7 +182,7 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
}
if (!(this->actor.xzDistToPlayer > 120.0f)) {
- if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.unk1202E == 0)) {
+ if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA)) {
play->msgCtx.ocarinaMode = 4;
func_80BDB788(this);
} else if (func_801A5100() == 2) {
diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
index 0e63d87c1..1922a2f4b 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
@@ -6,6 +6,8 @@
#include "z_en_horse.h"
#include "z64rumble.h"
+#include "overlays/actors/ovl_En_In/z_en_in.h"
+#include "overlays/actors/ovl_Obj_Um/z_obj_um.h"
#include "overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h"
#include "objects/object_horse_link_child/object_horse_link_child.h"
@@ -122,7 +124,9 @@ static AnimationHeader** sAnimationHeaders[] = {
NULL, NULL, sEponaAnimHeaders, sHniAnimHeaders, sHniAnimHeaders,
};
-static f32 sPlaybackSpeeds[] = { 2.0f / 3.0f, 2.0f / 3.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 2.0f / 3.0f, 2.0f / 3.0f };
+static f32 sPlaybackSpeeds[] = {
+ 2.0f / 3.0f, 2.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 3.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f,
+};
static SkeletonHeader* sSkeletonHeaders[] = {
NULL, NULL, &object_horse_link_child_Skel_00A480, NULL, NULL,
@@ -468,7 +472,7 @@ void EnHorse_PlayWalkingSound(EnHorse* this) {
return;
}
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_WALK);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_WALK);
@@ -482,7 +486,7 @@ void EnHorse_PlayWalkingSound(EnHorse* this) {
}
void func_8087C178(EnHorse* this) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
@@ -490,7 +494,7 @@ void func_8087C178(EnHorse* this) {
}
void func_8087C1C0(EnHorse* this) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
@@ -546,19 +550,19 @@ s32 func_8087C38C(PlayState* play, EnHorse* this, Vec3f* arg2) {
void EnHorse_IdleAnimSounds(EnHorse* this, PlayState* play) {
if ((this->animationIdx == ENHORSE_ANIM_IDLE) &&
- (((this->curFrame > 35.0f) && (this->type == HORSE_EPONA)) ||
- ((this->curFrame > 28.0f) && (this->type == HORSE_HNI)) ||
- ((this->curFrame > 25.0f) && (this->type == HORSE_2))) &&
+ (((this->curFrame > 35.0f) && (this->type == HORSE_TYPE_EPONA)) ||
+ ((this->curFrame > 28.0f) && (this->type == HORSE_TYPE_HNI)) ||
+ ((this->curFrame > 25.0f) && (this->type == HORSE_TYPE_2))) &&
!(this->stateFlags & ENHORSE_SANDDUST_SOUND)) {
this->stateFlags |= ENHORSE_SANDDUST_SOUND;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
}
} else if ((this->animationIdx == 3) && (this->curFrame > 25.0f) && !(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
@@ -694,8 +698,8 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
this->unk_3E8 = 0.0f;
this->unk_528 = 100.0f;
- if (ENHORSE_GET_8000(&this->actor)) {
- this->type = HORSE_4;
+ if (ENHORSE_IS_DONKEY_TYPE(&this->actor)) {
+ this->type = HORSE_TYPE_DONKEY;
this->unk_528 = 80.0f;
this->boostSpeed = 12;
if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HA)) < 0) {
@@ -704,8 +708,8 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
}
this->unk_1EC |= 1;
thisx->update = func_8087D540;
- } else if (ENHORSE_GET_4000(&this->actor)) {
- this->type = HORSE_2;
+ } else if (ENHORSE_IS_4000_TYPE(&this->actor)) {
+ this->type = HORSE_TYPE_2;
this->unk_528 = 64.8f;
this->boostSpeed = 15;
if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HORSE_LINK_CHILD)) < 0) {
@@ -717,8 +721,8 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
} else {
thisx->update = func_8087D540;
}
- } else if (ENHORSE_GET_2000(&this->actor)) {
- this->type = HORSE_3;
+ } else if (ENHORSE_IS_BANDIT_TYPE(&this->actor)) {
+ this->type = HORSE_TYPE_BANDIT;
this->boostSpeed = 12;
if ((this->bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HA)) < 0) {
Actor_MarkForDeath(&this->actor);
@@ -727,14 +731,14 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
this->unk_1EC |= 1;
thisx->update = func_8087D540;
} else {
- this->type = HORSE_EPONA;
+ this->type = HORSE_TYPE_EPONA;
this->boostSpeed = 15;
Actor_MarkForDeath(&this->actor);
}
- thisx->params &= ~0xE000;
- if (thisx->params == 0x1FFF) {
- thisx->params = ENHORSE_1;
+ this->actor.params &= ~(ENHORSE_PARAM_DONKEY | ENHORSE_PARAM_4000 | ENHORSE_PARAM_BANDIT);
+ if (this->actor.params == 0x1FFF) {
+ this->actor.params = ENHORSE_1;
}
if (thisx->params == ENHORSE_3) {
@@ -780,9 +784,9 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
this->action = ENHORSE_ACT_IDLE;
thisx->speedXZ = 0.0f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
sJntSphInit.elements[0].dim.limb = 13;
- } else if ((this->type == HORSE_3) || (this->type == HORSE_4)) {
+ } else if ((this->type == HORSE_TYPE_BANDIT) || (this->type == HORSE_TYPE_DONKEY)) {
sJntSphInit.elements[0].dim.limb = 10;
}
@@ -793,19 +797,19 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
Collider_InitJntSph(play, &this->colliderJntSph);
Collider_SetJntSph(play, &this->colliderJntSph, &this->actor, &sJntSphInit, this->colliderJntSphElements);
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
this->colliderCylinder1.dim.radius = this->colliderCylinder1.dim.radius * 0.8f;
this->colliderCylinder2.dim.radius = this->colliderCylinder2.dim.radius * 0.8f;
this->colliderJntSph.elements[0].dim.modelSphere.radius *= 0.6f;
- } else if (this->type == HORSE_4) {
+ } else if (this->type == HORSE_TYPE_DONKEY) {
this->colliderCylinder1.dim.radius = 50;
}
CollisionCheck_SetInfo(&thisx->colChkInfo, NULL, &sColChkInfoInit);
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Actor_SetScale(&this->actor, 0.00648f);
- } else if (this->type == HORSE_4) {
+ } else if (this->type == HORSE_TYPE_DONKEY) {
Actor_SetScale(&this->actor, 0.008f);
} else {
Actor_SetScale(&this->actor, 0.01f);
@@ -889,7 +893,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
thisx->world.rot.z = thisx->shape.rot.z;
thisx->home.rot.z = thisx->shape.rot.z;
this->unk_3EC = thisx->world.rot.y;
- this->unk_538 = 0;
+ this->unk_538 = OBJ_UM_ANIM_TROT;
if (this->unk_1EC & 0x100) {
this->colliderCylinder1.base.colType = COLTYPE_HIT3;
@@ -903,6 +907,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
}
}
+// EnHorse_WaitForObject
void func_8087D540(Actor* thisx, PlayState* play) {
EnHorse* this = THIS;
@@ -911,7 +916,7 @@ void func_8087D540(Actor* thisx, PlayState* play) {
Actor_SetObjectDependency(play, &this->actor);
this->actor.update = EnHorse_Update;
if (this->unk_1EC & 1) {
- if (this->type == HORSE_3) {
+ if (this->type == HORSE_TYPE_BANDIT) {
SkelAnime_InitFlex(play, &this->skin.skelAnime, &object_ha_Skel_008C68, NULL, this->jointTable,
this->morphTable, OBJECT_HA_1_LIMB_MAX);
} else {
@@ -1097,11 +1102,11 @@ void EnHorse_StartMountedIdle(EnHorse* this) {
this->action = ENHORSE_ACT_MOUNTED_TURN;
this->animationIdx = ENHORSE_ANIM_IDLE;
- if (((this->curFrame > 35.0f) && (this->type == HORSE_EPONA)) ||
- ((this->curFrame > 28.0f) && (this->type == HORSE_HNI))) {
+ if (((this->curFrame > 35.0f) && (this->type == HORSE_TYPE_EPONA)) ||
+ ((this->curFrame > 28.0f) && (this->type == HORSE_TYPE_HNI))) {
if (!(this->stateFlags & ENHORSE_SANDDUST_SOUND)) {
this->stateFlags |= ENHORSE_SANDDUST_SOUND;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
@@ -1152,7 +1157,7 @@ void EnHorse_MountedIdleWhinney(EnHorse* this) {
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animationIdx], 1.0f, curFrame,
Animation_GetLastFrame(sAnimationHeaders[this->type][1]), ANIMMODE_ONCE, -3.0f);
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
@@ -1437,7 +1442,7 @@ void EnHorse_StartRearing(EnHorse* this) {
if (sAnimationHeaders[this->type][this->animationIdx] == NULL) {
if (Rand_ZeroOne() > 0.5f) {
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -1451,7 +1456,7 @@ void EnHorse_StartRearing(EnHorse* this) {
this->stateFlags &= ~ENHORSE_LAND2_SOUND;
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -1471,7 +1476,7 @@ void EnHorse_MountedRearing(EnHorse* this, PlayState* play) {
if (this->curFrame > 25.0f) {
if (!(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
@@ -1511,7 +1516,7 @@ void EnHorse_StartBraking(EnHorse* this, PlayState* play) {
if (sAnimationHeaders[this->type][this->animationIdx] == NULL) {
if (Rand_ZeroOne() > 0.5f) {
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -1523,7 +1528,7 @@ void EnHorse_StartBraking(EnHorse* this, PlayState* play) {
EnHorse_StartMountedIdleResetAnim(this);
}
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_SLIP);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_SLIP);
@@ -1548,7 +1553,7 @@ void EnHorse_Stopping(EnHorse* this, PlayState* play) {
if ((Rand_ZeroOne() > 0.5f) &&
((gSaveContext.save.entranceIndex != 0x6400) || !Cutscene_GetSceneSetupIndex(play))) {
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -1681,7 +1686,7 @@ void EnHorse_StartLowJump(EnHorse* this, PlayState* play) {
y = jointTable->y;
this->riderPos.y -= ((y * 0.01f) * this->unk_528) * 0.01f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
@@ -1740,7 +1745,7 @@ void EnHorse_LowJump(EnHorse* this, PlayState* play) {
if (SkelAnime_Update(&this->skin.skelAnime) ||
((curFrame > 17.0f) &&
(this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
@@ -1779,7 +1784,7 @@ void EnHorse_StartHighJump(EnHorse* this, PlayState* play) {
this->riderPos.y -= ((y * 0.01f) * this->unk_528) * 0.01f;
this->stateFlags |= ENHORSE_CALC_RIDER_POS;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
@@ -1837,7 +1842,7 @@ void EnHorse_HighJump(EnHorse* this, PlayState* play) {
if (SkelAnime_Update(&this->skin.skelAnime) ||
((curFrame > 23.0f) &&
(this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
@@ -1862,10 +1867,10 @@ void EnHorse_InitInactive(EnHorse* this) {
}
void EnHorse_Inactive(EnHorse* this, PlayState* play) {
- if ((D_801BDAA4 != 0) && (this->type == HORSE_2)) {
+ if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
D_801BDAA4 = 0;
if (EnHorse_Spawn(this, play)) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
}
this->stateFlags &= ~ENHORSE_INACTIVE;
@@ -1901,7 +1906,7 @@ void EnHorse_PlayIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 sta
} else {
if (this->animationIdx == ENHORSE_ANIM_WHINNEY) {
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
@@ -1909,7 +1914,7 @@ void EnHorse_PlayIdleAnimation(EnHorse* this, s32 anim, f32 morphFrames, f32 sta
}
} else if (this->animationIdx == ENHORSE_ANIM_REARING) {
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -1942,11 +1947,11 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) {
this->actor.speedXZ = 0.0f;
EnHorse_IdleAnimSounds(this, play);
- if ((D_801BDAA4 != 0) && (this->type == HORSE_2)) {
+ if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
D_801BDAA4 = 0;
if (!func_8087C38C(play, this, &this->actor.world.pos)) {
if (EnHorse_Spawn(this, play)) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
@@ -1955,7 +1960,7 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) {
EnHorse_SetFollowAnimation(this, play);
}
} else {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
@@ -2067,7 +2072,7 @@ void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
if ((this->curFrame > 25.0f) && !(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
@@ -2099,7 +2104,7 @@ void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
if (this->followTimer > 300) {
EnHorse_StartIdleRidable(this);
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -2179,14 +2184,14 @@ void EnHorse_UpdateIngoHorseAnim(EnHorse* this) {
animSpeed = this->actor.speedXZ * 0.5f;
} else if (this->animationIdx == ENHORSE_ANIM_TROT) {
animSpeed = this->actor.speedXZ * 0.25f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
} else if (this->animationIdx == ENHORSE_ANIM_GALLOP) {
animSpeed = this->actor.speedXZ * 0.2f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
@@ -2259,7 +2264,7 @@ void func_80881290(EnHorse* this, PlayState* play) {
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
this->jumpStartY = this->actor.world.pos.y;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
@@ -2299,7 +2304,7 @@ void func_80881398(EnHorse* this, PlayState* play) {
if (animeUpdated || ((curFrame > 17.0f) &&
(this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
@@ -2371,14 +2376,14 @@ void func_8088168C(EnHorse* this) {
animSpeed = this->actor.speedXZ * 0.5f;
} else if (this->animationIdx == ENHORSE_ANIM_TROT) {
animSpeed = this->actor.speedXZ * 0.25f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
}
} else if (this->animationIdx == ENHORSE_ANIM_GALLOP) {
animSpeed = this->actor.speedXZ * 0.2f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
@@ -2516,7 +2521,7 @@ void EnHorse_CsPlayHighJumpAnim(EnHorse* this, PlayState* play) {
this->riderPos.y -= y * 0.01f * this->unk_528 * 0.01f;
this->stateFlags |= ENHORSE_ANIM_HIGH_JUMP;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_JUMP);
@@ -2566,7 +2571,7 @@ void EnHorse_CsJump(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
((curFrame > 19.0f) &&
(this->actor.world.pos.y < ((this->actor.floorHeight - this->actor.velocity.y) + 80.0f)))) {
this->cutsceneFlags |= 1;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_LAND);
@@ -2595,7 +2600,7 @@ void EnHorse_CsRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction* act
this->cutsceneFlags &= ~4;
this->stateFlags &= ~ENHORSE_LAND2_SOUND;
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -2610,7 +2615,7 @@ void EnHorse_CsRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action)
if (this->curFrame > 25.0f) {
if (!(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
@@ -2688,7 +2693,7 @@ void EnHorse_CsWarpRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction*
this->stateFlags &= ~ENHORSE_LAND2_SOUND;
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -2703,7 +2708,7 @@ void EnHorse_CsWarpRearing(EnHorse* this, PlayState* play, CsCmdActorAction* act
if (this->curFrame > 25.0f) {
if (!(this->stateFlags & ENHORSE_LAND2_SOUND)) {
this->stateFlags |= ENHORSE_LAND2_SOUND;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
@@ -2860,7 +2865,7 @@ void EnHorse_UpdateHbaAnim(EnHorse* this) {
animSpeed = this->actor.speedXZ * 0.5f;
} else if (this->animationIdx == ENHORSE_ANIM_TROT) {
animSpeed = this->actor.speedXZ * 0.25f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
@@ -2868,7 +2873,7 @@ void EnHorse_UpdateHbaAnim(EnHorse* this) {
Rumble_Request(0.0f, 60, 8, 255);
} else if (this->animationIdx == ENHORSE_ANIM_GALLOP) {
animSpeed = this->actor.speedXZ * 0.2f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_RUN);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_RUN);
@@ -2952,9 +2957,9 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
s32 animFinished;
s16 yaw;
- if ((D_801BDAA4 != 0) || (this->type == HORSE_HNI)) {
+ if ((D_801BDAA4 != 0) || (this->type == HORSE_TYPE_HNI)) {
EnHorse_StartIdleRidable(this);
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_HORSE_NEIGH);
@@ -3059,7 +3064,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
} else {
this->animationIdx = ENHORSE_ANIM_WHINNEY;
if (this->stateFlags & ENHORSE_DRAW) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_GROAN);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_GROAN);
@@ -3331,12 +3336,12 @@ void func_80884994(EnHorse* this) {
}
void func_80884A40(EnHorse* this, PlayState* play) {
- s32 sp44[] = { 5, 6, 0 };
+ s32 sp44[] = { ENHORSE_ANIM_TROT, ENHORSE_ANIM_GALLOP, ENHORSE_ANIM_IDLE };
s32 sp40;
s32 temp_v0;
if (this->animationIdx == ENHORSE_ANIM_WHINNEY) {
- temp_v0 = 0;
+ temp_v0 = ENHORSE_ANIM_IDLE;
} else {
temp_v0 = this->animationIdx;
}
@@ -3366,9 +3371,9 @@ void func_80884A40(EnHorse* this, PlayState* play) {
0.0f);
}
- if ((this->unk_538 == 0) || (this->unk_538 == 1)) {
+ if ((this->unk_538 == OBJ_UM_ANIM_TROT) || (this->unk_538 == OBJ_UM_ANIM_GALLOP)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HORSE_RUN);
- } else if (this->unk_538 == 2) {
+ } else if (this->unk_538 == OBJ_UM_ANIM_IDLE) {
if (this->animationIdx == ENHORSE_ANIM_IDLE) {
EnHorse_IdleAnimSounds(this, play);
} else if (this->animationIdx == ENHORSE_ANIM_WHINNEY) {
@@ -3392,6 +3397,7 @@ void func_80884D04(EnHorse* this, PlayState* play) {
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animationIdx]), ANIMMODE_ONCE, 0.0f);
}
+// Action func: EnHorse_UpdateBandit?
void func_80884E0C(EnHorse* this, PlayState* play) {
f32 playSpeed = (this->unk_56C * 0.2f * 0.5f) + 1.0f;
Vec3f pos;
@@ -3408,8 +3414,8 @@ void func_80884E0C(EnHorse* this, PlayState* play) {
}
this->unk_57C = this->actor.world.pos;
- this->actor.world.pos.x = this->unk_570.x;
- this->actor.world.pos.z = this->unk_570.z;
+ this->actor.world.pos.x = this->banditPosition.x;
+ this->actor.world.pos.z = this->banditPosition.z;
this->unk_56C = Math3D_Distance(&this->actor.world.pos, &this->actor.prevPos);
if (((this->unk_550 == 5) || (this->unk_550 == 7)) && (Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER)) {
@@ -3429,7 +3435,7 @@ void func_80884E0C(EnHorse* this, PlayState* play) {
}
this->actor.world.pos.y += this->actor.velocity.y * 0.5f;
} else {
- this->actor.world.pos.y = this->unk_570.y;
+ this->actor.world.pos.y = this->banditPosition.y;
}
}
@@ -3536,7 +3542,7 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) {
return;
}
- if (this->type != HORSE_2) {
+ if (this->type != HORSE_TYPE_2) {
EnHorse_Vec3fOffset(&this->actor.world.pos, this->actor.shape.rot.y, 30.0f, 55.0f, &frontPos);
} else {
EnHorse_Vec3fOffset(&this->actor.world.pos, this->actor.shape.rot.y, 15.0f, 30.0f, &frontPos);
@@ -3555,7 +3561,7 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) {
return;
}
- if (this->type != HORSE_2) {
+ if (this->type != HORSE_TYPE_2) {
EnHorse_Vec3fOffset(&this->actor.world.pos, this->actor.shape.rot.y, -30.0f, 55.0f, &backPos);
} else {
EnHorse_Vec3fOffset(&this->actor.world.pos, this->actor.shape.rot.y, -15.0f, 30.0f, &backPos);
@@ -3732,7 +3738,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
if ((this->actor.bgCheckFlags & 8) && (Math_CosS(this->actor.wallYaw - this->actor.world.rot.y) < -0.3f)) {
if (this->actor.speedXZ > 4.0f) {
this->actor.speedXZ -= 1.0f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
@@ -3749,7 +3755,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
this->unk_3E8 += ((-10.0f / this->actor.scale.y) - this->unk_3E8) * 0.5f;
if (this->actor.speedXZ > 2.0f) {
this->actor.speedXZ -= 1.0f;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
} else {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_SANDDUST);
@@ -3990,7 +3996,7 @@ void func_80886C00(EnHorse* this, PlayState* play) {
this->boostTimer = 0;
if (this->numBoosts == 0) {
this->boostRegenTime = 140;
- } else if (this->type == HORSE_EPONA) {
+ } else if (this->type == HORSE_TYPE_EPONA) {
if (this->stateFlags & ENHORSE_FIRST_BOOST_REGEN) {
this->boostRegenTime = 60;
this->stateFlags &= ~ENHORSE_FIRST_BOOST_REGEN;
@@ -4001,7 +4007,7 @@ void func_80886C00(EnHorse* this, PlayState* play) {
this->boostRegenTime = 70;
}
} else if ((this->stateFlags & ENHORSE_DRAW) && (Rand_ZeroOne() < 0.1f)) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -4056,7 +4062,7 @@ void EnHorse_RegenBoost(EnHorse* this, PlayState* play) {
if (this->boostTimer == 8) {
if ((Rand_ZeroOne() < 0.25f) && (this->stateFlags & ENHORSE_DRAW)) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -4175,9 +4181,9 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) {
Vec3f dustVel = { 0.0f, 1.0f, 0.0f };
Player* player = GET_PLAYER(play);
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Actor_SetScale(&this->actor, 0.00648f);
- } else if (this->type == HORSE_4) {
+ } else if (this->type == HORSE_TYPE_DONKEY) {
Actor_SetScale(&this->actor, 0.008f);
} else {
Actor_SetScale(&this->actor, 0.01f);
@@ -4258,7 +4264,7 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) {
}
if ((this->colliderJntSph.base.acFlags & AC_HIT) && (this->stateFlags & ENHORSE_DRAW)) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
} else {
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_HORSE_NEIGH);
@@ -4290,7 +4296,7 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) {
Collider_UpdateCylinder(&this->actor, &this->colliderCylinder1);
Collider_UpdateCylinder(&this->actor, &this->colliderCylinder2);
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
this->colliderCylinder1.dim.pos.x =
(s16)(Math_SinS(thisx->shape.rot.y) * 11.0f) + this->colliderCylinder1.dim.pos.x;
this->colliderCylinder1.dim.pos.z =
@@ -4456,7 +4462,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
f32 sp34;
if (!(this->stateFlags & ENHORSE_CALC_RIDER_POS)) {
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetVertexPos(skin, 5, 120, &this->riderPos);
this->riderPos.y += 13.0f;
} else {
@@ -4471,7 +4477,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
this->stateFlags &= ~ENHORSE_CALC_RIDER_POS;
}
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 13, &sp7C, &sp38);
} else {
Skin_GetLimbPos(skin, 13, &sp7C, &sp38);
@@ -4492,7 +4498,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
if (((curFrame > 10.0f) && (curFrame < 13.0f)) || ((curFrame > 25.0f) && (curFrame < 33.0f))) {
if (Rand_ZeroOne() < 0.02f) {
this->dustFlags |= 2;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 20, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 20, &hoofOffset, &sp64);
@@ -4502,7 +4508,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
if (Rand_ZeroOne() < 0.02f) {
this->dustFlags |= 1;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 28, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 28, &hoofOffset, &sp64);
@@ -4514,7 +4520,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
if (((curFrame > 6.0f) && (curFrame < 10.0f)) || ((curFrame > 23.0f) && (curFrame < 29.0f))) {
if (Rand_ZeroOne() < 0.02f) {
this->dustFlags |= 8;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 36, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 37, &hoofOffset, &sp64);
@@ -4526,7 +4532,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
if ((((curFrame > 7.0f) && (curFrame < 14.0f)) || ((curFrame > 26.0f) && (curFrame < 30.0f))) &&
(Rand_ZeroOne() < 0.02f)) {
this->dustFlags |= 4;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 44, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 45, &hoofOffset, &sp64);
@@ -4536,7 +4542,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
} else if (this->animationIdx == ENHORSE_ANIM_GALLOP) {
if ((curFrame > 14.0f) && (curFrame < 16.0f) && (Rand_ZeroOne() < 0.02f)) {
this->dustFlags |= 1;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 28, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 28, &hoofOffset, &sp64);
@@ -4544,7 +4550,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
EnHorse_RandomOffset(&sp64, 5.0f, &this->frontRightHoof);
} else if ((curFrame > 8.0f) && (curFrame < 10.0f) && (Rand_ZeroOne() < 0.02f)) {
this->dustFlags |= 2;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 20, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 20, &hoofOffset, &sp64);
@@ -4552,7 +4558,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
EnHorse_RandomOffset(&sp64, 10.0f, &this->frontLeftHoof);
} else if ((curFrame > 1.0f) && (curFrame < 3.0f) && (Rand_ZeroOne() < 0.02f)) {
this->dustFlags |= 4;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 44, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 45, &hoofOffset, &sp64);
@@ -4560,7 +4566,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
EnHorse_RandomOffset(&sp64, 10.0f, &this->backRightHoof);
} else if ((curFrame > 26.0f) && (curFrame < 28.0f) && (Rand_ZeroOne() < 0.02f)) {
this->dustFlags |= 8;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 36, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 37, &hoofOffset, &sp64);
@@ -4571,7 +4577,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
(Rand_ZeroOne() < (1.0f - ((curFrame - 6.0f) * (1.0f / 17.0f))))) {
if (Rand_ZeroOne() < 0.05f) {
this->dustFlags |= 8;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 36, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 37, &hoofOffset, &sp64);
@@ -4580,7 +4586,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
}
if (Rand_ZeroOne() < 0.02f) {
this->dustFlags |= 4;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 44, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 45, &hoofOffset, &sp64);
@@ -4591,7 +4597,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
if (Rand_ZeroOne() < (1.0f - ((curFrame - 5.0f) * 0.04f))) {
if (Rand_ZeroOne() < 0.05f) {
this->dustFlags |= 8;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 36, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 37, &hoofOffset, &sp64);
@@ -4601,7 +4607,7 @@ void EnHorse_PostDraw(Actor* thisx, PlayState* play, Skin* skin) {
if (Rand_ZeroOne() < 0.02f) {
this->dustFlags |= 4;
- if (this->type == HORSE_2) {
+ if (this->type == HORSE_TYPE_2) {
Skin_GetLimbPos(skin, 44, &hoofOffset, &sp64);
} else {
Skin_GetLimbPos(skin, 45, &hoofOffset, &sp64);
@@ -4649,12 +4655,12 @@ s32 EnHorse_OverrideLimbDraw(Actor* thisx, PlayState* play, s32 limbIndex, Skin*
OPEN_DISPS(play->state.gfxCtx);
- if ((limbIndex != 13) || (this->type != HORSE_EPONA)) {
- if ((limbIndex == 13) && (this->type == HORSE_2)) {
+ if ((limbIndex != 13) || (this->type != HORSE_TYPE_EPONA)) {
+ if ((limbIndex == 13) && (this->type == HORSE_TYPE_2)) {
u8 idx = D_80889210[this->blinkTimer];
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80889204[idx]));
- } else if ((this->type == HORSE_HNI) && (this->stateFlags & ENHORSE_FLAG_18) && (limbIndex == 30)) {
+ } else if ((this->type == HORSE_TYPE_HNI) && (this->stateFlags & ENHORSE_FLAG_18) && (limbIndex == 30)) {
drawOriginalLimb = false;
}
}
diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.h b/src/overlays/actors/ovl_En_Horse/z_en_horse.h
index a05e1a2c5..9f32331c6 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.h
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.h
@@ -3,11 +3,11 @@
#include "global.h"
#include "z64skin.h"
-#include "overlays/actors/ovl_En_In/z_en_in.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_ha/object_ha.h"
struct EnHorse;
+struct EnIn;
typedef void (*EnHorseActionFunc)(struct EnHorse*, PlayState*);
typedef void (*EnHorsePostdrawFunc)(struct EnHorse*, PlayState*);
@@ -97,18 +97,22 @@ typedef enum {
} EnHorseAnimationIndex;
typedef enum {
- /* 0 */ HORSE_EPONA,
- /* 1 */ HORSE_HNI,
- /* 2 */ HORSE_2,
- /* 3 */ HORSE_3,
- /* 4 */ HORSE_4
+ /* 0 */ HORSE_TYPE_EPONA,
+ /* 1 */ HORSE_TYPE_HNI,
+ /* 2 */ HORSE_TYPE_2,
+ /* 3 */ HORSE_TYPE_BANDIT,
+ /* 4 */ HORSE_TYPE_DONKEY // Cremia's donkey
} HorseType;
-#define ENHORSE_GET_2000(thisx) ((thisx)->params & 0x2000)
-#define ENHORSE_GET_4000(thisx) ((thisx)->params & 0x4000)
-#define ENHORSE_GET_8000(thisx) ((thisx)->params & 0x8000)
+#define ENHORSE_PARAM_BANDIT 0x2000
+#define ENHORSE_PARAM_4000 0x4000
+#define ENHORSE_PARAM_DONKEY 0x8000
-enum {
+#define ENHORSE_IS_BANDIT_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_BANDIT)
+#define ENHORSE_IS_4000_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_4000)
+#define ENHORSE_IS_DONKEY_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_DONKEY)
+
+typedef enum {
/* 0 */ ENHORSE_0,
/* 1 */ ENHORSE_1,
/* 2 */ ENHORSE_2,
@@ -130,7 +134,13 @@ enum {
/* 18 */ ENHORSE_18,
/* 19 */ ENHORSE_19,
/* 20 */ ENHORSE_20,
-};
+} EnHorseParam;
+
+/**
+ * `paramtype` should be `ENHORSE_PARAM_BANDIT`, `ENHORSE_PARAM_4000` or `ENHORSE_PARAM_DONKEY`
+ * `lower` should be a value of the enum `EnHorseParam`
+ */
+#define ENHORSE_PARAMS(type, lower) ((type) | (lower))
typedef struct EnHorse {
/* 0x000 */ Actor actor;
@@ -180,7 +190,7 @@ typedef struct EnHorse {
/* 0x384 */ u16 cutsceneFlags;
/* 0x388 */ s32 inRace;
/* 0x38C */ struct EnIn* rider;
- /* 0x390 */ UNK_TYPE1 unk390[0x4];
+ /* 0x390 */ UNK_TYPE1 unk_390[0x4];
/* 0x394 */ u16 unk_394;
/* 0x398 */ f32 unk_398;
/* 0x39C */ s32 unk_39C;
@@ -193,7 +203,7 @@ typedef struct EnHorse {
/* 0x3C8 */ Vec3f backRightHoof;
/* 0x3D4 */ Vec3f backLeftHoof;
/* 0x3E0 */ s32 unk_3E0;
- /* 0x3E4 */ UNK_TYPE1 unk3E4[0x4];
+ /* 0x3E4 */ UNK_TYPE1 unk_3E4[0x4];
/* 0x3E8 */ f32 unk_3E8;
/* 0x3EC */ s16 unk_3EC;
/* 0x3EE */ Vec3s jointTable[OBJECT_HA_1_LIMB_MAX];
@@ -205,13 +215,19 @@ typedef struct EnHorse {
/* 0x538 */ s32 unk_538;
/* 0x53C */ s32 unk_53C;
/* 0x540 */ Vec3f unk_540;
- /* 0x54C */ UNK_TYPE1 unk54C[0x4];
+ /* 0x54C */ UNK_TYPE unk_54C;
/* 0x550 */ s32 unk_550;
- /* 0x554 */ UNK_TYPE1 unk554[0x18];
+ /* 0x554 */ UNK_TYPE unk_554;
+ /* 0x558 */ UNK_TYPE unk_558;
+ /* 0x55C */ s32 unk_55C; // maybe currentDistanceToCart... it isn't really a distance tho
+ /* 0x560 */ s32 unk_560; // maybe initialDistanceToCart
+ /* 0x564 */ s32 unk_564; // set but not used
+ /* 0x568 */ f32 unk_568; // set but not used
/* 0x56C */ f32 unk_56C;
- /* 0x570 */ Vec3f unk_570;
+ /* 0x570 */ Vec3f banditPosition; // Milk run minigame bandit
/* 0x57C */ Vec3f unk_57C;
- /* 0x588 */ UNK_TYPE1 unk588[0x4];
+ /* 0x588 */ s16 unk_588;
+ /* 0x58A */ UNK_TYPE1 unk_58A[0x2]; // struct padding?
/* 0x58C */ s32 unk_58C;
/* 0x590 */ s32 unk_590;
} EnHorse; // size = 0x594
diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
index 278ec7144..f3ec0c245 100644
--- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
+++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
@@ -124,14 +124,14 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) {
func_8010E9F0(4, 0);
play->interfaceCtx.unk_280 = 1;
- this->horse1 =
- (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1149.0f, -106.0f, 470.0f, 0, 0x7FFF, 0, 0x2004);
+ this->horse1 = (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1149.0f, -106.0f, 470.0f, 0, 0x7FFF, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_BANDIT, ENHORSE_4));
if (this->horse1 == NULL) {
__assert("../z_en_horse_game_check.c", 1517);
}
- this->horse2 =
- (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1376.0f, -106.0f, 470.0f, 0, 0x7FFF, 0, 0x2005);
+ this->horse2 = (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1376.0f, -106.0f, 470.0f, 0, 0x7FFF, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_BANDIT, ENHORSE_5));
if (this->horse2 == NULL) {
__assert("../z_en_horse_game_check.c", 1526);
}
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 217f67252..14ac9ccee 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"
@@ -255,29 +254,28 @@ static Vec3f D_80B4E934 = { 216.0f, -20.0f, 1395.0f };
static s32 D_80B4E940 = 0;
-static TexturePtr D_80B4E944[] = {
- object_ma1_Tex_00FFC8, object_ma1_Tex_0107C8, object_ma1_Tex_010FC8, object_ma1_Tex_0117C8, object_ma1_Tex_011FC8,
+static TexturePtr sRomaniEyeTextures[] = {
+ gRomaniEyeOpenTex, gRomaniEyeHalfTex, gRomaniEyeClosedTex, gRomaniEyeHappyTex, gRomaniEyeSadTex,
};
-static TexturePtr D_80B4E958[] = {
- object_ma1_Tex_0127C8,
- object_ma1_Tex_012BC8,
- object_ma1_Tex_012FC8,
- object_ma1_Tex_0133C8,
+static TexturePtr sRomaniMouthTextures[] = {
+ gRomaniMouthHappyTex,
+ gRomaniMouthFrownTex,
+ gRomaniMouthHangingOpenTex,
+ gRomaniMouthSmileTex,
};
static s8 D_80B4E968 = 0;
-static TexturePtr D_80B4E96C[] = {
- object_ma2_Tex_011AD8, object_ma2_Tex_0122D8, object_ma2_Tex_012AD8,
- object_ma2_Tex_0132D8, object_ma2_Tex_013AD8, object_ma2_Tex_0142D8,
+static TexturePtr sCremiaEyeTextures[] = {
+ gCremiaEyeOpenTex, gCremiaEyeHalfTex, gCremiaEyeClosedTex, gCremiaEyeHappyTex, gCremiaEyeAngryTex, gCremiaEyeSadTex,
};
-static TexturePtr D_80B4E984[] = {
- object_ma2_Tex_014AD8,
- object_ma2_Tex_014ED8,
- object_ma2_Tex_0152D8,
- object_ma2_Tex_0156D8,
+static TexturePtr sCremiaMouthTextures[] = {
+ gCremiaMouthNormalTex,
+ gCremiaMouthSlightSmileTex,
+ gCremiaMouthFrownTex,
+ gCremiaMouthHangingOpenTex,
};
static s8 D_80B4E994 = 0;
@@ -327,7 +325,7 @@ static unkstructInvadepoh1 D_80B4EA24[] = {
{ 1, 1.0f },
};
-static unkstructInvadepoh4 D_80B4EA2C = { 2, &D_80B4E9C4, 4, D_80B4EA04, 0x28, 0x3c };
+static unkstructInvadepoh4 D_80B4EA2C = { 2, &D_80B4E9C4, 4, D_80B4EA04, 0x28, 0x3C };
static unkstructInvadepoh3 D_80B4EA40 = {
1,
@@ -1198,11 +1196,11 @@ void func_80B44F58(void) {
if (!D_80B4E968) {
D_80B4E968 = true;
- for (i = 0, iter = D_80B4E944; i < ARRAY_COUNT(D_80B4E944); i++, iter++) {
+ for (i = 0, iter = sRomaniEyeTextures; i < ARRAY_COUNT(sRomaniEyeTextures); i++, iter++) {
*iter = Lib_SegmentedToVirtual(*iter);
}
- for (i = 0, iter = D_80B4E958; i < ARRAY_COUNT(D_80B4E958); i++, iter++) {
+ for (i = 0, iter = sRomaniMouthTextures; i < ARRAY_COUNT(sRomaniMouthTextures); i++, iter++) {
*iter = Lib_SegmentedToVirtual(*iter);
}
}
@@ -1214,11 +1212,11 @@ void func_80B44FEC(void) {
if (!D_80B4E994) {
D_80B4E994 = true;
- for (i = 0, iter = D_80B4E96C; i < ARRAY_COUNT(D_80B4E96C); i++, iter++) {
+ for (i = 0, iter = sCremiaEyeTextures; i < ARRAY_COUNT(sCremiaEyeTextures); i++, iter++) {
*iter = Lib_SegmentedToVirtual(*iter);
}
- for (i = 0, iter = D_80B4E984; i < ARRAY_COUNT(D_80B4E984); i++, iter++) {
+ for (i = 0, iter = sCremiaMouthTextures; i < ARRAY_COUNT(sCremiaMouthTextures); i++, iter++) {
*iter = Lib_SegmentedToVirtual(*iter);
}
}
@@ -2427,7 +2425,7 @@ void func_80B4827C(Actor* thisx, PlayState* play) {
void func_80B482D4(EnInvadepoh* this) {
this->actionTimer = 40;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_002A8C, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniLookAroundAnim, -10.0f);
this->actor.draw = NULL;
this->actionFunc = func_80B48324;
}
@@ -2443,7 +2441,7 @@ void func_80B48324(EnInvadepoh* this, PlayState* play) {
void func_80B48374(EnInvadepoh* this) {
this->actionTimer = 60;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_002A8C, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniLookAroundAnim, -10.0f);
this->actor.draw = func_80B4E324;
this->actionFunc = func_80B483CC;
}
@@ -2475,7 +2473,7 @@ void func_80B4843C(EnInvadepoh* this) {
this->behaviorInfo.unk44 = 0.1f;
this->behaviorInfo.unk48 = 2000;
this->actionTimer = 50;
- Animation_Change(&this->skelAnime, &object_ma1_Anim_007328, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -5.0f);
+ Animation_Change(&this->skelAnime, &gRomaniRunAnim, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -5.0f);
this->actor.draw = func_80B4E324;
this->actionFunc = func_80B484EC;
}
@@ -2505,7 +2503,7 @@ void func_80B48588(EnInvadepoh* this) {
this->behaviorInfo.unk42 = 0;
this->behaviorInfo.unk44 = 0.28f;
this->behaviorInfo.unk48 = 7000;
- Animation_MorphToPlayOnce(&this->skelAnime, &object_ma1_Anim_009E58, -10.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
this->actor.draw = func_80B4E324;
this->actionFunc = func_80B48610;
}
@@ -2522,10 +2520,10 @@ void func_80B48620(Actor* thisx, PlayState* play) {
Actor_SetObjectDependency(play, &this->actor);
func_80B44F58();
this->actor.update = func_80B4873C;
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, &object_ma1_Anim_009E58, this->jointTable,
- this->morphTable, 23);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniIdleAnim, this->jointTable, this->morphTable,
+ ROMANI_LIMB_MAX);
func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &gZeroVec3s, 5000, 0.05f, 0.3f, 0.12f);
- Animation_PlayLoop(&this->skelAnime, &object_ma1_Anim_009E58);
+ Animation_PlayLoop(&this->skelAnime, &gRomaniIdleAnim);
func_80B482D4(this);
}
}
@@ -2558,7 +2556,7 @@ void func_80B487B4(EnInvadepoh* this) {
substruct->unk26.z = 0;
substruct->unk30 = 0.1f;
substruct->unk2C = 800;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_014088, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, -10.0f);
this->actionFunc = func_80B48848;
}
@@ -2618,7 +2616,7 @@ void func_80B48948(EnInvadepoh* this) {
substruct->unk2C = 1000;
}
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
this->actionFunc = func_80B48AD4;
}
@@ -2689,7 +2687,7 @@ void func_80B48DE4(EnInvadepoh* this) {
AlienBehaviorInfo* substruct = &this->behaviorInfo;
this->actor.speedXZ = 0.0f;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
this->behaviorInfo.unk4C = 0;
substruct->unk30 = 0.05f;
substruct->unk2C = 1200;
@@ -2726,8 +2724,8 @@ void func_80B48FB0(Actor* thisx, PlayState* play) {
this->actor.update = func_80B490F0;
this->actor.draw = func_80B4E324;
this->actor.textId = 0x3330;
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, &object_ma1_Anim_009E58, this->jointTable,
- this->morphTable, 23);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniIdleAnim, this->jointTable, this->morphTable,
+ ROMANI_LIMB_MAX);
func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &gZeroVec3s, 100, 0.03, 0.3, 0.03);
func_80B444F4(this, play);
EnInvadepoh_SetPathPointToWorldPos(this, 0);
@@ -2996,7 +2994,7 @@ void func_80B49B1C(Actor* thisx, PlayState* play) {
void func_80B49BD0(EnInvadepoh* this) {
AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_014088, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, -10.0f);
substruct->unk26.x = 0;
substruct->unk26.y = 0;
substruct->unk26.z = 0;
@@ -3040,7 +3038,7 @@ void func_80B49DA0(EnInvadepoh* this) {
this->behaviorInfo.unk30 = 0.08f;
this->behaviorInfo.unk2C = 2000;
this->behaviorInfo.unk4C = 0;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
this->actionFunc = func_80B49DFC;
}
@@ -3078,8 +3076,8 @@ void func_80B49F88(Actor* thisx, PlayState* play) {
this->actor.objBankIndex = this->bankIndex;
Actor_SetObjectDependency(play, &this->actor);
func_80B44F58();
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, &object_ma1_Anim_014088, this->jointTable,
- this->morphTable, 23);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
+ ROMANI_LIMB_MAX);
func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &gZeroVec3s, 100, 0.03, 0.3, 0.03);
func_80B44540(this, play);
func_80B44570(this);
@@ -3145,7 +3143,7 @@ void func_80B4A1B8(Actor* thisx, PlayState* play) {
void func_80B4A2C0(EnInvadepoh* this) {
AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
substruct->unk26.x = 0;
substruct->unk26.y = 0;
substruct->unk26.z = 0;
@@ -3204,7 +3202,7 @@ void func_80B4A350(EnInvadepoh* this, PlayState* play) {
void func_80B4A570(EnInvadepoh* this) {
AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Animation_MorphToPlayOnce(&this->skelAnime, &object_ma1_Anim_002A8C, -10.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gRomaniLookAroundAnim, -10.0f);
substruct->unk26.x = 0;
substruct->unk26.y = 0;
substruct->unk26.z = 0;
@@ -3223,7 +3221,7 @@ void func_80B4A5E4(EnInvadepoh* this, PlayState* play) {
void func_80B4A614(EnInvadepoh* this) {
AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_014088, 0.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, 0.0f);
substruct->unk26.x = 0;
substruct->unk26.y = 0;
substruct->unk26.z = 0;
@@ -3266,7 +3264,7 @@ void func_80B4A7C0(EnInvadepoh* this) {
this->behaviorInfo.unk30 = 0.08f;
this->behaviorInfo.unk2C = 2000;
this->behaviorInfo.unk4C = 0;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, 0.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, 0.0f);
this->actionFunc = func_80B4A81C;
}
@@ -3309,8 +3307,8 @@ void func_80B4A9C8(Actor* thisx, PlayState* play) {
this->actor.objBankIndex = this->bankIndex;
Actor_SetObjectDependency(play, &this->actor);
func_80B44F58();
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, &object_ma1_Anim_014088, this->jointTable,
- this->morphTable, 23);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
+ ROMANI_LIMB_MAX);
func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
func_80B44620(this, play);
if ((sp38 < CLOCK_TIME(2, 15)) || (sp38 >= CLOCK_TIME(6, 0))) {
@@ -3485,9 +3483,9 @@ void func_80B4B0C4(Actor* thisx, PlayState* play) {
Actor_SetObjectDependency(play, &this->actor);
func_80B44F58();
this->actor.update = func_80B4B218;
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, &object_ma1_Anim_014088, this->jointTable,
- this->morphTable, 23);
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, 0.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
+ ROMANI_LIMB_MAX);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, 0.0f);
substruct = &this->behaviorInfo;
func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &gZeroVec3s, 2000, 0.08f, 0.3f, 0.03f);
substruct->unk30 = 0.08f;
@@ -3693,17 +3691,14 @@ void func_80B4BA84(Actor* thisx, PlayState* play) {
sp2C = this->unk3BC;
this->unk3BC = func_80B44234(this, &D_80B5040C->actor.world.pos);
if (sp2C != this->unk3BC) {
- phi_v0 = this->pathIndex;
phi_v0 = this->unk3BC - this->pathIndex;
- temp_v0_3 = phi_v0;
- if (temp_v0_3 < 0) {
+ if (phi_v0 < 0) {
phi_v0 += this->endPoint;
}
- temp_v0_3 = this->endPoint >> 1;
- if (temp_v0_3 < phi_v0) {
+ if ((this->endPoint >> 1) < phi_v0) {
this->direction = DIRECTION_BACKWARD;
- } else if (phi_v0 < temp_v0_3) {
+ } else if (phi_v0 < (this->endPoint >> 1)) {
this->direction = DIRECTION_FORWARD;
}
}
@@ -3721,7 +3716,7 @@ void func_80B4BA84(Actor* thisx, PlayState* play) {
void func_80B4BBE0(EnInvadepoh* this) {
AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Animation_MorphToLoop(&this->skelAnime, &object_ma2_Anim_016720, -6.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gCremiaWalkAnim, -6.0f);
substruct->unk26.x = 0;
substruct->unk26.y = 0;
substruct->unk26.z = 0;
@@ -3802,7 +3797,7 @@ void func_80B4BC4C(EnInvadepoh* this, PlayState* play) {
void func_80B4BFFC(EnInvadepoh* this) {
this->behaviorInfo.unk30 = 0.08f;
this->behaviorInfo.unk2C = 2000;
- Animation_MorphToLoop(&this->skelAnime, &object_ma2_Anim_00A174, -6.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gCremiaIdleAnim, -6.0f);
this->behaviorInfo.unk4C = 0;
this->actionFunc = func_80B4C058;
}
@@ -3834,7 +3829,7 @@ void func_80B4C058(EnInvadepoh* this, PlayState* play) {
void func_80B4C1BC(EnInvadepoh* this) {
this->behaviorInfo.unk30 = 0.08f;
this->behaviorInfo.unk2C = 2000;
- Animation_MorphToLoop(&this->skelAnime, &object_ma2_Anim_00A174, -6.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gCremiaIdleAnim, -6.0f);
this->behaviorInfo.unk4C = 0;
this->actionFunc = func_80B4C218;
}
@@ -3874,8 +3869,8 @@ void func_80B4C3A0(Actor* thisx, PlayState* play) {
this->actor.objBankIndex = this->bankIndex;
Actor_SetObjectDependency(play, &this->actor);
func_80B44FEC();
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma2_Skel_015C28, &object_ma2_Anim_016720, this->jointTable,
- this->morphTable, 22);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gCremiaSkel, &gCremiaWalkAnim, this->jointTable, this->morphTable,
+ CREMIA_LIMB_MAX);
func_80B45C04(&this->behaviorInfo, D_80B4EBDC, 1, D_80B4EC08, 0, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
this->actor.textId = 0x33CD;
if (currentTime < 0xD5A0) {
@@ -3937,7 +3932,7 @@ void func_80B4C5C0(Actor* thisx, PlayState* play) {
void func_80B4C6C8(EnInvadepoh* this) {
AlienBehaviorInfo* substruct = &this->behaviorInfo;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_014088, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniWalkAnim, -10.0f);
substruct->unk26.x = 0;
substruct->unk26.y = 0;
substruct->unk26.z = 0;
@@ -4020,7 +4015,7 @@ void func_80B4C730(EnInvadepoh* this, PlayState* play) {
void func_80B4CAB0(EnInvadepoh* this) {
this->behaviorInfo.unk30 = 0.08f;
this->behaviorInfo.unk2C = 4000;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
this->behaviorInfo.unk4C = 0;
this->actionFunc = func_80B4CB0C;
}
@@ -4049,7 +4044,7 @@ void func_80B4CB0C(EnInvadepoh* this, PlayState* play) {
void func_80B4CC70(EnInvadepoh* this) {
this->behaviorInfo.unk30 = 0.08f;
this->behaviorInfo.unk2C = 2000;
- Animation_MorphToLoop(&this->skelAnime, &object_ma1_Anim_009E58, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gRomaniIdleAnim, -10.0f);
this->behaviorInfo.unk4C = 0;
this->actionFunc = func_80B4CCCC;
}
@@ -4088,8 +4083,8 @@ void func_80B4CE54(Actor* thisx, PlayState* play) {
this->actor.objBankIndex = this->bankIndex;
Actor_SetObjectDependency(play, &this->actor);
func_80B44F58();
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, &object_ma1_Anim_014088, this->jointTable,
- this->morphTable, 23);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, &gRomaniWalkAnim, this->jointTable, this->morphTable,
+ ROMANI_LIMB_MAX);
func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
func_80B446D0(this, play);
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -4471,13 +4466,13 @@ void func_80B4E1B0(Actor* thisx, PlayState* play) {
}
s32 func_80B4E200(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
- if (limbIndex == 14) {
+ if (limbIndex == ROMANI_LIMB_HEAD) {
EnInvadepoh* this = THIS; // both of these needed to match
rot->x += this->behaviorInfo.unk20.y;
rot->y += this->behaviorInfo.unk20.z;
rot->z += this->behaviorInfo.unk20.x;
- } else if (limbIndex == 13) {
+ } else if (limbIndex == ROMANI_LIMB_TORSO) {
EnInvadepoh* this = THIS; // both of these needed to match
rot->x += (s16)(this->behaviorInfo.unk34 * this->behaviorInfo.unk20.y);
@@ -4489,11 +4484,11 @@ s32 func_80B4E200(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s
void func_80B4E2AC(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnInvadepoh* this = THIS;
- if (limbIndex == 19) {
+ if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
OPEN_DISPS(play->state.gfxCtx);
- gSPDisplayList(POLY_OPA_DISP++, object_ma1_DL_0003B0);
+ gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
CLOSE_DISPS(play->state.gfxCtx);
- } else if (limbIndex == 14) {
+ } else if (limbIndex == ROMANI_LIMB_HEAD) {
Matrix_MultVec3f(&D_80B4EE30, &this->actor.focus.pos);
}
}
@@ -4503,8 +4498,8 @@ void func_80B4E324(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x09, D_80B4E958[this->behaviorInfo.unk10.unkF]);
- gSPSegment(POLY_OPA_DISP++, 0x08, D_80B4E944[this->behaviorInfo.unk0.unkF]);
+ gSPSegment(POLY_OPA_DISP++, 0x09, sRomaniMouthTextures[this->behaviorInfo.unk10.unkF]);
+ gSPSegment(POLY_OPA_DISP++, 0x08, sRomaniEyeTextures[this->behaviorInfo.unk0.unkF]);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
func_80B4E200, func_80B4E2AC, &this->actor);
CLOSE_DISPS(play->state.gfxCtx);
@@ -4598,8 +4593,8 @@ void func_80B4E7BC(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x09, D_80B4E984[this->behaviorInfo.unk10.unkF]);
- gSPSegment(POLY_OPA_DISP++, 0x08, D_80B4E96C[this->behaviorInfo.unk0.unkF]);
+ gSPSegment(POLY_OPA_DISP++, 0x09, sCremiaMouthTextures[this->behaviorInfo.unk10.unkF]);
+ gSPSegment(POLY_OPA_DISP++, 0x08, sCremiaEyeTextures[this->behaviorInfo.unk0.unkF]);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
func_80B4E6E4, func_80B4E784, &this->actor);
CLOSE_DISPS(play->state.gfxCtx);
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 befd3aa61..31fe29369 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -158,7 +158,7 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) {
this->actor.world.rot.z = 0;
this->actor.targetMode = 0;
if (this->actor.world.rot.x > 0 && this->actor.world.rot.x < 8) {
- this->actor.targetMode = this->actor.world.rot.x - 1;
+ this->actor.targetMode = GET_KAKASI_TARGETMODE(thisx);
}
this->actor.shape.rot.y = this->actor.world.rot.y;
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 45d7a274b..c1a788d46 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
@@ -47,5 +47,6 @@ extern const ActorInit En_Kakasi_InitVars;
#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)
#endif // Z_EN_KAKASI_H
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 709f6c7da..4499ed44a 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
@@ -831,7 +831,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
break;
case 1:
- if ((play->msgCtx.ocarinaMode == 4) && (play->msgCtx.unk1202E == 7)) {
+ if ((play->msgCtx.ocarinaMode == 4) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING)) {
this->actionState = ENKANBAN_REPAIR;
this->bounceX = 1;
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
diff --git a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
index 73cf73c36..435d31972 100644
--- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
+++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
@@ -209,7 +209,7 @@ void func_80A5B508(void) {
sp74[7] = (spAC - temp_f20) * temp_f22 * temp_f24 * temp_f2;
for (i = 0; i < ARRAY_COUNT(D_80A60908); i++) {
- ptr = (f32*)&D_80A60908[i].mf[0];
+ ptr = &D_80A60908[i].xx;
tempf1 = sp74[(i + 0) & 7];
tempf2 = sp74[(i + 1) & 7];
@@ -242,8 +242,8 @@ void func_80A5B508(void) {
void func_80A5B954(MtxF* matrix, f32 arg1) {
s32 i;
MtxF* temp = Matrix_GetCurrent();
- f32* tmp = (f32*)&temp->mf[0];
- f32* tmp2 = (f32*)&matrix->mf[0];
+ f32* tmp = &temp->xx;
+ f32* tmp2 = &matrix->xx;
for (i = 0; i < 16; i++) {
*tmp++ += *tmp2++ * arg1;
diff --git a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
index 5af78062f..b7d67fbc3 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
@@ -5,7 +5,6 @@
*/
#include "z_en_ma4.h"
-#include "objects/object_ma1/object_ma1.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
@@ -90,14 +89,14 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit2 D_80AC00DC = { 0, 0, 0, 0, MASS_IMMOVABLE };
static TexturePtr sEyeTextures[] = {
- object_ma1_Tex_00FFC8, object_ma1_Tex_0107C8, object_ma1_Tex_010FC8, object_ma1_Tex_0117C8, object_ma1_Tex_011FC8,
+ gRomaniEyeOpenTex, gRomaniEyeHalfTex, gRomaniEyeClosedTex, gRomaniEyeHappyTex, gRomaniEyeSadTex,
};
static TexturePtr sMouthTextures[] = {
- object_ma1_Tex_0127C8,
- object_ma1_Tex_012BC8,
- object_ma1_Tex_012FC8,
- object_ma1_Tex_0133C8,
+ gRomaniMouthHappyTex,
+ gRomaniMouthFrownTex,
+ gRomaniMouthHangingOpenTex,
+ gRomaniMouthSmileTex,
};
void EnMa4_UpdateEyes(EnMa4* this) {
@@ -113,26 +112,26 @@ void EnMa4_UpdateEyes(EnMa4* this) {
}
static AnimationSpeedInfo sAnimationInfo[] = {
- { &object_ma1_Anim_009E58, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_009E58, 1.0f, ANIMMODE_LOOP, -6.0f }, // Idle anim
- { &object_ma1_Anim_002A8C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_002A8C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Looking around anim
- { &object_ma1_Anim_018948, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_ma1_Anim_018948, 1.0f, ANIMMODE_ONCE, -6.0f }, // Starts holding hands anim
- { &object_ma1_Anim_01B76C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_01B76C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Holnding hands anim
- { &object_ma1_Anim_007328, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_007328, 1.0f, ANIMMODE_LOOP, -6.0f }, // Walking anim
- { &object_ma1_Anim_014088, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_014088, 1.0f, ANIMMODE_LOOP, -6.0f }, //
- { &object_ma1_Anim_015B7C, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_ma1_Anim_015B7C, 1.0f, ANIMMODE_ONCE, -6.0f }, // Shoot arrow anim
- { &object_ma1_Anim_007D98, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_007D98, 1.0f, ANIMMODE_LOOP, -6.0f }, // Sitting anim
- { &object_ma1_Anim_00852C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_00852C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Sitting traumatized anim
- { &object_ma1_Anim_008F6C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_008F6C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Sitting sad anim
+ { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f },
+ { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniShootBowAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gRomaniShootBowAnim, 1.0f, ANIMMODE_ONCE, -6.0f },
+ { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
};
void EnMa4_ChangeAnim(EnMa4* this, s32 index) {
@@ -145,9 +144,9 @@ void func_80ABDD9C(EnMa4* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 flag;
- if (this->unk_1D8.unk_00 == 0 && ((this->skelAnime.animation == &object_ma1_Anim_007328) ||
- (this->skelAnime.animation == &object_ma1_Anim_002A8C) ||
- (this->skelAnime.animation == &object_ma1_Anim_015B7C))) {
+ if (this->unk_1D8.unk_00 == 0 &&
+ ((this->skelAnime.animation == &gRomaniRunAnim) || (this->skelAnime.animation == &gRomaniLookAroundAnim) ||
+ (this->skelAnime.animation == &gRomaniShootBowAnim))) {
flag = 1;
} else {
flag = (this->type == MA4_TYPE_ALIENS_WON && this->actionFunc != EnMa4_DialogueHandler) ? 1 : 0;
@@ -183,8 +182,7 @@ void EnMa4_Init(Actor* thisx, PlayState* play) {
s32 pad;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 18.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, NULL, this->jointTable, this->morphTable,
- MA1_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, NULL, this->jointTable, this->morphTable, ROMANI_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
@@ -300,7 +298,7 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
Actor_MoveWithGravity(&this->actor);
- if (this->skelAnime.animation == &object_ma1_Anim_007328) { // Walking animation
+ if (this->skelAnime.animation == &gRomaniRunAnim) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 4.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_ROMANI_WALK);
}
@@ -1031,12 +1029,12 @@ s32 EnMa4_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
EnMa4* this = THIS;
Vec3s sp4;
- if (limbIndex == MA1_LIMB_HEAD) {
+ if (limbIndex == ROMANI_LIMB_HEAD) {
sp4 = this->unk_1D8.unk_08;
rot->x = rot->x + sp4.y;
rot->z = rot->z + sp4.x;
}
- if (limbIndex == MA1_LIMB_TORSO) {
+ if (limbIndex == ROMANI_LIMB_TORSO) {
sp4 = this->unk_1D8.unk_0E;
rot->x = rot->x - sp4.y;
rot->z = rot->z - sp4.x;
@@ -1049,12 +1047,12 @@ void EnMa4_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
EnMa4* this = THIS;
Vec3f sp28 = { 800.0f, 0.0f, 0.0f };
- if (limbIndex == MA1_LIMB_HEAD) {
+ if (limbIndex == ROMANI_LIMB_HEAD) {
Matrix_MultVec3f(&sp28, &this->actor.focus.pos);
- } else if (limbIndex == MA1_LIMB_HAND_LEFT) {
+ } else if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
if (this->hasBow == true) {
OPEN_DISPS(play->state.gfxCtx);
- gSPDisplayList(POLY_OPA_DISP++, object_ma1_DL_0003B0);
+ gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1066,7 +1064,7 @@ void EnMa4_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->type == MA4_TYPE_ALIENS_WON) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, object_ma1_DL_000A20);
+ gSPDisplayList(POLY_OPA_DISP++, gRomaniWoodenBoxDL);
}
func_8012C28C(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
index 41936445b..148e2ef30 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
@@ -2,7 +2,7 @@
#define Z_EN_MA4_H
#include "global.h"
-#include "overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h"
+#include "objects/object_ma1/object_ma1.h"
struct EnMa4;
@@ -15,9 +15,9 @@ typedef struct EnMa4 {
/* 0x18C */ ColliderCylinder collider;
/* 0x1D8 */ struct_800BD888_arg1 unk_1D8;
/* 0x200 */ Vec3s* pathPoints;
- /* 0x204 */ Vec3s jointTable[MA1_LIMB_MAX];
+ /* 0x204 */ Vec3s jointTable[ROMANI_LIMB_MAX];
/* 0x28E */ UNK_TYPE1 unk28E[0x6];
- /* 0x294 */ Vec3s morphTable[MA1_LIMB_MAX];
+ /* 0x294 */ Vec3s morphTable[ROMANI_LIMB_MAX];
/* 0x31E */ UNK_TYPE1 unk31E[0x6];
/* 0x324 */ s16 pathIndex;
/* 0x326 */ s16 pathPointsCount;
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 306c9f7a3..48817003a 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
@@ -5,7 +5,7 @@
*/
#include "z_en_ma_yto.h"
-#include "objects/object_ma2/object_ma2.h"
+#include "overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
@@ -106,30 +106,41 @@ static CollisionCheckInfoInit2 sColChkInfoInit2 = {
};
static AnimationSpeedInfo sAnimationInfo[] = {
- { &object_ma2_Anim_00A174, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_00A174, 1.0f, ANIMMODE_LOOP, -6.0f }, //
- { &object_ma2_Anim_00AF7C, 1.0f, ANIMMODE_ONCE, 0.0f }, { &object_ma2_Anim_00AF7C, 1.0f, ANIMMODE_ONCE, -6.0f }, //
- { &object_ma2_Anim_000CC0, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_000CC0, 1.0f, ANIMMODE_LOOP, -6.0f }, //
- { &object_ma2_Anim_016720, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_016720, 1.0f, ANIMMODE_LOOP, -8.0f }, //
- { &object_ma2_Anim_005314, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_005314, 1.0f, ANIMMODE_LOOP, -8.0f }, //
- { &object_ma2_Anim_0093E8, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_0093E8, 1.0f, ANIMMODE_LOOP, -10.0f }, //
- { &object_ma2_Anim_007E28, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_007E28, 1.0f, ANIMMODE_LOOP, -8.0f }, //
- { &object_ma2_Anim_0070EC, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_0070EC, 1.0f, ANIMMODE_LOOP, -8.0f }, //
- { &object_ma2_Anim_003D54, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_003D54, 1.0f, ANIMMODE_LOOP, -8.0f }, //
- { &object_ma2_Anim_001FD0, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_001FD0, 1.0f, ANIMMODE_LOOP, -8.0f }, //
- { &object_ma2_Anim_0030B4, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_0030B4, 1.0f, ANIMMODE_LOOP, -8.0f }, //
- { &object_ma2_Anim_004370, 1.0f, ANIMMODE_LOOP, 0.0f }, { &object_ma2_Anim_004370, 1.0f, ANIMMODE_LOOP, -8.0f }, //
+ { &gCremiaIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gCremiaSpreadArmsStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gCremiaSpreadArmsStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f },
+ { &gCremiaSpreadArmsLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaSpreadArmsLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gCremiaWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaWalkAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
+ { &gCremiaThinkAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaThinkAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
+ { &gCremiaPetCowAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaPetCowAnim, 1.0f, ANIMMODE_LOOP, -10.0f },
+ { &gCremiaSittingPetCowAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaSittingPetCowAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
+ { &gCremiaSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaSittingAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
+ { &gCremiaSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
+ { &gCremiaHugStartAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaHugStartAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
+ { &gCremiaHugLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaHugLoopAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
+ { &gCremiaClapAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gCremiaClapAnim, 1.0f, ANIMMODE_LOOP, -8.0f },
};
static TexturePtr sMouthTextures[] = {
- object_ma2_Tex_014AD8,
- object_ma2_Tex_014ED8,
- object_ma2_Tex_0152D8,
- object_ma2_Tex_0156D8,
+ gCremiaMouthNormalTex,
+ gCremiaMouthSlightSmileTex,
+ gCremiaMouthFrownTex,
+ gCremiaMouthHangingOpenTex,
};
static TexturePtr sEyesTextures[] = {
- object_ma2_Tex_011AD8, object_ma2_Tex_0122D8, object_ma2_Tex_012AD8,
- object_ma2_Tex_0132D8, object_ma2_Tex_013AD8, object_ma2_Tex_0142D8,
+ gCremiaEyeOpenTex, gCremiaEyeHalfTex, gCremiaEyeClosedTex, gCremiaEyeHappyTex, gCremiaEyeAngryTex, gCremiaEyeSadTex,
};
void EnMaYto_Init(Actor* thisx, PlayState* play) {
@@ -157,8 +168,7 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 18.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma2_Skel_015C28, NULL, this->jointTable, this->morphTable,
- MA2_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gCremiaSkel, NULL, this->jointTable, this->morphTable, CREMIA_LIMB_MAX);
EnMaYto_InitAnimation(this, play);
Collider_InitCylinder(play, &this->collider);
@@ -432,7 +442,7 @@ void EnMaYto_DefaultDialogueHandler(EnMaYto* this, PlayState* play) {
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x3000, 0x100);
- if (this->textId == 0x3395 && this->skelAnime.animation == &object_ma2_Anim_00AF7C &&
+ if (this->textId == 0x3395 && this->skelAnime.animation == &gCremiaSpreadArmsStartAnim &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMaYto_ChangeAnim(this, 4);
}
@@ -1049,7 +1059,7 @@ void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, PlayState* play) {
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, csActionIndex);
- if (D_80B915F0 == 2 && this->skelAnime.animation == &object_ma2_Anim_001FD0 &&
+ if (D_80B915F0 == 2 && this->skelAnime.animation == &gCremiaHugStartAnim &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMaYto_ChangeAnim(this, 20);
}
@@ -1425,20 +1435,19 @@ s32 EnMaYto_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
EnMaYto* this = THIS;
Vec3s sp4;
- if (limbIndex == MA2_LIMB_HEAD) {
+ if (limbIndex == CREMIA_LIMB_HEAD) {
sp4 = this->unk_1D8.unk_08;
rot->x += sp4.y;
rot->z += sp4.x;
- } else if (limbIndex == MA2_LIMB_TORSO) {
- if (this->skelAnime.animation != &object_ma2_Anim_007E28 &&
- this->skelAnime.animation != &object_ma2_Anim_003D54) {
+ } else if (limbIndex == CREMIA_LIMB_TORSO) {
+ if (this->skelAnime.animation != &gCremiaSittingPetCowAnim &&
+ this->skelAnime.animation != &gCremiaSittingLookDownAnim) {
sp4 = this->unk_1D8.unk_0E;
rot->x += sp4.y;
- if (this->skelAnime.animation == &object_ma2_Anim_00A174 ||
- this->skelAnime.animation == &object_ma2_Anim_0070EC ||
- this->skelAnime.animation == &object_ma2_Anim_003D54) {
+ if (this->skelAnime.animation == &gCremiaIdleAnim || this->skelAnime.animation == &gCremiaSittingAnim ||
+ this->skelAnime.animation == &gCremiaSittingLookDownAnim) {
rot->z += sp4.x;
}
}
@@ -1449,7 +1458,7 @@ s32 EnMaYto_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnMaYto_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnMaYto* this = THIS;
- if (limbIndex == MA2_LIMB_HEAD) {
+ if (limbIndex == CREMIA_LIMB_HEAD) {
Matrix_MultZero(&this->actor.focus.pos);
}
}
@@ -1461,7 +1470,7 @@ void EnMaYto_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->type == MA_YTO_TYPE_BARN && (gSaveContext.save.weekEventReg[22] & 1)) { // Aliens defeated
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gCremiaWoodenBox);
+ gSPDisplayList(POLY_OPA_DISP++, gCremiaWoodenBoxDL);
}
func_8012C28C(play->state.gfxCtx);
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 25eb2bed5..7f2c50fb3 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
@@ -2,38 +2,12 @@
#define Z_EN_MA_YTO_H
#include "global.h"
-#include "overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h"
+#include "objects/object_ma2/object_ma2.h"
struct EnMaYto;
typedef void (*EnMaYtoActionFunc)(struct EnMaYto*, PlayState*);
-typedef enum {
- /* 00 */ MA2_LIMB_NONE,
- /* 01 */ MA2_LIMB_ROOT,
- /* 02 */ MA2_LIMB_TORSO,
- /* 03 */ MA2_LIMB_ARM_LEFT,
- /* 04 */ MA2_LIMB_FOREARM_LEFT,
- /* 05 */ MA2_LIMB_HAND_LEFT,
- /* 06 */ MA2_LIMB_ARM_RIGHT,
- /* 07 */ MA2_LIMB_FOREARM_RIGHT,
- /* 08 */ MA2_LIMB_HAND_RIGHT,
- /* 09 */ MA2_LIMB_HEAD,
- /* 10 */ MA2_LIMB_HAIR,
- /* 11 */ MA2_LIMB_PELVIS,
- /* 12 */ MA2_LIMB_TIGHT_LEFT,
- /* 13 */ MA2_LIMB_LEG_LEFT,
- /* 14 */ MA2_LIMB_FOOT_LEFT,
- /* 15 */ MA2_LIMB_TIGHT_RIGHT,
- /* 16 */ MA2_LIMB_LEG_RIGHT,
- /* 17 */ MA2_LIMB_FOOT_RIGHT,
- /* 18 */ MA2_LIMB_DRESS_0,
- /* 19 */ MA2_LIMB_DRESS_1,
- /* 20 */ MA2_LIMB_DRESS_2,
- /* 21 */ MA2_LIMB_DRESS_3,
- /* 22 */ MA2_LIMB_MAX
-} ObjectMa2Limbs;
-
typedef struct EnMaYto {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -42,8 +16,8 @@ typedef struct EnMaYto {
/* 0x1D8 */ struct_800BD888_arg1 unk_1D8;
/* 0x200 */ s32 unk200; // unused
/* 0x204 */ s32 type;
- /* 0x208 */ Vec3s jointTable[MA2_LIMB_MAX];
- /* 0x28C */ Vec3s morphTable[MA2_LIMB_MAX];
+ /* 0x208 */ Vec3s jointTable[CREMIA_LIMB_MAX];
+ /* 0x28C */ Vec3s morphTable[CREMIA_LIMB_MAX];
/* 0x310 */ s16 unk310; // state?
/* 0x312 */ UNK_TYPE1 unk_312[0x2];
/* 0x314 */ s16 currentAnim; // Used only in DefaultWait
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 f43d6ca0d..72357758a 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
@@ -5,7 +5,6 @@
*/
#include "z_en_ma_yts.h"
-#include "objects/object_ma1/object_ma1.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_100000 | ACTOR_FLAG_2000000)
@@ -79,39 +78,39 @@ static CollisionCheckInfoInit2 sColChkInfoInit2 = {
};
static AnimationSpeedInfo sAnimationInfo[] = {
- { &object_ma1_Anim_009E58, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_009E58, 1.0f, ANIMMODE_LOOP, -6.0f }, // Idle anim
- { &object_ma1_Anim_018948, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_ma1_Anim_018948, 1.0f, ANIMMODE_ONCE, -6.0f }, // Starts holding hands anim
- { &object_ma1_Anim_01B76C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_01B76C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Holnding hands anim
- { &object_ma1_Anim_007328, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_007328, 1.0f, ANIMMODE_LOOP, -6.0f }, // Walking anim
- { &object_ma1_Anim_014088, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_014088, 1.0f, ANIMMODE_LOOP, -6.0f }, //
- { &object_ma1_Anim_002A8C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_002A8C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Looking around anim
- { &object_ma1_Anim_015B7C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_015B7C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Shoot arrow anim
- { &object_ma1_Anim_007D98, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_007D98, 1.0f, ANIMMODE_LOOP, -6.0f }, // Sitting anim
- { &object_ma1_Anim_00852C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_00852C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Sitting traumatized anim
- { &object_ma1_Anim_008F6C, 1.0f, ANIMMODE_LOOP, 0.0f },
- { &object_ma1_Anim_008F6C, 1.0f, ANIMMODE_LOOP, -6.0f }, // Sitting sad anim
- { &object_ma1_Anim_0180DC, 1.0f, ANIMMODE_ONCE, 0.0f },
- { &object_ma1_Anim_0180DC, 1.0f, ANIMMODE_ONCE, -6.0f }, // Turns around anim
+ { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f },
+ { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniShootBowAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniShootBowAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f },
+ { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -6.0f },
+ { &gRomaniTurnAroundAndFlickHairAnim, 1.0f, ANIMMODE_ONCE, 0.0f },
+ { &gRomaniTurnAroundAndFlickHairAnim, 1.0f, ANIMMODE_ONCE, -6.0f },
};
static TexturePtr sMouthTextures[] = {
- object_ma1_Tex_0127C8,
- object_ma1_Tex_012BC8,
- object_ma1_Tex_012FC8,
- object_ma1_Tex_0133C8,
+ gRomaniMouthHappyTex,
+ gRomaniMouthFrownTex,
+ gRomaniMouthHangingOpenTex,
+ gRomaniMouthSmileTex,
};
static TexturePtr sEyeTextures[] = {
- object_ma1_Tex_00FFC8, object_ma1_Tex_0107C8, object_ma1_Tex_010FC8, object_ma1_Tex_0117C8, object_ma1_Tex_011FC8,
+ gRomaniEyeOpenTex, gRomaniEyeHalfTex, gRomaniEyeClosedTex, gRomaniEyeHappyTex, gRomaniEyeSadTex,
};
void EnMaYts_ChangeAnim(EnMaYts* this, s32 index) {
@@ -225,8 +224,7 @@ void EnMaYts_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 18.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_ma1_Skel_013928, NULL, this->jointTable, this->morphTable,
- MA1_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gRomaniSkel, NULL, this->jointTable, this->morphTable, ROMANI_LIMB_MAX);
EnMaYts_InitAnimation(this, play);
Collider_InitCylinder(play, &this->collider);
@@ -505,14 +503,13 @@ s32 EnMaYts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
EnMaYts* this = THIS;
Vec3s sp4;
- if (limbIndex == MA1_LIMB_HEAD) {
+ if (limbIndex == ROMANI_LIMB_HEAD) {
sp4 = this->unk_1D8.unk_08;
rot->x += sp4.y;
- if ((this->skelAnime.animation == &object_ma1_Anim_009E58) ||
- (this->skelAnime.animation == &object_ma1_Anim_007D98)) {
+ if ((this->skelAnime.animation == &gRomaniIdleAnim) || (this->skelAnime.animation == &gRomaniSittingAnim)) {
rot->z += sp4.x;
}
- } else if (limbIndex == MA1_LIMB_TORSO) {
+ } else if (limbIndex == ROMANI_LIMB_TORSO) {
sp4 = this->unk_1D8.unk_0E;
rot->x += sp4.y;
rot->z += sp4.x;
@@ -524,12 +521,12 @@ s32 EnMaYts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnMaYts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnMaYts* this = THIS;
- if (limbIndex == MA1_LIMB_HEAD) {
+ if (limbIndex == ROMANI_LIMB_HEAD) {
Matrix_MultZero(&this->actor.focus.pos);
- } else if (limbIndex == MA1_LIMB_HAND_LEFT) {
+ } else if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
if (this->hasBow == true) {
OPEN_DISPS(play->state.gfxCtx);
- gSPDisplayList(POLY_OPA_DISP++, object_ma1_DL_0003B0);
+ gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -556,7 +553,7 @@ void EnMaYts_DrawSleeping(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++, object_ma1_DL_0043A0);
+ gSPDisplayList(POLY_OPA_DISP++, gRomaniSleepingDL);
CLOSE_DISPS(play->state.gfxCtx);
}
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 a16a5e5d8..c3da6b71d 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
@@ -2,38 +2,12 @@
#define Z_EN_MA_YTS_H
#include "global.h"
+#include "objects/object_ma1/object_ma1.h"
struct EnMaYts;
typedef void (*EnMaYtsActionFunc)(struct EnMaYts*, PlayState*);
-typedef enum {
- /* 00 */ MA1_LIMB_NONE,
- /* 01 */ MA1_LIMB_ROOT,
- /* 02 */ MA1_LIMB_PELVIS,
- /* 03 */ MA1_LIMB_TIGHT_LEFT,
- /* 04 */ MA1_LIMB_LEG_LEFT,
- /* 05 */ MA1_LIMB_FOOT_LEFT,
- /* 06 */ MA1_LIMB_TIGHT_RIGHT,
- /* 07 */ MA1_LIMB_LEG_RIGHT,
- /* 08 */ MA1_LIMB_FOOT_RIGHT,
- /* 09 */ MA1_LIMB_DRESS_0,
- /* 00 */ MA1_LIMB_DRESS_1,
- /* 11 */ MA1_LIMB_DRESS_2,
- /* 12 */ MA1_LIMB_DRESS_3,
- /* 13 */ MA1_LIMB_TORSO,
- /* 14 */ MA1_LIMB_HEAD,
- /* 15 */ MA1_LIMB_HAIR_TOP,
- /* 16 */ MA1_LIMB_HAIR_BOTTOM,
- /* 17 */ MA1_LIMB_ARM_LEFT,
- /* 18 */ MA1_LIMB_FOREARM_LEFT,
- /* 19 */ MA1_LIMB_HAND_LEFT,
- /* 20 */ MA1_LIMB_ARM_RIGHT,
- /* 21 */ MA1_LIMB_FOREARM_RIGHT,
- /* 22 */ MA1_LIMB_HAND_RIGHT,
- /* 23 */ MA1_LIMB_MAX
-} ObjectMa1Limbs;
-
typedef struct EnMaYts {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -41,9 +15,9 @@ typedef struct EnMaYts {
/* 0x18C */ ColliderCylinder collider;
/* 0x1D8 */ struct_800BD888_arg1 unk_1D8;
/* 0x200 */ s32 unk_200; // Set, but not used
- /* 0x204 */ Vec3s jointTable[MA1_LIMB_MAX];
+ /* 0x204 */ Vec3s jointTable[ROMANI_LIMB_MAX];
/* 0x28E */ char unk_28E[0x6];
- /* 0x294 */ Vec3s morphTable[MA1_LIMB_MAX];
+ /* 0x294 */ Vec3s morphTable[ROMANI_LIMB_MAX];
/* 0x31E */ char unk_31E[0x8];
/* 0x326 */ s16 blinkTimer;
/* 0x328 */ s16 overrideEyeTexIndex; // If non-zero, then this index will be used instead of eyeTexIndex
diff --git a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
index 41ae5d99c..5597bf9f6 100644
--- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
+++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
@@ -16,10 +16,10 @@ void EnNnh_Destroy(Actor* thisx, PlayState* play);
void EnNnh_Update(Actor* thisx, PlayState* play);
void EnNnh_Draw(Actor* thisx, PlayState* play);
-void func_80C08828(EnNnh* this);
-void func_80C0883C(EnNnh* this, PlayState* play);
-void func_80C088A4(EnNnh* this);
-void func_80C088B8(EnNnh* this, PlayState* play);
+void EnNnh_SetupWaitForDialogue(EnNnh* this);
+void EnNnh_WaitForDialogue(EnNnh* this, PlayState* play);
+void EnNnh_SetupDialogue(EnNnh* this);
+void EnNnh_Dialogue(EnNnh* this, PlayState* play);
const ActorInit En_Nnh_InitVars = {
ACTOR_EN_NNH,
@@ -62,7 +62,7 @@ void EnNnh_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 1;
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 30.0f;
- func_80C08828(this);
+ EnNnh_SetupWaitForDialogue(this);
}
void EnNnh_Destroy(Actor* thisx, PlayState* play) {
@@ -71,26 +71,26 @@ void EnNnh_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80C08828(EnNnh* this) {
- this->actionFunc = func_80C0883C;
+void EnNnh_SetupWaitForDialogue(EnNnh* this) {
+ this->actionFunc = EnNnh_WaitForDialogue;
}
-void func_80C0883C(EnNnh* this, PlayState* play) {
+void EnNnh_WaitForDialogue(EnNnh* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x228, &this->actor);
- func_80C088A4(this);
- return;
+ EnNnh_SetupDialogue(this);
+ } else {
+ func_800B8614(&this->actor, play, 100.0f);
}
- func_800B8614(&this->actor, play, 100.0f);
}
-void func_80C088A4(EnNnh* this) {
- this->actionFunc = func_80C088B8;
+void EnNnh_SetupDialogue(EnNnh* this) {
+ this->actionFunc = EnNnh_Dialogue;
}
-void func_80C088B8(EnNnh* this, PlayState* play) {
+void EnNnh_Dialogue(EnNnh* this, PlayState* play) {
if (Actor_TextboxIsClosing(&this->actor, play)) {
- func_80C08828(this);
+ EnNnh_SetupWaitForDialogue(this);
}
}
@@ -109,5 +109,5 @@ void EnNnh_Draw(Actor* thisx, PlayState* play) {
func_8012C28C(gfxCtx);
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(gfxCtx->polyOpa.p++, object_nnh_DL_001510);
+ gSPDisplayList(gfxCtx->polyOpa.p++, gButlerSonMainBodyDL);
}
diff --git a/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c
index 3e977520d..ae3b3f04c 100644
--- a/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c
+++ b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c
@@ -5,6 +5,7 @@
*/
#include "z_en_okarina_effect.h"
+#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
@@ -58,7 +59,7 @@ void func_8096B104(EnOkarinaEffect* this, PlayState* play) {
void func_8096B174(EnOkarinaEffect* this, PlayState* play) {
DECR(this->unk144);
if ((play->pauseCtx.state == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
- (play->msgCtx.msgLength == 0) && !FrameAdvance_IsEnabled(&play->state) && this->unk144 == 0) {
+ (play->msgCtx.msgLength == 0) && !FrameAdvance_IsEnabled(&play->state) && (this->unk144 == 0)) {
EnOkarinaEffect_SetupAction(this, func_8096B1FC);
}
}
@@ -66,7 +67,7 @@ void func_8096B174(EnOkarinaEffect* this, PlayState* play) {
void func_8096B1FC(EnOkarinaEffect* this, PlayState* play) {
if (play->envCtx.unk_F2[4]) {
if ((play->state.frames & 3) == 0) {
- --play->envCtx.unk_F2[4];
+ play->envCtx.unk_F2[4]--;
if (play->envCtx.unk_F2[4] == 8) {
func_800FD858(play);
}
diff --git a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c
index 23f7640a2..40cb4ba24 100644
--- a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c
+++ b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c
@@ -17,7 +17,6 @@ void EnOkarinaTag_Update(Actor* thisx, PlayState* play);
void func_8093E518(EnOkarinaTag* this, PlayState* play);
void func_8093E68C(EnOkarinaTag* this, PlayState* play);
-#if 0
const ActorInit En_Okarina_Tag_InitVars = {
ACTOR_EN_OKARINA_TAG,
ACTORCAT_SWITCH,
@@ -30,14 +29,122 @@ const ActorInit En_Okarina_Tag_InitVars = {
(ActorFunc)NULL,
};
-#endif
+void EnOkarinaTag_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Okarina_Tag/EnOkarinaTag_Destroy.s")
+void EnOkarinaTag_Init(Actor* thisx, PlayState* play) {
+ EnOkarinaTag* this = THIS;
+ f32 zRot = 0.0f;
+ s32 i = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Okarina_Tag/EnOkarinaTag_Init.s")
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ this->unk148 = ENOKARINATAG_GET_F800(thisx);
+ this->unk14A = ENOKARINATAG_GET_780(thisx);
+ this->switchFlags = ENOKARINATAG_GET_SWITCHFLAGS(thisx);
+ if (this->actor.world.rot.z > 0) {
+ zRot = this->actor.world.rot.z;
+ while (zRot > 10.0f) {
+ zRot -= 10.0f;
+ i++;
+ }
+ }
+ this->unk154 = zRot * 50.0f;
+ this->unk158 = i * 50.0f;
+ if (this->switchFlags == 0x7F) {
+ this->switchFlags = -1;
+ }
+ if (this->unk14A == 0xF) {
+ this->unk14A = -1;
+ }
+ this->actor.targetMode = 1;
+ this->actionFunc = func_8093E518;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Okarina_Tag/func_8093E518.s")
+void func_8093E518(EnOkarinaTag* this, PlayState* play) {
+ f32 xzRange;
+ f32 yRange;
+ s16 yDiff;
+ u16 var_v1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Okarina_Tag/func_8093E68C.s")
+ if (this->switchFlags >= 0) {
+ if (this->unk148 == 0) {
+ if (Flags_GetSwitch(play, this->switchFlags)) {
+ return;
+ }
+ }
+ if (this->unk148 == 1) {
+ if (!Flags_GetSwitch(play, this->switchFlags)) {
+ return;
+ }
+ }
+ }
+ var_v1 = this->unk14A;
+ if (var_v1 == 6) {
+ var_v1 = 0xA;
+ if (gSaveContext.save.unk_F65 == 0) {
+ return;
+ }
+ }
+ if (this->unk14A == -1) {
+ var_v1 = 0;
+ }
+ if (func_800B8718(&this->actor, &play->state)) {
+ func_80152434(play, var_v1 + 0x29);
+ this->actionFunc = func_8093E68C;
+ } else {
+ yDiff = ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.world.rot.y));
+ if (yDiff >= 0x4300) {
+ this->unk150 = 0;
+ return;
+ }
+ xzRange = this->unk154;
+ this->unk150 = 1;
+ if (xzRange == 0.0f) {
+ xzRange = 50000.0f;
+ }
+ yRange = this->unk158;
+ if (yRange == 0.0f) {
+ yRange = 50000.0f;
+ }
+ func_800B874C(&this->actor, play, xzRange, yRange);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Okarina_Tag/EnOkarinaTag_Update.s")
+void func_8093E68C(EnOkarinaTag* this, PlayState* play) {
+ if (play->msgCtx.ocarinaMode == 4) {
+ this->actionFunc = func_8093E518;
+ } else {
+ if ((play->msgCtx.ocarinaMode == 3) ||
+ ((this->unk14A == -1) &&
+ ((play->msgCtx.ocarinaMode == 5) || (play->msgCtx.ocarinaMode == 6) || (play->msgCtx.ocarinaMode == 7) ||
+ (play->msgCtx.ocarinaMode == 8) || (play->msgCtx.ocarinaMode == 0xA) || (play->msgCtx.ocarinaMode == 9) ||
+ (play->msgCtx.ocarinaMode == 0xF)))) {
+ if (this->switchFlags >= 0) {
+ switch (this->unk148) {
+ case 0:
+ Flags_SetSwitch(play, this->switchFlags);
+ break;
+ case 1:
+ Flags_UnsetSwitch(play, this->switchFlags);
+ break;
+ case 2:
+ if (Flags_GetSwitch(play, this->switchFlags)) {
+ Flags_UnsetSwitch(play, this->switchFlags);
+ } else {
+ Flags_SetSwitch(play, this->switchFlags);
+ }
+ break;
+ }
+ }
+ play->msgCtx.ocarinaMode = 4;
+ play_sound(NA_SE_SY_CORRECT_CHIME);
+ this->actionFunc = func_8093E518;
+ }
+ }
+}
+
+void EnOkarinaTag_Update(Actor* thisx, PlayState* play) {
+ EnOkarinaTag* this = THIS;
+
+ this->actionFunc(this, play);
+}
diff --git a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h
index 6825adb4d..8dd51805c 100644
--- a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h
+++ b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.h
@@ -7,10 +7,19 @@ struct EnOkarinaTag;
typedef void (*EnOkarinaTagActionFunc)(struct EnOkarinaTag*, PlayState*);
+#define ENOKARINATAG_GET_SWITCHFLAGS(thisx) (((thisx)->params & 0x7F))
+#define ENOKARINATAG_GET_780(thisx) (((thisx)->params >> 0x7) & 0xF)
+#define ENOKARINATAG_GET_F800(thisx) (((thisx)->params >> 0xB) & 0x1F)
+
typedef struct EnOkarinaTag {
/* 0x000 */ Actor actor;
/* 0x144 */ EnOkarinaTagActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x14];
+ /* 0x148 */ s16 unk148;
+ /* 0x14A */ s16 unk14A;
+ /* 0x14C */ s32 switchFlags;
+ /* 0x150 */ s8 unk150;
+ /* 0x154 */ f32 unk154;
+ /* 0x158 */ f32 unk158;
} EnOkarinaTag; // size = 0x15C
extern const ActorInit En_Okarina_Tag_InitVars;
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 dcef97ec1..ad10226ed 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
@@ -377,12 +377,12 @@ void func_80B5BFB8(EnOt* this, PlayState* play) {
void func_80B5C154(EnOt* this, PlayState* play) {
if (gSaveContext.save.weekEventReg[32] & 1) {
- this->unk_38C = GI_RUPEE_RED;
+ this->getItemId = GI_RUPEE_RED;
} else {
- this->unk_38C = GI_HEART_PIECE;
+ this->getItemId = GI_HEART_PIECE;
gSaveContext.save.weekEventReg[32] |= 1;
}
- Actor_PickUp(&this->actor, play, this->unk_38C, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_PickUp(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_80B5C1CC;
}
@@ -392,7 +392,7 @@ void func_80B5C1CC(EnOt* this, PlayState* play) {
func_80B5C244(this, play);
func_80B5C244(this->unk_360, play);
} else {
- Actor_PickUp(&this->actor, play, this->unk_38C, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_PickUp(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
}
}
diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.h b/src/overlays/actors/ovl_En_Ot/z_en_ot.h
index 6f4bf2105..e123b8871 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.h
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.h
@@ -52,7 +52,7 @@ typedef struct EnOt {
/* 0x378 */ Vec3f unk_378;
/* 0x384 */ u8 unk_384;
/* 0x388 */ s32 unk_388;
- /* 0x38C */ s32 unk_38C;
+ /* 0x38C */ s32 getItemId;
/* 0x390 */ s16 unk_390;
/* 0x394 */ Vec3f unk_394;
/* 0x3A0 */ s16 unk_3A0;
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
index a848f43a3..603d08fb5 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
@@ -5,9 +5,8 @@
*/
#include "z_en_pamera.h"
-#include "../ovl_En_Bom/z_en_bom.h"
-#include "../ovl_En_Door/z_en_door.h"
-#include "objects/object_pamera/object_pamera.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
+#include "overlays/actors/ovl_En_Door/z_en_door.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
@@ -136,8 +135,8 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
Vec3f sp44;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 15.0f);
- SkelAnime_InitFlex(play, &this->skelAnime, &object_pamera_Skel_008448, &object_pamera_Anim_0005BC, this->jointTable,
- this->morphTable, PAMERA_LIMB_MAX);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gPamelaSkel, &object_pamera_Anim_0005BC, this->jointTable,
+ this->morphTable, PAMELA_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit2);
@@ -511,9 +510,9 @@ void func_80BD94E0(EnPamera* this, PlayState* play) {
if ((this->actionFunc != func_80BD8B70) && (this->actionFunc != func_80BD8964) &&
(this->actionFunc != func_80BD909C) && (this->actionFunc != func_80BD8D1C) &&
((this->actionFunc != func_80BD8DB0) || (this->actor.speedXZ == 3.0f))) {
- Actor_TrackPlayer(play, &this->actor, &this->limb9Rot, &this->limb8Rot, this->actor.focus.pos);
+ Actor_TrackPlayer(play, &this->actor, &this->headRot, &this->torsoRot, this->actor.focus.pos);
} else {
- Actor_TrackNone(&this->limb9Rot, &this->limb8Rot);
+ Actor_TrackNone(&this->headRot, &this->torsoRot);
}
}
@@ -534,9 +533,9 @@ void EnPamera_Update(Actor* thisx, PlayState* play) {
s32 EnPamera_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnPamera* this = THIS;
- if (limbIndex == PAMERA_LIMB_HAIR) {
- rot->x += this->limb9Rot.y;
- rot->z += this->limb9Rot.x;
+ if (limbIndex == PAMELA_LIMB_HEAD) {
+ rot->x += this->headRot.y;
+ rot->z += this->headRot.x;
}
return false;
}
@@ -544,7 +543,7 @@ s32 EnPamera_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
void EnPamera_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnPamera* this = THIS;
- if (limbIndex == PAMERA_LIMB_HAIR) {
+ if (limbIndex == PAMELA_LIMB_HEAD) {
Matrix_MultVec3f(&D_80BDA5F0, &this->actor.focus.pos);
}
}
@@ -858,7 +857,7 @@ void func_80BDA344(Actor* thisx, PlayState* play) {
if (!(gSaveContext.save.weekEventReg[61] & 4)) {
gSaveContext.save.weekEventReg[61] |= 4;
}
- Actor_TrackNone(&this->limb9Rot, &this->limb8Rot);
+ Actor_TrackNone(&this->headRot, &this->torsoRot);
} else {
func_80BD94E0(this, play);
if (this->actionFunc == func_80BD994C) {
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
index 0cebc213f..cf5611c4e 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
@@ -2,36 +2,10 @@
#define Z_EN_PAMERA_H
#include "global.h"
+#include "objects/object_pamera/object_pamera.h"
struct EnPamera;
-typedef enum {
- /* 00 */ PAMERA_LIMB_NONE,
- /* 01 */ PAMERA_LIMB_ROOT,
- /* 02 */ PAMERA_LIMB_SHOULDER_LEFT,
- /* 03 */ PAMERA_LIMB_FOREARM_LEFT,
- /* 04 */ PAMERA_LIMB_HAND_LEFT,
- /* 05 */ PAMERA_LIMB_SHOULDER_RIGHT,
- /* 06 */ PAMERA_LIMB_FOREARM_RIGHT,
- /* 07 */ PAMERA_LIMB_HAND_RIGHT,
- /* 08 */ PAMERA_LIMB_HEAD_FRONT_AND_TOP,
- /* 09 */ PAMERA_LIMB_HAIR,
- /* 10 */ PAMERA_LIMB_TORSO_FRONT,
- /* 11 */ PAMERA_LIMB_NECK,
- /* 12 */ PAMERA_LIMB_THIGH_LEFT,
- /* 13 */ PAMERA_LIMB_LEG_LEFT,
- /* 14 */ PAMERA_LIMB_FOOT_LEFT,
- /* 15 */ PAMERA_LIMB_THIGH_RIGHT,
- /* 16 */ PAMERA_LIMB_LEG_RIGHT,
- /* 17 */ PAMERA_LIMB_FOOT_RIGHT,
- /* 18 */ PAMERA_DRESS_FRONT,
- /* 19 */ PAMERA_DRESS_BACK,
- /* 20 */ PAMERA_DRESS_SIDES,
- /* 21 */ PAMERA_LIMB_UNK,
- /* 22 */ PAMERA_LIMB_UNK2,
- /* 23 */ PAMERA_LIMB_MAX
-} ObjectPameraLimbs;
-
typedef void (*EnPameraActionFunc)(struct EnPamera*, PlayState*);
typedef void (*EnPameraSetupFunc)(struct EnPamera*, PlayState*);
@@ -46,10 +20,10 @@ typedef struct EnPamera {
/* 0x1E4 */ s32 pathPointsCount;
/* 0x1E8 */ s32 pathId;
/* 0x1EC */ s32 unk_1EC;
- /* 0x1F0 */ Vec3s jointTable[PAMERA_LIMB_MAX];
- /* 0x27A */ Vec3s morphTable[PAMERA_LIMB_MAX];
- /* 0x304 */ Vec3s limb9Rot;
- /* 0x30A */ Vec3s limb8Rot;
+ /* 0x1F0 */ Vec3s jointTable[PAMELA_LIMB_MAX];
+ /* 0x27A */ Vec3s morphTable[PAMELA_LIMB_MAX];
+ /* 0x304 */ Vec3s headRot;
+ /* 0x30A */ Vec3s torsoRot; // Set, but not used
/* 0x310 */ s16 unk_310;
/* 0x312 */ s16 unk_312;
/* 0x314 */ s16 unk_314;
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 e47ca26b8..420d40b78 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -8,7 +8,6 @@
#include "z64rumble.h"
#include "overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
-#include "objects/object_bigslime/object_bigslime.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -1370,16 +1369,16 @@ void EnPametfrog_Update(Actor* thisx, PlayState* play) {
/* value -1: Limb Not used
* value 0: GEKKO_LIMB_WAIST
- * value 1: GEKKO_LIMB_L_SHIN
- * value 2: GEKKO_LIMB_L_FOOT
- * value 3: GEKKO_LIMB_R_SHIN
- * value 4: GEKKO_LIMB_R_FOOT
- * value 5: GEKKO_LIMB_L_UPPER_ARM
- * value 6: GEKKO_LIMB_L_FOREARM
- * value 7: GEKKO_LIMB_L_HAND
- * value 8: GEKKO_LIMB_R_UPPER_ARM
- * value 9: GEKKO_LIMB_R_FOREARM
- * value 10: GEKKO_LIMB_R_HAND
+ * value 1: GEKKO_LIMB_LEFT_SHIN
+ * value 2: GEKKO_LIMB_LEFT_FOOT
+ * value 3: GEKKO_LIMB_RIGHT_SHIN
+ * value 4: GEKKO_LIMB_RIGHT_FOOT
+ * value 5: GEKKO_LIMB_LEFT_UPPER_ARM
+ * value 6: GEKKO_LIMB_LEFT_FOREARM
+ * value 7: GEKKO_LIMB_LEFT_HAND
+ * value 8: GEKKO_LIMB_RIGHT_UPPER_ARM
+ * value 9: GEKKO_LIMB_RIGHT_FOREARM
+ * value 10: GEKKO_LIMB_RIGHT_HAND
* value 11: GEKKO_LIMB_JAW
*/
static s8 limbPosIndex[] = {
diff --git a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
index 2b5626109..3f3e82165 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
@@ -2,6 +2,7 @@
#define Z_EN_PAMETFROG_H
#include "global.h"
+#include "objects/object_bigslime/object_bigslime.h"
struct EnPametfrog;
@@ -20,34 +21,6 @@ typedef enum {
/* 0x9 */ GEKKO_DEFEAT,
} EnPametfrogState;
-typedef enum {
- /* 0x00 */ GEKKO_LIMB_NONE,
- /* 0x01 */ GEKKO_LIMB_ROOT,
- /* 0x02 */ GEKKO_LIMB_WAIST,
- /* 0x03 */ GEKKO_LIMB_L_THIGH,
- /* 0x04 */ GEKKO_LIMB_L_SHIN,
- /* 0x05 */ GEKKO_LIMB_L_ANKLE,
- /* 0x06 */ GEKKO_LIMB_L_FOOT,
- /* 0x07 */ GEKKO_LIMB_R_THIGH,
- /* 0x08 */ GEKKO_LIMB_R_SHIN,
- /* 0x09 */ GEKKO_LIMB_R_ANKLE,
- /* 0x0A */ GEKKO_LIMB_R_FOOT,
- /* 0x0B */ GEKKO_LIMB_TORSO,
- /* 0x0C */ GEKKO_LIMB_L_UPPER_ARM,
- /* 0x0D */ GEKKO_LIMB_L_FOREARM,
- /* 0x0E */ GEKKO_LIMB_L_WRIST,
- /* 0x0F */ GEKKO_LIMB_L_HAND,
- /* 0x10 */ GEKKO_LIMB_R_UPPER_ARM,
- /* 0x11 */ GEKKO_LIMB_R_FOREARM,
- /* 0x12 */ GEKKO_LIMB_R_WRIST,
- /* 0x13 */ GEKKO_LIMB_R_HAND,
- /* 0x14 */ GEKKO_LIMB_HEAD,
- /* 0x15 */ GEKKO_LIMB_JAW,
- /* 0x16 */ GEKKO_LIMB_L_EYE,
- /* 0x17 */ GEKKO_LIMB_R_EYE,
- /* 0x18 */ GEKKO_LIMB_MAX,
-} EnPametfrogLimb;
-
typedef struct EnPametfrog {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
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 9a70ce02c..4ee47164f 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
@@ -1,12 +1,11 @@
/*
* File: z_en_po_sisters.c
* Overlay: ovl_En_Po_Sisters
- * Description: Poe Sisters
+ * Description: Poe Sisters (fought in a mini-game in Ikana for a HP)
*/
#include "z_en_po_sisters.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#include "objects/object_po_sisters/object_po_sisters.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
@@ -17,49 +16,49 @@ void EnPoSisters_Destroy(Actor* thisx, PlayState* play);
void EnPoSisters_Update(Actor* thisx, PlayState* play);
void EnPoSisters_Draw(Actor* thisx, PlayState* play);
-void func_80B1AA88(EnPoSisters* this);
-void func_80B1AAE8(EnPoSisters* this, PlayState* play);
-void func_80B1ABB8(EnPoSisters* this, PlayState* play);
-void func_80B1AC40(EnPoSisters* this);
-void func_80B1ACB8(EnPoSisters* this, PlayState* play);
-void func_80B1AE28(EnPoSisters* this);
-void func_80B1AE3C(EnPoSisters* this, PlayState* play);
-void func_80B1AF8C(EnPoSisters* this);
-void func_80B1B020(EnPoSisters* this, PlayState* play);
-void func_80B1B0E0(EnPoSisters* this);
-void func_80B1B168(EnPoSisters* this, PlayState* play);
-void func_80B1B2F0(EnPoSisters* this, PlayState* play);
-void func_80B1B444(EnPoSisters* this, PlayState* play);
-void func_80B1B5B4(EnPoSisters* this);
-void func_80B1B628(EnPoSisters* this, PlayState* play);
-void func_80B1B70C(EnPoSisters* this);
-void func_80B1B7BC(EnPoSisters* this, PlayState* play);
-void func_80B1B860(EnPoSisters* this, PlayState* play);
-void func_80B1B940(EnPoSisters* this, PlayState* play);
-void func_80B1BA3C(EnPoSisters* this);
-void func_80B1BA90(EnPoSisters* this, PlayState* play);
-void func_80B1BC4C(EnPoSisters* this, PlayState* play);
-void func_80B1BCA0(EnPoSisters* this, PlayState* play);
-void func_80B1BCF0(EnPoSisters* this, PlayState* play);
-void func_80B1BE4C(EnPoSisters* this, s32 arg1);
-void func_80B1BF2C(EnPoSisters* this, PlayState* play);
-void func_80B1C030(EnPoSisters* this);
-void func_80B1C0A4(EnPoSisters* this, PlayState* play);
-void func_80B1C2E8(EnPoSisters* this);
-void func_80B1C340(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupObserverIdle(EnPoSisters* this);
+void EnPoSisters_ObserverIdle(EnPoSisters* this, PlayState* play);
+void EnPoSisters_AimlessIdleFlying2(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupAimlessIdleFlying(EnPoSisters* this);
+void EnPoSisters_AimlessIdleFlying(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupInvestigating(EnPoSisters* this);
+void EnPoSisters_Investigating(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupSpinUp(EnPoSisters* this);
+void EnPoSisters_SpinUp(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupSpinAttack(EnPoSisters* this);
+void EnPoSisters_SpinAttack(EnPoSisters* this, PlayState* play);
+void EnPoSisters_AttackConnectDrift(EnPoSisters* this, PlayState* play);
+void EnPoSisters_DamageFlinch(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupFlee(EnPoSisters* this);
+void EnPoSisters_Flee(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupSpinToInvis(EnPoSisters* this);
+void EnPoSisters_SpinToInvis(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupSpinBackToVisible(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SpinBackToVisible(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupDeathStage1(EnPoSisters* this);
+void EnPoSisters_DeathStage1(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupDeathStage2(EnPoSisters* this, PlayState* play);
+void EnPoSisters_DeathStage2(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SpawnMegClones(EnPoSisters* this, PlayState* play);
+void EnPoSisters_MegCloneVanish(EnPoSisters* this, PlayState* play);
+void EnPoSisters_MegCloneWaitForSpinBack(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupMegSurroundPlayer(EnPoSisters* this);
+void EnPoSisters_MegSurroundPlayer(EnPoSisters* this, PlayState* play);
+void EnPoSisters_SetupSpawnPo(EnPoSisters* this);
+void EnPoSisters_PoeSpawn(EnPoSisters* this, PlayState* play);
-static Color_RGBA8 D_80B1DA30[] = {
- { 255, 170, 255, 255 },
- { 255, 200, 0, 255 },
- { 0, 170, 255, 255 },
- { 170, 255, 0, 255 },
+static Color_RGBA8 sPoSisterFlameColors[] = {
+ { 255, 170, 255, 255 }, // Meg
+ { 255, 200, 0, 255 }, // Jo
+ { 0, 170, 255, 255 }, // Beth
+ { 170, 255, 0, 255 }, // Amy
};
-static Color_RGBA8 D_80B1DA40[] = {
- { 100, 0, 255, 255 },
- { 255, 0, 0, 255 },
- { 0, 0, 255, 255 },
- { 0, 150, 0, 255 },
+static Color_RGBA8 sPoSisterEnvColors[] = {
+ { 100, 0, 255, 255 }, // Meg
+ { 255, 0, 0, 255 }, // Jo
+ { 0, 0, 255, 255 }, // Beth
+ { 0, 150, 0, 255 }, // Amy
};
const ActorInit En_Po_Sisters_InitVars = {
@@ -94,41 +93,50 @@ static ColliderCylinderInit sCylinderInit = {
{ 18, 60, 15, { 0, 0, 0 } },
};
+// health:6, mass:50
static CollisionCheckInfoInit sColChkInfoInit = { 6, 25, 60, 50 };
+typedef enum {
+ /* 0x0 */ POSISTERS_DAMAGEEFFECT_NOEFFECT,
+ /* 0x1 */ POSISTERS_DAMAGEEFFECT_UNKDMG12, // set in DamageTable, but unused
+ /* 0x4 */ POSISTERS_DAMAGEEFFECT_LIGHTARROWS = 0x4,
+ /* 0xE */ POSISTERS_DAMAGEEFFECT_SPINATTACK = 0xE,
+ /* 0xF */ POSISTERS_DAMAGEEFFECT_DEKUNUT = 0xF,
+} PoSisterDamageEffect;
+
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(0, 0xF),
- /* Deku Stick */ DMG_ENTRY(1, 0x0),
- /* Horse trample */ DMG_ENTRY(1, 0x0),
- /* Explosives */ DMG_ENTRY(1, 0x0),
- /* Zora boomerang */ DMG_ENTRY(1, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0),
- /* Hookshot */ DMG_ENTRY(1, 0x0),
- /* Goron punch */ DMG_ENTRY(1, 0x0),
- /* Sword */ DMG_ENTRY(1, 0x0),
- /* Goron pound */ DMG_ENTRY(0, 0x0),
- /* Fire arrow */ DMG_ENTRY(1, 0x0),
- /* Ice arrow */ DMG_ENTRY(1, 0x0),
- /* Light arrow */ DMG_ENTRY(2, 0x4),
- /* Goron spikes */ DMG_ENTRY(1, 0x0),
- /* Deku spin */ DMG_ENTRY(1, 0x0),
- /* Deku bubble */ DMG_ENTRY(1, 0x0),
- /* Deku launch */ DMG_ENTRY(2, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x1),
- /* Zora barrier */ DMG_ENTRY(0, 0x0),
- /* Normal shield */ DMG_ENTRY(0, 0x0),
- /* Light ray */ DMG_ENTRY(0, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0x0),
- /* Zora punch */ DMG_ENTRY(1, 0x0),
- /* Spin attack */ DMG_ENTRY(1, 0xE),
- /* Sword beam */ DMG_ENTRY(0, 0x0),
- /* Normal Roll */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1B */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1C */ DMG_ENTRY(0, 0x0),
- /* Unblockable */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1E */ DMG_ENTRY(0, 0x0),
- /* Powder Keg */ DMG_ENTRY(1, 0x0),
+ /* Deku Nut */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_DEKUNUT),
+ /* Deku Stick */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Horse trample */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Explosives */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Zora boomerang */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Normal arrow */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Hookshot */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Goron punch */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Sword */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Goron pound */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Fire arrow */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Ice arrow */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Light arrow */ DMG_ENTRY(2, POSISTERS_DAMAGEEFFECT_LIGHTARROWS),
+ /* Goron spikes */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Deku spin */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Deku bubble */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Deku launch */ DMG_ENTRY(2, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_UNKDMG12),
+ /* Zora barrier */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Normal shield */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Light ray */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Thrown object */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Zora punch */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Spin attack */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_SPINATTACK),
+ /* Sword beam */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Normal Roll */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Unblockable */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, POSISTERS_DAMAGEEFFECT_NOEFFECT),
+ /* Powder Keg */ DMG_ENTRY(1, POSISTERS_DAMAGEEFFECT_NOEFFECT),
};
static InitChainEntry sInitChain[] = {
@@ -136,52 +144,70 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 6000, ICHAIN_STOP),
};
+// clang-format off
+// PoSisters have their own flags variable for cross function behavior detection
+#define POSISTERS_FLAG_CLEAR (0)
+#define POSISTERS_FLAG_CHECK_AC (1 << 0)
+#define POSISTERS_FLAG_UPDATE_SHAPE_ROT (1 << 1)
+#define POSISTERS_FLAG_CHECK_Z_TARGET (1 << 2) // meg doesnt go invis if you ztarget her for too long
+#define POSISTERS_FLAG_MATCH_PLAYER_HEIGHT (1 << 3) // the po is attempting to level with player's height
+#define POSISTERS_FLAG_UPDATE_BGCHECK_INFO (1 << 4)
+#define POSISTERS_FLAG_UPDATE_FIRES (1 << 5) // firePos updated to match limb in PostLimbDraw
+#define POSISTERS_FLAG_REAL_MEG_ROTATION (1 << 6) // real meg rotates different than her clones for one cycle
+#define POSISTERS_FLAG_DRAW_TORCH (1 << 7)
+// clang-format on
+
void EnPoSisters_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnPoSisters* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 50.0f);
- SkelAnime_Init(play, &this->skelAnime, &object_po_sisters_Skel_0065C8, &object_po_sisters_Anim_0014CC,
- this->jointTable, this->morphTable, 12);
- this->unk_226 = 255;
- this->unk_227 = 255;
- this->unk_228 = 210;
- this->unk_229 = 255;
+ SkelAnime_Init(play, &this->skelAnime, &gPoSistersSkel, &gPoeSistersSwayAnim, this->jointTable, this->morphTable,
+ POSISTERS_LIMB_MAX);
+
+ this->color.r = 255;
+ this->color.g = 255;
+ this->color.b = 210;
+ this->color.a = 255;
this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
Lights_PointGlowSetInfo(&this->lightInfo, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, 0,
0, 0, 0);
+
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->unk_18C = ENPOSISTERS_GET_300(thisx);
- this->actor.hintId = this->unk_18C + 80;
- this->unk_18D = ENPOSISTERS_GET_C00(thisx);
- this->unk_18E = 32;
- this->unk_18F = 20;
- this->unk_190 = 1;
- this->unk_191 = 0x20;
- this->unk_2EC = 110.0f;
- thisx->flags &= ~1;
+ this->type = ENPOSISTERS_GET_TYPE(thisx);
+ this->actor.hintId = this->type + 80;
+ this->megCloneId = ENPOSISTERS_GET_MEG_CLONE_ID(thisx);
+ this->floatingBobbingTimer = 32;
+ this->zTargetTimer = 20;
+ this->fireCount = 1;
+ this->poSisterFlags = POSISTERS_FLAG_UPDATE_FIRES;
+ this->megDistToPlayer = 110.0f;
+ thisx->flags &= ~ACTOR_FLAG_1;
- if (ENPOSISTERS_GET_1000(&this->actor)) {
- func_80B1AA88(this);
- } else if (this->unk_18C == 0) {
- if (this->unk_18D == 0) {
+ if (ENPOSISTERS_GET_OBSERVER_FLAG(&this->actor)) {
+ // if flagged observer, they are a floating prop spawned by EnGb2 (po hut proprieter)
+ EnPoSisters_SetupObserverIdle(this);
+ } else if (this->type == POSISTER_TYPE_MEG) {
+ if (this->megCloneId == POSISTER_MEG_REAL) {
this->actor.colChkInfo.health = 8;
this->collider.info.toucher.damage = 16;
this->collider.base.ocFlags1 = (OC1_TYPE_PLAYER | OC1_ON);
- func_80B1BCF0(this, play);
- func_80B1C2E8(this);
+ EnPoSisters_SpawnMegClones(this, play);
+ EnPoSisters_SetupSpawnPo(this);
} else {
this->actor.flags &= ~(ACTOR_FLAG_200 | ACTOR_FLAG_4000);
this->collider.info.elemType = ELEMTYPE_UNK4;
this->collider.info.bumper.dmgFlags |= (0x40000 | 0x1);
this->collider.base.ocFlags1 = OC1_NONE;
- func_80B1BE4C(this, false);
+ EnPoSisters_MegCloneVanish(this, NULL);
}
} else {
- func_80B1C2E8(this);
+ EnPoSisters_SetupSpawnPo(this);
}
+
+ // ! @Weird: this actor doesn't accept params in this range, so params is just cleared
this->actor.params &= 0xFF;
}
@@ -192,58 +218,66 @@ void EnPoSisters_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80B1A648(EnPoSisters* this, s32 arg1, Vec3f* pos) {
+/**
+ * For some reason, it uses both deathTimer (param) and this->deathTimer.
+ */
+void EnPoSisters_UpdateDeathFlameSwirl(EnPoSisters* this, s32 deathTimerParam, Vec3f* pos) {
s32 i;
- Vec3f* ptr;
- f32 temp_f20 = arg1;
+ Vec3f* firePos;
+ f32 deathTimerParamF = deathTimerParam;
- for (i = 0; i < this->unk_190; i++) {
- ptr = &this->unk_22C[i];
- ptr->x = Math_SinS(this->actor.shape.rot.y + (this->unk_192 * 0x800) + (i * 0x2000)) * (SQ(temp_f20) * 0.1f) +
- pos->x;
- ptr->z = Math_CosS(this->actor.shape.rot.y + (this->unk_192 * 0x800) + (i * 0x2000)) * (SQ(temp_f20) * 0.1f) +
- pos->z;
- ptr->y = pos->y + temp_f20;
+ for (i = 0; i < this->fireCount; i++) {
+ firePos = &this->firePos[i];
+ firePos->x = Math_SinS(this->actor.shape.rot.y + (this->deathTimer * 0x800) + (i * 0x2000)) *
+ (SQ(deathTimerParamF) * 0.1f) +
+ pos->x;
+ firePos->z = Math_CosS(this->actor.shape.rot.y + (this->deathTimer * 0x800) + (i * 0x2000)) *
+ (SQ(deathTimerParamF) * 0.1f) +
+ pos->z;
+ firePos->y = pos->y + deathTimerParamF;
}
}
-void func_80B1A768(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_MatchPlayerXZ(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- f32 sp20;
+ f32 dist;
- if ((this->unk_18D == 0) || (this->actionFunc != func_80B1B444)) {
- if (((player->meleeWeaponState == 0) || (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H)) &&
+ if (this->megCloneId == POSISTER_MEG_REAL || this->actionFunc != EnPoSisters_DamageFlinch) {
+ if ((player->meleeWeaponState == 0 || player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) &&
((player->actor.world.pos.y - player->actor.floorHeight) < 1.0f)) {
- Math_StepToF(&this->unk_2EC, 110.0f, 3.0f);
+ Math_StepToF(&this->megDistToPlayer, 110.0f, 3.0f);
} else {
- Math_StepToF(&this->unk_2EC, 170.0f, 10.0f);
+ Math_StepToF(&this->megDistToPlayer, 170.0f, 10.0f);
}
- sp20 = this->unk_2EC;
- } else if (this->unk_18D != 0) { // An else would be sufficient
- sp20 = this->actor.parent->xzDistToPlayer;
+ dist = this->megDistToPlayer;
+ } else if (this->megCloneId != POSISTER_MEG_REAL) {
+ dist = this->actor.parent->xzDistToPlayer;
}
- this->actor.world.pos.x = (Math_SinS(BINANG_ROT180(this->actor.shape.rot.y)) * sp20) + player->actor.world.pos.x;
- this->actor.world.pos.z = (Math_CosS(BINANG_ROT180(this->actor.shape.rot.y)) * sp20) + player->actor.world.pos.z;
+ this->actor.world.pos.x = (Math_SinS(BINANG_ROT180(this->actor.shape.rot.y)) * dist) + player->actor.world.pos.x;
+ this->actor.world.pos.z = (Math_CosS(BINANG_ROT180(this->actor.shape.rot.y)) * dist) + player->actor.world.pos.z;
}
-void func_80B1A894(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_MatchPlayerY(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(play);
+ // equalize to player height
Math_ApproachF(&this->actor.world.pos.y, player->actor.world.pos.y + 5.0f, 0.5f, 3.0f);
- if (this->unk_18E == 0) {
- this->unk_18E = 32;
- if (this->unk_18E) {}
+ if (this->floatingBobbingTimer == 0) {
+ this->floatingBobbingTimer = 32;
+ //! FAKE:
+ if (this->floatingBobbingTimer) {}
}
- if (this->unk_18E != 0) {
- this->unk_18E--;
- }
+ DECR(this->floatingBobbingTimer);
- this->actor.world.pos.y += (2.0f + (0.5f * Rand_ZeroOne())) * Math_SinS(this->unk_18E * 0x800);
- if ((this->unk_229 == 255) && (this->actionFunc != func_80B1B168) && (this->actionFunc != func_80B1B020)) {
- if (this->actionFunc == func_80B1B628) {
+ // random float/flying wobble
+ this->actor.world.pos.y += (2.0f + (0.5f * Rand_ZeroOne())) * Math_SinS(this->floatingBobbingTimer * 0x800);
+
+ // fully opaque
+ if (this->color.a == 255 && this->actionFunc != EnPoSisters_SpinAttack && this->actionFunc != EnPoSisters_SpinUp) {
+ if (this->actionFunc == EnPoSisters_Flee) {
func_800B9010(&this->actor, NA_SE_EN_PO_AWAY - SFX_FLAG);
} else {
func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
@@ -251,614 +285,645 @@ void func_80B1A894(EnPoSisters* this, PlayState* play) {
}
}
-void func_80B1A9B0(EnPoSisters* this, PlayState* play) {
- if (this->actor.isTargeted && (this->unk_229 == 255)) {
- if (this->unk_18F != 0) {
- this->unk_18F--;
- }
+// check for z target
+void EnPoSisters_CheckZTarget(EnPoSisters* this, PlayState* play) {
+ if (this->actor.isTargeted && (this->color.a == 255)) {
+ DECR(this->zTargetTimer);
} else {
- this->unk_18F = 20;
+ this->zTargetTimer = 20;
}
- if (this->unk_229 == 0) {
- if (this->unk_194 != 0) {
- this->unk_194--;
- }
+ if (this->color.a == 0) {
+ DECR(this->invisibleTimer);
}
- if ((this->actionFunc != func_80B1B020) && (this->actionFunc != func_80B1B168) &&
- (this->actionFunc != func_80B1B444)) {
- if (this->unk_18F == 0) {
- func_80B1B70C(this);
- } else if ((this->unk_194 == 0) && (this->unk_229 == 0)) {
- func_80B1B860(this, play);
+ if ((this->actionFunc != EnPoSisters_SpinUp) && (this->actionFunc != EnPoSisters_SpinAttack) &&
+ (this->actionFunc != EnPoSisters_DamageFlinch)) {
+ if (this->zTargetTimer == 0) {
+ EnPoSisters_SetupSpinToInvis(this);
+ } else if ((this->invisibleTimer == 0) && (this->color.a == 0)) {
+ EnPoSisters_SetupSpinBackToVisible(this, play);
}
}
}
-void func_80B1AA88(EnPoSisters* this) {
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_0014CC, -3.0f);
+void EnPoSisters_SetupObserverIdle(EnPoSisters* this) {
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersSwayAnim, -3.0f);
this->actor.speedXZ = 0.0f;
- this->unk_192 = Rand_S16Offset(100, 50);
- this->actionFunc = func_80B1AAE8;
+ this->laughTimer = Rand_S16Offset(100, 50);
+ this->actionFunc = EnPoSisters_ObserverIdle;
}
-void func_80B1AAE8(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_ObserverIdle(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (DECR(this->unk_192) == 0) {
- this->unk_192 = Rand_S16Offset(100, 50);
+ if (DECR(this->laughTimer) == 0) {
+ this->laughTimer = Rand_S16Offset(100, 50);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
}
}
-void func_80B1AB5C(EnPoSisters* this) {
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_0014CC, -3.0f);
- this->unk_192 = Rand_S16Offset(2, 3);
+/**
+ * Change animation, but keep flying idle in straight line. Flying through walls possible.
+ *
+ * This is never reached because conditions are never met in EnPoSisters_AimlessIdleFlying
+ */
+void EnPoSisters_SetupAimlessIdleFlying2(EnPoSisters* this) {
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersSwayAnim, -3.0f);
+ this->idleFlyingAnimationCounter = Rand_S16Offset(2, 3);
this->actor.speedXZ = 0.0f;
- this->actionFunc = func_80B1ABB8;
+ this->actionFunc = EnPoSisters_AimlessIdleFlying2;
}
-void func_80B1ABB8(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_AimlessIdleFlying2(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- if (this->unk_192 != 0) {
- this->unk_192--;
- }
+ DECR(this->idleFlyingAnimationCounter);
}
- if ((this->unk_192 == 0) || (this->actor.xzDistToPlayer < 600.0f)) {
- func_80B1AC40(this);
+ if ((this->idleFlyingAnimationCounter == 0) || (this->actor.xzDistToPlayer < 600.0f)) {
+ EnPoSisters_SetupAimlessIdleFlying(this);
}
}
-void func_80B1AC40(EnPoSisters* this) {
- if (this->actionFunc != func_80B1AE3C) {
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_000D40, -3.0f);
+/**
+ * Flying in a straight line, until wall or player comes near.
+ */
+void EnPoSisters_SetupAimlessIdleFlying(EnPoSisters* this) {
+ if (this->actionFunc != EnPoSisters_Investigating) {
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersFloatAnim, -3.0f);
}
- this->unk_192 = Rand_S16Offset(15, 3);
- this->unk_191 |= (0x6 | 0x1);
- this->actionFunc = func_80B1ACB8;
+ this->idleFlyingAnimationCounter = Rand_S16Offset(15, 3);
+ this->poSisterFlags |= (POSISTERS_FLAG_CHECK_Z_TARGET | POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC);
+ this->actionFunc = EnPoSisters_AimlessIdleFlying;
}
-void func_80B1ACB8(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_AimlessIdleFlying(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
Math_StepToF(&this->actor.speedXZ, 1.0f, 0.2f);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- if (this->unk_192 != 0) {
- this->unk_192--;
- }
+ DECR(this->idleFlyingAnimationCounter);
}
if ((this->actor.xzDistToPlayer < 600.0f) && (fabsf(this->actor.playerHeightRel + 5.0f) < 30.0f)) {
- func_80B1AE28(this);
- } else if ((this->unk_192 == 0) && Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f)) {
- func_80B1AB5C(this);
+ EnPoSisters_SetupInvestigating(this);
+ } else if ((this->idleFlyingAnimationCounter == 0) && Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f)) {
+ // ! @bug: this is never reached because speedXZ is reduced
+ // at the same rate it is increased at the top of this function
+ EnPoSisters_SetupAimlessIdleFlying2(this);
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & 8) { // touching a wall
Math_ScaledStepToS(&this->actor.world.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x71C);
} else if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 600.0f) {
Math_ScaledStepToS(&this->actor.world.rot.y, Actor_YawToPoint(&this->actor, &this->actor.home.pos), 0x71C);
}
}
-void func_80B1AE28(EnPoSisters* this) {
- this->actionFunc = func_80B1AE3C;
+/**
+ * Not yet agressive, gently flying/steering toward the player.
+ */
+void EnPoSisters_SetupInvestigating(EnPoSisters* this) {
+ this->actionFunc = EnPoSisters_Investigating;
}
-void func_80B1AE3C(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_Investigating(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 sp22;
+ s16 yawDiff;
SkelAnime_Update(&this->skelAnime);
- sp22 = this->actor.yawTowardsPlayer - player->actor.shape.rot.y;
+ yawDiff = this->actor.yawTowardsPlayer - player->actor.shape.rot.y;
Math_StepToF(&this->actor.speedXZ, 2.0f, 0.2f);
- if (sp22 > 0x3000) {
+ if (yawDiff > 0x3000) {
Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer + 0x3000, 0x71C);
- } else if (sp22 < -0x3000) {
+ } else if (yawDiff < -0x3000) {
Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer - 0x3000, 0x71C);
} else {
Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0x71C);
}
if ((this->actor.xzDistToPlayer < 320.0f) && (fabsf(this->actor.playerHeightRel + 5.0f) < 30.0f)) {
- func_80B1AF8C(this);
+ EnPoSisters_SetupSpinUp(this);
} else if (this->actor.xzDistToPlayer > 720.0f) {
- func_80B1AC40(this);
+ EnPoSisters_SetupAimlessIdleFlying(this);
}
}
-void func_80B1AF8C(EnPoSisters* this) {
- if (this->unk_229 != 0) {
+/**
+ * Gaining speed for spin attack before the actual attack, winding up.
+ */
+void EnPoSisters_SetupSpinUp(EnPoSisters* this) {
+ if (this->color.a != 0) {
this->collider.base.colType = COLTYPE_METAL;
this->collider.base.acFlags |= AC_HARD;
}
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_000114, -5.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gPoSistersAttackAnim, -5.0f);
this->actor.speedXZ = 0.0f;
- this->unk_192 = Animation_GetLastFrame(&object_po_sisters_Anim_000114.common) * 3 + 3;
- this->unk_191 &= ~2;
- this->actionFunc = func_80B1B020;
+ this->spinupTimer = Animation_GetLastFrame(&gPoSistersAttackAnim.common) * 3 + 3;
+ this->poSisterFlags &= ~POSISTERS_FLAG_UPDATE_SHAPE_ROT;
+ this->actionFunc = EnPoSisters_SpinUp;
}
-void func_80B1B020(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_SpinUp(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (this->unk_192 != 0) {
- this->unk_192--;
- }
-
- this->actor.shape.rot.y += ((s32)((this->skelAnime.endFrame + 1.0f) * 3.0f) - this->unk_192) * 0x180;
-
- if ((this->unk_192 == 18) || (this->unk_192 == 7)) {
+ DECR(this->spinupTimer);
+ this->actor.shape.rot.y += ((s32)((this->skelAnime.endFrame + 1.0f) * 3.0f) - this->spinupTimer) * 0x180;
+ if ((this->spinupTimer == 18) || (this->spinupTimer == 7)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_ROLL);
- } else if (this->unk_192 == 0) {
- func_80B1B0E0(this);
+ } else if (this->spinupTimer == 0) {
+ EnPoSisters_SetupSpinAttack(this);
}
}
-void func_80B1B0E0(EnPoSisters* this) {
+void EnPoSisters_SetupSpinAttack(EnPoSisters* this) {
this->actor.speedXZ = 5.0f;
- if (this->unk_18C == 0) {
+ if (this->type == POSISTER_TYPE_MEG) {
this->collider.base.colType = COLTYPE_METAL;
this->collider.base.acFlags |= AC_HARD;
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_000114, -5.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gPoSistersAttackAnim, -5.0f);
}
- this->unk_192 = 5;
+
+ this->spinTimer = 5;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
- this->unk_191 |= 8;
- this->actionFunc = func_80B1B168;
+ this->poSisterFlags |= POSISTERS_FLAG_MATCH_PLAYER_HEIGHT;
+ this->actionFunc = EnPoSisters_SpinAttack;
}
-void func_80B1B168(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_SpinAttack(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- if (this->unk_192 != 0) {
- this->unk_192--;
- }
+ DECR(this->spinTimer);
}
this->actor.shape.rot.y += (s32)(1152.0f * this->skelAnime.endFrame);
- if (this->unk_192 == 0) {
+ if (this->spinTimer == 0) {
s16 rotY = this->actor.shape.rot.y - this->actor.world.rot.y;
if (ABS_ALT(rotY) < 0x1000) {
- if (this->unk_18C != 0) {
+ if (this->type != POSISTER_TYPE_MEG) {
this->collider.base.colType = COLTYPE_HIT3;
this->collider.base.acFlags &= ~AC_HARD;
- func_80B1AC40(this);
+ EnPoSisters_SetupAimlessIdleFlying(this);
} else {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
- func_80B1BE4C(this, play);
+ EnPoSisters_MegCloneVanish(this, play);
}
}
}
+
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_ROLL);
}
}
-void func_80B1B280(EnPoSisters* this) {
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_000D40, -3.0f);
+/**
+ * Attack has connected with player.
+ */
+void EnPoSisters_SetupAttackConnect(EnPoSisters* this) {
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersFloatAnim, -3.0f);
this->actor.world.rot.y = BINANG_ROT180(this->actor.yawTowardsPlayer);
- if (this->unk_18C != 0) {
+ if (this->type != POSISTER_TYPE_MEG) {
this->collider.base.colType = COLTYPE_HIT3;
this->collider.base.acFlags &= ~AC_HARD;
}
- this->actionFunc = func_80B1B2F0;
+
+ this->actionFunc = EnPoSisters_AttackConnectDrift;
}
-void func_80B1B2F0(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_AttackConnectDrift(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
this->actor.shape.rot.y -= (s16)(this->actor.speedXZ * 10.0f * 128.0f);
- if (Math_StepToF(&this->actor.speedXZ, 0.0f, 0.1f)) {
+
+ if (Math_StepToF(&this->actor.speedXZ, 0.0f, 0.1f)) { // wait to stop moving
this->actor.world.rot.y = this->actor.shape.rot.y;
- if (this->unk_18C != 0) {
- func_80B1AC40(this);
+ if (this->type != POSISTER_TYPE_MEG) {
+ EnPoSisters_SetupAimlessIdleFlying(this);
} else {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
- func_80B1BE4C(this, play);
+ EnPoSisters_MegCloneVanish(this, play);
}
}
}
-void func_80B1B3A8(EnPoSisters* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &object_po_sisters_Anim_0008C0, -3.0f);
+void EnPoSisters_SetupDamageFlinch(EnPoSisters* this) {
+ Animation_MorphToPlayOnce(&this->skelAnime, &gPoeSistersDamagedAnim, -3.0f);
if (this->collider.base.ac != NULL) {
func_800BE504(&this->actor, &this->collider);
}
- if (this->unk_18C != 0) {
+ if (this->type != POSISTER_TYPE_MEG) {
this->actor.speedXZ = 10.0f;
}
- this->unk_191 &= ~(0x8 | 0x2 | 0x1);
+ this->poSisterFlags &=
+ ~(POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC);
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 16);
- this->actionFunc = func_80B1B444;
+ this->actionFunc = EnPoSisters_DamageFlinch;
}
-void func_80B1B444(EnPoSisters* this, PlayState* play) {
- s32 temp_f18;
-
+void EnPoSisters_DamageFlinch(EnPoSisters* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime) && !(this->actor.flags & ACTOR_FLAG_8000)) {
if (this->actor.colChkInfo.health != 0) {
- if (this->unk_18C != 0) {
- func_80B1B5B4(this);
- } else if (this->unk_18D != 0) {
- func_80B1BE4C(this, 0);
+ if (this->type != POSISTER_TYPE_MEG) {
+ EnPoSisters_SetupFlee(this);
+ } else if (this->megCloneId != POSISTER_MEG_REAL) {
+ EnPoSisters_MegCloneVanish(this, NULL);
} else {
- func_80B1BE4C(this, play);
+ EnPoSisters_MegCloneVanish(this, play);
}
} else {
- func_80B1BA3C(this);
+ EnPoSisters_SetupDeathStage1(this);
}
}
- if (this->unk_18D != 0) {
+ if (this->megCloneId != POSISTER_MEG_REAL) {
+ s32 alpha;
+
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.parent->shape.rot.y,
- (this->unk_18D == 2) ? 0x800 : 0x400);
- temp_f18 = ((this->skelAnime.endFrame - this->skelAnime.curFrame) * 255.0f) / this->skelAnime.endFrame;
- this->unk_229 = CLAMP(temp_f18, 0, 255);
+ (this->megCloneId == POSISTER_MEG_CLONE2) ? 0x800 : 0x400);
+ alpha = ((this->skelAnime.endFrame - this->skelAnime.curFrame) * 255.0f) / this->skelAnime.endFrame;
+ this->color.a = CLAMP(alpha, 0, 255);
this->actor.world.pos.y = this->actor.parent->world.pos.y;
- func_80B1A768(this, play);
- } else if (this->unk_18C != 0) {
+ EnPoSisters_MatchPlayerXZ(this, play);
+
+ } else if (this->type != POSISTER_TYPE_MEG) {
Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
}
}
-void func_80B1B5B4(EnPoSisters* this) {
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_000A54, -3.0f);
+void EnPoSisters_SetupFlee(EnPoSisters* this) {
+ Animation_MorphToLoop(&this->skelAnime, &gPoSistersFleeAnim, -3.0f);
this->actor.world.rot.y = BINANG_ROT180(this->actor.shape.rot.y);
- this->unk_192 = 5;
- this->unk_191 |= (0x8 | 0x2 | 0x1);
+ this->fleeTimer = 5;
+ this->poSisterFlags |=
+ (POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC);
this->actor.speedXZ = 5.0f;
- this->actionFunc = func_80B1B628;
+ this->actionFunc = EnPoSisters_Flee;
}
-void func_80B1B628(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_Flee(EnPoSisters* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
Math_ScaledStepToS(&this->actor.world.rot.y, BINANG_ROT180(this->actor.yawTowardsPlayer), 0x71C);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- if (this->unk_192 != 0) {
- this->unk_192--;
- }
+ DECR(this->fleeTimer);
}
- if (this->actor.bgCheckFlags & 8) {
+ if (this->actor.bgCheckFlags & 8) { // touching a wall
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->unk_191 |= 2;
- func_80B1B70C(this);
- } else if ((this->unk_192 == 0) && (this->actor.xzDistToPlayer > 480.0f)) {
+ this->poSisterFlags |= POSISTERS_FLAG_UPDATE_SHAPE_ROT;
+ EnPoSisters_SetupSpinToInvis(this);
+ } else if (this->fleeTimer == 0 && this->actor.xzDistToPlayer > 480.0f) {
this->actor.world.rot.y = this->actor.shape.rot.y;
- func_80B1AC40(this);
+ EnPoSisters_SetupAimlessIdleFlying(this);
}
}
-void func_80B1B70C(EnPoSisters* this) {
- Animation_Change(&this->skelAnime, &object_po_sisters_Anim_00119C, 1.5f, 0.0f,
- Animation_GetLastFrame(&object_po_sisters_Anim_00119C.common), ANIMMODE_ONCE, -3.0f);
- this->unk_194 = 100;
+void EnPoSisters_SetupSpinToInvis(EnPoSisters* this) {
+ Animation_Change(&this->skelAnime, &gPoeSistersAppearDisappearAnim, 1.5f, 0.0f,
+ Animation_GetLastFrame(&gPoeSistersAppearDisappearAnim.common), ANIMMODE_ONCE, -3.0f);
+ this->invisibleTimer = 100; // 5 seconds
this->actor.speedXZ = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->unk_191 &= ~(0x4 | 0x1);
+ this->poSisterFlags &= ~(POSISTERS_FLAG_CHECK_Z_TARGET | POSISTERS_FLAG_CHECK_AC);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_DISAPPEAR);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
- this->actionFunc = func_80B1B7BC;
+ this->actionFunc = EnPoSisters_SpinToInvis;
}
-void func_80B1B7BC(EnPoSisters* this, PlayState* play) {
- s32 temp_f18;
-
+void EnPoSisters_SpinToInvis(EnPoSisters* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
- this->unk_229 = 0;
+ this->color.a = 0;
this->collider.info.bumper.dmgFlags = (0x40000 | 0x1);
- func_80B1AC40(this);
+ EnPoSisters_SetupAimlessIdleFlying(this);
} else {
- temp_f18 = ((this->skelAnime.endFrame - this->skelAnime.curFrame) * 255.0f) / this->skelAnime.endFrame;
- this->unk_229 = CLAMP(temp_f18, 0, 255);
+ s32 alpha = ((this->skelAnime.endFrame - this->skelAnime.curFrame) * 255.0f) / this->skelAnime.endFrame;
+
+ this->color.a = CLAMP(alpha, 0, 255);
}
}
-void func_80B1B860(EnPoSisters* this, PlayState* play) {
- Animation_Change(&this->skelAnime, &object_po_sisters_Anim_00119C, 1.5f, 0.0f,
- Animation_GetLastFrame(&object_po_sisters_Anim_00119C.common), ANIMMODE_ONCE, -3.0f);
- if (this->unk_18C == 0) {
- this->unk_2EC = 110.0f;
- func_80B1A768(this, play);
- this->unk_229 = 0;
+void EnPoSisters_SetupSpinBackToVisible(EnPoSisters* this, PlayState* play) {
+ Animation_Change(&this->skelAnime, &gPoeSistersAppearDisappearAnim, 1.5f, 0.0f,
+ Animation_GetLastFrame(&gPoeSistersAppearDisappearAnim.common), ANIMMODE_ONCE, -3.0f);
+ if (this->type == POSISTER_TYPE_MEG) {
+ this->megDistToPlayer = 110.0f;
+ EnPoSisters_MatchPlayerXZ(this, play);
+ this->color.a = 0;
this->actor.draw = EnPoSisters_Draw;
} else {
this->actor.world.rot.y = this->actor.shape.rot.y;
}
- this->unk_192 = 15;
+ this->spinInvisibleTimer = 15;
this->actor.speedXZ = 0.0f;
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
- this->unk_191 &= ~0x1;
- this->actionFunc = func_80B1B940;
+ this->poSisterFlags &= ~POSISTERS_FLAG_CHECK_AC;
+ this->actionFunc = EnPoSisters_SpinBackToVisible;
}
-void func_80B1B940(EnPoSisters* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
- this->unk_229 = 255;
- if (this->unk_18C != 0) {
- this->unk_191 |= 1;
+void EnPoSisters_SpinBackToVisible(EnPoSisters* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ this->color.a = 255; // fully visible
+ if (this->type != POSISTER_TYPE_MEG) {
+ this->poSisterFlags |= POSISTERS_FLAG_CHECK_AC;
this->collider.info.bumper.dmgFlags = ~(0x8000000 | 0x200000 | 0x100000 | 0x40000 | 0x1);
- if (this->unk_192 != 0) {
- this->unk_192--;
- }
- if (this->unk_192 == 0) {
- this->unk_18F = 20;
- func_80B1AC40(this);
+ DECR(this->spinInvisibleTimer);
+
+ if (this->spinInvisibleTimer == 0) {
+ this->zTargetTimer = 20;
+ EnPoSisters_SetupAimlessIdleFlying(this);
}
} else {
- func_80B1C030(this);
+ EnPoSisters_SetupMegSurroundPlayer(this);
}
} else {
- s32 temp_f18 = (this->skelAnime.curFrame * 255.0f) / this->skelAnime.endFrame;
+ s32 alpha = (this->skelAnime.curFrame * 255.0f) / this->skelAnime.endFrame;
- this->unk_229 = CLAMP(temp_f18, 0, 255);
- if (this->unk_18C == 0) {
- func_80B1A768(this, play);
+ this->color.a = CLAMP(alpha, 0, 255);
+ if (this->type == POSISTER_TYPE_MEG) {
+ EnPoSisters_MatchPlayerXZ(this, play);
}
}
}
-void func_80B1BA3C(EnPoSisters* this) {
- this->unk_192 = 0;
+void EnPoSisters_SetupDeathStage1(EnPoSisters* this) {
+ this->deathTimer = 0;
this->actor.speedXZ = 0.0f;
this->actor.world.pos.y += 42.0f;
this->actor.shape.yOffset = -6000.0f;
this->actor.flags &= ~ACTOR_FLAG_1;
- this->unk_191 = 0;
- this->actionFunc = func_80B1BA90;
+ this->poSisterFlags = POSISTERS_FLAG_CLEAR;
+ this->actionFunc = EnPoSisters_DeathStage1;
}
-void func_80B1BA90(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_DeathStage1(EnPoSisters* this, PlayState* play) {
s32 i;
- s32 end = this->unk_190;
+ s32 end = this->fireCount;
- this->unk_192++;
+ this->deathTimer++;
end++;
- if (end > ARRAY_COUNT(this->unk_22C)) {
- this->unk_190 = 8;
+ if (end > ARRAY_COUNT(this->firePos)) {
+ this->fireCount = 8;
} else {
- this->unk_190 = end;
+ this->fireCount = end;
}
- for (end = this->unk_190 - 1; end > 0; end--) {
- this->unk_22C[end] = this->unk_22C[end - 1];
+ for (end = this->fireCount - 1; end > 0; end--) {
+ this->firePos[end] = this->firePos[end - 1];
}
- this->unk_22C[0].x =
- (Math_SinS((this->actor.shape.rot.y + (this->unk_192 * 0x3000)) - 0x4000) * (3000.0f * this->actor.scale.x)) +
- this->actor.world.pos.x;
- this->unk_22C[0].z =
- (Math_CosS((this->actor.shape.rot.y + (this->unk_192 * 0x3000)) - 0x4000) * (3000.0f * this->actor.scale.x)) +
- this->actor.world.pos.z;
- if (this->unk_192 < 8) {
- this->unk_22C[0].y = this->unk_22C[1].y - 9.0f;
+ this->firePos[0].x = (Math_SinS((this->actor.shape.rot.y + (this->deathTimer * 0x3000)) - 0x4000) *
+ (3000.0f * this->actor.scale.x)) +
+ this->actor.world.pos.x;
+ this->firePos[0].z = (Math_CosS((this->actor.shape.rot.y + (this->deathTimer * 0x3000)) - 0x4000) *
+ (3000.0f * this->actor.scale.x)) +
+ this->actor.world.pos.z;
+
+ if (this->deathTimer < 8) {
+ this->firePos[0].y = this->firePos[1].y - 9.0f;
} else {
- this->unk_22C[0].y = this->unk_22C[1].y + 2.0f;
- if (this->unk_192 >= 16) {
+ this->firePos[0].y = this->firePos[1].y + 2.0f;
+ if (this->deathTimer >= 16) {
if (Math_StepToF(&this->actor.scale.x, 0.0f, 0.001f)) {
- func_80B1BC4C(this, play);
+ EnPoSisters_SetupDeathStage2(this, play);
}
this->actor.scale.z = this->actor.scale.x;
this->actor.scale.y = this->actor.scale.x;
}
}
- if (this->unk_192 == 16) {
+ if (this->deathTimer == 16) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WIZ_DISAPPEAR);
}
}
-void func_80B1BC4C(EnPoSisters* this, PlayState* play) {
- this->unk_192 = 0;
- this->actor.world.pos.y = this->unk_22C[0].y;
- Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x80);
- this->actionFunc = func_80B1BCA0;
+/**
+ * Fading away, the fire has split and circles outward and away.
+ */
+void EnPoSisters_SetupDeathStage2(EnPoSisters* this, PlayState* play) {
+ this->deathTimer = 0;
+ this->actor.world.pos.y = this->firePos[0].y;
+ Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, (0x8 << 4)); // drop table 8
+ this->actionFunc = EnPoSisters_DeathStage2;
}
-void func_80B1BCA0(EnPoSisters* this, PlayState* play) {
- this->unk_192++;
- if (this->unk_192 == 32) {
+void EnPoSisters_DeathStage2(EnPoSisters* this, PlayState* play) {
+ this->deathTimer++;
+
+ if (this->deathTimer == 32) {
Actor_MarkForDeath(&this->actor);
} else {
- func_80B1A648(this, this->unk_192, &this->actor.world.pos);
+ EnPoSisters_UpdateDeathFlameSwirl(this, this->deathTimer, &this->actor.world.pos);
}
}
-void func_80B1BCF0(EnPoSisters* this, PlayState* play) {
- Actor* sp4C = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0x400);
- Actor* sp48 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0x800);
- Actor* sp44 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0xC00);
+void EnPoSisters_SpawnMegClones(EnPoSisters* this, PlayState* play) {
+ Actor* clone1 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS,
+ this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
+ 0, ENPOSISTERS_PARAMS(false, POSISTER_MEG_CLONE1, POSISTER_TYPE_MEG));
+ Actor* clone2 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS,
+ this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
+ 0, ENPOSISTERS_PARAMS(false, POSISTER_MEG_CLONE2, POSISTER_TYPE_MEG));
+ Actor* clone3 = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_PO_SISTERS,
+ this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
+ 0, ENPOSISTERS_PARAMS(false, POSISTER_MEG_CLONE3, POSISTER_TYPE_MEG));
- if ((sp4C == NULL) || (sp48 == NULL) || (sp44 == NULL)) {
- if (sp4C != NULL) {
- Actor_MarkForDeath(sp4C);
+ // if we cannot spawn all clones: abort
+ if ((clone1 == NULL) || (clone2 == NULL) || (clone3 == NULL)) {
+ if (clone1 != NULL) {
+ Actor_MarkForDeath(clone1);
}
-
- if (sp48 != NULL) {
- Actor_MarkForDeath(sp48);
+ if (clone2 != NULL) {
+ Actor_MarkForDeath(clone2);
}
-
- if (sp44 != NULL) {
- Actor_MarkForDeath(sp44);
+ if (clone3 != NULL) {
+ Actor_MarkForDeath(clone3);
}
Actor_MarkForDeath(&this->actor);
}
}
-void func_80B1BE4C(EnPoSisters* this, s32 arg1) {
- Vec3f sp34;
+/**
+ * Meg and her clones vanish instantly and surround the player, instead of slowing fading while spinning to get
+ * Invulnerability.
+ *
+ * PlayState is an optional parameter, passed only when drawing the fire flash as they vanish.
+ */
+void EnPoSisters_MegCloneVanish(EnPoSisters* this, PlayState* play) {
+ Vec3f pos;
this->actor.draw = NULL;
this->actor.flags &= ~ACTOR_FLAG_1;
- this->unk_194 = 100;
- this->unk_191 = 0x20;
+ this->invisibleTimer = 100; // 5 seconds
+ this->poSisterFlags = POSISTERS_FLAG_UPDATE_FIRES;
this->collider.base.colType = COLTYPE_HIT3;
this->collider.base.acFlags &= ~AC_HARD;
- if (arg1) {
- sp34.x = this->actor.world.pos.x;
- sp34.y = this->actor.world.pos.y + 45.0f;
- sp34.z = this->actor.world.pos.z;
- func_800B3030(arg1, &sp34, &gZeroVec3f, &gZeroVec3f, 150, 0, 3);
+
+ if (play != NULL) {
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + 45.0f;
+ pos.z = this->actor.world.pos.z;
+ func_800B3030(play, &pos, &gZeroVec3f, &gZeroVec3f, 150, 0, 3); // spawns EffectSsDeadDb
}
- Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0);
- this->actionFunc = func_80B1BF2C;
+
+ Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0); // light OFF
+ this->actionFunc = EnPoSisters_MegCloneWaitForSpinBack;
}
-void func_80B1BF2C(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_MegCloneWaitForSpinBack(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(play);
EnPoSisters* parent = (EnPoSisters*)this->actor.parent;
- if (this->unk_18D == 0) {
- if (this->unk_194 != 0) {
- this->unk_194--;
- }
-
- if (this->unk_194 == 0) {
+ if (this->megCloneId == POSISTER_MEG_REAL) {
+ DECR(this->invisibleTimer);
+ if (this->invisibleTimer == 0) {
s32 rand = Rand_ZeroFloat(4.0f);
this->actor.shape.rot.y = (rand * 0x4000) + this->actor.yawTowardsPlayer;
this->actor.world.pos.y = player->actor.world.pos.y + 5.0f;
- func_80B1B860(this, play);
+ EnPoSisters_SetupSpinBackToVisible(this, play);
}
- } else if (parent->actionFunc == func_80B1B940) {
- this->actor.shape.rot.y = this->actor.parent->shape.rot.y + (this->unk_18D * 0x4000);
+
+ } else if (parent->actionFunc == EnPoSisters_SpinBackToVisible) {
+ this->actor.shape.rot.y = this->actor.parent->shape.rot.y + (this->megCloneId * 0x4000);
this->actor.world.pos.y = player->actor.world.pos.y + 5.0f;
- func_80B1B860(this, play);
- } else if (parent->actionFunc == func_80B1BA90) {
+ EnPoSisters_SetupSpinBackToVisible(this, play);
+
+ } else if (parent->actionFunc == EnPoSisters_DeathStage1) {
Actor_MarkForDeath(&this->actor);
}
}
-void func_80B1C030(EnPoSisters* this) {
- Animation_MorphToLoop(&this->skelAnime, &object_po_sisters_Anim_000D40, -3.0f);
- this->unk_229 = 255;
- this->unk_192 = 300;
- this->unk_194 = 3;
- this->unk_191 |= (0x8 | 0x1);
+void EnPoSisters_SetupMegSurroundPlayer(EnPoSisters* this) {
+ Animation_MorphToLoop(&this->skelAnime, &gPoeSistersFloatAnim, -3.0f);
+ this->color.a = 255;
+ this->megSurroundTimer = 300; // 15 seconds
+ this->megClonesRemaining = 3;
+ this->poSisterFlags |= (POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_CHECK_AC);
this->actor.flags |= ACTOR_FLAG_1;
- this->actionFunc = func_80B1C0A4;
+ this->actionFunc = EnPoSisters_MegSurroundPlayer;
}
-void func_80B1C0A4(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_MegSurroundPlayer(EnPoSisters* this, PlayState* play) {
EnPoSisters* parent;
- if (this->unk_192 != 0) {
- this->unk_192--;
- }
+ DECR(this->megSurroundTimer);
- if (this->unk_194 > 0) {
- if (this->unk_192 >= 16) {
- SkelAnime_Update(&this->skelAnime);
- if (this->unk_18D == 0) {
- if (ABS_ALT(16 - this->unk_18E) < 14) {
- this->actor.shape.rot.y +=
- (s16)((0x580 - (this->unk_194 * 0x180)) * fabsf(Math_SinS(this->unk_18E * 0x800)));
- }
-
- if ((this->unk_192 >= 284) || (this->unk_192 < 31)) {
- this->unk_191 |= 0x40;
- } else {
- this->unk_191 &= ~0x40;
- }
- } else {
- this->actor.shape.rot.y = this->actor.parent->shape.rot.y + (this->unk_18D * 0x4000);
+ if (this->megClonesRemaining > 0 && this->megSurroundTimer >= 16) {
+ SkelAnime_Update(&this->skelAnime);
+ if (this->megCloneId == POSISTER_MEG_REAL) {
+ if (ABS_ALT(16 - this->floatingBobbingTimer) < 14) {
+ // every x frames rotate around player, the fewer meg clones remaining the faster they spin
+ this->actor.shape.rot.y += (s16)((0x580 - (this->megClonesRemaining * 0x180)) *
+ fabsf(Math_SinS(this->floatingBobbingTimer * 0x800)));
}
+
+ // twirl the real meg backwards for a bit for visual tell to player
+ if ((this->megSurroundTimer >= 284) || (this->megSurroundTimer <= 30)) {
+ this->poSisterFlags |= POSISTERS_FLAG_REAL_MEG_ROTATION;
+ } else {
+ this->poSisterFlags &= ~POSISTERS_FLAG_REAL_MEG_ROTATION;
+ }
+ } else {
+ this->actor.shape.rot.y = this->actor.parent->shape.rot.y + (this->megCloneId * 0x4000);
}
}
- if (this->unk_18D == 0) {
- if ((this->unk_192 >= 284) || ((this->unk_192 < 31) && (this->unk_192 >= 16))) {
- this->unk_191 |= 0x40;
+ if (this->megCloneId == POSISTER_MEG_REAL) {
+ if ((this->megSurroundTimer >= 284) || ((this->megSurroundTimer <= 30) && (this->megSurroundTimer >= 16))) {
+ this->poSisterFlags |= POSISTERS_FLAG_REAL_MEG_ROTATION;
} else {
- this->unk_191 &= ~0x40;
+ this->poSisterFlags &= ~POSISTERS_FLAG_REAL_MEG_ROTATION;
}
}
- if (this->unk_192 == 0) {
- if (this->unk_18D == 0) {
- func_80B1B0E0(this);
+ if (this->megSurroundTimer == 0) {
+ if (this->megCloneId == POSISTER_MEG_REAL) {
+ EnPoSisters_SetupSpinAttack(this);
} else {
- func_80B1BE4C(this, play);
+ EnPoSisters_MegCloneVanish(this, play);
}
- } else if (this->unk_18D != 0) {
+ } else if (this->megCloneId != POSISTER_MEG_REAL) {
parent = (EnPoSisters*)this->actor.parent;
- if (parent->actionFunc == func_80B1B444) {
- func_80B1B3A8(this);
+ if (parent->actionFunc == EnPoSisters_DamageFlinch) {
+ // flinch clones if you hit the real meg
+ EnPoSisters_SetupDamageFlinch(this);
}
- } else if (this->unk_194 == 0) {
- this->unk_194 = -15;
- } else if (this->unk_194 < 0) {
- this->unk_194++;
- if (this->unk_194 == 0) {
- func_80B1B0E0(this);
+ } else if (this->megClonesRemaining == 0) {
+ // all meg clones have been killed, meg waits 15 frames then spin attacks
+ // timer is negative because megClonesRemaining and megAttackTimer are the same union'd variable
+ this->megAttackTimer = -15;
+ } else if (this->megAttackTimer < 0) {
+ this->megAttackTimer++;
+ if (this->megAttackTimer == 0) {
+ EnPoSisters_SetupSpinAttack(this);
}
}
- func_80B1A768(this, play);
+
+ EnPoSisters_MatchPlayerXZ(this, play);
}
-void func_80B1C2E8(EnPoSisters* this) {
- Animation_PlayOnce(&this->skelAnime, &object_po_sisters_Anim_00119C);
+/**
+ * First ActionFunc for all Combat variants (including Meg)
+ */
+void EnPoSisters_SetupSpawnPo(EnPoSisters* this) {
+ Animation_PlayOnce(&this->skelAnime, &gPoeSistersAppearDisappearAnim);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
- this->unk_229 = 0;
- this->unk_191 = 0x20;
- this->actionFunc = func_80B1C340;
+ this->color.a = 0;
+ this->poSisterFlags = POSISTERS_FLAG_UPDATE_FIRES;
+ this->actionFunc = EnPoSisters_PoeSpawn;
}
-void func_80B1C340(EnPoSisters* this, PlayState* play) {
+void EnPoSisters_PoeSpawn(EnPoSisters* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
- this->unk_229 = 255;
+ this->color.a = 255;
this->actor.flags |= ACTOR_FLAG_1;
- this->unk_191 |= (0x10 | 0x8);
- if (this->unk_18C == 0) {
- func_80B1BE4C(this, play);
+ this->poSisterFlags |= (POSISTERS_FLAG_UPDATE_BGCHECK_INFO | POSISTERS_FLAG_MATCH_PLAYER_HEIGHT);
+ if (this->type == POSISTER_TYPE_MEG) {
+ EnPoSisters_MegCloneVanish(this, play);
} else {
- func_80B1AC40(this);
+ EnPoSisters_SetupAimlessIdleFlying(this);
}
} else {
- f32 temp = this->skelAnime.curFrame / this->skelAnime.endFrame;
- s32 temp_f16 = 255.0f * temp;
+ f32 alphaPercent = this->skelAnime.curFrame / this->skelAnime.endFrame;
+ s32 alpha = 255.0f * alphaPercent;
- this->unk_229 = CLAMP(temp_f16, 0, 255);
+ this->color.a = CLAMP(alpha, 0, 255);
}
}
-void func_80B1C408(EnPoSisters* this, PlayState* play) {
- Vec3f sp3C;
+void EnPoSisters_CheckCollision(EnPoSisters* this, PlayState* play) {
+ Vec3f pos;
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
Actor_SetDropFlag(&this->actor, &this->collider.info);
- if (this->unk_18D != 0) {
- ((EnPoSisters*)this->actor.parent)->unk_194--;
+ if (this->megCloneId != POSISTER_MEG_REAL) {
+ ((EnPoSisters*)this->actor.parent)->megClonesRemaining--;
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_LAUGH2);
- func_80B1BE4C(this, play);
+ EnPoSisters_MegCloneVanish(this, play);
if (Rand_ZeroOne() < 0.2f) {
- sp3C.x = this->actor.world.pos.x;
- sp3C.y = this->actor.world.pos.y;
- sp3C.z = this->actor.world.pos.z;
- Item_DropCollectible(play, &sp3C, ITEM00_ARROWS_10);
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y;
+ pos.z = this->actor.world.pos.z;
+ Item_DropCollectible(play, &pos, ITEM00_ARROWS_10);
}
} else if (this->collider.base.colType != 9) {
- if (this->actor.colChkInfo.damageEffect == 0xF) {
+ if (this->actor.colChkInfo.damageEffect == POSISTERS_DAMAGEEFFECT_DEKUNUT) {
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->unk_191 |= 2;
- func_80B1B860(this, play);
- } else if ((this->unk_18C == 0) && (this->actor.colChkInfo.damageEffect == 0xE) &&
- (this->actionFunc == func_80B1C0A4)) {
- if (this->unk_194 == 0) {
- this->unk_194 = -45;
+ this->poSisterFlags |= POSISTERS_FLAG_UPDATE_SHAPE_ROT;
+ EnPoSisters_SetupSpinBackToVisible(this, play);
+ } else if ((this->type == POSISTER_TYPE_MEG) &&
+ (this->actor.colChkInfo.damageEffect == POSISTERS_DAMAGEEFFECT_SPINATTACK) &&
+ (this->actionFunc == EnPoSisters_MegSurroundPlayer)) {
+ if (this->megClonesRemaining == 0) {
+ // all meg clones have been killed, meg waits 45 frames then spin attacks
+ // timer is negative because megClonesRemaining and megAttackTimer are the same union'd variable
+ this->megAttackTimer = -45;
}
} else {
if (Actor_ApplyDamage(&this->actor)) {
@@ -868,14 +933,14 @@ void func_80B1C408(EnPoSisters* this, PlayState* play) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_PO_SISTER_DEAD);
}
- if (this->actor.colChkInfo.damageEffect == 4) {
+ if (this->actor.colChkInfo.damageEffect == POSISTERS_DAMAGEEFFECT_LIGHTARROWS) {
this->drawDmgEffAlpha = 4.0f;
this->drawDmgEffScale = 0.5f;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider.info.bumper.hitPos.x,
this->collider.info.bumper.hitPos.y, this->collider.info.bumper.hitPos.z, 0, 0, 0,
CLEAR_TAG_LARGE_LIGHT_RAYS);
}
- func_80B1B3A8(this);
+ EnPoSisters_SetupDamageFlinch(this);
}
}
}
@@ -884,29 +949,29 @@ void func_80B1C408(EnPoSisters* this, PlayState* play) {
void EnPoSisters_Update(Actor* thisx, PlayState* play) {
s32 pad;
EnPoSisters* this = THIS;
- f32 temp_f2;
+ f32 alpha;
Vec3f checkPos;
s32 bgId;
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- func_80B1B280(this);
+ EnPoSisters_SetupAttackConnect(this);
}
- func_80B1C408(this, play);
- if (this->unk_191 & 0x4) {
- func_80B1A9B0(this, play);
+ EnPoSisters_CheckCollision(this, play);
+ if (this->poSisterFlags & POSISTERS_FLAG_CHECK_Z_TARGET) {
+ EnPoSisters_CheckZTarget(this, play);
}
this->actionFunc(this, play);
- if (this->unk_191 & 0x8) {
- func_80B1A894(this, play);
+ if (this->poSisterFlags & POSISTERS_FLAG_MATCH_PLAYER_HEIGHT) {
+ EnPoSisters_MatchPlayerY(this, play);
}
Actor_MoveWithGravity(&this->actor);
- if (this->unk_191 & 0x10) {
+ if (this->poSisterFlags & POSISTERS_FLAG_UPDATE_BGCHECK_INFO) {
Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 0.0f, 5);
} else {
checkPos.x = this->actor.world.pos.x;
@@ -916,15 +981,15 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) {
BgCheck_EntityRaycastFloor5(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &checkPos);
}
- this->actor.shape.shadowAlpha = this->unk_229;
+ this->actor.shape.shadowAlpha = this->color.a;
Actor_SetFocus(&this->actor, 40.0f);
if (this->drawDmgEffAlpha > 0.0f) {
Math_StepToF(&this->drawDmgEffAlpha, 0.0f, 0.05f);
- if (this->unk_229 != 255) {
- temp_f2 = this->unk_229 * (1.0f / 255);
- if (temp_f2 < this->unk_229) {
- this->drawDmgEffAlpha = temp_f2;
+ if (this->color.a != 255) {
+ alpha = this->color.a * (1.0f / 255);
+ if (alpha < this->color.a) {
+ this->drawDmgEffAlpha = alpha;
}
}
@@ -932,83 +997,87 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) {
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.5f);
}
- if (this->unk_191 & (0x10 | 0x8 | 0x4 | 0x2 | 0x1)) {
+ if (this->poSisterFlags &
+ (POSISTERS_FLAG_UPDATE_BGCHECK_INFO | POSISTERS_FLAG_MATCH_PLAYER_HEIGHT | POSISTERS_FLAG_CHECK_Z_TARGET |
+ POSISTERS_FLAG_UPDATE_SHAPE_ROT | POSISTERS_FLAG_CHECK_AC)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
- if ((this->actionFunc == func_80B1B168) || (this->actionFunc == func_80B1B020)) {
- this->unk_190++;
- this->unk_190 = CLAMP_MAX(this->unk_190, ARRAY_COUNT(this->unk_22C));
- } else if (this->actionFunc != func_80B1BA90) {
- this->unk_190 = CLAMP_MIN(this->unk_190 - 1, 1);
+ if ((this->actionFunc == EnPoSisters_SpinAttack) || (this->actionFunc == EnPoSisters_SpinUp)) {
+ this->fireCount++;
+ this->fireCount = CLAMP_MAX(this->fireCount, ARRAY_COUNT(this->firePos));
+ } else if (this->actionFunc != EnPoSisters_DeathStage1) {
+ this->fireCount = CLAMP_MIN(this->fireCount - 1, 1);
}
- if (this->actionFunc == func_80B1B168) {
+ if (this->actionFunc == EnPoSisters_SpinAttack) {
this->actor.flags |= ACTOR_FLAG_1000000;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
- if (this->unk_191 & 0x1) {
+ if (this->poSisterFlags & POSISTERS_FLAG_CHECK_AC) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
- if (this->actionFunc != func_80B1BF2C) {
+ if (this->actionFunc != EnPoSisters_MegCloneWaitForSpinBack) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
- if (this->actionFunc == func_80B1B628) {
+ if (this->actionFunc == EnPoSisters_Flee) {
this->actor.shape.rot.y = BINANG_ROT180(this->actor.world.rot.y);
- } else if (this->unk_191 & 0x2) {
+ } else if (this->poSisterFlags & POSISTERS_FLAG_UPDATE_SHAPE_ROT) {
this->actor.shape.rot.y = this->actor.world.rot.y;
}
}
}
-void func_80B1C974(EnPoSisters* this) {
- if (this->skelAnime.animation == &object_po_sisters_Anim_000114) {
- this->unk_226 = CLAMP_MAX(this->unk_226 + 5, 255);
- this->unk_227 = CLAMP_MIN(this->unk_227 - 5, 50);
- this->unk_228 = CLAMP_MIN(this->unk_228 - 5, 0);
- } else if (this->skelAnime.animation == &object_po_sisters_Anim_000A54) {
- this->unk_226 = CLAMP_MAX(this->unk_226 + 5, 80);
- this->unk_227 = CLAMP_MAX(this->unk_227 + 5, 255);
- this->unk_228 = CLAMP_MAX(this->unk_228 + 5, 225);
- } else if (this->skelAnime.animation == &object_po_sisters_Anim_0008C0) {
+void EnPoSisters_UpdateColors(EnPoSisters* this) {
+ if (this->skelAnime.animation == &gPoSistersAttackAnim) {
+ this->color.r = CLAMP_MAX(this->color.r + 5, 255);
+ this->color.g = CLAMP_MIN(this->color.g - 5, 50);
+ this->color.b = CLAMP_MIN(this->color.b - 5, 0);
+ } else if (this->skelAnime.animation == &gPoSistersFleeAnim) {
+ this->color.r = CLAMP_MAX(this->color.r + 5, 80);
+ this->color.g = CLAMP_MAX(this->color.g + 5, 255);
+ this->color.b = CLAMP_MAX(this->color.b + 5, 225);
+ } else if (this->skelAnime.animation == &gPoeSistersDamagedAnim) {
+ // flash every other frame after taking damage
if (this->actor.colorFilterTimer & 0x2) {
- this->unk_226 = 0;
- this->unk_227 = 0;
- this->unk_228 = 0;
+ this->color.r = 0;
+ this->color.g = 0;
+ this->color.b = 0;
} else {
- this->unk_226 = 80;
- this->unk_227 = 255;
- this->unk_228 = 225;
+ this->color.r = 80;
+ this->color.g = 255;
+ this->color.b = 225;
}
} else {
- this->unk_226 = CLAMP_MAX(this->unk_226 + 5, 255);
- this->unk_227 = CLAMP_MAX(this->unk_227 + 5, 255);
+ this->color.r = CLAMP_MAX(this->color.r + 5, 255);
+ this->color.g = CLAMP_MAX(this->color.g + 5, 255);
- if (this->unk_228 > 210) {
- if (this->unk_228 && this->unk_228 && this->unk_228) {}
- this->unk_228 = CLAMP_MIN(this->unk_228 - 5, 210);
+ if (this->color.b > 210) {
+ //! FAKE:
+ if (this->color.b && this->color.b && this->color.b) {}
+ this->color.b = CLAMP_MIN(this->color.b - 5, 210);
} else {
- this->unk_228 = CLAMP_MAX(this->unk_228 + 5, 210);
+ this->color.b = CLAMP_MAX(this->color.b + 5, 210);
}
}
}
s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx,
Gfx** gfx) {
- static Gfx* D_80B1DACC[] = {
- object_po_sisters_DL_001DE0,
- object_po_sisters_DL_002F88,
- object_po_sisters_DL_003628,
- object_po_sisters_DL_003DC8,
+ static Gfx* gPoSisterBodyDisplayLists[] = {
+ gPoSistersMegBodyDL,
+ gPoSistersJoelleBodyDL,
+ gPoSistersBethBodyDL,
+ gPoSistersAmyBodyDL,
};
- static Gfx* D_80B1DADC[] = {
- object_po_sisters_DL_001CB0,
- object_po_sisters_DL_002EB8,
- object_po_sisters_DL_003880,
- object_po_sisters_DL_004020,
+ static Gfx* gPoSisterFaceDisplayLists[] = {
+ gPoSistersMegFaceDL,
+ gPoSistersJoelleFaceDL,
+ gPoSistersBethFaceDL,
+ gPoSistersAmyFaceDL,
};
- static Color_RGBA8 D_80B1DAEC[] = {
+ static Color_RGBA8 gPoSisterColors[] = {
{ 80, 0, 100, 0 },
{ 80, 15, 0, 0 },
{ 0, 70, 50, 0 },
@@ -1016,167 +1085,178 @@ s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
};
EnPoSisters* this = THIS;
- if ((limbIndex == 1) && (this->unk_191 & 0x40)) {
- if (this->unk_192 >= 284) {
- rot->x += (this->unk_192 - 284) * 0x1000;
+ if (limbIndex == POSISTERS_LIMB_ROOT && (this->poSisterFlags & POSISTERS_FLAG_REAL_MEG_ROTATION)) {
+ if (this->megSurroundTimer >= 284) {
+ rot->x += (this->megSurroundTimer - 284) * 0x1000;
} else {
- rot->x += (this->unk_192 - 15) * 0x1000;
+ rot->x += (this->megSurroundTimer - 15) * 0x1000;
}
}
- if ((this->unk_229 == 0) || (limbIndex == 8) || ((this->actionFunc == func_80B1BA90) && (this->unk_192 >= 8))) {
+ if ((this->color.a == 0) || (limbIndex == POSISTERS_LIMB_TORCH) ||
+ ((this->actionFunc == EnPoSisters_DeathStage1) && (this->deathTimer >= 8))) {
*dList = NULL;
- } else if (limbIndex == 9) {
- *dList = D_80B1DACC[this->unk_18C];
- } else if (limbIndex == 10) {
- *dList = D_80B1DADC[this->unk_18C];
+ } else if (limbIndex == POSISTERS_LIMB_MAIN_BODY) {
+ *dList = gPoSisterBodyDisplayLists[this->type];
+ } else if (limbIndex == POSISTERS_LIMB_FACE) {
+ *dList = gPoSisterFaceDisplayLists[this->type];
gDPPipeSync((*gfx)++);
- gDPSetEnvColor((*gfx)++, this->unk_226, this->unk_227, this->unk_228, this->unk_229);
- } else if (limbIndex == 11) {
- Color_RGBA8* colour = &D_80B1DAEC[this->unk_18C];
+ gDPSetEnvColor((*gfx)++, this->color.r, this->color.g, this->color.b, this->color.a);
+ } else if (limbIndex == POSISTERS_LIMB_LOWER_BODY) {
+ Color_RGBA8* color = &gPoSisterColors[this->type];
gDPPipeSync((*gfx)++);
- gDPSetEnvColor((*gfx)++, colour->r, colour->g, colour->b, this->unk_229);
+ gDPSetEnvColor((*gfx)++, color->r, color->g, color->b, this->color.a);
}
return false;
}
+#define POSISTER_LIMBPOS_INVALID -1
+
void EnPoSisters_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
static Vec3f D_80B1DAFC = { 1000.0f, -1700.0f, 0.0f };
static s8 D_80B1DB08[] = {
- -1, -1, 0, 1, 2, -1, 3, -1, -1, -1, -1, -1,
+ POSISTER_LIMBPOS_INVALID,
+ POSISTER_LIMBPOS_INVALID,
+ 0,
+ 1,
+ 2,
+ POSISTER_LIMBPOS_INVALID,
+ 3,
+ POSISTER_LIMBPOS_INVALID,
+ POSISTER_LIMBPOS_INVALID,
+ POSISTER_LIMBPOS_INVALID,
+ POSISTER_LIMBPOS_INVALID,
+ POSISTER_LIMBPOS_INVALID,
};
EnPoSisters* this = THIS;
s32 end;
- f32 temp_f2;
+ f32 brightness;
- if (D_80B1DB08[limbIndex] != -1) {
+ if (D_80B1DB08[limbIndex] != POSISTER_LIMBPOS_INVALID) {
Matrix_MultZero(&this->limbPos[D_80B1DB08[limbIndex]]);
- } else if (limbIndex == 9) {
+ } else if (limbIndex == POSISTERS_LIMB_MAIN_BODY) {
Matrix_MultVecY(-2500.0f, &this->limbPos[4]);
Matrix_MultVecY(3000.0f, &this->limbPos[5]);
- } else if (limbIndex == 10) {
+ } else if (limbIndex == POSISTERS_LIMB_FACE) {
Matrix_MultVecY(-4000.0f, &this->limbPos[6]);
- } else if (limbIndex == 11) {
+ } else if (limbIndex == POSISTERS_LIMB_LOWER_BODY) {
Matrix_MultVecX(3000.0f, &this->limbPos[7]);
}
- if ((this->actionFunc == func_80B1BA90) && (this->unk_192 >= 8) && (limbIndex == 9)) {
+ if (this->actionFunc == EnPoSisters_DeathStage1 && this->deathTimer >= 8 && limbIndex == POSISTERS_LIMB_MAIN_BODY) {
gSPMatrix((*gfx)++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList((*gfx)++, object_po_sisters_DL_0046E0);
+ gSPDisplayList((*gfx)++, gPoSistersBurnBodyDL);
}
- if (limbIndex == 8) {
- if (this->unk_191 & 0x20) {
- for (end = this->unk_190 - 1; end > 0; end--) {
- this->unk_22C[end] = this->unk_22C[end - 1];
+ if (limbIndex == POSISTERS_LIMB_TORCH) {
+ if (this->poSisterFlags & POSISTERS_FLAG_UPDATE_FIRES) {
+ for (end = this->fireCount - 1; end > 0; end--) {
+ this->firePos[end] = this->firePos[end - 1];
}
- Matrix_MultVec3f(&D_80B1DAFC, this->unk_22C);
+ Matrix_MultVec3f(&D_80B1DAFC, this->firePos);
}
- if (this->unk_190 > 0) {
- Color_RGBA8* sp38 = &D_80B1DA30[this->unk_18C];
+ if (this->fireCount > 0) {
+ Color_RGBA8* flameColor = &sPoSisterFlameColors[this->type];
- temp_f2 = Rand_ZeroFloat(0.3f) + 0.7f;
+ brightness = Rand_ZeroFloat(0.3f) + 0.7f; // flickering torch light level
- if (this->actionFunc == func_80B1BCA0) {
- Lights_PointNoGlowSetInfo(&this->lightInfo, this->unk_22C[0].x, this->unk_22C[0].y + 15.0f,
- this->unk_22C[0].z, sp38->r * temp_f2, sp38->g * temp_f2, sp38->b * temp_f2,
- 200);
+ if (this->actionFunc == EnPoSisters_DeathStage2) {
+ Lights_PointNoGlowSetInfo(&this->lightInfo, this->firePos[0].x, this->firePos[0].y + 15.0f,
+ this->firePos[0].z, flameColor->r * brightness, flameColor->g * brightness,
+ flameColor->b * brightness, 200);
} else {
- Lights_PointGlowSetInfo(&this->lightInfo, this->unk_22C[0].x, this->unk_22C[0].y + 15.0f,
- this->unk_22C[0].z, sp38->r * temp_f2, sp38->g * temp_f2, sp38->b * temp_f2,
- 200);
+ Lights_PointGlowSetInfo(&this->lightInfo, this->firePos[0].x, this->firePos[0].y + 15.0f,
+ this->firePos[0].z, flameColor->r * brightness, flameColor->g * brightness,
+ flameColor->b * brightness, 200);
}
} else {
Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0);
}
- if (!(this->unk_191 & 0x80)) {
- Matrix_Get(&this->unk_358);
+ if (!(this->poSisterFlags & POSISTERS_FLAG_DRAW_TORCH)) {
+ Matrix_Get(&this->mtxf);
}
}
}
void EnPoSisters_Draw(Actor* thisx, PlayState* play) {
EnPoSisters* this = THIS;
- Color_RGBA8* temp_s1 = &D_80B1DA40[this->unk_18C];
- Color_RGBA8* temp_s7 = &D_80B1DA30[this->unk_18C];
+ Color_RGBA8* sisterEnvColor = &sPoSisterEnvColors[this->type];
+ Color_RGBA8* flameColor = &sPoSisterFlameColors[this->type];
s32 pad;
s32 i;
- s32 phi_s5;
- f32 phi_f20;
+ u8 alpha;
+ f32 scale;
s32 pad2;
OPEN_DISPS(play->state.gfxCtx);
- func_80B1C974(this);
+ EnPoSisters_UpdateColors(this);
func_8012C28C(play->state.gfxCtx);
func_8012C2DC(play->state.gfxCtx);
- if ((this->unk_229 == 255) || (this->unk_229 == 0)) {
- gDPSetEnvColor(POLY_OPA_DISP++, this->unk_226, this->unk_227, this->unk_228, this->unk_229);
- gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0);
+ if ((this->color.a == 255) || (this->color.a == 0)) {
+ gDPSetEnvColor(POLY_OPA_DISP++, this->color.r, this->color.g, this->color.b, this->color.a);
+ gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0); // empty
POLY_OPA_DISP =
SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnPoSisters_OverrideLimbDraw,
EnPoSisters_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->unk_229);
- gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->color.a);
+ gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88); // xlu only DL
POLY_XLU_DISP =
SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnPoSisters_OverrideLimbDraw,
EnPoSisters_PostLimbDraw, &this->actor, POLY_XLU_DISP);
}
- if (!(this->unk_191 & 0x80)) {
- Matrix_Put(&this->unk_358);
+ if (!(this->poSisterFlags & POSISTERS_FLAG_DRAW_TORCH)) {
+ Matrix_Put(&this->mtxf);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, object_po_sisters_DL_0027B0);
+ gSPDisplayList(POLY_OPA_DISP++, gPoSistersDrawTorchDL);
}
gSPSegment(
POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, (play->gameplayFrames * -20) % 512, 32, 128));
- gDPSetEnvColor(POLY_XLU_DISP++, temp_s1->r, temp_s1->g, temp_s1->b, temp_s1->a);
+ gDPSetEnvColor(POLY_XLU_DISP++, sisterEnvColor->r, sisterEnvColor->g, sisterEnvColor->b, sisterEnvColor->a);
- if (this->actionFunc == func_80B1BCA0) {
- phi_s5 = (((-this->unk_192 * 255) + 0x1FE0) / 32) & 0xFF;
- phi_f20 = 0.0056000003f;
+ if (this->actionFunc == EnPoSisters_DeathStage2) {
+ alpha = ((-this->deathTimer * 255) + 0x1FE0) / 32;
+ scale = (7 / 1.2500 * 0.001f);
} else {
- phi_s5 = 0;
- phi_f20 = this->actor.scale.x * 0.5f;
+ alpha = 0;
+ scale = this->actor.scale.x * 0.5f;
}
- for (i = 0; i < this->unk_190; i++) {
- if (this->actionFunc != func_80B1BCA0) {
- phi_s5 = ((-i * 31) + 248) & 0xFF;
+ for (i = 0; i < this->fireCount; i++) {
+ if (this->actionFunc != EnPoSisters_DeathStage2) {
+ alpha = (-i * 31) + 248;
}
gDPPipeSync(POLY_XLU_DISP++);
- gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, temp_s7->r, temp_s7->g, temp_s7->b, phi_s5);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, flameColor->r, flameColor->g, flameColor->b, alpha);
- Matrix_Translate(this->unk_22C[i].x, this->unk_22C[i].y, this->unk_22C[i].z, MTXMODE_NEW);
+ Matrix_Translate(this->firePos[i].x, this->firePos[i].y, this->firePos[i].z, MTXMODE_NEW);
Matrix_RotateZYX(0, BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), 0, MTXMODE_APPLY);
- if (this->actionFunc == func_80B1BA90) {
- f32 phi_f0;
-
- phi_f20 = ((this->unk_192 - i) * 0.025f) + 0.5f;
- phi_f0 = CLAMP(phi_f20, 0.5f, 0.8f);
- phi_f20 = phi_f0 * 0.007f;
+ if (this->actionFunc == EnPoSisters_DeathStage1) {
+ scale = ((this->deathTimer - i) * 0.025f) + 0.5f;
+ scale = CLAMP(scale, 0.5f, 0.8f) * 0.007f;
}
- Matrix_Scale(phi_f20, phi_f20, phi_f20, MTXMODE_APPLY);
+ 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);
gSPDisplayList(POLY_XLU_DISP++, gGameplayKeepDrawFlameDL);
}
Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
- this->actor.scale.x * 142.857131958f * this->drawDmgEffScale, 0.0f, this->drawDmgEffAlpha,
+ this->actor.scale.x * (1.0f / 0.007f) * this->drawDmgEffScale, 0.0f, this->drawDmgEffAlpha,
ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
index 67e84d0dc..368ad9da1 100644
--- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
+++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
@@ -2,42 +2,70 @@
#define Z_EN_PO_SISTERS_H
#include "global.h"
+#include "objects/object_po_sisters/object_po_sisters.h"
struct EnPoSisters;
typedef void (*EnPoSistersActionFunc)(struct EnPoSisters*, PlayState*);
-#define ENPOSISTERS_GET_300(thisx) (((thisx)->params >> 8) & 3)
-#define ENPOSISTERS_GET_C00(thisx) (((thisx)->params >> 0xA) & 3)
-#define ENPOSISTERS_GET_1000(thisx) ((thisx)->params & 0x1000)
+#define ENPOSISTERS_GET_OBSERVER_FLAG(thisx) ((thisx)->params & 0x1000)
+#define ENPOSISTERS_GET_MEG_CLONE_ID(thisx) (((thisx)->params >> 0xA) & 3)
+#define ENPOSISTERS_GET_TYPE(thisx) (((thisx)->params >> 8) & 3)
+
+#define ENPOSISTERS_PARAMS(observerFlag, megClone, type) (((observerFlag) << 0xC) | ((megClone & 3) << 0xA) | ((type & 3) << 8))
+
+typedef enum {
+ /* 0 */ POSISTER_TYPE_MEG, // purple
+ /* 1 */ POSISTER_TYPE_JO, // red
+ /* 2 */ POSISTER_TYPE_BETH, // blue
+ /* 3 */ POSISTER_TYPE_AMY, // green
+} EnPoSisterType;
+
+typedef enum {
+ /* 0 */ POSISTER_MEG_REAL,
+ /* 1 */ POSISTER_MEG_CLONE1,
+ /* 2 */ POSISTER_MEG_CLONE2,
+ /* 3 */ POSISTER_MEG_CLONE3,
+} EnPoSisterMegCloneID;
typedef struct EnPoSisters {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnPoSistersActionFunc actionFunc;
- /* 0x18C */ u8 unk_18C;
- /* 0x18D */ u8 unk_18D;
- /* 0x18E */ u8 unk_18E;
- /* 0x18F */ u8 unk_18F;
- /* 0x190 */ u8 unk_190;
- /* 0x191 */ u8 unk_191;
- /* 0x192 */ s16 unk_192;
- /* 0x194 */ s16 unk_194;
- /* 0x196 */ Vec3s jointTable[12];
- /* 0x1DE */ Vec3s morphTable[12];
- /* 0x226 */ u8 unk_226;
- /* 0x227 */ u8 unk_227;
- /* 0x228 */ u8 unk_228;
- /* 0x229 */ u8 unk_229;
- /* 0x22C */ Vec3f unk_22C[8];
- /* 0x28C */ Vec3f limbPos[8];
- /* 0x2EC */ f32 unk_2EC;
+ /* 0x18C */ u8 type;
+ /* 0x18D */ u8 megCloneId;
+ /* 0x18E */ u8 floatingBobbingTimer; // counts down from 32 to zero, reset
+ /* 0x18F */ u8 zTargetTimer; // how many frames the player is z targeting, if zero -> invis
+ /* 0x190 */ u8 fireCount;
+ /* 0x191 */ u8 poSisterFlags;
+ /* 0x192 */ union {
+ s16 stateTimer; // generic name for resets
+ s16 spinTimer; // frames of spinning since spin attack starts, when zero checks collision
+ s16 fleeTimer; // after being hit, 5 frames of flying away
+ s16 deathTimer; // (incr) controls timings of the death cutscene, reset between the two stages
+ s16 laughTimer; // if observer, will laugh once in awhile
+ s16 spinupTimer; // frames of spinning up (gaining speed) for attack (jo/beth/amy attack)
+ s16 megSurroundTimer; // frames of meg circling the player menacingly until spin attack
+ s16 spinInvisibleTimer; // frames of spining away to invisible and back to visible
+ s16 idleFlyingAnimationCounter; // count: animations completed since entering actionFunc
+ };
+ /* 0x194 */ union {
+ s16 invisibleTimer; // frames until coming back to fight from invisible (all combat variants)
+ s16 megAttackTimer; // delay until meg spin attacks player (negative frames counting up to 0)
+ s16 megClonesRemaining; // positive count of meg clones remaining
+ };
+ /* 0x196 */ Vec3s jointTable[POSISTERS_LIMB_MAX];
+ /* 0x1DE */ Vec3s morphTable[POSISTERS_LIMB_MAX];
+ /* 0x226 */ Color_RGBA8 color;
+ /* 0x22C */ Vec3f firePos[8];
+ /* 0x28C */ Vec3f limbPos[8]; // passed to Actor_DrawDamageEffects
+ /* 0x2EC */ f32 megDistToPlayer;
/* 0x2F0 */ f32 drawDmgEffAlpha;
/* 0x2F4 */ f32 drawDmgEffScale;
/* 0x2F8 */ LightNode* lightNode;
/* 0x2FC */ LightInfo lightInfo;
/* 0x30C */ ColliderCylinder collider;
- /* 0x358 */ MtxF unk_358;
+ /* 0x358 */ MtxF mtxf;
} EnPoSisters; // size = 0x398
extern const ActorInit En_Po_Sisters_InitVars;
diff --git a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
index 421f2f3c0..66db63c65 100644
--- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
+++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
@@ -370,26 +370,26 @@ s32 EnRuppecrow_CheckPlayedMatchingSong(PlayState* play) {
if (play->msgCtx.ocarinaMode == 0x3) {
switch (player->transformation) {
case PLAYER_FORM_DEKU:
- if (play->msgCtx.unk1202E == OCARINA_SONG_SONATA) {
+ if (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA) {
return true;
}
break;
case PLAYER_FORM_GORON:
- if (play->msgCtx.unk1202E == OCARINA_SONG_GORON_LULLABY) {
+ if (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) {
return true;
}
break;
case PLAYER_FORM_ZORA:
- if (play->msgCtx.unk1202E == OCARINA_SONG_NEW_WAVE) {
+ if (play->msgCtx.lastPlayedSong == OCARINA_SONG_NEW_WAVE) {
return true;
}
break;
case PLAYER_FORM_HUMAN:
- if (play->msgCtx.unk1202E == OCARINA_SONG_SONATA) {
+ if (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA) {
return true;
- } else if (play->msgCtx.unk1202E == OCARINA_SONG_GORON_LULLABY) {
+ } else if (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) {
return true;
- } else if (play->msgCtx.unk1202E == OCARINA_SONG_NEW_WAVE) {
+ } else if (play->msgCtx.lastPlayedSong == OCARINA_SONG_NEW_WAVE) {
return true;
}
break;
diff --git a/src/overlays/actors/ovl_En_Shn/z_en_shn.c b/src/overlays/actors/ovl_En_Shn/z_en_shn.c
index 51faf709c..817648daa 100644
--- a/src/overlays/actors/ovl_En_Shn/z_en_shn.c
+++ b/src/overlays/actors/ovl_En_Shn/z_en_shn.c
@@ -17,7 +17,6 @@ void EnShn_Update(Actor* thisx, PlayState* play);
void EnShn_Draw(Actor* thisx, PlayState* play);
void func_80AE69E8(EnShn* this, PlayState* play);
void func_80AE6A64(EnShn* this, PlayState* play);
-s32 func_80AE6704(EnShn* this, PlayState* play);
// Could be something related to text/dialogue?
static UNK_TYPE D_80AE6F00[] = {
@@ -228,7 +227,7 @@ s32 func_80AE65F4(EnShn* this, PlayState* play) {
return false;
}
-s32 func_80AE6704(EnShn* thisx, PlayState* play) {
+s32 func_80AE6704(Actor* thisx, PlayState* play) {
EnShn* this = THIS;
s32 ret = 0;
diff --git a/src/overlays/actors/ovl_En_Shn/z_en_shn.h b/src/overlays/actors/ovl_En_Shn/z_en_shn.h
index cc7c37ac4..e373abde2 100644
--- a/src/overlays/actors/ovl_En_Shn/z_en_shn.h
+++ b/src/overlays/actors/ovl_En_Shn/z_en_shn.h
@@ -7,6 +7,7 @@
struct EnShn;
typedef void (*EnShnActionFunc)(struct EnShn*, PlayState*);
+typedef s32 (*MsgEventFunc)(Actor*, PlayState*);
typedef struct EnShn {
/* 0x000 */ Actor actor;
@@ -34,7 +35,7 @@ typedef struct EnShn {
/* 0x2CC */ f32 playSpeed;
/* 0x2D0 */ f32 unk_2D0;
/* 0x2D4 */ f32 unk_2D4;
- /* 0x2D8 */ s32 unk_2D8;
+ /* 0x2D8 */ MsgEventFunc unk_2D8;
/* 0x2DC */ s32 prevTalkState;
/* 0x2E0 */ s32 unk_2E0;
/* 0x2E4 */ s32 unk_2E4;
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 65b11055c..a8d76a7a8 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
@@ -90,7 +90,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
path = &play->setupPathList[path->unk1];
}
- for (i = 0; i < EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor); i++) {
+ for (i = 0; i < EN_SYATEKI_CROW_GET_NUMBER(&this->actor); i++) {
path = &play->setupPathList[path->unk1];
}
@@ -102,7 +102,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
this->unk_23C.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
ActorShape_Init(&this->actor.shape, 2000.0f, ActorShadow_DrawCircle, 20.0f);
- if ((path == NULL) || (EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor) >= 0x80)) {
+ if ((path == NULL) || (EN_SYATEKI_CROW_GET_NUMBER(&this->actor) >= 0x80)) {
Actor_MarkForDeath(&this->actor);
return;
}
@@ -136,14 +136,14 @@ void func_809CA5D4(EnSyatekiCrow* this) {
void func_809CA67C(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if ((syatekiMan->unk_26A == 1) && (this->unk_1C2 == 1) &&
- (syatekiMan->unk_274 & (1 << EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor)))) {
+ if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_1C2 == 1) &&
+ (syatekiMan->guayFlags & (1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor)))) {
func_809CA71C(this);
- } else if (syatekiMan->unk_26A != 1) {
+ } else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->unk_1C2 = 1;
}
- if ((syatekiMan->unk_274 == 0) && (syatekiMan->unk_274 == 0)) {
+ if ((syatekiMan->guayFlags == 0) && (syatekiMan->guayFlags == 0)) {
this->unk_1C2 = 1;
}
}
@@ -185,7 +185,7 @@ void func_809CA8E4(EnSyatekiCrow* this, PlayState* play) {
f32 sp30;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if (syatekiMan->unk_26A != 1) {
+ if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
func_809CA5D4(this);
return;
}
@@ -207,13 +207,13 @@ void func_809CA8E4(EnSyatekiCrow* this, PlayState* play) {
this->unk_1CC++;
} else {
this->unk_1C2 = 0;
- syatekiMan->unk_274 &= ~(1 << EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor));
+ syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor));
func_809CA5D4(this);
}
SkelAnime_Update(&this->skelAnime);
this->actor.shape.yOffset = (fabsf(this->skelAnime.curFrame - 3.0f) * 150.0f) + 1700.0f;
- if ((syatekiMan->unk_26C % 90) == 0) {
+ if ((syatekiMan->perGameVar1.guaySpawnTimer % 90) == 0) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_CRY);
}
}
@@ -221,7 +221,7 @@ void func_809CA8E4(EnSyatekiCrow* this, PlayState* play) {
void func_809CAAF8(EnSyatekiCrow* this) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- syatekiMan->unk_280 += 60;
+ syatekiMan->score += 60;
this->unk_1C2 = 0;
this->actor.speedXZ *= Math_CosS(this->actor.world.rot.x);
this->actor.velocity.y = 0.0f;
@@ -245,8 +245,8 @@ void func_809CABC0(EnSyatekiCrow* this, PlayState* play) {
if (this->unk_1C4 > 20) {
func_800B3030(play, &this->actor.world.pos, &D_809CB050, &D_809CB050, this->actor.scale.x * 10000.0f, 0, 0);
- syatekiMan->unk_27A++;
- syatekiMan->unk_274 &= ~(1 << EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor));
+ syatekiMan->guayHitCounter++;
+ syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor));
func_809CA5D4(this);
}
diff --git a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h
index d0b626218..05eec4ad0 100644
--- a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h
+++ b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h
@@ -5,7 +5,8 @@
#define EN_SYATEKI_CROW_GET_PARAM_F(thisx) ((thisx)->params & 0xF)
#define EN_SYATEKI_CROW_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
-#define EN_SYATEKI_CROW_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_CROW_GET_NUMBER(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_CROW_PARAMS(number, unkF0, unkF) (((number << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unkF & 0xF))
struct EnSyatekiCrow;
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 f0f0a225b..887e62657 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
@@ -131,7 +131,7 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
}
this->unk_1E4 = Lib_SegmentedToVirtual(path->points);
- this->unk_1E8 = EN_SYATEKI_DEKUNUTS_GET_PARAM_F0(&this->actor);
+ this->unk_1E8 = EN_SYATEKI_DEKUNUTS_GET_NUMBER(&this->actor);
this->unk_1EA = path->count;
this->unk_1D8 = 0;
this->unk_1DC = 0;
@@ -166,13 +166,14 @@ void func_80A2BE54(EnSyatekiDekunuts* this) {
void func_80A2BF18(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if ((syatekiMan->unk_26A == 1) && (this->unk_1E2 == 1) && ((syatekiMan->unk_272 & (1 << this->unk_1E8)) != 0)) {
+ if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_1E2 == 1) &&
+ ((syatekiMan->dekuScrubFlags & (1 << this->unk_1E8)) != 0)) {
func_80A2BFC4(this);
- } else if (syatekiMan->unk_26A != 1) {
+ } else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->unk_1E2 = 1;
}
- if ((syatekiMan->unk_272 == 0) && (syatekiMan->unk_274 == 0) &&
+ if ((syatekiMan->dekuScrubFlags == 0) && (syatekiMan->guayFlags == 0) &&
(EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1)) {
this->unk_1E2 = 1;
}
@@ -189,9 +190,9 @@ void func_80A2BFC4(EnSyatekiDekunuts* this) {
this->actor.world.pos = this->actor.prevPos = sp14;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
- this->unk_1EE = 140 - (syatekiMan->unk_27C * 20);
+ this->unk_1EE = 140 - (syatekiMan->currentWave * 20);
- if ((syatekiMan->unk_27C & 1) != 0) {
+ if ((syatekiMan->currentWave & 1) != 0) {
this->unk_1F0 = 1;
this->unk_1F2 = 0;
} else {
@@ -260,7 +261,7 @@ void func_80A2C27C(EnSyatekiDekunuts* this) {
void func_80A2C2E0(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if ((this->unk_1EE < this->unk_1D8) || (syatekiMan->unk_26A != 1)) {
+ if ((this->unk_1EE < this->unk_1D8) || (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING)) {
func_80A2C3AC(this);
}
@@ -270,7 +271,7 @@ void func_80A2C2E0(EnSyatekiDekunuts* this, PlayState* play) {
void func_80A2C33C(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if ((gSaveContext.unk_3DE0[1] <= 0) || (syatekiMan->unk_26A != 1)) {
+ if ((gSaveContext.unk_3DE0[1] <= 0) || (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING)) {
func_80A2C3AC(this);
}
@@ -287,7 +288,7 @@ void func_80A2C3AC(EnSyatekiDekunuts* this) {
void func_80A2C3F0(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if (syatekiMan->unk_26A == 1) {
+ if (syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) {
if (this->unk_1D8 > 160 && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_1D8 = 0;
func_80A2C150(this);
@@ -319,12 +320,12 @@ void func_80A2C4D0(EnSyatekiDekunuts* this, PlayState* play) {
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) == 1) {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A2CBA0, &D_80A2CBAC, 5, 2);
- syatekiMan->unk_280 += 100;
- syatekiMan->unk_26E++;
+ syatekiMan->score += 100;
+ syatekiMan->perGameVar2.bonusDekuScrubHitCounter++;
} else {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A2CBA0, &D_80A2CBAC, 5, 0);
- syatekiMan->unk_280 += 30;
- syatekiMan->unk_278++;
+ syatekiMan->score += 30;
+ syatekiMan->dekuScrubHitCounter++;
}
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DAMAGE);
@@ -356,7 +357,7 @@ void func_80A2C5DC(EnSyatekiDekunuts* this, PlayState* play) {
EffectSsHahen_SpawnBurst(play, &sp40, 3.0f, 0, 12, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1) {
- syatekiMan->unk_272 &= ~(1 << this->unk_1E8);
+ syatekiMan->dekuScrubFlags &= ~(1 << this->unk_1E8);
}
func_80A2BE54(this);
diff --git a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
index 5acf4d493..447dcaee7 100644
--- a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
+++ b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
@@ -5,8 +5,9 @@
#include "objects/object_dekunuts/object_dekunuts.h"
#define EN_SYATEKI_DEKUNUTS_GET_PARAM_F(thisx) ((thisx)->params & 0xF)
-#define EN_SYATEKI_DEKUNUTS_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
+#define EN_SYATEKI_DEKUNUTS_GET_NUMBER(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_DEKUNUTS_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_DEKUNUTS_PARAMS(unkFF00, number, unkF) (((unkFF00 << 8) & 0xFF00) | ((number << 4) & 0xF0) | (unkF & 0xF))
struct EnSyatekiDekunuts;
diff --git a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
index 3a1409e10..975d1dabf 100644
--- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
+++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
@@ -2,9 +2,15 @@
* File: z_en_syateki_man.c
* Overlay: ovl_En_Syateki_Man
* Description: Shooting Gallery Man
+ *
+ * In addition to handling the normal NPC behavior with the Town/Swamp Shooting Gallery Man, this actor is also
+ * responsible for running their respective shooting games as well.
*/
#include "z_en_syateki_man.h"
+#include "overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.h"
+#include "overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h"
+#include "overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_8000000)
@@ -15,24 +21,43 @@ void EnSyatekiMan_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiMan_Update(Actor* thisx, PlayState* play);
void EnSyatekiMan_Draw(Actor* thisx, PlayState* play);
-void func_809C6810(EnSyatekiMan* this, PlayState* play);
-void func_809C6848(EnSyatekiMan* this, PlayState* play);
-void func_809C6E30(EnSyatekiMan* this, PlayState* play);
-void func_809C72D8(EnSyatekiMan* this, PlayState* play);
-void func_809C7990(EnSyatekiMan* this, PlayState* play);
-void func_809C7A90(EnSyatekiMan* this, PlayState* play);
-void func_809C7C14(EnSyatekiMan* this, PlayState* play);
-void func_809C7D14(EnSyatekiMan* this, PlayState* play);
-void func_809C7EB4(EnSyatekiMan* this, PlayState* play);
-void func_809C7FFC(EnSyatekiMan* this, PlayState* play);
-void func_809C80C0(EnSyatekiMan* this, PlayState* play);
-void func_809C81D0(EnSyatekiMan* this, PlayState* play);
-void func_809C8488(EnSyatekiMan* this, PlayState* play);
-void func_809C8610(EnSyatekiMan* this, PlayState* play);
-void func_809C8710(EnSyatekiMan* this, PlayState* play);
-void func_809C8808(EnSyatekiMan* this, PlayState* play);
-void func_809C898C(EnSyatekiMan* this, PlayState* play);
-void func_809C8BF0(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_SetupIdle(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_Idle(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_Talk(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_Idle(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_Talk(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_SetupGiveReward(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_GiveReward(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_SetupGiveReward(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_GiveReward(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_MovePlayerAndExplainRules(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_StartGame(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_RunGame(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_EndGame(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Swamp_AddBonusPoints(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_MovePlayerAndSayHighScore(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_StartGame(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_RunGame(EnSyatekiMan* this, PlayState* play);
+void EnSyatekiMan_Town_EndGame(EnSyatekiMan* this, PlayState* play);
+
+#define TALK_FLAG_NONE 0
+#define TALK_FLAG_TOWN_HAS_SPOKEN_WITH_HUMAN (1 << 0)
+#define TALK_FLAG_TOWN_HAS_SPOKEN_WITH_DEKU (1 << 1)
+#define TALK_FLAG_TOWN_HAS_SPOKEN_WITH_GORON (1 << 2)
+#define TALK_FLAG_TOWN_HAS_SPOKEN_WITH_ZORA (1 << 3)
+#define TALK_FLAG_TOWN_HAS_EXPLAINED_THE_RULES (1 << 4)
+#define TALK_FLAG_SWAMP_HAS_SPOKEN_WITH_HUMAN (1 << 0)
+#define TALK_FLAG_SWAMP_HAS_EXPLAINED_THE_RULES (1 << 1)
+
+#define OCTOROK_FLAG(color, row, column) (1 << ((row * 6) + (column * 2) + color))
+#define COLOR_RED 0
+#define COLOR_BLUE 1
+#define ROW_BACK 0
+#define ROW_CENTER 1
+#define ROW_FRONT 2
+#define COLUMN_LEFT 0
+#define COLUMN_CENTER 1
+#define COLUMN_RIGHT 2
const ActorInit En_Syateki_Man_InitVars = {
ACTOR_EN_SYATEKI_MAN,
@@ -46,87 +71,111 @@ const ActorInit En_Syateki_Man_InitVars = {
(ActorFunc)EnSyatekiMan_Draw,
};
+typedef enum {
+ /* 0 */ EN_SYATEKI_MAN_ANIMATION_HANDS_ON_TABLE,
+ /* 1 */ EN_SYATEKI_MAN_ANIMATION_SWAMP_HEAD_SCRATCH_LOOP,
+ /* 2 */ EN_SYATEKI_MAN_ANIMATION_SWAMP_HEAD_SCRATCH_END,
+} EnSyatekiManAnimationIndex;
+
static AnimationInfo sAnimations[] = {
{ &gBurlyGuyHandsOnTableAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &gSwampShootingGalleryManHeadScratchLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &gSwampShootingGalleryManHeadScratchEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
};
-static s16 D_809C91C8[] = {
- 0x00C1,
- 0x0302,
- 0x0019,
- 0x0026,
+/**
+ * In the Swamp Shooting Gallery, there are four waves of Guays.
+ * For each wave, these flags are used to control which Guays appear.
+ */
+static s16 sGuayFlagsPerWave[] = {
+ (1 << 7) | (1 << 6) | (1 << 0),
+ (1 << 9) | (1 << 8) | (1 << 1),
+ (1 << 4) | (1 << 3) | (1 << 0),
+ (1 << 5) | (1 << 2) | (1 << 1),
};
-static EnSyatekiManUnkStruct D_809C91D0[] = {
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, 0x130 },
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, 0x20 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x0 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x10 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x20 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x30 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x40 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x1 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x11 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x0 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x100 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x200 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x300 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x420 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x520 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x601 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x702 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x801 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x902 },
+typedef struct {
+ /* 0x00 */ s16 actorId;
+ /* 0x04 */ Vec3f pos;
+ /* 0x10 */ s32 params;
+} SwampTargetActorEntry; // size = 0x14
+
+static SwampTargetActorEntry sNormalSwampTargetActorList[] = {
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(1, 3, 0) },
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(0, 2, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 2, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 3, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 4, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, 1) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, 1) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(3, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(4, 2, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(5, 2, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(6, 0, 1) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(7, 0, 2) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(8, 0, 1) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(9, 0, 2) },
};
-static EnSyatekiManUnkStruct D_809C934C[] = {
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x0 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x100 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x1 },
- { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, 0x11 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x202 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x302 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x3 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x103 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x423 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x204 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x304 },
- { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, 0x424 },
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, 0x25 },
- { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, 0x136 },
+/**
+ * This actor list is never used in-game and doesn't work properly if modded in.
+ * Without any "normal" Deku Scrubs, the game will not progress beyond the first wave.
+ */
+static SwampTargetActorEntry sUnusedSwampTargetActorList[] = {
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 0) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 0) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, 1) },
+ { ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, 1) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 2) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(3, 0, 2) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 3) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 3) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(4, 2, 3) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 4) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(3, 0, 4) },
+ { ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(4, 2, 4) },
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(0, 2, 5) },
+ { ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(1, 3, 6) },
};
-static EnSyatekiManUnkStruct* D_809C9464[] = {
- D_809C91D0,
- D_809C934C,
+static SwampTargetActorEntry* sSwampTargetActorLists[] = {
+ sNormalSwampTargetActorList,
+ sUnusedSwampTargetActorList,
};
-static s32 D_809C946C[] = {
- ARRAY_COUNT(D_809C91D0),
- ARRAY_COUNT(D_809C934C),
+static s32 sSwampTargetActorListLengths[] = {
+ ARRAY_COUNT(sNormalSwampTargetActorList),
+ ARRAY_COUNT(sUnusedSwampTargetActorList),
};
-static Vec3f D_809C9474 = { 0.0f, 10.0f, 140.0f };
-static Vec3f D_809C9480 = { -20.0f, 20.0f, 198.0f };
-static Vec3f D_809C948C = { -20.0f, 40.0f, 175.0f };
+static Vec3f sSwampPlayerPos = { 0.0f, 10.0f, 140.0f };
+static Vec3f sTownFierceDietyPlayerPos = { -20.0f, 20.0f, 198.0f };
+static Vec3f sTownPlayerPos = { -20.0f, 40.0f, 175.0f };
-void func_809C64C0(EnSyatekiMan* this, PlayState* play2, EnSyatekiManUnkStruct arg2[], s32 arg3) {
+/**
+ * Spawns all the actors used as targets in the Swamp Shooting Gallery.
+ */
+void EnSyatekiMan_Swamp_SpawnTargetActors(EnSyatekiMan* this, PlayState* play2, SwampTargetActorEntry actorList[],
+ s32 actorListLength) {
PlayState* play = play2;
s32 i;
- for (i = 0; i < arg3; i++) {
- Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, arg2[i].index, arg2[i].x, arg2[i].y, arg2[i].z, 0, 0, 0,
- arg2[i].variable);
+ for (i = 0; i < actorListLength; i++) {
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, actorList[i].actorId, actorList[i].pos.x,
+ actorList[i].pos.y, actorList[i].pos.z, 0, 0, 0, actorList[i].params);
}
}
void EnSyatekiMan_Init(Actor* thisx, PlayState* play) {
EnSyatekiMan* this = THIS;
s32 pad;
- Path* sp34 = &play->setupPathList[ENSYATEKIMAN_GET_FF00(&this->actor)];
- s32 sp30 = D_809C946C[this->unk_194];
+ Path* path = &play->setupPathList[EN_SYATEKI_MAN_GET_PATH(&this->actor)];
+ s32 actorListLength = sSwampTargetActorListLengths[this->swampTargetActorListIndex];
this->actor.targetMode = 1;
Actor_SetScale(&this->actor, 0.01f);
@@ -139,26 +188,27 @@ void EnSyatekiMan_Init(Actor* thisx, PlayState* play) {
}
this->actor.colChkInfo.cylRadius = 100;
- this->actionFunc = func_809C6810;
- this->unk_26A = 0;
- this->unk_270 = 15;
- this->unk_27E = 0;
- this->unk_26E = 0;
- this->unk_190 = 0;
- this->unk_272 = 0;
- this->unk_274 = 0;
- this->unk_280 = 0;
- this->unk_278 = 0;
- this->unk_27A = 0;
- this->unk_284 = 0;
- this->unk_194 = 0;
- this->unk_282 = 0;
+ this->actionFunc = EnSyatekiMan_SetupIdle;
+ this->shootingGameState = SG_GAME_STATE_NONE;
+ this->talkWaitTimer = 15;
+ this->flagsIndex = 0;
+ this->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_NONE;
+ this->octorokFlags = 0;
+ this->dekuScrubFlags = 0;
+ this->guayFlags = 0;
+ this->score = 0;
+ this->dekuScrubHitCounter = 0;
+ this->guayHitCounter = 0;
+ this->prevTextId = 0;
+ this->swampTargetActorListIndex = 0;
+ this->talkFlags = TALK_FLAG_NONE;
this->eyeIndex = 0;
this->blinkTimer = 0;
if (play->sceneNum == SCENE_SYATEKI_MORI) {
- this->path = sp34;
- func_809C64C0(this, play, D_809C9464[this->unk_194], sp30);
+ this->path = path;
+ EnSyatekiMan_Swamp_SpawnTargetActors(this, play, sSwampTargetActorLists[this->swampTargetActorListIndex],
+ actorListLength);
}
}
@@ -166,79 +216,88 @@ void EnSyatekiMan_Destroy(Actor* thisx, PlayState* play) {
gSaveContext.save.weekEventReg[63] &= (u8)~1;
}
-s32 func_809C6720(PlayState* play, Vec3f arg1) {
+/**
+ * Moves the player to the destination through automated control stick movements.
+ * This is used to move the player to the right place to play the shooting game.
+ */
+s32 EnSyatekiMan_MovePlayerToPos(PlayState* play, Vec3f pos) {
Player* player = GET_PLAYER(play);
- f32 sp28;
- f32 phi_f0;
- s16 sp22 = Math_Vec3f_Yaw(&player->actor.world.pos, &arg1);
+ f32 distXZ;
+ f32 magnitude;
+ s16 yaw = Math_Vec3f_Yaw(&player->actor.world.pos, &pos);
- sp28 = Math_Vec3f_DistXZ(&player->actor.world.pos, &arg1);
+ distXZ = Math_Vec3f_DistXZ(&player->actor.world.pos, &pos);
- if (sp28 < 5.0f) {
- phi_f0 = 10.0f;
- } else if (sp28 < 30.0f) {
- phi_f0 = 40.0f;
+ if (distXZ < 5.0f) {
+ magnitude = 10.0f;
+ } else if (distXZ < 30.0f) {
+ magnitude = 40.0f;
} else {
- phi_f0 = 80.0f;
+ magnitude = 80.0f;
}
play->actorCtx.unk268 = 1;
- func_800B6F20(play, &play->actorCtx.unk_26C, phi_f0, sp22);
+ func_800B6F20(play, &play->actorCtx.unk_26C, magnitude, yaw);
- if (sp28 < 5.0f) {
+ if (distXZ < 5.0f) {
return true;
}
return false;
}
-void func_809C6810(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_SetupIdle(EnSyatekiMan* this, PlayState* play) {
if (play->sceneNum == SCENE_SYATEKI_MORI) {
- this->actionFunc = func_809C6848;
+ this->actionFunc = EnSyatekiMan_Swamp_Idle;
} else if (play->sceneNum == SCENE_SYATEKI_MIZU) {
- this->actionFunc = func_809C72D8;
+ this->actionFunc = EnSyatekiMan_Town_Idle;
}
}
-void func_809C6848(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Swamp_Idle(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- u16 sp22;
+ u16 faceReactionTextId;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 2);
- sp22 = Text_GetFaceReaction(play, 0x31);
- if (sp22 != 0) {
- Message_StartTextbox(play, sp22, &this->actor);
- this->unk_284 = sp22;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, EN_SYATEKI_MAN_ANIMATION_SWAMP_HEAD_SCRATCH_END);
+ faceReactionTextId = Text_GetFaceReaction(play, 0x31);
+ if (faceReactionTextId != 0) {
+ Message_StartTextbox(play, faceReactionTextId, &this->actor);
+ this->prevTextId = faceReactionTextId;
} else if (player->transformation == PLAYER_FORM_HUMAN) {
- if (this->unk_282 == 0) {
- this->unk_282 = 1;
+ if (this->talkFlags == TALK_FLAG_NONE) {
+ this->talkFlags = TALK_FLAG_SWAMP_HAS_SPOKEN_WITH_HUMAN;
+ // How are you? Wanna play?
Message_StartTextbox(play, 0xA28, &this->actor);
- this->unk_284 = 0xA28;
+ this->prevTextId = 0xA28;
} else {
+ // Won't you play?
Message_StartTextbox(play, 0xA29, &this->actor);
- this->unk_284 = 0xA29;
+ this->prevTextId = 0xA29;
}
} else {
switch (CURRENT_DAY) {
case 1:
+ // You can't play if you don't have a bow! (Day 1)
Message_StartTextbox(play, 0xA38, &this->actor);
- this->unk_284 = 0xA38;
+ this->prevTextId = 0xA38;
break;
case 2:
+ // You can't play if you don't have a bow! (Day 2)
Message_StartTextbox(play, 0xA39, &this->actor);
- this->unk_284 = 0xA39;
+ this->prevTextId = 0xA39;
break;
case 3:
+ // You can't play if you don't have a bow! (Day 3)
Message_StartTextbox(play, 0xA3A, &this->actor);
- this->unk_284 = 0xA3A;
+ this->prevTextId = 0xA3A;
break;
}
}
- this->actionFunc = func_809C6E30;
+ this->actionFunc = EnSyatekiMan_Swamp_Talk;
} else {
func_800B8614(&this->actor, play, 120.0f);
}
@@ -248,23 +307,28 @@ void func_809C6848(EnSyatekiMan* this, PlayState* play) {
}
}
-void func_809C6A04(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Swamp_HandleChoice(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
- if (!CUR_UPG_VALUE(UPG_QUIVER)) {
+ if (CUR_UPG_VALUE(UPG_QUIVER) == 0) {
play_sound(NA_SE_SY_ERROR);
+
+ // You don't have a bow!
Message_StartTextbox(play, 0xA30, &this->actor);
- this->unk_284 = 0xA30;
+ this->prevTextId = 0xA30;
} else if (gSaveContext.save.playerData.rupees < 20) {
play_sound(NA_SE_SY_ERROR);
+
+ // You don't have enough rupees!
Message_StartTextbox(play, 0xA31, &this->actor);
- this->unk_284 = 0xA31;
- if (this->unk_26A == 4) {
+ this->prevTextId = 0xA31;
+ if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) {
gSaveContext.minigameState = 3;
}
- this->unk_26A = 3;
+
+ this->shootingGameState = SG_GAME_STATE_NOT_PLAYING;
} else {
func_8019F208();
Rupees_ChangeBy(-20);
@@ -272,99 +336,105 @@ void func_809C6A04(EnSyatekiMan* this, PlayState* play) {
gSaveContext.save.weekEventReg[63] &= (u8)~2;
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->unk_26A = 7;
+ this->shootingGameState = SG_GAME_STATE_MOVING_PLAYER;
player->stateFlags1 |= 0x20;
- this->actionFunc = func_809C7FFC;
+ this->actionFunc = EnSyatekiMan_Swamp_MovePlayerAndExplainRules;
}
} else {
func_8019F230();
switch (CURRENT_DAY) {
case 1:
+ // You're not playing? Please come again.
Message_StartTextbox(play, 0xA2D, &this->actor);
- this->unk_284 = 0xA2D;
+ this->prevTextId = 0xA2D;
break;
case 2:
+ // You're not playing? Day after tomorrow is the carnival.
Message_StartTextbox(play, 0xA2E, &this->actor);
- this->unk_284 = 0xA2E;
+ this->prevTextId = 0xA2E;
break;
case 3:
+ // You're not playing? Is something happening outside?
Message_StartTextbox(play, 0xA2F, &this->actor);
- this->unk_284 = 0xA2F;
+ this->prevTextId = 0xA2F;
break;
}
- if (this->unk_26A == 4) {
+ if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) {
gSaveContext.minigameState = 3;
}
- this->unk_26A = 3;
+ this->shootingGameState = SG_GAME_STATE_NOT_PLAYING;
}
}
}
-void func_809C6C2C(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Message_ShouldAdvance(play)) {
- switch (this->unk_284) {
- case 0xA28:
- case 0xA29:
+ switch (this->prevTextId) {
+ case 0xA28: // How are you? Wanna play?
+ case 0xA29: // Won't you play?
+ // It costs 20 rupees to play.
Message_StartTextbox(play, 0xA2A, &this->actor);
- this->unk_284 = 0xA2A;
+ this->prevTextId = 0xA2A;
break;
- case 0xA2B:
- case 0xA2C:
- case 0xA35:
+ case 0xA2B: // The rules of the game are a piece of cake!
+ case 0xA2C: // I keep saying - you have to aim with [Control Stick]!
+ case 0xA35: // You almost had it! Well...just this once...here you go!
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
func_80112AFC(play);
play->interfaceCtx.hbaAmmo = 80;
func_80123F2C(play, 80);
- this->unk_26A = 1;
- this->actionFunc = func_809C80C0;
+ this->shootingGameState = SG_GAME_STATE_RUNNING;
+ this->actionFunc = EnSyatekiMan_Swamp_StartGame;
func_801A2BB8(NA_BGM_MINI_GAME_2);
break;
- case 0xA32:
+ case 0xA32: // You have to try harder!
if (gSaveContext.save.weekEventReg[63] & 2) {
func_801477B4(play);
player->stateFlags1 &= ~0x20;
gSaveContext.save.weekEventReg[63] &= (u8)~1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
- this->actionFunc = func_809C6848;
+ this->actionFunc = EnSyatekiMan_Swamp_Idle;
gSaveContext.minigameState = 3;
- this->unk_26A = 0;
+ this->shootingGameState = SG_GAME_STATE_NONE;
} else {
+ // Wanna play again?
Message_StartTextbox(play, 0xA33, &this->actor);
- this->unk_284 = 0xA33;
+ this->prevTextId = 0xA33;
}
break;
- case 0xA33:
+ case 0xA33: // Wanna play again?
+ // It costs 20 rupees to play.
Message_StartTextbox(play, 0xA2A, &this->actor);
- this->unk_284 = 0xA2A;
- this->unk_26A = 4;
+ this->prevTextId = 0xA2A;
+ this->shootingGameState = SG_GAME_STATE_ONE_MORE_GAME;
break;
- case 0xA34:
+ case 0xA34: // Perfect! Take this!
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
gSaveContext.minigameState = 3;
player->stateFlags1 |= 0x20;
- this->actionFunc = func_809C7A90;
- func_809C7A90(this, play);
+ this->actionFunc = EnSyatekiMan_Swamp_SetupGiveReward;
+ EnSyatekiMan_Swamp_SetupGiveReward(this, play);
break;
}
}
}
-void func_809C6E30(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Swamp_Talk(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (player->stateFlags1 & 0x20) {
@@ -373,16 +443,16 @@ void func_809C6E30(EnSyatekiMan* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_CLOSING:
- this->actionFunc = func_809C6848;
- this->unk_26A = 0;
+ this->actionFunc = EnSyatekiMan_Swamp_Idle;
+ this->shootingGameState = SG_GAME_STATE_NONE;
break;
case TEXT_STATE_CHOICE:
- func_809C6A04(this, play);
+ EnSyatekiMan_Swamp_HandleChoice(this, play);
break;
case TEXT_STATE_5:
- func_809C6C2C(this, play);
+ EnSyatekiMan_Swamp_HandleNormalMessage(this, play);
break;
case TEXT_STATE_DONE:
@@ -392,8 +462,8 @@ void func_809C6E30(EnSyatekiMan* this, PlayState* play) {
player->stateFlags1 &= ~0x20;
gSaveContext.save.weekEventReg[63] &= (u8)~1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
- this->actionFunc = func_809C6848;
- this->unk_26A = 0;
+ this->actionFunc = EnSyatekiMan_Swamp_Idle;
+ this->shootingGameState = SG_GAME_STATE_NONE;
}
break;
@@ -409,296 +479,335 @@ void func_809C6E30(EnSyatekiMan* this, PlayState* play) {
if (this->skelAnime.animation == &gSwampShootingGalleryManHeadScratchEndAnim) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 0);
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, EN_SYATEKI_MAN_ANIMATION_HANDS_ON_TABLE);
}
}
}
-void func_809C6F98(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Town_StartIntroTextbox(EnSyatekiMan* this, PlayState* play) {
switch (gSaveContext.save.playerForm) {
case PLAYER_FORM_HUMAN:
Flags_SetAllTreasure(play, Flags_GetAllTreasure(play) + 1);
if (CURRENT_DAY != 3) {
- if (!(this->unk_282 & 1)) {
- this->unk_282 |= 1;
+ if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_HUMAN)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_HUMAN;
+ // Why don't you give it a try?
Message_StartTextbox(play, 0x3E8, &this->actor);
- this->unk_284 = 0x3E8;
+ this->prevTextId = 0x3E8;
} else {
+ // Wanna try?
Message_StartTextbox(play, 0x3E9, &this->actor);
- this->unk_284 = 0x3E9;
+ this->prevTextId = 0x3E9;
}
- } else if (!(this->unk_282 & 1)) {
- this->unk_282 |= 1;
+ } else if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_HUMAN)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_HUMAN;
+ // If you still have time, why don't you try it?
Message_StartTextbox(play, 0x3EA, &this->actor);
- this->unk_284 = 0x3EA;
+ this->prevTextId = 0x3EA;
} else {
+ // How about it? Wanna try?
Message_StartTextbox(play, 0x3EB, &this->actor);
- this->unk_284 = 0x3EB;
+ this->prevTextId = 0x3EB;
}
break;
case PLAYER_FORM_DEKU:
if (CURRENT_DAY != 3) {
- if (!(this->unk_282 & 2)) {
- this->unk_282 |= 2;
+ if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_DEKU)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_DEKU;
+ // When I saw your fairy, I thought you were that masked troublemaker.
Message_StartTextbox(play, 0x3EC, &this->actor);
- this->unk_284 = 0x3EC;
+ this->prevTextId = 0x3EC;
} else {
+ // You can't play because you don't have a bow.
Message_StartTextbox(play, 0x3ED, &this->actor);
- this->unk_284 = 0x3ED;
+ this->prevTextId = 0x3ED;
}
- } else if (!(this->unk_282 & 2)) {
- this->unk_282 |= 2;
+ } else if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_DEKU)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_DEKU;
+ // I thought you were a customer, but I guess I can't expect any...
Message_StartTextbox(play, 0x3EE, &this->actor);
- this->unk_284 = 0x3EE;
+ this->prevTextId = 0x3EE;
} else {
+ // Stop hanging around and go home!
Message_StartTextbox(play, 0x3EF, &this->actor);
- this->unk_284 = 0x3EF;
+ this->prevTextId = 0x3EF;
}
break;
case PLAYER_FORM_ZORA:
if (CURRENT_DAY != 3) {
- if (!(this->unk_282 & 8)) {
- this->unk_282 |= 8;
+ if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_ZORA)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_ZORA;
+ // I swear I've seen you before...
Message_StartTextbox(play, 0x3F0, &this->actor);
- this->unk_284 = 0x3F0;
+ this->prevTextId = 0x3F0;
} else {
+ // If you don't have a bow, you can't play.
Message_StartTextbox(play, 0x3F1, &this->actor);
- this->unk_284 = 0x3F1;
+ this->prevTextId = 0x3F1;
}
- } else if (!(this->unk_282 & 8)) {
- this->unk_282 |= 8;
+ } else if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_ZORA)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_ZORA;
+ // Huh? You're still here?
Message_StartTextbox(play, 0x3F4, &this->actor);
- this->unk_284 = 0x3F4;
+ this->prevTextId = 0x3F4;
} else {
+ // Haven't you heard the news?
Message_StartTextbox(play, 0x3F5, &this->actor);
- this->unk_284 = 0x3F5;
+ this->prevTextId = 0x3F5;
}
break;
case PLAYER_FORM_GORON:
if (CURRENT_DAY != 3) {
- if (!(this->unk_282 & 4)) {
- this->unk_282 |= 4;
+ if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_GORON)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_GORON;
+ // You have quite the build!
Message_StartTextbox(play, 0x3F2, &this->actor);
- this->unk_284 = 0x3F2;
+ this->prevTextId = 0x3F2;
} else {
+ // Sorry...you don't have a bow.
Message_StartTextbox(play, 0x3F3, &this->actor);
- this->unk_284 = 0x3F3;
+ this->prevTextId = 0x3F3;
}
- } else if (!(this->unk_282 & 4)) {
- this->unk_282 |= 4;
+ } else if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_SPOKEN_WITH_GORON)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_SPOKEN_WITH_GORON;
+ // Huh? You're still here?
Message_StartTextbox(play, 0x3F4, &this->actor);
- this->unk_284 = 0x3F4;
+ this->prevTextId = 0x3F4;
} else {
+ // Haven't you heard the news?
Message_StartTextbox(play, 0x3F5, &this->actor);
- this->unk_284 = 0x3F5;
+ this->prevTextId = 0x3F5;
}
break;
}
}
-void func_809C72D8(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Town_Idle(EnSyatekiMan* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- u16 sp26 = Text_GetFaceReaction(play, 0x30);
+ u16 faceReactionTextId = Text_GetFaceReaction(play, 0x30);
- if (sp26 != 0) {
- Message_StartTextbox(play, sp26, &this->actor);
- this->unk_284 = sp26;
+ if (faceReactionTextId != 0) {
+ Message_StartTextbox(play, faceReactionTextId, &this->actor);
+ this->prevTextId = faceReactionTextId;
} else {
- func_809C6F98(this, play);
+ EnSyatekiMan_Town_StartIntroTextbox(this, play);
}
- this->actionFunc = func_809C7990;
+
+ this->actionFunc = EnSyatekiMan_Town_Talk;
} else {
func_800B8614(&this->actor, play, 120.0f);
}
}
-void func_809C7380(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
- if (!CUR_UPG_VALUE(UPG_QUIVER)) {
+ if (CUR_UPG_VALUE(UPG_QUIVER) == 0) {
play_sound(NA_SE_SY_ERROR);
if (CURRENT_DAY != 3) {
+ // You don't have a bow? Then you can't play.
Message_StartTextbox(play, 0x3F9, &this->actor);
- this->unk_284 = 0x3F9;
+ this->prevTextId = 0x3F9;
} else {
+ // You don't have a bow? That's too bad.
Message_StartTextbox(play, 0x3FA, &this->actor);
- this->unk_284 = 0x3FA;
+ this->prevTextId = 0x3FA;
}
} else if (gSaveContext.save.playerData.rupees < 20) {
play_sound(NA_SE_SY_ERROR);
if (CURRENT_DAY != 3) {
+ // You don't have a enough rupees!
Message_StartTextbox(play, 0x3FB, &this->actor);
- this->unk_284 = 0x3FB;
+ this->prevTextId = 0x3FB;
} else {
+ // You don't have enough rupees? That's too bad.
Message_StartTextbox(play, 0x3FC, &this->actor);
- this->unk_284 = 0x3FC;
+ this->prevTextId = 0x3FC;
}
- if (this->unk_26A == 4) {
+ if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) {
player->stateFlags3 &= ~0x400;
gSaveContext.minigameState = 3;
}
- this->unk_26A = 3;
+
+ this->shootingGameState = SG_GAME_STATE_NOT_PLAYING;
} else {
func_8019F208();
Rupees_ChangeBy(-20);
- this->unk_26A = 2;
- if (!(this->unk_282 & 0x10)) {
- this->unk_282 |= 0x10;
+ this->shootingGameState = SG_GAME_STATE_EXPLAINING_RULES;
+ if (!(this->talkFlags & TALK_FLAG_TOWN_HAS_EXPLAINED_THE_RULES)) {
+ this->talkFlags |= TALK_FLAG_TOWN_HAS_EXPLAINED_THE_RULES;
+ // The rules are simple.
Message_StartTextbox(play, 0x3FD, &this->actor);
- this->unk_284 = 0x3FD;
+ this->prevTextId = 0x3FD;
} else {
+ // Aim for the red ones.
Message_StartTextbox(play, 0x3FF, &this->actor);
- this->unk_284 = 0x3FF;
+ this->prevTextId = 0x3FF;
}
+
gSaveContext.save.weekEventReg[63] |= 1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
}
} else {
func_8019F230();
if (CURRENT_DAY != 3) {
+ // Well, be that way!
Message_StartTextbox(play, 0x3F7, &this->actor);
- this->unk_284 = 0x3F7;
+ this->prevTextId = 0x3F7;
} else {
+ // Usually this place is packed...
Message_StartTextbox(play, 0x3F8, &this->actor);
- this->unk_284 = 0x3F8;
+ this->prevTextId = 0x3F8;
}
- if (this->unk_26A == 4) {
+ if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) {
player->stateFlags3 &= ~0x400;
gSaveContext.minigameState = 3;
}
- this->unk_26A = 3;
+
+ this->shootingGameState = SG_GAME_STATE_NOT_PLAYING;
}
}
}
-void func_809C7620(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Message_ShouldAdvance(play)) {
- switch (this->unk_284) {
- case 0x3E8:
- case 0x3E9:
- case 0x3EA:
- case 0x3EB:
+ switch (this->prevTextId) {
+ case 0x3E8: // Why don't you give it a try?
+ case 0x3E9: // Wanna try?
+ case 0x3EA: // If you still have time, why don't you try it?
+ case 0x3EB: // How about it? Wanna try?
+ // One game is 20 rupees.
Message_StartTextbox(play, 0x3F6, &this->actor);
- this->unk_284 = 0x3F6;
+ this->prevTextId = 0x3F6;
break;
- case 0x3EC:
+ case 0x3EC: // When I saw your fairy, I thought you were that masked troublemaker.
+ // You can't play because you don't have a bow.
Message_StartTextbox(play, 0x3ED, &this->actor);
- this->unk_284 = 0x3ED;
+ this->prevTextId = 0x3ED;
break;
- case 0x3EE:
+ case 0x3EE: // I thought you were a customer, but I guess I can't expect any...
+ // Stop hanging around and go home!
Message_StartTextbox(play, 0x3EF, &this->actor);
- this->unk_284 = 0x3EF;
+ this->prevTextId = 0x3EF;
break;
- case 0x3F0:
+ case 0x3F0: // I swear I've seen you before...
+ // If you don't have a bow, you can't play.
Message_StartTextbox(play, 0x3F1, &this->actor);
- this->unk_284 = 0x3F1;
+ this->prevTextId = 0x3F1;
break;
- case 0x3F2:
+ case 0x3F2: // You have quite the build!
+ // Sorry...you don't have a bow.
Message_StartTextbox(play, 0x3F3, &this->actor);
- this->unk_284 = 0x3F3;
+ this->prevTextId = 0x3F3;
break;
- case 0x3F4:
+ case 0x3F4: // Huh? You're still here?
+ // Haven't you heard the news?
Message_StartTextbox(play, 0x3F5, &this->actor);
- this->unk_284 = 0x3F5;
+ this->prevTextId = 0x3F5;
break;
- case 0x3FD:
- case 0x3FF:
- if (this->unk_26A == 4) {
- if (this->unk_284 == 0x3FD) {
+ case 0x3FD: // The rules are simple.
+ case 0x3FF: // Aim for the red ones.
+ if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) {
+ if (this->prevTextId == 0x3FD) {
+ // Our highest score is [score]. If you break the record, you'll win a prize!
Message_StartTextbox(play, 0x3FE, &this->actor);
- this->unk_284 = 0x3FE;
+ this->prevTextId = 0x3FE;
} else {
+ // Our highest score is [score]. Good luck!
Message_StartTextbox(play, 0x400, &this->actor);
- this->unk_284 = 0x400;
+ this->prevTextId = 0x400;
}
} else {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
- this->unk_26A = 7;
+ this->shootingGameState = SG_GAME_STATE_MOVING_PLAYER;
player->stateFlags1 |= 0x20;
gSaveContext.save.weekEventReg[63] |= 1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
- this->actionFunc = func_809C8710;
+ this->actionFunc = EnSyatekiMan_Town_MovePlayerAndSayHighScore;
}
break;
- case 0x3FE:
- case 0x400:
+ case 0x3FE: // Our highest score is [score]. If you break the record, you'll win a prize!
+ case 0x400: // Our highest score is [score]. Good luck!
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
- this->unk_27E = 0;
+ this->flagsIndex = 0;
func_80112AFC(play);
func_80123F2C(play, 0x63);
- this->unk_26A = 1;
+ this->shootingGameState = SG_GAME_STATE_RUNNING;
func_801A2BB8(NA_BGM_MINI_GAME_2);
- this->actionFunc = func_809C8808;
+ this->actionFunc = EnSyatekiMan_Town_StartGame;
break;
- case 0x401:
+ case 0x401: // You got [score]? Oh, that's too bad...
if (gSaveContext.save.weekEventReg[63] & 2) {
func_801477B4(play);
gSaveContext.save.weekEventReg[63] &= (u8)~1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
- this->unk_26A = 0;
- this->actionFunc = func_809C72D8;
+ this->shootingGameState = SG_GAME_STATE_NONE;
+ this->actionFunc = EnSyatekiMan_Town_Idle;
} else {
+ // You can't stop, can you? You can play as long as you have rupees.
Message_StartTextbox(play, 0x402, &this->actor);
- this->unk_284 = 0x402;
+ this->prevTextId = 0x402;
}
break;
- case 0x403:
+ case 0x403: // You got [score]? Too bad...
if (gSaveContext.save.weekEventReg[63] & 2) {
func_801477B4(play);
gSaveContext.save.weekEventReg[63] &= (u8)~1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
- this->unk_26A = 0;
- this->actionFunc = func_809C72D8;
+ this->shootingGameState = SG_GAME_STATE_NONE;
+ this->actionFunc = EnSyatekiMan_Town_Idle;
} else {
+ // Frustrating, right? Wanna try again?
Message_StartTextbox(play, 0x404, &this->actor);
- this->unk_284 = 0x404;
+ this->prevTextId = 0x404;
}
break;
- case 0x402:
- case 0x404:
+ case 0x402: // You can't stop, can you? You can play as long as you have rupees.
+ case 0x404: // Frustrating, right? Wanna try again?
+ // One game is 20 rupees.
Message_StartTextbox(play, 0x3F6, &this->actor);
- this->unk_284 = 0x3F6;
- this->unk_26A = 4;
+ this->prevTextId = 0x3F6;
+ this->shootingGameState = SG_GAME_STATE_ONE_MORE_GAME;
break;
- case 0x405:
- case 0x406:
- case 0x407:
+ case 0x405: // No way! That was perfect!
+ case 0x406: // That was perfect!
+ case 0x407: // You got a new record!
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
player->actor.freezeTimer = 0;
gSaveContext.minigameState = 3;
- this->actionFunc = func_809C7D14;
- func_809C7D14(this, play);
+ this->actionFunc = EnSyatekiMan_Town_SetupGiveReward;
+ EnSyatekiMan_Town_SetupGiveReward(this, play);
break;
}
}
}
-void func_809C7990(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Town_Talk(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (player->stateFlags1 & 0x20) {
@@ -707,16 +816,16 @@ void func_809C7990(EnSyatekiMan* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_CLOSING:
- this->actionFunc = func_809C72D8;
- this->unk_26A = 0;
+ this->actionFunc = EnSyatekiMan_Town_Idle;
+ this->shootingGameState = SG_GAME_STATE_NONE;
break;
case TEXT_STATE_CHOICE:
- func_809C7380(this, play);
+ EnSyatekiMan_Town_HandleChoice(this, play);
break;
case TEXT_STATE_5:
- func_809C7620(this, play);
+ EnSyatekiMan_Town_HandleNormalMessage(this, play);
break;
case TEXT_STATE_DONE:
@@ -724,8 +833,8 @@ void func_809C7990(EnSyatekiMan* this, PlayState* play) {
gSaveContext.save.weekEventReg[63] &= (u8)~1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
player->stateFlags1 &= ~0x20;
- this->actionFunc = func_809C72D8;
- this->unk_26A = 0;
+ this->actionFunc = EnSyatekiMan_Town_Idle;
+ this->shootingGameState = SG_GAME_STATE_NONE;
}
break;
@@ -740,21 +849,22 @@ void func_809C7990(EnSyatekiMan* this, PlayState* play) {
}
}
-void func_809C7A90(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Swamp_SetupGiveReward(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Actor_HasParent(&this->actor, play)) {
if (!(gSaveContext.save.weekEventReg[59] & 0x10)) {
gSaveContext.save.weekEventReg[59] |= 0x10;
- } else if (!(gSaveContext.save.weekEventReg[32] & 2) && (this->unk_280 >= 0x884)) {
+ } else if (!(gSaveContext.save.weekEventReg[32] & 2) && (this->score >= 2180)) {
gSaveContext.save.weekEventReg[32] |= 2;
}
+
this->actor.parent = NULL;
- this->actionFunc = func_809C7C14;
+ this->actionFunc = EnSyatekiMan_Swamp_GiveReward;
} else {
if ((CUR_UPG_VALUE(UPG_QUIVER) < 3) && !(gSaveContext.save.weekEventReg[59] & 0x10)) {
Actor_PickUp(&this->actor, play, GI_QUIVER_30 + CUR_UPG_VALUE(UPG_QUIVER), 500.0f, 100.0f);
- } else if (this->unk_280 < 0x884) {
+ } else if (this->score < 2180) {
Actor_PickUp(&this->actor, play, GI_RUPEE_RED, 500.0f, 100.0f);
} else if (!(gSaveContext.save.weekEventReg[32] & 2)) {
Actor_PickUp(&this->actor, play, GI_HEART_PIECE, 500.0f, 100.0f);
@@ -769,46 +879,50 @@ void func_809C7A90(EnSyatekiMan* this, PlayState* play) {
}
}
-void func_809C7C14(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Swamp_GiveReward(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if ((CURRENT_DAY == 3) && (gSaveContext.save.time > CLOCK_TIME(12, 0))) {
+ // We've been having a lot of earthquakes lately.
Message_StartTextbox(play, 0xA36, &this->actor);
- this->unk_284 = 0xA36;
+ this->prevTextId = 0xA36;
} else {
+ // Tell your friends about us.
Message_StartTextbox(play, 0xA37, &this->actor);
- this->unk_284 = 0xA37;
+ this->prevTextId = 0xA37;
}
+
player->stateFlags1 &= ~0x20;
this->actor.flags &= ~ACTOR_FLAG_10000;
- this->unk_280 = 0;
- this->unk_26A = 0;
- this->actionFunc = func_809C6E30;
+ this->score = 0;
+ this->shootingGameState = SG_GAME_STATE_NONE;
+ this->actionFunc = EnSyatekiMan_Swamp_Talk;
} else {
func_800B85E0(&this->actor, play, 500.0f, EXCH_ITEM_MINUS1);
}
}
-void func_809C7D14(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Town_SetupGiveReward(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Actor_HasParent(&this->actor, play)) {
- if (this->unk_284 == 0x407) {
+ if (this->prevTextId == 0x407) {
if (!(gSaveContext.save.weekEventReg[59] & 0x20)) {
gSaveContext.save.weekEventReg[59] |= 0x20;
}
}
- if ((this->unk_284 == 0x405) || (this->unk_284 == 0x406)) {
+ if ((this->prevTextId == 0x405) || (this->prevTextId == 0x406)) {
if (!(gSaveContext.save.weekEventReg[32] & 4)) {
gSaveContext.save.weekEventReg[32] |= 4;
}
}
+
this->actor.parent = NULL;
- this->actionFunc = func_809C7EB4;
+ this->actionFunc = EnSyatekiMan_Town_GiveReward;
} else {
- if (this->unk_284 == 0x407) {
+ if (this->prevTextId == 0x407) {
if ((CUR_UPG_VALUE(UPG_QUIVER) < 3) && !(gSaveContext.save.weekEventReg[59] & 0x20)) {
Actor_PickUp(&this->actor, play, GI_QUIVER_30 + CUR_UPG_VALUE(UPG_QUIVER), 500.0f, 100.0f);
} else {
@@ -827,191 +941,209 @@ void func_809C7D14(EnSyatekiMan* this, PlayState* play) {
}
}
-void func_809C7EB4(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Town_GiveReward(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (CURRENT_DAY != 3) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
player->stateFlags1 &= ~0x20;
- this->unk_280 = 0;
- this->unk_26A = 0;
+ this->score = 0;
+ this->shootingGameState = SG_GAME_STATE_NONE;
gSaveContext.save.weekEventReg[63] &= (u8)~1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
- this->actionFunc = func_809C6810;
+ this->actionFunc = EnSyatekiMan_SetupIdle;
}
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ // This may be our last day in business...
Message_StartTextbox(play, 0x408, &this->actor);
- this->unk_284 = 0x408;
+ this->prevTextId = 0x408;
player->stateFlags1 &= ~0x20;
this->actor.flags &= ~ACTOR_FLAG_10000;
- this->unk_280 = 0;
- this->unk_26A = 0;
- this->actionFunc = func_809C7990;
+ this->score = 0;
+ this->shootingGameState = SG_GAME_STATE_NONE;
+ this->actionFunc = EnSyatekiMan_Town_Talk;
} else {
func_800B85E0(&this->actor, play, 500.0f, EXCH_ITEM_MINUS1);
}
}
-void func_809C7FFC(EnSyatekiMan* this, PlayState* play) {
+void EnSyatekiMan_Swamp_MovePlayerAndExplainRules(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (func_809C6720(play, D_809C9474)) {
+ if (EnSyatekiMan_MovePlayerToPos(play, sSwampPlayerPos)) {
player->stateFlags1 |= 0x20;
- this->unk_26A = 2;
- if (this->unk_282 != 2) {
- this->unk_282 = 2;
+ this->shootingGameState = SG_GAME_STATE_EXPLAINING_RULES;
+ if (this->talkFlags != TALK_FLAG_SWAMP_HAS_EXPLAINED_THE_RULES) {
+ this->talkFlags = TALK_FLAG_SWAMP_HAS_EXPLAINED_THE_RULES;
+ // The rules of the game are a piece of cake!
Message_StartTextbox(play, 0xA2B, &this->actor);
- this->unk_284 = 0xA2B;
+ this->prevTextId = 0xA2B;
} else {
+ // I keep saying - you have to aim with [Control Stick]!
Message_StartTextbox(play, 0xA2C, &this->actor);
- this->unk_284 = 0xA2C;
+ this->prevTextId = 0xA2C;
}
- this->actionFunc = func_809C6E30;
+
+ this->actionFunc = EnSyatekiMan_Swamp_Talk;
}
}
-void func_809C80C0(EnSyatekiMan* this, PlayState* play) {
- static s16 D_809C9498 = 30;
+void EnSyatekiMan_Swamp_StartGame(EnSyatekiMan* this, PlayState* play) {
+ static s16 sGameStartTimer = 30;
Player* player = GET_PLAYER(play);
- if (D_809C9498 > 0) {
- player->actor.world.pos = D_809C9474;
+ if (sGameStartTimer > 0) {
+ player->actor.world.pos = sSwampPlayerPos;
player->actor.shape.rot.y = -0x8000;
player->actor.world.rot.y = player->actor.shape.rot.y;
play->unk_18790(play, -0x8000, &this->actor);
- D_809C9498--;
+ sGameStartTimer--;
} else {
- D_809C9498 = 30;
- this->unk_27E = 0;
- this->unk_280 = 0;
+ sGameStartTimer = 30;
+ this->flagsIndex = 0;
+ this->score = 0;
player->stateFlags1 &= ~0x20;
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_FOUND);
- this->unk_272 = 0x1F;
- this->unk_274 = 0;
- this->unk_276 = 0;
- this->unk_26C = 0;
- this->unk_278 = 0;
- this->unk_27A = 0;
- this->unk_27C = 0;
- this->unk_26E = 0;
+ this->dekuScrubFlags = (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0);
+ this->guayFlags = 0;
+ this->wolfosFlags = 0;
+ this->perGameVar1.guaySpawnTimer = 0;
+ this->dekuScrubHitCounter = 0;
+ this->guayHitCounter = 0;
+ this->currentWave = 0;
+ this->perGameVar2.bonusDekuScrubHitCounter = 0;
func_8010E9F0(1, 100);
this->actor.draw = NULL;
- this->actionFunc = func_809C81D0;
+ this->actionFunc = EnSyatekiMan_Swamp_RunGame;
}
}
-void func_809C81D0(EnSyatekiMan* this, PlayState* play) {
- static s16 D_809C949C = 0;
+void EnSyatekiMan_Swamp_RunGame(EnSyatekiMan* this, PlayState* play) {
+ static s16 sHasSpawnedGuaysForThisWave = false;
Player* player = GET_PLAYER(play);
- if (((this->unk_272 == 0) || (this->unk_26C > 140)) && (D_809C949C == 0) && (this->unk_27C < 4)) {
- D_809C949C = 1;
- this->unk_26C = 0;
+ if (((this->dekuScrubFlags == 0) || (this->perGameVar1.guaySpawnTimer > 140)) && !sHasSpawnedGuaysForThisWave &&
+ (this->currentWave < 4)) {
+ // Spawn three guays after the player has killed all Deku Scrubs, or after 140 frames.
+ sHasSpawnedGuaysForThisWave = true;
+ this->perGameVar1.guaySpawnTimer = 0;
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_FOUND);
- this->unk_274 = D_809C91C8[this->unk_27E];
- if (this->unk_27E == 3) {
- this->unk_27E = 0;
+ this->guayFlags = sGuayFlagsPerWave[this->flagsIndex];
+ if (this->flagsIndex == 3) {
+ this->flagsIndex = 0;
} else {
- this->unk_27E++;
+ this->flagsIndex++;
}
- } else if ((this->unk_274 == 0) && (this->unk_272 == 0) && (D_809C949C == 1) && (this->unk_27C < 4)) {
- if (this->unk_27A < 3) {
- this->unk_27A = 0;
+ } else if ((this->guayFlags == 0) && (this->dekuScrubFlags == 0) && (sHasSpawnedGuaysForThisWave == true) &&
+ (this->currentWave < 4)) {
+ // Once all Deku Scrubs and Guays in this wave have either disappeared or died, move on to the next wave.
+ if (this->guayHitCounter < 3) {
+ this->guayHitCounter = 0;
}
- this->unk_26C = 0;
- D_809C949C = 0;
- this->unk_27C++;
- if (this->unk_27C < 4) {
- this->unk_272 = 31;
+
+ this->perGameVar1.guaySpawnTimer = 0;
+ sHasSpawnedGuaysForThisWave = false;
+ this->currentWave++;
+ if (this->currentWave < 4) {
+ this->dekuScrubFlags = (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0);
}
}
- if (this->unk_27A == 3) {
- this->unk_27A = 0;
- this->unk_276 |= 1;
+ if (this->guayHitCounter == 3) {
+ this->guayHitCounter = 0;
+ this->wolfosFlags |= 1;
}
- if (this->unk_278 == 10) {
- this->unk_278 = 0;
- this->unk_276 |= 2;
+ if (this->dekuScrubHitCounter == 10) {
+ this->dekuScrubHitCounter = 0;
+ this->wolfosFlags |= 2;
}
- this->unk_26C++;
+ this->perGameVar1.guaySpawnTimer++;
+
if (gSaveContext.unk_3DE0[1] == 0) {
gSaveContext.unk_3DE0[1] = 0;
gSaveContext.unk_3DD0[1] = 5;
this->actor.draw = EnSyatekiMan_Draw;
- this->unk_27E = 0;
- this->unk_27C = 0;
+ this->flagsIndex = 0;
+ this->currentWave = 0;
player->stateFlags1 |= 0x20;
- D_809C949C = 0;
+ sHasSpawnedGuaysForThisWave = false;
func_801A2C20();
- this->actionFunc = func_809C8488;
- } else if ((this->unk_27C == 4) && (this->unk_276 == 0) && (this->unk_26E == 2)) {
+ this->actionFunc = EnSyatekiMan_Swamp_EndGame;
+ } else if ((this->currentWave == 4) && (this->wolfosFlags == 0) &&
+ (this->perGameVar2.bonusDekuScrubHitCounter == 2)) {
this->actor.draw = EnSyatekiMan_Draw;
- this->unk_27E = 0;
- this->unk_27C = 0;
+ this->flagsIndex = 0;
+ this->currentWave = 0;
player->stateFlags1 |= 0x20;
- D_809C949C = 0;
+ sHasSpawnedGuaysForThisWave = false;
func_801A2C20();
- this->unk_26A = 5;
- if (this->unk_280 == 0x848) {
+ this->shootingGameState = SG_GAME_STATE_GIVING_BONUS;
+ if (this->score == 2120) {
func_8011B4E0(play, 2);
gSaveContext.unk_3DD0[1] = 6;
- this->actionFunc = func_809C8610;
+ this->actionFunc = EnSyatekiMan_Swamp_AddBonusPoints;
} else {
gSaveContext.unk_3DD0[1] = 5;
- this->actionFunc = func_809C8488;
+ this->actionFunc = EnSyatekiMan_Swamp_EndGame;
}
}
}
-void func_809C8488(EnSyatekiMan* this, PlayState* play) {
- if ((this->unk_26A == 1) || (this->unk_26A == 5)) {
- this->unk_190 = 0;
- this->unk_272 = 0;
- this->unk_274 = 0;
- this->unk_276 = 0;
- if (this->unk_270 <= 0) {
- if ((s32)((gSaveContext.save.unk_EF4 & 0xFFFF0000) >> 0x10) < this->unk_280) {
- gSaveContext.save.unk_EF4 = ((gSaveContext.save.unk_EF4) & 0xFFFF) | ((u16)this->unk_280 << 0x10);
+void EnSyatekiMan_Swamp_EndGame(EnSyatekiMan* this, PlayState* play) {
+ if ((this->shootingGameState == SG_GAME_STATE_RUNNING) || (this->shootingGameState == SG_GAME_STATE_GIVING_BONUS)) {
+ this->octorokFlags = 0;
+ this->dekuScrubFlags = 0;
+ this->guayFlags = 0;
+ this->wolfosFlags = 0;
+ if (this->talkWaitTimer <= 0) {
+ if (GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() < this->score) {
+ SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(this->score);
}
- this->unk_270 = 15;
- if (this->unk_280 >= 0x848) {
+
+ this->talkWaitTimer = 15;
+ if (this->score >= 2120) {
+ // Perfect! Take this!
Message_StartTextbox(play, 0xA34, &this->actor);
- this->unk_284 = 0xA34;
- this->unk_26A = 6;
- } else if (this->unk_280 >= 0x7D0) {
+ this->prevTextId = 0xA34;
+ this->shootingGameState = SG_GAME_STATE_ENDED;
+ } else if (this->score >= 2000) {
if (gSaveContext.save.weekEventReg[63] & 2) {
gSaveContext.save.weekEventReg[63] &= (u8)~1;
gSaveContext.save.weekEventReg[63] &= (u8)~2;
- this->unk_26A = 0;
+ this->shootingGameState = SG_GAME_STATE_NONE;
gSaveContext.minigameState = 3;
- this->actionFunc = func_809C6848;
+ this->actionFunc = EnSyatekiMan_Swamp_Idle;
return;
}
+
+ // You almost had it! Well...just this once...here you go!
+ // Setting prevTextId to this is what triggers a free replay in EnSyatekiMan_Swamp_HandleNormalMessage.
Message_StartTextbox(play, 0xA35, &this->actor);
- this->unk_284 = 0xA35;
- this->unk_26A = 4;
- this->unk_280 = 0;
+ this->prevTextId = 0xA35;
+ this->shootingGameState = SG_GAME_STATE_ONE_MORE_GAME;
+ this->score = 0;
} else {
+ // You have to try harder!
Message_StartTextbox(play, 0xA32, &this->actor);
- this->unk_284 = 0xA32;
- this->unk_26A = 6;
+ this->prevTextId = 0xA32;
+ this->shootingGameState = SG_GAME_STATE_ENDED;
}
- this->actionFunc = func_809C6E30;
+
+ this->actionFunc = EnSyatekiMan_Swamp_Talk;
} else {
- this->unk_270--;
+ this->talkWaitTimer--;
}
}
- if (this->unk_270 < 5) {
+ if (this->talkWaitTimer < 5) {
play->unk_1887C = -10;
}
}
-void func_809C8610(EnSyatekiMan* this, PlayState* play) {
- static s32 D_809C94A0 = 0;
+void EnSyatekiMan_Swamp_AddBonusPoints(EnSyatekiMan* this, PlayState* play) {
+ static s32 sBonusTimer = 0;
Player* player = GET_PLAYER(play);
player->stateFlags1 |= 0x20;
@@ -1019,130 +1151,202 @@ void func_809C8610(EnSyatekiMan* this, PlayState* play) {
if (gSaveContext.unk_3DE0[1] == 0) {
gSaveContext.unk_3DE0[1] = 0;
gSaveContext.unk_3DD0[1] = 5;
- this->unk_27E = 0;
- this->unk_27C = 0;
- this->actionFunc = func_809C8488;
- D_809C94A0 = 0;
- } else if (D_809C94A0 > 10) {
+ this->flagsIndex = 0;
+ this->currentWave = 0;
+ this->actionFunc = EnSyatekiMan_Swamp_EndGame;
+ sBonusTimer = 0;
+ } else if (sBonusTimer > 10) {
gSaveContext.unk_3E88[1] += 100;
play->interfaceCtx.unk_25C += 10;
- this->unk_280 += 10;
+ this->score += 10;
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
- D_809C94A0 = 0;
+ sBonusTimer = 0;
} else {
- D_809C94A0++;
+ sBonusTimer++;
}
}
}
-void func_809C8710(EnSyatekiMan* this, PlayState* play) {
- Vec3f sp24;
+void EnSyatekiMan_Town_MovePlayerAndSayHighScore(EnSyatekiMan* this, PlayState* play) {
+ Vec3f targetPlayerPos;
if (gSaveContext.save.playerForm == PLAYER_FORM_FIERCE_DEITY) {
- sp24 = D_809C9480;
+ targetPlayerPos = sTownFierceDietyPlayerPos;
} else {
- sp24 = D_809C948C;
+ targetPlayerPos = sTownPlayerPos;
}
- if (func_809C6720(play, sp24)) {
- if (this->unk_284 == 0x3FD) {
+ if (EnSyatekiMan_MovePlayerToPos(play, targetPlayerPos)) {
+ if (this->prevTextId == 0x3FD) {
+ // Our highest score is [score]. If you break the record, you'll win a prize!
Message_StartTextbox(play, 0x3FE, &this->actor);
- this->unk_284 = 0x3FE;
+ this->prevTextId = 0x3FE;
} else {
+ // Our highest score is [score]. Good luck!
Message_StartTextbox(play, 0x400, &this->actor);
- this->unk_284 = 0x400;
+ this->prevTextId = 0x400;
}
- this->unk_26A = 2;
- this->actionFunc = func_809C7990;
+
+ this->shootingGameState = SG_GAME_STATE_EXPLAINING_RULES;
+ this->actionFunc = EnSyatekiMan_Town_Talk;
}
}
-void func_809C8808(EnSyatekiMan* this, PlayState* play) {
- static s16 D_809C94A4 = 30;
+void EnSyatekiMan_Town_StartGame(EnSyatekiMan* this, PlayState* play) {
+ static s16 sGameStartTimer = 30;
Player* player = GET_PLAYER(play);
- if (D_809C94A4 == 30) {
+ if (sGameStartTimer == 30) {
if (player->transformation == PLAYER_FORM_FIERCE_DEITY) {
- player->actor.world.pos = D_809C9480;
+ player->actor.world.pos = sTownFierceDietyPlayerPos;
} else {
- player->actor.world.pos = D_809C948C;
+ player->actor.world.pos = sTownPlayerPos;
}
+
player->actor.prevPos = player->actor.world.pos;
player->actor.shape.rot.y = -0x8000;
player->actor.world.rot.y = player->actor.shape.rot.y;
play->unk_18790(play, -0x8000, &this->actor);
player->stateFlags1 |= 0x20;
- D_809C94A4--;
- } else if (D_809C94A4 > 0) {
+ sGameStartTimer--;
+ } else if (sGameStartTimer > 0) {
player->actor.shape.rot.y = -0x8000;
player->actor.world.rot.y = player->actor.shape.rot.y;
- D_809C94A4--;
- } else if (D_809C94A4 == 0) {
+ sGameStartTimer--;
+ } else if (sGameStartTimer == 0) {
player->stateFlags1 &= ~0x20;
- this->unk_280 = 0;
- this->unk_27E = 0;
- this->unk_26C = 70;
- this->unk_26E = 0;
- D_809C94A4 = 30;
+ this->score = 0;
+ this->flagsIndex = 0;
+ this->perGameVar1.octorokState = SG_OCTO_STATE_INITIAL;
+ this->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_NONE;
+ sGameStartTimer = 30;
func_8010E9F0(1, 75);
this->actor.draw = NULL;
- this->actionFunc = func_809C898C;
+ this->actionFunc = EnSyatekiMan_Town_RunGame;
}
}
-void func_809C898C(EnSyatekiMan* this, PlayState* play) {
- static const s32 D_809C94D0[] = {
- 0x00000111, 0x00000650, 0x00010025, 0x00011011, 0x00000984, 0x00004050, 0x00010211, 0x00022015,
- 0x00026984, 0x00012852, 0x00011999, 0x00022895, 0x0000056A, 0x0002A451, 0x00004115,
- };
- static s32 D_809C94A8 = 0;
+/**
+ * In the Town Shooting Gallery, there are fifteen waves of Octoroks.
+ * For each wave, these flags are used to control which Octoroks appear.
+ */
+static const s32 sOctorokFlagsPerWave[] = {
+ OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_RIGHT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_CENTER, COLUMN_LEFT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_RIGHT) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_BLUE, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_BLUE, ROW_FRONT, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_RIGHT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_LEFT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+
+ OCTOROK_FLAG(COLOR_RED, ROW_FRONT, COLUMN_CENTER) | OCTOROK_FLAG(COLOR_RED, ROW_CENTER, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_RIGHT) | OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_CENTER) |
+ OCTOROK_FLAG(COLOR_RED, ROW_BACK, COLUMN_LEFT),
+};
+
+void EnSyatekiMan_Town_RunGame(EnSyatekiMan* this, PlayState* play) {
+ static s32 sModFromLosingTime = 0;
Player* player = GET_PLAYER(play);
- s32 sp30 = (((void)0, gSaveContext.unk_3DE0[1]) * 0.1f) + 1.0f;
+ s32 timer = (((void)0, gSaveContext.unk_3DE0[1]) * 0.1f) + 1.0f; // unit is tenths of a second
- if (sp30 < 0x2EF) {
- s32 temp;
+ if (timer <= 750) {
+ s32 waveTimer; // unit is hundredths of a second
- if (D_809C94A8 == 0) {
- temp = ((void)0, gSaveContext.unk_3DE0[1]) % 500;
+ // If you hit a Blue Octorok, you lose 2.5 seconds. If we pretend that the code below was not present,
+ // then waveTimer would drop by 250, dramatically reducing how much time you have before the Octoroks
+ // begin hiding. This code will ultimately correct waveTimer such that its value is not affected by
+ // hitting Blue Octoroks.
+ if (sModFromLosingTime == 0) {
+ waveTimer = ((void)0, gSaveContext.unk_3DE0[1]) % 500;
} else {
- temp = (((void)0, gSaveContext.unk_3DE0[1]) + 250) % 500;
+ waveTimer = (((void)0, gSaveContext.unk_3DE0[1]) + 250) % 500;
}
- if (temp < 100) {
- this->unk_26C = 80;
+ // Octoroks begin hiding four seconds after a wave begins.
+ if (waveTimer < 100) {
+ this->perGameVar1.octorokState = SG_OCTO_STATE_HIDING;
}
- if (this->unk_26E != 0) {
- if (this->unk_26E == 2) {
+ if (this->perGameVar2.octorokHitType != SG_OCTO_HIT_TYPE_NONE) {
+ if (this->perGameVar2.octorokHitType == SG_OCTO_HIT_TYPE_BLUE) {
gSaveContext.unk_3E18[1] -= 250;
- D_809C94A8 = (D_809C94A8 + 25) % 50;
+ sModFromLosingTime = (sModFromLosingTime + 25) % 50;
}
- this->unk_26E = 0;
+
+ this->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_NONE;
}
- if (this->unk_26C == 0) {
- this->unk_26C++;
+ if (this->perGameVar1.octorokState == SG_OCTO_STATE_SPAWNING) {
+ this->perGameVar1.octorokState++;
}
- if ((D_809C94A8 == (sp30 % 50)) && (this->unk_26C >= 70)) {
- if (this->unk_27E < 15) {
- this->unk_190 = D_809C94D0[this->unk_27E++];
+ // A new wave of Octoroks should appear every five seconds. However, we need to take into account
+ // that the player might have lost time from hitting Blue Octoroks, so we do something similar to
+ // what was done with waveTimer above.
+ if ((sModFromLosingTime == (timer % 50)) && (this->perGameVar1.octorokState >= SG_OCTO_STATE_INITIAL)) {
+ if (this->flagsIndex < 15) {
+ this->octorokFlags = sOctorokFlagsPerWave[this->flagsIndex++];
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_FOUND);
- this->unk_26C = 0;
+ this->perGameVar1.octorokState = SG_OCTO_STATE_SPAWNING;
}
}
if (gSaveContext.unk_3DE0[1] == 0) {
- this->unk_27E = 0;
- this->unk_26C = 80;
+ this->flagsIndex = 0;
+ this->perGameVar1.octorokState = SG_OCTO_STATE_HIDING;
gSaveContext.unk_3DE0[1] = 0;
gSaveContext.unk_3DD0[1] = 5;
player->stateFlags1 |= 0x20;
- D_809C94A8 = 0;
+ sModFromLosingTime = 0;
this->actor.draw = EnSyatekiMan_Draw;
func_801A2C20();
- this->actionFunc = func_809C8BF0;
- if (this->unk_280 == 50) {
+ this->actionFunc = EnSyatekiMan_Town_EndGame;
+ if (this->score == 50) {
func_801A3098(NA_BGM_GET_ITEM | 0x900);
func_8011B4E0(play, 1);
}
@@ -1150,47 +1354,56 @@ void func_809C898C(EnSyatekiMan* this, PlayState* play) {
}
}
-void func_809C8BF0(EnSyatekiMan* this, PlayState* play) {
- if (this->unk_26A == 1) {
- this->unk_190 = 0;
- if ((this->unk_270 <= 0) && (play->interfaceCtx.unk_286 == 0)) {
- Flags_SetAllTreasure(play, this->unk_280);
- this->unk_270 = 15;
- if (((s32)(gSaveContext.save.unk_EF4 & 0xFFFF) < this->unk_280) || (this->unk_280 == 50)) {
- if ((s32)(gSaveContext.save.unk_EF4 & 0xFFFF) < this->unk_280) {
+void EnSyatekiMan_Town_EndGame(EnSyatekiMan* this, PlayState* play) {
+ if (this->shootingGameState == SG_GAME_STATE_RUNNING) {
+ this->octorokFlags = 0;
+ if ((this->talkWaitTimer <= 0) && (play->interfaceCtx.unk_286 == 0)) {
+ Flags_SetAllTreasure(play, this->score);
+ this->talkWaitTimer = 15;
+ if ((GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() < this->score) || (this->score == 50)) {
+ if (GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() < this->score) {
if (!(gSaveContext.save.weekEventReg[59] & 0x20)) {
+ // You got a new record!
Message_StartTextbox(play, 0x407, &this->actor);
- this->unk_284 = 0x407;
- } else if (this->unk_280 == 50) {
+ this->prevTextId = 0x407;
+ } else if (this->score == 50) {
+ // No way! That was perfect!
Message_StartTextbox(play, 0x405, &this->actor);
- this->unk_284 = 0x405;
+ this->prevTextId = 0x405;
} else {
+ // You got a new record!
Message_StartTextbox(play, 0x407, &this->actor);
- this->unk_284 = 0x407;
+ this->prevTextId = 0x407;
}
- } else if (this->unk_280 == 50) {
+ } else if (this->score == 50) {
+ // That was perfect!
Message_StartTextbox(play, 0x406, &this->actor);
- this->unk_284 = 0x406;
+ this->prevTextId = 0x406;
}
- gSaveContext.save.unk_EF4 = (gSaveContext.save.unk_EF4 & 0xFFFF0000) | (this->unk_280 & 0xFFFF);
- this->unk_26A = 6;
+
+ SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(this->score);
+ this->shootingGameState = SG_GAME_STATE_ENDED;
} else {
if (CURRENT_DAY != 3) {
+ // You got [score]? Oh, that's too bad...
Message_StartTextbox(play, 0x401, &this->actor);
- this->unk_284 = 0x401;
+ this->prevTextId = 0x401;
} else {
+ // You got [score]? Too bad...
Message_StartTextbox(play, 0x403, &this->actor);
- this->unk_284 = 0x403;
+ this->prevTextId = 0x403;
}
- this->unk_26A = 4;
+
+ this->shootingGameState = SG_GAME_STATE_ONE_MORE_GAME;
}
- this->actionFunc = func_809C7990;
+
+ this->actionFunc = EnSyatekiMan_Town_Talk;
} else {
- this->unk_270--;
+ this->talkWaitTimer--;
}
}
- if (this->unk_270 < 5) {
+ if (this->talkWaitTimer < 5) {
play->unk_1887C = -10;
}
}
@@ -1223,9 +1436,9 @@ void EnSyatekiMan_Update(Actor* thisx, PlayState* play) {
EnSyatekiMan_Blink(this);
this->actor.focus.pos.y = 70.0f;
Actor_SetFocus(&this->actor, 70.0f);
- if (this->unk_26A != 1) {
+ if (this->shootingGameState != SG_GAME_STATE_RUNNING) {
SkelAnime_Update(&this->skelAnime);
- Actor_TrackPlayer(play, &this->actor, &this->unk_258, &this->unk_25E, this->actor.focus.pos);
+ Actor_TrackPlayer(play, &this->actor, &this->headRot, &this->torsoRot, this->actor.focus.pos);
}
}
@@ -1238,11 +1451,11 @@ s32 EnSyatekiMan_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
if (limbIndex == BURLY_GUY_LIMB_HEAD) {
Matrix_Translate(3000.0f, 0.0f, 0.0f, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_258.x, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_258.y, MTXMODE_APPLY);
+ Matrix_RotateZS(this->headRot.x, MTXMODE_APPLY);
+ Matrix_RotateXS(this->headRot.y, MTXMODE_APPLY);
Matrix_Translate(-3000.0f, 0.0f, 0.0f, MTXMODE_APPLY);
} else if (limbIndex == BURLY_GUY_LIMB_TORSO) {
- Matrix_RotateXS(-this->unk_25E.y, MTXMODE_APPLY);
+ Matrix_RotateXS(-this->torsoRot.y, MTXMODE_APPLY);
}
return false;
@@ -1250,10 +1463,10 @@ s32 EnSyatekiMan_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
void EnSyatekiMan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnSyatekiMan* this = THIS;
- Vec3f sp18 = { 1600.0f, 0.0f, 0.0f };
+ Vec3f sFocusOffset = { 1600.0f, 0.0f, 0.0f };
if (limbIndex == BURLY_GUY_LIMB_HEAD) {
- Matrix_MultVec3f(&sp18, &this->actor.focus.pos);
+ Matrix_MultVec3f(&sFocusOffset, &this->actor.focus.pos);
}
}
diff --git a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
index 1719f8161..30bc1b1ad 100644
--- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
+++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
@@ -4,49 +4,70 @@
#include "global.h"
#include "objects/object_shn/object_shn.h"
-
struct EnSyatekiMan;
typedef void (*EnSyatekiManActionFunc)(struct EnSyatekiMan*, PlayState*);
-#define ENSYATEKIMAN_GET_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_MAN_GET_PATH(thisx) (((thisx)->params & 0xFF00) >> 8)
-typedef struct {
- /* 0x00 */ s16 index;
- /* 0x04 */ f32 x;
- /* 0x08 */ f32 y;
- /* 0x0C */ f32 z;
- /* 0x10 */ s32 variable;
-} EnSyatekiManUnkStruct; // size = 0x14
+typedef enum {
+ /* 0 */ SG_GAME_STATE_NONE, // None of the states below apply.
+ /* 1 */ SG_GAME_STATE_RUNNING, // The shooting game is in-progress.
+ /* 2 */ SG_GAME_STATE_EXPLAINING_RULES, // For the Town Shooting Gallery, this state is also used for explaining the current high score.
+ /* 3 */ SG_GAME_STATE_NOT_PLAYING, // Either the player said "No" to playing, or they said "Yes" but don't have enough rupees.
+ /* 4 */ SG_GAME_STATE_ONE_MORE_GAME, // The player failed to get a new high score (Town) and/or perfect score (Swamp and Town).
+ /* 5 */ SG_GAME_STATE_GIVING_BONUS, // The player gets bonus points at the end of the Swamp game if they get a perfect score.
+ /* 6 */ SG_GAME_STATE_ENDED, // The player got a new high score and/or perfect score (Town), or the game is over (Swamp).
+ /* 7 */ SG_GAME_STATE_MOVING_PLAYER, // The player is automatically moving towards the spot to play the game.
+} ShootingGalleryGameState;
+
+typedef enum {
+ /* 0 */ SG_OCTO_STATE_SPAWNING,
+ /* 1 */ SG_OCTO_STATE_SPAWNED,
+ /* 70 */ SG_OCTO_STATE_INITIAL = 70,
+ /* 80 */ SG_OCTO_STATE_HIDING = 80,
+} ShootingGalleryOctorokState;
+
+typedef enum {
+ /* 0 */ SG_OCTO_HIT_TYPE_NONE,
+ /* 1 */ SG_OCTO_HIT_TYPE_RED,
+ /* 2 */ SG_OCTO_HIT_TYPE_BLUE,
+} ShootingGalleryoctorokHitType;
typedef struct EnSyatekiMan {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnSyatekiManActionFunc actionFunc;
/* 0x18C */ Path* path;
- /* 0x190 */ s32 unk_190;
- /* 0x194 */ s32 unk_194;
+ /* 0x190 */ s32 octorokFlags;
+ /* 0x194 */ s32 swampTargetActorListIndex; // used but never initialized, so the value is implicitly always 0
/* 0x198 */ Vec3s jointTable[BURLY_GUY_LIMB_MAX];
/* 0x1F8 */ Vec3s morphTable[BURLY_GUY_LIMB_MAX];
- /* 0x258 */ Vec3s unk_258;
- /* 0x25E */ Vec3s unk_25E;
+ /* 0x258 */ Vec3s headRot;
+ /* 0x25E */ Vec3s torsoRot;
/* 0x264 */ s16 eyeIndex;
/* 0x266 */ s16 blinkTimer;
/* 0x268 */ UNK_TYPE1 unk268[0x2];
- /* 0x26A */ s16 unk_26A;
- /* 0x26C */ s16 unk_26C;
- /* 0x26E */ s16 unk_26E;
- /* 0x270 */ s16 unk_270;
- /* 0x272 */ s16 unk_272;
- /* 0x274 */ s16 unk_274;
- /* 0x276 */ s16 unk_276;
- /* 0x278 */ s16 unk_278;
- /* 0x27A */ s16 unk_27A;
- /* 0x27C */ s16 unk_27C;
- /* 0x27E */ s16 unk_27E;
- /* 0x280 */ s16 unk_280;
- /* 0x282 */ s16 unk_282;
- /* 0x284 */ s16 unk_284;
+ /* 0x26A */ s16 shootingGameState;
+ /* 0x26C */ union {
+ s16 guaySpawnTimer;
+ s16 octorokState;
+ } perGameVar1;
+ /* 0x26E */ union {
+ s16 bonusDekuScrubHitCounter;
+ s16 octorokHitType;
+ } perGameVar2;
+ /* 0x270 */ s16 talkWaitTimer;
+ /* 0x272 */ s16 dekuScrubFlags;
+ /* 0x274 */ s16 guayFlags;
+ /* 0x276 */ s16 wolfosFlags;
+ /* 0x278 */ s16 dekuScrubHitCounter;
+ /* 0x27A */ s16 guayHitCounter;
+ /* 0x27C */ s16 currentWave;
+ /* 0x27E */ s16 flagsIndex; // Used for Octoroks in Town and Guays in Swamp
+ /* 0x280 */ s16 score;
+ /* 0x282 */ s16 talkFlags;
+ /* 0x284 */ s16 prevTextId;
} EnSyatekiMan; // size = 0x288
extern const ActorInit En_Syateki_Man_InitVars;
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 26cdf3415..eda6337a0 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
@@ -137,7 +137,7 @@ s32 func_80A361F4(EnSyatekiOkuta* this) {
temp_v1 = EN_SYATEKI_OKUTA_GET_F(&this->actor);
if ((temp_v1 == 1) || (temp_v1 == 4)) {
- temp_a0 = syatekiMan->unk_190;
+ temp_a0 = syatekiMan->octorokFlags;
temp_a1 = (temp_v1 * 2) + 6;
if ((temp_a0 >> temp_a1) & 3) {
@@ -212,7 +212,7 @@ void func_80A36444(EnSyatekiOkuta* this) {
void func_80A36488(EnSyatekiOkuta* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if (syatekiMan->unk_26C >= 0x46) {
+ if (syatekiMan->perGameVar1.octorokState >= SG_OCTO_STATE_INITIAL) {
func_80A364C0(this);
}
}
@@ -341,9 +341,10 @@ void func_80A36AF8(EnSyatekiOkuta* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
s16 temp_v1_2;
- if ((this->actionFunc != func_80A36488) && (this->actionFunc != func_80A363B4) && (syatekiMan->unk_26A == 1) &&
- (syatekiMan->unk_26C == 0)) {
- temp_v1_2 = (syatekiMan->unk_190 >> (EN_SYATEKI_OKUTA_GET_F(&this->actor) * 2)) & 3;
+ if ((this->actionFunc != func_80A36488) && (this->actionFunc != func_80A363B4) &&
+ (syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) &&
+ (syatekiMan->perGameVar1.octorokState == SG_OCTO_STATE_SPAWNING)) {
+ temp_v1_2 = (syatekiMan->octorokFlags >> (EN_SYATEKI_OKUTA_GET_F(&this->actor) * 2)) & 3;
if (temp_v1_2 > 0) {
Actor_SetScale(&this->actor, 0.01f);
this->unk_2A6 = temp_v1_2;
@@ -370,11 +371,11 @@ void EnSyatekiOkuta_Update(Actor* thisx, PlayState* play) {
if (this->unk_2A6 == 1) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
play->interfaceCtx.unk_25C++;
- syatekiMan->unk_280++;
- syatekiMan->unk_26E = 1;
+ syatekiMan->score++;
+ syatekiMan->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_RED;
} else {
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_ERROR);
- syatekiMan->unk_26E = 2;
+ syatekiMan->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_BLUE;
}
func_80A3657C(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 e40cc9570..7c6073bb2 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
@@ -151,7 +151,7 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
path = &play->setupPathList[path->unk1];
}
- for (i = 0; i < EN_SYATEKI_WF_GET_PARAM_FF00(&this->actor); i++) {
+ for (i = 0; i < EN_SYATEKI_WF_GET_NUMBER(&this->actor); i++) {
path = &play->setupPathList[path->unk1];
}
@@ -224,7 +224,7 @@ void func_80A201CC(EnSyatekiWf* this) {
this->actor.draw = NULL;
this->unk_2A4 = 1;
this->unk_298 = 0;
- syatekiMan->unk_276 &= ~(1 << EN_SYATEKI_WF_GET_PARAM_FF00(&this->actor));
+ syatekiMan->wolfosFlags &= ~(1 << EN_SYATEKI_WF_GET_NUMBER(&this->actor));
this->actionFunc = func_80A20284;
}
@@ -233,10 +233,10 @@ void func_80A20284(EnSyatekiWf* this, PlayState* play) {
if (this->actor.parent != NULL) {
syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if ((syatekiMan->unk_26A == 1) && (this->unk_298 == 1)) {
+ if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_298 == 1)) {
func_80A200E0(this);
func_80A2030C(this);
- } else if (syatekiMan->unk_276 & (1 << EN_SYATEKI_WF_GET_PARAM_FF00(&this->actor))) {
+ } else if (syatekiMan->wolfosFlags & (1 << EN_SYATEKI_WF_GET_NUMBER(&this->actor))) {
this->unk_298 = 1;
}
}
@@ -270,7 +270,7 @@ void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
s16 temp_v0;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
- if (syatekiMan->unk_26A != 1) {
+ if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
func_80A201CC(this);
}
@@ -375,7 +375,7 @@ void func_80A20858(EnSyatekiWf* this, PlayState* play) {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A20EDC, &D_80A20EE8, 5, 2);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_DEAD);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 6);
- syatekiMan->unk_280 += 100;
+ syatekiMan->score += 100;
this->actionFunc = func_80A208F8;
}
diff --git a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h
index 1af2d0b96..4de182a10 100644
--- a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h
+++ b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.h
@@ -5,7 +5,8 @@
#include "objects/object_wf/object_wf.h"
#define EN_SYATEKI_WF_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
-#define EN_SYATEKI_WF_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_WF_GET_NUMBER(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_WF_PARAMS(number, unkF0, unused) (((number << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unused & 0xF))
struct EnSyatekiWf;
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 ef8224453..f180eec2c 100644
--- a/src/overlays/actors/ovl_En_Test4/z_en_test4.c
+++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
@@ -404,7 +404,7 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
if (player->stateFlags1 & 0x800000) {
EnHorse* rideActor = (EnHorse*)player->rideActor;
- if ((rideActor->type == HORSE_EPONA) || (rideActor->type == HORSE_2)) {
+ if ((rideActor->type == HORSE_TYPE_EPONA) || (rideActor->type == HORSE_TYPE_2)) {
if (CURRENT_DAY < 3) {
D_801BDA9C = 1;
} else {
@@ -520,7 +520,7 @@ void func_80A430C8(EnTest4* this, PlayState* play) {
(gSaveContext.save.time < CLOCK_TIME(17, 30)) && (play->envCtx.unk_F2[2] == 0)) {
// rain?
- D_801BDBB0 = 1;
+ gWeatherMode = 1;
func_800FD78C(play);
play->envCtx.unk_E3 = 1;
play->envCtx.unk_F2[0] = 0x3C;
@@ -535,7 +535,7 @@ void func_80A430C8(EnTest4* this, PlayState* play) {
}
}
- if (D_801BDBB0 == 1) {
+ if (gWeatherMode == 1) {
this->state = TEST4_STATE_1;
}
}
@@ -544,11 +544,11 @@ void func_80A431C8(EnTest4* this, PlayState* play) {
if (((gSaveContext.save.time >= CLOCK_TIME(17, 30)) && (gSaveContext.save.time < CLOCK_TIME(23, 0)) &&
(play->envCtx.unk_F2[0] != 0)) ||
(play->envCtx.unk_F2[2] != 0)) {
- D_801BDBB0 = 0;
+ gWeatherMode = 0;
play->envCtx.unk_E3 = 2;
}
- if (D_801BDBB0 == 0) {
+ if (gWeatherMode == 0) {
this->state = TEST4_STATE_0;
}
}
diff --git a/src/overlays/actors/ovl_En_Test7/z_en_test7.c b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
index c0953a117..b9b62e9f7 100644
--- a/src/overlays/actors/ovl_En_Test7/z_en_test7.c
+++ b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
@@ -398,7 +398,7 @@ void EnTest7_Init(Actor* thisx, PlayState* play2) {
this->unk_1E94 = player->actor.scale.z;
func_80183430(&this->unk_18CC, &gameplay_keep_Blob_085640, &gameplay_keep_Blob_083534, this->unk_18FC,
- this->unk_1BA8, 0);
+ this->unk_1BA8, NULL);
func_801834A8(&this->unk_18CC, &gameplay_keep_Blob_083534);
func_80AF0838(this->unk_15C);
func_80AF1730(&this->unk_148);
diff --git a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
index d4b50ff35..36d127711 100644
--- a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
+++ b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
@@ -103,7 +103,7 @@ void func_80AC9FE4(EnTimeTag* this, PlayState* play) {
void func_80ACA0A8(EnTimeTag* this, PlayState* play) {
EnTimeTag* this2 = this;
- if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.unk1202E == 4)) {
+ if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_OATH)) {
if (this->actor.cutscene != -1) {
this->actionFunc = func_80AC9FE4;
ActorCutscene_SetIntentToPlay(this2->actor.cutscene);
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 b1f2fbeaf..5d2ffec87 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -442,7 +442,7 @@ void EnTrt_GiveRedPotionForKoume(EnTrt* this, PlayState* play) {
} else if (gSaveContext.save.weekEventReg[12] & 0x10) {
Actor_PickUp(&this->actor, play, GI_POTION_RED, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_BOTTLE_POTION_RED, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, GI_POTION_RED_BOTTLE, 300.0f, 300.0f);
}
}
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 02f34c1bb..0dd9da893 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
@@ -406,7 +406,7 @@ void func_80AD3FF4(EnTrt2* this, PlayState* play) {
} else if (gSaveContext.save.weekEventReg[12] & 0x10) {
Actor_PickUp(&this->actor, play, GI_POTION_RED, 300.0f, 300.0f);
} else {
- Actor_PickUp(&this->actor, play, GI_BOTTLE_POTION_RED, 300.0f, 300.0f);
+ Actor_PickUp(&this->actor, play, GI_POTION_RED_BOTTLE, 300.0f, 300.0f);
}
}
diff --git a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
index 5800f897f..ddf924872 100644
--- a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
+++ b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
@@ -299,7 +299,7 @@ void func_80AE0460(EnTsn* this, PlayState* play) {
ENTSN_SET_Z(&this->unk_1D8->actor, false);
this->actionFunc = func_80AE0418;
} else {
- Actor_PickUp(&this->actor, play, GI_SEAHORSE, 2000.0f, 1000.0f);
+ Actor_PickUp(&this->actor, play, GI_SEAHORSE_CAUGHT, 2000.0f, 1000.0f);
}
}
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 b1a989045..3969f9c6e 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
@@ -125,8 +125,8 @@ u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4,
if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
D_801BDBB8 = 0;
- if (D_801BDBB0 != weatherMode) {
- D_801BDBB0 = weatherMode;
+ if (gWeatherMode != weatherMode) {
+ gWeatherMode = weatherMode;
play->envCtx.unk_21 = 1;
play->envCtx.unk_1F = new1F;
play->envCtx.unk_20 = new20;
@@ -153,7 +153,7 @@ u8 func_80966758(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4,
if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
D_801BDBB8 = 0;
- D_801BDBB0 = 0;
+ gWeatherMode = 0;
play->envCtx.unk_21 = 1;
play->envCtx.unk_1F = new1F;
play->envCtx.unk_20 = new20;
@@ -230,7 +230,7 @@ void EnWeatherTag_Die(EnWeatherTag* this, PlayState* play) {
// poisoned swamp: placed behind the water fall from ikana
// this tag stops spawning after STT cleared?
void func_80966B08(EnWeatherTag* this, PlayState* play) {
- if (func_80966608(this, play, 0, 0, play->envCtx.unk_1F, 5, 100, 2) || D_801BDBB0 == 2) {
+ if (func_80966608(this, play, 0, 0, play->envCtx.unk_1F, 5, 100, 2) || (gWeatherMode == 2)) {
play->skyboxId = 3;
EnWeatherTag_SetupAction(this, func_80966D20);
} else if (D_801F4E74 <= 0.01f) {
@@ -298,7 +298,7 @@ void func_80966D20(EnWeatherTag* this, PlayState* play) {
EnWeatherTag_SetupAction(this, func_80966B08);
}
- if (D_801BDBB0 != 2) {
+ if (gWeatherMode != 2) {
EnWeatherTag_SetupAction(this, func_80966B08);
}
}
@@ -452,7 +452,7 @@ void func_809674C8(EnWeatherTag* this, PlayState* play) {
if ((gSaveContext.save.time >= CLOCK_TIME(7, 0)) && (gSaveContext.save.time < CLOCK_TIME(17, 30)) &&
(play->envCtx.unk_F2[2] == 0)) {
- D_801BDBB0 = 1;
+ gWeatherMode = 1;
func_800FD78C(play);
play->envCtx.unk_F2[4] = 0x20;
EnWeatherTag_SetupAction(this, func_80967608);
@@ -471,7 +471,7 @@ 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)) {
- D_801BDBB0 = 0;
+ gWeatherMode = 0;
EnWeatherTag_SetupAction(this, func_809674C8);
}
}
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 3f1b80c0e..fe18c8e1b 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
@@ -10,7 +10,7 @@ typedef void (*EnWeatherTagActionFunc)(struct EnWeatherTag*, PlayState*);
typedef struct EnWeatherTag {
/* 0x000 */ Actor actor;
/* 0x144 */ EnWeatherTagActionFunc actionFunc;
- /* 0x148 */ u8 pad148[0x4]; // todo attempt remove
+ /* 0x148 */ UNK_TYPE1 pad148[0x4];
/* 0x14C */ u8 pathCount;
/* 0x150 */ Vec3s* pathPoints;
// 154: the code avoids what would be a negative value if signed, but signed wont match
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 bf9fc46b5..d694d186c 100644
--- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c
+++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
@@ -352,7 +352,7 @@ void EnYb_Idle(EnYb* this, PlayState* play) {
EnYb_UpdateAnimation(this, play);
if (this->actor.xzDistToPlayer < 180.0f && fabsf(this->actor.playerHeightRel) < 50.0f &&
- play->msgCtx.ocarinaMode == 3 && play->msgCtx.unk1202E == 7 &&
+ play->msgCtx.ocarinaMode == 3 && play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING &&
gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
this->actionFunc = EnYb_TeachingDance;
this->teachingCutsceneTimer = 200;
diff --git a/src/overlays/actors/ovl_En_Zog/z_en_zog.c b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
index 0c01c96b3..508734a9b 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
@@ -629,7 +629,8 @@ void func_80B9451C(EnZog* this, PlayState* play) {
this->unk_300 = 2;
this->actionFunc = func_80B94470;
} else if ((play->msgCtx.ocarinaMode == 3) && (this->actor.xzDistToPlayer < 120.0f)) {
- if ((play->msgCtx.unk1202E == 7) && (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
+ (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
func_80B93BA8(this, 2);
this->actionFunc = func_80B943C0;
this->actor.shape.shadowDraw = NULL;
@@ -717,7 +718,8 @@ void func_80B948A8(EnZog* this, PlayState* play) {
this->unk_300 = 2;
this->actionFunc = func_80B946FC;
} else if ((play->msgCtx.ocarinaMode == 3) && (this->actor.xzDistToPlayer < 120.0f)) {
- if ((play->msgCtx.unk1202E == 7) && (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
+ if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
+ (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
func_80B93BA8(this, 2);
this->actionFunc = func_80B943C0;
this->actor.shape.shadowDraw = NULL;
diff --git a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
index 8842d3e31..ac8592615 100644
--- a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
+++ b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
@@ -101,13 +101,13 @@ void ItemBHeart_Draw(Actor* thisx, PlayState* play) {
if (flag || thisx->world.rot.y != 0) {
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++, object_gi_hearts_DL_001290);
- gSPDisplayList(POLY_XLU_DISP++, object_gi_hearts_DL_001470);
+ gSPDisplayList(POLY_XLU_DISP++, gGiHeartBorderDL);
+ gSPDisplayList(POLY_XLU_DISP++, gGiHeartContainerDL);
} else {
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++, object_gi_hearts_DL_001290);
- gSPDisplayList(POLY_OPA_DISP++, object_gi_hearts_DL_001470);
+ gSPDisplayList(POLY_OPA_DISP++, gGiHeartBorderDL);
+ gSPDisplayList(POLY_OPA_DISP++, gGiHeartContainerDL);
}
CLOSE_DISPS(play->state.gfxCtx);
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 87a385dd5..d2fa8e3a0 100644
--- a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
+++ b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
@@ -37,14 +37,14 @@ static s16 sObjectIds[] = {
OBJECT_GI_BOTTLE, OBJECT_GI_KEY, OBJECT_GI_M_ARROW, OBJECT_GI_RUPY, OBJECT_GI_RUPY,
OBJECT_GI_RUPY, OBJECT_GI_RUPY, OBJECT_GI_HEARTS, OBJECT_GI_KEY,
};
-static s16 sDrawItemIndices[] = {
- GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_01,
- GID_47, GID_4F, GID_50, GID_51, GID_53, GID_13, GID_01,
+static s16 sGetItemDrawIds[] = {
+ GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_BOTTLE, GID_KEY_SMALL,
+ GID_ARROW_FIRE, GID_RUPEE_GREEN, GID_RUPEE_BLUE, GID_RUPEE_RED, GID_RUPEE_PURPLE, GID_HEART_PIECE, GID_KEY_SMALL,
};
static s16 sGetItemIds[] = {
- GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_KEY_SMALL,
- GI_25, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE,
+ GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_BOTTLE, GI_KEY_SMALL,
+ GI_ARROW_FIRE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE,
};
void ItemEtcetera_SetupAction(ItemEtcetera* this, ItemEtceteraActionFunc actionFunc) {
@@ -62,8 +62,8 @@ void ItemEtcetera_Init(Actor* thisx, PlayState* play) {
} else {
this->objIndex = objBankIndex;
}
- this->giDrawId = sDrawItemIndices[type];
- this->itemID = sGetItemIds[type];
+ this->getItemDrawId = sGetItemDrawIds[type];
+ this->getItemId = sGetItemIds[type];
this->futureActionFunc = func_8092009C;
this->drawFunc = ItemEtcetera_Draw;
Actor_SetScale(&this->actor, 0.25f);
@@ -104,7 +104,7 @@ void func_8092009C(ItemEtcetera* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
Actor_MarkForDeath(&this->actor);
} else {
- Actor_PickUp(&this->actor, play, this->itemID, 30.0f, 50.0f);
+ Actor_PickUp(&this->actor, play, this->getItemId, 30.0f, 50.0f);
}
}
@@ -126,7 +126,7 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, PlayState* play) {
if (play->actorCtx.unk4 == 100) {
func_800B8050(&this->actor, play, 0);
func_800B8118(&this->actor, play, 0);
- GetItem_Draw(play, this->giDrawId);
+ GetItem_Draw(play, this->getItemDrawId);
}
}
@@ -135,5 +135,5 @@ void ItemEtcetera_Draw(Actor* thisx, PlayState* play) {
func_800B8050(&this->actor, play, 0);
func_800B8118(&this->actor, play, 0);
- GetItem_Draw(play, this->giDrawId);
+ GetItem_Draw(play, this->getItemDrawId);
}
diff --git a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.h b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.h
index aac8d0834..e33f1e1fb 100644
--- a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.h
+++ b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.h
@@ -30,8 +30,8 @@ typedef enum {
typedef struct ItemEtcetera {
/* 0x000 */ Actor actor;
/* 0x144 */ ItemEtceteraActionFunc futureActionFunc;
- /* 0x148 */ s16 giDrawId;
- /* 0x14A */ s16 itemID;
+ /* 0x148 */ s16 getItemDrawId;
+ /* 0x14A */ s16 getItemId;
/* 0x14C */ u8 objIndex;
/* 0x150 */ ActorFunc drawFunc;
/* 0x154 */ ItemEtceteraActionFunc actionFunc;
diff --git a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
index 87433b988..73c5e32c6 100644
--- a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
+++ b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
@@ -146,7 +146,7 @@ void func_80A1B3D0(void) {
sp74[7] = (spAC - temp_f20) * temp_f22 * temp_f24 * temp_f0 * 0.0013f;
for (i = 0; i < ARRAY_COUNT(D_80A1D838); i++) {
- ptr = (f32*)&D_80A1D838[i].mf[0];
+ ptr = &D_80A1D838[i].xx;
tempf1 = sp74[(i + 0) & 7];
tempf2 = sp74[(i + 1) & 7];
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 40fd2682b..fcbdfbad4 100644
--- a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
+++ b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
@@ -134,7 +134,7 @@ void ObjKibako2_SpawnSkulltula(ObjKibako2* this, PlayState* play) {
}
void ObjKibako2_SpawnContents(ObjKibako2* this, PlayState* play) {
- if (KIBAKO2_CONTENTS(&this->dyna.actor) == CONTENTS_COLLECTIBLE) {
+ if (KIBAKO2_CONTENTS(&this->dyna.actor) == OBJKIBAKO2_CONTENTS_COLLECTIBLE) {
ObjKibako2_SpawnCollectible(this, play);
} else {
ObjKibako2_SpawnSkulltula(this, play);
@@ -157,14 +157,14 @@ void ObjKibako2_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.shape.rot.z = 0;
this->dyna.actor.world.rot.x = 0;
this->dyna.actor.shape.rot.x = 0;
- if (contents == CONTENTS_COLLECTIBLE) {
+ if (contents == OBJKIBAKO2_CONTENTS_COLLECTIBLE) {
if (Item_CanDropBigFairy(play, KIBAKO2_COLLECTIBLE_ID(&this->dyna.actor),
KIBAKO2_COLLECTIBLE_FLAG(&this->dyna.actor))) {
this->unk_1AC = 1;
this->dyna.actor.flags |= ACTOR_FLAG_10;
}
}
- if ((contents != CONTENTS_SKULLTULA) || !ObjKibako2_ContainsSkulltula(this, play)) {
+ if ((contents != OBJKIBAKO2_CONTENTS_SKULLTULA) || !ObjKibako2_ContainsSkulltula(this, play)) {
this->skulltulaNoiseTimer = -1;
}
this->actionFunc = ObjKibako2_Idle;
diff --git a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h
index 5f319558e..f1816ab4d 100644
--- a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h
+++ b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h
@@ -9,8 +9,8 @@
#define KIBAKO2_CONTENTS(thisx) (((thisx)->params >> 0xF) & 1)
typedef enum {
- /* 0 */ CONTENTS_COLLECTIBLE,
- /* 1 */ CONTENTS_SKULLTULA
+ /* 0 */ OBJKIBAKO2_CONTENTS_COLLECTIBLE,
+ /* 1 */ OBJKIBAKO2_CONTENTS_SKULLTULA
} ObjKibako2Contents;
struct ObjKibako2;
diff --git a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
index 47366a842..31ba1fa63 100644
--- a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
+++ b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
@@ -148,11 +148,11 @@ void ObjMoonStone_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
func_8012C28C(play->state.gfxCtx);
func_8012C2DC(play->state.gfxCtx);
- AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_gi_reserve00_Matanimheader_001C60));
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiMoonsTearTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, object_gi_reserve00_DL_000D78);
+ gSPDisplayList(POLY_OPA_DISP++, gGiMoonsTearItemDL);
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_gi_reserve00_DL_000C80);
+ gSPDisplayList(POLY_XLU_DISP++, gGiMoonsTearGlowDL);
CLOSE_DISPS(play->state.gfxCtx);
}
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 85f1b89ce..a5b640133 100644
--- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
+++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
@@ -6,7 +6,6 @@
#include "z_obj_nozoki.h"
#include "objects/object_secom_obj/object_secom_obj.h"
-#include "prevent_bss_reordering.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -465,7 +464,7 @@ void ObjNozoki_Draw(Actor* thisx, PlayState* play) {
ObjNozoki* this = THIS;
if (this->unk_15C == 1) {
- GetItem_Draw(play, GID_39);
+ GetItem_Draw(play, GID_MASK_SUN);
} else {
Gfx_DrawDListOpa(play, D_80BA34FC[this->unk_15C]);
}
diff --git a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
index 489373acb..b7a098b46 100644
--- a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
+++ b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
@@ -217,7 +217,7 @@ void func_80AC9B48(ObjOcarinalift* this) {
void func_80AC9B5C(ObjOcarinalift* this, PlayState* play) {
if (func_800B886C(&this->dyna.actor, play)) {
if (play->msgCtx.ocarinaMode == 4) {
- if (play->msgCtx.unk1202E == 0) {
+ if (play->msgCtx.lastPlayedSong == 0) {
if (OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAMSC_1) {
Flags_SetSwitch(play, OBJOCARINALIFT_GET_SWITCH_FLAG(&this->dyna.actor));
}
diff --git a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
index 616fb341c..23ca0872d 100644
--- a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
+++ b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
@@ -110,30 +110,29 @@ void ObjRaillift_DoNothing(ObjRaillift* this, PlayState* play) {
}
void ObjRaillift_Move(ObjRaillift* this, PlayState* play) {
- s32 isTeleporting;
+ Actor* thisx = &this->dyna.actor;
Vec3f nextPoint;
f32 speed;
f32 target;
f32 step;
+ s32 isTeleporting;
s32 isPosUpdated;
- Vec3s* initialPoint;
Vec3s* endPoint;
- s32 pad;
- if (OBJRAILLIFT_HAS_FLAG(&this->dyna.actor)) {
- if (!Flags_GetSwitch(play, OBJRAILLIFT_GET_FLAG(&this->dyna.actor))) {
+ if (OBJRAILLIFT_HAS_FLAG(thisx)) {
+ if (!Flags_GetSwitch(play, OBJRAILLIFT_GET_FLAG(thisx))) {
this->actionFunc = ObjRaillift_Idle;
return;
}
- if (OBJRAILLIFT_GET_TYPE(&this->dyna.actor) == DEKU_FLOWER_PLATFORM) {
- func_800B9010(&this->dyna.actor, NA_SE_EV_PLATE_LIFT_LEVEL - SFX_FLAG);
+ if (OBJRAILLIFT_GET_TYPE(thisx) == DEKU_FLOWER_PLATFORM) {
+ func_800B9010(thisx, NA_SE_EV_PLATE_LIFT_LEVEL - SFX_FLAG);
}
}
- Math_Vec3s_ToVec3f(&nextPoint, &(&this->points[this->curPoint])[this->direction]);
- Math_Vec3f_Diff(&nextPoint, &this->dyna.actor.world.pos, &this->dyna.actor.velocity);
- speed = Math3D_Vec3fMagnitude(&this->dyna.actor.velocity);
+ Math_Vec3s_ToVec3f(&nextPoint, this->points + this->curPoint + this->direction);
+ Math_Vec3f_Diff(&nextPoint, &thisx->world.pos, &thisx->velocity);
+ speed = Math3D_Vec3fMagnitude(&thisx->velocity);
if ((speed < (this->speed * 8.0f)) && (this->speed > 2.0f)) {
target = ((this->speed - 2.0f) * 0.1f) + 2.0f;
step = this->speed * 0.03f;
@@ -142,17 +141,16 @@ void ObjRaillift_Move(ObjRaillift* this, PlayState* play) {
step = this->speed * 0.16f;
}
- Math_StepToF(&this->dyna.actor.speedXZ, target, step);
- if ((this->dyna.actor.speedXZ + 0.05f) < speed) {
- Math_Vec3f_Scale(&this->dyna.actor.velocity, this->dyna.actor.speedXZ / speed);
- this->dyna.actor.world.pos.x += this->dyna.actor.velocity.x;
- this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
- this->dyna.actor.world.pos.z += this->dyna.actor.velocity.z;
+ Math_StepToF(&thisx->speedXZ, target, step);
+ if ((thisx->speedXZ + 0.05f) < speed) {
+ Math_Vec3f_Scale(&thisx->velocity, thisx->speedXZ / speed);
+ thisx->world.pos.x += thisx->velocity.x;
+ thisx->world.pos.y += thisx->velocity.y;
+ thisx->world.pos.z += thisx->velocity.z;
} else {
this->curPoint += this->direction;
- if (1) {}
- this->dyna.actor.speedXZ *= 0.4f;
- isTeleporting = OBJRAILLIFT_SHOULD_TELEPORT(&this->dyna.actor);
+ thisx->speedXZ *= 0.4f;
+ isTeleporting = OBJRAILLIFT_SHOULD_TELEPORT(thisx);
isPosUpdated = true;
if (((this->curPoint >= this->endPoint) && (this->direction > 0)) ||
((this->curPoint <= 0) && (this->direction < 0))) {
@@ -163,9 +161,8 @@ void ObjRaillift_Move(ObjRaillift* this, PlayState* play) {
} else {
endPoint = &this->points[this->endPoint];
this->curPoint = this->direction > 0 ? 0 : this->endPoint;
- initialPoint = &this->points[0];
- if ((initialPoint->x != endPoint->x) || (initialPoint->y != endPoint->y) ||
- (initialPoint->z != endPoint->z)) {
+ if ((this->points[0].x != endPoint->x) || (this->points[0].y != endPoint->y) ||
+ (this->points[0].z != endPoint->z)) {
this->actionFunc = ObjRaillift_Teleport;
func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
isPosUpdated = false;
@@ -222,7 +219,7 @@ void ObjRaillift_Update(Actor* thisx, PlayState* play) {
f32 step;
this->actionFunc(this, play);
- Actor_SetFocus(&this->dyna.actor, 10.0f);
+ Actor_SetFocus(thisx, 10.0f);
if (this->cutsceneTimer > 0) {
this->cutsceneTimer--;
if (this->cutsceneTimer == 0) {
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 779ea2a5e..32a0a0d54 100644
--- a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
+++ b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
@@ -508,7 +508,7 @@ void func_809289E4(ObjTsubo* this, PlayState* play) {
s32 absYawDiff = ABS_ALT(yawDiff);
if (absYawDiff > (0x10000 / 3)) {
- Actor_PickUp(&this->actor, play, 0, 36.0f, 30.0f);
+ Actor_PickUp(&this->actor, play, GI_NONE, 36.0f, 30.0f);
}
}
}
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 5175a8ee1..658cae652 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
@@ -1,39 +1,66 @@
/*
* File: z_obj_um.c
* Overlay: ovl_Obj_Um
- * Description: Cremia's cart and milk run quest
+ * Description: Cremia's Cart and milk run minigame
*/
#include "z_obj_um.h"
+#include "overlays/actors/ovl_En_In/z_en_in.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
#define THIS ((ObjUm*)thisx)
+/**
+ * weekEventReg flags checked by this actor:
+ * - gSaveContext.save.weekEventReg[22] & 1: Aliens defeated
+ * If false: The actor doesn't spawn
+ * - gSaveContext.save.weekEventReg[31] & 0x40
+ * If true: Cremia doesn't explain again she'll deliever milk to town
+ * - gSaveContext.save.weekEventReg[31] & 0x80
+ * If true: Triggers cutscene on Romani's Ranch
+ * - gSaveContext.save.weekEventReg[34] & 0x80
+ * If true: Doesn't spawn on Romani's Ranch
+ * - gSaveContext.save.weekEventReg[52] & 1
+ * If true: Doesn't spawn on Romani's Ranch or Milk Road
+ * - gSaveContext.save.weekEventReg[52] & 2
+ * If true: Doesn't spawn on Romani's Ranch or Milk Road
+ * - gSaveContext.save.weekEventReg[59] & 2
+ * If true: Doesn't spawn again on Milk Road
+ *
+ * weekEventReg flags set by this actor:
+ * - gSaveContext.save.weekEventReg[31] |= 0x40: Cremia offered a ride
+ * Cremia offered a ride accross the Milk Road to Player
+ * - gSaveContext.save.weekEventReg[31] |= 0x80: Player is in Milk Run
+ * Player accepts the ride and is with Cremia during the Milk Run.
+ * - gSaveContext.save.weekEventReg[34] |= 0x80: Cremia does Milk Run alone
+ * Player didn't interact or didn't accept the ride
+ * - gSaveContext.save.weekEventReg[52] |= 1: Won Milk Run minigame
+ * At least one pot is safe. Turns off the "Lose Milk Run minigame"
+ * - gSaveContext.save.weekEventReg[52] |= 2: Lose Milk Run minigame
+ * Every pot was broken by bandits. Turns off the "Win Milk Run minigame"
+ * - gSaveContext.save.weekEventReg[59] |= 2: ?
+ * Passed through Milk Road after winning the Milk Run
+ *
+ * weekEventReg flags unset by this actor:
+ * - gSaveContext.save.weekEventReg[31] &= (u8)~0x80
+ * Turned off when the Milk Run finishes
+ * - gSaveContext.save.weekEventReg[52] &= (u8)~1
+ * Turned off if Player lose the Milk Run
+ * - gSaveContext.save.weekEventReg[52] &= (u8)~2
+ * Turned off if Player wins the Milk Run
+ */
+
void ObjUm_Init(Actor* thisx, PlayState* play);
void ObjUm_Destroy(Actor* thisx, PlayState* play);
void ObjUm_Update(Actor* thisx, PlayState* play);
void ObjUm_Draw(Actor* thisx, PlayState* play);
-void func_80B79A50(ObjUm* this, PlayState* play);
-void func_80B79F10(ObjUm* this, PlayState* play);
-void func_80B7A070(ObjUm* this, PlayState* play);
-void func_80B7A0E0(ObjUm* this, PlayState* play);
-void func_80B7A144(ObjUm* this, PlayState* play);
-void func_80B7A2AC(ObjUm* this, PlayState* play);
-void func_80B7A394(ObjUm* this, PlayState* play);
-void func_80B7A400(ObjUm* this, PlayState* play);
-void func_80B7A494(ObjUm* this, PlayState* play);
-void func_80B7A614(ObjUm* this, PlayState* play);
-void func_80B7A7AC(ObjUm* this, PlayState* play);
-void func_80B7ABE4(ObjUm* this, PlayState* play);
-void func_80B7AC94(ObjUm* this, PlayState* play);
-void func_80B7AD34(ObjUm* this, PlayState* play);
-void func_80B7AE58(ObjUm* this, PlayState* play);
-
+void ObjUm_DefaultAnim(ObjUm* this, PlayState* play);
+void ObjUm_UpdateAnim(ObjUm* this, PlayState* play, ObjUmAnimimations index);
void ObjUm_SetupAction(ObjUm* this, ObjUmActionFunc actionFunc);
-#if 0
const ActorInit Obj_Um_InitVars = {
ACTOR_OBJ_UM,
ACTORCAT_NPC,
@@ -46,131 +73,1949 @@ const ActorInit Obj_Um_InitVars = {
(ActorFunc)ObjUm_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80B7C138 = {
- { COLTYPE_HIT3, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0x00000020, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
+static TexturePtr sEyeTextures[] = {
+ gUmCremiaEyeOpenTex, gUmCremiaEyeHalfTex, gUmCremiaEyeClosedTex,
+ gUmCremiaEyeHappyTex, gUmCremiaEyeAngryTex, gUmCremiaEyeSadTex,
+};
+
+static TexturePtr sMouthTextures[] = {
+ gUmMouthNormalTex,
+ gUmMouthHappyTex,
+ gUmMouthHangingOpenTex,
+ gUmMouthFrownTex,
+};
+
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_HIT3,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_NONE,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK1,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00000020, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_NONE,
+ },
{ 40, 64, 0, { 0, 0, 0 } },
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80B7C254[] = {
+// actionfuncs
+void func_80B7A144(ObjUm* this, PlayState* play);
+void ObjUm_RanchWait(ObjUm* this, PlayState* play);
+void ObjUm_PreMilkRunStartCs(ObjUm* this, PlayState* play);
+void ObjUm_StartCs(ObjUm* this, PlayState* play);
+void ObjUm_PostMilkRunStartCs(ObjUm* this, PlayState* play);
+void ObjUm_TerminaFieldIdle(ObjUm* this, PlayState* play);
+void ObjUm_RanchWaitPathFinished(ObjUm* this, PlayState* play);
+void func_80B7A0E0(ObjUm* this, PlayState* play);
+void func_80B7A070(ObjUm* this, PlayState* play);
+void ObjUm_RanchStartCs(ObjUm* this, PlayState* play);
+void func_80B7A2AC(ObjUm* this, PlayState* play);
+void func_80B7A240(ObjUm* this, PlayState* play);
+void func_80B7A394(ObjUm* this, PlayState* play);
+void ObjUm_RunMinigame(ObjUm* this, PlayState* play);
+void func_80B7A614(ObjUm* this, PlayState* play);
+void func_80B7AB78(ObjUm* this, PlayState* play);
+void func_80B7ABE4(ObjUm* this, PlayState* play);
+void ObjUm_PostMilkRunWaitPathFinished(ObjUm* this, PlayState* play);
+
+// Maybe it is updating the bandits positions?
+void func_80B77770(ObjUm* this, PlayState* play) {
+ s16 rotY = this->dyna.actor.shape.rot.y;
+ Vec3f sp108;
+ Vec3f spFC;
+ Vec3f spF0;
+ Vec3f spE4;
+ Vec3f spD8;
+ Vec3f spCC;
+ Vec3f spC0;
+ Vec3f spB4;
+ Vec3f spA8;
+ Vec3f sp9C;
+ Vec3f sp90;
+ Vec3f sp84;
+ Vec3f sp78;
+ Vec3f sp6C;
+ Vec3f sp60 = this->dyna.actor.world.pos;
+
+ // Loop unroll?
+ this->unk_360[15] = sp60;
+ sp6C = sp60;
+ this->unk_360[14] = sp6C;
+ sp78 = sp6C;
+ this->unk_360[13] = sp78;
+ sp84 = sp78;
+ this->unk_360[12] = sp84;
+ sp90 = sp84;
+ this->unk_360[11] = sp90;
+ sp9C = sp90;
+ this->unk_360[10] = sp9C;
+ spA8 = sp9C;
+ this->unk_360[9] = spA8;
+ spB4 = spA8;
+ this->unk_360[8] = spB4;
+ spC0 = spB4;
+ this->unk_360[7] = spC0;
+ spCC = spC0;
+ this->unk_360[6] = spCC;
+ spD8 = spCC;
+ this->unk_360[5] = spD8;
+ spE4 = spD8;
+ this->unk_360[4] = spE4;
+ spF0 = spE4;
+ this->unk_360[3] = spF0;
+ spFC = spF0;
+ this->unk_360[2] = spFC;
+ sp108 = spFC;
+ this->unk_360[1] = sp108;
+ this->unk_360[0] = sp108;
+
+ this->unk_360[0].x += 110.0f * Math_SinS(rotY + 0x4000);
+ this->unk_360[0].z += 110.0f * Math_CosS(rotY + 0x4000);
+ this->unk_360[1].x += 110.0f * Math_SinS(rotY - 0x4000);
+ this->unk_360[1].z += 110.0f * Math_CosS(rotY - 0x4000);
+ Math_Vec3f_Copy(&this->unk_360[2], &this->unk_360[0]);
+ this->unk_360[2].x -= 200.0f * Math_SinS(rotY);
+ this->unk_360[2].z -= 200.0f * Math_CosS(rotY);
+ Math_Vec3f_Copy(&this->unk_360[4], &this->unk_360[1]);
+ this->unk_360[4].x -= 200.0f * Math_SinS(rotY);
+ this->unk_360[4].z -= 200.0f * Math_CosS(rotY);
+ this->unk_360[3].x -= 220.0f * Math_SinS(rotY);
+ this->unk_360[3].z -= 220.0f * Math_CosS(rotY);
+ Math_Vec3f_Copy(&this->unk_360[5], &this->unk_360[0]);
+ this->unk_360[5].x -= 500.0f * Math_SinS(rotY);
+ this->unk_360[5].z -= 500.0f * Math_CosS(rotY);
+ Math_Vec3f_Copy(&this->unk_360[7], &this->unk_360[1]);
+ this->unk_360[7].x -= 500.0f * Math_SinS(rotY);
+ this->unk_360[7].z -= 500.0f * Math_CosS(rotY);
+ this->unk_360[6].x -= 500.0f * Math_SinS(rotY);
+ this->unk_360[6].z -= 500.0f * Math_CosS(rotY);
+ Math_Vec3f_Copy(&this->unk_360[8], &this->unk_360[0]);
+ this->unk_360[8].x -= 700.0f * Math_SinS(rotY);
+ this->unk_360[8].z -= 700.0f * Math_CosS(rotY);
+ Math_Vec3f_Copy(&this->unk_360[10], &this->unk_360[1]);
+ this->unk_360[10].x -= 700.0f * Math_SinS(rotY);
+ this->unk_360[10].z -= 700.0f * Math_CosS(rotY);
+ this->unk_360[9].x -= 700.0f * Math_SinS(rotY);
+ this->unk_360[9].z -= 700.0f * Math_CosS(rotY);
+ this->unk_360[11] = this->unk_360[3];
+ this->unk_360[11].x += 40.0f * Math_SinS(rotY + 0x4000);
+ this->unk_360[11].z += 40.0f * Math_CosS(rotY + 0x4000);
+ this->unk_360[12] = this->unk_360[3];
+ this->unk_360[12].x += 40.0f * Math_SinS(rotY - 0x4000);
+ this->unk_360[12].z += 40.0f * Math_CosS(rotY - 0x4000);
+ this->unk_360[13] = this->unk_360[2];
+ this->unk_360[14] = this->unk_360[4];
+}
+
+s32 ObjUm_InitBandits(ObjUm* this, PlayState* play) {
+ Path* path = &play->setupPathList[this->pathIndex];
+ s16 pad;
+ Vec3s* spawnPoints;
+ EnHorse* bandit1;
+ EnHorse* bandit2;
+
+ spawnPoints = Lib_SegmentedToVirtual(path->points);
+ Audio_QueueSeqCmd(0x8000 | NA_BGM_CHASE);
+
+ bandit1 = (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, spawnPoints[0].x, spawnPoints[0].y,
+ spawnPoints[0].z, 0, this->dyna.actor.shape.rot.y, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_BANDIT, ENHORSE_19));
+ this->bandit1 = bandit1;
+
+ bandit1->unk_540 = bandit1->actor.world.pos;
+
+ bandit1->unk_54C = 0xF;
+ bandit1->unk_550 = 10;
+
+ bandit1->unk_554 = this->pathIndex;
+ bandit1->unk_568 = 0.0f;
+ bandit1->unk_56C = 0.0f;
+ bandit1->unk_558 = 0;
+ bandit1->unk_55C = 40;
+ bandit1->unk_560 = 40;
+
+ bandit1->banditPosition = gZeroVec3f;
+ bandit1->unk_57C = gZeroVec3f;
+
+ bandit1->unk_588 = this->dyna.actor.shape.rot.y;
+ bandit1->curRaceWaypoint = 1;
+
+ bandit2 = (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, spawnPoints[1].x, spawnPoints[1].y,
+ spawnPoints[1].z, 0, this->dyna.actor.shape.rot.y, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_BANDIT, ENHORSE_20));
+ this->bandit2 = bandit2;
+
+ bandit2->unk_540 = bandit2->actor.world.pos;
+
+ bandit2->unk_54C = 0xF;
+ bandit2->unk_550 = 8;
+
+ bandit2->unk_554 = this->pathIndex;
+ bandit2->unk_568 = 0.0f;
+ bandit2->unk_56C = 0.0f;
+ bandit2->unk_55C = 40;
+ bandit2->unk_560 = 40;
+
+ bandit2->unk_57C = gZeroVec3f;
+
+ bandit2->unk_588 = this->dyna.actor.shape.rot.y;
+ bandit2->curRaceWaypoint = 2;
+
+ this->potsLife[0] = 4;
+ this->potsLife[1] = 4;
+ this->potsLife[2] = 4;
+
+ return 0;
+}
+
+typedef struct {
+ /* 0x00 */ s32 unk_00;
+ /* 0x04 */ s32 unk_04;
+ /* 0x08 */ s32 unk_08;
+ /* 0x0C */ f32 unk_0C;
+ /* 0x10 */ s32 unk_10;
+} struct_80B7C254; // size = 0x14
+
+struct_80B7C254 D_80B7C164[] = {
+ { 2, 0, 0, 1.0f, 40 }, { 4, 1, 0, 1.0f, 40 }, { 3, 2, 0, 1.0f, 40 }, { 3, 4, 0, 1.0f, 40 },
+ { 5, 3, 1, -1.0f, 30 }, { 7, 3, 1, 1.0f, 30 }, { 0, 13, 1, -1.0f, 60 }, { 1, 14, 1, 1.0f, 60 },
+ { 13, 10, 0, 1.0f, 40 }, { 14, 8, 0, 1.0f, 40 }, { 8, 5, 0, 1.0f, 30 }, { 10, 7, 0, 1.0f, 30 },
+};
+
+// BanditAttack?
+s32 func_80B781DC(ObjUm* this, EnHorse* bandit1, EnHorse* bandit2, PlayState* play) {
+ s32 temp_v0;
+ s32 phi_s3 = -1;
+ s32 phi_s4 = 0;
+ s32 phi_s2 = 0;
+ f32 phi_f20 = 0.0f;
+ s32 i;
+ s32 mask;
+
+ for (i = 0; i < ARRAY_COUNT(D_80B7C164); i++) {
+ if (bandit1->unk_550 == D_80B7C164[i].unk_00) {
+ if (bandit2->unk_550 != D_80B7C164[i].unk_04) {
+ if (D_80B7C164[i].unk_00 != 3) {
+ if (D_80B7C164[i].unk_04 != 3 ||
+ ((mask = Player_GetMask(play)), PLAYER_MASK_CIRCUS_LEADER != mask)) {
+ phi_s3 = D_80B7C164[i].unk_04;
+ phi_s4 = D_80B7C164[i].unk_08;
+ phi_f20 = D_80B7C164[i].unk_0C;
+ phi_s2 = D_80B7C164[i].unk_10;
+ }
+ } else if (((bandit1->unk_54C != 5) || (D_80B7C164[i].unk_04 != 2)) &&
+ ((bandit1->unk_54C != 7) || (D_80B7C164[i].unk_04 != 4))) {
+ phi_s3 = D_80B7C164[i].unk_04;
+ phi_s4 = D_80B7C164[i].unk_08;
+ phi_f20 = D_80B7C164[i].unk_0C;
+ if ((2.0f * Rand_ZeroOne()) < 1.0f) {
+ phi_f20 *= -1.0f;
+ }
+ phi_s2 = D_80B7C164[i].unk_10;
+ }
+ //! FAKE:
+ ;
+ }
+ }
+ }
+
+ if (phi_s3 == -1) {
+ return 0;
+ }
+
+ bandit1->unk_540 = bandit1->actor.world.pos;
+ bandit1->unk_54C = bandit1->unk_550;
+ bandit1->unk_550 = phi_s3;
+ bandit1->unk_55C = phi_s2;
+ bandit1->unk_560 = phi_s2;
+ bandit1->unk_564 = phi_s4;
+ bandit1->unk_568 = phi_f20;
+
+ if (phi_s3 == 3) {
+ f32 rand = Rand_ZeroOne();
+
+ bandit1->unk_558 = (s32)(rand * 3.0f);
+ } else {
+ bandit1->unk_558 = 0;
+ }
+
+ return 0;
+}
+
+// ObjUm_Bandit_UpdatePosition?
+s32 func_80B783E0(ObjUm* this, PlayState* play, s32 banditIndex, EnHorse* bandit) {
+ Path* sp6C = &play->setupPathList[this->pathIndex];
+ s32 sp68;
+ Vec3s* sp64;
+ f32 phi_f12;
+ s32 phi_v1_2;
+ Vec3f sp50;
+ f32 sp4C;
+ f32 sp48;
+ f32 sp44;
+ s32 temp_a1;
+ f32 sp3C;
+ f32 phi_f14;
+
+ sp68 = sp6C->count;
+ sp64 = Lib_SegmentedToVirtual(sp6C->points);
+
+ if (sp68 == 0) {
+ return 0;
+ }
+
+ if (Math3D_Distance(&bandit->actor.world.pos, &this->dyna.actor.world.pos) < 800.0f) {
+ if (banditIndex == 0) {
+ this->flags |= OBJ_UM_FLAG_0200;
+ } else {
+ this->flags |= OBJ_UM_FLAG_0400;
+ }
+ bandit->unk_540 = bandit->actor.world.pos;
+ bandit->unk_55C = 50;
+ bandit->unk_560 = 50;
+ bandit->unk_564 = 1;
+ }
+
+ Math_Vec3s_ToVec3f(&sp50, &sp64[bandit->curRaceWaypoint]);
+
+ if (bandit->curRaceWaypoint == 0) {
+ phi_f12 = sp64[1].x - sp64[0].x;
+ phi_f14 = sp64[1].z - sp64[0].z;
+ } else {
+ if ((bandit->curRaceWaypoint + 1) == sp6C->count) {
+ phi_f12 = sp64[sp6C->count - 1].x - sp64[sp6C->count - 2].x;
+ phi_f14 = sp64[sp6C->count - 1].z - sp64[sp6C->count - 2].z;
+ } else {
+ phi_f12 = sp64[bandit->curRaceWaypoint + 1].x - sp64[bandit->curRaceWaypoint - 1].x;
+ phi_f14 = sp64[bandit->curRaceWaypoint + 1].z - sp64[bandit->curRaceWaypoint - 1].z;
+ }
+ }
+
+ temp_a1 = Math_Atan2S(phi_f12, phi_f14);
+
+ func_8017B7F8(&sp50, temp_a1, &sp4C, &sp48, &sp44);
+ if (((bandit->actor.world.pos.x * sp4C) + (sp48 * bandit->actor.world.pos.z) + sp44) > 0.0f) {
+ bandit->curRaceWaypoint++;
+ if (bandit->curRaceWaypoint >= sp68) {
+ bandit->curRaceWaypoint = 0;
+ }
+ Math_Vec3s_ToVec3f(&sp50, &sp64[bandit->curRaceWaypoint]);
+ }
+
+ bandit->actor.world.rot.y = Math_Vec3f_Yaw(&bandit->actor.world.pos, &sp50);
+ bandit->actor.speedXZ = 45.0f;
+
+ sp3C = Math_CosS(bandit->actor.world.rot.x) * bandit->actor.speedXZ;
+ bandit->actor.velocity.x = Math_SinS(bandit->actor.world.rot.y) * sp3C;
+ bandit->actor.velocity.y = Math_SinS(bandit->actor.world.rot.x) * bandit->actor.speedXZ;
+ bandit->actor.velocity.z = Math_CosS(bandit->actor.world.rot.y) * sp3C;
+
+ bandit->banditPosition.x =
+ bandit->actor.world.pos.x + (bandit->actor.velocity.x * 0.5f) + bandit->actor.colChkInfo.displacement.x;
+ bandit->banditPosition.y =
+ bandit->actor.world.pos.y + (bandit->actor.velocity.y * 0.5f) + bandit->actor.colChkInfo.displacement.y;
+ bandit->banditPosition.z =
+ bandit->actor.world.pos.z + (bandit->actor.velocity.z * 0.5f) + bandit->actor.colChkInfo.displacement.z;
+
+ phi_v1_2 = BINANG_SUB(bandit->actor.world.rot.y, bandit->actor.shape.rot.y);
+
+ if (phi_v1_2 > 0x190) {
+ phi_v1_2 = 0x190;
+ } else if (phi_v1_2 < -0x190) {
+ phi_v1_2 = -0x190;
+ }
+
+ bandit->actor.shape.rot.y = bandit->actor.shape.rot.y + phi_v1_2;
+ return 0;
+}
+
+// ObjUm_Bandit_GetCloserAndAttack
+s32 func_80B78764(ObjUm* this, PlayState* play, EnHorse* bandit1, EnHorse* bandit2) {
+ s32 pad;
+ Vec3f sp30;
+ s16 phi_v1_5;
+
+ bandit1->unk_55C--;
+ if (bandit1->unk_55C <= 0) {
+ bandit1->unk_55C = 0;
+
+ if ((bandit1->unk_550 == 3) && !(this->flags & OBJ_UM_FLAG_MINIGAME_FINISHED)) {
+ s32 potIndex = -1;
+
+ if (this->potsLife[0] != 1) {
+ potIndex = 0;
+ }
+
+ if (this->potsLife[1] != 1) {
+ if ((potIndex == -1) || (potIndex == 0 && Rand_ZeroOne() < 0.3f)) {
+ potIndex = 1;
+ }
+ }
+
+ if (this->potsLife[2] != 1) {
+ if ((potIndex == -1) || (potIndex != -1 && Rand_ZeroOne() < 0.3f)) {
+ potIndex = 2;
+ }
+ }
+
+ if (this->potsLife[potIndex] != 1) {
+ this->wasPotHit[potIndex] = true;
+ if (this->potsLife[potIndex] == 2) {
+ Audio_PlaySfxAtPos(&this->potPos[potIndex], NA_SE_EV_MILK_POT_BROKEN);
+ } else {
+ Audio_PlaySfxAtPos(&this->potPos[potIndex], NA_SE_EV_MILK_POT_DAMAGE);
+ }
+
+ this->potsLife[potIndex]--;
+ if (this->potsLife[potIndex] < 1) {
+ this->potsLife[potIndex] = 1;
+ }
+ }
+ }
+
+ func_80B781DC(this, bandit1, bandit2, play);
+ }
+
+ Math3D_Lerp(&bandit1->unk_540, &this->unk_360[bandit1->unk_550], 1.0f - ((f32)bandit1->unk_55C / bandit1->unk_560),
+ &sp30);
+ bandit1->banditPosition = sp30;
+ bandit1->unk_588 = this->dyna.actor.shape.rot.y;
+
+ if ((bandit1->unk_550 == 10) || ((bandit1->unk_550 == 8))) {
+ phi_v1_5 = bandit1->unk_588;
+ } else if (Math3D_Distance(&bandit1->actor.prevPos, &bandit1->actor.world.pos) < 10.0f) {
+ phi_v1_5 = bandit1->unk_588;
+ } else {
+ phi_v1_5 = Math_Vec3f_Yaw(&bandit1->actor.prevPos, &bandit1->actor.world.pos);
+ }
+
+ if (1) {}
+
+ phi_v1_5 -= bandit1->actor.shape.rot.y;
+ if (phi_v1_5 > 0x190) {
+ bandit1->actor.shape.rot.y += 0x190;
+ } else if (phi_v1_5 < -0x190) {
+ bandit1->actor.shape.rot.y -= 0x190;
+ } else {
+ bandit1->actor.shape.rot.y += phi_v1_5;
+ }
+
+ return 0;
+}
+
+// ObjUm_UpdateBanditsDamage?
+s32 func_80B78A54(ObjUm* this, PlayState* play, s32 arg2, EnHorse* arg3, EnHorse* arg4) {
+ if (this->banditsCollisions[arg2].base.acFlags & AC_HIT) {
+ if (arg3->unk_550 == 3) {
+ s16 sp36 =
+ Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &arg3->actor.world.pos) - this->dyna.actor.shape.rot.y;
+
+ this->banditsCollisions[arg2].base.acFlags &= ~AC_HIT;
+ Audio_PlaySfxAtPos(&arg3->actor.projectedPos, NA_SE_EN_CUTBODY);
+ arg3->unk_54C = 0xF;
+
+ if (Math_SinS(sp36) > 0.0f) {
+ arg3->unk_550 = arg4->unk_550 != 10 ? 10 : 8;
+ arg3->unk_568 = -1.0f;
+ } else {
+ arg3->unk_550 = arg4->unk_550 != 8 ? 8 : 10;
+ arg3->unk_568 = 1.0f;
+ }
+
+ arg3->unk_540 = arg3->actor.world.pos;
+ arg3->unk_55C = 40;
+ arg3->unk_560 = 40;
+ arg3->unk_564 = 1;
+ if (arg3->rider != NULL) {
+ arg3->rider->actor.colorFilterTimer = 20;
+ Actor_SetColorFilter(&arg3->rider->actor, 0x4000, 0xFF, 0, 40);
+ }
+ } else {
+ if (arg3->rider != NULL) {
+ arg3->rider->actor.colorFilterTimer = 20;
+ Actor_SetColorFilter(&arg3->rider->actor, 0x4000, 0xFF, 0, 40);
+ }
+ Audio_PlaySfxAtPos(&arg3->actor.projectedPos, NA_SE_EN_CUTBODY);
+ }
+ }
+
+ return 0;
+}
+
+// ObjUm_UpdateBanditLogic?
+s32 func_80B78C18(ObjUm* this, PlayState* play) {
+ EnHorse* bandit1 = this->bandit1;
+ EnHorse* bandit2 = this->bandit2;
+
+ if (!(this->flags & OBJ_UM_FLAG_0200)) {
+ func_80B783E0(this, play, 0, bandit1);
+ } else {
+ func_80B78764(this, play, bandit1, bandit2);
+ }
+
+ if (!(this->flags & OBJ_UM_FLAG_0400)) {
+ func_80B783E0(this, play, 1, bandit2);
+ } else {
+ func_80B78764(this, play, bandit2, bandit1);
+ }
+
+ func_80B78A54(this, play, 0, bandit1, bandit2);
+ func_80B78A54(this, play, 1, bandit2, bandit1);
+ return 0;
+}
+
+s32 ObjUm_UpdateBanditsCollisions(ObjUm* this, PlayState* play) {
+ s32 pad[3];
+
+ this->banditsCollisions[0].dim.pos.x = this->bandit1->actor.world.pos.x;
+ this->banditsCollisions[0].dim.pos.y = this->bandit1->actor.world.pos.y + 70.0f;
+ this->banditsCollisions[0].dim.pos.z = this->bandit1->actor.world.pos.z;
+
+ this->banditsCollisions[1].dim.pos.x = this->bandit2->actor.world.pos.x;
+ this->banditsCollisions[1].dim.pos.y = this->bandit2->actor.world.pos.y + 70.0f;
+ this->banditsCollisions[1].dim.pos.z = this->bandit2->actor.world.pos.z;
+
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->banditsCollisions[0].base);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->banditsCollisions[1].base);
+ return 0;
+}
+
+// ObjUm_UpdateBandits?
+s32 func_80B78DF0(ObjUm* this, PlayState* play) {
+ func_80B78C18(this, play);
+ ObjUm_UpdateBanditsCollisions(this, play);
+ return 0;
+}
+
+void ObjUm_SetupAction(ObjUm* this, ObjUmActionFunc actionFunc) {
+ this->actionFunc = actionFunc;
+}
+
+void ObjUm_SetPlayerPosition(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ if (this->flags & OBJ_UM_FLAG_DRAWN_FLOOR) {
+ player->actor.world.pos = this->unk_308;
+ player->actor.prevPos = this->unk_308;
+ }
+}
+
+void ObjUm_RotatePlayer(ObjUm* this, PlayState* play, s16 angle) {
+ Player* player = GET_PLAYER(play);
+
+ player->actor.shape.rot.y = player->actor.world.rot.y = player->currentYaw = this->dyna.actor.shape.rot.y + angle;
+}
+
+void func_80B78EBC(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ player->actor.focus.rot.x = 0;
+ player->actor.focus.rot.z = 0;
+ player->actor.focus.rot.y = player->actor.shape.rot.y;
+
+ player->unk_AAC.x = 0;
+ player->unk_AAC.y = 0;
+ player->unk_AAC.z = 0;
+
+ player->unk_AB2.x = 0;
+ player->unk_AB2.y = 0;
+ player->unk_AB2.z = 0;
+
+ player->currentYaw = player->actor.focus.rot.y;
+}
+
+void ObjUm_RotatePlayerView(ObjUm* this, PlayState* play, s16 angle) {
+ Player* player = GET_PLAYER(play);
+
+ player->actor.focus.rot.y += angle;
+}
+
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 1200, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 300, ICHAIN_STOP),
};
-#endif
+void ObjUm_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ ObjUm* this = THIS;
+ s32 sp54 = true;
+ s32 i;
-extern ColliderCylinderInit D_80B7C138;
-extern InitChainEntry D_80B7C254[];
+ DynaPolyActor_Init(&this->dyna, 0);
+ this->unk_350 = 0;
-extern UNK_TYPE D_06011DF8;
-extern UNK_TYPE D_06012CC0;
+ this->unk_2C4 = this->dyna.actor.world.pos;
+ this->unk_2DC = this->dyna.actor.world.pos;
+ this->unk_308 = this->dyna.actor.world.pos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B77770.s")
+ for (i = 0; i < MILK_POTS_COUNT; i++) {
+ this->potsLife[i] = 5;
+ this->wasPotHit[i] = false;
+ this->potPos[i] = gZeroVec3f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B77FA4.s")
+ this->donkey = NULL;
+ this->unk_354 = 0;
+ this->unk_420 = 0;
+ this->cartBedPos = this->dyna.actor.world.pos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B781DC.s")
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 0;
+ this->flags = OBJ_UM_FLAG_NONE;
+ this->dyna.actor.gravity = -3.5f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B783E0.s")
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ ActorShape_Init(&this->dyna.actor.shape, 0.0f, NULL, 50.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gUmSkel, NULL, this->jointTable, this->morphTable, UM_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gUmTrotAnim);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78764.s")
+ this->wheelRot = 0;
+ ObjUm_DefaultAnim(this, play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78A54.s")
+ this->type = OBJ_UM_PARSE_TYPE(thisx);
+ this->initialPathIndex = OBJ_UM_PARSE_PATH_INDEX(thisx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78C18.s")
+ // if (!AliensDefeated)
+ if (!(gSaveContext.save.weekEventReg[22] & 1)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78D08.s")
+ if (this->type == OBJ_UM_TYPE_TERMINA_FIELD) {
+ ObjUm_SetupAction(this, ObjUm_TerminaFieldIdle);
+ } else if (this->type == OBJ_UM_TYPE_RANCH) {
+ this->pathIndex = this->initialPathIndex;
+ if (gSaveContext.save.weekEventReg[31] & 0x80) {
+ // In cutscene
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78DF0.s")
+ sp54 = false;
+ this->flags |= OBJ_UM_FLAG_0100;
+ ObjUm_SetupAction(this, func_80B7A144);
+ func_800FE484();
+ } else {
+ // Waiting for player
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/ObjUm_SetupAction.s")
+ if ((gSaveContext.save.weekEventReg[34] & 0x80) || gSaveContext.save.time >= CLOCK_TIME(19, 0) ||
+ gSaveContext.save.time <= CLOCK_TIME(6, 0) || (gSaveContext.save.weekEventReg[52] & 1) ||
+ (gSaveContext.save.weekEventReg[52] & 2)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78E38.s")
+ this->dyna.actor.targetMode = 6;
+ this->unk_2B4 = 0;
+ ObjUm_SetupAction(this, ObjUm_RanchWait);
+ }
+ } else if (this->type == OBJ_UM_TYPE_PRE_MILK_RUN) {
+ if (!(gSaveContext.save.weekEventReg[31] & 0x80) || (gSaveContext.save.weekEventReg[52] & 1)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78E88.s")
+ if (!(gSaveContext.save.weekEventReg[52] & 2)) {
+ this->pathIndex = this->initialPathIndex;
+ sp54 = false;
+ func_800FE484();
+ ObjUm_SetupAction(this, ObjUm_PreMilkRunStartCs);
+ this->unk_354 = 0;
+ ObjUm_RotatePlayer(this, play, 0);
+ }
+ } else if (this->type == OBJ_UM_TYPE_MILK_RUN_MINIGAME) {
+ if (!(gSaveContext.save.weekEventReg[31] & 0x80)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78EBC.s")
+ this->pathIndex = this->initialPathIndex;
+ sp54 = false;
+ func_800FE484();
+ ObjUm_SetupAction(this, ObjUm_StartCs);
+ this->unk_354 = 0;
+ ObjUm_RotatePlayer(this, play, 0);
+ } else if (this->type == OBJ_UM_TYPE_POST_MILK_RUN) {
+ if (!(gSaveContext.save.weekEventReg[52] & 1) || (gSaveContext.save.weekEventReg[59] & 2)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B78EFC.s")
+ this->pathIndex = this->initialPathIndex;
+ sp54 = false;
+ func_800FE484();
+ ObjUm_SetupAction(this, ObjUm_PostMilkRunStartCs);
+ this->unk_354 = 0;
+ ObjUm_RotatePlayer(this, play, 0);
+ func_801A3098(NA_BGM_CLEAR_EVENT);
+ } else {
+ this->type = OBJ_UM_TYPE_TERMINA_FIELD;
+ ObjUm_SetupAction(this, ObjUm_TerminaFieldIdle);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/ObjUm_Init.s")
+ this->unk_2F8 = this->unk_2FE = gZeroVec3s;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/ObjUm_Destroy.s")
+ if (sp54) {
+ DynaPolyActor_Init(&this->dyna, 0);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &object_um_Colheader_007E20);
+ } else {
+ DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &object_um_Colheader_007F50);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79524.s")
+ if (this->dyna.bgId == BGCHECK_SCENE) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79560.s")
+ func_800C636C(play, &play->colCtx.dyna, this->dyna.bgId);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B795A0.s")
+ this->donkey =
+ (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, this->dyna.actor.world.pos.x,
+ this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z, 0,
+ this->dyna.actor.shape.rot.y, 0, ENHORSE_PARAMS(ENHORSE_PARAM_DONKEY, ENHORSE_18));
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79734.s")
+ if (this->donkey == NULL) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B797EC.s")
+ Collider_InitAndSetCylinder(play, &this->banditsCollisions[0], &this->dyna.actor, &sCylinderInit);
+ Collider_InitAndSetCylinder(play, &this->banditsCollisions[1], &this->dyna.actor, &sCylinderInit);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7984C.s")
+void ObjUm_Destroy(Actor* thisx, PlayState* play) {
+ ObjUm* this = THIS;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79A24.s")
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79A50.s")
+ for (i = 0; i < ARRAY_COUNT(this->potPos); i++) {
+ Audio_StopSfxByPos(&this->potPos[i]);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79BA0.s")
+ Collider_DestroyCylinder(play, &this->banditsCollisions[0]);
+ Collider_DestroyCylinder(play, &this->banditsCollisions[1]);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79F10.s")
+// ObjUm_MarkMyDonkeyAndMyselfForDeath, ObjUm_TerminateMe, ObjUmn't, ObjUm_Asinucide
+void func_80B79524(ObjUm* this) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ if (this->donkey != NULL) {
+ Actor_MarkForDeath(&this->donkey->actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B79FFC.s")
+void func_80B79560(PlayState* play, ObjUm* this, s32 arg2, u16 textId) {
+ // "Thanks, I rely on you"
+ if (textId == 0x33BF) {
+ ObjUm_SetupAction(this, ObjUm_StartCs);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A070.s")
+s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
+ s32 pad[2];
+ s32 phi_v1 = true;
+ u16 textId = this->dyna.actor.textId;
+ Player* player;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A0E0.s")
+ switch (textId) {
+ // "I'll go to town"
+ case 0x33B4:
+ // "Want a ride?"
+ case 0x33CF:
+ gSaveContext.save.weekEventReg[31] |= 0x40;
+ if (play->msgCtx.choiceIndex == 0) {
+ player = GET_PLAYER(play);
+ func_8019F208();
+ gSaveContext.save.weekEventReg[31] |= 0x80;
+ play->nextEntranceIndex = 0x64B0;
+ if (player->stateFlags1 & PLAYER_STATE1_800000) {
+ D_801BDAA0 = 1;
+ }
+ play->transitionType = TRANS_TYPE_64;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ phi_v1 = true;
+ } else {
+ Actor_ContinueText(play, &this->dyna.actor, 0x33B5);
+ func_8019F230();
+ func_80151BB4(play, 6);
+ phi_v1 = false;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A144.s")
+ // "I'll go as fast as I can!"
+ case 0x33BB:
+ Actor_ContinueText(play, &this->dyna.actor, 0x33BC);
+ phi_v1 = false;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A1B4.s")
+ // "Chase pursuers with your arrows."
+ case 0x33BC:
+ Actor_ContinueText(play, &this->dyna.actor, 0x33BD);
+ phi_v1 = false;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A240.s")
+ // "Understand?"
+ case 0x33BD:
+ if (play->msgCtx.choiceIndex == 0) {
+ Actor_ContinueText(play, &this->dyna.actor, 0x33BE);
+ func_8019F230();
+ } else {
+ Actor_ContinueText(play, &this->dyna.actor, 0x33BF);
+ func_8019F208();
+ }
+ phi_v1 = false;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A2AC.s")
+ // "I'll tell you again!"
+ case 0x33BE:
+ Actor_ContinueText(play, &this->dyna.actor, 0x33BC);
+ phi_v1 = false;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A394.s")
+ return phi_v1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A400.s")
+s32 func_80B79734(PlayState* play, ObjUm* this, s32 arg2) {
+ MessageContext* msgCtx = &play->msgCtx;
+ s32 ret = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A494.s")
+ switch (Message_GetState(msgCtx)) {
+ case TEXT_STATE_CLOSING:
+ func_80B79560(play, this, arg2, this->dyna.actor.textId);
+ return true;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A614.s")
+ case TEXT_STATE_CHOICE:
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play) && func_80B795A0(play, this, arg2)) {
+ msgCtx->msgMode = 0x43;
+ ret = true;
+ }
+ break;
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A7AC.s")
+u16 ObjUm_RanchGetDialogue(PlayState* play, ObjUm* this, s32 arg2) {
+ u16 textId = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7A860.s")
+ if (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if (gSaveContext.save.weekEventReg[31] & 0x40) {
+ // "Want a ride?"
+ textId = 0x33CF;
+ } else {
+ // "I'll deliver milk"
+ textId = 0x33B4;
+ }
+ } else {
+ textId = 0x33B7;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7AB78.s")
+ if (textId == 0) {
+ textId = 1;
+ }
+ return textId;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7ABE4.s")
+s32 func_80B7984C(PlayState* play, ObjUm* this, s32 arg2, s32* arg3) {
+ s16 temp_v0_2;
+ s16 phi_v1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7AC94.s")
+ if (*arg3 == 4) {
+ return 0;
+ }
+ if (*arg3 == 2) {
+ Message_StartTextbox(play, this->dyna.actor.textId, &this->dyna.actor);
+ *arg3 = 1;
+ return 0;
+ }
+ if (*arg3 == 3) {
+ func_80151938(play, this->dyna.actor.textId);
+ *arg3 = 1;
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7AD34.s")
+ if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state)) {
+ *arg3 = 1;
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7AE58.s")
+ if (*arg3 == 1) {
+ if (func_80B79734(play, this, arg2)) {
+ *arg3 = 0;
+ }
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7AEFC.s")
+ phi_v1 = this->dyna.actor.yawTowardsPlayer - this->dyna.actor.shape.rot.y;
+ temp_v0_2 = ABS_ALT(phi_v1);
+ if (temp_v0_2 >= 0x4E20) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7AF30.s")
+ if ((this->dyna.actor.xyzDistToPlayerSq > SQ(100.0f)) && !this->dyna.actor.isTargeted) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7B154.s")
+ if (this->dyna.actor.xyzDistToPlayerSq <= SQ(50.0f)) {
+ if (func_800B8614(&this->dyna.actor, play, 50.0f)) {
+ this->dyna.actor.textId = ObjUm_RanchGetDialogue(play, this, arg2);
+ }
+ } else if (func_800B863C(&this->dyna.actor, play)) {
+ this->dyna.actor.textId = ObjUm_RanchGetDialogue(play, this, arg2);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7B18C.s")
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/ObjUm_Update.s")
+s32 func_80B79A24(s32 arg0) {
+ switch (arg0) {
+ case 1:
+ case 2:
+ case 3:
+ return true;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7B598.s")
+ default:
+ return false;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7B93C.s")
+void ObjUm_RanchWait(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7BABC.s")
+ this->dyna.actor.flags |= ACTOR_FLAG_1;
+ SkelAnime_Update(&this->skelAnime);
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+ this->flags |= OBJ_UM_FLAG_WAITING;
+ if ((gSaveContext.save.time > CLOCK_TIME(18, 0)) && (gSaveContext.save.time <= CLOCK_TIME(19, 0))) {
+ if (!(player->stateFlags1 & PLAYER_STATE1_800000)) {
+ func_80B7984C(play, this, 0, &this->unk_2B4);
+ }
+ } else if (!func_80B79A24(this->unk_2B4) && (gSaveContext.save.time > CLOCK_TIME(19, 0))) {
+ gSaveContext.save.weekEventReg[34] |= 0x80;
+ ObjUm_SetupAction(this, ObjUm_RanchWaitPathFinished);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/func_80B7BEA4.s")
+ switch (play->msgCtx.currentTextId) {
+ default:
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 0;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Um/ObjUm_Draw.s")
+ // "I'm worried about my sister"
+ case 0x33B7:
+ // "I'll deliver milk"
+ case 0x33B4:
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 1;
+ break;
+
+ // "I'll leave at 7"
+ case 0x33B5:
+ this->unk_4CC = 3;
+ this->mouthTexIndex = 1;
+ break;
+ }
+}
+
+typedef enum ObjUmPathState {
+ /* 0 */ OBJUM_PATH_STATE_0,
+ /* 1 */ OBJUM_PATH_STATE_1,
+ /* 2 */ OBJUM_PATH_STATE_FINISH,
+ /* 3 */ OBJUM_PATH_STATE_3,
+ /* 4 */ OBJUM_PATH_STATE_4,
+} ObjUmPathState;
+
+ObjUmPathState ObjUm_UpdatePath(ObjUm* this, PlayState* play) {
+ Path* path = &play->setupPathList[this->pathIndex];
+ s32 pathCount;
+ Vec3s* pathPoints;
+ f32 xDiff;
+ f32 zDiff;
+ Vec3f sp50;
+ f32 sp4C;
+ f32 sp48;
+ f32 sp44;
+ s32 angle;
+ ObjUmPathState sp3C;
+ s16 yawDiff;
+
+ pathCount = path->count;
+ pathPoints = Lib_SegmentedToVirtual(path->points);
+ sp3C = OBJUM_PATH_STATE_0;
+
+ if (pathCount == 0) {
+ return 0;
+ }
+
+ Math_Vec3s_ToVec3f(&sp50, &pathPoints[this->pointIndex]);
+
+ if (this->pointIndex == 0) {
+ xDiff = pathPoints[1].x - pathPoints[0].x;
+ zDiff = pathPoints[1].z - pathPoints[0].z;
+ } else if ((this->pointIndex + 1) == path->count) {
+ xDiff = pathPoints[path->count - 1].x - pathPoints[path->count - 2].x;
+ zDiff = pathPoints[path->count - 1].z - pathPoints[path->count - 2].z;
+ } else {
+ xDiff = pathPoints[this->pointIndex + 1].x - pathPoints[this->pointIndex - 1].x;
+ zDiff = pathPoints[this->pointIndex + 1].z - pathPoints[this->pointIndex - 1].z;
+ }
+
+ angle = Math_Atan2S(xDiff, zDiff);
+
+ func_8017B7F8(&sp50, angle, &sp4C, &sp48, &sp44);
+ if (((this->dyna.actor.world.pos.x * sp4C) + (sp48 * this->dyna.actor.world.pos.z) + sp44) > 0.0f) {
+ this->pointIndex++;
+
+ if (this->pointIndex >= (pathCount - 7)) {
+ sp3C = OBJUM_PATH_STATE_3;
+ }
+ if (this->pointIndex >= (pathCount - 3)) {
+ sp3C = OBJUM_PATH_STATE_1;
+ }
+ if (this->pointIndex >= (pathCount - 2)) {
+ sp3C = OBJUM_PATH_STATE_4;
+ }
+ if (this->pointIndex >= pathCount) {
+ this->pointIndex = 0;
+ sp3C = OBJUM_PATH_STATE_FINISH;
+ }
+
+ Math_Vec3s_ToVec3f(&sp50, &pathPoints[this->pointIndex]);
+ }
+
+ if (this->donkey != NULL) {
+ this->dyna.actor.world.rot.y = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &sp50);
+ func_800F415C(&this->donkey->actor, &sp50, 0x190);
+
+ if (1) {}
+
+ yawDiff = this->donkey->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
+ if (fabsf(yawDiff) < 2730.0f) {
+ if (fabsf(yawDiff) < 100.0f) {
+ this->dyna.actor.shape.rot.y = this->donkey->actor.shape.rot.y;
+ } else if (yawDiff > 0) {
+ this->dyna.actor.shape.rot.y = this->dyna.actor.shape.rot.y + 0x64;
+ yawDiff = 0x64;
+ } else if (yawDiff < 0) {
+ this->dyna.actor.shape.rot.y = this->dyna.actor.shape.rot.y - 0x64;
+ yawDiff = -0x64;
+ }
+ } else if (yawDiff > 0) {
+ this->dyna.actor.shape.rot.y = this->dyna.actor.shape.rot.y + 0x190;
+ yawDiff = 0x190;
+ } else if (yawDiff < 0) {
+ this->dyna.actor.shape.rot.y = this->dyna.actor.shape.rot.y - 0x190;
+ yawDiff = -0x190;
+ }
+
+ if (this->flags & (OBJ_UM_FLAG_0010 | OBJ_UM_FLAG_0004)) {
+ ObjUm_RotatePlayerView(this, play, yawDiff);
+ }
+ }
+
+ if (this->currentAnimIndex == OBJ_UM_ANIM_TROT) {
+ this->dyna.actor.speedXZ = 4.0f;
+ } else if (this->currentAnimIndex == OBJ_UM_ANIM_GALLOP) {
+ this->dyna.actor.speedXZ = 8.0f;
+ }
+
+ return sp3C;
+}
+
+void ObjUm_RanchWaitPathFinished(ObjUm* this, PlayState* play) {
+ this->wheelRot += 0x3E8;
+ this->flags &= ~OBJ_UM_FLAG_WAITING;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_TROT);
+
+ switch (ObjUm_UpdatePath(this, play)) {
+ case OBJUM_PATH_STATE_1:
+ case OBJUM_PATH_STATE_FINISH:
+ if (gSaveContext.save.weekEventReg[31] & 0x80) {
+ ActorCutscene_Stop(this->dyna.actor.cutscene);
+ play->nextEntranceIndex = 0x3E50;
+ play->transitionType = TRANS_TYPE_64;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ } else {
+ func_80B79524(this);
+ }
+ break;
+
+ default:
+ Actor_MoveWithGravity(&this->dyna.actor);
+ break;
+ }
+}
+
+void ObjUm_RanchStartCs(ObjUm* this, PlayState* play) {
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+
+ if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ this->lastTime = gSaveContext.save.time;
+ ObjUm_SetupAction(this, func_80B7A0E0);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ }
+}
+
+void func_80B7A070(ObjUm* this, PlayState* play) {
+ ObjUm_RanchWaitPathFinished(this, play);
+ ObjUm_RotatePlayer(this, play, 0);
+
+ switch (play->msgCtx.currentTextId) {
+ case 0x33B6:
+ this->unk_4CC = 1;
+ this->mouthTexIndex = 1;
+ break;
+
+ default:
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 0;
+ break;
+ }
+}
+
+void func_80B7A0E0(ObjUm* this, PlayState* play) {
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+ if (gSaveContext.save.time != this->lastTime) {
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_TROT);
+ ObjUm_SetupAction(this, func_80B7A070);
+ }
+}
+
+void func_80B7A144(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ ObjUm_SetPlayerPosition(this, play);
+ this->flags |= OBJ_UM_FLAG_0100;
+ this->flags |= OBJ_UM_FLAG_0004;
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+ ObjUm_SetupAction(this, ObjUm_RanchStartCs);
+}
+
+void ObjUm_PreMilkRunDialogueHandler(ObjUm* this, PlayState* play) {
+ ObjUm_SetPlayerPosition(this, play);
+ this->flags |= OBJ_UM_FLAG_0004;
+
+ switch (play->msgCtx.currentTextId) {
+ case 0x33B8:
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 3;
+ break;
+
+ case 0x33B9:
+ this->unk_4CC = 2;
+ this->mouthTexIndex = 0;
+ break;
+
+ default:
+ this->flags &= ~OBJ_UM_FLAG_LOOK_BACK;
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 0;
+ break;
+ }
+}
+
+void func_80B7A240(ObjUm* this, PlayState* play) {
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+ if (gSaveContext.save.time != this->lastTime) {
+ ObjUm_SetupAction(this, func_80B7A2AC);
+ }
+
+ this->lastTime = gSaveContext.save.time;
+ ObjUm_PreMilkRunDialogueHandler(this, play);
+}
+
+void func_80B7A2AC(ObjUm* this, PlayState* play) {
+ this->wheelRot += 0x3E8;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_TROT);
+
+ switch (ObjUm_UpdatePath(this, play)) {
+ case OBJUM_PATH_STATE_1:
+ case OBJUM_PATH_STATE_FINISH:
+ play->nextEntranceIndex = 0xCE40;
+ play->transitionType = TRANS_TYPE_64;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ break;
+
+ default:
+ if (gSaveContext.save.time == this->lastTime) {
+ ObjUm_SetupAction(this, func_80B7A240);
+ }
+
+ this->lastTime = gSaveContext.save.time;
+ Actor_MoveWithGravity(&this->dyna.actor);
+ ObjUm_PreMilkRunDialogueHandler(this, play);
+ break;
+ }
+}
+
+void func_80B7A394(ObjUm* this, PlayState* play) {
+ ObjUm_SetPlayerPosition(this, play);
+ this->flags |= OBJ_UM_FLAG_0004;
+ if (gSaveContext.save.time != this->lastTime) {
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_TROT);
+ ObjUm_SetupAction(this, func_80B7A2AC);
+ }
+}
+
+void ObjUm_PreMilkRunStartCs(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ ObjUm_SetPlayerPosition(this, play);
+ this->flags |= OBJ_UM_FLAG_0004;
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ this->lastTime = gSaveContext.save.time;
+ ObjUm_SetupAction(this, func_80B7A394);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ }
+}
+
+void ObjUm_RunMinigame(ObjUm* this, PlayState* play) {
+ ObjUm_SetPlayerPosition(this, play);
+ ObjUm_RotatePlayer(this, play, 0x7FFF);
+ this->wheelRot += 0x7D0;
+ this->flags |= OBJ_UM_FLAG_0010;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_GALLOP);
+
+ switch (ObjUm_UpdatePath(this, play)) {
+ case OBJUM_PATH_STATE_1:
+ case OBJUM_PATH_STATE_FINISH:
+ gSaveContext.seqIndex = 0xFF;
+ gSaveContext.save.weekEventReg[31] &= (u8)~0x80;
+ gSaveContext.nightSeqIndex = 0xFF;
+
+ if (!(gSaveContext.save.weekEventReg[52] & 1) && !(gSaveContext.save.weekEventReg[52] & 2)) {
+ if (!this->areAllPotsBroken) {
+ play->nextEntranceIndex = 0x3E60;
+ play->transitionType = TRANS_TYPE_64;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ gSaveContext.save.weekEventReg[52] |= 1;
+ gSaveContext.save.weekEventReg[52] &= (u8)~2;
+ } else {
+ play->nextEntranceIndex = 0x6480;
+ play->transitionType = TRANS_TYPE_64;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ gSaveContext.save.weekEventReg[52] |= 2;
+ gSaveContext.save.weekEventReg[52] &= (u8)~1;
+ }
+ }
+ break;
+
+ default:
+ Actor_MoveWithGravity(&this->dyna.actor);
+ func_80B78DF0(this, play);
+ break;
+ }
+}
+
+void func_80B7A614(ObjUm* this, PlayState* play) {
+ s32 pad;
+
+ ObjUm_SetPlayerPosition(this, play);
+ ObjUm_RotatePlayer(this, play, 0x7FFF);
+ this->wheelRot += 0x7D0;
+ this->flags |= OBJ_UM_FLAG_0010;
+ this->flags |= OBJ_UM_FLAG_PLAYING_MINIGAME;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_GALLOP);
+
+ if (ObjUm_UpdatePath(this, play) == OBJUM_PATH_STATE_3 && this->unk_4DC == 0) {
+ this->unk_4DC = 1;
+ } else if (this->unk_4DC > 0) {
+ if (this->unk_4DC == 1) {
+ s32 i;
+
+ this->areAllPotsBroken = true;
+
+ for (i = 0; i < ARRAY_COUNT(this->potsLife); i++) {
+ if (this->potsLife[i] != 1) {
+ this->areAllPotsBroken = false;
+ break;
+ }
+ }
+
+ this->flags |= OBJ_UM_FLAG_MINIGAME_FINISHED;
+ }
+
+ this->unk_4DC++;
+ }
+
+ if (this->flags & OBJ_UM_FLAG_MINIGAME_FINISHED) {
+ s32 sp20 = ActorCutscene_GetAdditionalCutscene(this->dyna.actor.cutscene);
+
+ if (this->areAllPotsBroken) {
+ sp20 = ActorCutscene_GetAdditionalCutscene(sp20);
+ }
+ if (ActorCutscene_GetCanPlayNext(sp20)) {
+ ActorCutscene_StartAndSetUnkLinkFields(sp20, &this->dyna.actor);
+ ObjUm_SetupAction(this, ObjUm_RunMinigame);
+ this->flags &= ~OBJ_UM_FLAG_PLAYING_MINIGAME;
+ } else {
+ ActorCutscene_SetIntentToPlay(sp20);
+ }
+ }
+
+ Actor_MoveWithGravity(&this->dyna.actor);
+ func_80B78DF0(this, play);
+}
+
+void func_80B7A7AC(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ this->unk_4DC = 0;
+ this->areAllPotsBroken = false;
+ player->stateFlags1 &= ~PLAYER_STATE1_20;
+ ObjUm_SetPlayerPosition(this, play);
+ ObjUm_RotatePlayer(this, play, 0x7FFF);
+ func_80B78EBC(this, play);
+ this->flags |= OBJ_UM_FLAG_0010;
+ func_80B78DF0(this, play);
+ this->flags |= 4;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_GALLOP);
+ ObjUm_SetupAction(this, func_80B7A614);
+}
+
+void func_80B7A860(ObjUm* this, PlayState* play) {
+ ObjUm_SetPlayerPosition(this, play);
+ ObjUm_RotatePlayer(this, play, 0);
+ this->flags |= OBJ_UM_FLAG_0004;
+
+ if (play->csCtx.frames == 449) {
+ ObjUm_InitBandits(this, play);
+ } else if (play->csCtx.frames >= 450) {
+ func_80B78DF0(this, play);
+ }
+
+ if (play->csCtx.state == 0) {
+ ActorCutscene_Stop(this->dyna.actor.cutscene);
+ ObjUm_SetupAction(this, func_80B7A7AC);
+ }
+
+ switch (play->msgCtx.currentTextId) {
+ case 0x33BA:
+ this->unk_4CC = 2;
+ this->mouthTexIndex = 3;
+ break;
+
+ // "We'll go through here as fast as we can"
+ case 0x33BB:
+ if ((fabsf(this->skelAnime.curFrame) < 0.008f) && !(this->flags & OBJ_UM_FLAG_1000)) {
+ this->flags |= OBJ_UM_FLAG_1000;
+ this->unk_4CC = 4;
+ this->mouthTexIndex = 0;
+ } else if (fabsf(this->skelAnime.morphWeight) < 0.008f) {
+ this->unk_4CC = 2;
+ this->mouthTexIndex = 2;
+ } else {
+ this->unk_4CC = 5;
+ this->mouthTexIndex = 0;
+ }
+
+ this->flags |= OBJ_UM_FLAG_LOOK_BACK;
+ break;
+
+ // "Chase pursuers with your arrows"
+ case 0x33BC:
+ if ((fabsf(this->skelAnime.curFrame) < 0.008f) && !(this->flags & OBJ_UM_FLAG_1000)) {
+ this->flags |= OBJ_UM_FLAG_1000;
+ this->unk_4CC = 4;
+ this->mouthTexIndex = 0;
+ } else if (fabsf(this->skelAnime.morphWeight) < 0.008f) {
+ this->unk_4CC = 2;
+ this->mouthTexIndex = 2;
+ } else {
+ this->unk_4CC = 5;
+ this->mouthTexIndex = 0;
+ }
+ this->flags |= OBJ_UM_FLAG_LOOK_BACK;
+ break;
+
+ // "Understand?"
+ case 0x33BD:
+ if ((fabsf(this->skelAnime.curFrame) < 0.008f) && !(this->flags & OBJ_UM_FLAG_1000)) {
+ this->flags |= OBJ_UM_FLAG_1000;
+ this->unk_4CC = 4;
+ this->mouthTexIndex = 0;
+ } else if (fabsf(this->skelAnime.morphWeight) < 0.008f) {
+ this->unk_4CC = 2;
+ } else {
+ this->unk_4CC = 5;
+ }
+ this->mouthTexIndex = 0;
+ this->unk_4D8 = 0;
+ this->flags |= OBJ_UM_FLAG_LOOK_BACK;
+ break;
+
+ case 0x33BE:
+ this->flags |= OBJ_UM_FLAG_LOOK_BACK;
+ this->unk_4CC = 2;
+ this->mouthTexIndex = 3;
+ break;
+
+ case 0x33BF:
+ this->unk_4D8++;
+ if ((fabsf(this->skelAnime.morphWeight) < 0.008f) && this->unk_4D8 >= 6) {
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 0;
+ } else {
+ this->unk_4CC = 2;
+ this->mouthTexIndex = 2;
+ }
+ this->flags &= ~OBJ_UM_FLAG_LOOK_BACK;
+ break;
+
+ default:
+ this->unk_4CC = 0;
+ this->mouthTexIndex = 0;
+ break;
+ }
+}
+
+void func_80B7AB78(ObjUm* this, PlayState* play) {
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+ if (gSaveContext.save.time != this->lastTime) {
+ ObjUm_SetupAction(this, func_80B7ABE4);
+ }
+
+ this->lastTime = gSaveContext.save.time;
+ func_80B7A860(this, play);
+}
+
+void func_80B7ABE4(ObjUm* this, PlayState* play) {
+ this->wheelRot += 0x3E8;
+
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_TROT);
+ switch (ObjUm_UpdatePath(this, play)) {
+ case OBJUM_PATH_STATE_FINISH:
+ func_80B79524(this);
+ break;
+
+ default:
+ if (gSaveContext.save.time == this->lastTime) {
+ ObjUm_SetupAction(this, func_80B7AB78);
+ }
+
+ this->lastTime = gSaveContext.save.time;
+ Actor_MoveWithGravity(&this->dyna.actor);
+ func_80B7A860(this, play);
+ break;
+ }
+}
+
+void ObjUm_StartCs(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ ObjUm_SetPlayerPosition(this, play);
+ ObjUm_RotatePlayer(this, play, 0);
+ this->flags |= OBJ_UM_FLAG_0004;
+
+ if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ this->lastTime = gSaveContext.save.time;
+ ObjUm_SetupAction(this, func_80B7ABE4);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ }
+}
+
+void ObjUm_PostMilkRunWaitPathFinished(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ ObjUm_SetPlayerPosition(this, play);
+ ObjUm_RotatePlayer(this, play, 0);
+ this->flags |= OBJ_UM_FLAG_0004;
+ this->wheelRot += 0x3E8;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_TROT);
+
+ if ((ObjUm_UpdatePath(this, play) == OBJUM_PATH_STATE_4) && !(gSaveContext.save.weekEventReg[59] & 2)) {
+ ActorCutscene_Stop(this->dyna.actor.cutscene);
+ Audio_SetCutsceneFlag(false);
+ gSaveContext.save.weekEventReg[59] |= 2;
+ gSaveContext.nextCutsceneIndex = 0xFFF3;
+ play->nextEntranceIndex = 0x5400;
+ play->transitionType = TRANS_TYPE_64;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ gSaveContext.save.time += CLOCK_TIME(1, 0) + 2;
+ }
+ Actor_MoveWithGravity(&this->dyna.actor);
+}
+
+void ObjUm_PostMilkRunStartCs(ObjUm* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ ObjUm_SetPlayerPosition(this, play);
+ ObjUm_RotatePlayer(this, play, 0);
+ this->flags |= OBJ_UM_FLAG_0004;
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+
+ if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ ObjUm_SetupAction(this, ObjUm_PostMilkRunWaitPathFinished);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ }
+}
+
+void ObjUm_TerminaFieldIdle(ObjUm* this, PlayState* play) {
+ ObjUm_UpdateAnim(this, play, OBJ_UM_ANIM_IDLE);
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void func_80B7AF30(ObjUm* this, PlayState* play) {
+ if (!(this->flags & OBJ_UM_FLAG_0001)) {
+ this->dyna.actor.shape.rot.x = 0;
+ this->dyna.actor.shape.rot.z = 0;
+ } else {
+ CollisionPoly* sp44;
+ s32 pad[2];
+ Vec3f sp30;
+
+ this->flags &= ~OBJ_UM_FLAG_0001;
+
+ if (1) {}
+
+ this->unk_2D0 = this->unk_2C4;
+ this->unk_2E8 = this->unk_2DC;
+
+ this->unk_2D0.y = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp44, &this->unk_2C4);
+ if (this->unk_2D0.y == BGCHECK_Y_MIN) {
+ this->unk_2D0.y = this->dyna.actor.floorHeight;
+ }
+
+ if (1) {}
+
+ this->unk_2E8.y = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp44, &this->unk_2DC);
+ if (this->unk_2E8.y == BGCHECK_Y_MIN) {
+ this->unk_2E8.y = this->dyna.actor.floorHeight;
+ }
+
+ sp30.x = (this->unk_2D0.x + this->unk_2E8.x) * 0.5f;
+ sp30.y = (this->unk_2D0.y + this->unk_2E8.y) * 0.5f;
+ sp30.z = (this->unk_2D0.z + this->unk_2E8.z) * 0.5f;
+
+ this->dyna.actor.shape.rot.x =
+ (s16)Math_Atan2S(sp30.y - this->dyna.actor.world.pos.y, sqrtf(SQ(sp30.x - this->dyna.actor.world.pos.x) +
+ SQ(sp30.z - this->dyna.actor.world.pos.z)));
+ this->dyna.actor.shape.rot.z = (s16)-Math_Atan2S(
+ sp30.y - this->unk_2D0.y, sqrtf(SQ(sp30.x - this->unk_2D0.x) + SQ(sp30.z - this->unk_2D0.z)));
+ if (this->flags & OBJ_UM_FLAG_MOVING) {
+ this->dyna.actor.shape.rot.x += BINANG_SUB((Rand_ZeroOne() * 100.0f), 50.0f);
+ this->dyna.actor.shape.rot.z += BINANG_SUB((Rand_ZeroOne() * 100.0f), 50.0f);
+ }
+ }
+}
+
+void ObjUm_DefaultAnim(ObjUm* this, PlayState* play) {
+ Animation_PlayOnce(&this->skelAnime, &gUmTrotAnim);
+ this->currentAnimIndex = OBJ_UM_ANIM_TROT;
+}
+
+typedef struct {
+ /* 0x00 */ AnimationHeader* anim;
+ /* 0x04 */ s32 doesMove; // `true` if the animation is intended to be used while the actor is moving
+} struct_80B7C25C; // size = 0x08
+
+struct_80B7C25C sUmAnims[] = {
+ { &gUmTrotAnim, true }, // OBJ_UM_ANIM_TROT
+ { &gUmGallopAnim, true }, // OBJ_UM_ANIM_GALLOP
+ { &gUmIdleAnim, false }, // OBJ_UM_ANIM_IDLE
+ { NULL, false }, // OBJ_UM_ANIM_3
+ { &gUmLookBackAnim, false }, // OBJ_UM_ANIM_LOOK_BACK
+};
+
+void ObjUm_UpdateAnim(ObjUm* this, PlayState* play, ObjUmAnimimations index) {
+ s32 changeAnim;
+ s32 temp;
+ s32 indexTemp = index;
+ f32 animPlaybackSpeed = 0.0f;
+
+ if (sUmAnims[index].doesMove) {
+ this->flags |= OBJ_UM_FLAG_MOVING;
+ } else {
+ this->flags &= ~OBJ_UM_FLAG_MOVING;
+ }
+
+ if (index == OBJ_UM_ANIM_TROT) {
+ animPlaybackSpeed = this->dyna.actor.speedXZ * 0.25f;
+ } else if (index == OBJ_UM_ANIM_GALLOP) {
+ animPlaybackSpeed = this->dyna.actor.speedXZ * 0.2f;
+ } else if (index == OBJ_UM_ANIM_IDLE) {
+ animPlaybackSpeed = 1.0f;
+ }
+ this->skelAnime.playSpeed = animPlaybackSpeed;
+
+ if (this->flags & OBJ_UM_FLAG_LOOK_BACK) {
+ this->skelAnime.playSpeed = 1.0f;
+ index = OBJ_UM_ANIM_MINUS_1;
+ }
+
+ changeAnim = (index != this->currentAnimIndex);
+ if (SkelAnime_Update(&this->skelAnime) || changeAnim) {
+ this->currentAnimIndex = index;
+
+ if (index != OBJ_UM_ANIM_MINUS_1) {
+ if (this->donkey != NULL) {
+ this->donkey->unk_538 = index;
+ }
+
+ if (changeAnim) {
+ Animation_MorphToPlayOnce(&this->skelAnime, sUmAnims[index].anim, -3.0f);
+ } else {
+ Animation_PlayOnce(&this->skelAnime, sUmAnims[index].anim);
+ }
+ } else {
+ EnHorse* donkey = this->donkey;
+
+ if (donkey != NULL) {
+ donkey->unk_538 = indexTemp;
+ }
+
+ if (changeAnim) {
+ temp = 3 - index; // OBJ_UM_ANIM_LOOK_BACK
+ Animation_MorphToPlayOnce(&this->skelAnime, sUmAnims[temp].anim, -10.0f);
+ } else {
+ temp = 3 - index; // OBJ_UM_ANIM_LOOK_BACK
+ Animation_PlayOnce(&this->skelAnime, sUmAnims[temp].anim);
+ }
+ }
+ }
+
+ if (this->wheelRot / 0x199A != this->unk_420) {
+ this->unk_420 = this->wheelRot / 0x199A;
+ //! FAKE
+ if (!&sUmAnims[0]) {}
+ Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_CART_WHEEL);
+ }
+}
+
+void ObjUm_Update(Actor* thisx, PlayState* play) {
+ ObjUm* this = THIS;
+
+ this->actionFunc(this, play);
+ this->unk_350++;
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 0x1C);
+
+ if (this->donkey != NULL) {
+ this->donkey->actor.world.pos.x = this->dyna.actor.world.pos.x;
+ this->donkey->actor.world.pos.y = this->dyna.actor.floorHeight;
+ this->donkey->actor.world.pos.z = this->dyna.actor.world.pos.z;
+ }
+
+ if (this->flags & OBJ_UM_FLAG_0010) {
+ func_80123F2C(play, 0x63);
+ this->flags &= ~OBJ_UM_FLAG_0010;
+ } else if (this->flags & OBJ_UM_FLAG_0004) {
+ func_80123F2C(play, -3);
+ this->flags &= ~OBJ_UM_FLAG_0004;
+ }
+
+ if (this->flags & OBJ_UM_FLAG_0100) {
+ this->flags &= ~OBJ_UM_FLAG_0100;
+ ObjUm_RotatePlayer(this, play, 0);
+ func_80B78EBC(this, play);
+ }
+
+ func_80B7AF30(this, play);
+ switch (this->unk_4CC) {
+ case 0:
+ switch (this->eyeTexIndex) {
+ case 0:
+ if (Rand_ZeroOne() < 0.025f) {
+ this->eyeTexIndex = 1;
+ }
+ break;
+
+ case 1:
+ if (Rand_ZeroOne() < 0.6f) {
+ this->eyeTexIndex = 2;
+ }
+ break;
+
+ case 2:
+ if (Rand_ZeroOne() < 0.6f) {
+ this->eyeTexIndex = 0;
+ }
+ break;
+
+ default:
+ this->eyeTexIndex = 0;
+ break;
+ }
+ break;
+
+ case 1:
+ this->eyeTexIndex = 3;
+ break;
+ case 2:
+ this->eyeTexIndex = 4;
+ break;
+ case 3:
+ this->eyeTexIndex = 5;
+ break;
+ case 4:
+ this->eyeTexIndex = 2;
+ break;
+ case 5:
+ this->eyeTexIndex = 0;
+ break;
+ default:
+ this->unk_4CC = 0;
+ this->eyeTexIndex = 0;
+ break;
+ }
+}
+
+s32 ObjUm_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ ObjUm* this = THIS;
+ Player* player = GET_PLAYER(play);
+ s32 pad;
+ s16 temp_v0_3;
+ Vec3f sp5C = { 4223.0f, -979.0f, 4098.0f };
+ Vec3f sp50 = { 4223.0f, -980.0f, -4083.0f };
+
+ if ((limbIndex >= UM_LIMB_CREMIA_ROOT) && (this->type == OBJ_UM_TYPE_TERMINA_FIELD)) {
+ *dList = NULL;
+ return false;
+ }
+
+ if (limbIndex == UM_LIMB_CREMIA_HEAD) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sMouthTextures[this->mouthTexIndex]));
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ if (limbIndex == UM_LIMB_WAGON_RIGHT_WHEEL) {
+ if (this->flags & OBJ_UM_FLAG_MOVING) {
+ rot->x = -this->wheelRot;
+ }
+ Matrix_MultVec3f(&sp5C, &this->unk_2C4);
+ } else if (limbIndex == UM_LIMB_WAGON_LEFT_WHEEL) {
+ if (this->flags & OBJ_UM_FLAG_MOVING) {
+ rot->x = this->wheelRot;
+ }
+ Matrix_MultVec3f(&sp50, &this->unk_2DC);
+ } else if ((limbIndex == UM_LIMB_CREMIA_HEAD) && (this->flags & OBJ_UM_FLAG_WAITING)) {
+ if (SubS_AngleDiffLessEqual(this->dyna.actor.shape.rot.y, 0x4E20, this->dyna.actor.yawTowardsPlayer) &&
+ (this->dyna.actor.xzDistToPlayer < 500.0f)) {
+ s16 sp3E;
+ Vec3f sp30 = player->actor.world.pos;
+
+ sp30.y = player->bodyPartsPos[7].y + 3.0f;
+ sp3E = Math_Vec3f_Yaw(&this->dyna.actor.focus.pos, &sp30) - this->dyna.actor.shape.rot.y;
+ temp_v0_3 = Math_Atan2S(
+ this->dyna.actor.focus.pos.y - sp30.y,
+ Math3D_XZLength(sp30.x - this->dyna.actor.focus.pos.x, sp30.z - this->dyna.actor.focus.pos.z));
+ this->unk_2FE.x = rot->x + sp3E;
+ this->unk_2FE.y = rot->y;
+ this->unk_2FE.z = rot->z + temp_v0_3;
+ Math_SmoothStepToS(&this->unk_2F8.x, this->unk_2FE.x, 4, 0x3E8, 1);
+ Math_SmoothStepToS(&this->unk_2F8.z, this->unk_2FE.z, 4, 0x3E8, 1);
+ this->unk_2F8.y = rot->y;
+ rot->x = this->unk_2F8.x;
+ rot->z = this->unk_2F8.z;
+ } else {
+ this->unk_2FE.x = rot->x;
+ this->unk_2FE.y = rot->y;
+ this->unk_2FE.z = rot->z;
+ Math_SmoothStepToS(&this->unk_2F8.x, this->unk_2FE.x, 4, 0x3E8, 1);
+ Math_SmoothStepToS(&this->unk_2F8.z, this->unk_2FE.z, 4, 0x3E8, 1);
+ this->unk_2F8.y = rot->y;
+ rot->x = this->unk_2F8.x;
+ rot->z = this->unk_2F8.z;
+ }
+ } else if ((limbIndex == UM_LIMB_WAGON_CART_COVER) && (this->flags & OBJ_UM_FLAG_PLAYING_MINIGAME)) {
+ *dList = NULL;
+ }
+
+ return false;
+}
+
+void ObjUm_SpawnFragments(PlayState* play, Vec3f* potPos) {
+ Vec3f sp8C = { 0.0f, -1.0f, 0.0f };
+ Gfx* potFragments[] = { object_um_DL_000040, object_um_DL_000910, object_um_DL_0011E0 };
+ s32 i;
+ Vec3f sp70;
+
+ EffectSsHitmark_SpawnFixedScale(play, 0, potPos);
+
+ for (i = 0; i < 20; i++) {
+ sp70.x = (Rand_ZeroOne() * 20.0f) - 10.0f;
+ sp70.y = -((Rand_ZeroOne() * 20.0f) - 10.0f);
+ sp70.z = (Rand_ZeroOne() * 20.0f) - 10.0f;
+ EffectSsHahen_Spawn(play, potPos, &sp70, &sp8C, 1, 100, OBJECT_UM, 10,
+ potFragments[(s32)(Rand_ZeroOne() * ARRAY_COUNT(potFragments))]);
+ }
+}
+
+void ObjUm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ ObjUm* this = THIS;
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ Mtx* mtx_s3;
+ Gfx* spFC[] = {
+ NULL, gUmBrokenMinigamePotDL, gUmMinigamePotDL, gUmMinigamePotDL, gUmMinigamePotDL, object_um_DL_0067C0
+ };
+ Gfx* spE4[] = { NULL, NULL, object_um_DL_004B60, object_um_DL_0043E0, NULL, NULL };
+ f32 spCC[] = { 0.0f, 1070.0f, 1070.0f, 1070.0f, 1070.0f, 2100.0f };
+ Vec3f spC0 = gZeroVec3f;
+ Vec3f calcPotPos;
+ f32 spB0;
+
+ spC0.y += 1700.0f;
+
+ if (limbIndex == UM_LIMB_WAGON_CART_BED) {
+ Vec3f spA4 = { 2000.0f, 1070.0f, 0.0f };
+
+ Matrix_MultVec3f(&spA4, &this->unk_308);
+ this->flags |= OBJ_UM_FLAG_DRAWN_FLOOR;
+ }
+
+ if (limbIndex == UM_LIMB_WAGON_CART_BED) {
+ Vec3f sp98 = { 2500.0f, 200.0f, 0.0f };
+
+ Matrix_MultVec3f(&sp98, &this->cartBedPos);
+ }
+
+ if (limbIndex == UM_LIMB_WAGON_CART_BED) {
+ Vec3f* potPos;
+ Vec3f sp88;
+ Vec3s sp80;
+ s32 i;
+ f32 sp70[] = { 2000.0f, 0.0f, -2000.0f };
+
+ //! FAKE
+ if (!i) {}
+
+ sp80.x = 0;
+ sp80.z = 0;
+ sp88.x = 6800.0f;
+ OPEN_DISPS(gfxCtx);
+
+ for (i = 0; i < ARRAY_COUNT(this->potsLife); i++) {
+ sp88.z = sp70[i];
+ sp88.y = spCC[this->potsLife[i]];
+
+ if (this->potsLife[i] == 5) {
+ sp80.y = 0x4000;
+ } else {
+ sp80.y = -0x4000;
+ }
+
+ Matrix_Push();
+ Matrix_TranslateRotateZYX(&sp88, &sp80);
+ mtx_s3 = Matrix_NewMtx(gfxCtx);
+ potPos = &this->potPos[i];
+ Matrix_MultVec3f(&spC0, &calcPotPos);
+ SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &calcPotPos, potPos, &spB0);
+
+ if (this->wasPotHit[i]) {
+ this->wasPotHit[i] = false;
+ if (this->potsLife[i] == 1) {
+ ObjUm_SpawnFragments(play, &calcPotPos);
+ } else {
+ EffectSsHitmark_SpawnFixedScale(play, 0, &calcPotPos);
+ }
+ }
+ Matrix_Pop();
+
+ if (mtx_s3 != NULL) {
+ if (play) {}
+ gSPMatrix(POLY_OPA_DISP++, mtx_s3, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (spFC[this->potsLife[i]] != NULL) {
+ s32 pad;
+
+ gSPDisplayList(POLY_OPA_DISP++, spFC[this->potsLife[i]]);
+
+ if (spE4[this->potsLife[i]] != NULL) {
+ gSPDisplayList(POLY_OPA_DISP++, spE4[this->potsLife[i]]);
+ }
+ }
+ } else {
+ //! @bug skips CLOSE_DISPS
+ return;
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+ }
+
+ if (limbIndex == UM_LIMB_CREMIA_HEAD) {
+ Matrix_MultZero(&this->dyna.actor.focus.pos);
+ }
+}
+
+void func_80B7BEA4(Vec3f* cartBedPos, s16 arg1, Vec3f* arg2, u8 alpha, PlayState* play) {
+ f32 temp;
+ Vec3f sp108;
+ CollisionPoly* sp104;
+ Mtx* sp100;
+ MtxF spC0;
+ MtxF sp80;
+ MtxF sp40;
+
+ sp108.x = cartBedPos->x;
+ sp108.y = cartBedPos->y + 1.0f;
+ sp108.z = cartBedPos->z;
+
+ temp = BgCheck_EntityRaycastFloor2(play, &play->colCtx, &sp104, &sp108);
+ if (sp104 != NULL) {
+ func_800C0094(sp104, cartBedPos->x, temp, cartBedPos->z, &spC0);
+ } else {
+ SkinMatrix_SetTranslate(&spC0, cartBedPos->x, cartBedPos->y, cartBedPos->z);
+ }
+
+ SkinMatrix_MulYRotation(&spC0, arg1);
+ SkinMatrix_SetScale(&sp80, arg2->x, 1.0f, arg2->z);
+ SkinMatrix_MtxFMtxFMult(&spC0, &sp80, &sp40);
+
+ sp100 = SkinMatrix_MtxFToNewMtx(play->state.gfxCtx, &sp40);
+ if (sp100 != NULL) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, alpha);
+ gSPMatrix(POLY_OPA_DISP++, sp100, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSquareShadowDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+}
+
+void ObjUm_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+ ObjUm* this = THIS;
+ Vec3f sp34;
+
+ this->flags |= OBJ_UM_FLAG_0001;
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ ObjUm_OverrideLimbDraw, ObjUm_PostLimbDraw, &this->dyna.actor);
+ sp34.x = 0.45f;
+ sp34.y = 0.0f;
+ sp34.z = 0.7f;
+ func_80B7BEA4(&this->cartBedPos, this->dyna.actor.shape.rot.y, &sp34, 180, play);
+ func_80B77770(this, play);
+}
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 d343d3a51..9d228eda8 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.h
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.h
@@ -2,18 +2,93 @@
#define Z_OBJ_UM_H
#include "global.h"
+#include "objects/object_um/object_um.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
struct ObjUm;
typedef void (*ObjUmActionFunc)(struct ObjUm*, PlayState*);
+#define MILK_POTS_COUNT 3
+
+typedef enum ObjUmAnimimations {
+ /* -1 */ OBJ_UM_ANIM_MINUS_1 = -1,
+ /* 0 */ OBJ_UM_ANIM_TROT,
+ /* 1 */ OBJ_UM_ANIM_GALLOP,
+ /* 2 */ OBJ_UM_ANIM_IDLE,
+ /* 3 */ OBJ_UM_ANIM_3, // NULL pointer
+ /* 4 */ OBJ_UM_ANIM_LOOK_BACK
+} ObjUmAnimimations;
+
typedef struct ObjUm {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x18];
+ /* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ObjUmActionFunc actionFunc;
- /* 0x160 */ char unk_160[0x384];
+ /* 0x160 */ SkelAnime skelAnime;
+ /* 0x1A4 */ Vec3s jointTable[UM_LIMB_MAX];
+ /* 0x228 */ Vec3s morphTable[UM_LIMB_MAX];
+ /* 0x2AC */ s16 wheelRot;
+ /* 0x2AE */ s16 type;
+ /* 0x2B0 */ s16 initialPathIndex;
+ /* 0x2B4 */ s32 unk_2B4;
+ /* 0x2B8 */ EnHorse* donkey;
+ /* 0x2BC */ s32 pathIndex;
+ /* 0x2BE */ s32 pointIndex;
+ /* 0x2C4 */ Vec3f unk_2C4;
+ /* 0x2D0 */ Vec3f unk_2D0;
+ /* 0x2DC */ Vec3f unk_2DC;
+ /* 0x2E8 */ Vec3f unk_2E8;
+ /* 0x2F4 */ s32 flags;
+ /* 0x2BC */ Vec3s unk_2F8;
+ /* 0x2FE */ Vec3s unk_2FE;
+ /* 0x304 */ ObjUmAnimimations currentAnimIndex;
+ /* 0x308 */ Vec3f unk_308;
+ /* 0x314 */ s32 potsLife[MILK_POTS_COUNT];
+ /* 0x320 */ s32 wasPotHit[MILK_POTS_COUNT]; // resets to false in the same frame
+ /* 0x32C */ Vec3f potPos[MILK_POTS_COUNT];
+ /* 0x350 */ s32 unk_350; // unused counter?
+ /* 0x354 */ s32 unk_354; // unused?
+ /* 0x358 */ EnHorse* bandit1;
+ /* 0x35C */ EnHorse* bandit2;
+ /* 0x360 */ Vec3f unk_360[16];
+ /* 0x420 */ s32 unk_420; // ?
+ /* 0x424 */ ColliderCylinder banditsCollisions[2];
+ /* 0x4BC */ Vec3f cartBedPos;
+ /* 0x4C8 */ u16 lastTime;
+ /* 0x4CC */ s32 unk_4CC;
+ /* 0x4D0 */ s32 eyeTexIndex;
+ /* 0x4D4 */ s32 mouthTexIndex;
+ /* 0x4D8 */ s32 unk_4D8;
+ /* 0x4DC */ s32 unk_4DC;
+ /* 0x4E0 */ s32 areAllPotsBroken; // true when all of the pots have been broken
} ObjUm; // size = 0x4E4
extern const ActorInit Obj_Um_InitVars;
+typedef enum {
+ /* 0 */ OBJ_UM_TYPE_TERMINA_FIELD,
+ /* 1 */ OBJ_UM_TYPE_RANCH,
+ /* 2 */ OBJ_UM_TYPE_PRE_MILK_RUN, // milk road, pre-minigame
+ /* 3 */ OBJ_UM_TYPE_MILK_RUN_MINIGAME,
+ /* 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_FLAG_NONE (0)
+#define OBJ_UM_FLAG_0001 (1 << 0)
+#define OBJ_UM_FLAG_MOVING (1 << 1)
+#define OBJ_UM_FLAG_0004 (1 << 2)
+#define OBJ_UM_FLAG_WAITING (1 << 3) // Waiting in the Ranch
+#define OBJ_UM_FLAG_0010 (1 << 4)
+#define OBJ_UM_FLAG_DRAWN_FLOOR (1 << 5)
+#define OBJ_UM_FLAG_0040 (1 << 6)
+#define OBJ_UM_FLAG_PLAYING_MINIGAME (1 << 7)
+#define OBJ_UM_FLAG_0100 (1 << 8)
+#define OBJ_UM_FLAG_0200 (1 << 9) // Something bandit1
+#define OBJ_UM_FLAG_0400 (1 << 10) // Something bandit2
+#define OBJ_UM_FLAG_LOOK_BACK (1 << 11)
+#define OBJ_UM_FLAG_1000 (1 << 12)
+#define OBJ_UM_FLAG_MINIGAME_FINISHED (1 << 13)
+
#endif // Z_OBJ_UM_H
diff --git a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
index 7b01b2d38..093261344 100644
--- a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
+++ b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
@@ -1,10 +1,12 @@
/*
* File: z_shot_sun.c
* Overlay: ovl_Shot_Sun
- * Description:
+ * Description: Leftover sun hitbox from OOT and fairy spawner
*/
#include "z_shot_sun.h"
+#include "overlays/actors/ovl_Item_Etcetera/z_item_etcetera.h"
+#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
@@ -14,12 +16,9 @@ void ShotSun_Init(Actor* thisx, PlayState* play);
void ShotSun_Destroy(Actor* thisx, PlayState* play);
void ShotSun_Update(Actor* thisx, PlayState* play);
-void func_80973740(ShotSun* this, PlayState* play);
-void func_80973804(ShotSun* this, PlayState* play);
-void func_809738D0(ShotSun* this, PlayState* play);
-void func_80973960(ShotSun* this, PlayState* play);
+void ShotSun_UpdateForOcarina(ShotSun* this, PlayState* play);
+void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play2);
-#if 0
const ActorInit Shot_Sun_InitVars = {
ACTOR_SHOT_SUN,
ACTORCAT_PROP,
@@ -32,27 +31,156 @@ const ActorInit Shot_Sun_InitVars = {
(ActorFunc)NULL,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80973BA0 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x00000020, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00000020, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 30, 60, 0, { 0, 0, 0 } },
};
-#endif
+void ShotSun_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ ShotSun* this = THIS;
-extern ColliderCylinderInit D_80973BA0;
+ if ((SHOTSUN_GET_FF(thisx) == SHOTSUN_FAIRY_SPAWNER_SUNS) ||
+ (SHOTSUN_GET_FF(thisx) == SHOTSUN_FAIRY_SPAWNER_STORMS)) {
+ this->unk_19C = 0;
+ this->actor.flags |= ACTOR_FLAG_10;
+ this->actor.flags |= ACTOR_FLAG_2000000;
+ this->actionFunc = ShotSun_UpdateForOcarina;
+ this->actor.flags |= ACTOR_FLAG_8000000;
+ } else {
+ Collider_InitCylinder(play, &this->collider);
+ Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ this->actionFunc = ShotSun_UpdateHyliaSun;
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Shot_Sun/ShotSun_Init.s")
+void ShotSun_Destroy(Actor* thisx, PlayState* play) {
+ ShotSun* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Shot_Sun/ShotSun_Destroy.s")
+ if ((SHOTSUN_GET_FF(thisx) != SHOTSUN_FAIRY_SPAWNER_SUNS) &&
+ (SHOTSUN_GET_FF(thisx) != SHOTSUN_FAIRY_SPAWNER_STORMS)) {
+ Collider_DestroyCylinder(play, &this->collider);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Shot_Sun/func_80973740.s")
+void ShotSun_SpawnFairy(ShotSun* this, PlayState* play2) {
+ s32 params = SHOTSUN_GET_FF(&this->actor);
+ s32 fairyType = 0;
+ PlayState* play = play2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Shot_Sun/func_80973804.s")
+ if (this->timer > 0) {
+ this->timer--;
+ } else {
+ ActorCutscene_Stop(this->actor.cutscene);
+ switch (params) {
+ case SHOTSUN_FAIRY_SPAWNER_SUNS:
+ fairyType = ENELF_TYPE_7;
+ break;
+ case SHOTSUN_FAIRY_SPAWNER_STORMS:
+ fairyType = ENELF_TYPE_7;
+ break;
+ }
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, this->actor.home.pos.x, this->actor.home.pos.y,
+ this->actor.home.pos.z, 0, 0, 0, fairyType);
+ Actor_MarkForDeath(&this->actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Shot_Sun/func_809738D0.s")
+void ShotSun_TriggerFairy(ShotSun* this, PlayState* play) {
+ if ((this->actor.cutscene == -1) || ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (this->actor.cutscene != -1) {
+ ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ }
+ this->actionFunc = ShotSun_SpawnFairy;
+ this->timer = 50;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_KANKYO, this->actor.home.pos.x, this->actor.home.pos.y,
+ this->actor.home.pos.z, 0, 0, 0, 0x11);
+ Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_TRE_BOX_APPEAR);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Shot_Sun/func_80973960.s")
+void ShotSun_UpdateForOcarina(ShotSun* this, PlayState* play) {
+ s32 params = SHOTSUN_GET_FF(&this->actor);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Shot_Sun/ShotSun_Update.s")
+ if (play->msgCtx.ocarinaMode == 3) {
+ switch (play->msgCtx.lastPlayedSong) {
+ case OCARINA_SONG_STORMS:
+ if (params == SHOTSUN_FAIRY_SPAWNER_STORMS) {
+ this->actionFunc = ShotSun_TriggerFairy;
+ play->msgCtx.ocarinaMode = 4;
+ }
+ break;
+ case OCARINA_SONG_SUNS:
+ if (params == SHOTSUN_FAIRY_SPAWNER_SUNS) {
+ this->actionFunc = ShotSun_TriggerFairy;
+ play->msgCtx.ocarinaMode = 4;
+ }
+ break;
+ }
+ }
+}
+
+void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) {
+ Vec3s cylinderPos;
+ Player* player = GET_PLAYER(play);
+ EnItem00* collectible;
+ s32 pad;
+ Vec3f spawnPos;
+
+ if (this->collider.base.acFlags & AC_HIT) {
+ play_sound(NA_SE_SY_CORRECT_CHIME);
+ if (1) {}
+ if (INV_CONTENT(ITEM_ARROW_FIRE) == ITEM_NONE) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_ETCETERA, 700.0f, -800.0f, 7261.0f, 0, 0, 0,
+ ITEM_ETC_ARROW_FIRE);
+ if (1) {}
+ gSaveContext.cutsceneTrigger = 1;
+ } else {
+ spawnPos.x = 700.0f;
+ spawnPos.y = -800.0f;
+ spawnPos.z = 7261.0f;
+ collectible = (EnItem00*)Item_DropCollectible(play, &spawnPos, ITEM00_MAGIC_LARGE);
+ if (collectible != NULL) {
+ collectible->unk152 = 0x1770;
+ collectible->actor.speedXZ = 0.0f;
+ }
+ }
+
+ Actor_MarkForDeath(&this->actor);
+ } else if (!(this->actor.xzDistToPlayer > 120.0f)) {
+ if ((gSaveContext.save.time >= CLOCK_TIME(6, 30)) && (gSaveContext.save.time < CLOCK_TIME(7, 30))) {
+ cylinderPos.x = player->bodyPartsPos[7].x + (play->envCtx.unk_4 * (1.0f / 6.0f));
+ cylinderPos.y = (player->bodyPartsPos[7].y - 30.0f) + (play->envCtx.unk_8 * (1.0f / 6.0f));
+ cylinderPos.z = player->bodyPartsPos[7].z + (play->envCtx.unk_C * (1.0f / 6.0f));
+
+ this->hitboxPos = cylinderPos;
+
+ Collider_SetCylinderPosition(&this->collider, &cylinderPos);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
+ }
+}
+
+void ShotSun_Update(Actor* thisx, PlayState* play) {
+ ShotSun* this = THIS;
+
+ this->actionFunc(this, play);
+}
diff --git a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h
index cb25f1553..49fd2ffb7 100644
--- a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h
+++ b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h
@@ -3,16 +3,22 @@
#include "global.h"
+#define SHOTSUN_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define SHOTSUN_FAIRY_SPAWNER_SUNS 0x40
+#define SHOTSUN_FAIRY_SPAWNER_STORMS 0x41
+
struct ShotSun;
typedef void (*ShotSunActionFunc)(struct ShotSun*, PlayState*);
typedef struct ShotSun {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x4C];
+ /* 0x144 */ ColliderCylinder collider;
/* 0x190 */ ShotSunActionFunc actionFunc;
- /* 0x194 */ char unk_194[0xC];
-} ShotSun; // size = 0x1A0
+ /* 0x194 */ Vec3s hitboxPos;
+ /* 0x19A */ s16 timer;
+ /* 0x19C */ s8 unk_19C; // leftover from OOT secret ocarina occurrence function.
+} ShotSun; // size = 0x1A0
extern const ActorInit Shot_Sun_InitVars;
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 ff8b85723..4184ca576 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
@@ -112,13 +112,4 @@ typedef struct FileChooseContext {
/* 0x24550 */ s16 unk_24550;
} FileChooseContext; // size = 0x24558
-// TODO: Confirm those values has the same meaning as their OoT counterparts
-typedef enum {
- /* 0x00 */ PAUSE_0, // PAUSE_ITEM
- /* 0x01 */ PAUSE_1, // PAUSE_MAP
- /* 0x02 */ PAUSE_2, // PAUSE_QUEST
- /* 0x03 */ PAUSE_3, // PAUSE_EQUIP
- /* 0x04 */ PAUSE_4 // PAUSE_WORLD_MAP
-} PauseMenuPage;
-
#endif
diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c
index 4a62de6a2..e7925f400 100644
--- a/src/overlays/gamestates/ovl_select/z_select.c
+++ b/src/overlays/gamestates/ovl_select/z_select.c
@@ -1,14 +1,14 @@
/*
* File: z_select.c
* Overlay: ovl_select
- * Description: Debug map select
+ * Description: Debug Map Select Menu
*/
#include "z_select.h"
#include "libc/alloca.h"
#include "overlays/gamestates/ovl_title/z_title.h"
-void Select_LoadTitle(SelectContext* this) {
+void MapSelect_LoadTitle(MapSelectState* this) {
{
GameState* gameState = &this->state;
gameState->running = false;
@@ -17,7 +17,7 @@ void Select_LoadTitle(SelectContext* this) {
SET_NEXT_GAMESTATE(&this->state, Title_Init, TitleContext);
}
-void Select_LoadGame(SelectContext* this, u32 entranceIndex, s32 opt) {
+void MapSelect_LoadGame(MapSelectState* this, u32 entranceIndex, s32 opt) {
if (gSaveContext.fileNum == 0xFF) {
Sram_InitDebugSave();
}
@@ -53,7 +53,7 @@ void Select_LoadGame(SelectContext* this, u32 entranceIndex, s32 opt) {
gSaveContext.respawn[RESPAWN_MODE_ZORA].entranceIndex = 0xFF;
gSaveContext.respawn[RESPAWN_MODE_DEKU].entranceIndex = 0xFF;
gSaveContext.respawn[RESPAWN_MODE_HUMAN].entranceIndex = 0xFF;
- D_801BDBB0 = 0;
+ gWeatherMode = 0;
do {
GameState* gameState = &this->state;
@@ -62,300 +62,440 @@ void Select_LoadGame(SelectContext* this, u32 entranceIndex, s32 opt) {
SET_NEXT_GAMESTATE(&this->state, Play_Init, PlayState);
}
-// "Translation" ("Actual name")
+// "Translation" (Actual name)
static SceneSelectEntry sScenes[] = {
- // " 0: OP Woods for Cutscene Use" (" 0: Forest Opening Scene")
- { " 0:OP\x8Cデモ\x8Dヨウ シンリン", Select_LoadGame, 0x1C00 },
- // " 0-0: Lost Woods" (" 0-0: Lost Woods")
- { " 0-0:\x8Dマヨイ ノ モリ", Select_LoadGame, 0xC400 },
- // " 1: Town Outskirts" (" 1: Termina Field")
- { " 1:\x8Cタウン \x8Dコウガイ", Select_LoadGame, 0x5400 },
- // " 1-0: Astral Observatory" (" 1-0: Astral Observatory")
- { " 1-0:\x8Dテンモンカンソクジョ", Select_LoadGame, 0x4C00 },
- // " 1 - 1: Astral Observatory Telescope" (" 1 - 1: Astral Observatory - Telescope")
- { " 1-1:\x8Dテンモンカンソクジョ デ ボウエンキョウ", Select_LoadGame, 0x54A0 },
- // " 1 - 2: Ikana Graveyard" (" 1 - 2: Ikana Canyon Graveyard")
- { " 1-2:\x8Cイカーナ \x8Dノ ハカバ", Select_LoadGame, 0x8000 },
- // " 2: Romani Ranch" (" 2: Romani Ranch")
- { " 2:\x8Cロマニー \x8Dボクジョウ", Select_LoadGame, 0x6400 },
- // " 3: Milk Road" (" 3: Milk Road")
- { " 3:\x8Cミルクロード", Select_LoadGame, 0x3E00 },
- // " 4: Main Building" (" 4: Ranch House")
- { " 4:\x8Dオモヤ", Select_LoadGame, 0x610 },
- // " 5: Cow Shed" (" 5: Cow Shed")
- { " 5:\x8Dウシゴヤ", Select_LoadGame, 0x600 },
- // " 6: Cucco Shed" (" 6: Cucco Shed")
- { " 6:\x8Cコッコ \x8Dゴヤ", Select_LoadGame, 0x7E00 },
- // " 7: Dog Racing Area" (" 7: Doggy Racetrack")
- { " 7:\x8Cドッグレース\x8Dジョウ", Select_LoadGame, 0x7C00 },
- // " 8: Gorman Track" (" 8: Gorman Track")
- { " 8:\x8Cゴーマン トラック", Select_LoadGame, 0xCE00 },
- // " 10: Mountain Village -Winter-" (" 10: Mountain Village - Winter")
- { " 10:\x8Dヤマザト -フユ-", Select_LoadGame, 0x9A00 },
- // " 10 - 0: Mountain Village -Spring-" (" 10 - 0: Mountain Village - Spring")
- { " 10-0:\x8Dヤマザト -ハル-", Select_LoadGame, 0xAE00 },
- // " 10 - 1: Mountain Village Blacksmith" (" 10 - 1: Mountain Smithy")
- { " 10-1:\x8Dヤマザト ノ カジヤ", Select_LoadGame, 0x5200 },
- // " 11: Goron Village -Winter-" (" 11: Goron Village - Winter")
- { " 11:\x8Cゴロン\x8D ノ サト -フユ-", Select_LoadGame, 0x9400 },
- // " 11-0: Goron Village -Spring-" (" 11-0: Goron Village - Spring")
- { " 11-0:\x8Cゴロン\x8D ノ サト -ハル-", Select_LoadGame, 0x8A00 },
- // " 11-1: Goron Shrine" (" 11-1: Goron Shrine")
- { " 11-1:\x8Cゴロン\x8D ノ ホコラ", Select_LoadGame, 0x5E00 },
- // " 11-2: Lone Peak Shrine" (" 11-2: Lone Peak Shrine")
- { " 11-2:\x8Dハナレヤマ ノ ホコラ", Select_LoadGame, 0x1500 },
- // " 11-3: Goron Shop" (" 11-3: Goron Shop")
- { " 11-3:\x8Cゴロン \x8Dノ ミセ", Select_LoadGame, 0x7400 },
- // " 12: Snowhead" (" 12: Snowhead")
- { " 12:\x8Cスノーヘッド", Select_LoadGame, 0xB200 },
- // " 13: Blizzard Path" (" 13: Path to Goron Village - Part 1")
- { " 13:\x8Dフブキ ノ ミチ", Select_LoadGame, 0x3200 },
- // " 14: Snowball Path" (" 14: Path to Goron Village - Part 2")
- { " 14:\x8Dユキダマ ノ ミチ", Select_LoadGame, 0xB000 },
- // " 15: Goron Racetrack" (" 15: Goron Racetrack")
- { " 15:\x8Cゴロンレース \x8Dジョウ", Select_LoadGame, 0xD000 },
- // " 16: Goron Grave" (" 16: Darmani's Grave")
- { " 16:\x8Cゴロン \x8Dノ ハカ", Select_LoadGame, 0x9600 },
- // " 17: Snow Field Battle -Winter-" (" 17: Path to Goron Village - Winter")
- { " 17:\x8Dセツゲン \x8Cバトル \x8D-フユ-", Select_LoadGame, 0xB400 },
- // " 17-0: Snow Field Battle -Spring-" (" 17-0: Path to Goron Village - Spring")
- { " 17-0:\x8Dセツゲン \x8Cバトル \x8D-ハル-", Select_LoadGame, 0xB600 },
- // " 20: Swampland" (" 20: Southern Swamp")
- { " 20:\x8Dヌマチ", Select_LoadGame, 0x8400 },
- // " 20-0: Swampland - Afterwards" (" 20-0: Southern Swamp - After Odolwa")
- { " 20-0:\x8Dヌマチ ソノゴ", Select_LoadGame, 0xC00 },
- // " 20-1: Swamp Tourist Information" (" 20-1: Tourist Information")
- { " 20-1:\x8Dヌマ ノ カンコウアンナイ", Select_LoadGame, 0xA800 },
- // " 20-2: Magic Hags' Potion Shop" (" 20-2: Magic Hags' Potion Shop")
- { " 20-2:\x8Dマホウオババ ノ クスリヤ", Select_LoadGame, 0x400 },
- // " 21: Wood Mountain" (" 21: Woodfall")
- { " 21:\x8Cウッドマウンテン", Select_LoadGame, 0x8600 },
- // " 21-0: Deku Princess's Prison" (" 21-0: Deku Princess's Prison [Cutscene: Tatl Apologizes]")
- { " 21-0:\x8Cデク\x8Dヒメ ノ ロウヤ", Select_LoadGame, 0x3010 },
- // " 22: Deku Castle" (" 22: Deku Palace")
- { " 22:\x8Cデクナッツ \x8Dノ シロ", Select_LoadGame, 0x5000 },
- // " 22-0: Boe Hole 0" (" 22-0: Deku Palace Grotto 0 - Deku Baba & Butterflies, Entrance 1")
- { " 22-0:\x8Cクロスケ \x8Dノ アナ0", Select_LoadGame, 0x1460 },
- // " 22-1: Boe Hole 1" (" 22-1: Deku Palace Grotto 1 - Deku Baba & Butterflies, Entrance 2")
- { " 22-1:\x8Cクロスケ \x8Dノ アナ1", Select_LoadGame, 0x14E0 },
- // " 22-2: Boe Hole 2" (" 22-2: Deku Palace Grotto 2 - Skullwalltula Wall, Lower Entrance")
- { " 22-2:\x8Cクロスケ \x8Dノ アナ2", Select_LoadGame, 0x1480 },
- // " 22-3: Boe Hole 3" (" 22-3: Deku Palace Grotto 3 - Skullwalltula Wall, Upper Entrance")
- { " 22-3:\x8Cクロスケ \x8Dノ アナ3", Select_LoadGame, 0x14F0 },
- // " 22-4: Boe Hole 4" (" 22-4: Deku Palace Grotto 4 - Bean Seller")
- { " 22-4:\x8Cクロスケ \x8Dノ アナ4", Select_LoadGame, 0x14C0 },
- // " 24: Beast Path" (" 24: Road to Swamp")
- { " 24:\x8Dケモノミチ", Select_LoadGame, 0x7A00 },
- // " 24-0: Forest Shooting Gallery" (" 24-0: Swamp Shooting Gallery")
- { " 24-0:\x8Dモリ ノ シャテキジョウ", Select_LoadGame, 0x4200 },
- // " 25: Deku King's Chamber" (" 25: Deku Palace Throne Room")
- { " 25:\x8Cデク\x8Dオウ ノ マ", Select_LoadGame, 0x7600 },
- // " 26: Woods of Mystery" (" 26: Woods of Mystery")
- { " 26:\x8Dフシギ ノ モリ", Select_LoadGame, 0xC200 },
- // " 30: Great Bay Coast" (" 30: Great Bay Coast - Entrance Area")
- { " 30:\x8Cグレートベイ\x8D ノ カイガン", Select_LoadGame, 0x6800 },
- // " 30-0: Ocean Laboratory" (" 30-0: Marine Research Lab")
- { " 30-0:\x8Dカイヨウ ケンキュウジョ", Select_LoadGame, 0x5800 },
- // " 30-1: Fisherman's House" (" 30-1: Fisherman's Hut")
- { " 30-1:\x8Dリョウシ ノ イエ", Select_LoadGame, 0x7200 },
- // " 30-2: Pointed Rock" (" 30-2: Twin Pillars")
- { " 30-2:\x8Dトンガリ イワ", Select_LoadGame, 0x4400 },
- // " 31: Cape" (" 31: Great Bay Coast - River Area")
- { " 31:\x8Dミサキ", Select_LoadGame, 0x6A00 },
- // " 32: Outside of Pirates' Fortress" (" 32: Pirates' Fortress - Exterior")
- { " 32:\x8Dカイゾクノトリデマエ", Select_LoadGame, 0x7000 },
- // " 32-0: Pirates' Fortress" (" 32-0: Pirates' Fortress - Courtyard")
- { " 32-0:\x8Dカイゾクノトリデ", Select_LoadGame, 0x2200 },
- // " 32-1: Pirates' Fortress - Telescope" (" 32-1: Pirates' Fortress - Secret Entrance (Looking Through
- // Telescope)")
- { " 32-1:\x8Dカイゾクノトリデ ボウエンキョウ", Select_LoadGame, 0x22A0 },
- // " 32-2: Pirates' Fortress - Interior 0" (" 32-2: Pirates' Fortress - Throne Room")
- { " 32-2:\x8Dカイゾクノトリデナイブ0", Select_LoadGame, 0x4000 },
- // " 32-3: Pirates' Fortress - Interior 1" (" 32-3: Pirates' Fortress - View of Throne Room, Wasp Nest")
- { " 32-3:\x8Dカイゾクノトリデナイブ1", Select_LoadGame, 0x4010 },
- // " 32-4: Pirates' Fortress - Interior 2" (" 32-4: Pirates' Fortress - Tempting Treasure Chest, Leading to 32-5")
- { " 32-4:\x8Dカイゾクノトリデナイブ2", Select_LoadGame, 0x4020 },
- // " 32-5: Pirates' Fortress - Interior 3" (" 32-5: Pirates' Fortress - Zora Egg Room, One Shell Blade")
- { " 32-5:\x8Dカイゾクノトリデナイブ3", Select_LoadGame, 0x4030 },
- // " 32-6: Pirates' Fortress - Interior 4" (" 32-6: Pirates' Fortress - Oil Drum Room, Leading to 32-7")
- { " 32-6:\x8Dカイゾクノトリデナイブ4", Select_LoadGame, 0x4040 },
- // " 32-7: Pirates' Fortress - Interior 5" (" 32-7: Pirates' Fortress - Zora Egg Room, One Shell Blade")
- { " 32-7:\x8Dカイゾクノトリデナイブ5", Select_LoadGame, 0x4050 },
- // " 32-8: Pirates' Fortress - Interior 6" (" 32-8: Pirates' Fortress - Fenced Indoor Walkway, Leading to 32-9")
- { " 32-8:\x8Dカイゾクノトリデナイブ6", Select_LoadGame, 0x4060 },
- // " 32-9: Pirates' Fortress - Interior 7" (" 32-9: Pirates' Fortress - Zora Egg Room, One Desbreko & Treasure
- // Chest")
- { " 32-9:\x8Dカイゾクノトリデナイブ7", Select_LoadGame, 0x4070 },
- // " 32-10: Pirates' Fortress - Interior 8" (" 32-10: Pirates' Fortress - End of Secret Entrance (Telescope
- // Room)")
- { " 32-10:\x8Dカイゾクノトリデナイブ8", Select_LoadGame, 0x4080 },
- // " 32-11: Pirates' Fortress - Interior 9" (" 32-11: Pirates' Fortress - Start of Secret Entrance")
- { " 32-11:\x8Dカイゾクノトリデナイブ9", Select_LoadGame, 0x4090 },
- // " 33: Zora Shrine" (" 33: Zora Hall")
- { " 33:\x8Cゾーラ \x8Dノ ホコラ", Select_LoadGame, 0x6000 },
- // " 33-0: Zora Shop" (" 33-0: Zora Shop")
- { " 33-0:\x8Cゾーラ \x8Dノ ミセ", Select_LoadGame, 0x9250 },
- // " 33-1: Zora Waiting Room" (" 33-1: Mikau & Tijo's Room")
- { " 33-1:\x8Cゾーラ \x8Dノ ヒカエシツ", Select_LoadGame, 0x9200 },
- // " 34: Great Bay" (" 34: Great Bay [Cutscene: Pirates Approach Temple]")
- { " 34:\x8Cグレートベイ", Select_LoadGame, 0xBE00 },
- // " 35: Mountain Stream Above Falls" (" 35: Waterfall Rapids")
- { " 35:\x8Dタキウエ ノ ケイリュウ", Select_LoadGame, 0x8E00 },
- // " 40: Rock Building Shaft" (" 40: Stone Tower")
- { " 40:\x8Cロックビル\x8D ノ タテアナ", Select_LoadGame, 0xAA00 },
- // " 40-0: Heaven & Earth Are Overturned" (" 40-0: Stone Tower [Cutscene: Tower is Flipped]")
- { " 40-0:\x8Dテンチ ギャクテン", Select_LoadGame, 0xAC00 },
- // " 41: Road to Ikana" (" 41: Road to Ikana")
- { " 41:\x8Cイカーナ \x8Dヘノ ミチ", Select_LoadGame, 0xA000 },
- // " 42: Ancient Castle of Ikana" (" 42: Ancient Castle of Ikana")
- { " 42:\x8Cイカーナ\x8D コジョウ", Select_LoadGame, 0x3400 },
- // " 42-0: Ancient Castle of Ikana - Interior" (" 42-0: Ancient Castle of Ikana - Interior")
- { " 42-0:\x8Cイカーナ\x8D ノ コジョウ ナイブ", Select_LoadGame, 0x3430 },
- // " 42-B: Ancient Castle of Ikana - Boss Room" (" 42-B: Ikana King's Throne")
- { " 42-B:\x8Cイカーナ\x8D ノ コジョウ \x8Cボス\x8Dベヤ", Select_LoadGame, 0xA600 },
- // " 43: Ikana Canyon" (" 43: Ikana Canyon")
- { " 43:\x8Cイカーナ \x8Dケイコク", Select_LoadGame, 0x2000 },
- // " 43-0: Ikana Canyon Cave" (" 43-0: Sharp's Cave")
- { " 43-0:\x8Cイカーナ \x8Dケイコク ドウクツ", Select_LoadGame, 0x20E0 },
- // " 43-1: Secom's House" (" 43-1: Sakon's Hideout")
- { " 43-1:\x8Cセコム \x8Dノ イエ", Select_LoadGame, 0x9800 },
- // " 43-2: Music Box House" (" 43-2: Music Box House")
- { " 43-2:\x8Cオルゴール ハウス", Select_LoadGame, 0xA400 },
- // " 50: Clock Town -East-" (" 50: East Clock Town")
- { " 50:\x8Cクロックタウン \x8D-ヒガシ-", Select_LoadGame, 0xD200 },
- // " 50-0: Town Target Range" (" 50-0: Shooting Gallery")
- { " 50-0:\x8Dマチ ノ シャテキジョウ", Select_LoadGame, 0x3A00 },
- // " 50-1: Honey and Darling's Shop" (" 50-1: Honey & Darling's Shop")
- { " 50-1:\x8Cハニー アンド ダーリン \x8Dノ ミセ", Select_LoadGame, 0x800 },
- // " 50-2: Treasure Chest Shop" (" 50-2: Treasure Chest Shop")
- { " 50-2:\x8Dタカラバコヤ", Select_LoadGame, 0x2800 },
- // " 50-3: Pots 'n' Pans Inn" (" 50-3: Stockpot Inn")
- { " 50-3:\x8Cナベ\x8Dカマ テイ", Select_LoadGame, 0xBC00 },
- // " 50-4: Mayor's House" (" 50-4: The Mayor's Residence")
- { " 50-4:\x8Dチョウチョウ ノ イエ", Select_LoadGame, 0 },
- // " 50-5: Milk Bar" (" 50-5: Milk Bar")
- { " 50-5:\x8Cミルクバー", Select_LoadGame, 0x2400 },
- // " 51: Clock Town -West-" (" 51: West Clock Town")
- { " 51:\x8Cクロックタウン \x8D-ニシ-", Select_LoadGame, 0xD400 },
- // " 51-0: Bomb Shop" (" 51-0: Bomb Shop")
- { " 51-0:\x8Dバクダン ヤ", Select_LoadGame, 0xCA00 },
- // " 51-1: Maniac Mart" (" 51-1: Curiosity Shop")
- { " 51-1:\x8Cマニ\x8Dヤ", Select_LoadGame, 0xE00 },
- // " 51-2: General Store" (" 51-2: Trading Post")
- { " 51-2:\x8Dザッカ ヤ", Select_LoadGame, 0x6200 },
- // " 51-3: Sword Dojo" (" 51-3: Swordsman's School")
- { " 51-3:\x8Dケンドウジョウ", Select_LoadGame, 0xA200 },
- // " 51-4: Post House" (" 51-4: Post Office")
- { " 51-4:\x8Dポストハウス", Select_LoadGame, 0x5600 },
- // " 51-5: Lottery Shop" (" 51-5: Lottery Shop")
- { " 51-5:\x8Dタカラクジヤ", Select_LoadGame, 0x6C00 },
- // " 52: Clock Town -North-" (" 52: North Clock Town")
- { " 52:\x8Cクロックタウン \x8D-キタ-", Select_LoadGame, 0xD600 },
- // " 53: Clocktown -South-" (" 53: South Clock Town")
- { " 53:\x8Cクロックタウン \x8D-ミナミ-", Select_LoadGame, 0xD800 },
- // " 53-0: Clock Tower Interior" (" 53-0: Clock Tower Interior")
- { " 53-0:\x8Dトケイトウナイブ", Select_LoadGame, 0xC000 },
- // " 54: Clock Tower Rooftop" (" 54: Clock Tower Rooftop")
- { " 54:\x8Dトケイトウ オクジョウ", Select_LoadGame, 0x2C00 },
- // " 55: Laundry Area" (" 55: Laundry Pool")
- { " 55:\x8Dセンタクジョウ", Select_LoadGame, 0xDA00 },
- // " 55-0: Maniac Mart - Rear Entrance" (" 55-0: Curiosity Shop - Back Room")
- { " 55-0:\x8Cマニ\x8Dヤ ノ ウラグチ", Select_LoadGame, 0xE10 },
- // " 55-1: Maniac Mart - Peephole" (" 55-1: Curiosity Shop Back Room - Peephole")
- { " 55-1:\x8Cマニ\x8Dヤ ノ ノゾキアナ", Select_LoadGame, 0xE20 },
- // "100: Wood Mountain Temple" ("100: Woodfall Temple")
- { "100:\x8Cウッドマウンテン \x8Dノ シンデン", Select_LoadGame, 0x3000 },
- // "100-B: Wood Mountain Temple - Boss" ("100-B: Odolwa's Lair")
- { "100-B:\x8Cウッドマウンテン \x8Dノ シンデン\x8C-ボス-", Select_LoadGame, 0x3800 },
- // "101: Snowhead Temple" ("101: Snowhead Temple")
- { "101:\x8Cスノーヘッド \x8Dノ シンデン", Select_LoadGame, 0x3C00 },
- // "101-B: Snowhead Temple - Boss" ("101-B: Goht's Lair")
- { "101-B:\x8Cスノーヘッド \x8Dノ シンデン\x8C-ボス-", Select_LoadGame, 0x8200 },
- // "102: Great Bay Temple" ("102: Great Bay Temple")
- { "102:\x8Cグレートベイ \x8Dノ シンデン", Select_LoadGame, 0x8C00 },
- // "102-B: Great Bay Temple - Boss" ("102-B: Gyorg's Lair")
- { "102-B:\x8Cグレートベイ \x8Dノ シンデン\x8C-ボス-", Select_LoadGame, 0xB800 },
- // "103: Rock Building Temple -Top Side-" ("103: Stone Tower Temple")
- { "103:\x8Cロックビル \x8Dノ シンデン-オモテー", Select_LoadGame, 0x2600 },
- // "103-0: Rock Building Temple -Underside-" ("103-0: Stone Tower Temple - Flipped")
- { "103-0:\x8Cロックビル \x8Dノ シンデン-ウラー", Select_LoadGame, 0x2A00 },
- // "103-B: Rock Building Temple - Boss" ("103-B: Twinmold's Lair")
- { "103-B:\x8Cロックビル \x8Dノ シンデン\x8C-ボス-", Select_LoadGame, 0x6600 },
- // "104: Steppe" ("104: On the Moon")
- { "104:\x8Cソウゲン", Select_LoadGame, 0xC800 },
- // "104-0: Last Deku Dungeon" ("104-0: Deku Trial")
- { "104-0:\x8Cラスト デク ダンジョン", Select_LoadGame, 0x4E00 },
- // "104-1: Last Goron Dungeon" ("104-1: Goron Trial")
- { "104-1:\x8Cラスト ゴロン ダンジョン", Select_LoadGame, 0x7800 },
- // "104-2: Last Zora Dungeon" ("104-2: Zora Trial")
- { "104-2:\x8Cラスト ゾーラ ダンジョン", Select_LoadGame, 0x8800 },
- // "104-3: Last Link Dungeon" ("104-3: Link Trial")
- { "104-3:\x8Cラスト リンク ダンジョン", Select_LoadGame, 0xC600 },
- // "104-B: Last Dungeon -Boss-" ("104-B: Majora's Lair")
- { "104-B:\x8Cラストダンジョン -ボス-", Select_LoadGame, 0x200 },
- // "119: Deku Shrine" ("119: Deku Shrine")
- { "119:\x8Cデクナッツ \x8Dノ ホコラ", Select_LoadGame, 0x9E00 },
- // "121: Secret Shrine" ("121: Secret Shrine")
- { "121:\x8Dヒミツ ノ ホコラ", Select_LoadGame, 0xBA00 },
- // "122: Opening Dungeon" ("122: Pond Area [Cutscene: Falling of the Cliff]")
- { "122:\x8Cオープニング ダンジョン", Select_LoadGame, 0x2E00 },
- // "123: Giants' Chamber" ("123: Giants' Chamber")
- { "123:\x8Dキョジン ノ マ", Select_LoadGame, 0xCC00 },
- // "126: Deku Minigame" ("126: Deku Rupee Minigame")
- { "126:\x8Cデクナッツ ミニゲーム", Select_LoadGame, 0x3600 },
- // "127-0: Fairy Fountain 0" ("127-0: Fairy Fountain - Clock Town")
- { "127-0:\x8Dヨウセイ ノ イズミ 0", Select_LoadGame, 0x4600 },
- // "127-1: Fairy Fountain 1" ("127-1: Fairy Fountain - Woodfall")
- { "127-1:\x8Dヨウセイ ノ イズミ 1", Select_LoadGame, 0x4610 },
- // "127-2: Fairy Fountain 2" ("127-2: Fairy Fountain - Snowhead")
- { "127-2:\x8Dヨウセイ ノ イズミ 2", Select_LoadGame, 0x4620 },
- // "127-3: Fairy Fountain 3" ("127-3: Fairy Fountain - Great Bay Coast")
- { "127-3:\x8Dヨウセイ ノ イズミ 3", Select_LoadGame, 0x4630 },
- // "127-4: Fairy Fountain 4" ("127-4: Fairy Fountain - Ikana Canyon")
- { "127-4:\x8Dヨウセイ ノ イズミ 4", Select_LoadGame, 0x4640 },
- // "128: Swamp Spider Manor" ("128: Swamp Spider House")
- { "128:\x8Dヌマ ノ クモヤカタ", Select_LoadGame, 0x4800 },
- // "129: Ocean Spider Manor" ("129: Oceanside Spider House")
- { "129:\x8Dウミ ノ クモヤカタ", Select_LoadGame, 0x4A00 },
- // "130: Beneath the Graves - Dampe" ("130: Beneath the Graveyard")
- { "130:\x8Dハカ ノ シタ-\x8Cダンペイ-", Select_LoadGame, 0x5A00 },
- // "131: Beneath the Well" ("131: Beneath the Well")
- { "131:\x8Dイド ノ シタ", Select_LoadGame, 0x9000 },
- // "132: Ghost Hut" (" 132: Ghost Hut")
- { "132:\x8Dユウレイゴヤ", Select_LoadGame, 0x9C00 },
- // "133-0: Beneath the Graves 0" ("133-0: Beneath the Graveyard - Part 1")
- { "133-0:\x8Dハカ ノ シタ0", Select_LoadGame, 0xA00 },
- // "133-1: Beneath the Graves 1" ("133-1: Beneath the Graveyard - Part 2")
- { "133-1:\x8Dハカ ノ シタ1", Select_LoadGame, 0xA10 },
- // "134-0: Secret Grotto 0" ("134-0: Secret Grotto - Four Gossip Stones")
- { "134-0:\x8Dカクシアナ 0", Select_LoadGame, 0x1400 },
- // "134-1: Secret Grotto 1" ("134-1: Secret Grotto - Four Gossip Stones, Skulltula")
- { "134-1:\x8Dカクシアナ 1", Select_LoadGame, 0x1410 },
- // "134-2: Secret Grotto 2" ("134-2: Secret Grotto - Four Gossip Stones, Water Puddles")
- { "134-2:\x8Dカクシアナ 2", Select_LoadGame, 0x1420 },
- // "134-3: Secret Grotto 3" ("134-3: Secret Grotto - Four Gossip Stones, Water Puddle With Bugs")
- { "134-3:\x8Dカクシアナ 3", Select_LoadGame, 0x1430 },
- // "134-4: Secret Grotto 4" ("134-4: Secret Grotto - Chest with Blue Rupee, Deku Babas")
- { "134-4:\x8Dカクシアナ 4", Select_LoadGame, 0x1440 },
- // "134-5: Secret Grotto 5" ("134-5: Secret Grotto - Hot Spring, Deku Babas, Large Stones")
- { "134-5:\x8Dカクシアナ5", Select_LoadGame, 0x1450 },
- // "134-7: Secret Grotto 7" ("134-7: Secret Grotto - Two Dondogos")
- { "134-7:\x8Dカクシアナ 7", Select_LoadGame, 0x1470 },
- // "134-9: Secret Grotto 9" ("134-9: Secret Grotto - Tall Grass With Box, Pot, Bugs")
- { "134-9:\x8Dカクシアナ 9", Select_LoadGame, 0x1490 },
- // "134-10: Secret Grotto 10" ("134-10: Secret Grotto - Two Cows Surrounded by Grass")
- { "134-10:\x8Dカクシアナ10", Select_LoadGame, 0x14A0 },
- // "134-11: Secret Grotto 11" ("134-11: Secret Grotto - Watery Hole Filled with Underwater Babas, Fish")
- { "134-11:\x8Dカクシアナ11", Select_LoadGame, 0x14B0 },
- // "134-13: Secret Grotto 13" ("134-13: Secret Grotto - Peahat in Center")
- { "134-13:\x8Dカクシアナ13", Select_LoadGame, 0x14D0 },
- // "X 1: SPOT00" ("X 1: Opening [Cutscene: Opening Cutscene]")
- { "X 1:SPOT00", Select_LoadGame, 0x1C00 },
- // "Title" ("Title Screen")
- { "title", (void*)Select_LoadTitle, 0x0000 },
+ // "0: OP Woods for Cutscene Use" (Forest Opening Scene)
+ { " 0:OP" GFXP_KATAKANA "デモ" GFXP_HIRAGANA "ヨウ シンリン", MapSelect_LoadGame, 0x1C00 },
+
+ // "0-0: Lost Woods" (Lost Woods)
+ { " 0-0:" GFXP_HIRAGANA "マヨイ ノ モリ", MapSelect_LoadGame, 0xC400 },
+
+ // "1: Town Outskirts" (Termina Field)
+ { " 1:" GFXP_KATAKANA "タウン " GFXP_HIRAGANA "コウガイ", MapSelect_LoadGame, 0x5400 },
+
+ // "1-0: Astral Observatory" (Astral Observatory)
+ { " 1-0:" GFXP_HIRAGANA "テンモンカンソクジョ", MapSelect_LoadGame, 0x4C00 },
+
+ // "1-1: Astral Observatory Telescope" (Astral Observatory - Telescope)
+ { " 1-1:" GFXP_HIRAGANA "テンモンカンソクジョ デ ボウエンキョウ", MapSelect_LoadGame, 0x54A0 },
+
+ // "1-2: Ikana Graveyard" (Ikana Canyon Graveyard)
+ { " 1-2:" GFXP_KATAKANA "イカーナ " GFXP_HIRAGANA "ノ ハカバ", MapSelect_LoadGame, 0x8000 },
+
+ // "2: Romani Ranch" (Romani Ranch)
+ { " 2:" GFXP_KATAKANA "ロマニー " GFXP_HIRAGANA "ボクジョウ", MapSelect_LoadGame, 0x6400 },
+
+ // "3: Milk Road" (Milk Road)
+ { " 3:" GFXP_KATAKANA "ミルクロード", MapSelect_LoadGame, 0x3E00 },
+
+ // "4: Main Building" ("Ranch House)
+ { " 4:" GFXP_HIRAGANA "オモヤ", MapSelect_LoadGame, 0x610 },
+
+ // "5: Cow Shed" (Cow Shed)
+ { " 5:" GFXP_HIRAGANA "ウシゴヤ", MapSelect_LoadGame, 0x600 },
+
+ // "6: Cucco Shed" (Cucco Shed)
+ { " 6:" GFXP_KATAKANA "コッコ " GFXP_HIRAGANA "ゴヤ", MapSelect_LoadGame, 0x7E00 },
+
+ // "7: Dog Racing Area" (Doggy Racetrack)
+ { " 7:" GFXP_KATAKANA "ドッグレース" GFXP_HIRAGANA "ジョウ", MapSelect_LoadGame, 0x7C00 },
+
+ // "8: Gorman Track" (Gorman Track)
+ { " 8:" GFXP_KATAKANA "ゴーマン トラック", MapSelect_LoadGame, 0xCE00 },
+
+ // "10: Mountain Village -Winter-" (Mountain Village - Winter)
+ { " 10:" GFXP_HIRAGANA "ヤマザト -フユ-", MapSelect_LoadGame, 0x9A00 },
+
+ // "10-0: Mountain Village -Spring-" (Mountain Village - Spring)
+ { " 10-0:" GFXP_HIRAGANA "ヤマザト -ハル-", MapSelect_LoadGame, 0xAE00 },
+
+ // "10-1: Mountain Village Blacksmith" (Mountain Smithy)
+ { " 10-1:" GFXP_HIRAGANA "ヤマザト ノ カジヤ", MapSelect_LoadGame, 0x5200 },
+
+ // "11: Goron Village -Winter-" (Goron Village - Winter)
+ { " 11:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA " ノ サト -フユ-", MapSelect_LoadGame, 0x9400 },
+
+ // "11-0: Goron Village -Spring-" (Goron Village - Spring)
+ { " 11-0:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA " ノ サト -ハル-", MapSelect_LoadGame, 0x8A00 },
+
+ // "11-1: Goron Shrine" (Goron Shrine)
+ { " 11-1:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA " ノ ホコラ", MapSelect_LoadGame, 0x5E00 },
+
+ // "11-2: Lone Peak Shrine" (Lone Peak Shrine)
+ { " 11-2:" GFXP_HIRAGANA "ハナレヤマ ノ ホコラ", MapSelect_LoadGame, 0x1500 },
+
+ // "11-3: Goron Shop" (Goron Shop)
+ { " 11-3:" GFXP_KATAKANA "ゴロン " GFXP_HIRAGANA "ノ ミセ", MapSelect_LoadGame, 0x7400 },
+
+ // "12: Snowhead" (Snowhead)
+ { " 12:" GFXP_KATAKANA "スノーヘッド", MapSelect_LoadGame, 0xB200 },
+
+ // "13: Blizzard Path" (Path to Goron Village - Part 1)
+ { " 13:" GFXP_HIRAGANA "フブキ ノ ミチ", MapSelect_LoadGame, 0x3200 },
+
+ // "14: Snowball Path" (Path to Goron Village - Part 2)
+ { " 14:" GFXP_HIRAGANA "ユキダマ ノ ミチ", MapSelect_LoadGame, 0xB000 },
+
+ // "15: Goron Racetrack" (Goron Racetrack)
+ { " 15:" GFXP_KATAKANA "ゴロンレース " GFXP_HIRAGANA "ジョウ", MapSelect_LoadGame, 0xD000 },
+
+ // "16: Goron Grave" (Darmani's Grave)
+ { " 16:" GFXP_KATAKANA "ゴロン " GFXP_HIRAGANA "ノ ハカ", MapSelect_LoadGame, 0x9600 },
+
+ // "17: Snow Field Battle -Winter-" (Path to Goron Village - Winter)
+ { " 17:" GFXP_HIRAGANA "セツゲン " GFXP_KATAKANA "バトル " GFXP_HIRAGANA "-フユ-", MapSelect_LoadGame, 0xB400 },
+
+ // "17-0: Snow Field Battle -Spring-" (Path to Goron Village - Spring)
+ { " 17-0:" GFXP_HIRAGANA "セツゲン " GFXP_KATAKANA "バトル " GFXP_HIRAGANA "-ハル-", MapSelect_LoadGame, 0xB600 },
+
+ // "20: Swampland" (Southern Swamp)
+ { " 20:" GFXP_HIRAGANA "ヌマチ", MapSelect_LoadGame, 0x8400 },
+
+ // "20-0: Swampland - Afterwards" (Southern Swamp - After Odolwa)
+ { " 20-0:" GFXP_HIRAGANA "ヌマチ ソノゴ", MapSelect_LoadGame, 0xC00 },
+
+ // "20-1: Swamp Tourist Information" (Tourist Information)
+ { " 20-1:" GFXP_HIRAGANA "ヌマ ノ カンコウアンナイ", MapSelect_LoadGame, 0xA800 },
+
+ // "20-2: Magic Hags' Potion Shop" (Magic Hags' Potion Shop)
+ { " 20-2:" GFXP_HIRAGANA "マホウオババ ノ クスリヤ", MapSelect_LoadGame, 0x400 },
+
+ // "21: Wood Mountain" (Woodfall)
+ { " 21:" GFXP_KATAKANA "ウッドマウンテン", MapSelect_LoadGame, 0x8600 },
+
+ // "21-0: Deku Princess's Prison" (Deku Princess's Prison Cutscene: Tatl Apologizes)
+ { " 21-0:" GFXP_KATAKANA "デク" GFXP_HIRAGANA "ヒメ ノ ロウヤ", MapSelect_LoadGame, 0x3010 },
+
+ // "22: Deku Castle" (Deku Palace)
+ { " 22:" GFXP_KATAKANA "デクナッツ " GFXP_HIRAGANA "ノ シロ", MapSelect_LoadGame, 0x5000 },
+
+ // "22-0: Boe Hole 0" (Deku Palace Grotto 0 - Deku Baba & Butterflies, Entrance 1)
+ { " 22-0:" GFXP_KATAKANA "クロスケ " GFXP_HIRAGANA "ノ アナ0", MapSelect_LoadGame, 0x1460 },
+
+ // "22-1: Boe Hole 1" (Deku Palace Grotto 1 - Deku Baba & Butterflies, Entrance 2)
+ { " 22-1:" GFXP_KATAKANA "クロスケ " GFXP_HIRAGANA "ノ アナ1", MapSelect_LoadGame, 0x14E0 },
+
+ // "22-2: Boe Hole 2" (Deku Palace Grotto 2 - Skullwalltula Wall, Lower Entrance)
+ { " 22-2:" GFXP_KATAKANA "クロスケ " GFXP_HIRAGANA "ノ アナ2", MapSelect_LoadGame, 0x1480 },
+
+ // "22-3: Boe Hole 3" (Deku Palace Grotto 3 - Skullwalltula Wall, Upper Entrance)
+ { " 22-3:" GFXP_KATAKANA "クロスケ " GFXP_HIRAGANA "ノ アナ3", MapSelect_LoadGame, 0x14F0 },
+
+ // "22-4: Boe Hole 4" (Deku Palace Grotto 4 - Bean Seller)
+ { " 22-4:" GFXP_KATAKANA "クロスケ " GFXP_HIRAGANA "ノ アナ4", MapSelect_LoadGame, 0x14C0 },
+
+ // "24: Beast Path" (Road to Swamp)
+ { " 24:" GFXP_HIRAGANA "ケモノミチ", MapSelect_LoadGame, 0x7A00 },
+
+ // "24-0: Forest Shooting Gallery" (Swamp Shooting Gallery)
+ { " 24-0:" GFXP_HIRAGANA "モリ ノ シャテキジョウ", MapSelect_LoadGame, 0x4200 },
+
+ // "25: Deku King's Chamber" (Deku Palace Throne Room)
+ { " 25:" GFXP_KATAKANA "デク" GFXP_HIRAGANA "オウ ノ マ", MapSelect_LoadGame, 0x7600 },
+
+ // "26: Woods of Mystery" (Woods of Mystery)
+ { " 26:" GFXP_HIRAGANA "フシギ ノ モリ", MapSelect_LoadGame, 0xC200 },
+
+ // "30: Great Bay Coast" (Great Bay Coast - Entrance Area)
+ { " 30:" GFXP_KATAKANA "グレートベイ" GFXP_HIRAGANA " ノ カイガン", MapSelect_LoadGame, 0x6800 },
+
+ // "30-0: Ocean Laboratory" (Marine Research Lab)
+ { " 30-0:" GFXP_HIRAGANA "カイヨウ ケンキュウジョ", MapSelect_LoadGame, 0x5800 },
+
+ // "30-1: Fisherman's House" (Fisherman's Hut)
+ { " 30-1:" GFXP_HIRAGANA "リョウシ ノ イエ", MapSelect_LoadGame, 0x7200 },
+
+ // "30-2: Pointed Rock" (Twin Pillars)
+ { " 30-2:" GFXP_HIRAGANA "トンガリ イワ", MapSelect_LoadGame, 0x4400 },
+
+ // "31: Cape" (Great Bay Coast - River Area)
+ { " 31:" GFXP_HIRAGANA "ミサキ", MapSelect_LoadGame, 0x6A00 },
+
+ // "32: Outside of Pirates' Fortress" (Pirates' Fortress - Exterior)
+ { " 32:" GFXP_HIRAGANA "カイゾクノトリデマエ", MapSelect_LoadGame, 0x7000 },
+
+ // "32-0: Pirates' Fortress" (Pirates' Fortress - Courtyard)
+ { " 32-0:" GFXP_HIRAGANA "カイゾクノトリデ", MapSelect_LoadGame, 0x2200 },
+
+ // "32-1: Pirates' Fortress - Telescope" (Pirates' Fortress - Secret Entrance, Looking Through Telescope)
+ { " 32-1:" GFXP_HIRAGANA "カイゾクノトリデ ボウエンキョウ", MapSelect_LoadGame, 0x22A0 },
+
+ // "32-2: Pirates' Fortress - Interior 0" (Pirates' Fortress - Throne Room)
+ { " 32-2:" GFXP_HIRAGANA "カイゾクノトリデナイブ0", MapSelect_LoadGame, 0x4000 },
+
+ // "32-3: Pirates' Fortress - Interior 1" (Pirates' Fortress - View of Throne Room, Wasp Nest)
+ { " 32-3:" GFXP_HIRAGANA "カイゾクノトリデナイブ1", MapSelect_LoadGame, 0x4010 },
+
+ // "32-4: Pirates' Fortress - Interior 2" (Pirates' Fortress - Tempting Treasure Chest, Leading to 32-5)
+ { " 32-4:" GFXP_HIRAGANA "カイゾクノトリデナイブ2", MapSelect_LoadGame, 0x4020 },
+
+ // "32-5: Pirates' Fortress - Interior 3" (Pirates' Fortress - Zora Egg Room, One Shell Blade)
+ { " 32-5:" GFXP_HIRAGANA "カイゾクノトリデナイブ3", MapSelect_LoadGame, 0x4030 },
+
+ // "32-6: Pirates' Fortress - Interior 4" (Pirates' Fortress - Oil Drum Room, Leading to 32-7)
+ { " 32-6:" GFXP_HIRAGANA "カイゾクノトリデナイブ4", MapSelect_LoadGame, 0x4040 },
+
+ // "32-7: Pirates' Fortress - Interior 5" (Pirates' Fortress - Zora Egg Room, One Shell Blade)
+ { " 32-7:" GFXP_HIRAGANA "カイゾクノトリデナイブ5", MapSelect_LoadGame, 0x4050 },
+
+ // "32-8: Pirates' Fortress - Interior 6" (Pirates' Fortress - Fenced Indoor Walkway, Leading to 32-9)
+ { " 32-8:" GFXP_HIRAGANA "カイゾクノトリデナイブ6", MapSelect_LoadGame, 0x4060 },
+
+ // "32-9: Pirates' Fortress - Interior 7" (Pirates' Fortress - Zora Egg Room, One Desbreko & Treasure Chest)
+ { " 32-9:" GFXP_HIRAGANA "カイゾクノトリデナイブ7", MapSelect_LoadGame, 0x4070 },
+
+ // "32-10: Pirates' Fortress - Interior 8" (Pirates' Fortress - End of Secret Entrance: Telescope Room)
+ { " 32-10:" GFXP_HIRAGANA "カイゾクノトリデナイブ8", MapSelect_LoadGame, 0x4080 },
+
+ // "32-11: Pirates' Fortress - Interior 9" (Pirates' Fortress - Start of Secret Entrance)
+ { " 32-11:" GFXP_HIRAGANA "カイゾクノトリデナイブ9", MapSelect_LoadGame, 0x4090 },
+
+ // "33: Zora Shrine" (Zora Hall)
+ { " 33:" GFXP_KATAKANA "ゾーラ " GFXP_HIRAGANA "ノ ホコラ", MapSelect_LoadGame, 0x6000 },
+
+ // "33-0: Zora Shop" (Zora Shop)
+ { " 33-0:" GFXP_KATAKANA "ゾーラ " GFXP_HIRAGANA "ノ ミセ", MapSelect_LoadGame, 0x9250 },
+
+ // "33-1: Zora Waiting Room" (Mikau & Tijo's Room)
+ { " 33-1:" GFXP_KATAKANA "ゾーラ " GFXP_HIRAGANA "ノ ヒカエシツ", MapSelect_LoadGame, 0x9200 },
+
+ // "34: Great Bay" (Great Bay Cutscene: Pirates Approach Temple)
+ { " 34:" GFXP_KATAKANA "グレートベイ", MapSelect_LoadGame, 0xBE00 },
+
+ // "35: Mountain Stream Above Falls" (Waterfall Rapids)
+ { " 35:" GFXP_HIRAGANA "タキウエ ノ ケイリュウ", MapSelect_LoadGame, 0x8E00 },
+
+ // "40: Rock Building Shaft" (Stone Tower)
+ { " 40:" GFXP_KATAKANA "ロックビル" GFXP_HIRAGANA " ノ タテアナ", MapSelect_LoadGame, 0xAA00 },
+
+ // "40-0: Heaven & Earth Are Overturned" (Stone Tower Cutscene: Tower is Flipped)
+ { " 40-0:" GFXP_HIRAGANA "テンチ ギャクテン", MapSelect_LoadGame, 0xAC00 },
+
+ // "41: Road to Ikana" (Road to Ikana)
+ { " 41:" GFXP_KATAKANA "イカーナ " GFXP_HIRAGANA "ヘノ ミチ", MapSelect_LoadGame, 0xA000 },
+
+ // "42: Ancient Castle of Ikana" (Ancient Castle of Ikana)
+ { " 42:" GFXP_KATAKANA "イカーナ" GFXP_HIRAGANA " コジョウ", MapSelect_LoadGame, 0x3400 },
+
+ // "42-0: Ancient Castle of Ikana - Interior" (Ancient Castle of Ikana - Interior)
+ { " 42-0:" GFXP_KATAKANA "イカーナ" GFXP_HIRAGANA " ノ コジョウ ナイブ", MapSelect_LoadGame, 0x3430 },
+
+ // "42-B: Ancient Castle of Ikana - Boss Room" (Ikana King's Throne)
+ { " 42-B:" GFXP_KATAKANA "イカーナ" GFXP_HIRAGANA " ノ コジョウ " GFXP_KATAKANA "ボス" GFXP_HIRAGANA "ベヤ",
+ MapSelect_LoadGame, 0xA600 },
+
+ // "43: Ikana Canyon" (Ikana Canyon)
+ { " 43:" GFXP_KATAKANA "イカーナ " GFXP_HIRAGANA "ケイコク", MapSelect_LoadGame, 0x2000 },
+
+ // "43-0: Ikana Canyon Cave" (Sharp's Cave)
+ { " 43-0:" GFXP_KATAKANA "イカーナ " GFXP_HIRAGANA "ケイコク ドウクツ", MapSelect_LoadGame, 0x20E0 },
+
+ // "43-1: Secom's House" (Sakon's Hideout)
+ { " 43-1:" GFXP_KATAKANA "セコム " GFXP_HIRAGANA "ノ イエ", MapSelect_LoadGame, 0x9800 },
+
+ // "43-2: Music Box House" (Music Box House)
+ { " 43-2:" GFXP_KATAKANA "オルゴール ハウス", MapSelect_LoadGame, 0xA400 },
+
+ // "50: Clock Town -East-" (East Clock Town)
+ { " 50:" GFXP_KATAKANA "クロックタウン " GFXP_HIRAGANA "-ヒガシ-", MapSelect_LoadGame, 0xD200 },
+
+ // "50-0: Town Target Range" (Shooting Gallery)
+ { " 50-0:" GFXP_HIRAGANA "マチ ノ シャテキジョウ", MapSelect_LoadGame, 0x3A00 },
+
+ // "50-1: Honey and Darling's Shop" (Honey & Darling's Shop)
+ { " 50-1:" GFXP_KATAKANA "ハニー アンド ダーリン " GFXP_HIRAGANA "ノ ミセ", MapSelect_LoadGame, 0x800 },
+
+ // "50-2: Treasure Chest Shop" (Treasure Chest Shop)
+ { " 50-2:" GFXP_HIRAGANA "タカラバコヤ", MapSelect_LoadGame, 0x2800 },
+
+ // "50-3: Pots 'n' Pans Inn" (Stockpot Inn)
+ { " 50-3:" GFXP_KATAKANA "ナベ" GFXP_HIRAGANA "カマ テイ", MapSelect_LoadGame, 0xBC00 },
+
+ // "50-4: Mayor's House" (The Mayor's Residence)
+ { " 50-4:" GFXP_HIRAGANA "チョウチョウ ノ イエ", MapSelect_LoadGame, 0 },
+
+ // "50-5: Milk Bar" (Milk Bar)
+ { " 50-5:" GFXP_KATAKANA "ミルクバー", MapSelect_LoadGame, 0x2400 },
+
+ // "51: Clock Town -West-" (West Clock Town)
+ { " 51:" GFXP_KATAKANA "クロックタウン " GFXP_HIRAGANA "-ニシ-", MapSelect_LoadGame, 0xD400 },
+
+ // "51-0: Bomb Shop" (Bomb Shop)
+ { " 51-0:" GFXP_HIRAGANA "バクダン ヤ", MapSelect_LoadGame, 0xCA00 },
+
+ // "51-1: Maniac Mart" (Curiosity Shop)
+ { " 51-1:" GFXP_KATAKANA "マニ" GFXP_HIRAGANA "ヤ", MapSelect_LoadGame, 0xE00 },
+
+ // "51-2: General Store" (Trading Post)
+ { " 51-2:" GFXP_HIRAGANA "ザッカ ヤ", MapSelect_LoadGame, 0x6200 },
+
+ // "51-3: Sword Dojo" (Swordsman's School)
+ { " 51-3:" GFXP_HIRAGANA "ケンドウジョウ", MapSelect_LoadGame, 0xA200 },
+
+ // "51-4: Post House" (Post Office)
+ { " 51-4:" GFXP_HIRAGANA "ポストハウス", MapSelect_LoadGame, 0x5600 },
+
+ // "51-5: Lottery Shop" (Lottery Shop)
+ { " 51-5:" GFXP_HIRAGANA "タカラクジヤ", MapSelect_LoadGame, 0x6C00 },
+
+ // "52: Clock Town -North-" (North Clock Town)
+ { " 52:" GFXP_KATAKANA "クロックタウン " GFXP_HIRAGANA "-キタ-", MapSelect_LoadGame, 0xD600 },
+
+ // "53: Clocktown -South-" (South Clock Town)
+ { " 53:" GFXP_KATAKANA "クロックタウン " GFXP_HIRAGANA "-ミナミ-", MapSelect_LoadGame, 0xD800 },
+
+ // "53-0: Clock Tower Interior" (Clock Tower Interior)
+ { " 53-0:" GFXP_HIRAGANA "トケイトウナイブ", MapSelect_LoadGame, 0xC000 },
+
+ // "54: Clock Tower Rooftop" (Clock Tower Rooftop)
+ { " 54:" GFXP_HIRAGANA "トケイトウ オクジョウ", MapSelect_LoadGame, 0x2C00 },
+
+ // "55: Laundry Area" (Laundry Pool)
+ { " 55:" GFXP_HIRAGANA "センタクジョウ", MapSelect_LoadGame, 0xDA00 },
+
+ // "55-0: Maniac Mart - Rear Entrance" (Curiosity Shop - Back Room)
+ { " 55-0:" GFXP_KATAKANA "マニ" GFXP_HIRAGANA "ヤ ノ ウラグチ", MapSelect_LoadGame, 0xE10 },
+
+ // "55-1: Maniac Mart - Peephole" (Curiosity Shop Back Room - Peephole)
+ { " 55-1:" GFXP_KATAKANA "マニ" GFXP_HIRAGANA "ヤ ノ ノゾキアナ", MapSelect_LoadGame, 0xE20 },
+
+ // "100: Wood Mountain Temple" (Woodfall Temple)
+ { "100:" GFXP_KATAKANA "ウッドマウンテン " GFXP_HIRAGANA "ノ シンデン", MapSelect_LoadGame, 0x3000 },
+
+ // "100-B: Wood Mountain Temple - Boss" (Odolwa's Lair)
+ { "100-B:" GFXP_KATAKANA "ウッドマウンテン " GFXP_HIRAGANA "ノ シンデン" GFXP_KATAKANA "-ボス-", MapSelect_LoadGame, 0x3800 },
+
+ // "101: Snowhead Temple" (Snowhead Temple)
+ { "101:" GFXP_KATAKANA "スノーヘッド " GFXP_HIRAGANA "ノ シンデン", MapSelect_LoadGame, 0x3C00 },
+
+ // "101-B: Snowhead Temple - Boss" (Goht's Lair)
+ { "101-B:" GFXP_KATAKANA "スノーヘッド " GFXP_HIRAGANA "ノ シンデン" GFXP_KATAKANA "-ボス-", MapSelect_LoadGame, 0x8200 },
+
+ // "102: Great Bay Temple" (Great Bay Temple)
+ { "102:" GFXP_KATAKANA "グレートベイ " GFXP_HIRAGANA "ノ シンデン", MapSelect_LoadGame, 0x8C00 },
+
+ // "102-B: Great Bay Temple - Boss" (Gyorg's Lair)
+ { "102-B:" GFXP_KATAKANA "グレートベイ " GFXP_HIRAGANA "ノ シンデン" GFXP_KATAKANA "-ボス-", MapSelect_LoadGame, 0xB800 },
+
+ // "103: Rock Building Temple -Top Side-" (Stone Tower Temple)
+ { "103:" GFXP_KATAKANA "ロックビル " GFXP_HIRAGANA "ノ シンデン-オモテー", MapSelect_LoadGame, 0x2600 },
+
+ // "103-0: Rock Building Temple -Underside-" (Stone Tower Temple - Flipped)
+ { "103-0:" GFXP_KATAKANA "ロックビル " GFXP_HIRAGANA "ノ シンデン-ウラー", MapSelect_LoadGame, 0x2A00 },
+
+ // "103-B: Rock Building Temple - Boss" (Twinmold's Lair)
+ { "103-B:" GFXP_KATAKANA "ロックビル " GFXP_HIRAGANA "ノ シンデン" GFXP_KATAKANA "-ボス-", MapSelect_LoadGame, 0x6600 },
+
+ // "104: Steppe" (On the Moon)
+ { "104:" GFXP_KATAKANA "ソウゲン", MapSelect_LoadGame, 0xC800 },
+
+ // "104-0: Last Deku Dungeon" (Deku Trial)
+ { "104-0:" GFXP_KATAKANA "ラスト デク ダンジョン", MapSelect_LoadGame, 0x4E00 },
+
+ // "104-1: Last Goron Dungeon" (Goron Trial)
+ { "104-1:" GFXP_KATAKANA "ラスト ゴロン ダンジョン", MapSelect_LoadGame, 0x7800 },
+
+ // "104-2: Last Zora Dungeon" (Zora Trial)
+ { "104-2:" GFXP_KATAKANA "ラスト ゾーラ ダンジョン", MapSelect_LoadGame, 0x8800 },
+
+ // "104-3: Last Link Dungeon" (Link Trial)
+ { "104-3:" GFXP_KATAKANA "ラスト リンク ダンジョン", MapSelect_LoadGame, 0xC600 },
+
+ // "104-B: Last Dungeon -Boss-" (Majora's Lair)
+ { "104-B:" GFXP_KATAKANA "ラストダンジョン -ボス-", MapSelect_LoadGame, 0x200 },
+
+ // "119: Deku Shrine" (Deku Shrine)
+ { "119:" GFXP_KATAKANA "デクナッツ " GFXP_HIRAGANA "ノ ホコラ", MapSelect_LoadGame, 0x9E00 },
+
+ // "121: Secret Shrine" (Secret Shrine)
+ { "121:" GFXP_HIRAGANA "ヒミツ ノ ホコラ", MapSelect_LoadGame, 0xBA00 },
+
+ // "122: Opening Dungeon" (Pond Area Cutscene: Falling of the Cliff)
+ { "122:" GFXP_KATAKANA "オープニング ダンジョン", MapSelect_LoadGame, 0x2E00 },
+
+ // "123: Giants' Chamber" (Giants' Chamber)
+ { "123:" GFXP_HIRAGANA "キョジン ノ マ", MapSelect_LoadGame, 0xCC00 },
+
+ // "126: Deku Minigame" (Deku Rupee Minigame)
+ { "126:" GFXP_KATAKANA "デクナッツ ミニゲーム", MapSelect_LoadGame, 0x3600 },
+
+ // "127-0: Fairy Fountain 0" (Fairy Fountain - Clock Town)
+ { "127-0:" GFXP_HIRAGANA "ヨウセイ ノ イズミ 0", MapSelect_LoadGame, 0x4600 },
+
+ // "127-1: Fairy Fountain 1" (Fairy Fountain - Woodfall)
+ { "127-1:" GFXP_HIRAGANA "ヨウセイ ノ イズミ 1", MapSelect_LoadGame, 0x4610 },
+
+ // "127-2: Fairy Fountain 2" (Fairy Fountain - Snowhead)
+ { "127-2:" GFXP_HIRAGANA "ヨウセイ ノ イズミ 2", MapSelect_LoadGame, 0x4620 },
+
+ // "127-3: Fairy Fountain 3" (Fairy Fountain - Great Bay Coast)
+ { "127-3:" GFXP_HIRAGANA "ヨウセイ ノ イズミ 3", MapSelect_LoadGame, 0x4630 },
+
+ // "127-4: Fairy Fountain 4" (Fairy Fountain - Ikana Canyon)
+ { "127-4:" GFXP_HIRAGANA "ヨウセイ ノ イズミ 4", MapSelect_LoadGame, 0x4640 },
+
+ // "128: Swamp Spider Manor" (Swamp Spider House)
+ { "128:" GFXP_HIRAGANA "ヌマ ノ クモヤカタ", MapSelect_LoadGame, 0x4800 },
+
+ // "129: Ocean Spider Manor" (Oceanside Spider House)
+ { "129:" GFXP_HIRAGANA "ウミ ノ クモヤカタ", MapSelect_LoadGame, 0x4A00 },
+
+ // "130: Beneath the Graves - Dampe" (Beneath the Graveyard)
+ { "130:" GFXP_HIRAGANA "ハカ ノ シタ-" GFXP_KATAKANA "ダンペイ-", MapSelect_LoadGame, 0x5A00 },
+
+ // "131: Beneath the Well" (Beneath the Well)
+ { "131:" GFXP_HIRAGANA "イド ノ シタ", MapSelect_LoadGame, 0x9000 },
+
+ // "132: Ghost Hut" (Ghost Hut)
+ { "132:" GFXP_HIRAGANA "ユウレイゴヤ", MapSelect_LoadGame, 0x9C00 },
+
+ // "133-0: Beneath the Graves 0" (Beneath the Graveyard - Part 1)
+ { "133-0:" GFXP_HIRAGANA "ハカ ノ シタ0", MapSelect_LoadGame, 0xA00 },
+
+ // "133-1: Beneath the Graves 1" (Beneath the Graveyard - Part 2)
+ { "133-1:" GFXP_HIRAGANA "ハカ ノ シタ1", MapSelect_LoadGame, 0xA10 },
+
+ // "134-0: Secret Grotto 0" (Secret Grotto - Four Gossip Stones)
+ { "134-0:" GFXP_HIRAGANA "カクシアナ 0", MapSelect_LoadGame, 0x1400 },
+
+ // "134-1: Secret Grotto 1" (Secret Grotto - Four Gossip Stones, Skulltula)
+ { "134-1:" GFXP_HIRAGANA "カクシアナ 1", MapSelect_LoadGame, 0x1410 },
+
+ // "134-2: Secret Grotto 2" (Secret Grotto - Four Gossip Stones, Water Puddles)
+ { "134-2:" GFXP_HIRAGANA "カクシアナ 2", MapSelect_LoadGame, 0x1420 },
+
+ // "134-3: Secret Grotto 3" (Secret Grotto - Four Gossip Stones, Water Puddle With Bugs)
+ { "134-3:" GFXP_HIRAGANA "カクシアナ 3", MapSelect_LoadGame, 0x1430 },
+
+ // "134-4: Secret Grotto 4" (Secret Grotto - Chest with Blue Rupee, Deku Babas)
+ { "134-4:" GFXP_HIRAGANA "カクシアナ 4", MapSelect_LoadGame, 0x1440 },
+
+ // "134-5: Secret Grotto 5" (Secret Grotto - Hot Spring, Deku Babas, Large Stones)
+ { "134-5:" GFXP_HIRAGANA "カクシアナ5", MapSelect_LoadGame, 0x1450 },
+
+ // "134-7: Secret Grotto 7" (Secret Grotto - Two Dondogos)
+ { "134-7:" GFXP_HIRAGANA "カクシアナ 7", MapSelect_LoadGame, 0x1470 },
+
+ // "134-9: Secret Grotto 9" (Secret Grotto - Tall Grass With Box, Pot, Bugs)
+ { "134-9:" GFXP_HIRAGANA "カクシアナ 9", MapSelect_LoadGame, 0x1490 },
+
+ // "134-10: Secret Grotto 10" (Secret Grotto - Two Cows Surrounded by Grass)
+ { "134-10:" GFXP_HIRAGANA "カクシアナ10", MapSelect_LoadGame, 0x14A0 },
+
+ // "134-11: Secret Grotto 11" (Secret Grotto - Watery Hole Filled with Underwater Babas, Fish)
+ { "134-11:" GFXP_HIRAGANA "カクシアナ11", MapSelect_LoadGame, 0x14B0 },
+
+ // "134-13: Secret Grotto 13" (Secret Grotto - Peahat in Center)
+ { "134-13:" GFXP_HIRAGANA "カクシアナ13", MapSelect_LoadGame, 0x14D0 },
+
+ // "X 1: SPOT00" (Opening Cutscene)
+ { "X 1:SPOT00", MapSelect_LoadGame, 0x1C00 },
+
+ // "Title" (Title Screen)
+ { "title", (void*)MapSelect_LoadTitle, 0x0000 },
};
-void Select_UpdateMenu(SelectContext* this) {
+void MapSelect_UpdateMenu(MapSelectState* this) {
s32 playerForm;
Input* controller1 = CONTROLLER1(&this->state);
s32 stickY;
@@ -544,7 +684,7 @@ void Select_UpdateMenu(SelectContext* this) {
this->currentScene++;
this->currentScene = (this->currentScene + this->count) % this->count;
- if (this->currentScene == ((this->topDisplayedScene + 19 + this->count) % this->count)) {
+ if (this->currentScene == ((this->topDisplayedScene + this->count + 19) % this->count)) {
this->topDisplayedScene++;
this->topDisplayedScene = (this->topDisplayedScene + this->count) % this->count;
}
@@ -553,6 +693,7 @@ void Select_UpdateMenu(SelectContext* this) {
if (this->verticalInputAccumulator > 7) {
this->verticalInput = 0;
this->verticalInputAccumulator = 0;
+
if (this->currentScene == this->topDisplayedScene) {
this->topDisplayedScene -= 2;
this->topDisplayedScene = (this->topDisplayedScene + this->count) % this->count;
@@ -560,6 +701,7 @@ void Select_UpdateMenu(SelectContext* this) {
this->currentScene--;
this->currentScene = (this->currentScene + this->count) % this->count;
+
if (this->currentScene == ((this->topDisplayedScene + this->count) % this->count)) {
this->topDisplayedScene--;
this->topDisplayedScene = (this->topDisplayedScene + this->count) % this->count;
@@ -576,6 +718,7 @@ void Select_UpdateMenu(SelectContext* this) {
if (this->timerUp != 0) {
this->timerUp--;
}
+
if (this->timerUp == 0) {
this->lockUp = false;
}
@@ -583,19 +726,20 @@ void Select_UpdateMenu(SelectContext* this) {
if (this->timerDown != 0) {
this->timerDown--;
}
+
if (this->timerDown == 0) {
this->lockDown = false;
}
}
-void Select_PrintMenu(SelectContext* this, GfxPrint* printer) {
+void MapSelect_PrintMenu(MapSelectState* this, GfxPrint* printer) {
s32 i;
GfxPrint_SetColor(printer, 255, 155, 150, 255);
GfxPrint_SetPos(printer, 12, 2);
GfxPrint_Printf(printer, "ZELDA MAP SELECT");
-
GfxPrint_SetColor(printer, 255, 255, 255, 255);
+
for (i = 0; i < 20; i++) {
s32 sceneIndex;
char* sceneName;
@@ -620,62 +764,58 @@ void Select_PrintMenu(SelectContext* this, GfxPrint* printer) {
GfxPrint_Printf(printer, "OPT=%d", this->opt);
}
-// clang-format off
static const char* sLoadingMessages[] = {
- // "Please wait a minute",
- "\x8Dシバラクオマチクダサイ",
- // "Hold on a sec",
- "\x8Dチョット マッテネ",
- // "Wait a moment",
- "\x8Cウェイト ア モーメント",
- // "Loading",
- "\x8Cロード\x8Dチュウ",
- // "Now working",
- "\x8Dナウ ワーキング",
- // "Now creating",
- "\x8Dイマ ツクッテマス",
- // "It's not broken",
- "\x8Dコショウジャナイヨ",
- // "Coffee Break",
- "\x8Cコーヒー ブレイク",
- // "Please set B side",
- "\x8C" "Bメンヲセットシテクダサイ",
- // "Be patient, now",
- "\x8Dジット\x8Cガマン\x8Dノ\x8Cコ\x8Dデアッタ",
- // "Please wait just a minute",
- "\x8Dイマシバラクオマチクダサイ",
- // "Don't worry, don't worry. Take a break, take a break",
- "\x8Dアワテナイアワテナイ。ヒトヤスミヒトヤスミ。",
+ // "Please wait a minute"
+ GFXP_HIRAGANA "シバラクオマチクダサイ",
+ // "Hold on a sec"
+ GFXP_HIRAGANA "チョット マッテネ",
+ // "Wait a moment"
+ GFXP_KATAKANA "ウェイト ア モーメント",
+ // "Loading"
+ GFXP_KATAKANA "ロード" GFXP_HIRAGANA "チュウ",
+ // "Now working"
+ GFXP_HIRAGANA "ナウ ワーキング",
+ // "Now creating"
+ GFXP_HIRAGANA "イマ ツクッテマス",
+ // "It's not broken"
+ GFXP_HIRAGANA "コショウジャナイヨ",
+ // "Coffee Break"
+ GFXP_KATAKANA "コーヒー ブレイク",
+ // "Please set B side"
+ GFXP_KATAKANA "Bメンヲセットシテクダサイ",
+ // "Be patient, now"
+ GFXP_HIRAGANA "ジット" GFXP_KATAKANA "ガマン" GFXP_HIRAGANA "ノ" GFXP_KATAKANA "コ" GFXP_HIRAGANA "デアッタ",
+ // "Please wait just a minute"
+ GFXP_HIRAGANA "イマシバラクオマチクダサイ",
+ // "Don't worry, don't worry. Take a break, take a break."
+ GFXP_HIRAGANA "アワテナイアワテナイ。ヒトヤスミヒトヤスミ。",
};
-// clang-format on
-void Select_PrintLoadingMessage(SelectContext* this, GfxPrint* printer) {
- s32 index;
+void MapSelect_PrintLoadingMessage(MapSelectState* this, GfxPrint* printer) {
+ s32 randomMsg;
GfxPrint_SetPos(printer, 10, 15);
GfxPrint_SetColor(printer, 255, 255, 255, 255);
- index = Rand_ZeroOne() * ARRAY_COUNT(sLoadingMessages);
- GfxPrint_Printf(printer, "%s", sLoadingMessages[index]);
+ randomMsg = Rand_ZeroOne() * ARRAY_COUNT(sLoadingMessages);
+ GfxPrint_Printf(printer, "%s", sLoadingMessages[randomMsg]);
}
-// clang-format off
// Second column is unused
static const char* sFormLabel[][2] = {
// "17 (Adult)" // 17 (Daitetsujin)
- {"\x8D""17(オトナ)", "\x8D""17(ダイテツジン)"},
+ { GFXP_HIRAGANA "17(オトナ)", GFXP_HIRAGANA "17(ダイテツジン)" },
// "30 (Goron)" // 30 (Ice Cream -1)
- {"\x8C""30(ゴロン)", "\x8C""30(アイスクリーム-1)"},
+ { GFXP_KATAKANA "30(ゴロン)", GFXP_KATAKANA "30(アイスクリーム-1)" },
// "78 (Zora)" // 78 (Carmen +1)
- {"\x8C""78(ゾーラ)", "\x8C""78(カルメン+1)"},
+ { GFXP_KATAKANA "78(ゾーラ)", GFXP_KATAKANA "78(カルメン+1)" },
// "12 (Deku)" // 12 (Majestic)
- {"\x8C""12(デクナッツ)", "\x8C""12(マジェスティック)"},
+ { GFXP_KATAKANA "12(デクナッツ)", GFXP_KATAKANA "12(マジェスティック)" },
// "5 (Child)" // 5 (NTT Kodomo)
- {"\x8D""5(コドモ)", "\x8C""5(NTTコドモ)"},
+ { GFXP_HIRAGANA "5(コドモ)", GFXP_KATAKANA "5(NTTコドモ)" },
};
-// clang-format on
-void Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 playerForm) {
+void MapSelect_PrintAgeSetting(MapSelectState* this, GfxPrint* printer, s32 playerForm) {
s32 pad;
const char* age;
const char*(*ageTemp)[2];
@@ -706,12 +846,12 @@ void Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 playerFo
GfxPrint_Printf(printer, "Age:%s", age);
} else {
// clang-format off
- GfxPrint_Printf(printer, "Age:" "???" "(%d)", playerForm);
+ GfxPrint_Printf(printer, "Age:???" "(%d)", playerForm);
// clang-format on
}
}
-void Select_PrintCutsceneSetting(SelectContext* this, GfxPrint* printer, u16 csIndex) {
+void MapSelect_PrintCutsceneSetting(MapSelectState* this, GfxPrint* printer, u16 csIndex) {
const char* stage;
const char* day;
@@ -723,21 +863,21 @@ void Select_PrintCutsceneSetting(SelectContext* this, GfxPrint* printer, u16 csI
case 0:
// clang-format off
// "Afternoon-jara"
- gSaveContext.save.time = CLOCK_TIME(12, 0); stage = "\x8Dオヒル\x8Cジャラ";
+ gSaveContext.save.time = CLOCK_TIME(12, 0); stage = GFXP_HIRAGANA "オヒル" GFXP_KATAKANA "ジャラ";
// clang-format on
break;
case 0x8000:
// clang-format off
// "Morning-jara"
- gSaveContext.save.time = CLOCK_TIME(6, 0) + 1; stage = "\x8Dアサ \x8Cジャラ";
+ gSaveContext.save.time = CLOCK_TIME(6, 0) + 1; stage = GFXP_HIRAGANA "アサ " GFXP_KATAKANA "ジャラ";
// clang-format on
break;
case 0x8800:
gSaveContext.save.time = CLOCK_TIME(18, 1);
// "Night-jara"
- stage = "\x8Dヨル \x8Cジャラ";
+ stage = GFXP_HIRAGANA "ヨル " GFXP_KATAKANA "ジャラ";
break;
case 0xFFF0:
@@ -746,42 +886,52 @@ void Select_PrintCutsceneSetting(SelectContext* this, GfxPrint* printer, u16 csI
gSaveContext.save.time = CLOCK_TIME(12, 0); stage = "デモ00";
// clang-format on
break;
+
case 0xFFF1:
// "Cutscene 01"
stage = "デモ01";
break;
+
case 0xFFF2:
// "Cutscene 02"
stage = "デモ02";
break;
+
case 0xFFF3:
// "Cutscene 03"
stage = "デモ03";
break;
+
case 0xFFF4:
// "Cutscene 04"
stage = "デモ04";
break;
+
case 0xFFF5:
// "Cutscene 05"
stage = "デモ05";
break;
+
case 0xFFF6:
// "Cutscene 06"
stage = "デモ06";
break;
+
case 0xFFF7:
// "Cutscene 07"
stage = "デモ07";
break;
+
case 0xFFF8:
// "Cutscene 08"
stage = "デモ08";
break;
+
case 0xFFF9:
// "Cutscene 09"
stage = "デモ09";
break;
+
case 0xFFFA:
// "Cutscene 0A"
stage = "デモ0A";
@@ -791,8 +941,8 @@ void Select_PrintCutsceneSetting(SelectContext* this, GfxPrint* printer, u16 csI
stage = "???";
break;
}
- gSaveContext.environmentTime = gSaveContext.save.time;
- GfxPrint_Printf(printer, "Stage:\x8C%s", stage);
+ gSaveContext.skyboxTime = gSaveContext.save.time;
+ GfxPrint_Printf(printer, "Stage:" GFXP_KATAKANA "%s", stage);
GfxPrint_SetPos(printer, 23, 25);
GfxPrint_SetColor(printer, 255, 255, 55, 255);
@@ -800,31 +950,35 @@ void Select_PrintCutsceneSetting(SelectContext* this, GfxPrint* printer, u16 csI
switch (gSaveContext.save.day) {
case 1:
// "The First Day"
- day = "\x8Dサイショノヒ";
+ day = GFXP_HIRAGANA "サイショノヒ";
break;
+
case 2:
// "The Next Day"
- day = "\x8Dツギノヒ";
+ day = GFXP_HIRAGANA "ツギノヒ";
break;
+
case 3:
// "The Final Day"
- day = "\x8Dサイゴノヒ";
+ day = GFXP_HIRAGANA "サイゴノヒ";
break;
+
case 4:
// "Clear Day"
- day = "\x8Dクリアーノヒ";
+ day = GFXP_HIRAGANA "クリアーノヒ";
break;
+
default:
gSaveContext.save.day = 1;
// "The First Day"
- day = "\x8Dサイショノヒ";
+ day = GFXP_HIRAGANA "サイショノヒ";
break;
}
- GfxPrint_Printf(printer, "Day:\x8D%s", day);
+ GfxPrint_Printf(printer, "Day:" GFXP_HIRAGANA "%s", day);
}
-void Select_DrawMenu(SelectContext* this) {
+void MapSelect_DrawMenu(MapSelectState* this) {
GraphicsContext* gfxCtx = this->state.gfxCtx;
GfxPrint* printer;
@@ -836,9 +990,9 @@ void Select_DrawMenu(SelectContext* this) {
GfxPrint_Init(printer);
GfxPrint_Open(printer, POLY_OPA_DISP);
- Select_PrintMenu(this, printer);
- Select_PrintAgeSetting(this, printer, ((void)0, gSaveContext.save.playerForm));
- Select_PrintCutsceneSetting(this, printer, ((void)0, gSaveContext.save.cutscene));
+ MapSelect_PrintMenu(this, printer);
+ MapSelect_PrintAgeSetting(this, printer, ((void)0, gSaveContext.save.playerForm));
+ MapSelect_PrintCutsceneSetting(this, printer, ((void)0, gSaveContext.save.cutscene));
POLY_OPA_DISP = GfxPrint_Close(printer);
GfxPrint_Destroy(printer);
@@ -846,7 +1000,7 @@ void Select_DrawMenu(SelectContext* this) {
CLOSE_DISPS(gfxCtx);
}
-void Select_DrawLoadingScreen(SelectContext* this) {
+void MapSelect_DrawLoadingScreen(MapSelectState* this) {
GraphicsContext* gfxCtx = this->state.gfxCtx;
GfxPrint printer;
@@ -857,7 +1011,7 @@ void Select_DrawLoadingScreen(SelectContext* this) {
GfxPrint_Init(&printer);
GfxPrint_Open(&printer, POLY_OPA_DISP);
- Select_PrintLoadingMessage(this, &printer);
+ MapSelect_PrintLoadingMessage(this, &printer);
POLY_OPA_DISP = GfxPrint_Close(&printer);
GfxPrint_Destroy(&printer);
@@ -865,7 +1019,7 @@ void Select_DrawLoadingScreen(SelectContext* this) {
CLOSE_DISPS(gfxCtx);
}
-void Select_Draw(SelectContext* this) {
+void MapSelect_Draw(MapSelectState* this) {
GraphicsContext* gfxCtx = this->state.gfxCtx;
func_8012CF0C(gfxCtx, true, true, 0, 0, 0);
@@ -873,28 +1027,28 @@ void Select_Draw(SelectContext* this) {
SET_FULLSCREEN_VIEWPORT(&this->view);
View_RenderView(&this->view, 0xF);
if (!this->state.running) {
- Select_DrawLoadingScreen(this);
+ MapSelect_DrawLoadingScreen(this);
} else {
- Select_DrawMenu(this);
+ MapSelect_DrawMenu(this);
}
}
-void Select_Main(GameState* thisx) {
- SelectContext* this = (SelectContext*)thisx;
+void MapSelect_Main(GameState* thisx) {
+ MapSelectState* this = (MapSelectState*)thisx;
- Select_UpdateMenu(this);
- Select_Draw(this);
+ MapSelect_UpdateMenu(this);
+ MapSelect_Draw(this);
}
-void Select_Destroy(GameState* thisx) {
+void MapSelect_Destroy(GameState* thisx) {
ShrinkWindow_Destroy();
}
-void Select_Init(GameState* thisx) {
- SelectContext* this = (SelectContext*)thisx;
+void MapSelect_Init(GameState* thisx) {
+ MapSelectState* this = (MapSelectState*)thisx;
- this->state.main = Select_Main;
- this->state.destroy = Select_Destroy;
+ this->state.main = MapSelect_Main;
+ this->state.destroy = MapSelect_Destroy;
this->scenes = sScenes;
this->topDisplayedScene = 0;
diff --git a/src/overlays/gamestates/ovl_select/z_select.h b/src/overlays/gamestates/ovl_select/z_select.h
index a454a098b..4791a2427 100644
--- a/src/overlays/gamestates/ovl_select/z_select.h
+++ b/src/overlays/gamestates/ovl_select/z_select.h
@@ -3,12 +3,9 @@
#include "global.h"
-struct SelectContext;
+struct MapSelectState;
-void Select_Init(GameState* thisx);
-void Select_Destroy(GameState* thisx);
-
-typedef void (*Select_LoadFunc)(struct SelectContext*, u32, s32);
+typedef void (*Select_LoadFunc)(struct MapSelectState*, u32, s32);
typedef struct {
/* 0x00 */ char* name;
@@ -16,7 +13,7 @@ typedef struct {
/* 0x08 */ s32 entranceIndex;
} SceneSelectEntry; // size = 0xC
-typedef struct SelectContext {
+typedef struct MapSelectState {
/* 0x000 */ GameState state;
/* 0x0A8 */ View view;
/* 0x210 */ s32 count;
@@ -36,6 +33,9 @@ typedef struct SelectContext {
/* 0x270 */ s32 lockDown;
/* 0x274 */ s32 unk_274; // unused
/* 0x278 */ UNK_TYPE1 unk_278[0x08];
-} SelectContext; // size = 0x280
+} MapSelectState; // size = 0x280
+
+void MapSelect_Init(GameState* thisx);
+void MapSelect_Destroy(GameState* thisx);
#endif
diff --git a/src/overlays/gamestates/ovl_title/z_title.c b/src/overlays/gamestates/ovl_title/z_title.c
index 1c32f6490..68488b336 100644
--- a/src/overlays/gamestates/ovl_title/z_title.c
+++ b/src/overlays/gamestates/ovl_title/z_title.c
@@ -91,7 +91,7 @@ void Title_Draw(GameState* thisx) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
- gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF2, G_RM_OPA_CI | CVG_DST_WRAP);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_CLD_SURF2);
gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT,
COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 170, 255, 255, 255);
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
index aaa7c9fc6..316ad3355 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
@@ -16,6 +16,86 @@ extern UNK_TYPE D_0B000000;
extern UNK_TYPE D_0C000000;
extern UNK_TYPE D_0C006C00;
+s16 D_8082AED0[] = { 120, 60, 2, 80 };
+
+s16 D_8082AED8[] = { 20, 4, 20, 10 };
+
+s32 D_8082AEE0 = 0;
+
+s32 D_8082AEE4[] = { 0, 0, 0 };
+
+s32 D_8082AEF0[] = { 0, 0, 0, 0, 0 };
+
+s16 D_8082AF04[] = {
+ 255, 0, 0, 255, 255, 70, 0, 150, 255, 70, 0, 150, 255, 0, 0, 255,
+};
+
+s16 D_8082AF24[] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003C, 0x0000, 0x005A, 0x0000, 0x0000,
+ 0x0000, 0x0028, 0x006E, 0x0050, 0x0028, 0x0000, 0x0046, 0x0000, 0x005A, 0x005A, 0x005A, 0x0000,
+};
+
+s16 D_8082AF6C[] = {
+ 255, 255, 255, 255, 255, 255,
+};
+
+s16 D_8082AF78[] = {
+ 255, 255, 255, 255, 255, 255,
+};
+
+s16 D_8082AF84[] = {
+ 150, 150, 150, 150, 150, 150,
+};
+
+s16 D_8082AF90 = 20;
+
+s32 D_8082AF94 = 0;
+
+s32 D_8082AF98 = 0;
+
+s32 D_8082AF9C = 0;
+
+s32 D_8082AFA0 = 0;
+
+s32 D_8082AFA4 = 0;
+
+s16 D_8082AFA8 = 20;
+
+s32 D_8082AFAC = 0;
+
+void* D_8082AFB0[] = {
+ 0x020024A0, 0x020025A0, 0x020026A0, 0x020027A0, 0x020028A0,
+};
+
+s16 D_8082AFC4[] = {
+ 150, 255, 100, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+};
+
+s16 D_8082AFDC[] = {
+ 255, 80, 150, 160, 100, 240, 255, 255, 255, 255, 255, 255,
+};
+
+s16 D_8082AFF4[] = { 100, 40, 255, 0, 255, 100, 255, 255, 255, 255, 255, 255 };
+
+void* D_8082B00C[] = {
+ 0x08053000, 0x08054000, 0x08055000, 0x08056000, 0x08057000, 0x08058000,
+};
+
+s16 D_8082B024 = 1;
+
+s16 D_8082B028 = 0;
+
+s16 D_8082B02C[] = {
+ 0xFFFF, 0x0003, 0x0002, 0x0001, 0x0000, 0x0004, 0x0003, 0xFFFE, 0x0000, 0x0005, 0x0016, 0x0003, 0x0000, 0x0004,
+ 0x0002, 0x0001, 0x0001, 0x0014, 0x0005, 0xFFFE, 0x0002, 0x0013, 0x0010, 0x0004, 0x000C, 0xFFFF, 0xFFFD, 0x0007,
+ 0x000D, 0xFFFF, 0x0006, 0x0008, 0x000E, 0xFFFF, 0x0007, 0x0009, 0x000F, 0xFFFF, 0x0008, 0x000A, 0x0010, 0xFFFF,
+ 0x0009, 0x0013, 0x0011, 0xFFFF, 0x000A, 0x0005, 0x0012, 0x0006, 0xFFFD, 0x000D, 0x0012, 0x0007, 0x000C, 0x000E,
+ 0x0016, 0x0008, 0x000D, 0x000F, 0x0016, 0x0009, 0x000E, 0x0010, 0x0016, 0x000A, 0x000F, 0x0005, 0x0016, 0x000B,
+ 0x0010, 0x0005, 0xFFFF, 0x000C, 0xFFFD, 0x0016, 0x0005, 0xFFFF, 0x000A, 0x0014, 0x0004, 0xFFFF, 0x0013, 0xFFFE,
+ 0x0013, 0x000C, 0xFFFD, 0x0016, 0xFFFF, 0x0010, 0x0012, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808160A0.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80817B5C.s")
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
index 99928bb16..2854b02c6 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
@@ -1,25 +1,1098 @@
/*
* File: z_kaleido_debug.c
* Overlay: ovl_kaleido_scope
- * Description:
+ * Description: Inventory Editor
*/
#include "z_kaleido_scope.h"
+#include "interface/parameter_static/parameter_static.h"
-extern UNK_TYPE D_02001360;
-extern UNK_TYPE D_020044A0;
-extern UNK_TYPE D_02004AA0;
-extern UNK_TYPE D_0200B998;
-extern UNK_TYPE D_08062000;
-extern UNK_TYPE D_08064340;
-extern UNK_TYPE D_0B000000;
-extern UNK_TYPE D_0C000000;
-extern UNK_TYPE D_0C006C00;
+s16 sCurSection = 0;
+s16 sCurRow = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80818920.s")
+// These defines must line up with the indices of sSectionPositions
+#define INV_EDITOR_SECTION_RUPEE 0
+#define INV_EDITOR_SECTION_HEALTH_CAPACITY 1
+#define INV_EDITOR_SECTION_HEALTH 2
+#define INV_EDITOR_SECTION_ITEMS 3
+#define INV_EDITOR_SECTION_MASKS 27
+#define INV_EDITOR_SECTION_BOSS 51
+#define INV_EDITOR_SECTION_SWORD 55
+#define INV_EDITOR_SECTION_SHIELD 56
+#define INV_EDITOR_SECTION_SONGS 57
+#define INV_EDITOR_SECTION_LULLABY_INTRO 69
+#define INV_EDITOR_SECTION_NOTEBOOK 70
+#define INV_EDITOR_SECTION_QUIVER 71
+#define INV_EDITOR_SECTION_BOMB_BAG 72
+#define INV_EDITOR_SECTION_SWAMP_GOLD_SKULLS 73
+#define INV_EDITOR_SECTION_OCEAN_GOLD_SKULLS 74
+#define INV_EDITOR_SECTION_HEART_PIECE_COUNT 75
+#define INV_EDITOR_SECTION_SMALL_KEYS 76
+#define INV_EDITOR_SECTION_DUNGEON_ITEMS 80
+#define INV_EDITOR_SECTION_STRAY_FAIRIES 84
+#define INV_EDITOR_SECTION_DOUBLE_DEFENSE 88
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808190C4.s")
+// Geometry of the highlights for the selected section
+typedef struct {
+ /* 0 */ s16 screenX;
+ /* 1 */ s16 screenY;
+ /* 2 */ s16 width;
+} SectionPosition;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80819238.s")
+// clang-format off
+SectionPosition sSectionPositions[] = {
+ // Rupees (0)
+ { 65, 14, 41 },
+ // Health Capacity (1)
+ { 145, 14, 21 },
+ // Health (2)
+ { 193, 14, 35 },
+ // Items (3)
+ { 42, 37, 22 }, { 65, 37, 22 }, { 88, 37, 22 }, { 111, 37, 22 }, { 134, 37, 22 }, { 157, 37, 22 }, // row 1
+ { 42, 51, 22 }, { 65, 51, 22 }, { 88, 51, 22 }, { 111, 51, 22 }, { 134, 51, 22 }, { 157, 51, 22 }, // row 2
+ { 42, 65, 22 }, { 65, 65, 22 }, { 88, 65, 22 }, { 111, 65, 22 }, { 134, 65, 22 }, { 157, 65, 22 }, // row 3
+ { 42, 80, 22 }, { 65, 80, 22 }, { 88, 80, 22 }, { 111, 80, 22 }, { 134, 80, 22 }, { 157, 80, 22 }, // row 4
+ // Masks (27)
+ { 202, 37, 14 }, { 215, 37, 14 }, { 229, 37, 14 }, { 243, 37, 14 }, { 257, 37, 14 }, { 271, 37, 14 }, // row 1
+ { 202, 51, 14 }, { 215, 51, 14 }, { 229, 51, 14 }, { 243, 51, 14 }, { 257, 51, 14 }, { 271, 51, 14 }, // row 2
+ { 202, 65, 14 }, { 215, 65, 14 }, { 229, 65, 14 }, { 243, 65, 14 }, { 257, 65, 14 }, { 271, 65, 14 }, // row 3
+ { 202, 80, 14 }, { 215, 80, 14 }, { 229, 80, 14 }, { 243, 80, 14 }, { 257, 80, 14 }, { 271, 80, 14 }, // row 4
+ // Boss (51)
+ { 42, 111, 14 }, { 54, 111, 14 }, { 66, 111, 14 }, { 78, 111, 14 },
+ // Sword (55)
+ { 114, 99, 14 },
+ // Shield (56)
+ { 142, 99, 14 },
+ // Songs (57)
+ { 188, 99, 14 }, { 202, 99, 14 }, { 216, 99, 14 }, { 230, 99, 14 }, { 244, 99, 14 }, { 258, 99, 14 },
+ { 188, 113, 14 }, { 202, 113, 14 }, { 216, 113, 14 }, { 230, 113, 14 }, { 244, 113, 14 }, { 258, 113, 14 },
+ // Goron Lullaby Intro (69)
+ { 272, 113, 14 },
+ // Bombers Notebook (70)
+ { 54, 141, 14 },
+ // Quiver Upgrade (71)
+ { 112, 134, 14 },
+ // Bomb Bag Upgrade (72)
+ { 155, 134, 14 },
+ // Gold Skulltula Count (73)
+ { 194, 130, 32 }, { 194, 144, 32 },
+ // Heart Piece Count (75)
+ { 262, 134, 14 },
+ // Small Keys (76)
+ { 43, 168, 14 }, { 55, 168, 14 }, { 67, 168, 14 }, { 79, 168, 14 },
+ // Dungeon Items (80)
+ { 127, 168, 14 }, { 139, 168, 14 }, { 151, 168, 14 }, { 163, 168, 14 },
+ // Stray Fairies (84)
+ { 202, 168, 22 }, { 223, 168, 22 }, { 244, 168, 22 }, { 265, 168, 22 },
+ // Life (88)
+ { 42, 202, 14 },
+ // Magic
+ { 73, 202, 14 },
+ // Lottery
+ { 136, 202, 38 },
+ // Gold Color/Bombers Code (not highlighted properly)
+ { 214, 202, 74 }, { 214, 202, 74 },
+};
+// clang-format on
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80819F04.s")
+s16 sSlotItems[] = {
+ // Items Row 1
+ ITEM_OCARINA,
+ ITEM_BOW,
+ ITEM_ARROW_FIRE,
+ ITEM_ARROW_ICE,
+ ITEM_ARROW_LIGHT,
+ ITEM_OCARINA_FAIRY,
+ // Items Row 2
+ ITEM_BOMB,
+ ITEM_BOMBCHU,
+ ITEM_STICK,
+ ITEM_NUT,
+ ITEM_MAGIC_BEANS,
+ ITEM_SLINGSHOT,
+ // Items Row 3
+ ITEM_POWDER_KEG,
+ ITEM_PICTO_BOX,
+ ITEM_LENS,
+ ITEM_HOOKSHOT,
+ ITEM_SWORD_GREAT_FAIRY,
+ ITEM_LONGSHOT,
+ // Items Row 4
+ ITEM_BOTTLE,
+ ITEM_POTION_RED,
+ ITEM_POTION_GREEN,
+ ITEM_POTION_BLUE,
+ ITEM_FAIRY,
+ ITEM_MUSHROOM,
+ // Masks Row 1
+ ITEM_MASK_POSTMAN,
+ ITEM_MASK_ALL_NIGHT,
+ ITEM_MASK_BLAST,
+ ITEM_MASK_STONE,
+ ITEM_MASK_GREAT_FAIRY,
+ ITEM_MASK_DEKU,
+ // Masks Row 2
+ ITEM_MASK_KEATON,
+ ITEM_MASK_BREMEN,
+ ITEM_MASK_BUNNY,
+ ITEM_MASK_DON_GERO,
+ ITEM_MASK_SCENTS,
+ ITEM_MASK_GORON,
+ // Masks Row 3
+ ITEM_MASK_ROMANI,
+ ITEM_MASK_CIRCUS_LEADER,
+ ITEM_MASK_KAFEIS_MASK,
+ ITEM_MASK_COUPLE,
+ ITEM_MASK_TRUTH,
+ ITEM_MASK_ZORA,
+ // Masks Row 4
+ ITEM_MASK_KAMARO,
+ ITEM_MASK_GIBDO,
+ ITEM_MASK_GARO,
+ ITEM_MASK_CAPTAIN,
+ ITEM_MASK_GIANT,
+ ITEM_MASK_FIERCE_DEITY,
+};
+
+s16 sRowFirstSections[] = {
+ INV_EDITOR_SECTION_RUPEE,
+ INV_EDITOR_SECTION_HEALTH_CAPACITY,
+ INV_EDITOR_SECTION_HEALTH,
+ INV_EDITOR_SECTION_ITEMS,
+ INV_EDITOR_SECTION_MASKS,
+ INV_EDITOR_SECTION_BOSS,
+ INV_EDITOR_SECTION_SWORD,
+ INV_EDITOR_SECTION_SHIELD,
+ INV_EDITOR_SECTION_SONGS,
+ INV_EDITOR_SECTION_NOTEBOOK,
+ INV_EDITOR_SECTION_QUIVER,
+ INV_EDITOR_SECTION_BOMB_BAG,
+ INV_EDITOR_SECTION_SWAMP_GOLD_SKULLS,
+ INV_EDITOR_SECTION_HEART_PIECE_COUNT,
+ INV_EDITOR_SECTION_SMALL_KEYS,
+ INV_EDITOR_SECTION_DUNGEON_ITEMS,
+ INV_EDITOR_SECTION_STRAY_FAIRIES,
+ INV_EDITOR_SECTION_DOUBLE_DEFENSE,
+};
+
+void KaleidoScope_DrawInventoryEditorText(Gfx** gfxp) {
+ GfxPrint printer;
+ s32 pad[2];
+
+ GfxPrint_Init(&printer);
+ GfxPrint_Open(&printer, *gfxp);
+
+ // Rupees
+ GfxPrint_SetPos(&printer, 4, 2);
+ GfxPrint_SetColor(&printer, 255, 60, 0, 255);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ルピー");
+
+ // Hearts
+ GfxPrint_SetPos(&printer, 15, 2);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ハート");
+ GfxPrint_SetPos(&printer, 15, 3);
+ GfxPrint_Printf(&printer, "%s", "MAX");
+ GfxPrint_SetPos(&printer, 21, 3);
+ GfxPrint_Printf(&printer, "%s", "NOW");
+ GfxPrint_SetPos(&printer, 28, 3);
+ GfxPrint_Printf(&printer, "%s", "/4");
+
+ // Items
+ GfxPrint_SetPos(&printer, 4, 5);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ア");
+ GfxPrint_SetPos(&printer, 4, 6);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "イ");
+ GfxPrint_SetPos(&printer, 4, 7);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "テ");
+ GfxPrint_SetPos(&printer, 4, 8);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ム");
+
+ // Masks
+ GfxPrint_SetPos(&printer, 24, 5);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "マ");
+ GfxPrint_SetPos(&printer, 24, 6);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ス");
+ GfxPrint_SetPos(&printer, 24, 7);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ク");
+
+ // Boss (Remains)
+ GfxPrint_SetPos(&printer, 4, 13);
+ GfxPrint_Printf(&printer, "%s", "BOSS");
+
+ // Sword
+ GfxPrint_SetPos(&printer, 13, 13);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ケ");
+ GfxPrint_SetPos(&printer, 13, 14);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ン");
+
+ // Shield
+ GfxPrint_SetPos(&printer, 17, 13);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "タ");
+ GfxPrint_SetPos(&printer, 17, 14);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "テ");
+
+ // Ocarina (Songs)
+ GfxPrint_SetPos(&printer, 21, 13);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "オカ");
+ GfxPrint_SetPos(&printer, 21, 14);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "リナ");
+
+ // Schedule (Bombers Notebook)
+ GfxPrint_SetPos(&printer, 4, 17);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "スケジュール");
+
+ // Quiver
+ GfxPrint_SetPos(&printer, 12, 17);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ヤ");
+ GfxPrint_SetPos(&printer, 12, 18);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "タテ");
+
+ // Bomb Bag
+ GfxPrint_SetPos(&printer, 16, 17);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ボム");
+ GfxPrint_SetPos(&printer, 16, 18);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "フクロ");
+
+ // Gold Skulls
+ GfxPrint_SetPos(&printer, 22, 17);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "キン");
+ GfxPrint_SetPos(&printer, 22, 18);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "スタ");
+
+ // Heart Pieces
+ GfxPrint_SetPos(&printer, 29, 17);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ハート");
+ GfxPrint_SetPos(&printer, 29, 18);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "カケラ");
+ GfxPrint_SetPos(&printer, 34, 18);
+ GfxPrint_Printf(&printer, "%s", "/4");
+
+ // Keys
+ GfxPrint_SetPos(&printer, 4, 21);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "カ");
+ GfxPrint_SetPos(&printer, 4, 22);
+ GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ギ");
+
+ // Map/Compass
+ GfxPrint_SetPos(&printer, 12, 21);
+ GfxPrint_Printf(&printer, "%s", "MAP");
+ GfxPrint_SetPos(&printer, 12, 22);
+ GfxPrint_Printf(&printer, "%s", "コンパ");
+
+ // Fairies
+ GfxPrint_SetPos(&printer, 23, 21);
+ GfxPrint_Printf(&printer, "%s", "ヨウ");
+ GfxPrint_SetPos(&printer, 23, 22);
+ GfxPrint_Printf(&printer, "%s", "セイ");
+
+ // Life (double defence)
+ GfxPrint_SetPos(&printer, 4, 25);
+ GfxPrint_Printf(&printer, "%s", "イ");
+ GfxPrint_SetPos(&printer, 4, 26);
+ GfxPrint_Printf(&printer, "%s", "ノ");
+ GfxPrint_SetPos(&printer, 4, 27);
+ GfxPrint_Printf(&printer, "%s", "チ");
+
+ // Magic
+ GfxPrint_SetPos(&printer, 8, 25);
+ GfxPrint_Printf(&printer, "%s", "マ");
+ GfxPrint_SetPos(&printer, 8, 26);
+ GfxPrint_Printf(&printer, "%s", "ホ");
+ GfxPrint_SetPos(&printer, 8, 27);
+ GfxPrint_Printf(&printer, "%s", "ウ");
+
+ // Lottery
+ GfxPrint_SetPos(&printer, 13, 25);
+ GfxPrint_Printf(&printer, "%s", "タカラ");
+ GfxPrint_SetPos(&printer, 13, 26);
+ GfxPrint_Printf(&printer, "%s", "クジ");
+
+ // Gold Color (Oceanside Spider House Mask Order)
+ GfxPrint_SetPos(&printer, 23, 24);
+ GfxPrint_Printf(&printer, "%s", "キンイロ");
+
+ // Bombers (code)
+ GfxPrint_SetPos(&printer, 23, 26);
+ GfxPrint_Printf(&printer, "%s", "ボン");
+ GfxPrint_SetPos(&printer, 23, 27);
+ GfxPrint_Printf(&printer, "%s", "バーズ");
+
+ *gfxp = GfxPrint_Close(&printer);
+ GfxPrint_Destroy(&printer);
+}
+
+void KaleidoScope_DrawDigit(PlayState* play, s32 digit, s32 rectLeft, s32 rectTop) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, ((u8*)gCounterDigit0Tex + (8 * 16 * digit)), G_IM_FMT_I, G_IM_SIZ_8b, 8, 16, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSPTextureRectangle(POLY_OPA_DISP++, rectLeft << 2, rectTop << 2, (rectLeft + 8) << 2, (rectTop + 16) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_DrawInventoryEditor(PlayState* play) {
+ Gfx* gfx;
+ Gfx* gfxRef;
+ s32 counterDigits[4];
+ s16 slot;
+ s16 i;
+ s16 j;
+ s32 rectLeft;
+ s32 rectTop;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C628(play->state.gfxCtx);
+
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, 220);
+ gDPFillRectangle(POLY_OPA_DISP++, 24, 12, 298, 228);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ gfxRef = POLY_OPA_DISP;
+ gfx = Graph_GfxPlusOne(gfxRef);
+ gSPDisplayList(OVERLAY_DISP++, gfx);
+
+ KaleidoScope_DrawInventoryEditorText(&gfx);
+
+ gSPEndDisplayList(gfx++);
+ Graph_BranchDlist(gfxRef, gfx);
+ POLY_OPA_DISP = gfx;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 0, 0, 255);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ // Current Health Quarter (X / 4)
+ KaleidoScope_DrawDigit(play, (((void)0, gSaveContext.save.playerData.health) % 0x10) / 4, 217, 15);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ // Rupees
+ counterDigits[0] = counterDigits[1] = counterDigits[2] = 0;
+ counterDigits[3] = gSaveContext.save.playerData.rupees;
+ while (counterDigits[3] >= 1000) {
+ counterDigits[0]++;
+ counterDigits[3] -= 1000;
+ }
+
+ while (counterDigits[3] >= 100) {
+ counterDigits[1]++;
+ counterDigits[3] -= 100;
+ }
+
+ while (counterDigits[3] >= 10) {
+ counterDigits[2]++;
+ counterDigits[3] -= 10;
+ }
+
+ // Loop over columns (i)
+ for (i = 0, rectLeft = 68; i < 4; i++, rectLeft += 9) {
+ KaleidoScope_DrawDigit(play, counterDigits[i], rectLeft, 15);
+ }
+
+ // Health capacity
+ counterDigits[2] = 0;
+ counterDigits[3] = gSaveContext.save.playerData.healthCapacity / 0x10;
+ while (counterDigits[3] >= 10) {
+ counterDigits[2]++;
+ counterDigits[3] -= 10;
+ }
+
+ KaleidoScope_DrawDigit(play, counterDigits[2], 145, 15);
+ KaleidoScope_DrawDigit(play, counterDigits[3], 154, 15);
+
+ // Health
+ counterDigits[2] = 0;
+ counterDigits[3] = gSaveContext.save.playerData.health / 0x10;
+ while (counterDigits[3] >= 10) {
+ counterDigits[2]++;
+ counterDigits[3] -= 10;
+ }
+
+ KaleidoScope_DrawDigit(play, counterDigits[2], 195, 15);
+ KaleidoScope_DrawDigit(play, counterDigits[3], 204, 15);
+
+ // Items
+ // Loop over rows (i)
+ for (slot = 0, i = 0, rectTop = 38; i < 4; i++, rectTop += 14) {
+ // Loop over columns (j)
+ for (j = 0, rectLeft = 44; j < 6; j++, slot++, rectLeft += 23) {
+ counterDigits[3] = 0;
+ counterDigits[2] = 0;
+ if ((slot == SLOT_BOW) || ((slot >= SLOT_BOMB) && (slot <= SLOT_NUT)) || (slot == SLOT_POWDER_KEG) ||
+ (slot == SLOT_MAGIC_BEANS)) {
+ counterDigits[3] = AMMO(gAmmoItems[slot]);
+ } else if ((slot == SLOT_TRADE_DEED) || (slot == SLOT_TRADE_KEY_MAMA) || (slot == SLOT_TRADE_COUPLE)) {
+ counterDigits[3] = gSaveContext.save.inventory.items[slot];
+ } else if (slot >= SLOT_BOTTLE_1) {
+ counterDigits[3] = gSaveContext.save.inventory.items[slot];
+ } else if (gSaveContext.save.inventory.items[slot] != ITEM_NONE) {
+ counterDigits[3] = 1;
+ }
+
+ if (counterDigits[3] != ITEM_NONE) {
+ while (counterDigits[3] >= 10) {
+ counterDigits[2]++;
+ counterDigits[3] -= 10;
+ }
+ } else {
+ counterDigits[2] = counterDigits[3] = 0;
+ }
+
+ if (counterDigits[2] != 0) {
+ KaleidoScope_DrawDigit(play, counterDigits[2], rectLeft, rectTop);
+ }
+ KaleidoScope_DrawDigit(play, counterDigits[3], rectLeft + 9, rectTop);
+ }
+ }
+
+ // Masks
+ // Loop over rows (i)
+ for (slot = 0, i = 0, rectTop = 38; i < 4; i++, rectTop += 14) {
+ // Loop over columns (j)
+ for (j = 0, rectLeft = 204; j < 6; j++, slot++, rectLeft += 14) {
+ counterDigits[2] = 0;
+
+ if (gSaveContext.save.inventory.items[SLOT_MASK_POSTMAN + slot] != ITEM_NONE) {
+ counterDigits[2] = 1;
+ }
+ KaleidoScope_DrawDigit(play, counterDigits[2], rectLeft, rectTop);
+ }
+ }
+
+ // Boss Remains
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 44, i = 0; i < 4; i++) {
+ counterDigits[2] = 0;
+ if (CHECK_QUEST_ITEM(QUEST_REMAINS_ODOWLA + i)) {
+ counterDigits[2] = 1;
+ }
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 112);
+ counterDigits[1] += 14;
+ }
+
+ // Sword
+ KaleidoScope_DrawDigit(play, GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD), 116, 100);
+
+ // Shield
+ KaleidoScope_DrawDigit(play, GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD), 145, 100);
+
+ // Songs
+ // Loop over rows (j), (counterDigits[3] stores rectTop)
+ for (counterDigits[3] = 100, j = 0, slot = 0; j < 2; j++) {
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 190, i = 0; i < 6; i++, slot++) {
+ counterDigits[2] = 0;
+ if (CHECK_QUEST_ITEM(QUEST_SONG_SONATA + slot)) {
+ counterDigits[2] = 1;
+ }
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], counterDigits[3]);
+ counterDigits[1] += 14;
+ }
+ counterDigits[3] += 14;
+ }
+
+ // Goron Lullaby Intro
+ counterDigits[2] = 0;
+ counterDigits[3] -= 14;
+ if (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY_INTRO)) {
+ counterDigits[2] = 1;
+ }
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], counterDigits[3]);
+
+ // Bombers Notebook
+ counterDigits[2] = 0;
+ if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
+ counterDigits[2] = 1;
+ }
+ KaleidoScope_DrawDigit(play, counterDigits[2], 56, 142);
+
+ // Quiver
+ KaleidoScope_DrawDigit(play, CUR_UPG_VALUE(UPG_QUIVER), 114, 134);
+
+ // Bomb Bag
+ KaleidoScope_DrawDigit(play, CUR_UPG_VALUE(UPG_BOMB_BAG), 156, 134);
+
+ // Gold Skulls (Swamp Spider House)
+ counterDigits[2] = 0;
+ counterDigits[1] = 0;
+ counterDigits[3] = Inventory_GetSkullTokenCount(SCENE_KINSTA1);
+
+ while (counterDigits[3] >= 100) {
+ counterDigits[3] -= 100;
+ counterDigits[1]++;
+ }
+
+ while (counterDigits[3] >= 10) {
+ counterDigits[3] -= 10;
+ counterDigits[2]++;
+ }
+
+ KaleidoScope_DrawDigit(play, counterDigits[1], 196, 130);
+ KaleidoScope_DrawDigit(play, counterDigits[2], 205, 130);
+ KaleidoScope_DrawDigit(play, counterDigits[3], 214, 130);
+
+ // Gold Skulls (Oceans Spider House)
+ counterDigits[2] = 0;
+ counterDigits[1] = 0;
+ counterDigits[3] = Inventory_GetSkullTokenCount(SCENE_KINDAN2);
+
+ while (counterDigits[3] >= 100) {
+ counterDigits[3] -= 100;
+ counterDigits[1]++;
+ }
+
+ while (counterDigits[3] >= 10) {
+ counterDigits[3] -= 10;
+ counterDigits[2]++;
+ }
+
+ KaleidoScope_DrawDigit(play, counterDigits[1], 196, 144);
+ KaleidoScope_DrawDigit(play, counterDigits[2], 205, 144);
+ KaleidoScope_DrawDigit(play, counterDigits[3], 214, 144);
+
+ // Heart Pieces
+ KaleidoScope_DrawDigit(play, GET_QUEST_HEART_PIECE_COUNT, 264, 134);
+
+ // Keys
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 45, i = 0; i < 4; i++) {
+ counterDigits[2] = 0;
+
+ if ((counterDigits[3] = DUNGEON_KEY_COUNT(i)) >= 0) {
+ while (counterDigits[3] >= 10) {
+ counterDigits[2]++;
+ counterDigits[3] -= 10;
+ }
+ } else {
+ counterDigits[2] = counterDigits[3] = 0;
+ }
+
+ KaleidoScope_DrawDigit(play, counterDigits[3], counterDigits[1], 168);
+ counterDigits[1] += 12;
+ }
+
+ // Dungeon Items
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 129, i = 0; i < 4; i++) {
+ counterDigits[2] = gSaveContext.save.inventory.dungeonItems[i] & gEquipMasks[0];
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 168);
+ counterDigits[1] += 12;
+ }
+
+ // Stray Fairies
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 202, i = 0; i < 4; i++) {
+ counterDigits[3] = gSaveContext.save.inventory.strayFairies[i];
+ counterDigits[2] = counterDigits[3] / 10;
+ counterDigits[3] -= counterDigits[2] * 10;
+ if (counterDigits[2] != 0) {
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 168);
+ }
+ KaleidoScope_DrawDigit(play, counterDigits[3], counterDigits[1] + 9, 168);
+ counterDigits[1] += 21;
+ }
+
+ // Double Defence
+ KaleidoScope_DrawDigit(play, gSaveContext.save.playerData.doubleDefense, 44, 202);
+
+ // Magic
+ //! @bug should be gSaveContext.save.playerData.doubleMagic
+ KaleidoScope_DrawDigit(play, gSaveContext.save.playerData.doubleDefense, 75, 202);
+
+ // Lottery
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 139, i = 0; i < 3; i++) {
+ counterDigits[2] = gSaveContext.save.lotteryCodes[0][i];
+
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 184);
+ counterDigits[2] = gSaveContext.save.lotteryCodes[1][i];
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 198);
+
+ counterDigits[2] = gSaveContext.save.lotteryCodes[2][i];
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 212);
+
+ counterDigits[1] += 12;
+ }
+
+ // Oceanside Spider House Mask Order
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 217, i = 0; i < 6; i++) {
+ counterDigits[2] = gSaveContext.save.spiderHouseMaskOrder[i];
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 186);
+
+ counterDigits[1] += 12;
+ }
+
+ // Bombers code
+ // Loop over columns (i), (counterDigits[1] stores rectLeft)
+ for (counterDigits[1] = 220, i = 0; i < 5; i++) {
+ counterDigits[2] = gSaveContext.save.bomberCode[i];
+ KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 210);
+
+ counterDigits[1] += 12;
+ }
+
+ // Draws a highlight on the selected section
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 200, 120);
+
+ gDPFillRectangle(POLY_OPA_DISP++, sSectionPositions[sCurSection].screenX, sSectionPositions[sCurSection].screenY,
+ sSectionPositions[sCurSection].screenX + sSectionPositions[sCurSection].width,
+ sSectionPositions[sCurSection].screenY + 15);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
+ static s32 sPrevDBtnInput = 0;
+ static s32 sHeldDBtnTimer = 0;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ Input* input = CONTROLLER1(&play->state);
+ s16 slot;
+ s16 value;
+ s32 dBtnInput = input->cur.button & (BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT);
+
+ pauseCtx->stickRelX = input->rel.stick_x;
+ pauseCtx->stickRelY = input->rel.stick_y;
+
+ // Handles navigating the menu to different sections with the D-Pad
+ // When the same direction is held, registers the input periodically based on a timer
+ if (dBtnInput == sPrevDBtnInput) {
+ sHeldDBtnTimer--;
+ if (sHeldDBtnTimer < 0) {
+ sHeldDBtnTimer = 1;
+ } else {
+ dBtnInput ^= sPrevDBtnInput;
+ }
+ } else {
+ sPrevDBtnInput = dBtnInput;
+ sHeldDBtnTimer = 16;
+ }
+
+ if (CHECK_BTN_ANY(dBtnInput, BTN_DDOWN)) {
+ sCurRow++;
+ if (sCurRow > 17) {
+ sCurRow = 0;
+ }
+ sCurSection = sRowFirstSections[sCurRow];
+ } else if (CHECK_BTN_ANY(dBtnInput, BTN_DUP)) {
+ sCurRow--;
+ if (sCurRow < 0) {
+ sCurRow = 17;
+ }
+ sCurSection = sRowFirstSections[sCurRow];
+ } else if (CHECK_BTN_ANY(dBtnInput, BTN_DLEFT)) {
+ sCurSection--;
+ if (sCurSection < 0) {
+ sCurSection = ARRAY_COUNT(sSectionPositions) - 1;
+ }
+ } else if (CHECK_BTN_ANY(dBtnInput, BTN_DRIGHT)) {
+ sCurSection++;
+ if (sCurSection > (ARRAY_COUNT(sSectionPositions) - 1)) {
+ sCurSection = 0;
+ }
+ }
+
+ // Handles the logic to change values based on the selected section
+ switch (sCurSection) {
+ case INV_EDITOR_SECTION_RUPEE:
+ // Rupees
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
+ gSaveContext.save.playerData.rupees -= 100;
+ if (gSaveContext.save.playerData.rupees < 0) {
+ gSaveContext.save.playerData.rupees = 0;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
+ gSaveContext.save.playerData.rupees += 100;
+ if (gSaveContext.save.playerData.rupees >= 9999) {
+ gSaveContext.save.playerData.rupees = 9999;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ gSaveContext.save.playerData.rupees--;
+ if (gSaveContext.save.playerData.rupees < 0) {
+ gSaveContext.save.playerData.rupees = 0;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ gSaveContext.save.playerData.rupees++;
+ if (gSaveContext.save.playerData.rupees >= 9999) {
+ gSaveContext.save.playerData.rupees = 9999;
+ }
+ }
+ break;
+
+ case INV_EDITOR_SECTION_HEALTH_CAPACITY:
+ // Health Capacity
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ gSaveContext.save.playerData.healthCapacity -= 0x10;
+ if (gSaveContext.save.playerData.healthCapacity < 0x30) {
+ gSaveContext.save.playerData.healthCapacity = 0x30;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ gSaveContext.save.playerData.healthCapacity += 0x10;
+ if (gSaveContext.save.playerData.healthCapacity >= 0x140) {
+ gSaveContext.save.playerData.healthCapacity = 0x140;
+ }
+ }
+ break;
+
+ case INV_EDITOR_SECTION_HEALTH:
+ // Health
+ if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ Health_ChangeBy(play, -4);
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ Health_ChangeBy(play, 4);
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
+ Health_ChangeBy(play, -0x10);
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
+ Health_ChangeBy(play, 0x10);
+ }
+ break;
+
+ case INV_EDITOR_SECTION_HEART_PIECE_COUNT:
+ // Heart Piece Count
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ if (GET_QUEST_HEART_PIECE_COUNT != 0) {
+ DECREMENT_QUEST_HEART_PIECE_COUNT;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ if (LEQ_MAX_QUEST_HEART_PIECE_COUNT) {
+ INCREMENT_QUEST_HEART_PIECE_COUNT;
+ }
+ }
+ break;
+
+ default:
+ if (sCurSection < INV_EDITOR_SECTION_BOSS) {
+ // Items
+ slot = sCurSection - INV_EDITOR_SECTION_ITEMS;
+ if ((slot == SLOT_BOW) || ((slot >= SLOT_BOMB) && (slot <= SLOT_NUT)) || (slot == SLOT_POWDER_KEG) ||
+ (slot == SLOT_MAGIC_BEANS)) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
+ Inventory_DeleteItem(gAmmoItems[slot], SLOT(gAmmoItems[slot]));
+ AMMO(gAmmoItems[slot]) = 0;
+ }
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ if (slot != INV_CONTENT(gAmmoItems[slot])) {
+ INV_CONTENT(gAmmoItems[slot]) = gAmmoItems[slot];
+ }
+ AMMO(gAmmoItems[slot])++;
+ if (AMMO(gAmmoItems[slot]) > 99) {
+ AMMO(gAmmoItems[slot]) = 99;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ AMMO(gAmmoItems[slot])--;
+ if (AMMO(gAmmoItems[slot]) < 0) {
+ AMMO(gAmmoItems[slot]) = 0;
+ }
+ }
+ } else if ((slot == SLOT_TRADE_DEED) || (slot == SLOT_TRADE_KEY_MAMA) || (slot == SLOT_TRADE_COUPLE)) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
+ value = sSlotItems[slot];
+ Inventory_DeleteItem(value, slot);
+ } else if (slot == SLOT_TRADE_DEED) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ if (INV_CONTENT(ITEM_MOON_TEAR) == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_MOON_TEAR;
+ } else if ((INV_CONTENT(ITEM_MOON_TEAR) >= ITEM_MOON_TEAR) &&
+ (INV_CONTENT(ITEM_MOON_TEAR) <= ITEM_DEED_MOUNTAIN)) {
+ gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_MOON_TEAR) + 1;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ if (INV_CONTENT(ITEM_MOON_TEAR) == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_DEED_OCEAN;
+ } else if ((INV_CONTENT(ITEM_MOON_TEAR) >= ITEM_DEED_LAND) &&
+ (INV_CONTENT(ITEM_MOON_TEAR) <= ITEM_DEED_OCEAN)) {
+ gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_MOON_TEAR) - 1;
+ }
+ }
+ } else if (slot == SLOT_TRADE_KEY_MAMA) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ if (INV_CONTENT(ITEM_ROOM_KEY) == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_ROOM_KEY;
+ } else if ((INV_CONTENT(ITEM_ROOM_KEY) >= ITEM_ROOM_KEY) &&
+ (INV_CONTENT(ITEM_ROOM_KEY) <= ITEM_ROOM_KEY)) {
+ gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_ROOM_KEY) + 1;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ if (INV_CONTENT(ITEM_ROOM_KEY) == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_LETTER_MAMA;
+ } else if ((INV_CONTENT(ITEM_ROOM_KEY) >= ITEM_LETTER_MAMA) &&
+ (INV_CONTENT(ITEM_ROOM_KEY) <= ITEM_LETTER_MAMA)) {
+ gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_ROOM_KEY) - 1;
+ }
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ if (INV_CONTENT(ITEM_LETTER_TO_KAFEI) == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_LETTER_TO_KAFEI;
+ } else if ((INV_CONTENT(ITEM_LETTER_TO_KAFEI) >= ITEM_LETTER_TO_KAFEI) &&
+ (INV_CONTENT(ITEM_LETTER_TO_KAFEI) <= ITEM_LETTER_TO_KAFEI)) {
+ gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_LETTER_TO_KAFEI) + 1;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ if (INV_CONTENT(ITEM_LETTER_TO_KAFEI) == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_PENDANT_OF_MEMORIES;
+ } else if ((INV_CONTENT(ITEM_LETTER_TO_KAFEI) >= ITEM_PENDANT_OF_MEMORIES) &&
+ (INV_CONTENT(ITEM_LETTER_TO_KAFEI) <= ITEM_PENDANT_OF_MEMORIES)) {
+ gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_LETTER_TO_KAFEI) - 1;
+ }
+ }
+ } else if ((slot >= SLOT_BOTTLE_1) && (slot <= SLOT_BOTTLE_6)) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
+ value = ITEM_BOTTLE + slot - SLOT_BOTTLE_1;
+ Inventory_DeleteItem(value, SLOT(ITEM_BOTTLE) + slot - SLOT_BOTTLE_1);
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ if (gSaveContext.save.inventory.items[slot] == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_BOTTLE;
+ } else if ((gSaveContext.save.inventory.items[slot] >= ITEM_BOTTLE) &&
+ (gSaveContext.save.inventory.items[slot] <= ITEM_HYLIAN_LOACH)) {
+ gSaveContext.save.inventory.items[slot] = gSaveContext.save.inventory.items[slot] + 1;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ if (gSaveContext.save.inventory.items[slot] == ITEM_NONE) {
+ gSaveContext.save.inventory.items[slot] = ITEM_OBABA_DRINK;
+ } else if ((gSaveContext.save.inventory.items[slot] >= ITEM_POTION_RED) &&
+ (gSaveContext.save.inventory.items[slot] <= ITEM_OBABA_DRINK)) {
+ gSaveContext.save.inventory.items[slot] = gSaveContext.save.inventory.items[slot] - 1;
+ }
+ }
+ } else {
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ value = sSlotItems[slot];
+ if (gSaveContext.save.inventory.items[slot] == ITEM_NONE) {
+ INV_CONTENT(value) = value;
+ } else {
+ Inventory_DeleteItem(value, slot);
+ }
+ }
+ }
+
+ } else if (sCurSection == INV_EDITOR_SECTION_SWORD) {
+ // Sword
+ value = GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD);
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ value--;
+ if (value < EQUIP_VALUE_SWORD_NONE) {
+ value = EQUIP_VALUE_SWORD_NONE;
+ }
+
+ SET_EQUIP_VALUE(EQUIP_TYPE_SWORD, value);
+
+ if (value != 0) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = value + (ITEM_SWORD_KOKIRI - 1);
+ gSaveContext.save.playerData.swordHealth = 100;
+ } else {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NONE;
+ }
+
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ value++;
+ if (value > EQUIP_VALUE_SWORD_DIETY) {
+ value = EQUIP_VALUE_SWORD_DIETY;
+ }
+
+ SET_EQUIP_VALUE(EQUIP_TYPE_SWORD, value);
+
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = value + (ITEM_SWORD_KOKIRI - 1);
+ gSaveContext.save.playerData.swordHealth = 100;
+ }
+
+ Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
+
+ } else if (sCurSection == INV_EDITOR_SECTION_SHIELD) {
+ // Shield
+ value = GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD);
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ value--;
+ if (value < EQUIP_VALUE_SHIELD_NONE) {
+ value = EQUIP_VALUE_SHIELD_NONE;
+ }
+
+ SET_EQUIP_VALUE(EQUIP_TYPE_SHIELD, value);
+
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ value++;
+ if (value > EQUIP_VALUE_SHIELD_MAX) {
+ value = EQUIP_VALUE_SHIELD_MAX;
+ }
+ SET_EQUIP_VALUE(EQUIP_TYPE_SHIELD, value);
+ }
+
+ } else if (sCurSection == INV_EDITOR_SECTION_QUIVER) {
+ // Quiver
+ value = GET_CUR_UPG_VALUE(UPG_QUIVER);
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ value--;
+ if (value < 0) {
+ value = 0;
+ }
+ Inventory_ChangeUpgrade(UPG_QUIVER, value);
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ value++;
+ if (value > 3) {
+ value = 3;
+ }
+ Inventory_ChangeUpgrade(UPG_QUIVER, value);
+ }
+
+ } else if (sCurSection == INV_EDITOR_SECTION_BOMB_BAG) {
+ // Bomb Bag
+ value = GET_CUR_UPG_VALUE(UPG_BOMB_BAG);
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ value--;
+ if (value < 0) {
+ value = 0;
+ }
+ Inventory_ChangeUpgrade(UPG_BOMB_BAG, value);
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ value++;
+ if (value > 3) {
+ value = 3;
+ }
+ Inventory_ChangeUpgrade(UPG_BOMB_BAG, value);
+ }
+
+ } else if (sCurSection == INV_EDITOR_SECTION_SWAMP_GOLD_SKULLS) {
+ // Gold Skulls (Swamp Spider House)
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ if (((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) != 0) {
+ gSaveContext.save.skullTokenCount =
+ ((u16)(((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) - 1) << 0x10) |
+ (gSaveContext.save.skullTokenCount & 0xFFFF);
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ gSaveContext.save.skullTokenCount =
+ ((u16)(((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) + 1) << 0x10) |
+ (gSaveContext.save.skullTokenCount & 0xFFFF);
+ }
+
+ } else if (sCurSection == INV_EDITOR_SECTION_OCEAN_GOLD_SKULLS) {
+ // Gold Skulls (Oceans Spider House)
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ if (((u16)gSaveContext.save.skullTokenCount) != 0) {
+ gSaveContext.save.skullTokenCount = (((u16)gSaveContext.save.skullTokenCount - 1) & 0xFFFF) |
+ (gSaveContext.save.skullTokenCount & 0xFFFF0000);
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ gSaveContext.save.skullTokenCount = (((u16)gSaveContext.save.skullTokenCount + 1) & 0xFFFF) |
+ (gSaveContext.save.skullTokenCount & 0xFFFF0000);
+ }
+
+ } else if (sCurSection == INV_EDITOR_SECTION_NOTEBOOK) {
+ // Bombers Notebook
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ gSaveContext.save.inventory.questItems ^= gBitFlags[QUEST_BOMBERS_NOTEBOOK];
+ }
+
+ } else if (sCurSection == INV_EDITOR_SECTION_LULLABY_INTRO) {
+ // Goron Lullaby Intro
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ gSaveContext.save.inventory.questItems ^= gBitFlags[QUEST_SONG_LULLABY_INTRO];
+ }
+
+ } else if (sCurSection < INV_EDITOR_SECTION_LULLABY_INTRO) {
+ // Boss Remains and Songs
+ //! Note: quest items must align with section, and all cases below INV_EDITOR_SECTION_LULLABY_INTRO must
+ //! have also been taken
+ slot = sCurSection - INV_EDITOR_SECTION_BOSS;
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ gSaveContext.save.inventory.questItems ^= gBitFlags[slot];
+ }
+
+ } else if (sCurSection < INV_EDITOR_SECTION_DUNGEON_ITEMS) {
+ // Dungeon Small Keys
+ slot = sCurSection - INV_EDITOR_SECTION_SMALL_KEYS;
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ DUNGEON_KEY_COUNT(slot)--;
+ if (DUNGEON_KEY_COUNT(slot) < 0) {
+ DUNGEON_KEY_COUNT(slot) = -1;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ if (DUNGEON_KEY_COUNT(slot) < 0) {
+ DUNGEON_KEY_COUNT(slot) = 1;
+ } else {
+ DUNGEON_KEY_COUNT(slot)++;
+ if (DUNGEON_KEY_COUNT(slot) >= 9) {
+ DUNGEON_KEY_COUNT(slot) = 9;
+ }
+ }
+ }
+
+ } else if (sCurSection < INV_EDITOR_SECTION_STRAY_FAIRIES) {
+ // Dungeon Items
+ slot = sCurSection - INV_EDITOR_SECTION_DUNGEON_ITEMS;
+ if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ // Map
+ gSaveContext.save.inventory.dungeonItems[slot] ^= 4;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
+ // Compass
+ gSaveContext.save.inventory.dungeonItems[slot] ^= 2;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ // Boss Key
+ gSaveContext.save.inventory.dungeonItems[slot] ^= 1;
+ }
+
+ } else if (sCurSection < INV_EDITOR_SECTION_DOUBLE_DEFENSE) {
+ // Stray Fairies
+ slot = sCurSection - INV_EDITOR_SECTION_STRAY_FAIRIES;
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ gSaveContext.save.inventory.strayFairies[slot]--;
+ if (gSaveContext.save.inventory.strayFairies[slot] < 0) {
+ gSaveContext.save.inventory.strayFairies[slot] = 0;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ gSaveContext.save.inventory.strayFairies[slot]++;
+ if (gSaveContext.save.inventory.strayFairies[slot] >= 99) {
+ gSaveContext.save.inventory.strayFairies[slot] = 99;
+ }
+ }
+
+ } else {
+ // Double Defence
+ if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(input->press.button, BTN_CDOWN) || CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ gSaveContext.save.playerData.doubleDefense ^= 1;
+ if (!gSaveContext.save.playerData.doubleDefense) {
+ gSaveContext.save.inventory.defenseHearts = 0;
+ } else {
+ gSaveContext.save.inventory.defenseHearts = 20;
+ }
+ }
+ }
+ break;
+ }
+
+ // Handles exiting the inventory editor with the L button
+ // The editor is opened with `debugEditor` set to DEBUG_EDITOR_INVENTORY_INIT,
+ // and becomes closable after a frame once `debugEditor` is set to DEBUG_EDITOR_INVENTORY
+ if (pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY_INIT) {
+ pauseCtx->debugEditor = DEBUG_EDITOR_INVENTORY;
+ } else if ((pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY) && CHECK_BTN_ALL(input->press.button, BTN_L)) {
+ pauseCtx->debugEditor = DEBUG_EDITOR_NONE;
+ }
+}
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
index 11d0b1207..ae2140f2c 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
@@ -16,6 +16,64 @@ extern UNK_TYPE D_0B000000;
extern UNK_TYPE D_0C000000;
extern UNK_TYPE D_0C006C00;
+s32 D_8082B3C0 = 0;
+
+s32 D_8082B3C4 = 0;
+
+s16 D_8082B3C8 = 10;
+
+u8 D_8082B3CC[5][24] = {
+ {
+ false, false, false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, true, true, true, true, true, true,
+ },
+ {
+ true, false, false, false, false, true, false, false, false, false, false, true,
+ true, true, true, false, false, true, true, true, true, true, true, true,
+ },
+ {
+ true, false, false, false, false, true, false, false, false, false, false, true,
+ false, true, true, false, false, true, true, true, true, true, true, true,
+ },
+ {
+ true, false, false, false, false, true, false, false, false, true, false, true,
+ false, true, true, false, false, true, true, true, true, true, true, true,
+ },
+ {
+ true, true, true, true, true, true, true, true, true, true, true, true,
+ false, true, true, true, true, true, true, true, true, true, true, true,
+ },
+};
+
+s16 D_8082B444[] = {
+ 0x005F, 0x003E, 0x005F, 0x0080, 0x00A1, 0x00C2, 0x003E, 0x005F,
+};
+
+s16 D_8082B454[] = {
+ 0x0055, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0096, 0x0096, 0x00FF, 0x0064,
+ 0x00FF, 0x0000, 0x0000, 0x0064, 0x00FF, 0x0000, 0x0000, 0x00FF, 0x0064, 0x0000,
+};
+
+u8 D_8082B47C[] = {
+ 0x35, 0x33, 0x34, 0x32, 0xFF,
+};
+
+s16 D_8082B484[] = {
+ 0x0294,
+ 0x0384,
+ 0x0474,
+ 0x0000,
+};
+
+s16 D_8082B48C[] = {
+ 0x044C,
+ 0x0398,
+ 0x044C,
+ 0x0000,
+};
+
+s32 D_8082B494[] = { 0, 0, 0 };
+
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_8081B240.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_8081B6BC.s")
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
index 83869bd10..6e23e8f6f 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
@@ -16,6 +16,87 @@ extern UNK_TYPE D_0B000000;
extern UNK_TYPE D_0C000000;
extern UNK_TYPE D_0C006C00;
+s32 D_8082B4A0[] = { 0x09003600, 0x09003F00, 0x09004800 };
+
+s32 D_8082B4AC[] = {
+ 0x0D000000,
+ 0x0D000800,
+ 0x0D001000,
+ 0x0D001800,
+};
+
+s16 D_8082B4BC[] = {
+ 0x0043,
+ 0x0051,
+ 0x005F,
+ 0x006D,
+};
+
+s16 D_8082B4C4 = 0x7B;
+s16 D_8082B4C8 = 30;
+s16 D_8082B4CC = 0;
+s16 D_8082B4D0 = 0xF;
+s16 D_8082B4D4 = 0;
+s16 D_8082B4D8 = 0xFF;
+f32 D_8082B4DC = 100.0f;
+
+s32 D_8082B4E0[] = {
+ 0x02008998, 0x0C001B80, 0x02008998, 0x0C001B80, 0x02009598, 0x0C002780, 0x02009598, 0x0C002780,
+ 0x0200A198, 0x0C003380, 0x0200A198, 0x0C003380, 0x0200AD98, 0x0C003F80, 0x0200AD98, 0x0C003F80,
+};
+
+s32 D_8082B520[] = {
+ 0xFF6EA05A,
+ 0xFF6478FF,
+ 0xFFF5F55A,
+};
+
+s32 D_8082B52C[] = {
+ 0xFFFFFFFF,
+ 0xFFFFFFFF,
+ 0xFFE1AA00,
+};
+
+s32 D_8082B538[] = {
+ 0x00000400,
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+};
+
+s16 D_8082B548[] = {
+ 0x0C00, 0x8418, 0x0C00, 0x9098, 0x0C01, 0x2898, 0x0C01, 0x35D8, 0x0C01, 0x4318,
+ 0x0C00, 0xDE58, 0x0C00, 0xEB58, 0x0C00, 0xFAA8, 0x0C00, 0x9858, 0x0C00, 0x9E58,
+ 0x0C00, 0xAE58, 0x0C00, 0xBE58, 0x0C00, 0xCE58, 0x0C01, 0x09F8, 0x0C01, 0x1958,
+};
+
+s16 D_8082B584[] = {
+ 0x0000, 0x0000, 0x00FF, 0x00FF, 0x00FF, 0x0000,
+};
+
+s16 D_8082B590[] = {
+ 0x00FF, 0x00FF, 0x0000, 0x0000, 0x0000, 0x00FF,
+};
+
+s16 D_8082B59C[] = {
+ 0x0056, 0x0068, 0x0091, 0x0099, 0x00A3, 0x009F, 0x009D, 0x00C7, 0x00D0, 0x00D2, 0x00DA, 0x0000,
+};
+
+s16 D_8082B5B4[] = {
+ 0x007F, 0x0099, 0x008A, 0x00AB, 0x0092, 0x0077, 0x004D, 0x006A, 0x0078, 0x0049, 0x0063, 0x0000,
+};
+
+s16 D_8082B5CC[] = {
+ 0x0005, 0x0004, 0x0006, 0x0000, 0x0008, 0x0005, 0x0004, 0x0006, 0x0000, 0x0008,
+};
+
+u16 D_8082B5E0[] = {
+ 0xAF, 0xB3, 0xAA, 0xB1, 0xA9, 0xB2, 0xA8, 0xB0, 0xAC, 0xAE,
+};
+u16 D_8082B5F4 = 0;
+
+s32 D_8082B5F8[] = { 0, 0 };
+
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_8081D240.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_8081D6DC.s")
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 04fa566e3..aa24bf2e2 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
@@ -16,6 +16,48 @@ extern UNK_TYPE D_0B000000;
extern UNK_TYPE D_0C000000;
extern UNK_TYPE D_0C006C00;
+s32 D_8082B600 = 0;
+
+s32 D_8082B604 = 0;
+
+s16 D_8082B608 = 10;
+
+s32 D_8082B60C[] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00010000,
+ 0x00000001, 0x00000000, 0x00010000, 0x00000001, 0x00000000, 0x00010000, 0x00000001, 0x00000000,
+ 0x00010000, 0x00000001, 0x00000000, 0x00010000, 0x00000001, 0x00000000, 0x00010000, 0x00000001,
+ 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101,
+};
+
+s32 D_8082B684[] = {
+ 0x01010004, 0x02020180, 0x01040210, 0x00100201, 0x00080110, 0x02040220, 0x00400080, 0x00020102, 0x00010240,
+ 0x01200108, 0x00200140, 0x02080280, 0x00FF0064, 0x00FF0000, 0x00000064, 0x00FF0000, 0x000000FF, 0x00640000,
+};
+
+u8 D_8082B6CC[] = { 0x35, 0x33, 0x34, 0x32, 0xFF };
+
+s16 D_8082B6D4[] = {
+ 0x0294,
+ 0x0384,
+ 0x0474,
+ 0x0000,
+};
+
+s16 D_8082B6DC[] = {
+ 0x044C,
+ 0x0398,
+ 0x044C,
+ 0x0000,
+};
+
+s32 D_8082B6E4[] = { 0, 0, 0 };
+
+s16 D_8082B6F0[] = { 100, 255 };
+
+s32 D_8082B6F4 = 0;
+
+s16 D_8082B6F8[] = { 10, 0, 0, 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")
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 91c6b044d..f4c91e9e8 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
@@ -1,8 +1,25 @@
-#ifndef _Z64_KALEIDO_SCOPE_H_
-#define _Z64_KALEIDO_SCOPE_H_
+#ifndef Z_KALEIDO_SCOPE_H
+#define Z_KALEIDO_SCOPE_H
#include "global.h"
+typedef enum {
+ /* 0x00 */ PAUSE_ITEM,
+ /* 0x01 */ PAUSE_MAP,
+ /* 0x02 */ PAUSE_QUEST,
+ /* 0x03 */ PAUSE_MASK,
+ /* 0x04 */ PAUSE_WORLD_MAP
+} PauseMenuPage;
+typedef enum {
+ /* 0 */ DEBUG_EDITOR_NONE,
+ /* 1 */ DEBUG_EDITOR_INVENTORY_INIT,
+ /* 2 */ DEBUG_EDITOR_INVENTORY,
+ /* 3 */ DEBUG_EDITOR_EVENTS
+} DebugEditor;
+
+// Debug
+void KaleidoScope_DrawInventoryEditor(PlayState* play);
+void KaleidoScope_UpdateInventoryEditor(PlayState* play);
#endif
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
index 5573ecb11..44575f156 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
@@ -16,6 +16,302 @@ extern UNK_TYPE D_0B000000;
extern UNK_TYPE D_0C000000;
extern UNK_TYPE D_0C006C00;
+void* D_8082B700[] = {
+ 0x08064440, 0x0806E440, 0x08077A40, 0x08081040, 0x0808A640, 0x0D003A00, 0x0806EE40, 0x08078440,
+ 0x08081A40, 0x0808B040, 0x08065840, 0x0806F840, 0x08078E40, 0x08082440, 0x0808BA40,
+};
+void* D_8082B73C[] = {
+ 0x0D004400, 0x08070240, 0x08079840, 0x08082E40, 0x0808C440, 0x0D004E00, 0x08070C40, 0x0807A240,
+ 0x08083840, 0x0808CE40, 0x0D005800, 0x08071640, 0x0807AC40, 0x08084240, 0x0808D840,
+};
+void* D_8082B778[] = {
+ 0x08068040, 0x08072040, 0x0807B640, 0x08084C40, 0x0808E240, 0x0D006200, 0x08072A40, 0x0807C040,
+ 0x08085640, 0x0808EC40, 0x08069440, 0x08073440, 0x0807CA40, 0x08086040, 0x0808F640,
+};
+void* D_8082B7B4[] = {
+ 0x0D006C00, 0x08073E40, 0x0807D440, 0x08086A40, 0x08090040, 0x0D007600, 0x08074840, 0x0807DE40,
+ 0x08087440, 0x08090A40, 0x0D008000, 0x08075240, 0x0807E840, 0x08087E40, 0x08091440,
+};
+
+s16 D_8082B7F0[] = {
+ 0x0050, 0x0040, 0x0040, 0x0040, 0x0010, 0x0040, 0x0070, 0x0070, 0x0030, 0x0040, 0x0040, 0x0040,
+ 0x0040, 0x0030, 0x0040, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
+ 0x0008, 0x0008, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+};
+s16 D_8082B838[] = {
+ 0x0028, 0x001F, 0x0035, 0x0035, 0x0035, 0x0034, 0x0023, 0x0023, 0x0020, 0x0040, 0x0040, 0x0040,
+ 0x0040, 0x0052, 0x003D, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
+ 0x0008, 0x0008, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,
+};
+
+s16 D_8082B880 = 0;
+s16 D_8082B884 = 0;
+s16 D_8082B888 = 0;
+s16 D_8082B88C = 255;
+s16 D_8082B890 = 0;
+s16 D_8082B894 = 0;
+s16 D_8082B898 = 0;
+s16 D_8082B89C = 0;
+s16 D_8082B8A0 = 0;
+s16 D_8082B8A4 = 0;
+s16 D_8082B8A8 = 255;
+s16 D_8082B8AC = 0;
+s16 D_8082B8B0 = 0;
+
+s16 D_8082B8B4 = false;
+
+f32 D_8082B8B8[] = {
+ -4.0f, 4.0f, 4.0f, 4.0f, 4.0f, -4.0f, -4.0f, -4.0f,
+};
+
+f32 D_8082B8D8[] = {
+ -4.0f, -4.0f, -4.0f, 4.0f, 4.0f, 4.0f, 4.0f, -4.0f,
+};
+
+s16 D_8082B8F8[] = {
+ PAUSE_MAP, PAUSE_MASK, PAUSE_QUEST, PAUSE_ITEM, PAUSE_MASK, PAUSE_MAP, PAUSE_ITEM, PAUSE_QUEST,
+};
+
+f32 D_8082B908 = 0.0f;
+f32 D_8082B90C = 0.0f;
+f32 D_8082B910 = 40.0f;
+f32 D_8082B914 = -40.0f;
+
+s32 D_8082B918 = 0;
+
+s32 D_8082B91C = 0;
+
+s16 D_8082B920 = 10;
+
+u8 D_8082B924[] = {
+ 0x00, 0x14, 0x00, 0x04, 0x00, 0x14, 0x00, 0x0A, 0x0F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
+ 0x07, 0x07, 0x03, 0x0F, 0x07, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x0F, 0x00, 0x00,
+};
+
+s16 D_8082B944 = 0x42;
+
+s16 D_8082B948[][3] = {
+ { 0x00FF, 0x00FF, 0x00FF }, { 0x00FF, 0x00FF, 0x00FF }, { 0x00FF, 0x00FF, 0x0000 },
+ { 0x00FF, 0x00FF, 0x0000 }, { 0x0064, 0x0096, 0x00FF }, { 0x0064, 0x00FF, 0x00FF },
+};
+
+s16 D_8082B96C[][3] = {
+ { 0x0000, 0x0000, 0x0000 }, { 0x00AA, 0x00AA, 0x00AA }, { 0x0000, 0x0000, 0x0000 },
+ { 0x00FF, 0x00A0, 0x0000 }, { 0x0000, 0x0000, 0x0064 }, { 0x0000, 0x0096, 0x00FF },
+};
+
+s16 D_8082B990 = 10;
+s16 D_8082B994 = 0;
+
+s32 D_8082B998[] = {
+ 0x0D003300,
+ 0x0D002700,
+ 0x0D002B00,
+ 0x0D002F00,
+};
+
+s32 D_8082B9A8[] = {
+ 0x0D002B00,
+ 0x0D002F00,
+ 0x0D003300,
+ 0x0D002700,
+};
+
+s16 D_8082B9B8[] = {
+ 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+};
+
+s16 D_8082B9C8 = 20;
+
+s32 D_8082B9CC = 0;
+
+s16 D_8082B9D0[] = {
+ 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+};
+
+s16 D_8082B9E0 = 20;
+
+s32 D_8082B9E4 = 0;
+
+s32 D_8082B9E8 = 0;
+
+s32 D_8082B9EC = 0;
+
+s16 D_8082B9F0[] = {
+ 0xFFEB, 0xFF98, 0xFFB4, 0xFFD0, 0xFF98, 0xFFD8,
+};
+
+s32 D_8082B9FC = 0;
+
+s16 D_8082BA00[] = {
+ 0xFFD7, 0x0009, 0x002B, 0xFFEB, 0xFFDB, 0x002B, 0xFFBB, 0xFFBB, 0xFFE0, 0xFF93, 0xFFD3, 0xFF93,
+ 0xFFD3, 0x003B, 0xFFFB, 0xFFBA, 0xFFCC, 0xFFF5, 0xFFFE, 0x0008, 0x0002, 0x0001, 0x002B, 0x0034,
+ 0x0036, 0x003E, 0xFFB0, 0xFFC0, 0xFFF7, 0xFFFD, 0xFFF9, 0xFFF0, 0xFFFF, 0x0017, 0x002C, 0x0036,
+};
+
+s16 D_8082BA48[] = {
+ 0xFFB4, 0xFFC6, 0x000A, 0xFFC6, 0x000A, 0x0000,
+};
+
+s32 D_8082BA54 = 0;
+
+s32 D_8082BA58 = 0;
+
+s16 D_8082BA5C[] = {
+ 0x0080, 0x0018, 0x0018, 0x0018, 0x0020, 0x0018,
+};
+
+s32 D_8082BA68 = 0;
+
+s16 D_8082BA6C[] = {
+ 0x0098, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000,
+};
+
+s32 D_8082BA78 = 0;
+
+s32 D_8082BA7C = 0;
+
+s16 D_8082BA80[] = {
+ 0x0036, 0xFFD6, 0xFFD6, 0xFFD6, 0xFFE8, 0x0032,
+};
+
+s32 D_8082BA8C = 0;
+
+s16 D_8082BA90[] = {
+ 0x000B, 0x0016, 0xFFF0, 0xFFF0, 0xFFF0, 0x003B, 0x0018, 0x003B, 0xFFF5, 0xFFFB, 0xFFFB, 0x003B,
+ 0x003B, 0x0027, 0x001F, 0xFFF6, 0xFFDC, 0xFFED, 0xFFCB, 0xFFE5, 0xFFFE, 0x0029, 0x000B, 0xFFFD,
+ 0x002D, 0x0012, 0xFFF8, 0xFFDA, 0x0027, 0x001A, 0x0001, 0xFFF9, 0xFFE4, 0xFFE5, 0xFFFF, 0x0018,
+};
+
+s16 D_8082BAD8[] = {
+ 0x0024, 0x000A, 0x000A, 0xFFFA, 0xFFFA, 0x0000,
+};
+
+s32 D_8082BAE4 = 0;
+
+s32 D_8082BAE8 = 0;
+
+s16 D_8082BAEC[] = {
+ 0x0010, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+};
+
+s32 D_8082BAF8 = 0;
+
+s16 D_8082BAFC[] = {
+ 0x0010, 0x0030, 0x0030, 0x0010, 0x0010, 0x0000,
+};
+
+void* D_8082BB08[] = {
+ &D_8082B9E8, &D_8082B9EC, &D_8082B9F0, &D_8082B9FC, &D_8082BA00, &D_8082BA48,
+};
+
+void* D_8082BB20[] = {
+ &D_8082BA54, &D_8082BA58, &D_8082BA5C, &D_8082BA68, &D_8082B7F0, &D_8082BA6C,
+};
+
+void* D_8082BB38[] = {
+ &D_8082BA78, &D_8082BA7C, &D_8082BA80, &D_8082BA8C, &D_8082BA90, &D_8082BAD8,
+};
+
+void* D_8082BB50[] = {
+ &D_8082BAE4, &D_8082BAE8, &D_8082BAEC, &D_8082BAF8, &D_8082B838, &D_8082BAFC,
+};
+
+s16 D_8082BB68[] = {
+ 0x000E, 0xFFFE, 0xFFFE, 0xFFEE, 0xFFEE, 0x0000,
+};
+
+s16 D_8082BB74[] = {
+ 0x002D, 0x004E, 0x000A, 0x002D, 0x0050, 0x000B, 0xFF93, 0xFFA9, 0xFFBF, 0xFFD7, 0xFFED, 0xFFEE, 0xFF93, 0xFFA9,
+ 0xFFBF, 0xFFD7, 0xFFED, 0xFFEE, 0xFF99, 0x0007, 0x0052, 0xFF92, 0xFFCA, 0xFF9E, 0xFFAA, 0xFFB6, 0xFFC2, 0xFFCE,
+ 0xFFDA, 0xFFE6, 0xFFF2, 0xFF9E, 0xFFAA, 0xFFB6, 0xFFC2, 0xFFCE, 0xFFDA, 0xFFE6, 0xFFF2, 0x0000,
+};
+
+s16 D_8082BBC4[] = {
+ 0x003E, 0x002A, 0x002A, 0x0014, 0xFFF7, 0xFFF7, 0xFFEC, 0xFFEC, 0xFFEC, 0xFFEC, 0xFFEC, 0xFFEC, 0x0002, 0x0002,
+ 0x0002, 0x0002, 0x0002, 0x0002, 0x0036, 0xFFD4, 0xFFD4, 0x0022, 0x003A, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC,
+ 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0xFFCC, 0x0000,
+};
+
+s16 D_8082BC14[] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0020, 0x0020, 0x0020, 0x0018, 0x0030, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0000,
+};
+
+s16 D_8082BC64[] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0020, 0x0020, 0x0020, 0x0018, 0x0030, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0000,
+};
+
+f32 D_8082BCB4[] = {
+ -62.0f, -36.0f, -10.0f, 16.0f, 42.0f, 68.0f,
+};
+
+f32 D_8082BCCC[] = {
+ 31.0f,
+ 5.0f,
+ -21.0f,
+ -47.0f,
+};
+
+f32 D_8082BCDC[] = {
+ -49.0f, -35.0f, -3.0f, 4.0f, 12.0f, 8.0f, 7.0f, 40.0f, 47.0f, 49.0f, 55.0f,
+};
+
+f32 D_8082BD08[] = {
+ -15.0f, -36.0f, -23.0f, -49.0f, -29.0f, -8.0f, 25.0f, 2.0f, -9.0f, 28.0f, 7.0f,
+};
+
+f32 D_8082BD34[] = {
+ -50.0f, -38.0f, 6.0f, 11.0f, 8.0f, 0.0f, 12.0f, 31.0f, 48.0f, 56.0f,
+};
+
+f32 D_8082BD5C[] = {
+ -14.0f, -39.0f, 23.0f, 11.0f, -8.0f, -15.0f, -31.0f, -30.0f, -10.0f, 11.0f,
+};
+
+f32 D_8082BD84[] = {
+ -72.0f, -47.0f, -26.0f, -50.0f, -48.0f, -48.0f, -48.0f, -48.0f, -48.0f,
+};
+
+f32 D_8082BDA8[] = {
+ -47.0f, -47.0f, -47.0f, -30.0f, 33.0f, 22.0f, 11.0f, -2.0f, -13.0f,
+};
+
+f32 D_8082BDCC[] = {
+ 52.0f, 80.0f, 24.0f, 52.0f, 81.0f, 24.0f, -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f,
+ -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f, -68.0f, 22.0f, 83.0f, -67.0f, -21.0f,
+};
+
+f32 D_8082BE28[] = {
+ 33.0f, 18.0f, 18.0f, 0.0f, -23.0f, -23.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f,
+ -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, 27.0f, -53.0f, -53.0f, 14.0f, 26.0f,
+};
+
+s16 D_8082BE84 = 0;
+
+s16 D_8082BE88[] = {
+ 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,
+};
+
+s32 D_8082BE9C = 0;
+
+s32 D_8082BEA0 = 0;
+
+s16 D_8082BEA4 = 10;
+
+s32 D_8082BEA8 = 0;
+
+s32 D_8082BEAC = 0;
+
+s32 D_8082BEB0 = 0;
+
+s32 D_8082BEB4 = 0;
+
+s32 D_8082BEB8[] = { 0, 0 };
+
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821900.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_8082192C.s")
diff --git a/tools/disasm/files.txt b/tools/disasm/files.txt
index f3fca8ff4..22762b51a 100644
--- a/tools/disasm/files.txt
+++ b/tools/disasm/files.txt
@@ -526,7 +526,7 @@
0x801BB090 : "z_debug_mode",
0x801BB120 : "z_demo",
0x801BB170 : "z_draw",
- 0x801BC240 : "z_eff_footmark",
+ 0x801BC210 : "z_eff_footmark",
0x801BC2A0 : "",
0x801BC420 : "z_face_reaction",
0x801BD830 : "",
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index ebcf5d2a4..8605e3449 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -1047,13 +1047,13 @@
0x800C9598:("BgCheck_InitCollisionHeaders",),
0x800C9640:("BgCheck_ResetPolyCheckTbl",),
0x800C9694:("SurfaceType_GetData",),
- 0x800C9704:("SurfaceType_GetCamDataIndex",),
- 0x800C9728:("func_800C9728",),
- 0x800C9770:("SurfaceType_GetCameraSetting",),
- 0x800C97F8:("func_800C97F8",),
- 0x800C9844:("func_800C9844",),
- 0x800C98CC:("func_800C98CC",),
- 0x800C9924:("SurfaceType_GetCamPosData",),
+ 0x800C9704:("SurfaceType_GetBgCamIndex",),
+ 0x800C9728:("BgCheck_GetBgCamSettingImpl",),
+ 0x800C9770:("BgCheck_GetBgCamSetting",),
+ 0x800C97F8:("BgCheck_GetBgCamCountImpl",),
+ 0x800C9844:("BgCheck_GetBgCamCount",),
+ 0x800C98CC:("BgCheck_GetBgCamFuncDataImpl",),
+ 0x800C9924:("BgCheck_GetBgCamFuncData",),
0x800C99AC:("SurfaceType_GetSceneExitIndex",),
0x800C99D4:("func_800C99D4",),
0x800C99FC:("func_800C99FC",),
@@ -1085,9 +1085,9 @@
0x800CA1E8:("WaterBox_GetSurface1_2",),
0x800CA22C:("WaterBox_GetSurface2",),
0x800CA568:("func_800CA568",),
- 0x800CA634:("WaterBox_GetCamDataIndex",),
- 0x800CA648:("WaterBox_GetCameraSetting",),
- 0x800CA6B8:("func_800CA6B8",),
+ 0x800CA634:("WaterBox_GetBgCamIndex",),
+ 0x800CA648:("WaterBox_GetBgCamSetting",),
+ 0x800CA6B8:("WaterBox_GetSceneBgCamSetting",),
0x800CA6D8:("WaterBox_GetLightSettingIndex",),
0x800CA6F0:("func_800CA6F0",),
0x800CA9D0:("func_800CA9D0",),
@@ -1131,7 +1131,7 @@
0x800CB7F8:("func_800CB7F8",),
0x800CB828:("func_800CB828",),
0x800CB854:("func_800CB854",),
- 0x800CB880:("func_800CB880",),
+ 0x800CB880:("Camera_IsSwimming",),
0x800CB8C8:("func_800CB8C8",),
0x800CB8F4:("func_800CB8F4",),
0x800CB924:("func_800CB924",),
@@ -1154,10 +1154,10 @@
0x800CC488:("func_800CC488",),
0x800CC56C:("func_800CC56C",),
0x800CC5C8:("func_800CC5C8",),
- 0x800CC740:("func_800CC740",),
- 0x800CC7A8:("func_800CC7A8",),
- 0x800CC804:("func_800CC804",),
- 0x800CC874:("func_800CC874",),
+ 0x800CC740:("Camera_GetBgCamOrActorCsCamSetting",),
+ 0x800CC7A8:("Camera_GetBgCamOrActorCsCamFuncData",),
+ 0x800CC804:("Camera_GetBgCamIndex",),
+ 0x800CC874:("Camera_GetWaterBoxBgCamSetting",),
0x800CC938:("func_800CC938",),
0x800CC958:("func_800CC958",),
0x800CC9C0:("func_800CC9C0",),
@@ -1583,29 +1583,29 @@
0x800EE29C:("Cutscene_CheckActorAction",),
0x800EE2F4:("Cutscene_IsPlaying",),
0x800EE320:("GetItem_Draw",),
- 0x800EE364:("func_800EE364",),
- 0x800EE400:("func_800EE400",),
- 0x800EE5FC:("func_800EE5FC",),
- 0x800EE7D8:("func_800EE7D8",),
- 0x800EE940:("func_800EE940",),
- 0x800EEA48:("func_800EEA48",),
- 0x800EEC18:("func_800EEC18",),
- 0x800EED20:("func_800EED20",),
- 0x800EEE34:("func_800EEE34",),
- 0x800EEF4C:("func_800EEF4C",),
- 0x800EF054:("func_800EF054",),
- 0x800EF0F0:("func_800EF0F0",),
- 0x800EF1F4:("func_800EF1F4",),
- 0x800EF2AC:("func_800EF2AC",),
- 0x800EF364:("func_800EF364",),
- 0x800EF4D4:("func_800EF4D4",),
- 0x800EF65C:("func_800EF65C",),
- 0x800EF780:("func_800EF780",),
- 0x800EF89C:("func_800EF89C",),
- 0x800EF984:("func_800EF984",),
- 0x800EFAB8:("func_800EFAB8",),
- 0x800EFBFC:("func_800EFBFC",),
- 0x800EFD44:("func_800EFD44",),
+ 0x800EE364:("GetItem_DrawBombchu",),
+ 0x800EE400:("GetItem_DrawPoes",),
+ 0x800EE5FC:("GetItem_DrawFairyBottle",),
+ 0x800EE7D8:("GetItem_DrawSkullToken",),
+ 0x800EE940:("GetItem_DrawCompass",),
+ 0x800EEA48:("GetItem_DrawPotion",),
+ 0x800EEC18:("GetItem_DrawGoronSword",),
+ 0x800EED20:("GetItem_DrawDekuNuts",),
+ 0x800EEE34:("GetItem_DrawRecoveryHeart",),
+ 0x800EEF4C:("GetItem_DrawFish",),
+ 0x800EF054:("GetItem_DrawOpa0",),
+ 0x800EF0F0:("GetItem_DrawOpa0Xlu1",),
+ 0x800EF1F4:("GetItem_DrawOpa01",),
+ 0x800EF2AC:("GetItem_DrawXlu01",),
+ 0x800EF364:("GetItem_DrawSeahorse",),
+ 0x800EF4D4:("GetItem_DrawFairyContainer",),
+ 0x800EF65C:("GetItem_DrawMoonsTear",),
+ 0x800EF780:("GetItem_DrawMagicArrow",),
+ 0x800EF89C:("GetItem_DrawUpgrades",),
+ 0x800EF984:("GetItem_DrawRupee",),
+ 0x800EFAB8:("GetItem_DrawSmallRupee",),
+ 0x800EFBFC:("GetItem_DrawWallet",),
+ 0x800EFD44:("GetItem_DrawRemains",),
0x800EFE60:("EffFootmark_Init",),
0x800EFF04:("EffFootmark_Add",),
0x800F00BC:("EffFootmark_Update",),
@@ -3022,8 +3022,8 @@
0x80169AFC:("func_80169AFC",),
0x80169BC4:("Play_CameraGetUID",),
0x80169BF8:("func_80169BF8",),
- 0x80169C64:("Play_GetCsCamDataSetting",),
- 0x80169C84:("Play_GetCsCamDataVec3s",),
+ 0x80169C64:("Play_GetActorCsCamSetting",),
+ 0x80169C84:("Play_GetActorCsCamFuncData",),
0x80169CBC:("Play_GetOriginalSceneNumber",),
0x80169D40:("Play_SaveCycleSceneFlags",),
0x80169DCC:("Play_SetRespawnData",),
@@ -4089,19 +4089,19 @@
0x8080066C:("Title_Main",),
0x8080071C:("Title_Destroy",),
0x8080074C:("Title_Init",),
- 0x80800910:("Select_LoadTitle",),
- 0x80800930:("Select_LoadGame",),
- 0x80800A44:("Select_UpdateMenu",),
- 0x808013B8:("Select_PrintMenu",),
- 0x80801594:("Select_PrintLoadingMessage",),
- 0x80801620:("Select_PrintAgeSetting",),
- 0x808016E8:("Select_PrintCutsceneSetting",),
- 0x8080194C:("Select_DrawMenu",),
- 0x808019FC:("Select_DrawLoadingScreen",),
- 0x80801A64:("Select_Draw",),
- 0x80801AFC:("Select_Main",),
- 0x80801B28:("Select_Destroy",),
- 0x80801B4C:("Select_Init",),
+ 0x80800910:("MapSelect_LoadTitle",),
+ 0x80800930:("MapSelect_LoadGame",),
+ 0x80800A44:("MapSelect_UpdateMenu",),
+ 0x808013B8:("MapSelect_PrintMenu",),
+ 0x80801594:("MapSelect_PrintLoadingMessage",),
+ 0x80801620:("MapSelect_PrintAgeSetting",),
+ 0x808016E8:("MapSelect_PrintCutsceneSetting",),
+ 0x8080194C:("MapSelect_DrawMenu",),
+ 0x808019FC:("MapSelect_DrawLoadingScreen",),
+ 0x80801A64:("MapSelect_Draw",),
+ 0x80801AFC:("MapSelect_Main",),
+ 0x80801B28:("MapSelect_Destroy",),
+ 0x80801B4C:("MapSelect_Init",),
0x80803DF0:("Opening_SetupForTitleCutscene",),
0x80803EA0:("func_80803EA0",),
0x80803EC0:("Opening_Main",),
@@ -4200,10 +4200,10 @@
0x808160A0:("func_808160A0",),
0x80817B5C:("func_80817B5C",),
0x80818904:("func_80818904",),
- 0x80818920:("func_80818920",),
- 0x808190C4:("func_808190C4",),
- 0x80819238:("func_80819238",),
- 0x80819F04:("func_80819F04",),
+ 0x80818920:("KaleidoScope_DrawInventoryEditorText",),
+ 0x808190C4:("KaleidoScope_DrawDigit",),
+ 0x80819238:("KaleidoScope_DrawInventoryEditor",),
+ 0x80819F04:("KaleidoScope_UpdateInventoryEditor",),
0x8081B240:("func_8081B240",),
0x8081B6BC:("func_8081B6BC",),
0x8081B6EC:("func_8081B6EC",),
@@ -8065,10 +8065,10 @@
0x80973550:("EnTorch_Init",),
0x80973640:("ShotSun_Init",),
0x809736FC:("ShotSun_Destroy",),
- 0x80973740:("func_80973740",),
- 0x80973804:("func_80973804",),
- 0x809738D0:("func_809738D0",),
- 0x80973960:("func_80973960",),
+ 0x80973740:("ShotSun_SpawnFairy",),
+ 0x80973804:("ShotSun_TriggerFairy",),
+ 0x809738D0:("ShotSun_UpdateForOcarina",),
+ 0x80973960:("ShotSun_UpdateHyliaSun",),
0x80973B5C:("ShotSun_Update",),
0x80973C50:("ObjRoomtimer_Init",),
0x80973CA4:("ObjRoomtimer_Destroy",),
@@ -9080,33 +9080,33 @@
0x809C5E14:("EnBomBowlMan_Update",),
0x809C5F44:("EnBomBowlMan_OverrideLimbDraw",),
0x809C5FC4:("EnBomBowlMan_Draw",),
- 0x809C64C0:("func_809C64C0",),
+ 0x809C64C0:("EnSyatekiMan_Swamp_SpawnTargetActors",),
0x809C6578:("EnSyatekiMan_Init",),
0x809C66FC:("EnSyatekiMan_Destroy",),
- 0x809C6720:("func_809C6720",),
- 0x809C6810:("func_809C6810",),
- 0x809C6848:("func_809C6848",),
- 0x809C6A04:("func_809C6A04",),
- 0x809C6C2C:("func_809C6C2C",),
- 0x809C6E30:("func_809C6E30",),
- 0x809C6F98:("func_809C6F98",),
- 0x809C72D8:("func_809C72D8",),
- 0x809C7380:("func_809C7380",),
- 0x809C7620:("func_809C7620",),
- 0x809C7990:("func_809C7990",),
- 0x809C7A90:("func_809C7A90",),
- 0x809C7C14:("func_809C7C14",),
- 0x809C7D14:("func_809C7D14",),
- 0x809C7EB4:("func_809C7EB4",),
- 0x809C7FFC:("func_809C7FFC",),
- 0x809C80C0:("func_809C80C0",),
- 0x809C81D0:("func_809C81D0",),
- 0x809C8488:("func_809C8488",),
- 0x809C8610:("func_809C8610",),
- 0x809C8710:("func_809C8710",),
- 0x809C8808:("func_809C8808",),
- 0x809C898C:("func_809C898C",),
- 0x809C8BF0:("func_809C8BF0",),
+ 0x809C6720:("EnSyatekiMan_MovePlayerToPos",),
+ 0x809C6810:("EnSyatekiMan_SetupIdle",),
+ 0x809C6848:("EnSyatekiMan_Swamp_Idle",),
+ 0x809C6A04:("EnSyatekiMan_Swamp_HandleChoice",),
+ 0x809C6C2C:("EnSyatekiMan_Swamp_HandleNormalMessage",),
+ 0x809C6E30:("EnSyatekiMan_Swamp_Talk",),
+ 0x809C6F98:("EnSyatekiMan_Town_StartIntroTextbox",),
+ 0x809C72D8:("EnSyatekiMan_Town_Idle",),
+ 0x809C7380:("EnSyatekiMan_Town_HandleChoice",),
+ 0x809C7620:("EnSyatekiMan_Town_HandleNormalMessage",),
+ 0x809C7990:("EnSyatekiMan_Town_Talk",),
+ 0x809C7A90:("EnSyatekiMan_Swamp_SetupGiveReward",),
+ 0x809C7C14:("EnSyatekiMan_Swamp_GiveReward",),
+ 0x809C7D14:("EnSyatekiMan_Town_SetupGiveReward",),
+ 0x809C7EB4:("EnSyatekiMan_Town_GiveReward",),
+ 0x809C7FFC:("EnSyatekiMan_Swamp_MovePlayerAndExplainRules",),
+ 0x809C80C0:("EnSyatekiMan_Swamp_StartGame",),
+ 0x809C81D0:("EnSyatekiMan_Swamp_RunGame",),
+ 0x809C8488:("EnSyatekiMan_Swamp_EndGame",),
+ 0x809C8610:("EnSyatekiMan_Swamp_AddBonusPoints",),
+ 0x809C8710:("EnSyatekiMan_Town_MovePlayerAndSayHighScore",),
+ 0x809C8808:("EnSyatekiMan_Town_StartGame",),
+ 0x809C898C:("EnSyatekiMan_Town_RunGame",),
+ 0x809C8BF0:("EnSyatekiMan_Town_EndGame",),
0x809C8DE8:("EnSyatekiMan_Blink",),
0x809C8E44:("EnSyatekiMan_Update",),
0x809C8EE4:("EnSyatekiMan_OverrideLimbDraw",),
@@ -11547,29 +11547,29 @@
0x80AA90F4:("func_80AA90F4",),
0x80AA9140:("DmChar01_Update",),
0x80AA922C:("DmChar01_Draw",),
- 0x80AAAE30:("DmChar02_ChangeAnimationByInfo",),
- 0x80AAAECC:("func_80AAAECC",),
- 0x80AAAF2C:("func_80AAAF2C",),
+ 0x80AAAE30:("DmChar02_ChangeAnimation",),
+ 0x80AAAECC:("DmChar02_PlaySfxForDroppingOcarinaCutscene",),
+ 0x80AAAF2C:("DmChar02_PlaySfxForCutscenes",),
0x80AAAF78:("DmChar02_Init",),
0x80AAB03C:("DmChar02_Destroy",),
- 0x80AAB04C:("func_80AAB04C",),
+ 0x80AAB04C:("DmChar02_PerformCutsceneActions",),
0x80AAB19C:("DmChar02_Update",),
- 0x80AAB23C:("func_80AAB23C",),
- 0x80AAB258:("func_80AAB258",),
- 0x80AAB270:("func_80AAB270",),
+ 0x80AAB23C:("DmChar02_OverrideLimbDraw",),
+ 0x80AAB258:("DmChar02_PostLimbDraw",),
+ 0x80AAB270:("DmChar02_TransformLimbDraw",),
0x80AAB284:("DmChar02_Draw",),
- 0x80AAB4A0:("func_80AAB4A0",),
+ 0x80AAB4A0:("DmChar03_ChangeAnimation",),
0x80AAB53C:("DmChar03_Init",),
0x80AAB5E8:("DmChar03_Destroy",),
0x80AAB5F8:("func_80AAB5F8",),
0x80AAB644:("func_80AAB644",),
- 0x80AAB700:("func_80AAB700",),
+ 0x80AAB700:("DmChar03_DoNothing",),
0x80AAB710:("func_80AAB710",),
0x80AAB838:("func_80AAB838",),
0x80AAB8DC:("DmChar03_Update",),
- 0x80AAB974:("func_80AAB974",),
- 0x80AAB990:("func_80AAB990",),
- 0x80AAB9A8:("func_80AAB9A8",),
+ 0x80AAB974:("DmChar03_OverrideLimbDraw",),
+ 0x80AAB990:("DmChar03_PostLimbDraw",),
+ 0x80AAB9A8:("DmChar03_TransformLimbDraw",),
0x80AAB9BC:("DmChar03_Draw",),
0x80AABA84:("func_80AABA84",),
0x80AABC40:("DmChar04_ChangeAnim",),
@@ -13157,46 +13157,46 @@
0x80B1A1B0:("TGSw_Draw",),
0x80B1A3B0:("EnPoSisters_Init",),
0x80B1A600:("EnPoSisters_Destroy",),
- 0x80B1A648:("func_80B1A648",),
- 0x80B1A768:("func_80B1A768",),
- 0x80B1A894:("func_80B1A894",),
- 0x80B1A9B0:("func_80B1A9B0",),
- 0x80B1AA88:("func_80B1AA88",),
- 0x80B1AAE8:("func_80B1AAE8",),
- 0x80B1AB5C:("func_80B1AB5C",),
- 0x80B1ABB8:("func_80B1ABB8",),
- 0x80B1AC40:("func_80B1AC40",),
- 0x80B1ACB8:("func_80B1ACB8",),
- 0x80B1AE28:("func_80B1AE28",),
- 0x80B1AE3C:("func_80B1AE3C",),
- 0x80B1AF8C:("func_80B1AF8C",),
- 0x80B1B020:("func_80B1B020",),
- 0x80B1B0E0:("func_80B1B0E0",),
- 0x80B1B168:("func_80B1B168",),
- 0x80B1B280:("func_80B1B280",),
- 0x80B1B2F0:("func_80B1B2F0",),
- 0x80B1B3A8:("func_80B1B3A8",),
- 0x80B1B444:("func_80B1B444",),
- 0x80B1B5B4:("func_80B1B5B4",),
- 0x80B1B628:("func_80B1B628",),
- 0x80B1B70C:("func_80B1B70C",),
- 0x80B1B7BC:("func_80B1B7BC",),
- 0x80B1B860:("func_80B1B860",),
- 0x80B1B940:("func_80B1B940",),
- 0x80B1BA3C:("func_80B1BA3C",),
- 0x80B1BA90:("func_80B1BA90",),
- 0x80B1BC4C:("func_80B1BC4C",),
- 0x80B1BCA0:("func_80B1BCA0",),
- 0x80B1BCF0:("func_80B1BCF0",),
- 0x80B1BE4C:("func_80B1BE4C",),
- 0x80B1BF2C:("func_80B1BF2C",),
- 0x80B1C030:("func_80B1C030",),
- 0x80B1C0A4:("func_80B1C0A4",),
- 0x80B1C2E8:("func_80B1C2E8",),
- 0x80B1C340:("func_80B1C340",),
- 0x80B1C408:("func_80B1C408",),
+ 0x80B1A648:("EnPoSisters_UpdateDeathFlameSwirl",),
+ 0x80B1A768:("EnPoSisters_MatchPlayerXZ",),
+ 0x80B1A894:("EnPoSisters_MatchPlayerY",),
+ 0x80B1A9B0:("EnPoSisters_CheckZTarget",),
+ 0x80B1AA88:("EnPoSisters_SetupObserverIdle",),
+ 0x80B1AAE8:("EnPoSisters_ObserverIdle",),
+ 0x80B1AB5C:("EnPoSisters_SetupAimlessIdleFlying2",),
+ 0x80B1ABB8:("EnPoSisters_AimlessIdleFlying2",),
+ 0x80B1AC40:("EnPoSisters_SetupAimlessIdleFlying",),
+ 0x80B1ACB8:("EnPoSisters_AimlessIdleFlying",),
+ 0x80B1AE28:("EnPoSisters_SetupInvestigating",),
+ 0x80B1AE3C:("EnPoSisters_Investigating",),
+ 0x80B1AF8C:("EnPoSisters_SetupSpinUp",),
+ 0x80B1B020:("EnPoSisters_SpinUp",),
+ 0x80B1B0E0:("EnPoSisters_SetupSpinAttack",),
+ 0x80B1B168:("EnPoSisters_SpinAttack",),
+ 0x80B1B280:("EnPoSisters_SetupAttackConnect",),
+ 0x80B1B2F0:("EnPoSisters_AttackConnectDrift",),
+ 0x80B1B3A8:("EnPoSisters_SetupDamageFlinch",),
+ 0x80B1B444:("EnPoSisters_DamageFlinch",),
+ 0x80B1B5B4:("EnPoSisters_SetupFlee",),
+ 0x80B1B628:("EnPoSisters_Flee",),
+ 0x80B1B70C:("EnPoSisters_SetupSpinToInvis",),
+ 0x80B1B7BC:("EnPoSisters_SpinToInvis",),
+ 0x80B1B860:("EnPoSisters_SetupSpinBackToVisible",),
+ 0x80B1B940:("EnPoSisters_SpinBackToVisible",),
+ 0x80B1BA3C:("EnPoSisters_SetupDeathStage1",),
+ 0x80B1BA90:("EnPoSisters_DeathStage1",),
+ 0x80B1BC4C:("EnPoSisters_SetupDeathStage2",),
+ 0x80B1BCA0:("EnPoSisters_DeathStage2",),
+ 0x80B1BCF0:("EnPoSisters_SpawnMegClones",),
+ 0x80B1BE4C:("EnPoSisters_MegCloneVanish",),
+ 0x80B1BF2C:("EnPoSisters_MegCloneWaitForSpinBack",),
+ 0x80B1C030:("EnPoSisters_SetupMegSurroundPlayer",),
+ 0x80B1C0A4:("EnPoSisters_MegSurroundPlayer",),
+ 0x80B1C2E8:("EnPoSisters_SetupSpawnPo",),
+ 0x80B1C340:("EnPoSisters_PoeSpawn",),
+ 0x80B1C408:("EnPoSisters_CheckCollision",),
0x80B1C61C:("EnPoSisters_Update",),
- 0x80B1C974:("func_80B1C974",),
+ 0x80B1C974:("EnPoSisters_UpdateColors",),
0x80B1CB44:("EnPoSisters_OverrideLimbDraw",),
0x80B1CD34:("EnPoSisters_PostLimbDraw",),
0x80B1D484:("EnPoSisters_Draw",),
@@ -14462,57 +14462,57 @@
0x80B77354:("EnTruMt_TransformLimbDraw",),
0x80B773D0:("EnTruMt_Draw",),
0x80B77770:("func_80B77770",),
- 0x80B77FA4:("func_80B77FA4",),
+ 0x80B77FA4:("ObjUm_InitBandits",),
0x80B781DC:("func_80B781DC",),
0x80B783E0:("func_80B783E0",),
0x80B78764:("func_80B78764",),
0x80B78A54:("func_80B78A54",),
0x80B78C18:("func_80B78C18",),
- 0x80B78D08:("func_80B78D08",),
+ 0x80B78D08:("ObjUm_UpdateBanditsCollisions",),
0x80B78DF0:("func_80B78DF0",),
0x80B78E2C:("ObjUm_SetupAction",),
- 0x80B78E38:("func_80B78E38",),
- 0x80B78E88:("func_80B78E88",),
+ 0x80B78E38:("ObjUm_SetPlayerPosition",),
+ 0x80B78E88:("ObjUm_RotatePlayer",),
0x80B78EBC:("func_80B78EBC",),
- 0x80B78EFC:("func_80B78EFC",),
+ 0x80B78EFC:("ObjUm_RotatePlayerView",),
0x80B78F24:("ObjUm_Init",),
0x80B7949C:("ObjUm_Destroy",),
0x80B79524:("func_80B79524",),
0x80B79560:("func_80B79560",),
0x80B795A0:("func_80B795A0",),
0x80B79734:("func_80B79734",),
- 0x80B797EC:("func_80B797EC",),
+ 0x80B797EC:("ObjUm_RanchGetDialogue",),
0x80B7984C:("func_80B7984C",),
0x80B79A24:("func_80B79A24",),
- 0x80B79A50:("func_80B79A50",),
- 0x80B79BA0:("func_80B79BA0",),
- 0x80B79F10:("func_80B79F10",),
- 0x80B79FFC:("func_80B79FFC",),
+ 0x80B79A50:("ObjUm_RanchWait",),
+ 0x80B79BA0:("ObjUm_UpdatePath",),
+ 0x80B79F10:("ObjUm_RanchWaitPathFinished",),
+ 0x80B79FFC:("ObjUm_RanchStartCs",),
0x80B7A070:("func_80B7A070",),
0x80B7A0E0:("func_80B7A0E0",),
0x80B7A144:("func_80B7A144",),
- 0x80B7A1B4:("func_80B7A1B4",),
+ 0x80B7A1B4:("ObjUm_PreMilkRunDialogueHandler",),
0x80B7A240:("func_80B7A240",),
0x80B7A2AC:("func_80B7A2AC",),
0x80B7A394:("func_80B7A394",),
- 0x80B7A400:("func_80B7A400",),
- 0x80B7A494:("func_80B7A494",),
+ 0x80B7A400:("ObjUm_PreMilkRunStartCs",),
+ 0x80B7A494:("ObjUm_RunMinigame",),
0x80B7A614:("func_80B7A614",),
0x80B7A7AC:("func_80B7A7AC",),
0x80B7A860:("func_80B7A860",),
0x80B7AB78:("func_80B7AB78",),
0x80B7ABE4:("func_80B7ABE4",),
- 0x80B7AC94:("func_80B7AC94",),
- 0x80B7AD34:("func_80B7AD34",),
- 0x80B7AE58:("func_80B7AE58",),
- 0x80B7AEFC:("func_80B7AEFC",),
+ 0x80B7AC94:("ObjUm_StartCs",),
+ 0x80B7AD34:("ObjUm_PostMilkRunWaitPathFinished",),
+ 0x80B7AE58:("ObjUm_PostMilkRunStartCs",),
+ 0x80B7AEFC:("ObjUm_TerminaFieldIdle",),
0x80B7AF30:("func_80B7AF30",),
- 0x80B7B154:("func_80B7B154",),
- 0x80B7B18C:("func_80B7B18C",),
+ 0x80B7B154:("ObjUm_DefaultAnim",),
+ 0x80B7B18C:("ObjUm_UpdateAnim",),
0x80B7B368:("ObjUm_Update",),
- 0x80B7B598:("func_80B7B598",),
- 0x80B7B93C:("func_80B7B93C",),
- 0x80B7BABC:("func_80B7BABC",),
+ 0x80B7B598:("ObjUm_OverrideLimbDraw",),
+ 0x80B7B93C:("ObjUm_SpawnFragments",),
+ 0x80B7BABC:("ObjUm_PostLimbDraw",),
0x80B7BEA4:("func_80B7BEA4",),
0x80B7C03C:("ObjUm_Draw",),
0x80B7C890:("EnNeoReeba_Init",),
@@ -16610,10 +16610,10 @@
0x80C08480:("ObjUsiyane_Draw",),
0x80C08760:("EnNnh_Init",),
0x80C087FC:("EnNnh_Destroy",),
- 0x80C08828:("func_80C08828",),
- 0x80C0883C:("func_80C0883C",),
- 0x80C088A4:("func_80C088A4",),
- 0x80C088B8:("func_80C088B8",),
+ 0x80C08828:("EnNnh_SetupWaitForDialogue",),
+ 0x80C0883C:("EnNnh_WaitForDialogue",),
+ 0x80C088A4:("EnNnh_SetupDialogue",),
+ 0x80C088B8:("EnNnh_Dialogue",),
0x80C088EC:("EnNnh_Update",),
0x80C08950:("EnNnh_Draw",),
0x80C08A80:("ObjKzsaku_Init",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index d702f5880..0c2490f40 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -914,7 +914,7 @@
0x801BB148:("sCsStateHandlers2","cutscene_update_func","[5]",0x14),
0x801BB15C:("D_801BB15C","UNK_TYPE2","",0x2),
0x801BB160:("D_801BB160","UNK_TYPE4","",0x4),
- 0x801BB170:("D_801BB170","s801BB170","[118]",0x1098),
+ 0x801BB170:("sDrawItemTable","DrawItemTableEntry","[118]",0x1098),
0x801BC210:("D_801BC210","UNK_TYPE1","",0x1),
0x801BC240:("D_801BC240","Gfx","[9]",0x48),
0x801BC288:("D_801BC288","Gfx","[3]",0x18),
@@ -970,7 +970,7 @@
0x801BDBA0:("D_801BDBA0","UNK_TYPE1","",0x1),
0x801BDBA4:("D_801BDBA4","UNK_TYPE1","",0x1),
0x801BDBA8:("D_801BDBA8","UNK_TYPE1","",0x1),
- 0x801BDBB0:("D_801BDBB0","u8","",0x1),
+ 0x801BDBB0:("gWeatherMode","u8","",0x1),
0x801BDBB4:("D_801BDBB4","UNK_TYPE1","",0x1),
0x801BDBB8:("D_801BDBB8","UNK_TYPE1","",0x1),
0x801BDBBC:("D_801BDBBC","UNK_TYPE1","",0x1),
@@ -1942,7 +1942,7 @@
0x801C5FC0:("D_801C5FC0","u32","[452]",0x710),
0x801C66D0:("D_801C66D0","UNK_TYPE2","",0x2),
0x801C6798:("D_801C6798","UNK_TYPE4","",0x4),
- 0x801C67B0:("D_801C67B0","UNK_TYPE1","",0x1),
+ 0x801C67B0:("gAmmoItems","UNK_TYPE1","",0x1),
0x801C67C8:("D_801C67C8","s32","[8]",0x20),
0x801C67E8:("D_801C67E8","UNK_TYPE4","",0x4),
0x801C67F0:("D_801C67F0","s32","[8]",0x20),
@@ -4681,24 +4681,18 @@
0x8082AFB0:("D_8082AFB0","UNK_TYPE1","",0x1),
0x8082AFC4:("D_8082AFC4","UNK_TYPE2","",0x2),
0x8082AFDC:("D_8082AFDC","UNK_TYPE2","",0x2),
- 0x8082AFF4:("D_8082AFF4","UNK_TYPE2","",0x2),
- 0x8082B008:("D_8082B008","UNK_TYPE1","",0x1),
+ 0x8082AFF4:("D_8082AFF4","s16","[12]",0x18),
+ 0x8082B00C:("D_8082B00C","void*","[6]",0x18),
0x8082B024:("D_8082B024","UNK_TYPE1","",0x1),
0x8082B028:("D_8082B028","UNK_TYPE2","",0x2),
- 0x8082B02C:("D_8082B02C","UNK_TYPE1","",0x1),
- 0x8082B02E:("D_8082B02E","UNK_TYPE1","",0x1),
- 0x8082B030:("D_8082B030","UNK_TYPE1","",0x1),
- 0x8082B032:("D_8082B032","UNK_TYPE1","",0x1),
- 0x8082B0F0:("D_8082B0F0","UNK_TYPE2","",0x2),
- 0x8082B0F4:("D_8082B0F4","UNK_TYPE2","",0x2),
- 0x8082B0F8:("D_8082B0F8","UNK_TYPE1","",0x1),
- 0x8082B2FA:("D_8082B2FA","UNK_TYPE1","",0x1),
- 0x8082B302:("D_8082B302","UNK_TYPE1","",0x1),
- 0x8082B30A:("D_8082B30A","UNK_TYPE1","",0x1),
- 0x8082B328:("D_8082B328","UNK_TYPE1","",0x1),
- 0x8082B388:("D_8082B388","UNK_TYPE2","",0x2),
- 0x8082B3AC:("D_8082B3AC","UNK_TYPE4","",0x4),
- 0x8082B3B0:("D_8082B3B0","UNK_TYPE4","",0x4),
+ 0x8082B02C:("D_8082B02C","s16","[98]",0xC4),
+ 0x8082B0F0:("sCurSection","UNK_TYPE2","",0x2),
+ 0x8082B0F4:("sCurRow","UNK_TYPE2","",0x2),
+ 0x8082B0F8:("sSectionPositions","s16","[280]",0x230),
+ 0x8082B328:("sSlotItems","UNK_TYPE1","",0x1),
+ 0x8082B388:("sRowFirstSections","UNK_TYPE2","",0x2),
+ 0x8082B3AC:("sPrevDBtnInput","UNK_TYPE4","",0x4),
+ 0x8082B3B0:("sHeldDBtnTimer","UNK_TYPE4","",0x4),
0x8082B3C0:("D_8082B3C0","UNK_TYPE2","",0x2),
0x8082B3C4:("D_8082B3C4","UNK_TYPE2","",0x2),
0x8082B3C8:("D_8082B3C8","UNK_TYPE2","",0x2),
@@ -4723,10 +4717,7 @@
0x8082B520:("D_8082B520","UNK_TYPE1","",0x1),
0x8082B52C:("D_8082B52C","UNK_TYPE1","",0x1),
0x8082B538:("D_8082B538","UNK_TYPE1","",0x1),
- 0x8082B548:("D_8082B548","UNK_TYPE4","",0x4),
- 0x8082B54A:("D_8082B54A","UNK_TYPE1","",0x1),
- 0x8082B552:("D_8082B552","UNK_TYPE1","",0x1),
- 0x8082B55A:("D_8082B55A","UNK_TYPE1","",0x1),
+ 0x8082B548:("D_8082B548","s16","[30]",0x3C),
0x8082B584:("D_8082B584","UNK_TYPE2","",0x2),
0x8082B590:("D_8082B590","UNK_TYPE2","",0x2),
0x8082B59C:("D_8082B59C","UNK_TYPE1","",0x1),
@@ -9922,23 +9913,23 @@
0x809C6264:("D_809C6264","f32","",0x4),
0x809C6268:("D_809C6268","f32","",0x4),
0x809C9160:("En_Syateki_Man_InitVars","UNK_TYPE1","",0x1),
- 0x809C9180:("D_809C9180","UNK_TYPE1","",0x1),
- 0x809C91C8:("D_809C91C8","UNK_TYPE1","",0x1),
- 0x809C91D0:("D_809C91D0","UNK_TYPE1","",0x1),
- 0x809C934C:("D_809C934C","UNK_TYPE1","",0x1),
- 0x809C9464:("D_809C9464","UNK_PTR","",0x4),
- 0x809C946C:("D_809C946C","UNK_TYPE1","",0x1),
- 0x809C9474:("D_809C9474","UNK_TYPE4","",0x4),
- 0x809C9480:("D_809C9480","UNK_TYPE4","",0x4),
- 0x809C948C:("D_809C948C","UNK_TYPE4","",0x4),
- 0x809C9498:("D_809C9498","UNK_TYPE2","",0x2),
- 0x809C949C:("D_809C949C","UNK_TYPE2","",0x2),
- 0x809C94A0:("D_809C94A0","UNK_TYPE4","",0x4),
- 0x809C94A4:("D_809C94A4","UNK_TYPE2","",0x2),
- 0x809C94A8:("D_809C94A8","UNK_TYPE4","",0x4),
- 0x809C94AC:("D_809C94AC","UNK_TYPE4","",0x4),
- 0x809C94B8:("D_809C94B8","UNK_PTR","",0x4),
- 0x809C94D0:("D_809C94D0","UNK_TYPE1","",0x1),
+ 0x809C9180:("sAnimations","UNK_TYPE1","",0x1),
+ 0x809C91C8:("sGuayFlagsPerWave","UNK_TYPE1","",0x1),
+ 0x809C91D0:("sNormalSwampTargetActorList","UNK_TYPE1","",0x1),
+ 0x809C934C:("sUnusedSwampTargetActorList","UNK_TYPE1","",0x1),
+ 0x809C9464:("sSwampTargetActorLists","UNK_PTR","",0x4),
+ 0x809C946C:("sSwampTargetActorListLengths","UNK_TYPE1","",0x1),
+ 0x809C9474:("sSwampPlayerPos","UNK_TYPE4","",0x4),
+ 0x809C9480:("sTownFierceDietyPlayerPos","UNK_TYPE4","",0x4),
+ 0x809C948C:("sTownPlayerPos","UNK_TYPE4","",0x4),
+ 0x809C9498:("sGameStartTimer","s16","",0x2),
+ 0x809C949C:("sHasSpawnedGuaysForThisWave","UNK_TYPE2","",0x2),
+ 0x809C94A0:("sBonusTimer","s32","",0x4),
+ 0x809C94A4:("sGameStartTimer","s16","",0x2),
+ 0x809C94A8:("sModFromLosingTime","s32","",0x4),
+ 0x809C94AC:("sFocusOffset","UNK_TYPE4","",0x4),
+ 0x809C94B8:("sEyeTextures","UNK_PTR","",0x4),
+ 0x809C94D0:("sOctorokFlagsPerWave","UNK_TYPE1","",0x1),
0x809C950C:("jtbl_809C950C","UNK_PTR","",0x4),
0x809C9544:("jtbl_809C9544","UNK_PTR","",0x4),
0x809C9570:("jtbl_809C9570","UNK_PTR","",0x4),
@@ -13882,7 +13873,7 @@
0x80B1A348:("D_80B1A348","f32","",0x4),
0x80B1A34C:("D_80B1A34C","f32","",0x4),
0x80B1DA30:("D_80B1DA30","UNK_TYPE1","",0x1),
- 0x80B1DA40:("D_80B1DA40","UNK_TYPE1","",0x1),
+ 0x80B1DA40:("sPoSisterEnvColors","UNK_TYPE1","",0x1),
0x80B1DA50:("En_Po_Sisters_InitVars","UNK_TYPE1","",0x1),
0x80B1DA70:("D_80B1DA70","UNK_TYPE1","",0x1),
0x80B1DA9C:("D_80B1DA9C","UNK_TYPE1","",0x1),
@@ -14348,11 +14339,11 @@
0x80B4E934:("D_80B4E934","UNK_TYPE4","",0x4),
0x80B4E938:("D_80B4E938","f32","",0x4),
0x80B4E940:("D_80B4E940","UNK_TYPE4","",0x4),
- 0x80B4E944:("D_80B4E944","UNK_TYPE4","",0x4),
- 0x80B4E958:("D_80B4E958","UNK_TYPE4","",0x4),
+ 0x80B4E944:("sRomaniEyeTextures","UNK_TYPE4","",0x4),
+ 0x80B4E958:("sRomaniMouthTextures","UNK_TYPE4","",0x4),
0x80B4E968:("D_80B4E968","UNK_TYPE1","",0x1),
- 0x80B4E96C:("D_80B4E96C","UNK_TYPE4","",0x4),
- 0x80B4E984:("D_80B4E984","UNK_TYPE4","",0x4),
+ 0x80B4E96C:("sCremiaEyeTextures","UNK_TYPE4","",0x4),
+ 0x80B4E984:("sCremiaMouthTextures","UNK_TYPE4","",0x4),
0x80B4E994:("D_80B4E994","UNK_TYPE1","",0x1),
0x80B4E998:("D_80B4E998","UNK_TYPE1","",0x1),
0x80B4E99C:("D_80B4E99C","UNK_TYPE1","",0x1),
@@ -15003,14 +14994,12 @@
0x80B77684:("D_80B77684","f32","",0x4),
0x80B77688:("D_80B77688","f32","",0x4),
0x80B7C0F0:("Obj_Um_InitVars","UNK_TYPE1","",0x1),
- 0x80B7C110:("D_80B7C110","UNK_TYPE1","",0x1),
- 0x80B7C128:("D_80B7C128","UNK_TYPE1","",0x1),
- 0x80B7C138:("D_80B7C138","UNK_TYPE1","",0x1),
+ 0x80B7C110:("sEyeTextures","UNK_TYPE1","",0x1),
+ 0x80B7C128:("sMouthTextures","UNK_TYPE1","",0x1),
+ 0x80B7C138:("sCylinderInit","UNK_TYPE1","",0x1),
0x80B7C164:("D_80B7C164","UNK_TYPE4","",0x4),
- 0x80B7C254:("D_80B7C254","UNK_TYPE4","",0x4),
- 0x80B7C25C:("D_80B7C25C","UNK_TYPE1","",0x1),
- 0x80B7C260:("D_80B7C260","UNK_TYPE1","",0x1),
- 0x80B7C274:("D_80B7C274","UNK_TYPE1","",0x1),
+ 0x80B7C254:("sInitChain","UNK_TYPE4","",0x4),
+ 0x80B7C25C:("sUmAnims","UNK_TYPE1","[5]",0x28),
0x80B7C284:("D_80B7C284","UNK_TYPE4","",0x4),
0x80B7C290:("D_80B7C290","UNK_TYPE4","",0x4),
0x80B7C29C:("D_80B7C29C","UNK_TYPE4","",0x4),
diff --git a/tools/namefixer.py b/tools/namefixer.py
index 06dd21e95..da595fb89 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -393,8 +393,8 @@ wordReplace = {
"BgCheck_RelocateMeshHeader": "CollisionHeader_GetVirtual",
"BgCheck_RelocateAllMeshHeaders": "BgCheck_InitCollisionHeaders",
"BgCheck_GetPolygonAttributes": "SurfaceType_GetData",
- "func_800C9704": "SurfaceType_GetCamDataIndex",
- "func_800C9924": "SurfaceType_GetCamPosData",
+ "func_800C9704": "SurfaceType_GetBgCamIndex",
+ "func_800C9924": "BgCheck_GetBgCamFuncData",
"func_800C99AC": "SurfaceType_GetSceneExitIndex",
"func_800C9B90": "SurfaceType_IsHorseBlocked",
"func_800C9BDC": "SurfaceType_GetSfx",
@@ -460,8 +460,8 @@ wordReplace = {
"func_801699D4": "Play_CopyCamera",
"func_80169AC0": "Play_CameraChangeSetting",
"func_80169BC4": "Play_CameraGetUID",
- "func_80169C64": "Play_GetCsCamDataSetting",
- "func_80169C84": "Play_GetCsCamDataVec3s",
+ "func_80169C64": "Play_GetActorCsCamSetting",
+ "func_80169C84": "Play_GetActorCsCamFuncData",
"convert_scene_number_among_shared_scenes": "Play_GetOriginalSceneNumber",
"func_80169D40": "Play_SaveCycleSceneFlags",
"func_80169DCC": "Play_SetRespawnData",
@@ -576,6 +576,7 @@ wordReplace = {
"func_800E8F08": "Actor_TrackNone",
"func_800E8FA4": "Actor_TrackPoint",
"func_800E9250": "Actor_TrackPlayer",
+ "func_800E8EA0": "Actor_ContinueText",
"func_8010A000": "Map_GetDungeonOrBossAreaIndex",
"func_8010A074": "Map_IsInDungeonOrBossArea",
@@ -626,6 +627,7 @@ wordReplace = {
"gSaveContext.playerForm": "gSaveContext.save.playerForm",
"gSaveContext.day": "gSaveContext.save.day",
"gSaveContext.isNight": "gSaveContext.save.isNight",
+ "gSaveContext.environmentTime": "gSaveContext.skyboxTime",
"gSaveContext.naviTimer": "gSaveContext.save.playerData.tatlTimer",
"gSaveContext.tatlTimer": "gSaveContext.save.playerData.tatlTimer",
"gSaveContext.rupees": "gSaveContext.save.playerData.rupees",
@@ -691,7 +693,7 @@ wordReplace = {
"gSaveContext.nextTransition": "gSaveContext.nextTransitionType",
"gSaveContext.unk_3F48": "gSaveContext.cutsceneTransitionControl",
"gSaveContext.fadeDuration": "gSaveContext.transFadeDuration",
- "gSaveContext.fadeSpeed": "gSaveContext.transWipeSpeed"
+ "gSaveContext.fadeSpeed": "gSaveContext.transWipeSpeed",
"D_801D15B0" : "gZeroVec3f",
"D_801D15BC" : "gZeroVec3s",
diff --git a/tools/permuter_settings.toml b/tools/permuter_settings.toml
index 9b1959be9..bf61be341 100644
--- a/tools/permuter_settings.toml
+++ b/tools/permuter_settings.toml
@@ -11,6 +11,8 @@ CLOSE_DISPS = "void"
ABS = "int"
ABS_ALT = "int"
SQ = "int"
+ARRAY_COUNT = "int"
+ARRAY_COUNTU = "int"
CLAMP = "int"
CLOCK_TIME = "int"
CURRENT_DAY = "int"
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index 2bd3163a3..d884a1081 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -561,13 +561,13 @@ asm/non_matchings/code/z_bgcheck/CollisionHeader_GetVirtual.s,CollisionHeader_Ge
asm/non_matchings/code/z_bgcheck/BgCheck_InitCollisionHeaders.s,BgCheck_InitCollisionHeaders,0x800C9598,0x2A
asm/non_matchings/code/z_bgcheck/func_800C9640.s,func_800C9640,0x800C9640,0x15
asm/non_matchings/code/z_bgcheck/SurfaceType_GetData.s,SurfaceType_GetData,0x800C9694,0x1C
-asm/non_matchings/code/z_bgcheck/SurfaceType_GetCamDataIndex.s,SurfaceType_GetCamDataIndex,0x800C9704,0x9
-asm/non_matchings/code/z_bgcheck/func_800C9728.s,func_800C9728,0x800C9728,0x12
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetBgCamIndex.s,SurfaceType_GetBgCamIndex,0x800C9704,0x9
+asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamSettingImpl.s,BgCheck_GetBgCamSettingImpl,0x800C9728,0x12
asm/non_matchings/code/z_bgcheck/func_800C9770.s,func_800C9770,0x800C9770,0x22
-asm/non_matchings/code/z_bgcheck/func_800C97F8.s,func_800C97F8,0x800C97F8,0x13
-asm/non_matchings/code/z_bgcheck/func_800C9844.s,func_800C9844,0x800C9844,0x22
-asm/non_matchings/code/z_bgcheck/func_800C98CC.s,func_800C98CC,0x800C98CC,0x16
-asm/non_matchings/code/z_bgcheck/SurfaceType_GetCamPosData.s,SurfaceType_GetCamPosData,0x800C9924,0x22
+asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamCountImpl.s,BgCheck_GetBgCamCountImpl,0x800C97F8,0x13
+asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamCount.s,BgCheck_GetBgCamCount,0x800C9844,0x22
+asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamFuncDataImpl.s,BgCheck_GetBgCamFuncDataImpl,0x800C98CC,0x16
+asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamFuncData.s,BgCheck_GetBgCamFuncData,0x800C9924,0x22
asm/non_matchings/code/z_bgcheck/SurfaceType_GetSceneExitIndex.s,SurfaceType_GetSceneExitIndex,0x800C99AC,0xA
asm/non_matchings/code/z_bgcheck/func_800C99D4.s,func_800C99D4,0x800C99D4,0xA
asm/non_matchings/code/z_bgcheck/func_800C99FC.s,func_800C99FC,0x800C99FC,0xA
@@ -601,7 +601,7 @@ asm/non_matchings/code/z_bgcheck/WaterBox_GetSurface2.s,WaterBox_GetSurface2,0x8
asm/non_matchings/code/z_bgcheck/func_800CA568.s,func_800CA568,0x800CA568,0x33
asm/non_matchings/code/z_bgcheck/func_800CA634.s,func_800CA634,0x800CA634,0x5
asm/non_matchings/code/z_bgcheck/func_800CA648.s,func_800CA648,0x800CA648,0x1C
-asm/non_matchings/code/z_bgcheck/func_800CA6B8.s,func_800CA6B8,0x800CA6B8,0x8
+asm/non_matchings/code/z_bgcheck/WaterBox_GetSceneBgCamSetting.s,WaterBox_GetSceneBgCamSetting,0x800CA6B8,0x8
asm/non_matchings/code/z_bgcheck/WaterBox_GetLightSettingIndex.s,WaterBox_GetLightSettingIndex,0x800CA6D8,0x6
asm/non_matchings/code/z_bgcheck/func_800CA6F0.s,func_800CA6F0,0x800CA6F0,0xB8
asm/non_matchings/code/z_bgcheck/func_800CA9D0.s,func_800CA9D0,0x800CA9D0,0x11
@@ -645,7 +645,7 @@ asm/non_matchings/code/z_camera/func_800CB7CC.s,func_800CB7CC,0x800CB7CC,0xB
asm/non_matchings/code/z_camera/func_800CB7F8.s,func_800CB7F8,0x800CB7F8,0xC
asm/non_matchings/code/z_camera/func_800CB828.s,func_800CB828,0x800CB828,0xB
asm/non_matchings/code/z_camera/func_800CB854.s,func_800CB854,0x800CB854,0xB
-asm/non_matchings/code/z_camera/func_800CB880.s,func_800CB880,0x800CB880,0x12
+asm/non_matchings/code/z_camera/Camera_IsSwimming.s,Camera_IsSwimming,0x800CB880,0x12
asm/non_matchings/code/z_camera/func_800CB8C8.s,func_800CB8C8,0x800CB8C8,0xB
asm/non_matchings/code/z_camera/func_800CB8F4.s,func_800CB8F4,0x800CB8F4,0xC
asm/non_matchings/code/z_camera/func_800CB924.s,func_800CB924,0x800CB924,0xB
@@ -668,10 +668,10 @@ asm/non_matchings/code/z_camera/func_800CC260.s,func_800CC260,0x800CC260,0x8A
asm/non_matchings/code/z_camera/func_800CC488.s,func_800CC488,0x800CC488,0x39
asm/non_matchings/code/z_camera/func_800CC56C.s,func_800CC56C,0x800CC56C,0x17
asm/non_matchings/code/z_camera/func_800CC5C8.s,func_800CC5C8,0x800CC5C8,0x5E
-asm/non_matchings/code/z_camera/func_800CC740.s,func_800CC740,0x800CC740,0x1A
-asm/non_matchings/code/z_camera/func_800CC7A8.s,func_800CC7A8,0x800CC7A8,0x17
-asm/non_matchings/code/z_camera/func_800CC804.s,func_800CC804,0x800CC804,0x1C
-asm/non_matchings/code/z_camera/func_800CC874.s,func_800CC874,0x800CC874,0x31
+asm/non_matchings/code/z_camera/Camera_GetBgCamOrActorCsCamSetting.s,Camera_GetBgCamOrActorCsCamSetting,0x800CC740,0x1A
+asm/non_matchings/code/z_camera/Camera_GetBgCamOrActorCsCamFuncData.s,Camera_GetBgCamOrActorCsCamFuncData,0x800CC7A8,0x17
+asm/non_matchings/code/z_camera/Camera_GetBgCamIndex.s,Camera_GetBgCamIndex,0x800CC804,0x1C
+asm/non_matchings/code/z_camera/Camera_GetWaterBoxBgCamSetting.s,Camera_GetWaterBoxBgCamSetting,0x800CC874,0x31
asm/non_matchings/code/z_camera/func_800CC938.s,func_800CC938,0x800CC938,0x8
asm/non_matchings/code/z_camera/func_800CC958.s,func_800CC958,0x800CC958,0x1A
asm/non_matchings/code/z_camera/func_800CC9C0.s,func_800CC9C0,0x800CC9C0,0xCB
@@ -1097,29 +1097,29 @@ asm/non_matchings/code/z_demo/Cutscene_GetActorActionIndex.s,Cutscene_GetActorAc
asm/non_matchings/code/z_demo/Cutscene_CheckActorAction.s,Cutscene_CheckActorAction,0x800EE29C,0x16
asm/non_matchings/code/z_demo/Cutscene_IsPlaying.s,Cutscene_IsPlaying,0x800EE2F4,0xB
asm/non_matchings/code/z_draw/GetItem_Draw.s,GetItem_Draw,0x800EE320,0x11
-asm/non_matchings/code/z_draw/func_800EE364.s,func_800EE364,0x800EE364,0x27
-asm/non_matchings/code/z_draw/func_800EE400.s,func_800EE400,0x800EE400,0x7F
-asm/non_matchings/code/z_draw/func_800EE5FC.s,func_800EE5FC,0x800EE5FC,0x77
-asm/non_matchings/code/z_draw/func_800EE7D8.s,func_800EE7D8,0x800EE7D8,0x5A
-asm/non_matchings/code/z_draw/func_800EE940.s,func_800EE940,0x800EE940,0x42
-asm/non_matchings/code/z_draw/func_800EEA48.s,func_800EEA48,0x800EEA48,0x74
-asm/non_matchings/code/z_draw/func_800EEC18.s,func_800EEC18,0x800EEC18,0x42
-asm/non_matchings/code/z_draw/func_800EED20.s,func_800EED20,0x800EED20,0x45
-asm/non_matchings/code/z_draw/func_800EEE34.s,func_800EEE34,0x800EEE34,0x46
-asm/non_matchings/code/z_draw/func_800EEF4C.s,func_800EEF4C,0x800EEF4C,0x42
-asm/non_matchings/code/z_draw/func_800EF054.s,func_800EF054,0x800EF054,0x27
-asm/non_matchings/code/z_draw/func_800EF0F0.s,func_800EF0F0,0x800EF0F0,0x41
-asm/non_matchings/code/z_draw/func_800EF1F4.s,func_800EF1F4,0x800EF1F4,0x2E
-asm/non_matchings/code/z_draw/func_800EF2AC.s,func_800EF2AC,0x800EF2AC,0x2E
-asm/non_matchings/code/z_draw/func_800EF364.s,func_800EF364,0x800EF364,0x5C
-asm/non_matchings/code/z_draw/func_800EF4D4.s,func_800EF4D4,0x800EF4D4,0x62
-asm/non_matchings/code/z_draw/func_800EF65C.s,func_800EF65C,0x800EF65C,0x49
-asm/non_matchings/code/z_draw/func_800EF780.s,func_800EF780,0x800EF780,0x47
-asm/non_matchings/code/z_draw/func_800EF89C.s,func_800EF89C,0x800EF89C,0x3A
-asm/non_matchings/code/z_draw/func_800EF984.s,func_800EF984,0x800EF984,0x4D
-asm/non_matchings/code/z_draw/func_800EFAB8.s,func_800EFAB8,0x800EFAB8,0x51
-asm/non_matchings/code/z_draw/func_800EFBFC.s,func_800EFBFC,0x800EFBFC,0x52
-asm/non_matchings/code/z_draw/func_800EFD44.s,func_800EFD44,0x800EFD44,0x47
+asm/non_matchings/code/z_draw/GetItem_DrawBombchu.s,GetItem_DrawBombchu,0x800EE364,0x27
+asm/non_matchings/code/z_draw/GetItem_DrawPoes.s,GetItem_DrawPoes,0x800EE400,0x7F
+asm/non_matchings/code/z_draw/GetItem_DrawFairyBottle.s,GetItem_DrawFairyBottle,0x800EE5FC,0x77
+asm/non_matchings/code/z_draw/GetItem_DrawSkullToken.s,GetItem_DrawSkullToken,0x800EE7D8,0x5A
+asm/non_matchings/code/z_draw/GetItem_DrawCompass.s,GetItem_DrawCompass,0x800EE940,0x42
+asm/non_matchings/code/z_draw/GetItem_DrawPotion.s,GetItem_DrawPotion,0x800EEA48,0x74
+asm/non_matchings/code/z_draw/GetItem_DrawGoronSword.s,GetItem_DrawGoronSword,0x800EEC18,0x42
+asm/non_matchings/code/z_draw/GetItem_DrawDekuNuts.s,GetItem_DrawDekuNuts,0x800EED20,0x45
+asm/non_matchings/code/z_draw/GetItem_DrawRecoveryHeart.s,GetItem_DrawRecoveryHeart,0x800EEE34,0x46
+asm/non_matchings/code/z_draw/GetItem_DrawFish.s,GetItem_DrawFish,0x800EEF4C,0x42
+asm/non_matchings/code/z_draw/GetItem_DrawOpa0.s,GetItem_DrawOpa0,0x800EF054,0x27
+asm/non_matchings/code/z_draw/GetItem_DrawOpa0Xlu1.s,GetItem_DrawOpa0Xlu1,0x800EF0F0,0x41
+asm/non_matchings/code/z_draw/GetItem_DrawOpa01.s,GetItem_DrawOpa01,0x800EF1F4,0x2E
+asm/non_matchings/code/z_draw/GetItem_DrawXlu01.s,GetItem_DrawXlu01,0x800EF2AC,0x2E
+asm/non_matchings/code/z_draw/GetItem_DrawSeahorse.s,GetItem_DrawSeahorse,0x800EF364,0x5C
+asm/non_matchings/code/z_draw/GetItem_DrawFairyContainer.s,GetItem_DrawFairyContainer,0x800EF4D4,0x62
+asm/non_matchings/code/z_draw/GetItem_DrawMoonsTear.s,GetItem_DrawMoonsTear,0x800EF65C,0x49
+asm/non_matchings/code/z_draw/GetItem_DrawMagicArrow.s,GetItem_DrawMagicArrow,0x800EF780,0x47
+asm/non_matchings/code/z_draw/GetItem_DrawUpgrades.s,GetItem_DrawUpgrades,0x800EF89C,0x3A
+asm/non_matchings/code/z_draw/GetItem_DrawRupee.s,GetItem_DrawRupee,0x800EF984,0x4D
+asm/non_matchings/code/z_draw/GetItem_DrawSmallRupee.s,GetItem_DrawSmallRupee,0x800EFAB8,0x51
+asm/non_matchings/code/z_draw/GetItem_DrawWallet.s,GetItem_DrawWallet,0x800EFBFC,0x52
+asm/non_matchings/code/z_draw/GetItem_DrawRemains.s,GetItem_DrawRemains,0x800EFD44,0x47
asm/non_matchings/code/z_eff_footmark/EffFootmark_Init.s,EffFootmark_Init,0x800EFE60,0x29
asm/non_matchings/code/z_eff_footmark/EffFootmark_Add.s,EffFootmark_Add,0x800EFF04,0x6E
asm/non_matchings/code/z_eff_footmark/EffFootmark_Update.s,EffFootmark_Update,0x800F00BC,0x43
@@ -2536,8 +2536,8 @@ asm/non_matchings/code/z_play/Play_CameraChangeSetting.s,Play_CameraChangeSettin
asm/non_matchings/code/z_play/func_80169AFC.s,func_80169AFC,0x80169AFC,0x32
asm/non_matchings/code/z_play/Play_CameraGetUID.s,Play_CameraGetUID,0x80169BC4,0xD
asm/non_matchings/code/z_play/func_80169BF8.s,func_80169BF8,0x80169BF8,0x1B
-asm/non_matchings/code/z_play/Play_GetCsCamDataSetting.s,Play_GetCsCamDataSetting,0x80169C64,0x8
-asm/non_matchings/code/z_play/Play_GetCsCamDataVec3s.s,Play_GetCsCamDataVec3s,0x80169C84,0xE
+asm/non_matchings/code/z_play/Play_GetActorCsCamSetting.s,Play_GetActorCsCamSetting,0x80169C64,0x8
+asm/non_matchings/code/z_play/Play_GetActorCsCamFuncData.s,Play_GetActorCsCamFuncData,0x80169C84,0xE
asm/non_matchings/code/z_play/Play_GetOriginalSceneNumber.s,Play_GetOriginalSceneNumber,0x80169CBC,0x21
asm/non_matchings/code/z_play/Play_SaveCycleSceneFlags.s,Play_SaveCycleSceneFlags,0x80169D40,0x23
asm/non_matchings/code/z_play/Play_SetRespawnData.s,Play_SetRespawnData,0x80169DCC,0x28
diff --git a/undefined_syms.txt b/undefined_syms.txt
index a9cc3e6f5..c9a2964db 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -1480,13 +1480,6 @@ D_06001100 = 0x06001100;
D_06001140 = 0x06001140;
D_06001CB0 = 0x06001CB0;
-// ovl_Obj_Um
-
-D_06007E20 = 0x06007E20;
-D_06007F50 = 0x06007F50;
-D_06011DF8 = 0x06011DF8;
-D_06012CC0 = 0x06012CC0;
-
// ovl_Obj_Usiyane
D_06000098 = 0x06000098;