From 392145bf3d3f6f2b60fc1856735e5081b7e86cc8 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 28 Sep 2024 02:32:48 +0200 Subject: [PATCH] d_a_obj_appear_bridge mostly matching (#36) * d_a_obj_appear_bridge - weak function order issue * Mark as nonmatching for now * Name unk IScnObjCallback funcs --------- Co-authored-by: elijah-thomas774 --- .../rels/d_a_obj_appear_bridgeNP/splits.txt | 3 + .../rels/d_a_obj_appear_bridgeNP/symbols.txt | 129 +++++++++--------- config/SOUE01/symbols.txt | 10 +- configure.py | 1 + include/d/a/d_a_base.h | 6 +- include/d/a/obj/d_a_obj_appear_bridge.h | 50 +++++++ include/nw4r/g3d/g3d_scnobj.h | 2 + include/toBeSorted/actor_collision.h | 1 + include/toBeSorted/area_utils.h | 10 ++ include/toBeSorted/event.h | 1 + include/toBeSorted/stage_render_stuff.h | 19 +++ src/REL/d/a/obj/d_a_obj_appear_bridge.cpp | 126 +++++++++++++++++ 12 files changed, 286 insertions(+), 72 deletions(-) create mode 100644 include/d/a/obj/d_a_obj_appear_bridge.h create mode 100644 include/toBeSorted/area_utils.h create mode 100644 include/toBeSorted/stage_render_stuff.h diff --git a/config/SOUE01/rels/d_a_obj_appear_bridgeNP/splits.txt b/config/SOUE01/rels/d_a_obj_appear_bridgeNP/splits.txt index 85664ac4..1e73be7d 100644 --- a/config/SOUE01/rels/d_a_obj_appear_bridgeNP/splits.txt +++ b/config/SOUE01/rels/d_a_obj_appear_bridgeNP/splits.txt @@ -17,3 +17,6 @@ REL/global_destructor_chain.c: REL/d/a/obj/d_a_obj_appear_bridge.cpp: .text start:0x000000F0 end:0x000012D8 .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x00000034 + .data start:0x00000000 end:0x000002B0 + .bss start:0x00000008 end:0x000000D0 diff --git a/config/SOUE01/rels/d_a_obj_appear_bridgeNP/symbols.txt b/config/SOUE01/rels/d_a_obj_appear_bridgeNP/symbols.txt index bbad431c..6737701c 100644 --- a/config/SOUE01/rels/d_a_obj_appear_bridgeNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_appear_bridgeNP/symbols.txt @@ -3,71 +3,72 @@ _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global -fn_407_F0 = .text:0x000000F0; // type:function size:0x140 -fn_407_230 = .text:0x00000230; // type:function size:0x58 -fn_407_290 = .text:0x00000290; // type:function size:0x6C -fn_407_300 = .text:0x00000300; // type:function size:0xA0 -fn_407_3A0 = .text:0x000003A0; // type:function size:0xA4 -fn_407_450 = .text:0x00000450; // type:function size:0x40 -fn_407_490 = .text:0x00000490; // type:function size:0x174 -fn_407_610 = .text:0x00000610; // type:function size:0x194 -fn_407_7B0 = .text:0x000007B0; // type:function size:0x10 -fn_407_7C0 = .text:0x000007C0; // type:function size:0x8 -fn_407_7D0 = .text:0x000007D0; // type:function size:0x30 -fn_407_800 = .text:0x00000800; // type:function size:0x10 -fn_407_810 = .text:0x00000810; // type:function size:0x28 -fn_407_840 = .text:0x00000840; // type:function size:0x34 -fn_407_880 = .text:0x00000880; // type:function size:0x6C -fn_407_8F0 = .text:0x000008F0; // type:function size:0x7C -fn_407_970 = .text:0x00000970; // type:function size:0x70 -fn_407_9E0 = .text:0x000009E0; // type:function size:0xCC -fn_407_AB0 = .text:0x00000AB0; // type:function size:0x4 -fn_407_AC0 = .text:0x00000AC0; // type:function size:0x54 -fn_407_B20 = .text:0x00000B20; // type:function size:0xF4 -fn_407_C20 = .text:0x00000C20; // type:function size:0x4 -fn_407_C30 = .text:0x00000C30; // type:function size:0xFC -fn_407_D30 = .text:0x00000D30; // type:function size:0x10 -fn_407_D40 = .text:0x00000D40; // type:function size:0x4 -fn_407_D50 = .text:0x00000D50; // type:function size:0x4 -fn_407_D60 = .text:0x00000D60; // type:function size:0x4 -fn_407_D70 = .text:0x00000D70; // type:function size:0x4 -fn_407_D80 = .text:0x00000D80; // type:function size:0x4 -fn_407_D90 = .text:0x00000D90; // type:function size:0x60 -fn_407_DF0 = .text:0x00000DF0; // type:function size:0xC -fn_407_E00 = .text:0x00000E00; // type:function size:0x1C -fn_407_E20 = .text:0x00000E20; // type:function size:0x1C -fn_407_E40 = .text:0x00000E40; // type:function size:0x1C -fn_407_E60 = .text:0x00000E60; // type:function size:0x10 -fn_407_E70 = .text:0x00000E70; // type:function size:0x10 -fn_407_E80 = .text:0x00000E80; // type:function size:0x10 -fn_407_E90 = .text:0x00000E90; // type:function size:0x10 -fn_407_EA0 = .text:0x00000EA0; // type:function size:0x10 -fn_407_EB0 = .text:0x00000EB0; // type:function size:0x10 -fn_407_EC0 = .text:0x00000EC0; // type:function size:0x30 -fn_407_EF0 = .text:0x00000EF0; // type:function size:0x30 -fn_407_F20 = .text:0x00000F20; // type:function size:0x30 -fn_407_F50 = .text:0x00000F50; // type:function size:0x2A0 -fn_407_11F0 = .text:0x000011F0; // type:function size:0x58 -fn_407_1250 = .text:0x00001250; // type:function size:0x88 +dAcOappearBridge_c_classInit__Fv = .text:0x000000F0; // type:function size:0x140 +__dt__31sFState_c<18dAcOappearBridge_c>Fv = .text:0x00000230; // type:function size:0x58 +__dt__34sFStateFct_c<18dAcOappearBridge_c>Fv = .text:0x00000290; // type:function size:0x6C +__dt__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000300; // type:function size:0xA0 +__dt__57sFStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003A0; // type:function size:0xA4 +__dt__Q34nw4r3g3d15IScnObjCallbackFv = .text:0x00000450; // type:function size:0x40 +createHeap__18dAcOappearBridge_cFv = .text:0x00000490; // type:function size:0x174 +create__18dAcOappearBridge_cFv = .text:0x00000610; // type:function size:0x194 +changeState__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000007B0; // type:function size:0x10 +doDelete__18dAcOappearBridge_cFv = .text:0x000007C0; // type:function size:0x8 +actorExecute__18dAcOappearBridge_cFv = .text:0x000007D0; // type:function size:0x30 +executeState__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000800; // type:function size:0x10 +draw__18dAcOappearBridge_cFv = .text:0x00000810; // type:function size:0x28 +initializeState_Wait__18dAcOappearBridge_cFv = .text:0x00000840; // type:function size:0x34 +executeState_Wait__18dAcOappearBridge_cFv = .text:0x00000880; // type:function size:0x6C +finalizeState_Wait__18dAcOappearBridge_cFv = .text:0x000008F0; // type:function size:0x7C +initializeState_Appear__18dAcOappearBridge_cFv = .text:0x00000970; // type:function size:0x70 +executeState_Appear__18dAcOappearBridge_cFv = .text:0x000009E0; // type:function size:0xCC +finalizeState_Appear__18dAcOappearBridge_cFv = .text:0x00000AB0; // type:function size:0x4 +initializeState_Disappear__18dAcOappearBridge_cFv = .text:0x00000AC0; // type:function size:0x54 +executeState_Disappear__18dAcOappearBridge_cFv = .text:0x00000B20; // type:function size:0xF4 +finalizeState_Disappear__18dAcOappearBridge_cFv = .text:0x00000C20; // type:function size:0x4 +__dt__18dAcOappearBridge_cFv = .text:0x00000C30; // type:function size:0xFC +getStateID__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000D30; // type:function size:0x10 +ExecCallback_DRAW_XLU__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D40; // type:function size:0x4 +ExecCallback_DRAW_OPA__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D50; // type:function size:0x4 +ExecCallback_CALC_MAT__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D60; // type:function size:0x4 +ExecCallback_CALC_WORLD__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D70; // type:function size:0x4 +ExecCallback_CALC_VIEW__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D80; // type:function size:0x4 +build__34sFStateFct_c<18dAcOappearBridge_c>FRC12sStateIDIf_c = .text:0x00000D90; // type:function size:0x60 +dispose__34sFStateFct_c<18dAcOappearBridge_c>FRP10sStateIf_c = .text:0x00000DF0; // type:function size:0xC +initialize__31sFState_c<18dAcOappearBridge_c>Fv = .text:0x00000E00; // type:function size:0x1C +execute__31sFState_c<18dAcOappearBridge_c>Fv = .text:0x00000E20; // type:function size:0x1C +finalize__31sFState_c<18dAcOappearBridge_c>Fv = .text:0x00000E40; // type:function size:0x1C +initializeState__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000E60; // type:function size:0x10 +finalizeState__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000E70; // type:function size:0x10 +refreshState__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000E80; // type:function size:0x10 +getState__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000E90; // type:function size:0x10 +getNewStateID__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000EA0; // type:function size:0x10 +getOldStateID__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000EB0; // type:function size:0x10 +finalizeState__33sFStateID_c<18dAcOappearBridge_c>CFR18dAcOappearBridge_c = .text:0x00000EC0; // type:function size:0x30 +executeState__33sFStateID_c<18dAcOappearBridge_c>CFR18dAcOappearBridge_c = .text:0x00000EF0; // type:function size:0x30 +initializeState__33sFStateID_c<18dAcOappearBridge_c>CFR18dAcOappearBridge_c = .text:0x00000F20; // type:function size:0x30 +__sinit_\d_a_obj_appear_bridge_cpp = .text:0x00000F50; // type:function size:0x2A0 scope:local +__dt__33sFStateID_c<18dAcOappearBridge_c>Fv = .text:0x000011F0; // type:function size:0x58 +isSameName__33sFStateID_c<18dAcOappearBridge_c>CFPCc = .text:0x00001250; // type:function size:0x88 _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_407_rodata_0 = .rodata:0x00000000; // type:object size:0x20 data:float -lbl_407_rodata_20 = .rodata:0x00000020; // type:object size:0x4 data:float -lbl_407_rodata_24 = .rodata:0x00000024; // type:object size:0x4 data:float -lbl_407_rodata_28 = .rodata:0x00000028; // type:object size:0xC data:float -lbl_407_data_0 = .data:0x00000000; // type:object size:0x48 data:4byte -lbl_407_data_48 = .data:0x00000048; // type:object size:0x20 data:string -lbl_407_data_68 = .data:0x00000068; // type:object size:0x4 data:4byte -lbl_407_data_6C = .data:0x0000006C; // type:object size:0x4 data:4byte -lbl_407_data_70 = .data:0x00000070; // type:object size:0x80 -lbl_407_data_F0 = .data:0x000000F0; // type:object size:0x30 -lbl_407_data_120 = .data:0x00000120; // type:object size:0x30 -lbl_407_data_150 = .data:0x00000150; // type:object size:0x18 -lbl_407_data_168 = .data:0x00000168; // type:object size:0x114 -lbl_407_data_27C = .data:0x0000027C; // type:object size:0x34 +lbl_407_rodata_0 = .rodata:0x00000000; // type:object size:0x20 scope:local data:float +lbl_407_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local data:float +lbl_407_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local data:float +lbl_407_rodata_28 = .rodata:0x00000028; // type:object size:0xC scope:local data:float +g_profile_OBJ_APPEAR_BRIDGE = .data:0x00000000; // type:object size:0x10 data:4byte +lbl_407_data_48 = .data:0x00000048; // type:object size:0x20 scope:local data:string +FLAGS_1 = .data:0x00000068; // type:object size:0x4 data:4byte +FLAGS_2 = .data:0x0000006C; // type:object size:0x4 data:4byte +__vt__18dAcOappearBridge_c = .data:0x00000070; // type:object size:0x80 +__vt__57sFStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c> = .data:0x000000F0; // type:object size:0x30 +__vt__87sStateMgr_c<18dAcOappearBridge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000120; // type:object size:0x30 +__vt__34sFStateFct_c<18dAcOappearBridge_c> = .data:0x00000150; // type:object size:0x14 +__vt__31sFState_c<18dAcOappearBridge_c> = .data:0x00000168; // type:object size:0x18 +__vt__Q34nw4r3g3d15IScnObjCallback = .data:0x00000180; // type:object size:0x20 +__vt__33sFStateID_c<18dAcOappearBridge_c> = .data:0x0000027C; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_407_bss_8 = .bss:0x00000008; // type:object size:0x18 data:4byte -lbl_407_bss_20 = .bss:0x00000020; // type:object size:0x40 data:4byte -lbl_407_bss_60 = .bss:0x00000060; // type:object size:0x40 data:4byte -lbl_407_bss_A0 = .bss:0x000000A0; // type:object size:0x30 data:4byte +lbl_407_bss_8 = .bss:0x00000008; // type:object size:0x18 scope:local data:4byte +StateID_Wait__18dAcOappearBridge_c = .bss:0x00000020; // type:object size:0x30 data:4byte +StateID_Appear__18dAcOappearBridge_c = .bss:0x00000060; // type:object size:0x30 data:4byte +StateID_Disappear__18dAcOappearBridge_c = .bss:0x000000A0; // type:object size:0x30 data:4byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 25d8cde6..d4ceea6f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -630,7 +630,7 @@ fn_80019D70 = .text:0x80019D70; // type:function size:0x58 fn_80019DD0 = .text:0x80019DD0; // type:function size:0x5C fn_80019E30 = .text:0x80019E30; // type:function size:0x44 fn_80019E80 = .text:0x80019E80; // type:function size:0x3A8 -fn_8001A230 = .text:0x8001A230; // type:function size:0x50 +attach__14dScnCallback_cFRQ23m3d9scnLeaf_c = .text:0x8001A230; // type:function size:0x50 fn_8001A280 = .text:0x8001A280; // type:function size:0x144 fn_8001A3D0 = .text:0x8001A3D0; // type:function size:0x140 fn_8001A510 = .text:0x8001A510; // type:function size:0x4 @@ -3599,7 +3599,7 @@ fn_800A0B90 = .text:0x800A0B90; // type:function size:0x10 fn_800A0BA0 = .text:0x800A0BA0; // type:function size:0x94 __ct__5EventFPcUlUlPvPv = .text:0x800A0C40; // type:function size:0xEC fn_800A0D30 = .text:0x800A0D30; // type:function size:0xEC -fn_800A0E20 = .text:0x800A0E20; // type:function size:0x208 +__ct__5EventFUllUlPvPv = .text:0x800A0E20; // type:function size:0x208 fn_800A1030 = .text:0x800A1030; // type:function size:0x208 __dt__5EventFv = .text:0x800A1240; // type:function size:0x40 fn_800A1280 = .text:0x800A1280; // type:function size:0x2E4 @@ -3723,7 +3723,7 @@ fn_800A99D0 = .text:0x800A99D0; // type:function size:0xE0 fn_800A9AB0 = .text:0x800A9AB0; // type:function size:0x50 fn_800A9B00 = .text:0x800A9B00; // type:function size:0xC4 fn_800A9BD0 = .text:0x800A9BD0; // type:function size:0x78 -fn_800A9C50 = .text:0x800A9C50; // type:function size:0xD4 +checkPosInArea__FllRC7mVec3_cPPv = .text:0x800A9C50; // type:function size:0xD4 fn_800A9D30 = .text:0x800A9D30; // type:function size:0x60 fn_800A9D90 = .text:0x800A9D90; // type:function size:0x90 fn_800A9E20 = .text:0x800A9E20; // type:function size:0x12C @@ -19097,7 +19097,7 @@ fn_80339CF0 = .text:0x80339CF0; // type:function size:0x68 fn_80339D60 = .text:0x80339D60; // type:function size:0x78 fn_80339DE0 = .text:0x80339DE0; // type:function size:0x58 fn_80339E40 = .text:0x80339E40; // type:function size:0x100 -fn_80339F40 = .text:0x80339F40; // type:function size:0xEC +destroyActorBgCollision__21CollisionCheckContextFR14ActorCollision = .text:0x80339F40; // type:function size:0xEC fn_8033A030 = .text:0x8033A030; // type:function size:0x88 fn_8033A0C0 = .text:0x8033A0C0; // type:function size:0x74 fn_8033A140 = .text:0x8033A140; // type:function size:0xA0 @@ -29880,7 +29880,7 @@ lbl_80500A20 = .data:0x80500A20; // type:object size:0x50 lbl_80500A70 = .data:0x80500A70; // type:object size:0x2C lbl_80500A9C = .data:0x80500A9C; // type:object size:0xC lbl_80500AA8 = .data:0x80500AA8; // type:object size:0x10 data:string -lbl_80500AB8 = .data:0x80500AB8; // type:object size:0x20 +__vt__14dScnCallback_c = .data:0x80500AB8; // type:object size:0x20 lbl_80500AD8 = .data:0x80500AD8; // type:object size:0x44 lbl_80500B1C = .data:0x80500B1C; // type:object size:0x2C lbl_80500B48 = .data:0x80500B48; // type:object size:0xC diff --git a/configure.py b/configure.py index 7d1aa387..bf7ca884 100644 --- a/configure.py +++ b/configure.py @@ -954,6 +954,7 @@ config.libs = [ Rel(NonMatching, "d_a_nusi_npc", "REL/d/a/d_a_nusi_npc.cpp"), Rel(NonMatching, "d_a_obj_amber", "REL/d/a/obj/d_a_obj_amber.cpp"), Rel(NonMatching, "d_a_obj_ancient_jewels", "REL/d/a/obj/d_a_obj_ancient_jewels.cpp"), + # matching except for IScnObjCallback weak function order issue Rel(NonMatching, "d_a_obj_appear_bridge", "REL/d/a/obj/d_a_obj_appear_bridge.cpp"), Rel(NonMatching, "d_a_obj_arrow_switch", "REL/d/a/obj/d_a_obj_arrow_switch.cpp"), Rel(NonMatching, "d_a_obj_asura_pillar", "REL/d/a/obj/d_a_obj_asura_pillar.cpp"), diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 3ba983e5..179e8f7f 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -70,9 +70,9 @@ public: /* 0x84 */ ObjInfo *obj_info; /* 0x88 */ TList sound_list; /* 0x94 */ SoundSource *sound_source; - /* 0x9C */ mVec3_c *obj_pos; - /* 0x9c */ mVec3_c pos_copy; - /* 0xa8 */ u32 params2; + /* 0x98 */ mVec3_c *obj_pos; + /* 0x9C */ mVec3_c pos_copy; + /* 0xA8 */ u32 params2; /* 0xAC */ mAng3_c rot_copy; /* 0xB2 */ u16 obj_id; // enemydefeat flag / id on obj-map /* 0xB4 */ s8 room_id_copy; diff --git a/include/d/a/obj/d_a_obj_appear_bridge.h b/include/d/a/obj/d_a_obj_appear_bridge.h new file mode 100644 index 00000000..388929d6 --- /dev/null +++ b/include/d/a/obj/d_a_obj_appear_bridge.h @@ -0,0 +1,50 @@ +#ifndef D_A_OBJ_APPEAR_BRIDGE_H +#define D_A_OBJ_APPEAR_BRIDGE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class dAcOappearBridge_c : public dAcObjBase_c { +public: + dAcOappearBridge_c() : mStateMgr(*this, sStateID::null), mActorEvent(*this, nullptr), mSceneCallback(this) {} + virtual ~dAcOappearBridge_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + STATE_FUNC_DECLARE(dAcOappearBridge_c, Wait); + STATE_FUNC_DECLARE(dAcOappearBridge_c, Appear); + STATE_FUNC_DECLARE(dAcOappearBridge_c, Disappear); + +private: + static const f32 sMovementRate; + + nw4r::g3d::ResFile mResFile; + m3d::smdl_c mModel; + m3d::anmTexSrt_c mSrtAnm; + m3d::anmMatClr_c mClrAnm; + ActorCollision mCollision; + STATE_MGR_DECLARE(dAcOappearBridge_c); + ActorEventRelated mActorEvent; + + // TODO the weak IScnObjCallback functions are in the wrong order. + // The vtable order is dtor, World, Mat, View, Opa, Xlu + // and the emitted order is dtor, Xlu, Opa, View, Mat, World + // but the order in the binary is dtor, Xlu, Opa, Mat, World, View + dScnCallback_c mSceneCallback; + /* 0x650 */ mVec3_c mSoundPosition; + /* 0x65C */ f32 field_0x65C; + /* 0x660 */ u8 mAreaIdx; + /* 0x661 */ u8 mEventId; +}; + +#endif diff --git a/include/nw4r/g3d/g3d_scnobj.h b/include/nw4r/g3d/g3d_scnobj.h index b40ffbb5..61cd03d8 100644 --- a/include/nw4r/g3d/g3d_scnobj.h +++ b/include/nw4r/g3d/g3d_scnobj.h @@ -144,6 +144,8 @@ struct IScnObjCallback { virtual void ExecCallback_CALC_WORLD(ScnObj::Timing, ScnObj *, u32, void *) {} // at 0xC virtual void ExecCallback_CALC_MAT(ScnObj::Timing, ScnObj *, u32, void *) {} // at 0x10 virtual void ExecCallback_CALC_VIEW(ScnObj::Timing, ScnObj *, u32, void *) {} // at 0x14 + virtual void ExecCallback_DRAW_OPA(ScnObj::Timing, ScnObj *, u32, void *) {} // at 0x18 + virtual void ExecCallback_DRAW_XLU(ScnObj::Timing, ScnObj *, u32, void *) {} // at 0x1C }; // Is there a better way of resolving this dependency? diff --git a/include/toBeSorted/actor_collision.h b/include/toBeSorted/actor_collision.h index 7c5d1fcb..d849db4c 100644 --- a/include/toBeSorted/actor_collision.h +++ b/include/toBeSorted/actor_collision.h @@ -32,6 +32,7 @@ public: static CollisionCheckContext* get(); void registerActorBgCollision(ActorCollision&, dAcObjBase_c*); + void destroyActorBgCollision(ActorCollision&); }; #endif diff --git a/include/toBeSorted/area_utils.h b/include/toBeSorted/area_utils.h new file mode 100644 index 00000000..04b73c0c --- /dev/null +++ b/include/toBeSorted/area_utils.h @@ -0,0 +1,10 @@ +#ifndef AREA_UTILS_H +#define AREA_UTILS_H + +#include + +/* 800a9b00 */ bool checkPosInArea(void **AREA, const mVec3_c& pos); +/* 800a9bd0 */ void *getAreaForIndexInRoom(s32 areaIndex, s32 roomId); +/* 800a9c50 */ bool *checkPosInArea(s32 areaIndex, s32 roomId, const mVec3_c& pos, void **AREA); + +#endif diff --git a/include/toBeSorted/event.h b/include/toBeSorted/event.h index e87958a2..932b650f 100644 --- a/include/toBeSorted/event.h +++ b/include/toBeSorted/event.h @@ -17,6 +17,7 @@ public: public: /** 0x800A0C40 */ Event(char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2); + Event(u32 eventId, s32 roomId, u32 eventFlags, void *callback1, void *callback2); /** 0x800A1240 */ virtual ~Event(); }; diff --git a/include/toBeSorted/stage_render_stuff.h b/include/toBeSorted/stage_render_stuff.h new file mode 100644 index 00000000..926acb5a --- /dev/null +++ b/include/toBeSorted/stage_render_stuff.h @@ -0,0 +1,19 @@ +#ifndef D_STAGE_RENDER_STUFF_H +#define D_STAGE_RENDER_STUFF_H + +#include +#include +#include + +class dScnCallback_c : public nw4r::g3d::IScnObjCallback { +public: + dScnCallback_c(dAcObjBase_c *arg): mpActor(arg) {} + /* vt 0x10 */ virtual void ExecCallback_CALC_MAT(nw4r::g3d::ScnObj::Timing, nw4r::g3d::ScnObj *, u32, void *) override; + + /* 0x04 */ dAcObjBase_c *mpActor; + /* 0x08 */ UNKWORD field_0x08; + + /* 8001a230 */ void attach(m3d::scnLeaf_c&); +}; + +#endif diff --git a/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp b/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp index e69de29b..3f5215c1 100644 --- a/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp +++ b/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp @@ -0,0 +1,126 @@ +#include +#include +#include + +SPECIAL_ACTOR_PROFILE(OBJ_APPEAR_BRIDGE, dAcOappearBridge_c, fProfile::OBJ_APPEAR_BRIDGE, 0x01FC, 0, 6); + +static mVec3_c positionOffset(-1600.0f, 550.0f, 0.0f); + +const f32 dAcOappearBridge_c::sMovementRate = 4.0f; + +STATE_DEFINE(dAcOappearBridge_c, Wait); +STATE_DEFINE(dAcOappearBridge_c, Appear); +STATE_DEFINE(dAcOappearBridge_c, Disappear); + +bool dAcOappearBridge_c::createHeap() { + mResFile = getOarcResFile("TongueStage"); + RoomManager::bindStageResToFile(&mResFile); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("TongueStage"); + TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x128)); + nw4r::g3d::ResAnmTexSrt srt = mResFile.GetResAnmTexSrt("TongueStage"); + TRY_CREATE(mSrtAnm.create(mdl, srt, &heap_allocator, nullptr, 1)); + nw4r::g3d::ResAnmClr clr = mResFile.GetResAnmClr("TongueStage"); + TRY_CREATE(mClrAnm.create(mdl, clr, &heap_allocator, nullptr, 1)); + void *dzb = getOarcFile("TongueStage", "dzb/TongueStage.dzb"); + void *plc = getOarcFile("TongueStage", "dat/TongueStage.plc"); + updateMatrix(); + mModel.setLocalMtx(worldMatrix); + TRY_CREATE(mCollision.create(dzb, plc, true, worldMatrix, scale) == nullptr); + mCollision.init(); + return true; +} + +int dAcOappearBridge_c::create() { + CREATE_ALLOCATOR(dAcOappearBridge_c); + CollisionCheckContext::get()->registerActorBgCollision(mCollision, this); + mAreaIdx = params & 0xFF; + mEventId = (params >> 8) & 0xFF; + mSoundPosition = position + positionOffset; + obj_pos = &mSoundPosition; + mSceneCallback.attach(mModel); + mModel.setAnm(mSrtAnm); + mModel.setAnm(mClrAnm); + field_0x65C = mSrtAnm.getFrameMax(0) - 1.0f; + + mStateMgr.changeState(StateID_Wait); + mModel.setPriorityDraw(0x1C, 0x9); + + setBoundingBox(mVec3_c(-3000.0f, -200.0f, -600.0f), mVec3_c(50.0f, 800.0f, 600.0f)); + + return SUCCEEDED; +} + +int dAcOappearBridge_c::doDelete() { + return SUCCEEDED; +} + +int dAcOappearBridge_c::actorExecute() { + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dAcOappearBridge_c::draw() { + drawModelType1(&mModel); + return SUCCEEDED; +} + +void dAcOappearBridge_c::initializeState_Wait() { + CollisionCheckContext::get()->destroyActorBgCollision(mCollision); +} +void dAcOappearBridge_c::executeState_Wait() { + if (checkPosInArea(mAreaIdx, roomid, dAcPy_c::LINK->position, nullptr)) { + mStateMgr.changeState(StateID_Appear); + } +} + +// this works but I don't like it +volatile u32 FLAGS_1 = 0x00000001; +u32 FLAGS_2 = 0x00100001; + +void dAcOappearBridge_c::finalizeState_Wait() { + if (mEventId != 0xFF) { + u32 f1 = FLAGS_1; + u32 f2 = FLAGS_2; + Event ev = Event(mEventId, roomid, f2 & ~f1, nullptr, nullptr); + mActorEvent.scheduleEvent(ev, 0); + } +} + +void dAcOappearBridge_c::initializeState_Appear() { + mSrtAnm.setRate(sMovementRate, 0); + mClrAnm.setRate(sMovementRate, 0); + CollisionCheckContext::get()->registerActorBgCollision(mCollision, this); + playSound(0xAA4); +} +void dAcOappearBridge_c::executeState_Appear() { + mClrAnm.isStop(0); // ? + if (field_0x65C == mSrtAnm.getFrame(0)) { + mSrtAnm.setRate(0.0f, 0); + } + mSrtAnm.play(); + mClrAnm.play(); + if (!checkPosInArea(mAreaIdx, roomid, dAcPy_c::LINK->position, nullptr)) { + mStateMgr.changeState(StateID_Disappear); + } +} +void dAcOappearBridge_c::finalizeState_Appear() {} + +void dAcOappearBridge_c::initializeState_Disappear() { + mSrtAnm.setRate(-sMovementRate, 0); + mClrAnm.setRate(-sMovementRate, 0); +} +void dAcOappearBridge_c::executeState_Disappear() { + if (mSrtAnm.getFrame(0) == 0.0f) { + mSrtAnm.setRate(0.0f, 0); + } + mSrtAnm.play(); + mClrAnm.play(); + if (checkPosInArea(mAreaIdx, roomid, dAcPy_c::LINK->position, nullptr)) { + mStateMgr.changeState(StateID_Appear); + } else { + if (mClrAnm.isStop(0)) { + mStateMgr.changeState(StateID_Wait); + } + } +} +void dAcOappearBridge_c::finalizeState_Disappear() {}