From d45ea18bf4210b34d747930b5f1c9aa24d1a525a Mon Sep 17 00:00:00 2001 From: Aetias <144526980+AetiasHax@users.noreply.github.com> Date: Tue, 22 Jul 2025 17:54:33 +0200 Subject: [PATCH] PlayerBase OK (#126) * Map symbol in Game * PlayerBase OK * Fix ActorRefill * Fix MapManager * Mark PlayerBase as complete * Fix MapManager --- config/eur/arm9/overlays/ov000/delinks.txt | 1 + config/eur/arm9/overlays/ov000/symbols.txt | 30 ++-- config/eur/arm9/overlays/ov004/relocs.txt | 8 +- config/eur/arm9/symbols.txt | 2 +- config/usa/arm9/overlays/ov000/delinks.txt | 1 + config/usa/arm9/overlays/ov000/symbols.txt | 30 ++-- config/usa/arm9/overlays/ov004/relocs.txt | 8 +- config/usa/arm9/symbols.txt | 2 +- include/DTCM/UnkStruct_027e0e58.hpp | 11 ++ include/DTCM/UnkStruct_027e0f64.hpp | 2 + include/Map/Entrance.hpp | 10 ++ include/Physics/Cylinder.hpp | 1 + include/Player/EquipShield.hpp | 7 +- include/Player/EquipSword.hpp | 2 +- include/Player/PlayerBase.hpp | 2 +- src/00_Core/Map/MapManager.cpp | 59 +++---- src/00_Core/Player/PlayerBase.cpp | 183 +++++++++++++++++++-- src/14_Land/Actor/Player/ActorRefill.cpp | 7 +- 18 files changed, 264 insertions(+), 102 deletions(-) create mode 100644 include/DTCM/UnkStruct_027e0e58.hpp diff --git a/config/eur/arm9/overlays/ov000/delinks.txt b/config/eur/arm9/overlays/ov000/delinks.txt index 9fcaf6f8..c0417474 100644 --- a/config/eur/arm9/overlays/ov000/delinks.txt +++ b/config/eur/arm9/overlays/ov000/delinks.txt @@ -132,6 +132,7 @@ src/00_Core/Player/LinkStateRoll.cpp: .data start:0x020e6078 end:0x020e6104 src/00_Core/Player/PlayerBase.cpp: + complete .text start:0x020a7af0 end:0x020a7fa4 .data start:0x020e5590 end:0x020e5630 diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index b7b90036..77f6eed5 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -244,7 +244,7 @@ _ZN18UnkStruct_020ec7dc19func_ov000_0207c0f0Ei kind:function(thumb,size=0x28) ad func_ov000_0207c118 kind:function(thumb,size=0x58) addr:0x0207c118 _ZN18UnkStruct_020ec7dc19func_ov000_0207c170Ev kind:function(thumb,size=0x1e) addr:0x0207c170 func_ov000_0207c190 kind:function(thumb,size=0x1e) addr:0x0207c190 -func_ov000_0207c1b0 kind:function(arm,size=0x48) addr:0x0207c1b0 +_ZN18UnkStruct_027e0e5819func_ov000_0207c1b0EiP5Vec3piii kind:function(arm,size=0x48) addr:0x0207c1b0 func_ov000_0207c1f8 kind:function(arm,size=0x68) addr:0x0207c1f8 func_ov000_0207c260 kind:function(arm,size=0x88) addr:0x0207c260 func_ov000_0207c2e8 kind:function(arm,size=0x34) addr:0x0207c2e8 @@ -256,7 +256,7 @@ func_ov000_0207c444 kind:function(arm,size=0x30) addr:0x0207c444 func_ov000_0207c474 kind:function(arm,size=0xa4) addr:0x0207c474 func_ov000_0207c518 kind:function(arm,size=0x98) addr:0x0207c518 func_ov000_0207c5b0 kind:function(thumb,size=0x22) addr:0x0207c5b0 -func_ov000_0207c5d4 kind:function(arm,size=0x48) addr:0x0207c5d4 +_ZN18UnkStruct_027e0e5819func_ov000_0207c5d4Eib kind:function(arm,size=0x48) addr:0x0207c5d4 func_ov000_0207c61c kind:function(arm,size=0x58) addr:0x0207c61c func_ov000_0207c674 kind:function(arm,size=0x20) addr:0x0207c674 func_ov000_0207c694 kind:function(arm,size=0x58) addr:0x0207c694 @@ -774,7 +774,7 @@ func_ov000_0208add4 kind:function(arm,size=0x54) addr:0x0208add4 func_ov000_0208ae28 kind:function(arm,size=0x28) addr:0x0208ae28 func_ov000_0208ae50 kind:function(arm,size=0x8) addr:0x0208ae50 func_ov000_0208ae58 kind:function(arm,size=0x3c) addr:0x0208ae58 -func_ov000_0208ae94 kind:function(arm,size=0x44) addr:0x0208ae94 +_ZN18UnkStruct_027e0f6419func_ov000_0208ae94Ev kind:function(arm,size=0x44) addr:0x0208ae94 func_ov000_0208aed8 kind:function(arm,size=0x244) addr:0x0208aed8 func_ov000_0208b11c kind:function(arm,size=0x20) addr:0x0208b11c func_ov000_0208b13c kind:function(arm,size=0x1c) addr:0x0208b13c @@ -924,7 +924,7 @@ _ZN4AABB4GrowEP5Vec3p kind:function(arm,size=0x28) addr:0x0208edd8 _ZN4AABB10GrowScalarEi kind:function(arm,size=0x4c) addr:0x0208ee00 func_ov000_0208ee4c kind:function(arm,size=0x44) addr:0x0208ee4c func_ov000_0208ee90 kind:function(arm,size=0x1a0) addr:0x0208ee90 -func_ov000_0208f030 kind:function(arm,size=0x170) addr:0x0208f030 +_ZN8Cylinder19func_ov000_0208f030EP5Vec3pS1_i kind:function(arm,size=0x170) addr:0x0208f030 func_ov000_0208f1a0 kind:function(arm,size=0xf4) addr:0x0208f1a0 func_ov000_0208f294 kind:function(arm,size=0x84) addr:0x0208f294 _ZN6Sphere12ContainsInXZEP5Vec3p kind:function(arm,size=0x5c) addr:0x0208f318 @@ -1874,8 +1874,8 @@ _ZN10PlayerBase17EquipCollidesWithEP8Cylinderi kind:function(arm,size=0x18) addr _ZN10PlayerBase18EquipItem_vfunc_2cEv kind:function(arm,size=0x38) addr:0x020a7cfc _ZN10PlayerBase9SetHealthEs kind:function(arm,size=0x58) addr:0x020a7d34 _ZN10PlayerBase9AddHealthEs kind:function(arm,size=0x68) addr:0x020a7d8c -_ZN10PlayerBase8TeleportEP5Vec3psibb kind:function(arm,size=0x7c) addr:0x020a7df4 -_ZN10PlayerBase18TeleportToEntranceEib kind:function(arm,size=0x118) addr:0x020a7e70 +_ZN10PlayerBase18TeleportToEntranceEib kind:function(arm,size=0x7c) addr:0x020a7df4 +_ZN10PlayerBase8TeleportEP5Vec3psibb kind:function(arm,size=0x118) addr:0x020a7e70 _ZN10PlayerBase22TeleportToLastEntranceEb kind:function(arm,size=0x1c) addr:0x020a7f88 _ZN13LinkStateBase8vfunc_00Ev kind:function(thumb,size=0x2) addr:0x020a7fa4 _ZN13LinkStateBase12OnStateEnterEv kind:function(arm,size=0x4) addr:0x020a7fa8 @@ -4760,15 +4760,15 @@ data_ov000_020e5454 kind:data(any) addr:0x020e5454 data_ov000_020e54a4 kind:data(any) addr:0x020e54a4 data_ov000_020e54f4 kind:data(any) addr:0x020e54f4 data_ov000_020e5548 kind:data(any) addr:0x020e5548 -data_ov000_020e5590 kind:data(any) addr:0x020e5590 -data_ov000_020e5594 kind:data(any) addr:0x020e5594 -data_ov000_020e5598 kind:data(any) addr:0x020e5598 -data_ov000_020e559c kind:data(any) addr:0x020e559c -data_ov000_020e55a0 kind:data(any) addr:0x020e55a0 -data_ov000_020e55a4 kind:data(any) addr:0x020e55a4 -data_ov000_020e55a8 kind:data(any) addr:0x020e55a8 -data_ov000_020e55ac kind:data(any) addr:0x020e55ac -_ZTV10PlayerBase kind:data(any) addr:0x020e55d8 +@1464 kind:data(any) addr:0x020e5590 local +@1463 kind:data(any) addr:0x020e5594 local +@1462 kind:data(any) addr:0x020e5598 local +@1461 kind:data(any) addr:0x020e559c local +@1460 kind:data(any) addr:0x020e55a0 local +@1459 kind:data(any) addr:0x020e55a4 local +@1458 kind:data(any) addr:0x020e55a8 local +@1457 kind:data(any) addr:0x020e55ac local +_ZTV10PlayerBase kind:data(any) addr:0x020e55d0 data_ov000_020e5630 kind:data(any) addr:0x020e5630 data_ov000_020e5634 kind:data(any) addr:0x020e5634 data_ov000_020e5638 kind:data(any) addr:0x020e5638 diff --git a/config/eur/arm9/overlays/ov004/relocs.txt b/config/eur/arm9/overlays/ov004/relocs.txt index e8ac99e5..c61e5fee 100644 --- a/config/eur/arm9/overlays/ov004/relocs.txt +++ b/config/eur/arm9/overlays/ov004/relocs.txt @@ -2279,18 +2279,18 @@ from:0x0210b20c kind:load to:0x027e0f90 module:dtcm from:0x0210b230 kind:thumb_call_arm to:0x0202e9dc module:main from:0x0210b238 kind:thumb_call to:0x0202ab78 module:main from:0x0210b240 kind:thumb_call to:0x0202ab54 module:main -from:0x0210b250 kind:load to:0x020e55d8 module:overlay(0) +from:0x0210b250 kind:load to:0x020e55d0 add:8 module:overlay(0) from:0x0210b254 kind:load to:0x027e0ce0 module:dtcm from:0x0210b26a kind:thumb_call to:0x0202ab64 module:main from:0x0210b270 kind:thumb_call_arm to:0x0202ea0c module:main -from:0x0210b27c kind:load to:0x020e55d8 module:overlay(0) +from:0x0210b27c kind:load to:0x020e55d0 add:8 module:overlay(0) from:0x0210b292 kind:thumb_call to:0x0202ab64 module:main from:0x0210b298 kind:thumb_call_arm to:0x0202ea0c module:main from:0x0210b2a2 kind:thumb_call_arm to:0x0202ea0c module:main -from:0x0210b2ac kind:load to:0x020e55d8 module:overlay(0) +from:0x0210b2ac kind:load to:0x020e55d0 add:8 module:overlay(0) from:0x0210b2c2 kind:thumb_call to:0x0202ab64 module:main from:0x0210b2c8 kind:thumb_call_arm to:0x0202ea0c module:main -from:0x0210b2d4 kind:load to:0x020e55d8 module:overlay(0) +from:0x0210b2d4 kind:load to:0x020e55d0 add:8 module:overlay(0) from:0x0210b2de kind:thumb_call to:0x020a956c module:overlay(0) from:0x0210b2fc kind:thumb_call_arm to:0x020a98e8 module:overlay(0) from:0x0210b318 kind:thumb_call_arm to:0x020a990c module:overlay(0) diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index b7af30d3..24266d0b 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -1384,7 +1384,7 @@ _ZN4Game13StartGameModeEv kind:function(thumb,size=0x238) addr:0x0202c73c _ZN4Game13func_0202c974EPS_ kind:function(thumb,size=0x8) addr:0x0202c974 _ZN4Game13func_0202c97cEv kind:function(thumb,size=0x24) addr:0x0202c97c _ZN4Game3RunEv kind:function(arm,size=0x528) addr:0x0202c9a0 -_ZN4Game13func_0202cec8Eii kind:function(thumb,size=0x6c) addr:0x0202cec8 +_ZN4Game13func_0202cec8Eib kind:function(thumb,size=0x6c) addr:0x0202cec8 _ZN4Game13func_0202cf34Ev kind:function(thumb,size=0x10) addr:0x0202cf34 _ZN4Game13func_0202cf44Ev kind:function(arm,size=0x170) addr:0x0202cf44 _ZN4GameD1Ev kind:function(arm,size=0x18) addr:0x0202d0b4 diff --git a/config/usa/arm9/overlays/ov000/delinks.txt b/config/usa/arm9/overlays/ov000/delinks.txt index 25e7b6b7..d9ec0117 100644 --- a/config/usa/arm9/overlays/ov000/delinks.txt +++ b/config/usa/arm9/overlays/ov000/delinks.txt @@ -132,6 +132,7 @@ src/00_Core/Player/LinkStateRoll.cpp: .data start:0x020e6018 end:0x020e60a4 src/00_Core/Player/PlayerBase.cpp: + complete .text start:0x020a7a90 end:0x020a7f44 .data start:0x020e5530 end:0x020e55d0 diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index 028bbf20..bc234435 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -244,7 +244,7 @@ _ZN18UnkStruct_020ec7dc19func_ov000_0207c0f0Ei kind:function(thumb,size=0x28) ad func_ov000_0207c118 kind:function(thumb,size=0x58) addr:0x0207c0b8 _ZN18UnkStruct_020ec7dc19func_ov000_0207c170Ev kind:function(thumb,size=0x1e) addr:0x0207c110 func_ov000_0207c190 kind:function(thumb,size=0x1e) addr:0x0207c130 -func_ov000_0207c1b0 kind:function(arm,size=0x48) addr:0x0207c150 +_ZN18UnkStruct_027e0e5819func_ov000_0207c1b0EiP5Vec3piii kind:function(arm,size=0x48) addr:0x0207c150 func_ov000_0207c1f8 kind:function(arm,size=0x68) addr:0x0207c198 func_ov000_0207c260 kind:function(arm,size=0x88) addr:0x0207c200 func_ov000_0207c2e8 kind:function(arm,size=0x34) addr:0x0207c288 @@ -256,7 +256,7 @@ func_ov000_0207c444 kind:function(arm,size=0x30) addr:0x0207c3e4 func_ov000_0207c474 kind:function(arm,size=0xa4) addr:0x0207c414 func_ov000_0207c518 kind:function(arm,size=0x98) addr:0x0207c4b8 func_ov000_0207c5b0 kind:function(thumb,size=0x22) addr:0x0207c550 -func_ov000_0207c5d4 kind:function(arm,size=0x48) addr:0x0207c574 +_ZN18UnkStruct_027e0e5819func_ov000_0207c5d4Eib kind:function(arm,size=0x48) addr:0x0207c574 func_ov000_0207c61c kind:function(arm,size=0x58) addr:0x0207c5bc func_ov000_0207c674 kind:function(arm,size=0x20) addr:0x0207c614 func_ov000_0207c694 kind:function(arm,size=0x58) addr:0x0207c634 @@ -774,7 +774,7 @@ func_ov000_0208add4 kind:function(arm,size=0x54) addr:0x0208ad74 func_ov000_0208ae28 kind:function(arm,size=0x28) addr:0x0208adc8 func_ov000_0208ae50 kind:function(arm,size=0x8) addr:0x0208adf0 func_ov000_0208ae58 kind:function(arm,size=0x3c) addr:0x0208adf8 -func_ov000_0208ae94 kind:function(arm,size=0x44) addr:0x0208ae34 +_ZN18UnkStruct_027e0f6419func_ov000_0208ae94Ev kind:function(arm,size=0x44) addr:0x0208ae34 func_ov000_0208aed8 kind:function(arm,size=0x244) addr:0x0208ae78 func_ov000_0208b11c kind:function(arm,size=0x20) addr:0x0208b0bc func_ov000_0208b13c kind:function(arm,size=0x1c) addr:0x0208b0dc @@ -924,7 +924,7 @@ _ZN4AABB4GrowEP5Vec3p kind:function(arm,size=0x28) addr:0x0208ed78 _ZN4AABB10GrowScalarEi kind:function(arm,size=0x4c) addr:0x0208eda0 func_ov000_0208ee4c kind:function(arm,size=0x44) addr:0x0208edec func_ov000_0208ee90 kind:function(arm,size=0x1a0) addr:0x0208ee30 -func_ov000_0208f030 kind:function(arm,size=0x170) addr:0x0208efd0 +_ZN8Cylinder19func_ov000_0208f030EP5Vec3pS1_i kind:function(arm,size=0x170) addr:0x0208efd0 func_ov000_0208f1a0 kind:function(arm,size=0xf4) addr:0x0208f140 func_ov000_0208f294 kind:function(arm,size=0x84) addr:0x0208f234 _ZN6Sphere12ContainsInXZEP5Vec3p kind:function(arm,size=0x5c) addr:0x0208f2b8 @@ -1874,8 +1874,8 @@ _ZN10PlayerBase17EquipCollidesWithEP8Cylinderi kind:function(arm,size=0x18) addr _ZN10PlayerBase18EquipItem_vfunc_2cEv kind:function(arm,size=0x38) addr:0x020a7c9c _ZN10PlayerBase9SetHealthEs kind:function(arm,size=0x58) addr:0x020a7cd4 _ZN10PlayerBase9AddHealthEs kind:function(arm,size=0x68) addr:0x020a7d2c -_ZN10PlayerBase8TeleportEP5Vec3psibb kind:function(arm,size=0x7c) addr:0x020a7d94 -_ZN10PlayerBase18TeleportToEntranceEib kind:function(arm,size=0x118) addr:0x020a7e10 +_ZN10PlayerBase18TeleportToEntranceEib kind:function(arm,size=0x7c) addr:0x020a7d94 +_ZN10PlayerBase8TeleportEP5Vec3psibb kind:function(arm,size=0x118) addr:0x020a7e10 _ZN10PlayerBase22TeleportToLastEntranceEb kind:function(arm,size=0x1c) addr:0x020a7f28 _ZN13LinkStateBase8vfunc_00Ev kind:function(thumb,size=0x2) addr:0x020a7f44 _ZN13LinkStateBase12OnStateEnterEv kind:function(arm,size=0x4) addr:0x020a7f48 @@ -4760,15 +4760,15 @@ data_ov000_020e5454 kind:data(any) addr:0x020e53f4 data_ov000_020e54a4 kind:data(any) addr:0x020e5444 data_ov000_020e54f4 kind:data(any) addr:0x020e5494 data_ov000_020e5548 kind:data(any) addr:0x020e54e8 -data_ov000_020e5590 kind:data(any) addr:0x020e5530 -data_ov000_020e5594 kind:data(any) addr:0x020e5534 -data_ov000_020e5598 kind:data(any) addr:0x020e5538 -data_ov000_020e559c kind:data(any) addr:0x020e553c -data_ov000_020e55a0 kind:data(any) addr:0x020e5540 -data_ov000_020e55a4 kind:data(any) addr:0x020e5544 -data_ov000_020e55a8 kind:data(any) addr:0x020e5548 -data_ov000_020e55ac kind:data(any) addr:0x020e554c -_ZTV10PlayerBase kind:data(any) addr:0x020e5578 +@1464 kind:data(any) addr:0x020e5530 local +@1463 kind:data(any) addr:0x020e5534 local +@1462 kind:data(any) addr:0x020e5538 local +@1461 kind:data(any) addr:0x020e553c local +@1460 kind:data(any) addr:0x020e5540 local +@1459 kind:data(any) addr:0x020e5544 local +@1458 kind:data(any) addr:0x020e5548 local +@1457 kind:data(any) addr:0x020e554c local +_ZTV10PlayerBase kind:data(any) addr:0x020e5570 data_ov000_020e5630 kind:data(any) addr:0x020e55d0 data_ov000_020e5634 kind:data(any) addr:0x020e55d4 data_ov000_020e5638 kind:data(any) addr:0x020e55d8 diff --git a/config/usa/arm9/overlays/ov004/relocs.txt b/config/usa/arm9/overlays/ov004/relocs.txt index e10e9eb5..33b64cd8 100644 --- a/config/usa/arm9/overlays/ov004/relocs.txt +++ b/config/usa/arm9/overlays/ov004/relocs.txt @@ -2279,18 +2279,18 @@ from:0x0210b18c kind:load to:0x027e0f90 module:dtcm from:0x0210b1b0 kind:thumb_call_arm to:0x0202e9d8 module:main from:0x0210b1b8 kind:thumb_call to:0x0202ab60 module:main from:0x0210b1c0 kind:thumb_call to:0x0202ab3c module:main -from:0x0210b1d0 kind:load to:0x020e5578 module:overlay(0) +from:0x0210b1d0 kind:load to:0x020e5570 add:8 module:overlay(0) from:0x0210b1d4 kind:load to:0x027e0ce0 module:dtcm from:0x0210b1ea kind:thumb_call to:0x0202ab4c module:main from:0x0210b1f0 kind:thumb_call_arm to:0x0202ea08 module:main -from:0x0210b1fc kind:load to:0x020e5578 module:overlay(0) +from:0x0210b1fc kind:load to:0x020e5570 add:8 module:overlay(0) from:0x0210b212 kind:thumb_call to:0x0202ab4c module:main from:0x0210b218 kind:thumb_call_arm to:0x0202ea08 module:main from:0x0210b222 kind:thumb_call_arm to:0x0202ea08 module:main -from:0x0210b22c kind:load to:0x020e5578 module:overlay(0) +from:0x0210b22c kind:load to:0x020e5570 add:8 module:overlay(0) from:0x0210b242 kind:thumb_call to:0x0202ab4c module:main from:0x0210b248 kind:thumb_call_arm to:0x0202ea08 module:main -from:0x0210b254 kind:load to:0x020e5578 module:overlay(0) +from:0x0210b254 kind:load to:0x020e5570 add:8 module:overlay(0) from:0x0210b25e kind:thumb_call to:0x020a950c module:overlay(0) from:0x0210b27c kind:thumb_call_arm to:0x020a9888 module:overlay(0) from:0x0210b298 kind:thumb_call_arm to:0x020a98ac module:overlay(0) diff --git a/config/usa/arm9/symbols.txt b/config/usa/arm9/symbols.txt index 77a88d8f..4f018976 100644 --- a/config/usa/arm9/symbols.txt +++ b/config/usa/arm9/symbols.txt @@ -1384,7 +1384,7 @@ _ZN4Game13StartGameModeEv kind:function(thumb,size=0x238) addr:0x0202c724 _ZN4Game13func_0202c974EPS_ kind:function(thumb,size=0x8) addr:0x0202c95c _ZN4Game13func_0202c97cEv kind:function(thumb,size=0x24) addr:0x0202c964 _ZN4Game3RunEv kind:function(arm,size=0x528) addr:0x0202c988 -_ZN4Game13func_0202cec8Eii kind:function(thumb,size=0x6c) addr:0x0202ceb0 +_ZN4Game13func_0202cec8Eib kind:function(thumb,size=0x6c) addr:0x0202ceb0 _ZN4Game13func_0202cf34Ev kind:function(thumb,size=0x10) addr:0x0202cf1c _ZN4Game13func_0202cf44Ev kind:function(arm,size=0x170) addr:0x0202cf2c _ZN4GameD1Ev kind:function(arm,size=0x18) addr:0x0202d09c diff --git a/include/DTCM/UnkStruct_027e0e58.hpp b/include/DTCM/UnkStruct_027e0e58.hpp new file mode 100644 index 00000000..ab3a0450 --- /dev/null +++ b/include/DTCM/UnkStruct_027e0e58.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "global.h" +#include "types.h" + +struct UnkStruct_027e0e58 { + void func_ov000_0207c5d4(unk32 param1, bool param2); + void func_ov000_0207c1b0(unk32 param1, Vec3p *param2, unk32 param3, unk32 param4, unk32 param5); +}; + +extern UnkStruct_027e0e58 *data_027e0e58; diff --git a/include/DTCM/UnkStruct_027e0f64.hpp b/include/DTCM/UnkStruct_027e0f64.hpp index 975c6818..b6fb5a0b 100644 --- a/include/DTCM/UnkStruct_027e0f64.hpp +++ b/include/DTCM/UnkStruct_027e0f64.hpp @@ -12,6 +12,8 @@ public: /* 8 */ void *mUnk_8; /* c */ + void func_ov000_0208ae94(); + void func_ov000_0208b13c(); unk32 func_ov000_0208b180(); }; diff --git a/include/Map/Entrance.hpp b/include/Map/Entrance.hpp index d8d1b751..af40f6ad 100644 --- a/include/Map/Entrance.hpp +++ b/include/Map/Entrance.hpp @@ -15,4 +15,14 @@ public: /* 0f */ // unk8 mUnk_0f; /* 10 */ s32 mUnk_10; /* 14 */ + + inline Entrance() : + mId(0xff), + mUnk_10(0) {} + + inline Entrance(const Entrance &other) : + mPos(other.mPos), + mAngle(other.mAngle), + mId(other.mId), + mUnk_10(other.mUnk_10) {} }; diff --git a/include/Physics/Cylinder.hpp b/include/Physics/Cylinder.hpp index 353635dd..9fb50ef2 100644 --- a/include/Physics/Cylinder.hpp +++ b/include/Physics/Cylinder.hpp @@ -19,4 +19,5 @@ struct Cylinder { } bool Overlaps(Cylinder *other); + bool func_ov000_0208f030(Vec3p *param1, Vec3p *param2, s32 param3); }; diff --git a/include/Player/EquipShield.hpp b/include/Player/EquipShield.hpp index 9da2599d..638a8553 100644 --- a/include/Player/EquipShield.hpp +++ b/include/Player/EquipShield.hpp @@ -4,10 +4,11 @@ #include "Player/EquipItem.hpp" -class EquipShield { -private: +class EquipShield : public EquipItem { +public: /* 00 (base) */ - /* 09 */ unk8 mUnk_09[7]; + /* 09 */ unk8 mUnk_09[5]; + /* 0e */ unk16 mUnk_0e; /* 10 */ void *mUnk_10; /* 14 */ void *mUnk_14; /* 18 */ unk8 mUnk_18[4]; diff --git a/include/Player/EquipSword.hpp b/include/Player/EquipSword.hpp index 2a48d217..145e2fcb 100644 --- a/include/Player/EquipSword.hpp +++ b/include/Player/EquipSword.hpp @@ -6,7 +6,7 @@ #include "Player/EquipRope.hpp" class EquipSword : public EquipItem { -private: +public: /* 00 (base) */ /* 09 */ unk8 mUnk_09[3]; // padding? /* 0c */ void *mUnk_0c; diff --git a/include/Player/PlayerBase.hpp b/include/Player/PlayerBase.hpp index 744ff464..9a85a211 100644 --- a/include/Player/PlayerBase.hpp +++ b/include/Player/PlayerBase.hpp @@ -17,7 +17,7 @@ public: /* 08 */ s16 mInvincibleFrames; /* 0a */ s16 mHealth; /* 0c */ unk8 mUnk_0c[2]; - /* 0e */ s16 mEntranceId; + /* 0e */ u16 mEntranceId; /* 10 */ bool mUpdatePos; /* 11 */ bool mVisible; /* 12 */ bool mInvincible; diff --git a/src/00_Core/Map/MapManager.cpp b/src/00_Core/Map/MapManager.cpp index 69dcfc96..f991890e 100644 --- a/src/00_Core/Map/MapManager.cpp +++ b/src/00_Core/Map/MapManager.cpp @@ -8,6 +8,7 @@ #include "Actor/ActorSpawner.hpp" #include "DTCM/UnkStruct_027e077c.hpp" #include "DTCM/UnkStruct_027e0d38.hpp" +#include "DTCM/UnkStruct_027e0f64.hpp" #include "DTCM/UnkStruct_027e0fd4.hpp" #include "DTCM/UnkStruct_027e103c.hpp" #include "Player/PlayerBase.hpp" @@ -28,7 +29,6 @@ extern void func_ov000_020798bc(s32 *param_1, s32 param_2); extern void func_ov000_02088000(unk32 param_1, s32 param_2); extern void func_ov000_02088130(u8 *param_1, unk32 param_2); extern void func_ov000_02088144(u8 *param_1, unk32 param_2); -extern void func_ov000_0208b13c(s32 *param_1); extern unk32 func_ov000_0208b180(s32 *param_1); extern s32 func_ov000_0208b73c(s32 param_1, unk32 param_2); extern s32 func_ov000_0208b7d0(s32 param_1, Vec3p *param_2); @@ -110,7 +110,6 @@ extern unk32 *data_027e0c68; extern u32 *data_027e0ce0[]; extern UnkStruct_0202e894 *data_027e0ce4; extern unk32 *data_027e0d3c; -extern unk32 data_027e0f64[]; extern unk32 *data_027e0f68; extern unk32 *data_027e0f6c; extern unk32 *data_027e0f70; @@ -475,19 +474,12 @@ ARM s32 MapManager::func_ov00_02082914(unk32 param_2) { int iVar4; int iVar5; Vec3p pVar1; - Entrance local_44; - Entrance local_30; switch (param_2) { case 0xfa: - pvVar1 = data_027e0d38->mUnk_28; - local_30.mPos.x = *(int *) ((int) pvVar1 + 0x5c); - local_30.mPos.y = *(int *) ((int) pvVar1 + 0x60); - local_30.mPos.z = *(int *) ((int) pvVar1 + 100); - local_30.mAngle = *(unk16 *) ((int) pvVar1 + 0x68); - local_30.mId = *(unk8 *) ((int) pvVar1 + 0x6a); - local_30.mUnk_10 = *(int *) ((int) pvVar1 + 0x6c); - iVar3 = this->mMap->AddEntrance(&local_30); + pvVar1 = data_027e0d38->mUnk_28; + Entrance local_30(*(Entrance *) ((s32) pvVar1 + 0x5c)); + iVar3 = this->mMap->AddEntrance(&local_30); return iVar3; case 0xfb: case 0xfc: @@ -497,13 +489,12 @@ ARM s32 MapManager::func_ov00_02082914(unk32 param_2) { default: return (int) this; } - local_44.mId = -1; - local_44.mUnk_10 = 0; - pvVar1 = data_027e0d38->mUnk_28; - pVar1 = *(Vec3p *) ((int) pvVar1 + 0x38); - iVar3 = 0x2000; - iVar4 = 0x2000; - iVar5 = 0xfd; + Entrance local_44; + pvVar1 = data_027e0d38->mUnk_28; + pVar1 = *(Vec3p *) ((int) pvVar1 + 0x38); + iVar3 = 0x2000; + iVar4 = 0x2000; + iVar5 = 0xfd; if (this->mCourse->mType == CourseType_Sea) { iVar3 = this->mMap->vfunc_88(); iVar3 = iVar3 + 0xa000; @@ -577,7 +568,7 @@ void MapManager::func_ov00_02082b3c(unk32 *param_2, Vec2b *param_3) { this->mMap->vfunc_18(); } else { gAdventureFlags->func_ov00_020976c8(); - func_ov000_0208b13c(data_027e0f64); + data_027e0f64->func_ov000_0208b13c(); uVar5 = this->func_ov00_02082d08(); gActorManager->func_ov004_02105608(param_3->x, param_3->y, uVar5); this->mMap->vfunc_2c(); @@ -961,8 +952,6 @@ ARM bool MapManager::GetEntrancePos(Entrance *param_1, unk32 entranceId) { ARM bool MapManager::func_ov00_02083664(Entrance *param_2, unk32 entranceId) { Entrance entrance; - entrance.mId = (u8) 0xff; - entrance.mUnk_10 = 0; if (this->GetEntrancePos(&entrance, entranceId)) { param_2->mPos.x = entrance.mPos.x; param_2->mPos.y = entrance.mPos.y; @@ -1022,9 +1011,9 @@ ARM bool MapManager::func_ov00_02083790(s32 param_2) { if (param_2 == 0) { return true; } - *(int *) (*(int *) (*(unk32 *) data_027e0f64 + 8) + 0x1b4) = param_2; - *(int *) (*(int *) (*(unk32 *) data_027e0f64 + 4) + 0x1b4) = param_2; - iVar2 = data_027e0d38->func_ov000_02078b40(); + *(int *) (*(int *) ((unk32 *) data_027e0f64 + 2) + 0x1b4) = param_2; + *(int *) (*(int *) ((unk32 *) data_027e0f64 + 1) + 0x1b4) = param_2; + iVar2 = data_027e0d38->func_ov000_02078b40(); if ((iVar2 != 0) && (bVar1 = this->func_ov00_02082e1c(&aiStack_14, &iStack_18), !bVar1)) { func_ov000_02079898(data_027e0d3c, param_2, 0x10); gActorManager->func_ov00_020c3ce8(param_2, true); @@ -1040,9 +1029,9 @@ ARM bool MapManager::func_ov00_02083840(s32 param_2) { if (param_2 == 0) { return true; } - *(unk32 *) (*(unk32 *) (*(unk32 *) data_027e0f64 + 8) + 0x1b4) = -1; - *(unk32 *) (*(unk32 *) (*(unk32 *) data_027e0f64 + 4) + 0x1b4) = -1; - iVar4 = func_ov000_02078fe8(data_027e0d3c); + *(unk32 *) (*(unk32 *) ((unk32 *) data_027e0f64 + 2) + 0x1b4) = -1; + *(unk32 *) (*(unk32 *) ((unk32 *) data_027e0f64 + 1) + 0x1b4) = -1; + iVar4 = func_ov000_02078fe8(data_027e0d3c); if (0 <= iVar4) { func_ov000_020798bc(data_027e0d3c, 0x10); gActorManager->func_ov00_020c3ce8(param_2, false); @@ -1959,7 +1948,7 @@ s32 MapManager::func_ov00_02084d4c(unk32 param_2, unk32 param_3, Vec3p *param_4) int iStack_18; Vec3p VStack_14; - iVar1 = func_ov000_0208df78(data_027e0f64 + 4, param_2, param_3, &VStack_14, &iStack_20); + iVar1 = func_ov000_0208df78((s32 *) data_027e0f64 + 1, param_2, param_3, &VStack_14, &iStack_20); // object = PTR_DWORD_overlay_d_0__020e2510_overlay_d_0__02084ea8; if (iVar1 == -1) { return -1; @@ -2109,10 +2098,10 @@ s32 MapManager::func_ov00_02085108(Vec3p *param_2) { int local_2c; unk32 local_28; - uVar2 = func_ov000_0208b180(data_027e0f64); + uVar2 = data_027e0f64->func_ov000_0208b180(); func_ov000_02088130(&local_38, uVar2); local_44 = (u32) local_38; - uVar2 = func_ov000_0208b180(data_027e0f64); + uVar2 = data_027e0f64->func_ov000_0208b180(); func_ov000_02088144(&local_3a, uVar2); if (local_44 <= local_37) { do { @@ -2165,10 +2154,10 @@ s32 MapManager::func_ov00_0208527c(MapManager *param_1, unk32 param_2, unk32 *pa unk32 local_30; unk32 local_2c; - uVar3 = func_ov000_0208b180(data_027e0f64); + uVar3 = data_027e0f64->func_ov000_0208b180(); func_ov000_02088130(&local_3c, uVar3); uVar7 = (u32) local_3c; - uVar3 = func_ov000_0208b180(data_027e0f64); + uVar3 = data_027e0f64->func_ov000_0208b180(); func_ov000_02088144(&local_3e, uVar3); local_4c = (u32) local_3e; uVar6 = (u32) local_3d; @@ -2229,10 +2218,10 @@ s32 MapManager::func_ov00_020853fc(MapManager *param_1, Vec3p *param_2, s32 *par unk32 local_30; unk32 local_2c; - uVar2 = func_ov000_0208b180(data_027e0f64); + uVar2 = data_027e0f64->func_ov000_0208b180(); func_ov000_02088130(&local_3c, uVar2); local_48 = (u32) local_3c; - uVar2 = func_ov000_0208b180(data_027e0f64); + uVar2 = data_027e0f64->func_ov000_0208b180(); func_ov000_02088144(&local_3e, uVar2); local_50 = local_3e; uVar6 = local_3d; diff --git a/src/00_Core/Player/PlayerBase.cpp b/src/00_Core/Player/PlayerBase.cpp index a33dc210..6f89f0d1 100644 --- a/src/00_Core/Player/PlayerBase.cpp +++ b/src/00_Core/Player/PlayerBase.cpp @@ -1,20 +1,167 @@ #include "Player/PlayerBase.hpp" +#include "Actor/Navi/ActorNaviBase.hpp" +#include "DTCM/UnkStruct_027e0c54.hpp" +#include "DTCM/UnkStruct_027e0e58.hpp" +#include "DTCM/UnkStruct_027e0f64.hpp" +#include "Item/ItemManager.hpp" +#include "Map/MapManager.hpp" +#include "Player/PlayerControl.hpp" -bool PlayerBase::vfunc_04() {} -ItemFlag PlayerBase::GetEquipId() {} -bool PlayerBase::CanMove() {} -void PlayerBase::SetUpdatePos(bool updatePos) {} -void PlayerBase::SetVisible(bool visible) {} -EquipSword *PlayerBase::GetEquipSword() {} -EquipShield *PlayerBase::GetEquipShield() {} -void PlayerBase::LookAt(Vec3p *target) {} -bool PlayerBase::func_ov00_020a7c00(s32 param1) {} -bool PlayerBase::CollidesWith(Cylinder *cylinder) {} -bool PlayerBase::func_ov00_020a7c60(Vec3p *param1, Vec3p *param2, s32 param3) {} -bool PlayerBase::EquipCollidesWith(Cylinder *cylinder, ItemFlag equipId) {} -s32 PlayerBase::EquipItem_vfunc_2c() {} -void PlayerBase::SetHealth(s16 health) {} -void PlayerBase::AddHealth(s16 amount) {} -bool PlayerBase::Teleport(Vec3p *pos, s16 angle, unk32 param3, bool param4, bool param5) {} -bool PlayerBase::TeleportToEntrance(unk32 entranceId, bool param2) {} -bool PlayerBase::TeleportToLastEntrance(bool param1) {} +static const char *sShipParts[] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"}; + +ARM bool PlayerBase::vfunc_04() { + return true; +} + +ARM ItemFlag PlayerBase::GetEquipId() { + return ItemFlag_None; +} + +ARM bool PlayerBase::CanMove() { + return true; +} + +ARM void PlayerBase::SetUpdatePos(bool updatePos) { + mUpdatePos = updatePos; +} + +ARM void PlayerBase::SetVisible(bool visible) { + mVisible = visible; + + ItemManager *pItemManager = gItemManager; + ActorNaviBase *fairy = pItemManager->GetFairy(pItemManager->GetEquippedFairy()); + if (fairy != NULL) { + fairy->mVisible = mVisible; + } + + s16 var_r0 = visible ? 0x1f : 0; + this->GetEquipSword()->mUnk_5c = var_r0; + this->GetEquipShield()->mUnk_0e = var_r0; + data_027e0e58->func_ov000_0207c5d4(1, visible); +} + +ARM EquipSword *PlayerBase::GetEquipSword() { + return (EquipSword *) gItemManager->GetEquipItemUnchecked(ItemFlag_OshusSword); +} + +ARM EquipShield *PlayerBase::GetEquipShield() { + return (EquipShield *) gItemManager->GetEquipItemUnchecked(ItemFlag_WoodenShield); +} + +ARM void PlayerBase::LookAt(Vec3p *target) { + Vec3p vec; + Vec3p_Sub(target, &gPlayerPos, &vec); + if (vec.x == 0 && vec.z == 0) { + return; + } + gPlayerAngle = Atan2(*(vs32 *) &vec.x, vec.z); +} + +ARM bool PlayerBase::func_ov00_020a7c00(s32 param1) { + return param1 == data_027e0c54.mUnk_0; +} + +ARM bool PlayerBase::CollidesWith(Cylinder *cylinder) { + Cylinder hitbox; + this->vfunc_10(&hitbox); + if (hitbox.size < 0) { + return false; + } + return cylinder->Overlaps(&hitbox); +} + +ARM bool PlayerBase::func_ov00_020a7c60(Vec3p *param1, Vec3p *param2, s32 param3) { + Cylinder hitbox; + this->vfunc_10(&hitbox); + if (hitbox.size < 0) { + return false; + } + Vec3p vec1 = {param1->x, param1->y, param1->z}; + Vec3p vec2 = {param2->x, param2->y, param2->z}; + return hitbox.func_ov000_0208f030(&vec1, &vec2, param3); +} + +ARM bool PlayerBase::EquipCollidesWith(Cylinder *cylinder, ItemFlag equipId) { + return gItemManager->EquipCollidesWith(cylinder, equipId); +} + +ARM s32 PlayerBase::EquipItem_vfunc_2c() { + ItemFlag equippedItem = this->GetEquipId(); + if (equippedItem == ItemFlag_None) { + return 0; + } + return gItemManager->EquipItem_vfunc_2c(equippedItem); +} + +ARM void PlayerBase::SetHealth(s16 health) { + if (mInvincible) { + return; + } + + mHealth = health; + if (mHealth > this->GetMaxHealth()) { + mHealth = this->GetMaxHealth(); + } else if (mHealth < 0) { + mHealth = 0; + } +} + +ARM void PlayerBase::AddHealth(s16 amount) { + if (mInvincible) { + return; + } + + if (mHealth <= 0) { + return; + } + mHealth += amount; + if (mHealth > this->GetMaxHealth()) { + mHealth = this->GetMaxHealth(); + } else if (mHealth < 0) { + mHealth = 0; + } +} + +ARM bool PlayerBase::TeleportToEntrance(unk32 entranceId, bool param2) { + Entrance entrance; + gMapManager->GetEntrancePos(&entrance, entranceId); + if (this->Teleport(&entrance.mPos, entrance.mAngle, entrance.mUnk_10, param2, false)) { + mEntranceId = entranceId; + return true; + } + return false; +} + +extern unk16 data_027e0fb0; +ARM bool PlayerBase::Teleport(Vec3p *pos, s16 angle, unk32 param3, bool param4, bool param5) { + gPlayerPos = *pos; + Vec3p subroutine_arg0 = {pos->x, pos->y, pos->z}; + + q20 maxY = gMapManager->MapData_vfunc_68(&subroutine_arg0, 1); + q20 y = pos->y; + if (y <= maxY) { + y = maxY; + } + gPlayerPos.y = y; + + gPlayerAngle = angle; + gPlayerVel.x = 0; + data_027e0fb0 = 0; + gPlayerVel.y = 0; + gPlayerVel.z = 0; + + gPlayerControl->UpdateAim(); + gActorManager->Actor_vfunc_10(param4); + if (param4) { + gMapManager->func_ov00_02082af4(); + gAdventureFlags->func_ov00_02097700(); + } + if (!param5) { + data_027e0f64->func_ov000_0208ae94(); + } + return true; +} + +ARM bool PlayerBase::TeleportToLastEntrance(bool param1) { + this->TeleportToEntrance(mEntranceId, param1); +} diff --git a/src/14_Land/Actor/Player/ActorRefill.cpp b/src/14_Land/Actor/Player/ActorRefill.cpp index 1239e930..426ac8db 100644 --- a/src/14_Land/Actor/Player/ActorRefill.cpp +++ b/src/14_Land/Actor/Player/ActorRefill.cpp @@ -1,5 +1,6 @@ #include "Actor/Player/ActorRefill.hpp" #include "DTCM/UnkStruct_027e0d38.hpp" +#include "DTCM/UnkStruct_027e0e58.hpp" #include "DTCM/UnkStruct_027e103c.hpp" #include "Item/ItemManager.hpp" #include "System/Random.hpp" @@ -212,13 +213,11 @@ ARM void ActorRefill::vfunc_20(bool param1) { } } -extern unk32 *data_027e0e58; -extern "C" void func_ov000_0207c1b0(unk32 *param1, unk32 param2, Vec3p *param3, unk32 param4, unk32 param5, unk32 param6); ARM void ActorRefill::func_ov014_02135474() { s32 iVar1 = mUnk_130; if (iVar1 != 4 && iVar1 != 5) { - func_ov000_0207c1b0(data_027e0e58, 0x241, &mPos, 2, 0, 0); - func_ov000_0207c1b0(data_027e0e58, 0x242, &mPos, 2, 0, 0); + data_027e0e58->func_ov000_0207c1b0(0x241, &mPos, 2, 0, 0); + data_027e0e58->func_ov000_0207c1b0(0x242, &mPos, 2, 0, 0); mAlive = false; } }