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;