From a3472ab02d0430b77794a5062047f7bff10fbda0 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 9 Nov 2024 17:44:05 +0100 Subject: [PATCH] Attempt d_a_obj_tower_hand_D101 (#96) * Attempt d_a_obj_tower_hand_D101 * dAcOTowerHandD101_c probably equivalent * just two funcs, couldnt really do much to the rest --------- Co-authored-by: elijah-thomas774 --- .clangd | 4 +- .../rels/d_a_obj_tower_hand_D101NP/splits.txt | 3 + .../d_a_obj_tower_hand_D101NP/symbols.txt | 197 +++-- config/SOUE01/symbols.txt | 22 +- include/common.h | 2 +- include/d/a/d_a_base.h | 3 + include/d/a/d_a_player.h | 12 +- include/d/a/obj/d_a_obj_base.h | 2 +- include/d/a/obj/d_a_obj_item.h | 6 + include/d/a/obj/d_a_obj_tower_hand_D101.h | 101 ++- include/m/m3d/m_anmmdl.h | 8 + include/m/m_mtx.h | 4 +- include/toBeSorted/actor_event.h | 1 + include/toBeSorted/effects_struct.h | 11 +- src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp | 795 +++++++++++++++++- src/REL/d/a/obj/d_a_obj_tumble_weed.cpp | 4 +- 16 files changed, 1039 insertions(+), 136 deletions(-) diff --git a/.clangd b/.clangd index ca38e50fc..7d32bd416 100644 --- a/.clangd +++ b/.clangd @@ -1,5 +1,7 @@ # https://clangd.llvm.org/config CompileFlags: Add: [ - "-Wno-c++11-compat-deprecated-writable-strings" + "-Wno-c++11-compat-deprecated-writable-strings", + "-Wno-trigraphs", + "-fno-trigraphs" ] diff --git a/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/splits.txt b/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/splits.txt index bfd082fc4..aa86d1150 100644 --- a/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/splits.txt +++ b/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/splits.txt @@ -17,3 +17,6 @@ REL/global_destructor_chain.c: REL/d/a/obj/d_a_obj_tower_hand_D101.cpp: .text start:0x000000F0 end:0x00003028 .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x000000FC + .data start:0x00000000 end:0x0000038C + .bss start:0x00000008 end:0x00000198 diff --git a/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/symbols.txt b/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/symbols.txt index ad8942ea3..a6ef06609 100644 --- a/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_tower_hand_D101NP/symbols.txt @@ -8,66 +8,64 @@ __dt__32sFState_c<19dAcOTowerHandD101_c>Fv = .text:0x00000230; // type:function __dt__35sFStateFct_c<19dAcOTowerHandD101_c>Fv = .text:0x00000290; // type:function size:0x6C __dt__88sStateMgr_c<19dAcOTowerHandD101_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000300; // type:function size:0xA0 __dt__58sFStateMgr_c<19dAcOTowerHandD101_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003A0; // type:function size:0xA4 -fn_510_450 = .text:0x00000450; // type:function size:0x74 -fn_510_4D0 = .text:0x000004D0; // type:function size:0xC -fn_510_4E0 = .text:0x000004E0; // type:function size:0xC -fn_510_4F0 = .text:0x000004F0; // type:function size:0x20 -fn_510_510 = .text:0x00000510; // type:function size:0xA4 -fn_510_5C0 = .text:0x000005C0; // type:function size:0x8 -fn_510_5D0 = .text:0x000005D0; // type:function size:0x20 -fn_510_5F0 = .text:0x000005F0; // type:function size:0x2BC -fn_510_8B0 = .text:0x000008B0; // type:function size:0x130 -fn_510_9E0 = .text:0x000009E0; // type:function size:0x120 +getScale__19dAcOTowerHandD101_cFiR7mVec3_c = .text:0x00000450; // type:function size:0x74 +getBoundingLower__19dAcOTowerHandD101_cFv = .text:0x000004D0; // type:function size:0xC +getBoundingUpper__19dAcOTowerHandD101_cFv = .text:0x000004E0; // type:function size:0xC +isValidDirectionParam__19dAcOTowerHandD101_cFi = .text:0x000004F0; // type:function size:0x20 +transformMtx__19dAcOTowerHandD101_cFRC7mVec3_cRC7mAng3_cRC7mVec3_cR7mVec3_c = .text:0x00000510; // type:function size:0xA4 +f32Sq__19dAcOTowerHandD101_cFf = .text:0x000005C0; // type:function size:0x8 +isValidBgWIndex__19dAcOTowerHandD101_cFi = .text:0x000005D0; // type:function size:0x20 +createHeap__19dAcOTowerHandD101_cFv = .text:0x000005F0; // type:function size:0x2BC +actorCreate__19dAcOTowerHandD101_cFv = .text:0x000008B0; // type:function size:0x130 +actorPostCreate__19dAcOTowerHandD101_cFv = .text:0x000009E0; // type:function size:0x120 changeState__88sStateMgr_c<19dAcOTowerHandD101_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000B00; // type:function size:0x10 -fn_510_B10 = .text:0x00000B10; // type:function size:0x2C8 +actorExecute__19dAcOTowerHandD101_cFv = .text:0x00000B10; // type:function size:0x2C8 executeState__88sStateMgr_c<19dAcOTowerHandD101_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000DE0; // type:function size:0x10 -fn_510_DF0 = .text:0x00000DF0; // type:function size:0x354 +actorExecuteInEvent__19dAcOTowerHandD101_cFv = .text:0x00000DF0; // type:function size:0x354 getStateID__88sStateMgr_c<19dAcOTowerHandD101_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001150; // type:function size:0x10 -fn_510_1160 = .text:0x00001160; // type:function size:0x28 -fn_510_1190 = .text:0x00001190; // type:function size:0x6C -fn_510_1200 = .text:0x00001200; // type:function size:0x8 -fn_510_1210 = .text:0x00001210; // type:function size:0xC -fn_510_1220 = .text:0x00001220; // type:function size:0xC -fn_510_1230 = .text:0x00001230; // type:function size:0xC -fn_510_1240 = .text:0x00001240; // type:function size:0xC -fn_510_1250 = .text:0x00001250; // type:function size:0xC -fn_510_1260 = .text:0x00001260; // type:function size:0xC -fn_510_1270 = .text:0x00001270; // type:function size:0xC -fn_510_1280 = .text:0x00001280; // type:function size:0xC -fn_510_1290 = .text:0x00001290; // type:function size:0xC -fn_510_12A0 = .text:0x000012A0; // type:function size:0xC -fn_510_12B0 = .text:0x000012B0; // type:function size:0xC -fn_510_12C0 = .text:0x000012C0; // type:function size:0xC -fn_510_12D0 = .text:0x000012D0; // type:function size:0xC -fn_510_12E0 = .text:0x000012E0; // type:function size:0x8 -fn_510_12F0 = .text:0x000012F0; // type:function size:0xC -fn_510_1300 = .text:0x00001300; // type:function size:0xC -fn_510_1310 = .text:0x00001310; // type:function size:0xC -fn_510_1320 = .text:0x00001320; // type:function size:0xC -fn_510_1330 = .text:0x00001330; // type:function size:0x54 -fn_510_1390 = .text:0x00001390; // type:function size:0xD0 -fn_510_1460 = .text:0x00001460; // type:function size:0x10 -fn_510_1470 = .text:0x00001470; // type:function size:0x10 -fn_510_1480 = .text:0x00001480; // type:function size:0x58 -fn_510_14E0 = .text:0x000014E0; // type:function size:0x4C -fn_510_1530 = .text:0x00001530; // type:function size:0x24 -fn_510_1560 = .text:0x00001560; // type:function size:0x3C -fn_510_15A0 = .text:0x000015A0; // type:function size:0x24 -fn_510_15D0 = .text:0x000015D0; // type:function size:0x24 -fn_510_1600 = .text:0x00001600; // type:function size:0x58 -fn_510_1660 = .text:0x00001660; // type:function size:0x5C -fn_510_16C0 = .text:0x000016C0; // type:function size:0x54 -fn_510_1720 = .text:0x00001720; // type:function size:0x24 -fn_510_1744 = .text:0x00001744; // type:function size:0x4 -fn_510_1750 = .text:0x00001750; // type:function size:0x24 -fn_510_1774 = .text:0x00001774; // type:function size:0x4 -fn_510_1780 = .text:0x00001780; // type:function size:0x74 -fn_510_1800 = .text:0x00001800; // type:function size:0x38 -fn_510_1840 = .text:0x00001840; // type:function size:0x38 -fn_510_1880 = .text:0x00001880; // type:function size:0x48 -fn_510_18D0 = .text:0x000018D0; // type:function size:0x8C -fn_510_1960 = .text:0x00001960; // type:function size:0x84 -fn_510_19F0 = .text:0x000019F0; // type:function size:0x18 +draw__19dAcOTowerHandD101_cFv = .text:0x00001160; // type:function size:0x28 +getBgW__19dAcOTowerHandD101_cFiRP4dBgW = .text:0x00001190; // type:function size:0x6C +getEventStuff__19dAcOTowerHandD101_cFv = .text:0x00001200; // type:function size:0x8 +getItemOffsetX__19dAcOTowerHandD101_cFv = .text:0x00001210; // type:function size:0xC +getItemOffsetY__19dAcOTowerHandD101_cFv = .text:0x00001220; // type:function size:0xC +getItemOffsetZ__19dAcOTowerHandD101_cFv = .text:0x00001230; // type:function size:0xC +getDist1__19dAcOTowerHandD101_cFv = .text:0x00001240; // type:function size:0xC +getDist2__19dAcOTowerHandD101_cFv = .text:0x00001250; // type:function size:0xC +getDist3__19dAcOTowerHandD101_cFv = .text:0x00001260; // type:function size:0xC +getLinkOffsetX__19dAcOTowerHandD101_cFv = .text:0x00001270; // type:function size:0xC +getLinkOffsetY__19dAcOTowerHandD101_cFv = .text:0x00001280; // type:function size:0xC +getLinkOffsetZ__19dAcOTowerHandD101_cFv = .text:0x00001290; // type:function size:0xC +getFrame1__19dAcOTowerHandD101_cFv = .text:0x000012A0; // type:function size:0xC +getFrame2__19dAcOTowerHandD101_cFv = .text:0x000012B0; // type:function size:0xC +getCloseRate__19dAcOTowerHandD101_cFv = .text:0x000012C0; // type:function size:0xC +getOpenRate__19dAcOTowerHandD101_cFv = .text:0x000012D0; // type:function size:0xC +doSomethingHold__19dAcOTowerHandD101_cFf = .text:0x000012E0; // type:function size:0x8 +getDirection__19dAcOTowerHandD101_cCFv = .text:0x000012F0; // type:function size:0xC +getHoldFlag__19dAcOTowerHandD101_cCFv = .text:0x00001300; // type:function size:0xC +getSceneFlag__19dAcOTowerHandD101_cCFv = .text:0x00001310; // type:function size:0xC +getEventId__19dAcOTowerHandD101_cCFv = .text:0x00001320; // type:function size:0xC +getBgWMtx__19dAcOTowerHandD101_cFiRP6mMtx_c = .text:0x00001330; // type:function size:0x54 +getNodeMtx__19dAcOTowerHandD101_cCFPCcR6mMtx_c = .text:0x00001390; // type:function size:0xD0 +getLoc1Mtx__19dAcOTowerHandD101_cCFR6mMtx_c = .text:0x00001460; // type:function size:0x10 +getLoc2Mtx__19dAcOTowerHandD101_cCFR6mMtx_c = .text:0x00001470; // type:function size:0x10 +getItemOffset__19dAcOTowerHandD101_cFv = .text:0x00001480; // type:function size:0x58 +getItemPos__19dAcOTowerHandD101_cCFR7mVec3_c = .text:0x000014E0; // type:function size:0x4C +getDist1Sq__19dAcOTowerHandD101_cFv = .text:0x00001530; // type:function size:0x24 +getDist1PlusDist2__19dAcOTowerHandD101_cFv = .text:0x00001560; // type:function size:0x3C +getDist1PlusDist2Sq__19dAcOTowerHandD101_cFv = .text:0x000015A0; // type:function size:0x24 +getDist3Sq__19dAcOTowerHandD101_cFv = .text:0x000015D0; // type:function size:0x24 +getLinkOffsetNormal__19dAcOTowerHandD101_cFR7mVec3_c = .text:0x00001600; // type:function size:0x58 +getLinkOffsetMirror__19dAcOTowerHandD101_cFR7mVec3_c = .text:0x00001660; // type:function size:0x5C +getLinkOffset__19dAcOTowerHandD101_cCFR7mVec3_c = .text:0x000016C0; // type:function size:0x54 +setSceneFlag__19dAcOTowerHandD101_cCFi = .text:0x00001720; // type:function size:0x28 +unsetSceneFlag__19dAcOTowerHandD101_cCFi = .text:0x00001750; // type:function size:0x28 +checkSceneFlag1__19dAcOTowerHandD101_cCFiRb = .text:0x00001780; // type:function size:0x74 +setHoldFlag__19dAcOTowerHandD101_cFv = .text:0x00001800; // type:function size:0x38 +unsetHoldFlag__19dAcOTowerHandD101_cFv = .text:0x00001840; // type:function size:0x38 +checkFlag__19dAcOTowerHandD101_cCFRb = .text:0x00001880; // type:function size:0x48 +doEvent__19dAcOTowerHandD101_cFv = .text:0x000018D0; // type:function size:0x8C +eventCallback__19dAcOTowerHandD101_cFPv = .text:0x00001960; // type:function size:0x84 +calcItemPosition__19dAcOTowerHandD101_cCFRC7mVec3_cR7mVec3_c = .text:0x000019F0; // type:function size:0x18 initializeState_RemainOpen__19dAcOTowerHandD101_cFv = .text:0x00001A10; // type:function size:0x18 executeState_RemainOpen__19dAcOTowerHandD101_cFv = .text:0x00001A30; // type:function size:0x194 finalizeState_RemainOpen__19dAcOTowerHandD101_cFv = .text:0x00001BD0; // type:function size:0x4 @@ -104,47 +102,48 @@ isSameName__34sFStateID_c<19dAcOTowerHandD101_c>CFPCc = .text:0x00002FA0; // typ _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global -lbl_510_rodata_0 = .rodata:0x00000000; // type:object size:0x8 data:float -lbl_510_rodata_8 = .rodata:0x00000008; // type:object size:0x20 data:4byte -lbl_510_rodata_28 = .rodata:0x00000028; // type:object size:0x4 data:4byte -lbl_510_rodata_2C = .rodata:0x0000002C; // type:object size:0x64 data:4byte -lbl_510_rodata_90 = .rodata:0x00000090; // type:object size:0x4 data:float -lbl_510_rodata_94 = .rodata:0x00000094; // type:object size:0x4 data:float -lbl_510_rodata_98 = .rodata:0x00000098; // type:object size:0x4 data:float -lbl_510_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 data:float -lbl_510_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 data:float -lbl_510_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 data:float -lbl_510_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 data:float -lbl_510_rodata_AC = .rodata:0x000000AC; // type:object size:0x10 data:float -lbl_510_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 data:float -lbl_510_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 data:float -lbl_510_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 data:float -lbl_510_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 data:float -lbl_510_rodata_CC = .rodata:0x000000CC; // type:object size:0x30 data:float +lbl_510_rodata_0 = .rodata:0x00000000; // type:object size:0x8 scope:local data:float +lbl_510_rodata_8 = .rodata:0x00000008; // type:object size:0x20 scope:local data:4byte +lbl_510_rodata_28 = .rodata:0x00000028; // type:object size:0x4 scope:local data:4byte +lbl_510_rodata_2C = .rodata:0x0000002C; // type:object size:0x64 scope:local data:4byte +lbl_510_rodata_90 = .rodata:0x00000090; // type:object size:0x4 scope:local data:float +lbl_510_rodata_94 = .rodata:0x00000094; // type:object size:0x4 scope:local data:float +lbl_510_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local data:float +lbl_510_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 scope:local data:float +lbl_510_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 scope:local data:float +lbl_510_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 scope:local data:float +lbl_510_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 scope:local data:float +lbl_510_rodata_AC = .rodata:0x000000AC; // type:object size:0x10 scope:local data:float +lbl_510_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 scope:local data:float +lbl_510_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 scope:local data:float +lbl_510_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 scope:local data:float +lbl_510_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 scope:local data:float +lbl_510_rodata_CC = .rodata:0x000000CC; // type:object size:0x30 scope:local data:float g_profile_OBJ_TOWER_HAND_D101 = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_510_data_10 = .data:0x00000010; // type:object size:0x10 -lbl_510_data_20 = .data:0x00000020; // type:object size:0x10 -lbl_510_data_30 = .data:0x00000030; // type:object size:0x10 -lbl_510_data_40 = .data:0x00000040; // type:object size:0x10 -lbl_510_data_50 = .data:0x00000050; // type:object size:0x14 -lbl_510_data_64 = .data:0x00000064; // type:object size:0x14 -lbl_510_data_78 = .data:0x00000078; // type:object size:0x14 -lbl_510_data_8C = .data:0x0000008C; // type:object size:0xC -lbl_510_data_98 = .data:0x00000098; // type:object size:0xC -lbl_510_data_A4 = .data:0x000000A4; // type:object size:0x24 -lbl_510_data_C8 = .data:0x000000C8; // type:object size:0x4 data:4byte -lbl_510_data_CC = .data:0x000000CC; // type:object size:0x4 data:4byte -lbl_510_data_D0 = .data:0x000000D0; // type:object size:0x80 -lbl_510_data_150 = .data:0x00000150; // type:object size:0x30 -lbl_510_data_180 = .data:0x00000180; // type:object size:0x30 -lbl_510_data_1B0 = .data:0x000001B0; // type:object size:0x18 -lbl_510_data_1C8 = .data:0x000001C8; // type:object size:0x190 -lbl_510_data_358 = .data:0x00000358; // type:object size:0x34 +lbl_510_data_10 = .data:0x00000010; // type:object size:0x10 scope:local +lbl_510_data_20 = .data:0x00000020; // type:object size:0x10 scope:local +lbl_510_data_30 = .data:0x00000030; // type:object size:0x10 scope:local +lbl_510_data_40 = .data:0x00000040; // type:object size:0x10 scope:local +lbl_510_data_50 = .data:0x00000050; // type:object size:0x14 scope:local +lbl_510_data_64 = .data:0x00000064; // type:object size:0x14 scope:local +lbl_510_data_78 = .data:0x00000078; // type:object size:0x14 scope:local +lbl_510_data_8C = .data:0x0000008C; // type:object size:0xC scope:local +lbl_510_data_98 = .data:0x00000098; // type:object size:0xC scope:local +lbl_510_data_A4 = .data:0x000000A4; // type:object size:0x24 scope:local +@LOCAL@getFlags__Fv@FLAGS_1 = .data:0x000000C8; // type:object size:0x4 data:4byte +@LOCAL@getFlags__Fv@FLAGS_2@0 = .data:0x000000CC; // type:object size:0x4 data:4byte +__vt__19dAcOTowerHandD101_c = .data:0x000000D0; // type:object size:0x80 +__vt__58sFStateMgr_c<19dAcOTowerHandD101_c,20sStateMethodUsr_FI_c> = .data:0x00000150; // type:object size:0x30 +__vt__88sStateMgr_c<19dAcOTowerHandD101_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000180; // type:object size:0x30 +__vt__35sFStateFct_c<19dAcOTowerHandD101_c> = .data:0x000001B0; // type:object size:0x14 +__vt__32sFState_c<19dAcOTowerHandD101_c> = .data:0x000001C8; // type:object size:0x18 +__vt__34sFStateID_c<19dAcOTowerHandD101_c> = .data:0x00000358; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_510_bss_8 = .bss:0x00000008; // type:object size:0x18 data:4byte -lbl_510_bss_20 = .bss:0x00000020; // type:object size:0xC data:float -lbl_510_bss_2C = .bss:0x0000002C; // type:object size:0x3C data:float -lbl_510_bss_68 = .bss:0x00000068; // type:object size:0x40 data:4byte -lbl_510_bss_A8 = .bss:0x000000A8; // type:object size:0x40 data:4byte -lbl_510_bss_E8 = .bss:0x000000E8; // type:object size:0x40 data:4byte -lbl_510_bss_128 = .bss:0x00000128; // type:object size:0x70 data:4byte +lbl_510_bss_8 = .bss:0x00000008; // type:object size:0x18 scope:local data:4byte +lbl_510_bss_20 = .bss:0x00000020; // type:object size:0xC scope:local data:float +lbl_510_bss_2C = .bss:0x0000002C; // type:object size:0x3C scope:local data:float +StateID_RemainOpen__19dAcOTowerHandD101_c = .bss:0x00000068; // type:object size:0x30 data:4byte +StateID_Close__19dAcOTowerHandD101_c = .bss:0x000000A8; // type:object size:0x30 data:4byte +StateID_RemainClosed__19dAcOTowerHandD101_c = .bss:0x000000E8; // type:object size:0x30 data:4byte +StateID_Open__19dAcOTowerHandD101_c = .bss:0x00000128; // type:object size:0x30 data:4byte +StateID_Hold__19dAcOTowerHandD101_c = .bss:0x00000168; // type:object size:0x30 data:4byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 82bbe0ad8..c90589175 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -908,7 +908,7 @@ fn_80026F50 = .text:0x80026F50; // type:function size:0xD8 fn_80027030 = .text:0x80027030; // type:function size:0xD8 fn_80027110 = .text:0x80027110; // type:function size:0xC8 fn_800271E0 = .text:0x800271E0; // type:function size:0x44 -fn_80027230 = .text:0x80027230; // type:function size:0x78 +setMtx__13EffectsStructFRC6mMtx_c = .text:0x80027230; // type:function size:0x78 fn_800272B0 = .text:0x800272B0; // type:function size:0x70 fn_80027320 = .text:0x80027320; // type:function size:0x40 fn_80027360 = .text:0x80027360; // type:function size:0x40 @@ -920,7 +920,7 @@ fn_800274D0 = .text:0x800274D0; // type:function size:0x40 fn_80027510 = .text:0x80027510; // type:function size:0x4C fn_80027560 = .text:0x80027560; // type:function size:0x5C __ct__13EffectsStructFv = .text:0x800275C0; // type:function size:0x44 -__ct__13EffectsStructFP9dAcBase_c = .text:0x80027610; // type:function size:0x44 +__ct__13EffectsStructFP7dBase_c = .text:0x80027610; // type:function size:0x44 __dt__13EffectsStructFv = .text:0x80027660; // type:function size:0x78 remove__13EffectsStructFb = .text:0x800276E0; // type:function size:0x84 fn_80027770 = .text:0x80027770; // type:function size:0xE8 @@ -1121,7 +1121,7 @@ restorePosRotFromCopy__12dAcObjBase_cFv = .text:0x8002E5C0; // type:function siz create__12dAcObjBase_cFQ28fProfile14PROFILE_NAME_eUlUlP7mVec3_cP7mAng3_cP7mVec3_cUl = .text:0x8002E630; // type:function size:0x98 create__12dAcObjBase_cFPcUlUlP7mVec3_cP7mAng3_cP7mVec3_cUlUsSc = .text:0x8002E6D0; // type:function size:0xA0 ActorObjectBase__findObject = .text:0x8002E770; // type:function size:0x7C -getNextActorInList = .text:0x8002E7F0; // type:function size:0x58 +getNextObject__12dAcObjBase_cFP9fLiMgBa_cP12dAcObjBase_c = .text:0x8002E7F0; // type:function size:0x58 isLinkPointer = .text:0x8002E850; // type:function size:0x14 ActorObjectBase__calcVelocity = .text:0x8002E870; // type:function size:0x68 calcVelocity__12dAcObjBase_cFv = .text:0x8002E8E0; // type:function size:0xB8 @@ -2452,7 +2452,7 @@ isSpinAttackingVertically = .text:0x8005B850; // type:function size:0x20 fn_8005B870 = .text:0x8005B870; // type:function size:0x28 fn_8005B8A0 = .text:0x8005B8A0; // type:function size:0xC0 ActorLink__setPosYRot = .text:0x8005B960; // type:function size:0x44 -fn_8005B9B0 = .text:0x8005B9B0; // type:function size:0x98 +setTransform__7dAcPy_cFRC6mMtx_ciii = .text:0x8005B9B0; // type:function size:0x98 fn_8005BA50 = .text:0x8005BA50; // type:function size:0x30 fn_8005BA80 = .text:0x8005BA80; // type:function size:0x8 fn_8005BA90 = .text:0x8005BA90; // type:function size:0x8 @@ -3523,7 +3523,7 @@ ActorEventRelated__cutEnd = .text:0x8009CEB0; // type:function size:0x30 ActorEventRelated__getCurrentStepIndex = .text:0x8009CEE0; // type:function size:0x30 getCurrentEventCommand__17ActorEventRelatedCFv = .text:0x8009CF10; // type:function size:0x84 ActorEventRelated__getSomeEventRelatedNumber = .text:0x8009CFA0; // type:function size:0x80 -ActorEventRelated__isAdvance = .text:0x8009D020; // type:function size:0x34 +isAdvance__17ActorEventRelatedFv = .text:0x8009D020; // type:function size:0x34 advanceNext__17ActorEventRelatedFv = .text:0x8009D060; // type:function size:0x50 ActorEventRelated__getSingleIntData2 = .text:0x8009D0B0; // type:function size:0x8C ActorEventRelated__getSingleIntData = .text:0x8009D140; // type:function size:0x8C @@ -13452,10 +13452,10 @@ AcItem__stateWaitTurnOffLeave = .text:0x80250630; // type:function size:0x4 AcItem__stateWaitSacredDewGetEffectEnter = .text:0x80250640; // type:function size:0x64 AcItem__stateWaitSacredDewGetEffectUpdate = .text:0x802506B0; // type:function size:0x80 AcItem__stateWaitSacredDewGetEffectLeave = .text:0x80250730; // type:function size:0x4 -getItemFromBWheelItem = .text:0x80250740; // type:function size:0xEC -fn_80250830 = .text:0x80250830; // type:function size:0x40 +getItemFromBWheelItem__9dAcItem_cFv = .text:0x80250740; // type:function size:0xEC +setItemPosition__9dAcItem_cFRC7mVec3_c = .text:0x80250830; // type:function size:0x40 fn_80250870 = .text:0x80250870; // type:function size:0x38 -AcItem__isStateWait = .text:0x802508B0; // type:function size:0x50 +isStateWait__9dAcItem_cFv = .text:0x802508B0; // type:function size:0x50 AcItem__setCarriedAndTransitionToGetState = .text:0x80250900; // type:function size:0x50 AcItem__isGreenRupee = .text:0x80250950; // type:function size:0x10 AcItem__isBlueRupee = .text:0x80250960; // type:function size:0x10 @@ -17846,7 +17846,7 @@ YrotM__6mMtx_cFRC4mAng = .text:0x802F1880; // type:function size:0x4C mMtx__ZrotS = .text:0x802F18D0; // type:function size:0xBC ZrotM__6mMtx_cFRC4mAng = .text:0x802F1990; // type:function size:0x4C ZXYrotS__6mMtx_cFRC4mAngRC4mAngRC4mAng = .text:0x802F19E0; // type:function size:0x60 -mMtx__ZXYrotM = .text:0x802F1A40; // type:function size:0x60 +ZXYrotM__6mMtx_cFRC4mAngRC4mAngRC4mAng = .text:0x802F1A40; // type:function size:0x60 mMtx__XYZrotS = .text:0x802F1AA0; // type:function size:0x60 mMtx__ZYXrotM = .text:0x802F1B00; // type:function size:0x60 toRot__6mMtx_cCFR7mAng3_c = .text:0x802F1B60; // type:function size:0xDC @@ -39924,7 +39924,7 @@ GROOSENATOR_REF = .sbss:0x80575360; // type:object size:0x4 data:4byte lbl_80575364 = .sbss:0x80575364; // type:object size:0x4 data:4byte lbl_80575368 = .sbss:0x80575368; // type:object size:0x8 data:4byte sInstance__16AttentionManager = .sbss:0x80575370; // type:object size:0x8 data:4byte -EVENT_RELATED = .sbss:0x80575378; // type:object size:0x4 data:4byte +sInstance__12EventManager = .sbss:0x80575378; // type:object size:0x4 data:4byte lbl_8057537C = .sbss:0x8057537C; // type:object size:0xC data:byte lbl_80575388 = .sbss:0x80575388; // type:object size:0x8 data:byte lbl_80575390 = .sbss:0x80575390; // type:object size:0x4 data:4byte @@ -40217,7 +40217,7 @@ lbl_805758B6 = .sbss:0x805758B6; // type:object size:0x1 data:byte lbl_805758B7 = .sbss:0x805758B7; // type:object size:0x1 data:byte lbl_805758B8 = .sbss:0x805758B8; // type:object size:0x4 data:float lbl_805758BC = .sbss:0x805758BC; // type:object size:0x4 data:float -ITEM_ACTOR_LIST = .sbss:0x805758C0; // type:object size:0x8 data:4byte +sItemList__9dAcItem_c = .sbss:0x805758C0; // type:object size:0x8 data:4byte lbl_805758C8 = .sbss:0x805758C8; // type:object size:0x8 data:4byte NUMBER_OF_ITEMS = .sbss:0x805758D0; // type:object size:0x4 data:4byte lbl_805758D4 = .sbss:0x805758D4; // type:object size:0x1 data:byte diff --git a/include/common.h b/include/common.h index 514ed30bd..85144d823 100644 --- a/include/common.h +++ b/include/common.h @@ -117,7 +117,7 @@ typedef volatile f32 vf32; typedef volatile f64 vf64; // Necesary for CW -#if __cplusplus < 201103L && !defined(_WIN32) +#if __MWERKS__ #define override #define noexcept #define nullptr NULL diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 5e0851076..f78c09378 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -58,6 +58,9 @@ class dAcRef_c : dAcRefBase_c { const T *get() const { return static_cast(p_owner); } + BOOL isLinked() const { + return get() != nullptr; + } }; // Ghidra: ActorBase diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 97115c85a..6fb18530f 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -1,4 +1,6 @@ +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "m/m_mtx.h" class dAcPy_c : public dAcObjBase_c { // See Below for some info @@ -47,11 +49,13 @@ class dAcPy_c : public dAcObjBase_c { dAcPy_c(); virtual ~dAcPy_c(); - /* vt 0x080 */ virtual void IfCurrentActionToActor(); - /* vt 0x084 */ virtual void vt_0x084(); - /* vt 0x088 */ virtual void set0x439F(); + void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD); + + /* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD); + /* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD); + /* vt 0x088 */ virtual void set0x439F(dAcBase_c *ac, UNKWORD); /* vt 0x08C */ virtual void set0x43DE(); - /* vt 0x090 */ virtual void vt_0x090(); + /* vt 0x090 */ virtual f32 vt_0x090(); /* vt 0x094 */ virtual void relatedToUsingItem0x11(); /* vt 0x098 */ virtual void setPosRot(); /* vt 0x09C */ virtual void isLiftingObject(); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 0f9db4229..031cf4b5a 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -133,7 +133,7 @@ class dAcObjBase_c : public dAcBase_c { ); /* 8002e770 */ static dAcObjBase_c * findObject(fProfile::PROFILE_NAME_e actorId, fLiNdBa_c *refList, dAcObjBase_c *parent); - /* 8002e7f0 */ static dAcObjBase_c *getNextObject(fLiNdBa_c *ref, dAcObjBase_c *parent); + /* 8002e7f0 */ static dAcObjBase_c *getNextObject(fLiMgBa_c *ref, dAcObjBase_c *parent); /* 8002e850 */ bool isPlayer(); /* 8002e870 */ void calcVelocity(mVec3_c &pos, f32 speed); /* 8002e8e0 */ void calcVelocity(); diff --git a/include/d/a/obj/d_a_obj_item.h b/include/d/a/obj/d_a_obj_item.h index fc0cb0637..7c9efbc4b 100644 --- a/include/d/a/obj/d_a_obj_item.h +++ b/include/d/a/obj/d_a_obj_item.h @@ -2,6 +2,7 @@ #define D_A_ITEM_BASE_H #include "d/a/obj/d_a_obj_base.h" +#include "m/m_vec.h" // Ghidra: AcItem // Size: 0xd68 @@ -14,6 +15,11 @@ class dAcItem_c : public dAcObjBase_c { static void spawnDrop(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot); static u32 checkFlag(u32 flag); + void setItemPosition(const mVec3_c &); + void getItemFromBWheelItem(); + bool isStateWait(); + + static fLiMgBa_c sItemList; }; #endif diff --git a/include/d/a/obj/d_a_obj_tower_hand_D101.h b/include/d/a/obj/d_a_obj_tower_hand_D101.h index 99b3104d4..9e9bb068a 100644 --- a/include/d/a/obj/d_a_obj_tower_hand_D101.h +++ b/include/d/a/obj/d_a_obj_tower_hand_D101.h @@ -1,13 +1,23 @@ #ifndef D_A_OBJ_TOWER_HAND_D101_H #define D_A_OBJ_TOWER_HAND_D101_H +#include "common.h" +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_item.h" +#include "d/col/bg/d_bg_w.h" +#include "m/m3d/m_anmmdl.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" +#include "toBeSorted/actor_event.h" +#include "toBeSorted/effects_struct.h" class dAcOTowerHandD101_c : public dAcObjBase_c { public: - dAcOTowerHandD101_c() : mStateMgr(*this, sStateID::null) {} + dAcOTowerHandD101_c() : mStateMgr(*this, sStateID::null), mEffects(this), mEvent(*this, nullptr), mFlags(0) {} virtual ~dAcOTowerHandD101_c() {} STATE_FUNC_DECLARE(dAcOTowerHandD101_c, RemainOpen); @@ -16,8 +26,95 @@ class dAcOTowerHandD101_c : public dAcObjBase_c { STATE_FUNC_DECLARE(dAcOTowerHandD101_c, Open); STATE_FUNC_DECLARE(dAcOTowerHandD101_c, Hold); + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + virtual int actorExecuteInEvent() override; + + virtual int draw() override; + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOTowerHandD101_c); + int getDirection() const; + int getHoldFlag() const; + int getSceneFlag() const; + u32 getEventId() const; + + inline bool getItem(dAcItem_c *&outItem, bool &outIsWait); + inline bool getItem(dAcItem_c *&outItem); + + static bool isValidDirectionParam(int param); + static bool getScale(int direction, mVec3_c &outScale); + bool getNodeMtx(const char *nodeName, mMtx_c &outMtx) const; + bool getLoc1Mtx(mMtx_c &outMtx) const; + bool getLoc2Mtx(mMtx_c &outMtx) const; + + static const mVec3_c &getBoundingLower(); + static const mVec3_c &getBoundingUpper(); + + static bool isValidBgWIndex(int index); + bool getBgW(int index, dBgW *&outBgW); + bool getBgWMtx(int index, mMtx_c *&outMtx); + + static f32 getFrame1(); + static f32 getFrame2(); + + void doSomethingHold(f32 flag); + + void getItemPos(mVec3_c &vec) const; + ActorEventRelated &getEventStuff(); + void doEvent(); + + static f32 getDist1(); + static f32 getDist2(); + static f32 getDist3(); + + static f32 getDist1Sq(); + static f32 getDist1PlusDist2(); + static f32 getDist1PlusDist2Sq(); + static f32 getDist3Sq(); + static f32 getCloseRate(); + static f32 getOpenRate(); + + bool checkFlag(bool &result) const; + void setSceneFlag(int flag) const; + void unsetSceneFlag(int flag) const; + bool checkSceneFlag1(int flag, bool &result) const; + + void setHoldFlag(); + void unsetHoldFlag(); + + static void eventCallback(void *self); + + static void + transformMtx(const mVec3_c &localTranslation, const mAng3_c &rotation, const mVec3_c &offset, mVec3_c &result); + static f32 f32Sq(f32 val); + + static f32 getItemOffsetX(); + static f32 getItemOffsetY(); + static f32 getItemOffsetZ(); + static mVec3_c getItemOffset(); + void calcItemPosition(const mVec3_c &offset, mVec3_c &outPosition) const; + + static f32 getLinkOffsetX(); + static f32 getLinkOffsetY(); + static f32 getLinkOffsetZ(); + static void getLinkOffsetNormal(mVec3_c &out); + static void getLinkOffsetMirror(mVec3_c &out); + void getLinkOffset(mVec3_c &out) const; + + /* 0x330 */ m3d::mdlAnmChr mMdl; + /* 0x398 */ EffectsStruct mEffects; + /* 0x3CC */ dBgW mBgWs[3]; + /* 0x9FC */ STATE_MGR_DECLARE(dAcOTowerHandD101_c); + /* 0xA38 */ ActorEventRelated mEvent; + /* 0xA88 */ mMtx_c mLoc1Mtx; + /* 0xAB8 */ mMtx_c mLoc2Mtx; + /* 0xAE8 */ dAcRef_c mHeldItem; + /* 0xAF4 */ f32 field_0xAF4; + /* 0xAF8 */ u8 field_0xAF8[0xB04 - 0xAF8]; + /* 0xB04 */ u32 mFlags; + /* 0xB08 */ u16 field_0xB08; }; #endif diff --git a/include/m/m3d/m_anmmdl.h b/include/m/m3d/m_anmmdl.h index 39d530649..cf81f5609 100644 --- a/include/m/m3d/m_anmmdl.h +++ b/include/m/m3d/m_anmmdl.h @@ -45,10 +45,18 @@ class mdlAnmChr { return mMdl; } + inline const mdl_c &getModel() const { + return mMdl; + } + inline anmChr_c &getAnm() { return mAnm; } + inline const anmChr_c &getAnm() const { + return mAnm; + } + private: nw4r::g3d::ResFile mMdlFile; nw4r::g3d::ResFile mAnmFile; diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h index 12fb49bf7..be9fb6240 100644 --- a/include/m/m_mtx.h +++ b/include/m/m_mtx.h @@ -65,10 +65,10 @@ class mMtx_c : public EGG::Matrix34f { void rot(int, int); // does some werrd operation to rotate the matrix bool quatRelated(); - void trans(const mVec3_c &v) { + void transS(const mVec3_c &v) { PSMTXTrans(*this, v.x, v.y, v.z); } - void trans(f32 x, f32 y, f32 z) { + void transS(f32 x, f32 y, f32 z) { PSMTXTrans(*this, x, y, z); } mVec3_c multVec(const mVec3_c &v) const { diff --git a/include/toBeSorted/actor_event.h b/include/toBeSorted/actor_event.h index 0272e9e70..b9844625c 100644 --- a/include/toBeSorted/actor_event.h +++ b/include/toBeSorted/actor_event.h @@ -14,6 +14,7 @@ class ActorEventRelated { void scheduleEvent(Event &, u32); u32 getCurrentEventCommand() const; void advanceNext(); + bool isAdvance(); private: u8 field_0x00[0x50 - 0x00]; diff --git a/include/toBeSorted/effects_struct.h b/include/toBeSorted/effects_struct.h index 847d6e691..a3070d3d3 100644 --- a/include/toBeSorted/effects_struct.h +++ b/include/toBeSorted/effects_struct.h @@ -3,10 +3,13 @@ #include "common.h" #include "d/d_base.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" class EffectsStruct { private: - u8 field_0x00[0x1C - 0x00]; + s32 field_0x00; + u8 field_0x04[0x1C - 0x04]; public: // vt at 0x1C @@ -19,6 +22,12 @@ class EffectsStruct { } void remove(bool); + void fn_80029929(u16 effect, mVec3_c *pos, void *, void *, void *, void *); + void setMtx(const mMtx_c&); + + bool checkField0x00() const { + return field_0x00 != 0; + } private: u8 field_0x20[0x28 - 0x20]; diff --git a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp index ae02bc07a..29b569429 100644 --- a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp +++ b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp @@ -1,25 +1,796 @@ #include "d/a/obj/d_a_obj_tower_hand_D101.h" +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_item.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_w.h" +#include "d/flag/sceneflag_manager.h" +#include "f/f_base.h" +#include "m/m3d/m_fanm.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "nw4r/g3d/g3d_resfile.h" +#include "rvl/MTX/mtx.h" +#include "rvl/MTX/vec.h" +#include "s/s_Math.h" +#include "toBeSorted/actor_event.h" +#include "toBeSorted/event_manager.h" +#include "toBeSorted/room_manager.h" + SPECIAL_ACTOR_PROFILE(OBJ_TOWER_HAND_D101, dAcOTowerHandD101_c, fProfile::OBJ_TOWER_HAND_D101, 0x180, 0, 6); +const mVec3_c sScales[2] = {mVec3_c(1.0f, 1.0f, 1.0f), mVec3_c(-1.0f, 1.0f, 1.0f)}; +const mVec3_c sBoundingLower = mVec3_c(-1000.0f, 0.0f, -600.0f); +const mVec3_c sBoundingUpper = mVec3_c(1000.0f, 1000.0f, 1000.0f); + +const mVec3_c v1 = mVec3_c::Ex * 50.0f; +const mVec3_c v2 = mVec3_c::Ey * 50.0f; +const mVec3_c v3 = mVec3_c::Ez * 50.0f; + STATE_DEFINE(dAcOTowerHandD101_c, RemainOpen); STATE_DEFINE(dAcOTowerHandD101_c, Close); STATE_DEFINE(dAcOTowerHandD101_c, RemainClosed); STATE_DEFINE(dAcOTowerHandD101_c, Open); STATE_DEFINE(dAcOTowerHandD101_c, Hold); -void dAcOTowerHandD101_c::initializeState_RemainOpen() {} -void dAcOTowerHandD101_c::executeState_RemainOpen() {} +static const char *const sOarcName = "TowerHandD101"; +static const char *const sMdlName = "TowerHandD101"; +static const char *const sAnmName = "TowerHandD101"; + +static const char *const sCollisionParts[2][3] = { + { "TowerHandD101A", "TowerHandD101B", "TowerHandD101C"}, + {"TowerHandD101A_R", "TowerHandD101B_R", "TowerHandD101C_R"}, +}; + +static const char *const sLocator1 = "locator1"; +static const char *const sLocator2 = "locator2"; + +// TODO there are tons of unused floats in the rodata section + +bool dAcOTowerHandD101_c::getScale(int direction, mVec3_c &outScale) { + if (!isValidDirectionParam(direction)) { + return false; + } + + outScale.x = sScales[direction].x; + outScale.y = sScales[direction].y; + outScale.z = sScales[direction].z; + return true; +} + +const mVec3_c &dAcOTowerHandD101_c::getBoundingLower() { + return sBoundingLower; +} + +const mVec3_c &dAcOTowerHandD101_c::getBoundingUpper() { + return sBoundingUpper; +} + +bool dAcOTowerHandD101_c::isValidDirectionParam(int param) { + return 0 <= param && param <= 1; +} + +void dAcOTowerHandD101_c::transformMtx( + const mVec3_c &localTranslation, const mAng3_c &rotation, const mVec3_c &offset, mVec3_c &result +) { + mMtx_c tmp1, tmp2; + tmp1.transS(localTranslation); + tmp1.ZXYrotM(rotation.x, rotation.y, rotation.z); + tmp2.transS(offset); + tmp1 += tmp2; + tmp1.getTranslation(result); +} + +f32 dAcOTowerHandD101_c::f32Sq(f32 value) { + return value * value; +} + +bool dAcOTowerHandD101_c::isValidBgWIndex(int index) { + return 0 <= index && index <= 2; +} + +bool dAcOTowerHandD101_c::createHeap() { + const char *oarcName = sOarcName; + void *resP = getOarcResFile(oarcName); + if (resP == nullptr) { + return false; + } + if (!mMdl.create(resP, sMdlName, sAnmName, &heap_allocator, 0x130)) { + return false; + } + int direction = getDirection(); + if (!isValidDirectionParam(direction)) { + return false; + } + nw4r::g3d::ResFile res = resP; + if (!res.mFile.IsValid()) { + return false; + } + RoomManager::bindStageResToFile(&res); + if (direction == 1) { + mMdl.getModel().setCullModeAll(GX_CULL_FRONT, false); + } + updateMatrix(); + mMdl.getModel().setLocalMtx(mWorldMtx); + mVec3_c newScale; + if (!getScale(direction, newScale)) { + return false; + } + mMdl.getModel().setScale(newScale); + mMdl.getModel().calc(false); + mMtx_c loc1Mtx; + getLoc1Mtx(loc1Mtx); + mLoc1Mtx.copyFrom(loc1Mtx); + mMtx_c loc2Mtx; + getLoc2Mtx(loc2Mtx); + mLoc2Mtx.copyFrom(loc2Mtx); + + const char *const *parts = sCollisionParts[direction]; + for (int i = 0; i <= 2; i++) { + void *dzb = getOarcDZB(oarcName, parts[i]); + if (dzb == nullptr) { + return false; + } + void *plc = getOarcPLC(oarcName, parts[i]); + if (plc == nullptr) { + return false; + } + dBgW *bgW = nullptr; + getBgW(i, bgW); + mMtx_c *bgWMtx; + getBgWMtx(i, bgWMtx); + bool ok = !(BOOL)bgW->Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, bgWMtx, &mScale); + if (!ok) { + return false; + } + } + + return true; +} + +int dAcOTowerHandD101_c::actorCreate() { + CREATE_ALLOCATOR(dAcOTowerHandD101_c); + + mMdl.getModel().setLocalMtx(mWorldMtx); + mMdl.setAnm(sAnmName, m3d::PLAY_MODE_4, 0.0f); + mMdl.getModel().setPriorityDraw(0x1C, 0); + for (int i = 0; i <= 2; i++) { + dBgW *bgW = nullptr; + getBgW(i, bgW); + bgW->SetCrrFunc(dBgS_MoveBGProc_Typical); + dBgS::GetInstance()->Regist(bgW, this); + } + + boundingBox.Set(getBoundingLower(), getBoundingUpper()); + + return SUCCEEDED; +} + +int dAcOTowerHandD101_c::actorPostCreate() { + mVec3_c pos; + getItemPos(pos); + bool handClosed = true; + dAcObjBase_c *ac = dAcObjBase_c::getNextObject(&dAcItem_c::sItemList, nullptr); + f32 distLimit = 90000.0f; + while (handClosed && ac != nullptr) { + if (PSVECSquareDistance(pos, ac->position) < distLimit) { + handClosed = false; + mHeldItem.link(static_cast(ac)); + } else { + ac = dAcObjBase_c::getNextObject(&dAcItem_c::sItemList, ac); + } + } + + if (handClosed) { + mFlags |= 1; + } + + if (handClosed) { + mStateMgr.changeState(StateID_RemainClosed); + } else { + mStateMgr.changeState(StateID_RemainOpen); + } + + return SUCCEEDED; +} + +inline bool dAcOTowerHandD101_c::getItem(dAcItem_c *&outItem) { + outItem = !mHeldItem.isLinked() ? nullptr : mHeldItem.get(); + bool ret = outItem == nullptr; + return ret; +} + +int dAcOTowerHandD101_c::actorExecute() { + dAcPy_c *link; + dAcItem_c *item; + link = dAcPy_c::LINK; + UNKWORD w = link->IfCurrentActionToActor(this, 0x3D); + bool b = getItem(item); + if (!b && item->isStateWait()) { + f32 dist = PSVECSquareDistance(item->position, link->position); + if (w == 0 && dist < 15625.0f) { + item->getItemFromBWheelItem(); + } else { + item->setItemPosition(item->position); + } + } + + bool doSomething; + if (b) { + doSomething = true; + } else { + doSomething = !item->isStateWait(); + } + if (b || doSomething) { + link->vt_0x084(this, 0x3D); + } + mStateMgr.executeState(); + + mVec3_c newScale; + int direction = getDirection(); + getScale(direction, newScale); + mMdl.getModel().calc(false); + + mMtx_c tmpMtx2; + mMtx_c tmpMtx3; + mMtx_c tmpMtx1; + mMtx_c tmpMtx4; + + getLoc1Mtx(tmpMtx2); + PSMTXScale(tmpMtx1, newScale.x, newScale.y, newScale.z); + PSMTXConcat(tmpMtx2, tmpMtx1, tmpMtx2); + mLoc1Mtx.copyFrom(tmpMtx2); + + getLoc2Mtx(tmpMtx3); + PSMTXScale(tmpMtx4, newScale.x, newScale.y, newScale.z); + PSMTXConcat(tmpMtx3, tmpMtx4, tmpMtx3); + mLoc2Mtx.copyFrom(tmpMtx3); + + if (mEffects.checkField0x00()) { + if (direction == 1) { + tmpMtx3.YrotM(-0x8000); + } + mEffects.setMtx(tmpMtx3); + } + for (int i = 0; i <= 2; i++) { + dBgW *bgW = nullptr; + getBgW(i, bgW); + bgW->Move(); + } + + return SUCCEEDED; +} + +int dAcOTowerHandD101_c::actorExecuteInEvent() { + u32 cmd = getEventStuff().getCurrentEventCommand(); + switch (cmd) { + case 'wait': getEventStuff().advanceNext(); break; + case 'clos': { + if (getEventStuff().isAdvance()) { + if (mStateMgr.isState(StateID_Close) || mStateMgr.isState(StateID_RemainClosed)) { + mStateMgr.changeState(StateID_Open); + } + } + + mStateMgr.executeState(); + + if (mStateMgr.isState(StateID_RemainClosed)) { + getEventStuff().advanceNext(); + } + + mVec3_c newScale; + int direction = getDirection(); + getScale(direction, newScale); + mMdl.getModel().calc(false); + + mMtx_c tmpMtx2; + mMtx_c tmpMtx3; + mMtx_c tmpMtx1; + mMtx_c tmpMtx4; + + getLoc1Mtx(tmpMtx2); + PSMTXScale(tmpMtx1, newScale.x, newScale.y, newScale.z); + PSMTXConcat(tmpMtx2, tmpMtx1, tmpMtx2); + mLoc1Mtx.copyFrom(tmpMtx2); + + getLoc2Mtx(tmpMtx3); + PSMTXScale(tmpMtx4, newScale.x, newScale.y, newScale.z); + PSMTXConcat(tmpMtx3, tmpMtx4, tmpMtx3); + mLoc2Mtx.copyFrom(tmpMtx3); + + if (mEffects.checkField0x00()) { + if (direction == 1) { + tmpMtx3.YrotM(-0x8000); + } + mEffects.setMtx(tmpMtx3); + } + for (int i = 0; i <= 2; i++) { + dBgW *bgW = nullptr; + getBgW(i, bgW); + bgW->Move(); + } + } break; + + case '????': actorExecute(); break; + default: + actorExecute(); + // Cool and here we're NOT using getEventStuff. Why even bother? + mEvent.advanceNext(); + } + return SUCCEEDED; +} + +int dAcOTowerHandD101_c::draw() { + drawModelType1(&mMdl.getModel()); + return SUCCEEDED; +} + +bool dAcOTowerHandD101_c::getBgW(int index, dBgW *&outBgW) { + if (isValidBgWIndex(index)) { + outBgW = &mBgWs[index]; + return true; + } + return false; +} + +ActorEventRelated &dAcOTowerHandD101_c::getEventStuff() { + return mEvent; +} + +f32 dAcOTowerHandD101_c::getItemOffsetX() { + return 0.0f; +} + +f32 dAcOTowerHandD101_c::getItemOffsetY() { + return 100.0f; +} + +f32 dAcOTowerHandD101_c::getItemOffsetZ() { + return 0.0f; +} + +f32 dAcOTowerHandD101_c::getDist1() { + return 300.0f; +} + +f32 dAcOTowerHandD101_c::getDist2() { + return 200.0f; +} + +f32 dAcOTowerHandD101_c::getDist3() { + return 300.0f; +} + +f32 dAcOTowerHandD101_c::getLinkOffsetX() { + return 0.0f; +} + +f32 dAcOTowerHandD101_c::getLinkOffsetY() { + return 180.0f; +} + +f32 dAcOTowerHandD101_c::getLinkOffsetZ() { + return -180.0f; +} + +f32 dAcOTowerHandD101_c::getFrame1() { + return 15.0f; +} + +f32 dAcOTowerHandD101_c::getFrame2() { + return 30.0f; +} + +f32 dAcOTowerHandD101_c::getCloseRate() { + return 3.65f; +} + +f32 dAcOTowerHandD101_c::getOpenRate() { + return 1.0f; +} + +void dAcOTowerHandD101_c::doSomethingHold(f32 arg) { + field_0xAF4 = arg; +} + +int dAcOTowerHandD101_c::getDirection() const { + return params & 0xFF; +} + +int dAcOTowerHandD101_c::getHoldFlag() const { + return (params >> 8) & 0xFF; +} + +int dAcOTowerHandD101_c::getSceneFlag() const { + return (params >> 16) & 0xFF; +} + +u32 dAcOTowerHandD101_c::getEventId() const { + return (params >> 24) & 0xFF; +} + +bool dAcOTowerHandD101_c::getBgWMtx(int index, mMtx_c *&outMtx) { + switch (index) { + case 0: outMtx = &mWorldMtx; return true; + case 1: outMtx = &mLoc1Mtx; return true; + case 2: outMtx = &mLoc2Mtx; return true; + default: return false; + } +} + +bool dAcOTowerHandD101_c::getNodeMtx(const char *nodeName, mMtx_c &outMtx) const { + int nodeId = mMdl.getModel().getNodeID(nodeName); + if (nodeId == -1) { + return false; + } + mMtx_c mtx; + if (mMdl.getModel().getNodeWorldMtx(nodeId, mtx)) { + outMtx.copyFrom(mtx); + return true; + } + return false; +} + +bool dAcOTowerHandD101_c::getLoc1Mtx(mMtx_c &outMtx) const { + return getNodeMtx(sLocator1, outMtx); +} + +bool dAcOTowerHandD101_c::getLoc2Mtx(mMtx_c &outMtx) const { + return getNodeMtx(sLocator2, outMtx); +} + +mVec3_c dAcOTowerHandD101_c::getItemOffset() { + return mVec3_c(getItemOffsetX(), getItemOffsetY(), getItemOffsetZ()); +} + +void dAcOTowerHandD101_c::getItemPos(mVec3_c &outVec) const { + calcItemPosition(getItemOffset(), outVec); +} + +f32 dAcOTowerHandD101_c::getDist1Sq() { + return f32Sq(getDist1()); +} + +f32 dAcOTowerHandD101_c::getDist1PlusDist2() { + return getDist1() + getDist2(); +} + +f32 dAcOTowerHandD101_c::getDist1PlusDist2Sq() { + return f32Sq(getDist1PlusDist2()); +} + +f32 dAcOTowerHandD101_c::getDist3Sq() { + return f32Sq(getDist3()); +} + +void dAcOTowerHandD101_c::getLinkOffsetNormal(mVec3_c &out) { + out.set(getLinkOffsetX(), getLinkOffsetY(), getLinkOffsetZ()); +} + +void dAcOTowerHandD101_c::getLinkOffsetMirror(mVec3_c &out) { + out.set(-getLinkOffsetX(), getLinkOffsetY(), getLinkOffsetZ()); +} + +void dAcOTowerHandD101_c::getLinkOffset(mVec3_c &out) const { + switch (getDirection()) { + case 0: getLinkOffsetNormal(out); break; + case 1: getLinkOffsetMirror(out); break; + } +} + +void dAcOTowerHandD101_c::setSceneFlag(int flag) const { + u16 theFlag = flag; + if (theFlag >= 255) { + return; + } + SceneflagManager::sInstance->setFlag(roomid, theFlag); +} + +void dAcOTowerHandD101_c::unsetSceneFlag(int flag) const { + u16 theFlag = flag; + if (theFlag >= 255) { + return; + } + SceneflagManager::sInstance->unsetFlag(roomid, theFlag); +} + +bool dAcOTowerHandD101_c::checkSceneFlag1(int flag, bool &result) const { + u16 theFlag = flag; + // I guess 255 is not a valid scene flag + bool isValidSceneFlag = theFlag < 255; + if (isValidSceneFlag) { + result = SceneflagManager::sInstance->checkBoolFlag(roomid, theFlag); + } + return isValidSceneFlag; +} + +void dAcOTowerHandD101_c::setHoldFlag() { + setSceneFlag(getHoldFlag()); +} + +void dAcOTowerHandD101_c::unsetHoldFlag() { + unsetSceneFlag(getHoldFlag()); +} + +bool dAcOTowerHandD101_c::checkFlag(bool &result) const { + return checkSceneFlag1(getSceneFlag(), result); +} + +// ??? +inline u32 getFlags() { + static volatile u32 FLAGS_1 = 0x00000001; + static u32 FLAGS_2 = 0x00100001; + // The remarkable bit here is that this does not use an `andc` instruction, + // but rather `nor`s FLAGS_1, contrary to the other usages so far + u32 f1 = ~FLAGS_1; + u32 f2 = FLAGS_2; + return f2 & f1; +} + +void dAcOTowerHandD101_c::doEvent() { + Event e = Event(getEventId(), roomid, getFlags(), (void *)&eventCallback, nullptr); + getEventStuff().scheduleEvent(e, 0); +} + +void dAcOTowerHandD101_c::eventCallback(void *arg) { + dAcOTowerHandD101_c *self = static_cast(arg); + self->mFlags |= 1; + dAcPy_c *link = dAcPy_c::LINK; + if (link->IfCurrentActionToActor(self, 0x3D)) { + link->vt_0x084(self, 0x3D); + } +} + +void dAcOTowerHandD101_c::calcItemPosition(const mVec3_c &offset, mVec3_c &outPosition) const { + transformMtx(position, rotation, offset, outPosition); +} + +void dAcOTowerHandD101_c::initializeState_RemainOpen() { + mMdl.setFrame(mMdl.getAnm().getStartFrame()); +} + +inline bool dAcOTowerHandD101_c::getItem(dAcItem_c *&outItem, bool &outIsNotWait) { + dAcItem_c *item = mHeldItem.get(); + if (item == nullptr) { + outItem = nullptr; + } else { + outItem = item; + } + bool ret = item == nullptr; + if (ret) { + outIsNotWait = true; + } else { + outIsNotWait = !outItem->isStateWait(); + } + return ret; +} + +void dAcOTowerHandD101_c::executeState_RemainOpen() { + dAcPy_c *link = dAcPy_c::LINK; + mVec3_c pos; + getItemPos(pos); + f32 linkDistToItem = PSVECSquareDistance(pos, link->position); + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'wait') { + return; + } + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'clos') { + mStateMgr.changeState(StateID_Close); + return; + } + bool isNotWait; + dAcItem_c *item; + if (getItem(item, isNotWait)) { + if (160000.0f < linkDistToItem) { + doEvent(); + } + } else if (!isNotWait) { + if (linkDistToItem < getDist1Sq()) { + mStateMgr.changeState(StateID_Close); + } + } +} void dAcOTowerHandD101_c::finalizeState_RemainOpen() {} -void dAcOTowerHandD101_c::initializeState_Close() {} -void dAcOTowerHandD101_c::executeState_Close() {} + +extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_573; +// extern "C" void fn_80029929() +void dAcOTowerHandD101_c::initializeState_Close() { + mMdl.getAnm().setPlayState(m3d::PLAY_MODE_1); + mMdl.setRate(getCloseRate()); + mEffects.fn_80029929(PARTICLE_RESOURCE_ID_MAPPING_573, &position, nullptr, nullptr, nullptr, nullptr); + playSound(0xC0C); +} +void dAcOTowerHandD101_c::executeState_Close() { + dAcPy_c *link = dAcPy_c::LINK; + mVec3_c pos; + getItemPos(pos); + f32 linkDistToItem = PSVECSquareDistance(pos, link->position); + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'wait') { + mStateMgr.changeState(StateID_Open); + return; + } + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'clos') { + mMdl.play(); + if (mMdl.getAnm().isStop()) { + mStateMgr.changeState(StateID_RemainClosed); + } + return; + } + + bool isNotWait; + dAcItem_c *item; + if (getItem(item, isNotWait)) { + if (160000.0f < linkDistToItem) { + doEvent(); + } + mStateMgr.changeState(StateID_Open); + } else if (isNotWait) { + mStateMgr.changeState(StateID_Open); + } else if (link->IfCurrentActionToActor(this, 0x3D)) { + mStateMgr.changeState(StateID_Hold); + } else { + if (mMdl.getAnm().isStop()) { + mStateMgr.changeState(StateID_RemainClosed); + } else { + if (getFrame1() <= mMdl.getAnm().getFrame() && getFrame2() <= mMdl.getAnm().getFrame() && + linkDistToItem < getDist1PlusDist2Sq()) { + link->set0x439F(this, 5); + } + + mMdl.play(); + } + } +} void dAcOTowerHandD101_c::finalizeState_Close() {} -void dAcOTowerHandD101_c::initializeState_RemainClosed() {} -void dAcOTowerHandD101_c::executeState_RemainClosed() {} -void dAcOTowerHandD101_c::finalizeState_RemainClosed() {} -void dAcOTowerHandD101_c::initializeState_Open() {} -void dAcOTowerHandD101_c::executeState_Open() {} + +void dAcOTowerHandD101_c::initializeState_Open() { + bool isFlagSet; + checkFlag(isFlagSet); + if (!isFlagSet) { + mMdl.getAnm().setPlayState(m3d::PLAY_MODE_3); + mMdl.setRate(getOpenRate()); + } + playSound(0xC0D); +} +void dAcOTowerHandD101_c::executeState_Open() { + dAcPy_c *link = dAcPy_c::LINK; + mVec3_c pos; + getItemPos(pos); + f32 linkDistToItem = PSVECSquareDistance(pos, link->position); + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'wait') { + if (mMdl.getAnm().isStop()) { + mStateMgr.changeState(StateID_RemainOpen); + } else { + mMdl.play(); + } + return; + } + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'clos') { + if (mMdl.getAnm().isStop()) { + mStateMgr.changeState(StateID_Close); + } else { + mMdl.play(); + } + return; + } + + bool isNotWait; + dAcItem_c *item; + if (getItem(item, isNotWait)) { + if (160000.0f < linkDistToItem) { + doEvent(); + } + if (mMdl.getAnm().isStop()) { + mStateMgr.changeState(StateID_Close); + } else { + mMdl.play(); + } + } else if (isNotWait) { + if (mMdl.getAnm().isStop()) { + mStateMgr.changeState(StateID_Close); + } else { + mMdl.play(); + } + } else { + if (mMdl.getAnm().isStop()) { + mStateMgr.changeState(StateID_Close); + } else { + mMdl.play(); + } + } +} void dAcOTowerHandD101_c::finalizeState_Open() {} -void dAcOTowerHandD101_c::initializeState_Hold() {} -void dAcOTowerHandD101_c::executeState_Hold() {} -void dAcOTowerHandD101_c::finalizeState_Hold() {} + +void dAcOTowerHandD101_c::initializeState_RemainClosed() { + mMdl.setFrame(mMdl.getAnm().getEndFrame()); + bool isFlagSet = false; + checkFlag(isFlagSet); + if (isFlagSet) { + mFlags |= 1; + } + field_0xB08 = 0; +} +void dAcOTowerHandD101_c::executeState_RemainClosed() { + dAcPy_c *link = dAcPy_c::LINK; + mVec3_c pos; + getItemPos(pos); + f32 linkDistToItem = PSVECSquareDistance(pos, link->position); + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'wait') { + mStateMgr.changeState(StateID_Open); + return; + } + + if (EventManager::isInEvent() && getEventStuff().getCurrentEventCommand() == 'clos') { + return; + } + if ((mFlags & 1) == 0) { + bool isNotWait; + dAcItem_c *item; + // Okay here the inline theory completely falls apart because + // the 160000.0f is only being loaded once in the middle of that + // this suspected inline body does + if (getItem(item, isNotWait)) { + if (160000.0f < linkDistToItem) { + doEvent(); + } + mStateMgr.changeState(StateID_Open); + } else if (isNotWait) { + mStateMgr.changeState(StateID_Open); + } else { + if (getDist1PlusDist2Sq() < 160000.0f) { + mStateMgr.changeState(StateID_Open); + } + } + } +} +void dAcOTowerHandD101_c::finalizeState_RemainClosed() {} + +void dAcOTowerHandD101_c::initializeState_Hold() { + mMdl.getAnm().setPlayState(m3d::PLAY_MODE_1); + mMdl.setRate(getCloseRate()); + setHoldFlag(); + doSomethingHold(0.0f); +} +void dAcOTowerHandD101_c::executeState_Hold() { + dAcPy_c *link = dAcPy_c::LINK; + if (link->IfCurrentActionToActor(this, 0x3D)) { + mMdl.play(); + f32 linkValue = link->vt_0x090(); + u32 i = 0; + bool keepGoing = true; + f32 counter = 0.8f; + while (keepGoing == true && i < 4) { + if (counter < linkValue) { + keepGoing = false; + } else { + counter -= 0.2f; + i++; + } + } + f32 value = field_0xAF4; + sLib::addCalcScaledDiff(&value, i * 0.25f, 0.5f, 1.0f); + doSomethingHold(value); + mMtx_c tmpMtx1; + tmpMtx1.transS(position); + // Different address calculation here + tmpMtx1.ZXYrotM(rotation.x, rotation.y, rotation.z); + mVec3_c linkVec; + getLinkOffset(linkVec); + mMtx_c tmpMtx2; + tmpMtx2.transS(linkVec); + tmpMtx1 += tmpMtx2; + tmpMtx1.YrotM(-0x8000); + mMtx_c tmpMtx3; + f32 transScale = 100.0f; + tmpMtx3.transS(0.0f, 0.0f, field_0xAF4 * transScale); + tmpMtx1 += tmpMtx3; + tmpMtx1.XrotM(0x4000); + link->setTransform(tmpMtx1, 1, 0, 0); + } else { + mStateMgr.changeState(StateID_Open); + } +} +void dAcOTowerHandD101_c::finalizeState_Hold() { + unsetHoldFlag(); +} diff --git a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp index 2ac29f47c..a72d947c1 100644 --- a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp +++ b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp @@ -293,10 +293,10 @@ void dAcOTumbleWeed_c::calcMatrix() { mMtx_c mtx0, mtx1, mtx2; mShadowMtx.copyFrom(mWorldMtx); - mtx1.trans(getPosition() - position); + mtx1.transS(getPosition() - position); mShadowMtx += mtx1; mtx0.fromQuat(mField_0x910); - mtx2.trans(0.f, 40.f, 0.f); + mtx2.transS(0.f, 40.f, 0.f); mWorldMtx += mtx2; mWorldMtx += mtx0; }