From 37cfe931152b5e328147c99afe30a98e0055d1fb Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 15 Nov 2024 09:34:44 +0100 Subject: [PATCH 01/17] Tbox wip --- config/SOUE01/splits.txt | 2 + config/SOUE01/symbols.txt | 154 ++++++++++++++++----------------- include/d/a/obj/d_a_obj_tbox.h | 82 ++++++++++++++++++ src/d/a/obj/d_a_obj_tbox.cpp | 81 +++++++++++++++++ 4 files changed, 242 insertions(+), 77 deletions(-) create mode 100644 include/d/a/obj/d_a_obj_tbox.h create mode 100644 src/d/a/obj/d_a_obj_tbox.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 1f4b5e83..f826aa09 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -640,7 +640,9 @@ d/a/obj/d_a_obj_fairy.cpp: d/a/obj/d_a_obj_tbox.cpp: .text start:0x802685A0 end:0x8026F488 .ctors start:0x804DB83C end:0x804DB840 + .rodata start:0x804ED3B0 end:0x804EE548 .data start:0x80535270 end:0x80535A18 + .bss start:0x805B4FA8 end:0x805B5458 d/a/obj/d_a_obj_time_area.cpp: .text start:0x8026F490 end:0x80271888 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 428b2d63..8e658e75 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -14236,7 +14236,7 @@ initializeState__28sFStateID_c<13dAcObjFairy_c>CFR13dAcObjFairy_c = .text:0x8026 __sinit_\d_a_obj_fairy_cpp = .text:0x80267F40; // type:function size:0x56C scope:local __dt__28sFStateID_c<13dAcObjFairy_c>Fv = .text:0x802684B0; // type:function size:0x58 isSameName__28sFStateID_c<13dAcObjFairy_c>CFPCc = .text:0x80268510; // type:function size:0x88 -AcTbox__ctor = .text:0x802685A0; // type:function size:0x30 +dAcTbox_c_classInit__Fv = .text:0x802685A0; // type:function size:0x30 fn_802685D0 = .text:0x802685D0; // type:function size:0x68 fn_80268640 = .text:0x80268640; // type:function size:0x4 fn_80268650 = .text:0x80268650; // type:function size:0x8 @@ -14244,21 +14244,21 @@ fn_80268660 = .text:0x80268660; // type:function size:0x20 hasCollectedAllTears2 = .text:0x80268680; // type:function size:0x1C fn_802686A0 = .text:0x802686A0; // type:function size:0x50 fn_802686F0 = .text:0x802686F0; // type:function size:0x5C -AcTbox__ctorCont = .text:0x80268750; // type:function size:0x2EC -fn_80268A40 = .text:0x80268A40; // type:function size:0x98 -fn_80268AE0 = .text:0x80268AE0; // type:function size:0x58 -fn_80268B40 = .text:0x80268B40; // type:function size:0x6C -fn_80268BB0 = .text:0x80268BB0; // type:function size:0xA0 -fn_80268C50 = .text:0x80268C50; // type:function size:0xA4 -AcTbox__dtor = .text:0x80268D00; // type:function size:0x250 +__ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC +__dt__10dAcTboxCcDFv = .text:0x80268A40; // type:function size:0x98 +__dt__21sFState_c<9dAcTbox_c>Fv = .text:0x80268AE0; // type:function size:0x58 +__dt__24sFStateFct_c<9dAcTbox_c>Fv = .text:0x80268B40; // type:function size:0x6C +__dt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80268BB0; // type:function size:0xA0 +__dt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c>Fv = .text:0x80268C50; // type:function size:0xA4 +__dt__9dAcTbox_cFv = .text:0x80268D00; // type:function size:0x250 AcTbox__initModels = .text:0x80268F50; // type:function size:0x54C AcTbox__init = .text:0x802694A0; // type:function size:0xA00 AcTbox__destroy = .text:0x80269EA0; // type:function size:0xB4 AcTbox__update = .text:0x80269F60; // type:function size:0x690 -fn_8026A5F0 = .text:0x8026A5F0; // type:function size:0x10 -fn_8026A600 = .text:0x8026A600; // type:function size:0x10 +getStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026A5F0; // type:function size:0x10 +executeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026A600; // type:function size:0x10 AcTbox__updateInEvent = .text:0x8026A610; // type:function size:0x8F0 -fn_8026AF00 = .text:0x8026AF00; // type:function size:0x10 +changeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8026AF00; // type:function size:0x10 AcTbox__draw = .text:0x8026AF10; // type:function size:0x1AC AcTbox__setActionState = .text:0x8026B0C0; // type:function size:0x224 AcTbox__isValidSubtype = .text:0x8026B2F0; // type:function size:0x20 @@ -14271,45 +14271,45 @@ getRotX_shift9_0x1 = .text:0x8026B360; // type:function size:0xC fn_8026B370 = .text:0x8026B370; // type:function size:0xC fn_8026B380 = .text:0x8026B380; // type:function size:0x3C fn_8026B3C0 = .text:0x8026B3C0; // type:function size:0x20 -AcTbox__stateDugOutEnter = .text:0x8026B3E0; // type:function size:0x11C -AcTbox__stateDugOutUpdate = .text:0x8026B500; // type:function size:0x3D8 -AcTbox__stateDugOutLeave = .text:0x8026B8E0; // type:function size:0x4 -AcTbox__stateWaitAppearEnter = .text:0x8026B8F0; // type:function size:0x7C -AcTbox__stateWaitAppearUpdate = .text:0x8026B970; // type:function size:0xB8 -AcTbox__stateWaitAppearLeave = .text:0x8026BA30; // type:function size:0x4 -AcTbox__stateDemoAppearEnter = .text:0x8026BA40; // type:function size:0xD0 -AcTbox__stateDemoAppearUpdate = .text:0x8026BB10; // type:function size:0x1F4 -AcTbox__stateDemoAppearLeave = .text:0x8026BD10; // type:function size:0x4 -AcTbox__stateWaitOpenEnter = .text:0x8026BD20; // type:function size:0x18C -AcTbox__stateWaitOpenUpdate = .text:0x8026BEB0; // type:function size:0x7C -AcTbox__stateWaitOpenLeave = .text:0x8026BF30; // type:function size:0x28 -AcTbox__stateGoddessWaitOffEnter = .text:0x8026BF60; // type:function size:0x84 -AcTbox__stateGoddessWaitOffUpdate = .text:0x8026BFF0; // type:function size:0x4 -AcTbox__stateGoddessWaitOffLeave = .text:0x8026C000; // type:function size:0x4 -AcTbox__stateGoddessWaitOnEnter = .text:0x8026C010; // type:function size:0x84 -AcTbox__stateGoddessWaitOnUpdate = .text:0x8026C0A0; // type:function size:0x60 -AcTbox__stateGoddessWaitOnLeave = .text:0x8026C100; // type:function size:0x3C -AcTbox__stateDeleteArchiveEnter = .text:0x8026C140; // type:function size:0x108 -AcTbox__stateDeleteArchiveUpdate = .text:0x8026C250; // type:function size:0xC8 -AcTbox__stateDeleteArchiveLeave = .text:0x8026C320; // type:function size:0x4 -AcTbox__stateLoadArchiveEnter = .text:0x8026C330; // type:function size:0x12C -AcTbox__stateLoadArchiveUpdate = .text:0x8026C460; // type:function size:0x58 -AcTbox__stateLoadArchiveLeave = .text:0x8026C4C0; // type:function size:0x4 -AcTbox__stateOpenEnter = .text:0x8026C4D0; // type:function size:0x258 -AcTbox__stateOpenUpdate = .text:0x8026C730; // type:function size:0x11C -AcTbox__stateOpenLeave = .text:0x8026C850; // type:function size:0x4 -AcTbox__statePresentItemEnter = .text:0x8026C860; // type:function size:0x98 -AcTbox__statePresentItemUpdate = .text:0x8026C900; // type:function size:0x19C -AcTbox__statePresentItemLeave = .text:0x8026CAA0; // type:function size:0x4 -AcTbox__stateCloseEnter = .text:0x8026CAB0; // type:function size:0xA8 -AcTbox__stateCloseUpdate = .text:0x8026CB60; // type:function size:0x26C -AcTbox__stateCloseLeave = .text:0x8026CDD0; // type:function size:0x4 -AcTbox__stateWaitEnter = .text:0x8026CDE0; // type:function size:0x17C -AcTbox__stateWaitUpdate = .text:0x8026CF60; // type:function size:0x9C -AcTbox__stateWaitLeave = .text:0x8026D000; // type:function size:0x4 -AcTbox__stateGoddessWaitEnter = .text:0x8026D010; // type:function size:0x70 -AcTbox__stateGoddessWaitUpdate = .text:0x8026D080; // type:function size:0x74 -AcTbox__stateGoddessWaitLeave = .text:0x8026D100; // type:function size:0x4 +initializeState_DugOut__9dAcTbox_cFv = .text:0x8026B3E0; // type:function size:0x11C +executeState_DugOut__9dAcTbox_cFv = .text:0x8026B500; // type:function size:0x3D8 +finalizeState_DugOut__9dAcTbox_cFv = .text:0x8026B8E0; // type:function size:0x4 +initializeState_WaitAppear__9dAcTbox_cFv = .text:0x8026B8F0; // type:function size:0x7C +executeState_WaitAppear__9dAcTbox_cFv = .text:0x8026B970; // type:function size:0xB8 +finalizeState_WaitAppear__9dAcTbox_cFv = .text:0x8026BA30; // type:function size:0x4 +initializeState_DemoAppear__9dAcTbox_cFv = .text:0x8026BA40; // type:function size:0xD0 +executeState_DemoAppear__9dAcTbox_cFv = .text:0x8026BB10; // type:function size:0x1F4 +finalizeState_DemoAppear__9dAcTbox_cFv = .text:0x8026BD10; // type:function size:0x4 +initializeState_WaitOpen__9dAcTbox_cFv = .text:0x8026BD20; // type:function size:0x18C +executeState_WaitOpen__9dAcTbox_cFv = .text:0x8026BEB0; // type:function size:0x7C +finalizeState_WaitOpen__9dAcTbox_cFv = .text:0x8026BF30; // type:function size:0x28 +initializeState_GoddessWaitOff__9dAcTbox_cFv = .text:0x8026BF60; // type:function size:0x84 +executeState_GoddessWaitOff__9dAcTbox_cFv = .text:0x8026BFF0; // type:function size:0x4 +finalizeState_GoddessWaitOff__9dAcTbox_cFv = .text:0x8026C000; // type:function size:0x4 +initializeState_GoddessWaitOn__9dAcTbox_cFv = .text:0x8026C010; // type:function size:0x84 +executeState_GoddessWaitOn__9dAcTbox_cFv = .text:0x8026C0A0; // type:function size:0x60 +finalizeState_GoddessWaitOn__9dAcTbox_cFv = .text:0x8026C100; // type:function size:0x3C +initializeState_DeleteArchive__9dAcTbox_cFv = .text:0x8026C140; // type:function size:0x108 +executeState_DeleteArchive__9dAcTbox_cFv = .text:0x8026C250; // type:function size:0xC8 +finalizeState_DeleteArchive__9dAcTbox_cFv = .text:0x8026C320; // type:function size:0x4 +initializeState_LoadArchive__9dAcTbox_cFv = .text:0x8026C330; // type:function size:0x12C +executeState_LoadArchive__9dAcTbox_cFv = .text:0x8026C460; // type:function size:0x58 +finalizeState_LoadArchive__9dAcTbox_cFv = .text:0x8026C4C0; // type:function size:0x4 +initializeState_Open__9dAcTbox_cFv = .text:0x8026C4D0; // type:function size:0x258 +executeState_Open__9dAcTbox_cFv = .text:0x8026C730; // type:function size:0x11C +finalizeState_Open__9dAcTbox_cFv = .text:0x8026C850; // type:function size:0x4 +initializeState_PresentItem__9dAcTbox_cFv = .text:0x8026C860; // type:function size:0x98 +executeState_PresentItem__9dAcTbox_cFv = .text:0x8026C900; // type:function size:0x19C +finalizeState_PresentItem__9dAcTbox_cFv = .text:0x8026CAA0; // type:function size:0x4 +initializeState_Close__9dAcTbox_cFv = .text:0x8026CAB0; // type:function size:0xA8 +executeState_Close__9dAcTbox_cFv = .text:0x8026CB60; // type:function size:0x26C +finalizeState_Close__9dAcTbox_cFv = .text:0x8026CDD0; // type:function size:0x4 +initializeState_Wait__9dAcTbox_cFv = .text:0x8026CDE0; // type:function size:0x17C +executeState_Wait__9dAcTbox_cFv = .text:0x8026CF60; // type:function size:0x9C +finalizeState_Wait__9dAcTbox_cFv = .text:0x8026D000; // type:function size:0x4 +initializeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D010; // type:function size:0x70 +executeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D080; // type:function size:0x74 +finalizeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D100; // type:function size:0x4 fn_8026D110 = .text:0x8026D110; // type:function size:0x8 fn_8026D120 = .text:0x8026D120; // type:function size:0x8 fn_8026D130 = .text:0x8026D130; // type:function size:0x10 @@ -14350,25 +14350,25 @@ fn_8026DD70 = .text:0x8026DD70; // type:function size:0x2DC AcTbox__getInteractionTargetDef = .text:0x8026E050; // type:function size:0x40 fn_8026E090 = .text:0x8026E090; // type:function size:0x594 fn_8026E630 = .text:0x8026E630; // type:function size:0x10C -fn_8026E740 = .text:0x8026E740; // type:function size:0x60 -fn_8026E7A0 = .text:0x8026E7A0; // type:function size:0xC -fn_8026E7B0 = .text:0x8026E7B0; // type:function size:0x1C -fn_8026E7D0 = .text:0x8026E7D0; // type:function size:0x1C -fn_8026E7F0 = .text:0x8026E7F0; // type:function size:0x1C -fn_8026E810 = .text:0x8026E810; // type:function size:0x10 -fn_8026E820 = .text:0x8026E820; // type:function size:0x10 -fn_8026E830 = .text:0x8026E830; // type:function size:0x10 -fn_8026E840 = .text:0x8026E840; // type:function size:0x10 -fn_8026E850 = .text:0x8026E850; // type:function size:0x10 -fn_8026E860 = .text:0x8026E860; // type:function size:0x10 -fn_8026E870 = .text:0x8026E870; // type:function size:0x30 -fn_8026E8A0 = .text:0x8026E8A0; // type:function size:0x30 -fn_8026E8D0 = .text:0x8026E8D0; // type:function size:0x30 -AcTbox__initStatesAndThings = .text:0x8026E900; // type:function size:0xA7C -AcTbox__dtor2 = .text:0x8026F380; // type:function size:0x58 -fn_8026F3E0 = .text:0x8026F3E0; // type:function size:0x88 -fn_8026F470 = .text:0x8026F470; // type:function size:0x8 -fn_8026F480 = .text:0x8026F480; // type:function size:0x8 +build__24sFStateFct_c<9dAcTbox_c>FRC12sStateIDIf_c = .text:0x8026E740; // type:function size:0x60 +dispose__24sFStateFct_c<9dAcTbox_c>FRP10sStateIf_c = .text:0x8026E7A0; // type:function size:0xC +initialize__21sFState_c<9dAcTbox_c>Fv = .text:0x8026E7B0; // type:function size:0x1C +execute__21sFState_c<9dAcTbox_c>Fv = .text:0x8026E7D0; // type:function size:0x1C +finalize__21sFState_c<9dAcTbox_c>Fv = .text:0x8026E7F0; // type:function size:0x1C +initializeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026E810; // type:function size:0x10 +finalizeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026E820; // type:function size:0x10 +refreshState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026E830; // type:function size:0x10 +getState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026E840; // type:function size:0x10 +getNewStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026E850; // type:function size:0x10 +getOldStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026E860; // type:function size:0x10 +finalizeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E870; // type:function size:0x30 +executeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E8A0; // type:function size:0x30 +initializeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E8D0; // type:function size:0x30 +__sinit_\d_a_obj_tbox_cpp = .text:0x8026E900; // type:function size:0xA7C scope:local +__dt__23sFStateID_c<9dAcTbox_c>Fv = .text:0x8026F380; // type:function size:0x58 +isSameName__23sFStateID_c<9dAcTbox_c>CFPCc = .text:0x8026F3E0; // type:function size:0x88 +@316@__dt__10dAcTboxCcDFv = .text:0x8026F470; // type:function size:0x8 +@272@__dt__10dAcTboxCcDFv = .text:0x8026F480; // type:function size:0x8 AcTimeArea__ctor = .text:0x8026F490; // type:function size:0x1A8 fn_8026F640 = .text:0x8026F640; // type:function size:0x58 fn_8026F6A0 = .text:0x8026F6A0; // type:function size:0x6C @@ -34479,13 +34479,13 @@ lbl_805353A4 = .data:0x805353A4; // type:object size:0xE4 lbl_80535488 = .data:0x80535488; // type:object size:0xC lbl_80535494 = .data:0x80535494; // type:object size:0x14 lbl_805354A8 = .data:0x805354A8; // type:object size:0x18 -AcTbox__vtable = .data:0x805354C0; // type:object size:0x80 -lbl_80535540 = .data:0x80535540; // type:object size:0x30 -lbl_80535570 = .data:0x80535570; // type:object size:0x30 -lbl_805355A0 = .data:0x805355A0; // type:object size:0x18 -lbl_805355B8 = .data:0x805355B8; // type:object size:0x18 -lbl_805355D0 = .data:0x805355D0; // type:object size:0x410 -lbl_805359E0 = .data:0x805359E0; // type:object size:0x38 +__vt__9dAcTbox_c = .data:0x805354C0; // type:object size:0x80 +__vt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c> = .data:0x80535540; // type:object size:0x30 +__vt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80535570; // type:object size:0x30 +__vt__24sFStateFct_c<9dAcTbox_c> = .data:0x805355A0; // type:object size:0x14 +__vt__21sFState_c<9dAcTbox_c> = .data:0x805355B8; // type:object size:0x18 +__vt__10dAcTboxCcD = .data:0x805355D0; // type:object size:0x7C +__vt__23sFStateID_c<9dAcTbox_c> = .data:0x805359E0; // type:object size:0x34 g_profile_TIME_AREA = .data:0x80535A18; // type:object size:0x10 lbl_80535A28 = .data:0x80535A28; // type:object size:0x68 lbl_80535A90 = .data:0x80535A90; // type:object size:0x20 @@ -40232,7 +40232,7 @@ lbl_805758F4 = .sbss:0x805758F4; // type:object size:0x1 data:byte lbl_805758F8 = .sbss:0x805758F8; // type:object size:0x8 data:byte lbl_80575900 = .sbss:0x80575900; // type:object size:0x8 data:byte @GUARD@draw__13dAcObjFairy_cFv@rot = .sbss:0x80575908; // type:object size:0x8 data:byte -TBOX_ACTOR_LIST = .sbss:0x80575910; // type:object size:0x8 data:4byte +sTboxActorList__9dAcTbox_c = .sbss:0x80575910; // type:object size:0x8 data:4byte CURRENT_OBTAINING_ITEM_OARC_NAME = .sbss:0x80575918; // type:object size:0x4 data:4byte lbl_8057591C = .sbss:0x8057591C; // type:object size:0x1 data:byte lbl_8057591D = .sbss:0x8057591D; // type:object size:0x1 data:byte diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h new file mode 100644 index 00000000..f8e9dd10 --- /dev/null +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -0,0 +1,82 @@ +#ifndef D_A_OBJ_TBOX_H +#define D_A_OBJ_TBOX_H + +#include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_shadow.h" +#include "m/m3d/m_anmchr.h" +#include "m/m3d/m_anmmatclr.h" +#include "m/m3d/m_anmmdl.h" +#include "m/m3d/m_anmtexpat.h" +#include "m/m3d/m_anmtexsrt.h" +#include "m/m3d/m_smdl.h" +#include "s/s_State.hpp" +#include "toBeSorted/actor_event.h" +#include "toBeSorted/dowsing_target.h" +#include "toBeSorted/stage_render_stuff.h" + +class dAcTboxCcD : public dCcD_Unk { +public: + dAcTboxCcD() : mpList(nullptr), field_0x210(nullptr) {} + virtual ~dAcTboxCcD() { + if (mpList != nullptr) { + mpList->remove(&mNode); + mpList = nullptr; + } + } + cListNd_c mNode; + void *field_0x210; + cListMg_c *mpList; +}; + +class dAcTbox_c : public dAcObjBase_c { +public: + dAcTbox_c(); + virtual ~dAcTbox_c(); + + STATE_FUNC_DECLARE(dAcTbox_c, DugOut); + STATE_FUNC_DECLARE(dAcTbox_c, WaitAppear); + STATE_FUNC_DECLARE(dAcTbox_c, DemoAppear); + STATE_FUNC_DECLARE(dAcTbox_c, WaitOpen); + STATE_FUNC_DECLARE(dAcTbox_c, GoddessWaitOff); + STATE_FUNC_DECLARE(dAcTbox_c, GoddessWaitOn); + STATE_FUNC_DECLARE(dAcTbox_c, DeleteArchive); + STATE_FUNC_DECLARE(dAcTbox_c, LoadArchive); + STATE_FUNC_DECLARE(dAcTbox_c, Open); + STATE_FUNC_DECLARE(dAcTbox_c, PresentItem); + STATE_FUNC_DECLARE(dAcTbox_c, Close); + STATE_FUNC_DECLARE(dAcTbox_c, Wait); + STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait); + +private: + /* 0x0330 */ m3d::mdlAnmChr mMdl1; + /* 0x0398 */ m3d::smdl_c mMdl2; + /* 0x03B4 */ m3d::anmMatClr_c mAnmMatClr1; + /* 0x03E0 */ m3d::anmMatClr_c mAnmMatClr2; + /* 0x040C */ m3d::anmChr_c mAnmChr; + /* 0x0444 */ m3d::anmTexSrt_c mAnmTexSrt1; + /* 0x0470 */ m3d::anmTexSrt_c mAnmTexSrt2; + /* 0x049C */ m3d::anmTexPat_c mAnmTextPat; + /* 0x04C8 */ dScnCallback_c mScnCallback; + /* 0x04D4 */ dShadowCircle_c mShadowCircle; + u8 f1[0x1C]; + /* 0x04F8 */ dBgW mBgWs[2]; + /* 0x0918 */ dAcTboxCcD mCcD1; + /* 0x0B30 */ dAcTboxCcD mCcD2; + u8 f2[0xC]; + /* 0x0D54 */ dCcD_Unk mCcD3; + /* 0x0F5C */ dCcD_Cyl mCcD4; + /* 0x10AC */ STATE_MGR_DECLARE(dAcTbox_c); + /* 0x10E8 */ fLiNdBa_c mTboxListNode; + /* 0x10F4 */ ActorEventRelated mEvent; + dAcRef_c mItemRef; + /* 0x1150 */ DowsingTarget mDowsingTarget1; + /* 0x1170 */ DowsingTarget mDowsingTarget2; + + static fLiMgBa_c sTboxActorList; +}; + +#endif diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp new file mode 100644 index 00000000..52f092b9 --- /dev/null +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -0,0 +1,81 @@ +#include "d/a/obj/d_a_obj_tbox.h" +#include "m/m_vec.h" +#include "toBeSorted/dowsing_target.h" + +SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); + +extern "C" mVec3_c vecs[] = { + mVec3_c(0.0f, 54.0f, 0.0f), + mVec3_c(0.0f, 34.0f, 0.0f), + mVec3_c(0.0f, 66.5f, 0.0f), + mVec3_c(0.0f, 49.0f, 0.0f) +}; + +extern "C" mVec3_c v1 = mVec3_c(0.0f, 0.0f, -2.0f); +extern "C" mVec3_c v2 = mVec3_c(1.0f, 1.0f, 0.8f); +extern "C" mVec3_c v3 = mVec3_c(1.0f, 1.0f, 1.0f); +extern "C" mVec3_c v4 = mVec3_c(0.0f, 0.0f, 88.0f); + +STATE_DEFINE(dAcTbox_c, DugOut); +STATE_DEFINE(dAcTbox_c, WaitAppear); +STATE_DEFINE(dAcTbox_c, DemoAppear); +STATE_DEFINE(dAcTbox_c, WaitOpen); +STATE_DEFINE(dAcTbox_c, GoddessWaitOff); +STATE_DEFINE(dAcTbox_c, GoddessWaitOn); +STATE_DEFINE(dAcTbox_c, DeleteArchive); +STATE_DEFINE(dAcTbox_c, LoadArchive); +STATE_DEFINE(dAcTbox_c, Open); +STATE_DEFINE(dAcTbox_c, PresentItem); +STATE_DEFINE(dAcTbox_c, Close); +STATE_DEFINE(dAcTbox_c, Wait); +STATE_DEFINE(dAcTbox_c, GoddessWait); + +fLiMgBa_c dAcTbox_c::sTboxActorList; + +dAcTbox_c::dAcTbox_c() : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE) { + sTboxActorList.append(&mTboxListNode); + unkByteTargetFiRelated = 2; +} +dAcTbox_c::~dAcTbox_c() { + sTboxActorList.remove(&mTboxListNode); +} + +void dAcTbox_c::initializeState_DugOut() {} +void dAcTbox_c::executeState_DugOut() {} +void dAcTbox_c::finalizeState_DugOut() {} +void dAcTbox_c::initializeState_WaitAppear() {} +void dAcTbox_c::executeState_WaitAppear() {} +void dAcTbox_c::finalizeState_WaitAppear() {} +void dAcTbox_c::initializeState_DemoAppear() {} +void dAcTbox_c::executeState_DemoAppear() {} +void dAcTbox_c::finalizeState_DemoAppear() {} +void dAcTbox_c::initializeState_WaitOpen() {} +void dAcTbox_c::executeState_WaitOpen() {} +void dAcTbox_c::finalizeState_WaitOpen() {} +void dAcTbox_c::initializeState_GoddessWaitOff() {} +void dAcTbox_c::executeState_GoddessWaitOff() {} +void dAcTbox_c::finalizeState_GoddessWaitOff() {} +void dAcTbox_c::initializeState_GoddessWaitOn() {} +void dAcTbox_c::executeState_GoddessWaitOn() {} +void dAcTbox_c::finalizeState_GoddessWaitOn() {} +void dAcTbox_c::initializeState_DeleteArchive() {} +void dAcTbox_c::executeState_DeleteArchive() {} +void dAcTbox_c::finalizeState_DeleteArchive() {} +void dAcTbox_c::initializeState_LoadArchive() {} +void dAcTbox_c::executeState_LoadArchive() {} +void dAcTbox_c::finalizeState_LoadArchive() {} +void dAcTbox_c::initializeState_Open() {} +void dAcTbox_c::executeState_Open() {} +void dAcTbox_c::finalizeState_Open() {} +void dAcTbox_c::initializeState_PresentItem() {} +void dAcTbox_c::executeState_PresentItem() {} +void dAcTbox_c::finalizeState_PresentItem() {} +void dAcTbox_c::initializeState_Close() {} +void dAcTbox_c::executeState_Close() {} +void dAcTbox_c::finalizeState_Close() {} +void dAcTbox_c::initializeState_Wait() {} +void dAcTbox_c::executeState_Wait() {} +void dAcTbox_c::finalizeState_Wait() {} +void dAcTbox_c::initializeState_GoddessWait() {} +void dAcTbox_c::executeState_GoddessWait() {} +void dAcTbox_c::finalizeState_GoddessWait() {} From 4a146f7b4d6ca4132d73e18c8f6a8b2ea9f60ad6 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 15 Nov 2024 14:47:10 +0100 Subject: [PATCH 02/17] dAcTbox_c WIP --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 22 ++-- include/d/a/obj/d_a_obj_tbox.h | 46 ++++++-- src/d/a/obj/d_a_obj_tbox.cpp | 197 ++++++++++++++++++++++++++++++++- 4 files changed, 244 insertions(+), 22 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index f826aa09..804eaef8 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -642,6 +642,7 @@ d/a/obj/d_a_obj_tbox.cpp: .ctors start:0x804DB83C end:0x804DB840 .rodata start:0x804ED3B0 end:0x804EE548 .data start:0x80535270 end:0x80535A18 + .sdata2 start:0x8057C238 end:0x8057C3F0 .bss start:0x805B4FA8 end:0x805B5458 d/a/obj/d_a_obj_time_area.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8e658e75..ddda8137 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -14251,7 +14251,7 @@ __dt__24sFStateFct_c<9dAcTbox_c>Fv = .text:0x80268B40; // type:function size:0x6 __dt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80268BB0; // type:function size:0xA0 __dt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c>Fv = .text:0x80268C50; // type:function size:0xA4 __dt__9dAcTbox_cFv = .text:0x80268D00; // type:function size:0x250 -AcTbox__initModels = .text:0x80268F50; // type:function size:0x54C +createHeap__9dAcTbox_cFv = .text:0x80268F50; // type:function size:0x54C AcTbox__init = .text:0x802694A0; // type:function size:0xA00 AcTbox__destroy = .text:0x80269EA0; // type:function size:0xB4 AcTbox__update = .text:0x80269F60; // type:function size:0x690 @@ -49009,12 +49009,20 @@ StateID_CatchDemo__13dAcObjFairy_c = .bss:0x805B4F68; // type:object size:0x30 d lbl_805B4FA8 = .bss:0x805B4FA8; // type:object size:0x30 data:float lbl_805B4FD8 = .bss:0x805B4FD8; // type:object size:0xC data:float lbl_805B4FE4 = .bss:0x805B4FE4; // type:object size:0xC data:float -lbl_805B4FF0 = .bss:0x805B4FF0; // type:object size:0xE8 data:float -AcTbox__STATE_WAIT_OPEN = .bss:0x805B50D8; // type:object size:0x80 data:4byte -AcTbox__STATE_GODDESS_WAIT_ON = .bss:0x805B5158; // type:object size:0x80 data:4byte -AcTbox__STATE_LOAD_ARCHIVE = .bss:0x805B51D8; // type:object size:0x40 data:4byte -AcTbox__STATE_OPEN = .bss:0x805B5218; // type:object size:0x40 data:4byte -AcTbox__StateID_PresentItem = .bss:0x805B5258; // type:object size:0xF0 data:4byte +lbl_805B4FF0 = .bss:0x805B4FF0; // type:object size:0x18 data:float +StateID_DugOut__9dAcTbox_c = .bss:0x805B5018; // type:object size:0x30 data:4byte +StateID_WaitAppear__9dAcTbox_c = .bss:0x805B5058; // type:object size:0x30 data:4byte +StateID_DemoAppear__9dAcTbox_c = .bss:0x805B5098; // type:object size:0x30 data:4byte +StateID_WaitOpen__9dAcTbox_c = .bss:0x805B50D8; // type:object size:0x30 data:4byte +StateID_GoddessWaitOff__9dAcTbox_c = .bss:0x805B5118; // type:object size:0x30 data:4byte +StateID_GoddessWaitOn__9dAcTbox_c = .bss:0x805B5158; // type:object size:0x30 data:4byte +StateID_DeleteArchive__9dAcTbox_c = .bss:0x805B5198; // type:object size:0x30 data:4byte +StateID_LoadArchive__9dAcTbox_c = .bss:0x805B51D8; // type:object size:0x30 data:4byte +StateID_Open__9dAcTbox_c = .bss:0x805B5218; // type:object size:0x30 data:4byte +StateID_PresentItem__9dAcTbox_c = .bss:0x805B5258; // type:object size:0x30 data:4byte +StateID_Close__9dAcTbox_c = .bss:0x805B5298; // type:object size:0x30 data:4byte +StateID_Wait__9dAcTbox_c = .bss:0x805B52D8; // type:object size:0x30 data:4byte +StateID_GoddessWait__9dAcTbox_c = .bss:0x805B5318; // type:object size:0x30 data:4byte lbl_805B5348 = .bss:0x805B5348; // type:object size:0xA0 lbl_805B53E8 = .bss:0x805B53E8; // type:object size:0x40 data:4byte lbl_805B5428 = .bss:0x805B5428; // type:object size:0x30 data:float diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index f8e9dd10..355ed2e0 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -13,23 +13,30 @@ #include "m/m3d/m_anmtexpat.h" #include "m/m3d/m_anmtexsrt.h" #include "m/m3d/m_smdl.h" +#include "m/m_vec.h" #include "s/s_State.hpp" #include "toBeSorted/actor_event.h" #include "toBeSorted/dowsing_target.h" #include "toBeSorted/stage_render_stuff.h" +// Somewhere in d_cc class dAcTboxCcD : public dCcD_Unk { public: - dAcTboxCcD() : mpList(nullptr), field_0x210(nullptr) {} + dAcTboxCcD() : mpList(nullptr), field_0x210(this) {} virtual ~dAcTboxCcD() { if (mpList != nullptr) { mpList->remove(&mNode); mpList = nullptr; } } - cListNd_c mNode; - void *field_0x210; - cListMg_c *mpList; + /* 0x00 */ cListNd_c mNode; + /* 0x08 */ dCcD_Unk *field_0x210; + /* 0x0C */ cListMg_c *mpList; +}; + +struct TboxAndMoreUnkCC { + cListMg_c mList; + virtual ~TboxAndMoreUnkCC(); }; class dAcTbox_c : public dAcObjBase_c { @@ -37,6 +44,8 @@ public: dAcTbox_c(); virtual ~dAcTbox_c(); + virtual bool createHeap() override; + STATE_FUNC_DECLARE(dAcTbox_c, DugOut); STATE_FUNC_DECLARE(dAcTbox_c, WaitAppear); STATE_FUNC_DECLARE(dAcTbox_c, DemoAppear); @@ -52,30 +61,47 @@ public: STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait); private: + bool initBgW(dBgW &bg, const char *arcName, const char *ccName); + bool isNotSmall() const; + void fn_8026B380(mVec3_c &outResult) const; + const mVec3_c &fn_8026B3C0() const; + /* 0x0330 */ m3d::mdlAnmChr mMdl1; - /* 0x0398 */ m3d::smdl_c mMdl2; + /* 0x0398 */ m3d::smdl_c mOpenFxMdl; /* 0x03B4 */ m3d::anmMatClr_c mAnmMatClr1; /* 0x03E0 */ m3d::anmMatClr_c mAnmMatClr2; /* 0x040C */ m3d::anmChr_c mAnmChr; /* 0x0444 */ m3d::anmTexSrt_c mAnmTexSrt1; - /* 0x0470 */ m3d::anmTexSrt_c mAnmTexSrt2; - /* 0x049C */ m3d::anmTexPat_c mAnmTextPat; + /* 0x0470 */ m3d::anmTexSrt_c mAnmGoddessTexSrt; + /* 0x049C */ m3d::anmTexPat_c mAnmGoddessPat; /* 0x04C8 */ dScnCallback_c mScnCallback; /* 0x04D4 */ dShadowCircle_c mShadowCircle; - u8 f1[0x1C]; + + // Could be part of an aggregate structure + s32 field_0x4DC; + s32 field_0x4E0; + s32 field_0x4E4; + s32 field_0x4E8; + s32 field_0x4EC; + s32 field_0x4F0; + s32 field_0x4F4; + /* 0x04F8 */ dBgW mBgWs[2]; /* 0x0918 */ dAcTboxCcD mCcD1; /* 0x0B30 */ dAcTboxCcD mCcD2; - u8 f2[0xC]; + /* 0x0D48 */ TboxAndMoreUnkCC field_0x0D48; /* 0x0D54 */ dCcD_Unk mCcD3; /* 0x0F5C */ dCcD_Cyl mCcD4; /* 0x10AC */ STATE_MGR_DECLARE(dAcTbox_c); /* 0x10E8 */ fLiNdBa_c mTboxListNode; /* 0x10F4 */ ActorEventRelated mEvent; - dAcRef_c mItemRef; + /* 0x1144 */ dAcRef_c mItemRef; /* 0x1150 */ DowsingTarget mDowsingTarget1; /* 0x1170 */ DowsingTarget mDowsingTarget2; + /* 0x1204 */ bool mHasBeenOpened; + /* 0x1209 */ u8 mVariant; + static fLiMgBa_c sTboxActorList; }; diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 52f092b9..8b38c261 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1,14 +1,20 @@ #include "d/a/obj/d_a_obj_tbox.h" + +#include "common.h" +#include "d/flag/storyflag_manager.h" +#include "m/m_mtx.h" #include "m/m_vec.h" +#include "nw4r/g3d/g3d_resanmchr.h" +#include "nw4r/g3d/g3d_resanmtexpat.h" +#include "nw4r/g3d/g3d_resanmtexsrt.h" +#include "nw4r/g3d/g3d_resfile.h" +#include "nw4r/g3d/g3d_resmdl.h" #include "toBeSorted/dowsing_target.h" SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); extern "C" mVec3_c vecs[] = { - mVec3_c(0.0f, 54.0f, 0.0f), - mVec3_c(0.0f, 34.0f, 0.0f), - mVec3_c(0.0f, 66.5f, 0.0f), - mVec3_c(0.0f, 49.0f, 0.0f) + mVec3_c(0.0f, 54.0f, 0.0f), mVec3_c(0.0f, 34.0f, 0.0f), mVec3_c(0.0f, 66.5f, 0.0f), mVec3_c(0.0f, 49.0f, 0.0f) }; extern "C" mVec3_c v1 = mVec3_c(0.0f, 0.0f, -2.0f); @@ -32,14 +38,191 @@ STATE_DEFINE(dAcTbox_c, GoddessWait); fLiMgBa_c dAcTbox_c::sTboxActorList; -dAcTbox_c::dAcTbox_c() : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE) { +static char *const sArcNames[] = { + "TBoxNormalT", + "TBoxSmallT", + "TBoxBossT", + "GoddessTBox", +}; + +static const char *const sOpenArcName = "FX_TBoxOpen"; +static const char *const sOpenMdlName = "FX_TBoxOpen"; +static const char *const sOpenAnmChrName = "FX_TBoxOpen"; +static const char *const sOpenAnmTexSrtName = "FX_TBoxOpen"; +static const char *const sOpenAnmClrName = "FX_TBoxOpen"; + +static const char *const sAppearAnmName = "TBoxNormalT_appear"; + +extern "C" char *const sOpenEventNames[] = { + "TreasureBoxOpen", + "TreasureBoxOpenSmall", + "TreasureBoxOpenBoss", + "TreasureBoxOpen", +}; + +static char *const sMdlNames[] = { + "TBoxNormalT", + "TBoxSmallT", + "TBoxBossT", + "GoddessTBox", +}; + +static char *const sAnmNames[] = { + "TBoxNormalT", + "TBoxSmallT", + "TBoxBossT", + "TBoxNormalT", +}; + +static char *const sCloseCcNames[] = { + "TBoxNormalTClose", + "TBoxSmallTClose", + "TBoxBossTClose", + "GoddessTBoxClose", +}; + +static char *const sOpenCcNames[] = { + "TBoxNormalTOpen", + "TBoxSmallTOpen", + "TBoxBossTOpen", + "GoddessTBoxOpen", +}; + +dAcTbox_c::dAcTbox_c() + : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), + mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE), + field_0x4E8(-1) { sTboxActorList.append(&mTboxListNode); unkByteTargetFiRelated = 2; } + dAcTbox_c::~dAcTbox_c() { sTboxActorList.remove(&mTboxListNode); } +bool dAcTbox_c::createHeap() { + void *data = getOarcResFile(sArcNames[mVariant]); + if (data == nullptr) { + return false; + } + if (!mMdl1.create(data, data, sMdlNames[mVariant], sAnmNames[mVariant], &heap_allocator, 0x32F, 1, nullptr)) { + return false; + } + mMdl1.getModel().setLocalMtx(mWorldMtx); + mScnCallback.attach(mMdl1.getModel()); + if (!initBgW(mBgWs[0], sArcNames[mVariant], sCloseCcNames[mVariant])) { + return false; + } + if (!initBgW(mBgWs[1], sArcNames[mVariant], sOpenCcNames[mVariant])) { + return false; + } + + if (mVariant == 3) { + if (data == nullptr) { + return false; + } + nw4r::g3d::ResFile res = data; + nw4r::g3d::ResMdl mdl = mMdl1.getModel().getResMdl(); + if (!mdl.IsValid()) { + return false; + } + nw4r::g3d::ResAnmTexPat anmTexPat = res.GetResAnmTexPat("GoddessTBox"); + if (!anmTexPat.mAnmTexPat.IsValid()) { + return false; + } + if (!mAnmGoddessPat.create(mdl, anmTexPat, &heap_allocator, nullptr, 1)) { + return false; + } + mMdl1.getModel().setAnm(mAnmGoddessPat); + u16 goddessTBoxActive = getParams2Lower(); + if (StoryflagManager::sInstance->getCounterOrFlag(goddessTBoxActive) && !mHasBeenOpened) { + nw4r::g3d::ResAnmTexSrt anmTexSrt = res.GetResAnmTexSrt("GoddessTBox"); + if (!anmTexSrt.mAnmTexSrt.IsValid()) { + return false; + } + if (!mAnmGoddessTexSrt.create(mdl, anmTexSrt, &heap_allocator, nullptr, 1)) { + return false; + } + mMdl1.getModel().setAnm(mAnmGoddessTexSrt); + } + } else if (mVariant == 0) { + if (data == nullptr) { + return false; + } + nw4r::g3d::ResFile res = data; + nw4r::g3d::ResAnmClr anmClr = res.GetResAnmClr("TBoxNormalTAppear"); + if (!anmClr.mAnmClr.IsValid()) { + return false; + } + nw4r::g3d::ResMdl mdl = mMdl1.getModel().getResMdl(); + if (!mdl.IsValid()) { + return false; + } + if (!mAnmMatClr1.create(mdl, anmClr, &heap_allocator, nullptr, 1)) { + return false; + } + mAnmMatClr1.setRate(1.0f, 0); + mMdl1.getModel().setAnm(mAnmMatClr1); + } + + if (isNotSmall()) { + void *fxData = getOarcResFile(sOpenArcName); + if (fxData == nullptr) { + return false; + } + nw4r::g3d::ResFile fxRes = fxData; + if (!fxRes.mFile.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl openMdl = fxRes.GetResMdl(sOpenMdlName); + if (!openMdl.IsValid()) { + return false; + } + if (!mOpenFxMdl.create(openMdl, &heap_allocator, 0x120)) { + return false; + } + mOpenFxMdl.setPriorityDraw(0x7F, 0x86); + + nw4r::g3d::ResAnmChr openAnm = fxRes.GetResAnmChr(sOpenAnmChrName); + if (!openAnm.mAnmChr.IsValid()) { + return false; + } + if (!mAnmChr.create(openMdl, openAnm, &heap_allocator, nullptr)) { + return false; + } + mOpenFxMdl.setAnm(mAnmChr); + + nw4r::g3d::ResAnmTexSrt anmTexSrt = fxRes.GetResAnmTexSrt(sOpenAnmTexSrtName); + if (!anmTexSrt.mAnmTexSrt.IsValid()) { + return false; + } + if (!mAnmTexSrt1.create(openMdl, anmTexSrt, &heap_allocator, nullptr, 1)) { + return false; + } + mOpenFxMdl.setAnm(mAnmTexSrt1); + + nw4r::g3d::ResAnmClr anmClr = fxRes.GetResAnmClr(sOpenAnmClrName); + if (!anmClr.mAnmClr.IsValid()) { + return false; + } + if (!mAnmMatClr2.create(openMdl, anmClr, &heap_allocator, nullptr, 1)) { + return false; + } + mOpenFxMdl.setAnm(mAnmMatClr2); + mVec3_c fxPos; + fn_8026B380(fxPos); + mMtx_c fxTransform; + fxTransform.transS(fxPos); + // TODO address calculations here + fxTransform.ZXYrotM(rotation.x, rotation.y, rotation.y); + mOpenFxMdl.setLocalMtx(mWorldMtx); + mOpenFxMdl.setScale(fn_8026B3C0()); + } + + return true; +} + void dAcTbox_c::initializeState_DugOut() {} void dAcTbox_c::executeState_DugOut() {} void dAcTbox_c::finalizeState_DugOut() {} @@ -79,3 +262,7 @@ void dAcTbox_c::finalizeState_Wait() {} void dAcTbox_c::initializeState_GoddessWait() {} void dAcTbox_c::executeState_GoddessWait() {} void dAcTbox_c::finalizeState_GoddessWait() {} + +bool dAcTbox_c::isNotSmall() const { + return mVariant != 1; +} From 8240b23a86a76727ce4865acb43940dc3fe0790b Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 15 Nov 2024 15:06:40 +0100 Subject: [PATCH 03/17] Fixups --- src/d/a/obj/d_a_obj_tbox.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 8b38c261..b73edb3d 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -105,7 +105,7 @@ bool dAcTbox_c::createHeap() { if (data == nullptr) { return false; } - if (!mMdl1.create(data, data, sMdlNames[mVariant], sAnmNames[mVariant], &heap_allocator, 0x32F, 1, nullptr)) { + if (!mMdl1.create(data, sMdlNames[mVariant], sAnmNames[mVariant], &heap_allocator, 0x32F, 1, nullptr)) { return false; } mMdl1.getModel().setLocalMtx(mWorldMtx); @@ -118,10 +118,10 @@ bool dAcTbox_c::createHeap() { } if (mVariant == 3) { - if (data == nullptr) { + nw4r::g3d::ResFile res = data; + if (!res.mFile.IsValid()) { return false; } - nw4r::g3d::ResFile res = data; nw4r::g3d::ResMdl mdl = mMdl1.getModel().getResMdl(); if (!mdl.IsValid()) { return false; @@ -146,10 +146,10 @@ bool dAcTbox_c::createHeap() { mMdl1.getModel().setAnm(mAnmGoddessTexSrt); } } else if (mVariant == 0) { - if (data == nullptr) { + nw4r::g3d::ResFile res = data; + if (!res.mFile.IsValid()) { return false; } - nw4r::g3d::ResFile res = data; nw4r::g3d::ResAnmClr anmClr = res.GetResAnmClr("TBoxNormalTAppear"); if (!anmClr.mAnmClr.IsValid()) { return false; @@ -179,7 +179,7 @@ bool dAcTbox_c::createHeap() { if (!openMdl.IsValid()) { return false; } - if (!mOpenFxMdl.create(openMdl, &heap_allocator, 0x120)) { + if (!mOpenFxMdl.create(openMdl, &heap_allocator, 0x120, 1, nullptr)) { return false; } mOpenFxMdl.setPriorityDraw(0x7F, 0x86); @@ -214,9 +214,10 @@ bool dAcTbox_c::createHeap() { fn_8026B380(fxPos); mMtx_c fxTransform; fxTransform.transS(fxPos); - // TODO address calculations here - fxTransform.ZXYrotM(rotation.x, rotation.y, rotation.y); - mOpenFxMdl.setLocalMtx(mWorldMtx); + // TODO address calculations here, otherwise this function + // matches surprisingly well + fxTransform.ZXYrotM(rotation.x, rotation.y, rotation.z); + mOpenFxMdl.setLocalMtx(fxTransform); mOpenFxMdl.setScale(fn_8026B3C0()); } From 451566ac23a71223e00f3f4de9cd7fc1574b46fd Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 17 Nov 2024 21:19:50 +0100 Subject: [PATCH 04/17] dAcTbox_c::create structurally matching --- config/SOUE01/symbols.txt | 58 ++++---- include/d/a/d_a_item.h | 3 + include/d/a/obj/d_a_obj_tbox.h | 86 ++++++++++- src/d/a/obj/d_a_obj_tbox.cpp | 253 ++++++++++++++++++++++++++++++++- 4 files changed, 359 insertions(+), 41 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index ddda8137..d36c353e 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2119,13 +2119,13 @@ fn_80051C00 = .text:0x80051C00; // type:function size:0x4C InitColliderAndAddToFront = .text:0x80051C50; // type:function size:0x5C fn_80051CB0 = .text:0x80051CB0; // type:function size:0x5C InitCollider2AndAddToFront = .text:0x80051D10; // type:function size:0x5C -fn_80051D70 = .text:0x80051D70; // type:function size:0x5C +addCc__16TboxAndMoreUnkCCFR10dAcTboxCcDRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C fn_80051DD0 = .text:0x80051DD0; // type:function size:0x64 fn_80051E40 = .text:0x80051E40; // type:function size:0x64 ColliderManager__staticAddCollider = .text:0x80051EB0; // type:function size:0x34 ColliderLinkedList__registerColliders = .text:0x80051EF0; // type:function size:0x10 fn_80051F00 = .text:0x80051F00; // type:function size:0x8 -fn_80051F10 = .text:0x80051F10; // type:function size:0x10 +setMtx__16TboxAndMoreUnkCCFRC6mMtx_c = .text:0x80051F10; // type:function size:0x10 ColliderLinkedList__search = .text:0x80051F20; // type:function size:0x74 fn_80051FA0 = .text:0x80051FA0; // type:function size:0x1C fn_80051FC0 = .text:0x80051FC0; // type:function size:0x10 @@ -13466,7 +13466,7 @@ AcItem__isSingleArrow = .text:0x802509A0; // type:function size:0x10 isItem5Bombs = .text:0x802509B0; // type:function size:0x10 isItem10Bombs = .text:0x802509C0; // type:function size:0x10 isItemBundleOfArrows = .text:0x802509D0; // type:function size:0x10 -AcItem__isKeyPiece = .text:0x802509E0; // type:function size:0x10 +isKeyPiece__9dAcItem_cF7ITEM_ID = .text:0x802509E0; // type:function size:0x10 isItem5GratitudeCrystals = .text:0x802509F0; // type:function size:0x10 AcItem__isFaroreTear = .text:0x80250A00; // type:function size:0x10 AcItem__IsDinTear = .text:0x80250A10; // type:function size:0x10 @@ -13492,7 +13492,7 @@ AcItem__isTear2 = .text:0x80250C10; // type:function size:0x78 AcItem__is_Larvae_Ore_JellyBlob_Claw_Horn_EvilCryst_OrnSkull_GoldSkull = .text:0x80250C90; // type:function size:0xB8 AcItem__isBug = .text:0x80250D50; // type:function size:0x7C AcItem__isTreasure = .text:0x80250DD0; // type:function size:0x138 -AcItem__isTreasure2 = .text:0x80250F10; // type:function size:0x88 +isTreasure__9dAcItem_cF7ITEM_ID = .text:0x80250F10; // type:function size:0x88 AcItem__isItemHeart = .text:0x80250FA0; // type:function size:0x34 isSingleArrow = .text:0x80250FE0; // type:function size:0x8 isBundleOrArrows = .text:0x80250FF0; // type:function size:0x8 @@ -14240,7 +14240,7 @@ dAcTbox_c_classInit__Fv = .text:0x802685A0; // type:function size:0x30 fn_802685D0 = .text:0x802685D0; // type:function size:0x68 fn_80268640 = .text:0x80268640; // type:function size:0x4 fn_80268650 = .text:0x80268650; // type:function size:0x8 -fn_80268660 = .text:0x80268660; // type:function size:0x20 +fn_80268660__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 hasCollectedAllTears2 = .text:0x80268680; // type:function size:0x1C fn_802686A0 = .text:0x802686A0; // type:function size:0x50 fn_802686F0 = .text:0x802686F0; // type:function size:0x5C @@ -14252,7 +14252,7 @@ __dt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDC __dt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c>Fv = .text:0x80268C50; // type:function size:0xA4 __dt__9dAcTbox_cFv = .text:0x80268D00; // type:function size:0x250 createHeap__9dAcTbox_cFv = .text:0x80268F50; // type:function size:0x54C -AcTbox__init = .text:0x802694A0; // type:function size:0xA00 +create__9dAcTbox_cFv = .text:0x802694A0; // type:function size:0xA00 AcTbox__destroy = .text:0x80269EA0; // type:function size:0xB4 AcTbox__update = .text:0x80269F60; // type:function size:0x690 getStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026A5F0; // type:function size:0x10 @@ -14264,11 +14264,11 @@ AcTbox__setActionState = .text:0x8026B0C0; // type:function size:0x224 AcTbox__isValidSubtype = .text:0x8026B2F0; // type:function size:0x20 fn_8026B310 = .text:0x8026B310; // type:function size:0x8 fn_8026B320 = .text:0x8026B320; // type:function size:0x8 -AcTbox__setItemId = .text:0x8026B330; // type:function size:0x8 -setDoObstructionCheckTrue = .text:0x8026B340; // type:function size:0xC -AcTbox__isActualVisibleBox = .text:0x8026B350; // type:function size:0xC -getRotX_shift9_0x1 = .text:0x8026B360; // type:function size:0xC -fn_8026B370 = .text:0x8026B370; // type:function size:0xC +setItemId__9dAcTbox_cCFUs = .text:0x8026B330; // type:function size:0x8 +setDoObstructionCheck__9dAcTbox_cFv = .text:0x8026B340; // type:function size:0xC +isActualVisibleBox__9dAcTbox_cCFv = .text:0x8026B350; // type:function size:0xC +noObstructionCheck__9dAcTbox_cCFv = .text:0x8026B360; // type:function size:0xC +fn_8026B370__9dAcTbox_cCFv = .text:0x8026B370; // type:function size:0xC fn_8026B380 = .text:0x8026B380; // type:function size:0x3C fn_8026B3C0 = .text:0x8026B3C0; // type:function size:0x20 initializeState_DugOut__9dAcTbox_cFv = .text:0x8026B3E0; // type:function size:0x11C @@ -14322,20 +14322,20 @@ AcTbox__setShouldCloseFlag = .text:0x8026D350; // type:function size:0xC AcTbox__unsetShouldCloseFlag = .text:0x8026D360; // type:function size:0xC fn_8026D370 = .text:0x8026D370; // type:function size:0x4C fn_8026D3C0 = .text:0x8026D3C0; // type:function size:0xD4 -AcTbox__setChestflag = .text:0x8026D4A0; // type:function size:0x10 +setChestFlag__9dAcTbox_cFv = .text:0x8026D4A0; // type:function size:0x10 AcTbox__setTboxFlag = .text:0x8026D4B0; // type:function size:0x18 -checkTBoxFlagMaybe = .text:0x8026D4D0; // type:function size:0x4C +checkTboxFlag__9dAcTbox_cCFv = .text:0x8026D4D0; // type:function size:0x4C fn_8026D520 = .text:0x8026D520; // type:function size:0x18 fn_8026D540 = .text:0x8026D540; // type:function size:0x14 -fn_8026D560 = .text:0x8026D560; // type:function size:0x94 -fn_8026D600 = .text:0x8026D600; // type:function size:0x68 -fn_8026D670 = .text:0x8026D670; // type:function size:0x8 +fn_8026D560__9dAcTbox_cCFv = .text:0x8026D560; // type:function size:0x94 +getSomeCounter__9dAcTbox_cCFPUl = .text:0x8026D600; // type:function size:0x68 +fn_8026D670__9dAcTbox_cCFv = .text:0x8026D670; // type:function size:0x8 fn_8026D680 = .text:0x8026D680; // type:function size:0x10 ActorObjectBase__setActorCollision = .text:0x8026D690; // type:function size:0xB8 AcTbox__initializeDowsingTarget = .text:0x8026D750; // type:function size:0x14 -AcTbox__isItemRupee = .text:0x8026D770; // type:function size:0x8 -AcTbox__initDowsingTarget = .text:0x8026D780; // type:function size:0x50 -AcTbox__initDowsingTargetCube = .text:0x8026D7D0; // type:function size:0x44 +isItemRupee__9dAcTbox_cCFv = .text:0x8026D770; // type:function size:0x8 +initDowsingTarget__9dAcTbox_cFQ213DowsingTarget11DowsingSlot = .text:0x8026D780; // type:function size:0x50 +initDowsingTargetCube__9dAcTbox_cFv = .text:0x8026D7D0; // type:function size:0x44 noRegisterDowsing = .text:0x8026D820; // type:function size:0x4 registersKeyPieceDowsing = .text:0x8026D830; // type:function size:0x68 registerRupeeOrTreasureDowsing = .text:0x8026D8A0; // type:function size:0x48 @@ -40234,16 +40234,16 @@ lbl_80575900 = .sbss:0x80575900; // type:object size:0x8 data:byte @GUARD@draw__13dAcObjFairy_cFv@rot = .sbss:0x80575908; // type:object size:0x8 data:byte sTboxActorList__9dAcTbox_c = .sbss:0x80575910; // type:object size:0x8 data:4byte CURRENT_OBTAINING_ITEM_OARC_NAME = .sbss:0x80575918; // type:object size:0x4 data:4byte -lbl_8057591C = .sbss:0x8057591C; // type:object size:0x1 data:byte -lbl_8057591D = .sbss:0x8057591D; // type:object size:0x1 data:byte -lbl_8057591E = .sbss:0x8057591E; // type:object size:0x1 data:byte -lbl_8057591F = .sbss:0x8057591F; // type:object size:0x1 data:byte -lbl_80575920 = .sbss:0x80575920; // type:object size:0x1 data:byte -lbl_80575921 = .sbss:0x80575921; // type:object size:0x1 data:byte -lbl_80575922 = .sbss:0x80575922; // type:object size:0x1 data:byte -lbl_80575923 = .sbss:0x80575923; // type:object size:0x1 data:byte -lbl_80575924 = .sbss:0x80575924; // type:object size:0x1 data:byte -lbl_80575925 = .sbss:0x80575925; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@s1 = .sbss:0x8057591C; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@s2@0 = .sbss:0x8057591D; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbLo@3 = .sbss:0x8057591E; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbUp@4 = .sbss:0x8057591F; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbLo@5 = .sbss:0x80575920; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbUp@6 = .sbss:0x80575921; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbLo@7 = .sbss:0x80575922; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbUp@8 = .sbss:0x80575923; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbLo@9 = .sbss:0x80575924; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbUp@10 = .sbss:0x80575925; // type:object size:0x1 data:byte lbl_80575926 = .sbss:0x80575926; // type:object size:0x1 data:byte lbl_80575927 = .sbss:0x80575927; // type:object size:0x1 data:byte lbl_80575928 = .sbss:0x80575928; // type:object size:0x8 data:byte diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 468f0419..c68b886b 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -55,6 +55,9 @@ public: static int getTotalArrowCount(); static int getTotalSeedCount(); + static bool isKeyPiece(ITEM_ID item); + static bool isTreasure(ITEM_ID item); + private: /* 0x334 */ UNKTYPE *mpMdl; // Model has its own handling system /* 0x338 */ dShadowCircle_c mShdw; diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 355ed2e0..659fba39 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -1,6 +1,7 @@ #ifndef D_A_OBJ_TBOX_H #define D_A_OBJ_TBOX_H +#include "common.h" #include "d/a/d_a_base.h" #include "d/a/d_a_item.h" #include "d/a/obj/d_a_obj_base.h" @@ -14,6 +15,7 @@ #include "m/m3d/m_anmtexsrt.h" #include "m/m3d/m_smdl.h" #include "m/m_vec.h" +#include "nw4r/ut/ut_Color.h" #include "s/s_State.hpp" #include "toBeSorted/actor_event.h" #include "toBeSorted/dowsing_target.h" @@ -37,14 +39,29 @@ public: struct TboxAndMoreUnkCC { cListMg_c mList; virtual ~TboxAndMoreUnkCC(); + + void addCc(dAcTboxCcD &ccD, const dCcD_SrcUnk &src); + void SetStts(cCcD_Stts &stts); }; class dAcTbox_c : public dAcObjBase_c { public: + enum TboxVariant_e { + NORMAL, + SMALL, + BOSS, + GODDESS, + }; + dAcTbox_c(); virtual ~dAcTbox_c(); virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int actorExecuteInEvent() override; + virtual int draw() override; STATE_FUNC_DECLARE(dAcTbox_c, DugOut); STATE_FUNC_DECLARE(dAcTbox_c, WaitAppear); @@ -63,9 +80,31 @@ public: private: bool initBgW(dBgW &bg, const char *arcName, const char *ccName); bool isNotSmall() const; + void setItemId(u16 item) const; + void setChestFlag(); + void setDoObstructionCheck(); + int isActualVisibleBox() const; void fn_8026B380(mVec3_c &outResult) const; const mVec3_c &fn_8026B3C0() const; + bool noObstructionCheck() const; + int fn_8026B370() const; + bool fn_8026D670() const; + bool getSomeCounter(u32 *outIndex) const; + bool checkTboxFlag() const; + bool fn_8026D560() const; + bool isItemRupee() const; + void initDowsingTarget(DowsingTarget::DowsingSlot slot); + void initDowsingTargetCube(); + + void registerRupeeOrTreasureDowsing(); + void registerKeyPieceDowsing(); + void unregisterDowsing(); + void noRegisterDowsing(); + void noUnregisterDowsing(); + + static bool fn_80268660(int arg); + /* 0x0330 */ m3d::mdlAnmChr mMdl1; /* 0x0398 */ m3d::smdl_c mOpenFxMdl; /* 0x03B4 */ m3d::anmMatClr_c mAnmMatClr1; @@ -78,11 +117,9 @@ private: /* 0x04D4 */ dShadowCircle_c mShadowCircle; // Could be part of an aggregate structure - s32 field_0x4DC; - s32 field_0x4E0; - s32 field_0x4E4; - s32 field_0x4E8; - s32 field_0x4EC; + mVec3_c field_0x4DC; + nw4r::ut::Color field_0x4E8; + f32 field_0x4EC; s32 field_0x4F0; s32 field_0x4F4; @@ -98,10 +135,47 @@ private: /* 0x1144 */ dAcRef_c mItemRef; /* 0x1150 */ DowsingTarget mDowsingTarget1; /* 0x1170 */ DowsingTarget mDowsingTarget2; + /* 0x1190 */ void (dAcTbox_c::*mRegisterDowsingTarget)(); + /* 0x119C */ void (dAcTbox_c::*mUnregisterDowsingTarget)(); + /* 0x11A8 */ u8 field_0x11A8[0x11D8 - 0x11A8]; + + /* 0x11D8 */ mVec3_c field_0x11D8; + + /* 0x11E4 */ u8 field_0x11E4[0x11EC - 0x11E4]; + + /* 0x11EC */ f32 field_0x11EC; + /* 0x11F0 */ UNKWORD field_0x11F0; + + /* 0x11F4 */ u8 field_0x11F4[0x11FC - 0x11F4]; + + /* 0x11FC */ UNKWORD field_0x11FC; + + /* 0x1200 */ u16 mItemId; + + /* 0x1202 */ u8 field_0x1202[0x1204 - 0x1202]; + /* 0x1204 */ bool mHasBeenOpened; - /* 0x1209 */ u8 mVariant; + /* 0x1205 */ u8 mSpawnSceneFlag; + /* 0x1206 */ u8 mSetSceneFlag; // set when? + /* 0x1207 */ u8 field_0x1207; + + /* 0x1208 */ u8 field_0x1208; + /* 0x1209 */ u8 mVariant; + /* 0x120A */ u8 field_0x120A; + + /* 0x120B */ u8 field_0x120B[0x120D - 0x120B]; + + /* 0x120D */ u8 field_0x120D; + + /* 0x120E */ u8 field_0x120E; + + /* 0x120F */ bool field_0x120F; + /* 0x1210 */ bool field_0x1210; + /* 0x1211 */ bool mDoObstructedCheck; + + static const cCcD_SrcGObj sColSrc; static fLiMgBa_c sTboxActorList; }; diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index b73edb3d..11dcd85b 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1,7 +1,12 @@ #include "d/a/obj/d_a_obj_tbox.h" #include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/col/cc/d_cc_d.h" +#include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" +#include "m/m3d/m_fanm.h" #include "m/m_mtx.h" #include "m/m_vec.h" #include "nw4r/g3d/g3d_resanmchr.h" @@ -60,6 +65,33 @@ extern "C" char *const sOpenEventNames[] = { "TreasureBoxOpen", }; +// clang-format off +// TODO just copied from somewhere +const cCcD_SrcGObj dAcTbox_c::sColSrc = { + /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, + /* mObjCo */ {0x0} +}; +// clang-format on + +// TODO enum, item comments +static const u8 sItemToTBoxVariant[MAX_ITEM_ID + 1] = { + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + static char *const sMdlNames[] = { "TBoxNormalT", "TBoxSmallT", @@ -90,8 +122,7 @@ static char *const sOpenCcNames[] = { dAcTbox_c::dAcTbox_c() : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), - mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE), - field_0x4E8(-1) { + mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE) { sTboxActorList.append(&mTboxListNode); unkByteTargetFiRelated = 2; } @@ -117,7 +148,7 @@ bool dAcTbox_c::createHeap() { return false; } - if (mVariant == 3) { + if (mVariant == GODDESS) { nw4r::g3d::ResFile res = data; if (!res.mFile.IsValid()) { return false; @@ -145,7 +176,7 @@ bool dAcTbox_c::createHeap() { } mMdl1.getModel().setAnm(mAnmGoddessTexSrt); } - } else if (mVariant == 0) { + } else if (mVariant == NORMAL) { nw4r::g3d::ResFile res = data; if (!res.mFile.IsValid()) { return false; @@ -224,13 +255,223 @@ bool dAcTbox_c::createHeap() { return true; } +static u32 sSomeCounters[16] = {}; + +int dAcTbox_c::create() { + if (!isActualVisibleBox()) { + return FAILED; + } + int roomId_tmp = roomid; + if (addActorToRoom(-1)) { + roomid = roomId_tmp; + changeLoadedEntitiesWithSet(); + } + setItemId((ITEM_ID)(rotation.z & 0x1FF)); + if (mItemId > MAX_ITEM_ID) { + return FAILED; + } + mVariant = sItemToTBoxVariant[mItemId]; + if (mVariant == GODDESS) { + setItemId((ITEM_ID)(MAX_ITEM_ID - mItemId)); + } + mSpawnSceneFlag = (params >> 0x14) & 0xFF; + mSetSceneFlag = rotation.x & 0xFF; + setChestFlag(); + field_0x120F = ((rotation.x >> 8) & 1) == 0; + if (!noObstructionCheck()) { + setDoObstructionCheck(); + } + field_0x1208 = (rotation.x >> 0xA) & 0xF; + switch (fn_8026B370()) { + case 0: field_0x120A = 0; break; + case 1: field_0x120A = 1; break; + case 3: field_0x120A = 3; break; + default: field_0x120A = 3; break; + } + rotation.z = 0; + rotation.x = 0; + + // This part of the code checks if there's another chest with similar properties + // and only keeps one of them. + if (fn_80268660(field_0x1208) && !field_0x1210) { + sSomeCounters[field_0x1208]++; + field_0x1210 = true; + } + field_0x120D = 0; + if (fn_8026D670()) { + u32 counterValue = 0; + getSomeCounter(&counterValue); + if (counterValue > 1) { + bool keepGoing = true; + dAcTbox_c *other; + dAcObjBase_c *cursor = nullptr; + do { + cursor = getNextObject(&sTboxActorList, cursor); + other = static_cast(cursor); + if (other != nullptr && this != other && !other->field_0x120D && field_0x1208 == other->field_0x1208) { + keepGoing = false; + } + } while (keepGoing && cursor != nullptr); + + bool b; + if (checkTboxFlag()) { + b = true; + } else if (other->checkTboxFlag()) { + b = false; + } else { + b = fn_8026D560(); + } + + if (b) { + other->deleteRequest(); + field_0x120D = true; + } else { + field_0x120D = true; + return FAILED; + } + } + } + + if (checkTboxFlag() || + (mSetSceneFlag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(roomid, mSetSceneFlag))) { + mHasBeenOpened = true; + } else { + mHasBeenOpened = false; + if (isItemRupee()) { + initDowsingTarget(DowsingTarget::SLOT_RUPEE); + } else if (dAcItem_c::isKeyPiece((ITEM_ID)mItemId)) { + initDowsingTarget(DowsingTarget::SLOT_QUEST); + } else if (dAcItem_c::isTreasure((ITEM_ID)mItemId)) { + initDowsingTarget(DowsingTarget::SLOT_TREASURE); + } + + if (mVariant == GODDESS && StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + initDowsingTargetCube(); + } + } + + if (isItemRupee() || dAcItem_c::isTreasure((ITEM_ID)mItemId)) { + mRegisterDowsingTarget = &dAcTbox_c::registerRupeeOrTreasureDowsing; + mUnregisterDowsingTarget = &dAcTbox_c::unregisterDowsing; + } else if (dAcItem_c::isKeyPiece((ITEM_ID)mItemId)) { + mRegisterDowsingTarget = &dAcTbox_c::registerKeyPieceDowsing; + mUnregisterDowsingTarget = &dAcTbox_c::noUnregisterDowsing; + } else { + mRegisterDowsingTarget = &dAcTbox_c::noRegisterDowsing; + mUnregisterDowsingTarget = &dAcTbox_c::noUnregisterDowsing; + } + + updateMatrix(); + + CREATE_ALLOCATOR(dAcTbox_c); + + mStts.SetRank(0xD); + static const dCcD_SrcUnk s1 = { + sColSrc, + {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, + }; + mCcD3.Set(s1); + mCcD4.SetStts(mStts); + static const dCcD_SrcCyl s2 = { + sColSrc, + {1.0f, 1.0f}, + }; + mCcD4.Set(s2); + mCcD4.SetStts(mStts); + if (mVariant == SMALL) { + // clang-format off + static const dCcD_SrcUnk s3 = {{ + /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, + /* mObjCo */ {0x0}}, + {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, + }; + // clang-format on + field_0x0D48.addCc(mCcD1, s3); + field_0x0D48.addCc(mCcD2, s3); + } else { + // clang-format off + static const dCcD_SrcUnk s4 = {{ + /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, + /* mObjCo */ {0x0}}, + {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, + }; + // clang-format on + field_0x0D48.addCc(mCcD1, s4); + field_0x0D48.addCc(mCcD2, s4); + } + field_0x0D48.SetStts(mStts); + // TODO figure out the right fields + mCcD1.SetTgType(-1); + mCcD2.SetTgType(-1); + mMdl1.setAnm(sAnmNames[mVariant], m3d::PLAY_MODE_4); + if (mHasBeenOpened == true) { + mMdl1.setFrame(mMdl1.getAnm().getEndFrame()); + } else { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + mMdl1.getModel().calc(false); + mMtx_c nodeMtx; + mMdl1.getModel().getNodeWorldMtx(mMdl1.getModel().getNodeID("Cover"), nodeMtx); + + nodeMtx.getTranslation(field_0x11D8); + if (mVariant == GODDESS) { + if (!mHasBeenOpened && StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + mAnmGoddessPat.setFrame(1.0f, 0); + } else { + mAnmGoddessPat.setFrame(0.0f, 0); + } + } + + field_0x11F0 = 0; + switch (mVariant) { + case NORMAL: { + static mVec3_c bbLo = mVec3_c(-65.0f, 0.0f, -100.0f); + static mVec3_c bbUp = mVec3_c(65.0f, 150.0f, 45.0f); + boundingBox.Set(bbLo, bbUp); + } break; + case SMALL: { + static mVec3_c bbLo = mVec3_c(-38.0f, 0.0f, -70.0f); + static mVec3_c bbUp = mVec3_c(38.0f, 110.0f, 35.0f); + boundingBox.Set(bbLo, bbUp); + } break; + case BOSS: { + static mVec3_c bbLo = mVec3_c(-90.0f, 0.0f, -140.0f); + static mVec3_c bbUp = mVec3_c(90.0f, 170.0f, 60.0f); + boundingBox.Set(bbLo, bbUp); + } break; + case GODDESS: { + static mVec3_c bbLo = mVec3_c(-65.0f, 0.0f, -100.0f); + static mVec3_c bbUp = mVec3_c(65.0f, 150.0f, 50.0f); + boundingBox.Set(bbLo, bbUp); + } break; + } + + field_0x11EC = 1.0f; + field_0x11FC = 0; + + field_0x4E8.r = 0; + field_0x4E8.g = 0; + field_0x4E8.b = 0; + + field_0x4EC = 0.0f; + field_0x4DC = position; + field_0x4DC.y += 100.0f; + + return SUCCEEDED; +} + void dAcTbox_c::initializeState_DugOut() {} void dAcTbox_c::executeState_DugOut() {} void dAcTbox_c::finalizeState_DugOut() {} void dAcTbox_c::initializeState_WaitAppear() {} void dAcTbox_c::executeState_WaitAppear() {} void dAcTbox_c::finalizeState_WaitAppear() {} -void dAcTbox_c::initializeState_DemoAppear() {} +void dAcTbox_c::initializeState_DemoAppear() { + // TODO, just referencing this bit of data + mMdl1.setAnm(sAppearAnmName, m3d::PLAY_MODE_4); +} void dAcTbox_c::executeState_DemoAppear() {} void dAcTbox_c::finalizeState_DemoAppear() {} void dAcTbox_c::initializeState_WaitOpen() {} @@ -265,5 +506,5 @@ void dAcTbox_c::executeState_GoddessWait() {} void dAcTbox_c::finalizeState_GoddessWait() {} bool dAcTbox_c::isNotSmall() const { - return mVariant != 1; + return mVariant != SMALL; } From a25ded6d2090d27396070f5703d9cce6246feae5 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 21 Nov 2024 16:38:05 +0100 Subject: [PATCH 05/17] tbox rodata ok --- config/SOUE01/symbols.txt | 54 +- include/d/a/d_a_player.h | 1 + include/d/a/obj/d_a_obj_tbox.h | 38 +- include/d/col/c/c_cc_d.h | 3 + include/d/col/cc/d_cc_d.h | 3 + .../toBeSorted/arc_managers/oarc_manager.h | 2 +- include/toBeSorted/room_manager.h | 4 + src/d/a/obj/d_a_obj_tbox.cpp | 1173 ++++++++++++++++- src/toBeSorted/arc_managers/oarc_manager.cpp | 4 +- 9 files changed, 1238 insertions(+), 44 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d36c353e..5111fa04 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2125,7 +2125,7 @@ fn_80051E40 = .text:0x80051E40; // type:function size:0x64 ColliderManager__staticAddCollider = .text:0x80051EB0; // type:function size:0x34 ColliderLinkedList__registerColliders = .text:0x80051EF0; // type:function size:0x10 fn_80051F00 = .text:0x80051F00; // type:function size:0x8 -setMtx__16TboxAndMoreUnkCCFRC6mMtx_c = .text:0x80051F10; // type:function size:0x10 +SetStts__16TboxAndMoreUnkCCFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 ColliderLinkedList__search = .text:0x80051F20; // type:function size:0x74 fn_80051FA0 = .text:0x80051FA0; // type:function size:0x1C fn_80051FC0 = .text:0x80051FC0; // type:function size:0x10 @@ -2451,7 +2451,7 @@ isSpinAttackingHorizontally = .text:0x8005B830; // type:function size:0x20 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 +setPosYRot__7dAcPy_cFRC7mVec3_c4mAngiii = .text:0x8005B960; // type:function size:0x44 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 @@ -14241,7 +14241,7 @@ fn_802685D0 = .text:0x802685D0; // type:function size:0x68 fn_80268640 = .text:0x80268640; // type:function size:0x4 fn_80268650 = .text:0x80268650; // type:function size:0x8 fn_80268660__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 -hasCollectedAllTears2 = .text:0x80268680; // type:function size:0x1C +hasCollectedAllTears__9dAcTbox_cFv = .text:0x80268680; // type:function size:0x1C fn_802686A0 = .text:0x802686A0; // type:function size:0x50 fn_802686F0 = .text:0x802686F0; // type:function size:0x5C __ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC @@ -14253,24 +14253,24 @@ __dt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c>Fv = .text:0x80268C50; // __dt__9dAcTbox_cFv = .text:0x80268D00; // type:function size:0x250 createHeap__9dAcTbox_cFv = .text:0x80268F50; // type:function size:0x54C create__9dAcTbox_cFv = .text:0x802694A0; // type:function size:0xA00 -AcTbox__destroy = .text:0x80269EA0; // type:function size:0xB4 -AcTbox__update = .text:0x80269F60; // type:function size:0x690 +doDelete__9dAcTbox_cFv = .text:0x80269EA0; // type:function size:0xB4 +actorExecute__9dAcTbox_cFv = .text:0x80269F60; // type:function size:0x690 getStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026A5F0; // type:function size:0x10 executeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026A600; // type:function size:0x10 -AcTbox__updateInEvent = .text:0x8026A610; // type:function size:0x8F0 +actorExecuteInEvent__9dAcTbox_cFv = .text:0x8026A610; // type:function size:0x8F0 changeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8026AF00; // type:function size:0x10 -AcTbox__draw = .text:0x8026AF10; // type:function size:0x1AC -AcTbox__setActionState = .text:0x8026B0C0; // type:function size:0x224 -AcTbox__isValidSubtype = .text:0x8026B2F0; // type:function size:0x20 -fn_8026B310 = .text:0x8026B310; // type:function size:0x8 -fn_8026B320 = .text:0x8026B320; // type:function size:0x8 -setItemId__9dAcTbox_cCFUs = .text:0x8026B330; // type:function size:0x8 +draw__9dAcTbox_cFv = .text:0x8026AF10; // type:function size:0x1AC +setActionState__9dAcTbox_cFv = .text:0x8026B0C0; // type:function size:0x224 +isValidVariant__9dAcTbox_cFi = .text:0x8026B2F0; // type:function size:0x20 +getObjectListEntry__9dAcTbox_cFv = .text:0x8026B310; // type:function size:0x8 +setFlags__9dAcTbox_cFUl = .text:0x8026B320; // type:function size:0x8 +setItemId__9dAcTbox_cFUs = .text:0x8026B330; // type:function size:0x8 setDoObstructionCheck__9dAcTbox_cFv = .text:0x8026B340; // type:function size:0xC isActualVisibleBox__9dAcTbox_cCFv = .text:0x8026B350; // type:function size:0xC noObstructionCheck__9dAcTbox_cCFv = .text:0x8026B360; // type:function size:0xC fn_8026B370__9dAcTbox_cCFv = .text:0x8026B370; // type:function size:0xC -fn_8026B380 = .text:0x8026B380; // type:function size:0x3C -fn_8026B3C0 = .text:0x8026B3C0; // type:function size:0x20 +fn_8026B380__9dAcTbox_cCFR7mVec3_c = .text:0x8026B380; // type:function size:0x3C +fn_8026B3C0__9dAcTbox_cCFv = .text:0x8026B3C0; // type:function size:0x20 initializeState_DugOut__9dAcTbox_cFv = .text:0x8026B3E0; // type:function size:0x11C executeState_DugOut__9dAcTbox_cFv = .text:0x8026B500; // type:function size:0x3D8 finalizeState_DugOut__9dAcTbox_cFv = .text:0x8026B8E0; // type:function size:0x4 @@ -14321,17 +14321,17 @@ AcTbox__checkShouldClose = .text:0x8026D340; // type:function size:0xC AcTbox__setShouldCloseFlag = .text:0x8026D350; // type:function size:0xC AcTbox__unsetShouldCloseFlag = .text:0x8026D360; // type:function size:0xC fn_8026D370 = .text:0x8026D370; // type:function size:0x4C -fn_8026D3C0 = .text:0x8026D3C0; // type:function size:0xD4 +fn_8026D3C0__9dAcTbox_cFv = .text:0x8026D3C0; // type:function size:0xD4 setChestFlag__9dAcTbox_cFv = .text:0x8026D4A0; // type:function size:0x10 AcTbox__setTboxFlag = .text:0x8026D4B0; // type:function size:0x18 checkTboxFlag__9dAcTbox_cCFv = .text:0x8026D4D0; // type:function size:0x4C -fn_8026D520 = .text:0x8026D520; // type:function size:0x18 -fn_8026D540 = .text:0x8026D540; // type:function size:0x14 +isNotSmall__9dAcTbox_cCFv = .text:0x8026D520; // type:function size:0x18 +fn_8026D540__9dAcTbox_cFv = .text:0x8026D540; // type:function size:0x14 fn_8026D560__9dAcTbox_cCFv = .text:0x8026D560; // type:function size:0x94 getSomeCounter__9dAcTbox_cCFPUl = .text:0x8026D600; // type:function size:0x68 fn_8026D670__9dAcTbox_cCFv = .text:0x8026D670; // type:function size:0x8 -fn_8026D680 = .text:0x8026D680; // type:function size:0x10 -ActorObjectBase__setActorCollision = .text:0x8026D690; // type:function size:0xB8 +syncScaleToMdl__9dAcTbox_cFPQ23m3d9scnLeaf_c = .text:0x8026D680; // type:function size:0x10 +initBgW__9dAcTbox_cFR4dBgWPCcPCc = .text:0x8026D690; // type:function size:0xB8 AcTbox__initializeDowsingTarget = .text:0x8026D750; // type:function size:0x14 isItemRupee__9dAcTbox_cCFv = .text:0x8026D770; // type:function size:0x8 initDowsingTarget__9dAcTbox_cFQ213DowsingTarget11DowsingSlot = .text:0x8026D780; // type:function size:0x50 @@ -14343,13 +14343,13 @@ noUnregisterDowsing = .text:0x8026D8F0; // type:function size:0x4 unregisterDowsing = .text:0x8026D900; // type:function size:0x48 fn_8026D950 = .text:0x8026D950; // type:function size:0x28 checkIsClear = .text:0x8026D980; // type:function size:0x140 -fn_8026DAC0 = .text:0x8026DAC0; // type:function size:0x10 -fn_8026DAD0 = .text:0x8026DAD0; // type:function size:0x8 -fn_8026DAE0 = .text:0x8026DAE0; // type:function size:0x28C -fn_8026DD70 = .text:0x8026DD70; // type:function size:0x2DC -AcTbox__getInteractionTargetDef = .text:0x8026E050; // type:function size:0x40 -fn_8026E090 = .text:0x8026E090; // type:function size:0x594 -fn_8026E630 = .text:0x8026E630; // type:function size:0x10C +fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 +fn_8026DAD0__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 +getCylParams__9dAcTbox_cFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C +fn_8026DD70__9dAcTbox_cFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC +getInteractionTargetDef__9dAcTbox_cCFv = .text:0x8026E050; // type:function size:0x40 +fn_8026E090__9dAcTbox_cFv = .text:0x8026E090; // type:function size:0x594 +fn_8026E630__9dAcTbox_cFv = .text:0x8026E630; // type:function size:0x10C build__24sFStateFct_c<9dAcTbox_c>FRC12sStateIDIf_c = .text:0x8026E740; // type:function size:0x60 dispose__24sFStateFct_c<9dAcTbox_c>FRP10sStateIf_c = .text:0x8026E7A0; // type:function size:0xC initialize__21sFState_c<9dAcTbox_c>Fv = .text:0x8026E7B0; // type:function size:0x1C @@ -40233,7 +40233,7 @@ lbl_805758F8 = .sbss:0x805758F8; // type:object size:0x8 data:byte lbl_80575900 = .sbss:0x80575900; // type:object size:0x8 data:byte @GUARD@draw__13dAcObjFairy_cFv@rot = .sbss:0x80575908; // type:object size:0x8 data:byte sTboxActorList__9dAcTbox_c = .sbss:0x80575910; // type:object size:0x8 data:4byte -CURRENT_OBTAINING_ITEM_OARC_NAME = .sbss:0x80575918; // type:object size:0x4 data:4byte +sCurrentObtainingItemOarcName = .sbss:0x80575918; // type:object size:0x4 data:4byte @GUARD@create__9dAcTbox_cFv@s1 = .sbss:0x8057591C; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@s2@0 = .sbss:0x8057591D; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@bbLo@3 = .sbss:0x8057591E; // type:object size:0x1 data:byte diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index a82fb862..139a511a 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -50,6 +50,7 @@ public: virtual ~dAcPy_c(); void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD); + void setPosYRot(const mVec3_c &pos, mAng rot, UNKWORD, UNKWORD, UNKWORD); /* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD); /* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD); diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 659fba39..9e86f68e 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -13,11 +13,13 @@ #include "m/m3d/m_anmmdl.h" #include "m/m3d/m_anmtexpat.h" #include "m/m3d/m_anmtexsrt.h" +#include "m/m3d/m_scnleaf.h" #include "m/m3d/m_smdl.h" #include "m/m_vec.h" #include "nw4r/ut/ut_Color.h" #include "s/s_State.hpp" #include "toBeSorted/actor_event.h" +#include "toBeSorted/attention.h" #include "toBeSorted/dowsing_target.h" #include "toBeSorted/stage_render_stuff.h" @@ -42,6 +44,7 @@ struct TboxAndMoreUnkCC { void addCc(dAcTboxCcD &ccD, const dCcD_SrcUnk &src); void SetStts(cCcD_Stts &stts); + void registerColliders(); }; class dAcTbox_c : public dAcObjBase_c { @@ -63,6 +66,8 @@ public: virtual int actorExecuteInEvent() override; virtual int draw() override; + virtual void *getObjectListEntry() override; + STATE_FUNC_DECLARE(dAcTbox_c, DugOut); STATE_FUNC_DECLARE(dAcTbox_c, WaitAppear); STATE_FUNC_DECLARE(dAcTbox_c, DemoAppear); @@ -80,7 +85,7 @@ public: private: bool initBgW(dBgW &bg, const char *arcName, const char *ccName); bool isNotSmall() const; - void setItemId(u16 item) const; + void setItemId(u16 item); void setChestFlag(); void setDoObstructionCheck(); int isActualVisibleBox() const; @@ -104,6 +109,26 @@ private: void noUnregisterDowsing(); static bool fn_80268660(int arg); + void fn_8026E090(); + void fn_8026E630(); + bool fn_8026D540(); + bool fn_8026D3C0(); + void syncScaleToMdl(m3d::scnLeaf_c *lf); + void fn_8026DD70(mVec3_c *out1, mVec3_c *out2); + void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3); + void fn_8026DAD0(mVec3_c *src, mVec3_c *dest) const; + void fn_8026DAC0(mAng& ang); + + static bool hasCollectedAllTears(); + static bool isValidVariant(int variant); + + void setActionState(); + + void setFlags(u32 flags); + + void fn_8026D140(); + + const InteractionTargetDef &getInteractionTargetDef() const; /* 0x0330 */ m3d::mdlAnmChr mMdl1; /* 0x0398 */ m3d::smdl_c mOpenFxMdl; @@ -142,18 +167,20 @@ private: /* 0x11D8 */ mVec3_c field_0x11D8; - /* 0x11E4 */ u8 field_0x11E4[0x11EC - 0x11E4]; + /* 0x11E4 */ u8 field_0x11E4[0x11E8 - 0x11E4]; + /* 0x11E8 */ f32 field_0x11E8; /* 0x11EC */ f32 field_0x11EC; /* 0x11F0 */ UNKWORD field_0x11F0; + /* 0x11F4 */ UNKWORD field_0x11F4; - /* 0x11F4 */ u8 field_0x11F4[0x11FC - 0x11F4]; + /* 0x11F8 */ u8 field_0x11F8[0x11FC - 0x11F8]; /* 0x11FC */ UNKWORD field_0x11FC; /* 0x1200 */ u16 mItemId; - /* 0x1202 */ u8 field_0x1202[0x1204 - 0x1202]; + /* 0x1202 */ u16 mItemModelIdx; /* 0x1204 */ bool mHasBeenOpened; /* 0x1205 */ u8 mSpawnSceneFlag; @@ -165,7 +192,8 @@ private: /* 0x1209 */ u8 mVariant; /* 0x120A */ u8 field_0x120A; - /* 0x120B */ u8 field_0x120B[0x120D - 0x120B]; + /* 0x120B */ u8 field_0x120B; + /* 0x120C */ u8 field_0x120C; /* 0x120D */ u8 field_0x120D; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 49791e31..44f43d3b 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -889,6 +889,9 @@ public: void OnTgSet() { mTg.OnSPrm(1); } + void OffTgSet() { + mTg.OffSPrm(1); + } u32 GetTgGrp() const { return mTg.MskSPrm(0x3E); } diff --git a/include/d/col/cc/d_cc_d.h b/include/d/col/cc/d_cc_d.h index 2242323e..3c5bc793 100644 --- a/include/d/col/cc/d_cc_d.h +++ b/include/d/col/cc/d_cc_d.h @@ -83,6 +83,9 @@ public: virtual cCcD_ShapeAttr *GetShapeAttr() override; + // Have to bring these in scope. Consider renaming this + // Set function instead or create an inline? + using cM3dGUnk::Set; void Set(const dCcD_SrcUnk &src); }; diff --git a/include/toBeSorted/arc_managers/oarc_manager.h b/include/toBeSorted/arc_managers/oarc_manager.h index aee63e1a..7bbe22d5 100644 --- a/include/toBeSorted/arc_managers/oarc_manager.h +++ b/include/toBeSorted/arc_managers/oarc_manager.h @@ -19,7 +19,7 @@ public: bool checkIfObjectArcExistsOnDisk(const char *object); bool loadObjectArcFromDisk(const char *object, EGG::Heap *heap); bool addEntryFromSuperArc(const char *object, void *data, EGG::Heap *heap); - void ensureLoaded1(const char *object); + int ensureLoaded1(const char *object); void ensureLoaded2(const char *object); bool decrement(const char *path); void *getData(const char *oarcName, const char *fileName); diff --git a/include/toBeSorted/room_manager.h b/include/toBeSorted/room_manager.h index 04f5d491..fcc5688a 100644 --- a/include/toBeSorted/room_manager.h +++ b/include/toBeSorted/room_manager.h @@ -60,6 +60,10 @@ public: char _7[3]; bool hasAnmTexPat; bool didAlreadyInit; + + bool checkFlag(u32 flag) { + return flags & flag; + } }; class dRoomTable { diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 11dcd85b..702e8f92 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1,9 +1,12 @@ #include "d/a/obj/d_a_obj_tbox.h" +#include "c/c_lib.h" #include "common.h" #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" +#include "d/a/d_a_player.h" #include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "m/m3d/m_fanm.h" @@ -14,7 +17,11 @@ #include "nw4r/g3d/g3d_resanmtexsrt.h" #include "nw4r/g3d/g3d_resfile.h" #include "nw4r/g3d/g3d_resmdl.h" +#include "s/s_Math.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/attention.h" #include "toBeSorted/dowsing_target.h" +#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); @@ -42,6 +49,7 @@ STATE_DEFINE(dAcTbox_c, Wait); STATE_DEFINE(dAcTbox_c, GoddessWait); fLiMgBa_c dAcTbox_c::sTboxActorList; +static const char *sCurrentObtainingItemOarcName = nullptr; static char *const sArcNames[] = { "TBoxNormalT", @@ -69,11 +77,634 @@ extern "C" char *const sOpenEventNames[] = { // TODO just copied from somewhere const cCcD_SrcGObj dAcTbox_c::sColSrc = { /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, - /* mObjCo */ {0x0} + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0, {0, 0x407}, 0, 0}, + /* mObjCo */ {0xE9} }; // clang-format on +static const char sGetTriForce[] = "GetTriForce"; +static const char sGetSwordA[] = "GetSwordA"; +static const char sGetHarp[] = "GetHarp"; +static const char sGetSirenFlower[] = "GetSirenFlower"; +static const char sGetBowA[] = "GetBowA"; +static const char sGetHookShot[] = "GetHookShot"; +static const char sGetBirdStatue[] = "GetBirdStatue"; +static const char sGetKeyBoss2A[] = "GetKeyBoss2A"; +static const char sGetKeyBoss2B[] = "GetKeyBoss2B"; +static const char sGetKeyBoss2C[] = "GetKeyBoss2C"; +static const char sGetKeyKakeraA[] = "GetKeyKakeraA"; +static const char sGetKeyBossA[] = "GetKeyBossA"; +static const char sGetKeyBossB[] = "GetKeyBossB"; +static const char sGetKeyBossC[] = "GetKeyBossC"; +static const char sGetGenki[] = "GetGenki"; +static const char sGetBottleKinokoA[] = "GetBottleKinokoA"; +static const char sGetBomb[] = "GetBomb"; +static const char sGetVacuum[] = "GetVacuum"; +static const char sGetMap[] = "GetMap"; +static const char sGetBeetleA[] = "GetBeetleA"; +static const char sGetBottleWater[] = "GetBottleWater"; +static const char sGetBottleKinokoB[] = "GetBottleKinokoB"; +static const char sGetMoleGloveA[] = "GetMoleGloveA"; +static const char sGetSeedSet[] = "GetSeedSet"; +static const char sGetBottleMuteki[] = "GetBottleMuteki"; +static const char sGetUroko[] = "GetUroko"; +static const char sGetMedal[] = "GetMedal"; +static const char sGetNetA[] = "GetNetA"; +static const char sGetFairy[] = "GetFairy"; +static const char sGetBottleHoly[] = "GetBottleHoly"; +static const char sGetBeetleB[] = "GetBeetleB"; +static const char sGetBeetleC[] = "GetBeetleC"; +static const char sGetBeetleD[] = "GetBeetleD"; +static const char sGetBottleKusuri[] = "GetBottleKusuri"; +static const char sGetBottleKusuriS[] = "GetBottleKusuriS"; +static const char sGetBottleGuts[] = "GetBottleGuts"; +static const char sGetBottleAir[] = "GetBottleAir"; +static const char sGetBottleFairy[] = "GetBottleFairy"; +static const char sGetBowB[] = "GetBowB"; +static const char sGetBowC[] = "GetBowC"; +static const char sGetBombBag[] = "GetBombBag"; +static const char sGetRupee[] = "GetRupee"; +static const char sGetMoleGloveB[] = "GetMoleGloveB"; +static const char sGetPachinkoB[] = "GetPachinkoB"; +static const char sGetPurseB[] = "GetPurseB"; +static const char sGetPurseC[] = "GetPurseC"; +static const char sGetPurseD[] = "GetPurseD"; +static const char sGetPurseE[] = "GetPurseE"; +static const char sGetPouchA[] = "GetPouchA"; +static const char sGetPouchB[] = "GetPouchB"; +static const char sGetShieldWood[] = "GetShieldWood"; +static const char sGetShieldIron[] = "GetShieldIron"; +static const char sGetShieldHoly[] = "GetShieldHoly"; +static const char sGetShieldHylia[] = "GetShieldHylia"; +static const char sGetBottleRepair[] = "GetBottleRepair"; +static const char sGetSpareSeedA[] = "GetSpareSeedA"; +static const char sGetSpareSeedB[] = "GetSpareSeedB"; +static const char sGetSpareSeedC[] = "GetSpareSeedC"; +static const char sGetSpareQuiverA[] = "GetSpareQuiverA"; +static const char sGetSpareQuiverB[] = "GetSpareQuiverB"; +static const char sGetSpareQuiverC[] = "GetSpareQuiverC"; +static const char sGetSpareBombBagA[] = "GetSpareBombBagA"; +static const char sGetSpareBombBagB[] = "GetSpareBombBagB"; +static const char sGetSpareBombBagC[] = "GetSpareBombBagC"; +static const char sGetWhip[] = "GetWhip"; +static const char sGetEarring[] = "GetEarring"; +static const char sGetNetB[] = "GetNetB"; +static const char sGetInsectGrasshopper[] = "GetInsectGrasshopper"; +static const char sGetInsectBeetle[] = "GetInsectBeetle"; +static const char sGetInsectBee[] = "GetInsectBee"; +static const char sGetInsectKamakiri[] = "GetInsectKamakiri"; +static const char sGetInsectLadybug[] = "GetInsectLadybug"; +static const char sGetInsectButterfly[] = "GetInsectButterfly"; +static const char sGetInsectAnt[] = "GetInsectAnt"; +static const char sGetInsectCicada[] = "GetInsectCicada"; +static const char sGetInsectDragonfly[] = "GetInsectDragonfly"; +static const char sGetInsectScarab[] = "GetInsectScarab"; +static const char sGetInsectKuwagata[] = "GetInsectKuwagata"; +static const char sGetInsectFirefly[] = "GetInsectFirefly"; +static const char sGetBottleEmpty[] = "GetBottleEmpty"; +static const char sGetKobunALetter[] = "GetKobunALetter"; +static const char sGetTerryCage[] = "GetTerryCage"; +static const char sGetSozaiA[] = "GetSozaiA"; +static const char sGetSozaiB[] = "GetSozaiB"; +static const char sGetSozaiC[] = "GetSozaiC"; +static const char sGetSozaiD[] = "GetSozaiD"; +static const char sGetSozaiE[] = "GetSozaiE"; +static const char sGetSozaiF[] = "GetSozaiF"; +static const char sGetSozaiG[] = "GetSozaiG"; +static const char sGetSozaiH[] = "GetSozaiH"; +static const char sGetSozaiI[] = "GetSozaiI"; +static const char sGetSozaiJ[] = "GetSozaiJ"; +static const char sGetSozaiL[] = "GetSozaiL"; +static const char sGetSozaiK[] = "GetSozaiK"; +static const char sGetSozaiM[] = "GetSozaiM"; +static const char sGetSozaiN[] = "GetSozaiN"; +static const char sGetSozaiO[] = "GetSozaiO"; +static const char sGetSozaiP[] = "GetSozaiP"; +static const char sGetSekibanMapA[] = "GetSekibanMapA"; +static const char sGetSekibanMapB[] = "GetSekibanMapB"; +static const char sGetSekibanMapC[] = "GetSekibanMapC"; +static const char sGetSirenKey[] = "GetSirenKey"; +static const char sGetBottleRepairS[] = "GetBottleRepairS"; +static const char sGetBottlePumpkin[] = "GetBottlePumpkin"; +static const char sGetSeedLife[] = "GetSeedLife"; +static const char sGetFruitB[] = "GetFruitB"; +static const char sGetSparePurse[] = "GetSparePurse"; + +static const char *const sItemToArchiveName[MAX_ITEM_ID + 1] = { + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetTriForce, + nullptr, + nullptr, + nullptr, + nullptr, + sGetSwordA, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetHarp, + sGetSirenFlower, + nullptr, + sGetBowA, + sGetHookShot, + sGetBirdStatue, + nullptr, + nullptr, + nullptr, + sGetKeyBoss2A, + sGetKeyBoss2B, + sGetKeyBoss2C, + sGetKeyKakeraA, + sGetKeyBossA, + sGetKeyBossB, + sGetKeyBossC, + nullptr, + nullptr, + nullptr, + sGetGenki, + sGetBottleKinokoA, + nullptr, + nullptr, + nullptr, + sGetBomb, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetGenki, + sGetVacuum, + sGetMap, + sGetMap, + nullptr, + sGetBeetleA, + sGetBottleWater, + sGetBottleKinokoB, + sGetMoleGloveA, + nullptr, + nullptr, + nullptr, + sGetSeedSet, + nullptr, + nullptr, + nullptr, + nullptr, + sGetBottleMuteki, + sGetBottleMuteki, + nullptr, + sGetUroko, + nullptr, + sGetMedal, + sGetNetA, + sGetFairy, + nullptr, + sGetBottleHoly, + sGetBeetleB, + sGetBeetleC, + sGetBeetleD, + sGetBottleKusuri, + sGetBottleKusuri, + nullptr, + sGetBottleKusuriS, + nullptr, + nullptr, + sGetBottleGuts, + sGetBottleGuts, + sGetBottleAir, + sGetBottleAir, + sGetBottleFairy, + nullptr, + sGetBowB, + sGetBowC, + sGetBombBag, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetRupee, + sGetMoleGloveB, + sGetMedal, + sGetMedal, + sGetMedal, + sGetMedal, + sGetMedal, + sGetPachinkoB, + nullptr, + nullptr, + sGetPurseB, + sGetPurseC, + sGetPurseD, + sGetPurseE, + sGetPouchA, + sGetPouchB, + sGetMedal, + nullptr, + sGetShieldWood, + sGetShieldWood, + sGetShieldWood, + sGetShieldIron, + sGetShieldIron, + sGetShieldIron, + sGetShieldHoly, + sGetShieldHoly, + sGetShieldHoly, + sGetShieldHylia, + sGetBottleRepair, + sGetBottleRepair, + sGetSpareSeedA, + sGetSpareSeedB, + sGetSpareSeedC, + sGetSpareQuiverA, + sGetSpareQuiverB, + sGetSpareQuiverC, + sGetSpareBombBagA, + sGetSpareBombBagB, + sGetSpareBombBagC, + sGetWhip, + sGetEarring, + nullptr, + sGetNetB, + sGetInsectGrasshopper, + sGetInsectBeetle, + sGetInsectBee, + sGetInsectKamakiri, + sGetInsectLadybug, + sGetInsectButterfly, + sGetInsectAnt, + sGetInsectCicada, + sGetInsectDragonfly, + sGetInsectScarab, + sGetInsectKuwagata, + sGetInsectFirefly, + sGetBottleEmpty, + nullptr, + nullptr, + nullptr, + nullptr, + sGetKobunALetter, + sGetTerryCage, + nullptr, + sGetSozaiA, + sGetSozaiB, + sGetSozaiC, + sGetSozaiD, + sGetSozaiE, + sGetSozaiF, + sGetSozaiG, + sGetSozaiH, + sGetSozaiI, + sGetSozaiJ, + sGetSozaiL, // not alphabetical + sGetSozaiK, // not alphabetical + sGetSozaiM, + sGetSozaiN, + sGetSozaiO, + sGetSozaiP, + sGetSekibanMapA, + sGetSekibanMapB, + sGetSekibanMapC, + sGetSirenKey, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetBottleRepairS, + sGetBottlePumpkin, + sGetBottlePumpkin, + sGetSeedLife, + sGetFruitB, + sGetSparePurse, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, +}; + // TODO enum, item comments static const u8 sItemToTBoxVariant[MAX_ITEM_ID + 1] = { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, @@ -123,6 +754,9 @@ static char *const sOpenCcNames[] = { dAcTbox_c::dAcTbox_c() : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE) { + field_0x120B = 0; + field_0x120E = 0; + mDoObstructedCheck = false; sTboxActorList.append(&mTboxListNode); unkByteTargetFiRelated = 2; } @@ -382,7 +1016,7 @@ int dAcTbox_c::create() { // clang-format off static const dCcD_SrcUnk s3 = {{ /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {7, 0x407}, 0, 0}, /* mObjCo */ {0x0}}, {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; @@ -393,7 +1027,7 @@ int dAcTbox_c::create() { // clang-format off static const dCcD_SrcUnk s4 = {{ /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {6, 0x407}, 0, 0}, /* mObjCo */ {0x0}}, {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; @@ -456,17 +1090,494 @@ int dAcTbox_c::create() { field_0x4E8.b = 0; field_0x4EC = 0.0f; - field_0x4DC = position; - field_0x4DC.y += 100.0f; + field_0x4DC.x = position.x; + field_0x4DC.z = position.z; + field_0x4DC.y = position.y + 100.0f; return SUCCEEDED; } +int dAcTbox_c::doDelete() { + if (field_0x1210 != 0) { + sSomeCounters[field_0x1208]--; + field_0x1210 = 0; + } + if (sCurrentObtainingItemOarcName != nullptr) { + OarcManager *mng = OarcManager::sInstance; + if (!mng->ensureLoaded1(sCurrentObtainingItemOarcName)) { + mng->decrement(sCurrentObtainingItemOarcName); + sCurrentObtainingItemOarcName = nullptr; + } + } + + if (sCurrentObtainingItemOarcName == nullptr) { + changeLoadedEntitiesNoSet(); + return SUCCEEDED; + } + return NOT_READY; +} + +int dAcTbox_c::actorExecute() { + if (field_0x120D != 0) { + deleteRequest(); + return SUCCEEDED; + } + + setActionState(); + if (mStateMgr.isState(StateID_WaitOpen) || mStateMgr.isState(StateID_GoddessWaitOn)) { + (this->*mRegisterDowsingTarget)(); + } + + dRoom *r = RoomManager::m_Instance->GetRoomByIndex(roomid); + bool hasFlags = r->checkFlag(0x1E); + if (hasFlags) { + setObjectProperty(0x200); + } else { + clearObjectProperty(0x200); + } + + if (hasFlags) { + return SUCCEEDED; + } + + fn_8026E090(); + fn_8026E630(); + mStateMgr.executeState(); + if (fn_8026D540()) { + fn_8026D3C0(); + } + if (mVariant == GODDESS && mAnmGoddessPat.getFrame(0) == 1.0f) { + mAnmGoddessTexSrt.play(); + } + syncScaleToMdl(&mMdl1.getModel()); + mMdl1.getModel().calc(false); + if ((field_0x11F4 & 2) != 0) { + mVec3_c v1, v2; + fn_8026DD70(&v1, &v2); + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD3.Set(v1, v2); + mCcD3.Set(position, rotation.y); + mVec3_c cylC; + f32 width, height; + getCylParams(&cylC, &width, &height); + mCcD4.SetC(cylC); + mCcD4.SetR(width); + mCcD4.SetH(height); + dCcS::GetInstance()->Set(&mCcD4); + + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 100.0f, 42.0f); + break; + case 1: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 62.0f, 42.0f); + break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 35.0f); + break; + case 1: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 31.0f); + break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: + v1.set(-90.0f, 0.0f, -53.0f); + v2.set(90.0f, 133.0f, 56.0f); + break; + case 1: + v1.set(-80.0f, 0.0f, -53.0f); + v2.set(80.0f, 62.0f, 60.0f); + break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 100.0f, 47.0f); + break; + case 1: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 62.0f, 55.0f); + break; + } + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD1.Set(v1, v2); + mCcD1.Set(position, rotation.y); + if (field_0x120C == 1) { + mCcD2.OnTgSet(); + switch ((u32)mVariant) { + case NORMAL: + v1.set(-61.0f, 0.0f, -50.0f); + v2.set(61.0f, 80.0f, 0.0); + break; + case SMALL: + v1.set(-38.0f, -5.0f, -35.0f); + v2.set(38.0f, 65.0f, 0.0f); + break; + case BOSS: + v1.set(-90.0f, -10.0f, -85.0f); + v2.set(90.0f, 105.0f, 0.0f); + break; + case GODDESS: + v1.set(-62.0f, 0.0f, -57.0f); + v2.set(62.0f, 80.0f, 0.0f); + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD2.Set(v1, v2); + mCcD2.Set(field_0x11D8, rotation.y); + } else { + mCcD2.OffTgSet(); + } + field_0x0D48.registerColliders(); + } + + return SUCCEEDED; +} + +int dAcTbox_c::actorExecuteInEvent() { + if (field_0x120D != 0) { + deleteRequest(); + return SUCCEEDED; + } + + setActionState(); + if (mStateMgr.isState(StateID_WaitOpen) || mStateMgr.isState(StateID_GoddessWaitOn)) { + (this->*mRegisterDowsingTarget)(); + } + + dRoom *r = RoomManager::m_Instance->GetRoomByIndex(roomid); + bool hasFlags = r->checkFlag(0x1E); + if (hasFlags) { + setObjectProperty(0x200); + } else { + clearObjectProperty(0x200); + } + + if (hasFlags) { + return SUCCEEDED; + } + + fn_8026E090(); + fn_8026E630(); + + switch (mEvent.getCurrentEventCommand()) { + case 'wait': mEvent.advanceNext(); break; + case 'open': + if (mEvent.isAdvance()) { + if (mItemId == 0) { + mItemModelIdx = 0x10; + mStateMgr.changeState(StateID_DeleteArchive); + } else { + mStateMgr.changeState(StateID_Open); + } + } + mStateMgr.executeState(); + break; + case 'aper': + if (mEvent.isAdvance()) { + mStateMgr.changeState(StateID_DemoAppear); + } + mStateMgr.executeState(); + break; + case 'crct': { + mVec3_c v1; + mAng a1; + fn_8026DAD0(&v4, &v1); + fn_8026DAC0(a1); + dAcPy_c *link = dAcPy_c::LINK; + if (field_0x120B < 3) { + mVec3_c pos = link->position; + f32 f9 = cLib::addCalcPosXZ(&pos, v1, 0.25, 200.0f, 0.1f); + s16 rot2 = link->rotation.y; + s16 d = sLib::addCalcAngle(&rot2, a1, 2, 0x3FFF, 1); + if (f9 < 1.0f && labs(d) < 0xB6) { + link->setPosYRot(v1, a1, 0, 0, 0); + mEvent.advanceNext(); + } else { + link->setPosYRot(pos, rot2, 0, 0, 0); + } + } else { + link->setPosYRot(v1, a1, 0, 0, 0); + mEvent.advanceNext(); + } + + if (field_0x120B < 0xFF) { + field_0x120B++; + } + } break; + case '????': mStateMgr.executeState(); break; + default: mEvent.advanceNext(); break; + } + + // copied from actorExecute + if (fn_8026D540()) { + fn_8026D3C0(); + } + if (mVariant == GODDESS && mAnmGoddessPat.getFrame(0) == 1.0f) { + mAnmGoddessTexSrt.play(); + } + syncScaleToMdl(&mMdl1.getModel()); + mMdl1.getModel().calc(false); + if ((field_0x11F4 & 2) != 0) { + mVec3_c v1, v2; + fn_8026DD70(&v1, &v2); + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD3.Set(v1, v2); + mCcD3.Set(position, rotation.y); + mVec3_c cylC; + f32 width, height; + getCylParams(&cylC, &width, &height); + mCcD4.SetC(cylC); + mCcD4.SetR(width); + mCcD4.SetH(height); + dCcS::GetInstance()->Set(&mCcD4); + + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 100.0f, 42.0f); + break; + case 1: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 62.0f, 42.0f); + break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 35.0f); + break; + case 1: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 31.0f); + break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: + v1.set(-90.0f, 0.0f, -53.0f); + v2.set(90.0f, 133.0f, 56.0f); + break; + case 1: + v1.set(-80.0f, 0.0f, -53.0f); + v2.set(80.0f, 62.0f, 60.0f); + break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 100.0f, 47.0f); + break; + case 1: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 62.0f, 55.0f); + break; + } + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD1.Set(v1, v2); + mCcD1.Set(position, rotation.y); + if (field_0x120C == 1) { + mCcD2.OnTgSet(); + switch ((u32)mVariant) { + case NORMAL: + v1.set(-61.0f, 0.0f, -50.0f); + v2.set(61.0f, 80.0f, 0.0); + break; + case SMALL: + v1.set(-38.0f, -5.0f, -35.0f); + v2.set(38.0f, 65.0f, 0.0f); + break; + case BOSS: + v1.set(-90.0f, -10.0f, -85.0f); + v2.set(90.0f, 105.0f, 0.0f); + break; + case GODDESS: + v1.set(-62.0f, 0.0f, -57.0f); + v2.set(62.0f, 80.0f, 0.0f); + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD2.Set(v1, v2); + mCcD2.Set(field_0x11D8, rotation.y); + } else { + mCcD2.OffTgSet(); + } + field_0x0D48.registerColliders(); + } + + return SUCCEEDED; +} + +int dAcTbox_c::draw() { + bool isInvisible = fabsf(mScale.x) <= FLT_EPSILON; + if (isInvisible) { + return SUCCEEDED; + } + + drawModelType1(&mMdl1.getModel()); + if (fn_8026D540()) { + drawModelType1(&mOpenFxMdl); + } + + static mQuat_c shadowDirs[4] = { + mQuat_c(0.0f, 45.0f, 0.0f, 100.0f), + mQuat_c(0.0f, 25.0f, 0.0f, 80.0f), + mQuat_c(0.0f, 55.0f, 0.0f, 120.0f), + mQuat_c(0.0f, 45.0f, 0.0f, 100.0f), + }; + + drawShadow(mShadowCircle, nullptr, mWorldMtx, &shadowDirs[mVariant], -1, -1, -1, -1, -1, 0.0f); + + return SUCCEEDED; +} + +void dAcTbox_c::setActionState() { + if (!field_0x120E) { + if (field_0x120F) { + mStateMgr.changeState(StateID_DugOut); + } else if (mHasBeenOpened == 1) { + if (mVariant == GODDESS) { + mStateMgr.changeState(StateID_GoddessWait); + } else { + mStateMgr.changeState(StateID_Wait); + } + } else if (mVariant == GODDESS) { + if (StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + mStateMgr.changeState(StateID_GoddessWaitOn); + } else { + mStateMgr.changeState(StateID_GoddessWaitOff); + } + } else if (mVariant == NORMAL) { + switch (field_0x120A) { + case 0: + if (hasCollectedAllTears()) { + mStateMgr.changeState(StateID_WaitOpen); + } else { + mStateMgr.changeState(StateID_WaitAppear); + } + break; + case 1: mStateMgr.changeState(StateID_WaitOpen); break; + case 3: + if (mSpawnSceneFlag >= 0xFF || + SceneflagManager::sInstance->checkBoolFlag(roomid, mSpawnSceneFlag)) { + mStateMgr.changeState(StateID_WaitOpen); + } else { + mStateMgr.changeState(StateID_WaitAppear); + } + break; + } + } else { + mStateMgr.changeState(StateID_WaitOpen); + } + field_0x120E = true; + } +} + +bool dAcTbox_c::isValidVariant(int variant) { + return 0 <= variant && variant <= 3; +} + +void *dAcTbox_c::getObjectListEntry() { + return &mTboxListNode; +} + +void dAcTbox_c::setFlags(u32 flags) { + field_0x11F4 = flags; +} + +void dAcTbox_c::setItemId(u16 itemId) { + mItemId = itemId; +} + +void dAcTbox_c::setDoObstructionCheck() { + mDoObstructedCheck = true; +} + +int dAcTbox_c::isActualVisibleBox() const { + return (params >> 0x1C); +} + +bool dAcTbox_c::noObstructionCheck() const { + return (rotation.x >> 9) & 1; +} + +int dAcTbox_c::fn_8026B370() const { + return (rotation.x >> 0xE) & 0x3; +} + +void dAcTbox_c::fn_8026B380(mVec3_c &out) const { + if (mVariant == BOSS) { + out.x = position.x; + out.y = position.y; + out.z = position.z; + } else { + fn_8026DAD0(&v1, &out); + } +} + +const mVec3_c &dAcTbox_c::fn_8026B3C0() const { + if (mVariant == BOSS) { + return v3; + } + return v2; +} + void dAcTbox_c::initializeState_DugOut() {} void dAcTbox_c::executeState_DugOut() {} void dAcTbox_c::finalizeState_DugOut() {} -void dAcTbox_c::initializeState_WaitAppear() {} -void dAcTbox_c::executeState_WaitAppear() {} +void dAcTbox_c::initializeState_WaitAppear() { + mScale.set(0.0f, 0.0f, 0.0f); + setActorProperty(0x100); + fn_8026D140(); + field_0x11E8 = 0.0f; + field_0x11F4 &= ~0x2; + field_0x120C = 0; + // field_0x11C0 +} +void dAcTbox_c::executeState_WaitAppear() { + // @bug doIt is uninitialized here, so WaitAppear is UB unless field_0x120A == 0 or field_0x120A == 3 + bool doIt; + switch (field_0x120A) { + case 0: doIt = hasCollectedAllTears(); break; + case 3: doIt = SceneflagManager::sInstance->checkBoolFlag(roomid, mSpawnSceneFlag); break; + } + + if (doIt) { + Event e("TboxShow", 100, 0x100001, nullptr, nullptr); + mEvent.scheduleEvent(e, 0); + } +} void dAcTbox_c::finalizeState_WaitAppear() {} void dAcTbox_c::initializeState_DemoAppear() { // TODO, just referencing this bit of data @@ -484,7 +1595,23 @@ void dAcTbox_c::initializeState_GoddessWaitOn() {} void dAcTbox_c::executeState_GoddessWaitOn() {} void dAcTbox_c::finalizeState_GoddessWaitOn() {} void dAcTbox_c::initializeState_DeleteArchive() {} -void dAcTbox_c::executeState_DeleteArchive() {} +void dAcTbox_c::executeState_DeleteArchive() { + if (sCurrentObtainingItemOarcName != nullptr) { + OarcManager *mng = OarcManager::sInstance; + if (!mng->ensureLoaded1(sCurrentObtainingItemOarcName)) { + mng->decrement(sCurrentObtainingItemOarcName); + sCurrentObtainingItemOarcName = nullptr; + } + } + + if (sCurrentObtainingItemOarcName == nullptr) { + if (sItemToArchiveName[mItemModelIdx] == nullptr) { + mStateMgr.changeState(StateID_Open); + } else { + mStateMgr.changeState(StateID_LoadArchive); + } + } +} void dAcTbox_c::finalizeState_DeleteArchive() {} void dAcTbox_c::initializeState_LoadArchive() {} void dAcTbox_c::executeState_LoadArchive() {} @@ -508,3 +1635,31 @@ void dAcTbox_c::finalizeState_GoddessWait() {} bool dAcTbox_c::isNotSmall() const { return mVariant != SMALL; } + +extern "C" const u32 DAT_804ee478[] = {0, 0, 1, 1}; + +const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { + switch ((u32)mVariant) { + case NORMAL: + default: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 200.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + case SMALL: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 160.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + case BOSS: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 200.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + case GODDESS: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 200.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + } +} diff --git a/src/toBeSorted/arc_managers/oarc_manager.cpp b/src/toBeSorted/arc_managers/oarc_manager.cpp index 1faec959..1f858b41 100644 --- a/src/toBeSorted/arc_managers/oarc_manager.cpp +++ b/src/toBeSorted/arc_managers/oarc_manager.cpp @@ -35,8 +35,8 @@ bool OarcManager::addEntryFromSuperArc(const char *object, void *data, EGG::Heap return mArcTable.addEntryFromSuperArc(object, data, 0, heap); } -void OarcManager::ensureLoaded1(const char *object) { - mArcTable.ensureLoadedMaybe2(object); +int OarcManager::ensureLoaded1(const char *object) { + return mArcTable.ensureLoadedMaybe2(object); } void OarcManager::ensureLoaded2(const char *object) { From 9f75ed2cb1282c03b8615d5d9ccab5486c6d8a82 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 21 Nov 2024 16:49:32 +0100 Subject: [PATCH 06/17] tbox splits --- config/SOUE01/splits.txt | 2 ++ config/SOUE01/symbols.txt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 804eaef8..7af7199a 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -642,6 +642,8 @@ d/a/obj/d_a_obj_tbox.cpp: .ctors start:0x804DB83C end:0x804DB840 .rodata start:0x804ED3B0 end:0x804EE548 .data start:0x80535270 end:0x80535A18 + .sdata start:0x80573A48 end:0x80573A50 + .sbss start:0x80575910 end:0x80575928 .sdata2 start:0x8057C238 end:0x8057C3F0 .bss start:0x805B4FA8 end:0x805B5458 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 5111fa04..4fef582e 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -40244,7 +40244,7 @@ sCurrentObtainingItemOarcName = .sbss:0x80575918; // type:object size:0x4 data:4 @GUARD@create__9dAcTbox_cFv@bbUp@8 = .sbss:0x80575923; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@bbLo@9 = .sbss:0x80575924; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@bbUp@10 = .sbss:0x80575925; // type:object size:0x1 data:byte -lbl_80575926 = .sbss:0x80575926; // type:object size:0x1 data:byte +@GUARD@draw__9dAcTbox_cFv@shadowDirs = .sbss:0x80575926; // type:object size:0x1 data:byte lbl_80575927 = .sbss:0x80575927; // type:object size:0x1 data:byte lbl_80575928 = .sbss:0x80575928; // type:object size:0x8 data:byte TgMassObj__MASS_OBJ_TAG_PTR = .sbss:0x80575930; // type:object size:0x4 data:4byte From 15d932d1eac1a32dfb053130710393fff6368c43 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 21 Nov 2024 21:22:50 +0100 Subject: [PATCH 07/17] progress --- config/SOUE01/symbols.txt | 32 +-- include/d/a/d_a_item.h | 1 + include/d/a/obj/d_a_obj_tbox.h | 25 +- include/d/col/c/c_cc_d.h | 3 - src/d/a/obj/d_a_obj_tbox.cpp | 423 +++++++++++++++++++++++++++++++-- 5 files changed, 438 insertions(+), 46 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4fef582e..4a925660 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13486,7 +13486,7 @@ AcItem__isSemiRareTreasure = .text:0x80250AE0; // type:function size:0x10 AcItem__isRareTreasure = .text:0x80250AF0; // type:function size:0x10 fn_80250B00 = .text:0x80250B00; // type:function size:0x10 fn_80250B10 = .text:0x80250B10; // type:function size:0x10 -AcItem__isRupee = .text:0x80250B20; // type:function size:0x88 +isRupee__9dAcItem_cF7ITEM_ID = .text:0x80250B20; // type:function size:0x88 AcItem__isBombDrop = .text:0x80250BB0; // type:function size:0x58 AcItem__isTear2 = .text:0x80250C10; // type:function size:0x78 AcItem__is_Larvae_Ore_JellyBlob_Claw_Horn_EvilCryst_OrnSkull_GoldSkull = .text:0x80250C90; // type:function size:0xB8 @@ -14243,7 +14243,7 @@ fn_80268650 = .text:0x80268650; // type:function size:0x8 fn_80268660__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 hasCollectedAllTears__9dAcTbox_cFv = .text:0x80268680; // type:function size:0x1C fn_802686A0 = .text:0x802686A0; // type:function size:0x50 -fn_802686F0 = .text:0x802686F0; // type:function size:0x5C +fn_802686F0__9dAcTbox_cFRC7mVec3_cf = .text:0x802686F0; // type:function size:0x5C __ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC __dt__10dAcTboxCcDFv = .text:0x80268A40; // type:function size:0x98 __dt__21sFState_c<9dAcTbox_c>Fv = .text:0x80268AE0; // type:function size:0x58 @@ -14310,13 +14310,13 @@ finalizeState_Wait__9dAcTbox_cFv = .text:0x8026D000; // type:function size:0x4 initializeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D010; // type:function size:0x70 executeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D080; // type:function size:0x74 finalizeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D100; // type:function size:0x4 -fn_8026D110 = .text:0x8026D110; // type:function size:0x8 +getDowsingTargetOffset__9dAcTbox_cCFP7mVec3_c = .text:0x8026D110; // type:function size:0x8 fn_8026D120 = .text:0x8026D120; // type:function size:0x8 fn_8026D130 = .text:0x8026D130; // type:function size:0x10 -fn_8026D140 = .text:0x8026D140; // type:function size:0x10 +fn_8026D140__9dAcTbox_cFv = .text:0x8026D140; // type:function size:0x10 AcTbox__doInteraction = .text:0x8026D150; // type:function size:0x98 -fn_8026D1F0 = .text:0x8026D1F0; // type:function size:0xDC -fn_8026D2D0 = .text:0x8026D2D0; // type:function size:0x68 +registerInEvent__9dAcTbox_cFv = .text:0x8026D1F0; // type:function size:0xDC +unkVirtFunc_0x6C__9dAcTbox_cFv = .text:0x8026D2D0; // type:function size:0x68 AcTbox__checkShouldClose = .text:0x8026D340; // type:function size:0xC AcTbox__setShouldCloseFlag = .text:0x8026D350; // type:function size:0xC AcTbox__unsetShouldCloseFlag = .text:0x8026D360; // type:function size:0xC @@ -14332,17 +14332,17 @@ getSomeCounter__9dAcTbox_cCFPUl = .text:0x8026D600; // type:function size:0x68 fn_8026D670__9dAcTbox_cCFv = .text:0x8026D670; // type:function size:0x8 syncScaleToMdl__9dAcTbox_cFPQ23m3d9scnLeaf_c = .text:0x8026D680; // type:function size:0x10 initBgW__9dAcTbox_cFR4dBgWPCcPCc = .text:0x8026D690; // type:function size:0xB8 -AcTbox__initializeDowsingTarget = .text:0x8026D750; // type:function size:0x14 +initDowsingTarget__9dAcTbox_cFP13DowsingTargetQ213DowsingTarget11DowsingSlotP7mVec3_c = .text:0x8026D750; // type:function size:0x14 isItemRupee__9dAcTbox_cCFv = .text:0x8026D770; // type:function size:0x8 initDowsingTarget__9dAcTbox_cFQ213DowsingTarget11DowsingSlot = .text:0x8026D780; // type:function size:0x50 initDowsingTargetCube__9dAcTbox_cFv = .text:0x8026D7D0; // type:function size:0x44 -noRegisterDowsing = .text:0x8026D820; // type:function size:0x4 -registersKeyPieceDowsing = .text:0x8026D830; // type:function size:0x68 -registerRupeeOrTreasureDowsing = .text:0x8026D8A0; // type:function size:0x48 -noUnregisterDowsing = .text:0x8026D8F0; // type:function size:0x4 -unregisterDowsing = .text:0x8026D900; // type:function size:0x48 +noRegisterDowsing__9dAcTbox_cFv = .text:0x8026D820; // type:function size:0x4 +registerKeyPieceDowsing__9dAcTbox_cFv = .text:0x8026D830; // type:function size:0x68 +registerRupeeOrTreasureDowsing__9dAcTbox_cFv = .text:0x8026D8A0; // type:function size:0x48 +noUnregisterDowsing__9dAcTbox_cFv = .text:0x8026D8F0; // type:function size:0x4 +unregisterDowsing__9dAcTbox_cFv = .text:0x8026D900; // type:function size:0x48 fn_8026D950 = .text:0x8026D950; // type:function size:0x28 -checkIsClear = .text:0x8026D980; // type:function size:0x140 +checkIsClear__9dAcTbox_cCFv = .text:0x8026D980; // type:function size:0x140 fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 fn_8026DAD0__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 getCylParams__9dAcTbox_cFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C @@ -28645,7 +28645,7 @@ lbl_804ED998 = .rodata:0x804ED998; // type:object size:0xC lbl_804ED9A4 = .rodata:0x804ED9A4; // type:object size:0x14 ITEM_MODELS = .rodata:0x804ED9B8; // type:object size:0xA00 lbl_804EE3B8 = .rodata:0x804EE3B8; // type:object size:0xC0 data:4byte -lbl_804EE478 = .rodata:0x804EE478; // type:object size:0xD0 data:4byte +@LOCAL@checkIsClear__9dAcTbox_cCFv@fsIdxes@0 = .rodata:0x804EE478; // type:object size:0xD0 data:4byte lbl_804EE548 = .rodata:0x804EE548; // type:object size:0x30 lbl_804EE578 = .rodata:0x804EE578; // type:object size:0x30 data:float TgMassObj__GRASS_A_TYPES = .rodata:0x804EE5A8; // type:object size:0xF8 data:4byte @@ -40245,7 +40245,7 @@ sCurrentObtainingItemOarcName = .sbss:0x80575918; // type:object size:0x4 data:4 @GUARD@create__9dAcTbox_cFv@bbLo@9 = .sbss:0x80575924; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@bbUp@10 = .sbss:0x80575925; // type:object size:0x1 data:byte @GUARD@draw__9dAcTbox_cFv@shadowDirs = .sbss:0x80575926; // type:object size:0x1 data:byte -lbl_80575927 = .sbss:0x80575927; // type:object size:0x1 data:byte +@GUARD@checkIsClear__9dAcTbox_cCFv@offsets = .sbss:0x80575927; // type:object size:0x1 data:byte lbl_80575928 = .sbss:0x80575928; // type:object size:0x8 data:byte TgMassObj__MASS_OBJ_TAG_PTR = .sbss:0x80575930; // type:object size:0x4 data:4byte lbl_80575934 = .sbss:0x80575934; // type:object size:0x4 data:4byte @@ -49025,7 +49025,7 @@ StateID_Wait__9dAcTbox_c = .bss:0x805B52D8; // type:object size:0x30 data:4byte StateID_GoddessWait__9dAcTbox_c = .bss:0x805B5318; // type:object size:0x30 data:4byte lbl_805B5348 = .bss:0x805B5348; // type:object size:0xA0 lbl_805B53E8 = .bss:0x805B53E8; // type:object size:0x40 data:4byte -lbl_805B5428 = .bss:0x805B5428; // type:object size:0x30 data:float +@LOCAL@checkIsClear__9dAcTbox_cCFv@offsets = .bss:0x805B5428; // type:object size:0x30 data:float lbl_805B5458 = .bss:0x805B5458; // type:object size:0x10 AcTimeArea__STATE_WAIT = .bss:0x805B5468; // type:object size:0x40 data:4byte AcTimeArea__STATE_SLOPE = .bss:0x805B54A8; // type:object size:0x40 data:4byte diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index c68b886b..674bb119 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -55,6 +55,7 @@ public: static int getTotalArrowCount(); static int getTotalSeedCount(); + static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); static bool isTreasure(ITEM_ID item); diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 9e86f68e..015fb613 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -66,6 +66,9 @@ public: virtual int actorExecuteInEvent() override; virtual int draw() override; + virtual void registerInEvent() override; + virtual void unkVirtFunc_0x6C() override; + virtual void *getObjectListEntry() override; STATE_FUNC_DECLARE(dAcTbox_c, DugOut); @@ -83,7 +86,8 @@ public: STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait); private: - bool initBgW(dBgW &bg, const char *arcName, const char *ccName); + static f32 getSomeRate(); + bool initBgW(dBgW &bg, const char *arcName, const char *fileName); bool isNotSmall() const; void setItemId(u16 item); void setChestFlag(); @@ -99,6 +103,9 @@ private: bool checkTboxFlag() const; bool fn_8026D560() const; bool isItemRupee() const; + + void getDowsingTargetOffset(mVec3_c *offset) const; + void initDowsingTarget(DowsingTarget *target, DowsingTarget::DowsingSlot slot, mVec3_c *offset); void initDowsingTarget(DowsingTarget::DowsingSlot slot); void initDowsingTargetCube(); @@ -126,8 +133,13 @@ private: void setFlags(u32 flags); + bool fn_8026D120() const; + void fn_8026D130(); void fn_8026D140(); + void fn_8026D950(); + bool checkIsClear() const; + static bool fn_802686F0(const mVec3_c &vec, f32 y); const InteractionTargetDef &getInteractionTargetDef() const; /* 0x0330 */ m3d::mdlAnmChr mMdl1; @@ -158,12 +170,15 @@ private: /* 0x10E8 */ fLiNdBa_c mTboxListNode; /* 0x10F4 */ ActorEventRelated mEvent; /* 0x1144 */ dAcRef_c mItemRef; - /* 0x1150 */ DowsingTarget mDowsingTarget1; - /* 0x1170 */ DowsingTarget mDowsingTarget2; + /* 0x1150 */ DowsingTarget mDowsingTarget; + /* 0x1170 */ DowsingTarget mGoddessDowsingTarget; /* 0x1190 */ void (dAcTbox_c::*mRegisterDowsingTarget)(); /* 0x119C */ void (dAcTbox_c::*mUnregisterDowsingTarget)(); - /* 0x11A8 */ u8 field_0x11A8[0x11D8 - 0x11A8]; + /* 0x11A8 */ u8 field_0x11A8[0x11C0 - 0x11A8]; + + /* 0x11C0 */ mVec3_c field_0x11C0; + /* 0x11CC */ mVec3_c field_0x11CC; /* 0x11D8 */ mVec3_c field_0x11D8; @@ -174,7 +189,7 @@ private: /* 0x11F0 */ UNKWORD field_0x11F0; /* 0x11F4 */ UNKWORD field_0x11F4; - /* 0x11F8 */ u8 field_0x11F8[0x11FC - 0x11F8]; + /* 0x11F8 */ UNKWORD field_0x11F8; /* 0x11FC */ UNKWORD field_0x11FC; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 44f43d3b..49791e31 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -889,9 +889,6 @@ public: void OnTgSet() { mTg.OnSPrm(1); } - void OffTgSet() { - mTg.OffSPrm(1); - } u32 GetTgGrp() const { return mTg.MskSPrm(0x3E); } diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 702e8f92..203258e1 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -5,11 +5,13 @@ #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" +#include "d/col/bg/d_bg_s.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "m/m3d/m_fanm.h" +#include "m/m3d/m_scnleaf.h" #include "m/m_mtx.h" #include "m/m_vec.h" #include "nw4r/g3d/g3d_resanmchr.h" @@ -21,6 +23,7 @@ #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/attention.h" #include "toBeSorted/dowsing_target.h" +#include "toBeSorted/event_manager.h" #include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); @@ -751,9 +754,13 @@ static char *const sOpenCcNames[] = { "GoddessTBoxOpen", }; +f32 dAcTbox_c::getSomeRate() { + return 1.0f / 8.333333f; +} + dAcTbox_c::dAcTbox_c() : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), - mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE) { + mDowsingTarget(this, DowsingTarget::SLOT_NONE), mGoddessDowsingTarget(this, DowsingTarget::SLOT_NONE) { field_0x120B = 0; field_0x120E = 0; mDoObstructedCheck = false; @@ -889,7 +896,7 @@ bool dAcTbox_c::createHeap() { return true; } -static u32 sSomeCounters[16] = {}; +static u32 sSomeCounters[16] = {0}; int dAcTbox_c::create() { if (!isActualVisibleBox()) { @@ -958,7 +965,7 @@ int dAcTbox_c::create() { if (b) { other->deleteRequest(); - field_0x120D = true; + other->field_0x120D = true; } else { field_0x120D = true; return FAILED; @@ -1005,7 +1012,7 @@ int dAcTbox_c::create() { {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; mCcD3.Set(s1); - mCcD4.SetStts(mStts); + mCcD3.SetStts(mStts); static const dCcD_SrcCyl s2 = { sColSrc, {1.0f, 1.0f}, @@ -1245,7 +1252,7 @@ int dAcTbox_c::actorExecute() { mCcD2.Set(v1, v2); mCcD2.Set(field_0x11D8, rotation.y); } else { - mCcD2.OffTgSet(); + mCcD2.ClrTgSet(); } field_0x0D48.registerColliders(); } @@ -1431,7 +1438,7 @@ int dAcTbox_c::actorExecuteInEvent() { mCcD2.Set(v1, v2); mCcD2.Set(field_0x11D8, rotation.y); } else { - mCcD2.OffTgSet(); + mCcD2.ClrTgSet(); } field_0x0D48.registerColliders(); } @@ -1553,9 +1560,102 @@ const mVec3_c &dAcTbox_c::fn_8026B3C0() const { return v2; } -void dAcTbox_c::initializeState_DugOut() {} -void dAcTbox_c::executeState_DugOut() {} +void dAcTbox_c::initializeState_DugOut() { + mScale.set(0.0f, 0.0f, 1.0f); + field_0x11E8 = 0.0f; + field_0x11F4 &= ~2; + if (mHasBeenOpened == 1) { + field_0x120C = 1; + } else { + field_0x120C = 0; + } + setActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + if (checkTboxFlag()) { + mMdl1.setFrame(mMdl1.getAnm().getEndFrame()); + } else { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D140(); +} +void dAcTbox_c::executeState_DugOut() { + field_0x11F4 |= 2; + if (field_0x11E8 < 1.0f) { + bool result = sLib::chase(&field_0x11E8, 1.0f, 0.2f); + switch ((u32)mVariant) { + case NORMAL: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + } else { + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + } + break; + case SMALL: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-38.0f, 0.0f, -68.0f); + field_0x11CC.set(38.0f, 101.0f, 31.0f); + } else { + field_0x11C0.set(-38.0f, 0.0f, -35.0f); + field_0x11CC.set(38.0f, 68.0f, 35.0f); + } + break; + case BOSS: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-90.0f, 0.0f, -135.0f); + field_0x11CC.set(90.0f, 163.0f, 56.0f); + } else { + field_0x11C0.set(-90.0f, 0.0f, -53.0f); + field_0x11CC.set(90.0f, 133.0f, 56.0f); + } + break; + case GODDESS: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-62.0f, 0.0f, -95.0f); + field_0x11CC.set(62.0f, 140.0f, 47.0f); + } else { + field_0x11C0.set(-62.0f, 0.0f, -47.0f); + field_0x11CC.set(62.0f, 100.0f, 47.0f); + } + break; + } + field_0x11C0 *= field_0x11E8; + field_0x11CC *= field_0x11E8; + if (!result) { + return; + } + } + + bool bX = sLib::chase(&mScale.x, 1.0f, 0.2f); + bool bY = sLib::chase(&mScale.y, 1.0f, 0.2f); + if (bX && bY) { + if (mVariant == GODDESS) { + if (mHasBeenOpened == true) { + mStateMgr.changeState(StateID_GoddessWait); + } else { + if (StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + mStateMgr.changeState(StateID_GoddessWaitOn); + } else { + mStateMgr.changeState(StateID_GoddessWaitOff); + } + } + } else if (mHasBeenOpened == true) { + mStateMgr.changeState(StateID_Wait); + } else { + mStateMgr.changeState(StateID_WaitOpen); + } + } +} void dAcTbox_c::finalizeState_DugOut() {} + void dAcTbox_c::initializeState_WaitAppear() { mScale.set(0.0f, 0.0f, 0.0f); setActorProperty(0x100); @@ -1563,7 +1663,8 @@ void dAcTbox_c::initializeState_WaitAppear() { field_0x11E8 = 0.0f; field_0x11F4 &= ~0x2; field_0x120C = 0; - // field_0x11C0 + field_0x11C0.set(0.0f, 0.0f, 0.0f); + field_0x11CC.set(0.0f, 0.0f, 0.0f); } void dAcTbox_c::executeState_WaitAppear() { // @bug doIt is uninitialized here, so WaitAppear is UB unless field_0x120A == 0 or field_0x120A == 3 @@ -1579,22 +1680,155 @@ void dAcTbox_c::executeState_WaitAppear() { } } void dAcTbox_c::finalizeState_WaitAppear() {} + void dAcTbox_c::initializeState_DemoAppear() { - // TODO, just referencing this bit of data + field_0x11F8 = 0; + mScale.set(0.0f, 0.0f, 0.0f); + field_0x11E8 = 0.0f; + setActorProperty(0x100); mMdl1.setAnm(sAppearAnmName, m3d::PLAY_MODE_4); + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + mAnmMatClr1.setFrame(0.0f, 0); + fn_8026D140(); + field_0x11E8 = 0.0f; + field_0x11F4 &= ~0x2; + field_0x120C = 0; + field_0x11C0.set(0.0f, 0.0f, 0.0f); + field_0x11CC.set(0.0f, 0.0f, 0.0f); +} +extern "C" void SmallSoundManager__playSound(void *, u32); +extern "C" void *SOUND_EFFECT_SOUND_MGR; +void dAcTbox_c::executeState_DemoAppear() { + int val = field_0x11F8++; + if (field_0x11F8 < 11) { + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + f32 f = field_0x11F8 * 0.1f; + field_0x11C0 *= f; + field_0x11CC *= f; + } + if (field_0x11F8 >= 20) { + bool b = val < 20; + if (b) { + fn_8026D950(); + } + if (b) { + mScale.set(1.0f, 1.0f, 1.0f); + } + bool wasStop = mMdl1.getAnm().isStop(); + if (!wasStop) { + mMdl1.play(); + } + bool isStop = mMdl1.getAnm().isStop(); + if (!wasStop) { + field_0x11E8 = mMdl1.getAnm().getFrame() / (mMdl1.getAnm().getEndFrame() - mMdl1.getAnm().getStartFrame()); + } + if (0.0f < field_0x11E8) { + field_0x11F4 |= 2; + } + mAnmMatClr1.play(); + if (isStop && mAnmMatClr1.isStop(0) && field_0x11F8 > 0x5A) { + mEvent.advanceNext(); + mStateMgr.changeState(StateID_WaitOpen); + SmallSoundManager__playSound(SOUND_EFFECT_SOUND_MGR, 0x13AD); + } + } } -void dAcTbox_c::executeState_DemoAppear() {} void dAcTbox_c::finalizeState_DemoAppear() {} -void dAcTbox_c::initializeState_WaitOpen() {} -void dAcTbox_c::executeState_WaitOpen() {} -void dAcTbox_c::finalizeState_WaitOpen() {} -void dAcTbox_c::initializeState_GoddessWaitOff() {} + +void dAcTbox_c::initializeState_WaitOpen() { + mScale.set(1.0f, 1.0f, 1.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + switch ((u32)mVariant) { + case NORMAL: + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + break; + case SMALL: + field_0x11C0.set(-38.0f, 0.0f, -35.0f); + field_0x11CC.set(38.0f, 68.0f, 35.0f); + break; + case BOSS: + field_0x11C0.set(-90.0f, 0.0f, -53.0f); + field_0x11CC.set(90.0f, 133.0f, 56.0f); + break; + // WaitOpen not used for Goddess Chests + } + field_0x120C = 0; + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D130(); +} +void dAcTbox_c::executeState_WaitOpen() { + if ((!mDoObstructedCheck || checkIsClear()) && fn_8026D120()) { + AttentionManager *mgr = AttentionManager::sInstance; + mgr->addTarget(*this, getInteractionTargetDef(), 0, nullptr); + } +} +void dAcTbox_c::finalizeState_WaitOpen() { + (this->*mUnregisterDowsingTarget)(); +} + +void dAcTbox_c::initializeState_GoddessWaitOff() { + clearActorProperty(0x100); + fn_8026D130(); + field_0x11C0.set(-62.0f, 0.0f, -47.0f); + field_0x11CC.set(62.0f, 100.0f, 47.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 0; +} void dAcTbox_c::executeState_GoddessWaitOff() {} void dAcTbox_c::finalizeState_GoddessWaitOff() {} -void dAcTbox_c::initializeState_GoddessWaitOn() {} -void dAcTbox_c::executeState_GoddessWaitOn() {} -void dAcTbox_c::finalizeState_GoddessWaitOn() {} -void dAcTbox_c::initializeState_DeleteArchive() {} + +void dAcTbox_c::initializeState_GoddessWaitOn() { + clearActorProperty(0x100); + fn_8026D130(); + field_0x11C0.set(-62.0f, 0.0f, -47.0f); + field_0x11CC.set(62.0f, 100.0f, 47.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + mGoddessDowsingTarget.doRegister(); +} +void dAcTbox_c::executeState_GoddessWaitOn() { + if (fn_8026D120()) { + AttentionManager *mgr = AttentionManager::sInstance; + mgr->addTarget(*this, getInteractionTargetDef(), 0, nullptr); + } +} +void dAcTbox_c::finalizeState_GoddessWaitOn() { + (this->*mUnregisterDowsingTarget)(); + mGoddessDowsingTarget.doUnregister(); +} + +void dAcTbox_c::initializeState_DeleteArchive() { + mScale.set(1.0f, 1.0f, 1.0f); + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D140(); + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 0; +} void dAcTbox_c::executeState_DeleteArchive() { if (sCurrentObtainingItemOarcName != nullptr) { OarcManager *mng = OarcManager::sInstance; @@ -1613,30 +1847,175 @@ void dAcTbox_c::executeState_DeleteArchive() { } } void dAcTbox_c::finalizeState_DeleteArchive() {} -void dAcTbox_c::initializeState_LoadArchive() {} -void dAcTbox_c::executeState_LoadArchive() {} + +void dAcTbox_c::initializeState_LoadArchive() { + mScale.set(1.0f, 1.0f, 1.0f); + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D140(); + sCurrentObtainingItemOarcName = sItemToArchiveName[mItemModelIdx]; + OarcManager::sInstance->loadObjectArcFromDisk(sCurrentObtainingItemOarcName, nullptr); + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 0; +} +void dAcTbox_c::executeState_LoadArchive() { + if (!OarcManager::sInstance->ensureLoaded1(sCurrentObtainingItemOarcName)) { + mStateMgr.changeState(StateID_Open); + } +} void dAcTbox_c::finalizeState_LoadArchive() {} + void dAcTbox_c::initializeState_Open() {} void dAcTbox_c::executeState_Open() {} void dAcTbox_c::finalizeState_Open() {} + void dAcTbox_c::initializeState_PresentItem() {} void dAcTbox_c::executeState_PresentItem() {} void dAcTbox_c::finalizeState_PresentItem() {} + void dAcTbox_c::initializeState_Close() {} void dAcTbox_c::executeState_Close() {} void dAcTbox_c::finalizeState_Close() {} + void dAcTbox_c::initializeState_Wait() {} void dAcTbox_c::executeState_Wait() {} void dAcTbox_c::finalizeState_Wait() {} + void dAcTbox_c::initializeState_GoddessWait() {} void dAcTbox_c::executeState_GoddessWait() {} void dAcTbox_c::finalizeState_GoddessWait() {} +extern "C" dAcBase_c *getCurrentEventActor(); + +void dAcTbox_c::registerInEvent() { + if (getCurrentEventActor() == mItemRef.get()) { + if (EventManager::isCurrentEvent("ItemGetDefaultTBox") || EventManager::isCurrentEvent("ItemGetGorgeousTBox")) { + field_0x11F4 |= 0x8; + } + } +} + +void dAcTbox_c::unkVirtFunc_0x6C() { + if ((field_0x11F4 & 8) != 0) { + if (mVariant == GODDESS && mHasBeenOpened == true) { + mAnmGoddessPat.setFrame(0.0f, 0); + } + field_0x11F4 &= ~8; + } +} + bool dAcTbox_c::isNotSmall() const { return mVariant != SMALL; } -extern "C" const u32 DAT_804ee478[] = {0, 0, 1, 1}; +void dAcTbox_c::syncScaleToMdl(m3d::scnLeaf_c *lf) { + lf->setScale(mScale); +} + +bool dAcTbox_c::initBgW(dBgW &bg, const char *arcName, const char *fileName) { + void *dzb = getOarcDZB(arcName, fileName); + if (dzb == nullptr) { + return false; + } + void *plc = getOarcPLC(arcName, fileName); + if (plc == nullptr) { + return false; + } + // TODO return types + bool ok = !(BOOL)bg.Set((cBgD_t *)dzb, (PLC *)plc, 0x81, &mWorldMtx, &mScale); + if (!ok) { + return false; + } + bg.SetCrrFunc(dBgS_MoveBGProc_TypicalRotY); + return true; +} + +void dAcTbox_c::initDowsingTarget(DowsingTarget *target, DowsingTarget::DowsingSlot slot, mVec3_c *offset) { + target->initialize(slot, 0, offset, 0.0f); +} + +bool dAcTbox_c::isItemRupee() const { + return dAcItem_c::isRupee((ITEM_ID)mItemId); +} + +void dAcTbox_c::initDowsingTarget(DowsingTarget::DowsingSlot slot) { + mVec3_c offset; + getDowsingTargetOffset(&offset); + initDowsingTarget(&mDowsingTarget, slot, &offset); +} + +void dAcTbox_c::initDowsingTargetCube() { + mVec3_c offset; + getDowsingTargetOffset(&offset); + initDowsingTarget(&mGoddessDowsingTarget, DowsingTarget::SLOT_GODDESS_CUBE, &offset); +} + +void dAcTbox_c::noRegisterDowsing() {} + +void dAcTbox_c::registerKeyPieceDowsing() { + if ((field_0x11F4 & 4) == 0 && StoryflagManager::sInstance->getCounterOrFlag(0x6A)) { + mDowsingTarget.doRegister(); + field_0x11F4 |= 4; + } +} + +void dAcTbox_c::registerRupeeOrTreasureDowsing() { + if ((field_0x11F4 & 4) == 0) { + mDowsingTarget.doRegister(); + field_0x11F4 |= 4; + } +} + +void dAcTbox_c::noUnregisterDowsing() {} + +void dAcTbox_c::unregisterDowsing() { + if ((field_0x11F4 & 4) != 0) { + mDowsingTarget.doUnregister(); + field_0x11F4 &= ~4; + } +} + +bool dAcTbox_c::checkIsClear() const { + f32 fs[] = { + position.y, + position.y, + }; + fs[0] += 20.0f; + fs[1] += 60.0f; + static mVec3_c offsets[] = { + mVec3_c(50.0f, 500.0f, 50.0f), + mVec3_c(50.0f, 500.0f, -50.0f), + mVec3_c(-50.0f, 500.0f, 50.0f), + mVec3_c(-50.0f, 500.0f, -50.0f), + }; + mVec3_c points[4]; + for (u32 i = 0; i <= 3; i++) { + fn_8026DAD0(&offsets[i], &points[i]); + } + static const int fsIdxes[] = {0, 0, 1, 1}; + bool isClear = true; + for (u32 i = 0; isClear && i <= 3;) { + // @bug should this be points[i] instead? + if (fn_802686F0(points[0], fs[fsIdxes[i]])) { + isClear = false; + } else { + i++; + } + } + + return isClear; +} const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { switch ((u32)mVariant) { From ca36a0123cba816ece0149ef663f8fbaf233a024 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 22 Nov 2024 13:13:02 +0100 Subject: [PATCH 08/17] More --- config/SOUE01/symbols.txt | 4 +- include/d/a/d_a_base.h | 3 +- include/d/a/d_a_player.h | 2 + include/d/a/obj/d_a_obj_tbox.h | 6 +- src/d/a/d_a_base.cpp | 2 +- src/d/a/obj/d_a_obj_tbox.cpp | 244 ++++++++++++++++++++++++++++++++- 6 files changed, 249 insertions(+), 12 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4a925660..53bf26f3 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -14345,8 +14345,8 @@ fn_8026D950 = .text:0x8026D950; // type:function size:0x28 checkIsClear__9dAcTbox_cCFv = .text:0x8026D980; // type:function size:0x140 fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 fn_8026DAD0__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 -getCylParams__9dAcTbox_cFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C -fn_8026DD70__9dAcTbox_cFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC +getCylParams__9dAcTbox_cCFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C +getCCBounds__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC getInteractionTargetDef__9dAcTbox_cCFv = .text:0x8026E050; // type:function size:0x40 fn_8026E090__9dAcTbox_cFv = .text:0x8026E090; // type:function size:0x594 fn_8026E630__9dAcTbox_cFv = .text:0x8026E630; // type:function size:0x10C diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 946d0ca4..90afd1dc 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -9,6 +9,7 @@ #include "toBeSorted/tlist.h" class dAcBase_c; +struct cBgS_PolyInfo; struct SoundSource { // TODO @@ -255,7 +256,7 @@ public: /* 8002dd50 */ void FUN_8002dd50(); /* 8002dd90 */ void FUN_8002dd90(); /* 8002ddd0 */ void FUN_8002ddd0(); - /* 8002de30 */ void FUN_8002de30(); + /* 8002de30 */ void FUN_8002de30(cBgS_PolyInfo &p); public: /* 80571920 */ static u32 s_Create_RoomId; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 139a511a..8c3ea526 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -51,6 +51,8 @@ public: void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD); void setPosYRot(const mVec3_c &pos, mAng rot, UNKWORD, UNKWORD, UNKWORD); + // argument is always false in existing code, true doesn't seem to make a difference + void bonk(bool unk = false); /* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD); /* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD); diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 015fb613..f621a13a 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -116,13 +116,13 @@ private: void noUnregisterDowsing(); static bool fn_80268660(int arg); - void fn_8026E090(); + bool checkForLinkBonk(); void fn_8026E630(); bool fn_8026D540(); bool fn_8026D3C0(); void syncScaleToMdl(m3d::scnLeaf_c *lf); - void fn_8026DD70(mVec3_c *out1, mVec3_c *out2); - void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3); + void getCCBounds(mVec3_c *out1, mVec3_c *out2) const; + void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3) const; void fn_8026DAD0(mVec3_c *src, mVec3_c *dest) const; void fn_8026DAC0(mAng& ang); diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index b60fbedb..600ae9c3 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -613,6 +613,6 @@ void dAcBase_c::FUN_8002dd90() { void dAcBase_c::FUN_8002ddd0() {} // 8002de30 -void dAcBase_c::FUN_8002de30() { +void dAcBase_c::FUN_8002de30(cBgS_PolyInfo &p) { FUN_8002ddd0(); } diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 203258e1..c7190f00 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -6,6 +6,8 @@ #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/c/c_bg_s_poly_info.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/flag/sceneflag_manager.h" @@ -19,6 +21,7 @@ #include "nw4r/g3d/g3d_resanmtexsrt.h" #include "nw4r/g3d/g3d_resfile.h" #include "nw4r/g3d/g3d_resmdl.h" +#include "rvl/MTX/mtxvec.h" #include "s/s_Math.h" #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/attention.h" @@ -911,7 +914,7 @@ int dAcTbox_c::create() { if (mItemId > MAX_ITEM_ID) { return FAILED; } - mVariant = sItemToTBoxVariant[mItemId]; + mVariant = (TboxVariant_e)sItemToTBoxVariant[mItemId]; if (mVariant == GODDESS) { setItemId((ITEM_ID)(MAX_ITEM_ID - mItemId)); } @@ -1147,7 +1150,7 @@ int dAcTbox_c::actorExecute() { return SUCCEEDED; } - fn_8026E090(); + checkForLinkBonk(); fn_8026E630(); mStateMgr.executeState(); if (fn_8026D540()) { @@ -1160,7 +1163,7 @@ int dAcTbox_c::actorExecute() { mMdl1.getModel().calc(false); if ((field_0x11F4 & 2) != 0) { mVec3_c v1, v2; - fn_8026DD70(&v1, &v2); + getCCBounds(&v1, &v2); v1 *= field_0x11E8; v2 *= field_0x11E8; mCcD3.Set(v1, v2); @@ -1283,7 +1286,7 @@ int dAcTbox_c::actorExecuteInEvent() { return SUCCEEDED; } - fn_8026E090(); + checkForLinkBonk(); fn_8026E630(); switch (mEvent.getCurrentEventCommand()) { @@ -1346,7 +1349,7 @@ int dAcTbox_c::actorExecuteInEvent() { mMdl1.getModel().calc(false); if ((field_0x11F4 & 2) != 0) { mVec3_c v1, v2; - fn_8026DD70(&v1, &v2); + getCCBounds(&v1, &v2); v1 *= field_0x11E8; v2 *= field_0x11E8; mCcD3.Set(v1, v2); @@ -2017,6 +2020,177 @@ bool dAcTbox_c::checkIsClear() const { return isClear; } +void dAcTbox_c::getCylParams(mVec3_c *c, f32 *r, f32 *h) const { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 70.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -24.0f); + } + if (r != nullptr) { + *r = 86.0f; + } + if (h != nullptr) { + *h = 140.0f; + } + break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 48.0f; + } + if (h != nullptr) { + *h = 68.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -14.0f); + } + if (r != nullptr) { + *r = 60.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 100.0f; + } + if (h != nullptr) { + *h = 132.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -44.0f); + } + if (r != nullptr) { + *r = 122.0f; + } + if (h != nullptr) { + *h = 160.0f; + } + break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 73.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -23.0f); + } + if (r != nullptr) { + *r = 88.0f; + } + if (h != nullptr) { + *h = 140.0f; + } + break; + } + break; + } + if (c != nullptr) { + PSMTXMultVec(mWorldMtx, *c, *c); + } +} + +void dAcTbox_c::getCCBounds(mVec3_c *lo, mVec3_c *up) const { + if (lo != nullptr) { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: lo->set(-61.0f, 0.0f, -42.0f); break; + case 1: lo->set(-61.0f, 0.0f, -90.0f); break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: lo->set(-38.0f, 0.0f, -35.0f); break; + case 1: lo->set(-38.0f, 0.0f, -68.0f); break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: lo->set(-90.0f, 0.0f, -53.0f); break; + case 1: lo->set(-90.0f, 0.0f, -135.0f); break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: lo->set(-62.0f, 0.0f, -47.0f); break; + case 1: lo->set(-62.0f, 0.0f, -95.0f); break; + } + break; + } + } + if (up != nullptr) { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: up->set(61.0f, 100.0f, 42.0f); break; + case 1: up->set(61.0f, 142.0f, 42.0f); break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: up->set(38.0f, 68.0f, 35.0f); break; + case 1: up->set(38.0f, 101.0f, 31.0f); break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: up->set(90.0f, 133.0f, 56.0f); break; + case 1: up->set(90.0f, 163.0f, 56.0f); break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: up->set(62.0f, 100.0f, 47.0f); break; + case 1: up->set(62.0f, 140.0f, 47.0f); break; + } + break; + } + } +} + const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { switch ((u32)mVariant) { case NORMAL: @@ -2042,3 +2216,63 @@ const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { } } } + +bool dAcTbox_c::checkForLinkBonk() { + if (!mCcD4.ChkCoHit()) { + return false; + } + dAcPy_c *link = dAcPy_c::LINK; + if (link == nullptr) { + return false; + } + if (link->getCurrentAction() != /* ROLL */ 12) { + return false; + } + + mVec3_c linkPos; + PSMTXMultVec(mCcD3.mInvMtx, link->position, linkPos); + mVec3_c ccLo, ccHi; + getCCBounds(&ccLo, &ccHi); + // Math performed in local coordinate space + // All of this is wrong + if (!(ccLo.y <= linkPos.y + 100.0f && linkPos.y <= ccHi.y)) { + return false; + } + + bool bonk = false; + bonk = bonk || (ccLo.x <= linkPos.x && linkPos.x <= ccHi.x) && + (ccLo.z - 80.0f <= linkPos.z && linkPos.z <= ccHi.z + 80.0f); + bonk = bonk || (ccLo.z <= linkPos.z && linkPos.z <= ccHi.z) && + (ccLo.x - 80.0f <= linkPos.x && linkPos.x <= ccHi.x + 80.0f); + bonk = bonk || (linkPos.x < ccLo.x && linkPos.z < ccLo.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (ccHi.x < linkPos.x && ccHi.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (linkPos.x < ccLo.x && ccLo.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (ccHi.x < linkPos.x && linkPos.z < ccHi.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + + if (!bonk) { + return false; + } + + int direction = 0; + mVec3_c diff = mVec3_c(linkPos.x - mCcD3.mField_0xA8.x, 0.0f, linkPos.z - mCcD3.mField_0xA8.z); + if (VEC3LenSq(diff) <= FLT_EPSILON) { + return false; + } + + // TODO + + link->bonk(); + + return false; +} + +void dAcTbox_c::fn_8026E630() { + mVec3_c offset = mVec3_c::Ey * 10.0f; + mVec3_c checkPos = position + offset; + // TODO reference vs pointer + if (dBgS_ObjGndChk::CheckPos(checkPos) && &dBgS_ObjGndChk::GetInstance()) { + cBgS_PolyInfo p = dBgS_ObjGndChk::GetInstance(); + dBgS::GetInstance()->SetLightingCode(this, p); + FUN_8002de30(p); + } +} From e1d5f5b22f12280d0093de1c7c22e31b5f36da59 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 22 Nov 2024 17:12:17 +0100 Subject: [PATCH 09/17] dAcTbox 92% --- config/SOUE01/symbols.txt | 80 +-- include/d/a/d_a_item.h | 4 + include/d/a/d_a_player.h | 2 +- include/d/a/obj/d_a_obj_tbox.h | 59 +-- include/d/d_cc.h | 32 ++ include/d/flag/tboxflag_manager.h | 2 +- include/toBeSorted/blur_and_palette_manager.h | 27 + include/toBeSorted/counters/counter.h | 2 +- .../counters/goddess_chest_counter.h | 19 + include/toBeSorted/event.h | 3 +- include/toBeSorted/event_manager.h | 1 + src/REL/d/a/obj/d_a_obj_tumble_weed.cpp | 5 +- src/d/a/obj/d_a_obj_tbox.cpp | 471 ++++++++++++++++-- src/d/flag/tboxflag_manager.inc | 2 +- 14 files changed, 587 insertions(+), 122 deletions(-) create mode 100644 include/d/d_cc.h create mode 100644 include/toBeSorted/blur_and_palette_manager.h create mode 100644 include/toBeSorted/counters/goddess_chest_counter.h diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 53bf26f3..f9eb3290 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -798,8 +798,8 @@ fn_800220D0 = .text:0x800220D0; // type:function size:0xD0 fn_800221A0 = .text:0x800221A0; // type:function size:0xC4 fn_80022270 = .text:0x80022270; // type:function size:0x5C fn_800222D0 = .text:0x800222D0; // type:function size:0xC8 -fn_800223A0 = .text:0x800223A0; // type:function size:0x94 -fn_80022440 = .text:0x80022440; // type:function size:0x34 +fn_800223A0__21BlurAndPaletteManagerFPv = .text:0x800223A0; // type:function size:0x94 +fn_80022440__21BlurAndPaletteManagerFPv = .text:0x80022440; // type:function size:0x34 fn_80022480 = .text:0x80022480; // type:function size:0xCC fn_80022550 = .text:0x80022550; // type:function size:0x74 Vec3f__copy = .text:0x800225D0; // type:function size:0x1C @@ -810,7 +810,7 @@ fn_800227F0 = .text:0x800227F0; // type:function size:0xF0 fn_800228E0 = .text:0x800228E0; // type:function size:0xEC fn_800229D0 = .text:0x800229D0; // type:function size:0x34 fn_80022A10 = .text:0x80022A10; // type:function size:0xD8 -fn_80022AF0 = .text:0x80022AF0; // type:function size:0x3C +fn_80022AF0__21BlurAndPaletteManagerFf = .text:0x80022AF0; // type:function size:0x3C fn_80022B30 = .text:0x80022B30; // type:function size:0x8 fn_80022B40 = .text:0x80022B40; // type:function size:0x58 fn_80022BA0 = .text:0x80022BA0; // type:function size:0xC @@ -854,7 +854,7 @@ fn_800246D0 = .text:0x800246D0; // type:function size:0x64 fn_80024740 = .text:0x80024740; // type:function size:0x24 fn_80024770 = .text:0x80024770; // type:function size:0x24 fn_800247A0 = .text:0x800247A0; // type:function size:0x30 -fn_800247D0 = .text:0x800247D0; // type:function size:0x20 +fn_800247D0__21BlurAndPaletteManagerF7mVec3_cf = .text:0x800247D0; // type:function size:0x20 createBlurAndPaletteMgr = .text:0x800247F0; // type:function size:0xBB0 Vec3f__ctor = .text:0x800253A0; // type:function size:0x10 fn_800253B0 = .text:0x800253B0; // type:function size:0xC @@ -1102,12 +1102,12 @@ FUN_8002dd10__9dAcBase_cFv = .text:0x8002DD10; // type:function size:0x3C FUN_8002dd50__9dAcBase_cFv = .text:0x8002DD50; // type:function size:0x34 FUN_8002dd90__9dAcBase_cFv = .text:0x8002DD90; // type:function size:0x3C FUN_8002ddd0__9dAcBase_cFv = .text:0x8002DDD0; // type:function size:0x54 -FUN_8002de30__9dAcBase_cFv = .text:0x8002DE30; // type:function size:0x4 +FUN_8002de30__9dAcBase_cFR13cBgS_PolyInfo = .text:0x8002DE30; // type:function size:0x4 getOarcFile__12dAcObjBase_cFPCcPCc = .text:0x8002DE40; // type:function size:0x14 ActorObjectBase__getOarcSubentry = .text:0x8002DE60; // type:function size:0x14 getOarcResFile__12dAcObjBase_cFPCc = .text:0x8002DE80; // type:function size:0xC ActorObjectBase__getOarcModelFile = .text:0x8002DE90; // type:function size:0xC -ActorObjectBase__getOarcZev = .text:0x8002DEA0; // type:function size:0xC +getOarcZev__12dAcObjBase_cFPCc = .text:0x8002DEA0; // type:function size:0xC getOarcDZB__12dAcObjBase_cFPCcPCc = .text:0x8002DEB0; // type:function size:0x14 getOarcPLC__12dAcObjBase_cFPCcPCc = .text:0x8002DED0; // type:function size:0x14 __ct__12dAcObjBase_cFv = .text:0x8002DEF0; // type:function size:0x158 @@ -2119,13 +2119,13 @@ fn_80051C00 = .text:0x80051C00; // type:function size:0x4C InitColliderAndAddToFront = .text:0x80051C50; // type:function size:0x5C fn_80051CB0 = .text:0x80051CB0; // type:function size:0x5C InitCollider2AndAddToFront = .text:0x80051D10; // type:function size:0x5C -addCc__16TboxAndMoreUnkCCFR10dAcTboxCcDRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C +addCc__18ColliderLinkedListFR14LinkedColliderRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C fn_80051DD0 = .text:0x80051DD0; // type:function size:0x64 fn_80051E40 = .text:0x80051E40; // type:function size:0x64 ColliderManager__staticAddCollider = .text:0x80051EB0; // type:function size:0x34 -ColliderLinkedList__registerColliders = .text:0x80051EF0; // type:function size:0x10 +registerColliders__18ColliderLinkedListFv = .text:0x80051EF0; // type:function size:0x10 fn_80051F00 = .text:0x80051F00; // type:function size:0x8 -SetStts__16TboxAndMoreUnkCCFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 +SetStts__18ColliderLinkedListFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 ColliderLinkedList__search = .text:0x80051F20; // type:function size:0x74 fn_80051FA0 = .text:0x80051FA0; // type:function size:0x1C fn_80051FC0 = .text:0x80051FC0; // type:function size:0x10 @@ -2139,7 +2139,7 @@ fn_80052040 = .text:0x80052040; // type:function size:0x1C fn_80052060 = .text:0x80052060; // type:function size:0x10 fn_80052070 = .text:0x80052070; // type:function size:0x10 fn_80052080 = .text:0x80052080; // type:function size:0x10 -fn_80052090 = .text:0x80052090; // type:function size:0x60 +__dt__18ColliderLinkedListFv = .text:0x80052090; // type:function size:0x60 create__4dDvdFlPQ23EGG4HeapPQ23EGG4HeapPQ23EGG4Heap = .text:0x800520F0; // type:function size:0x4 __ct__Q24dDvd8loader_cFv = .text:0x80052100; // type:function size:0x28 __dt__Q24dDvd8loader_cFv = .text:0x80052130; // type:function size:0x40 @@ -3569,7 +3569,7 @@ fn_8009F990 = .text:0x8009F990; // type:function size:0x80 fn_8009FA10 = .text:0x8009FA10; // type:function size:0x8 attachSkipEvent = .text:0x8009FA20; // type:function size:0x1A0 setAsEvent = .text:0x8009FBC0; // type:function size:0x120 -dBase_c__changeOwnEvent = .text:0x8009FCE0; // type:function size:0x11C +changeOwnEvent__12EventManagerFP9dAcBase_cP9dAcBase_cP5Eventi = .text:0x8009FCE0; // type:function size:0x11C fn_8009FE00 = .text:0x8009FE00; // type:function size:0x124 isInEvent__12EventManagerFP9dAcBase_cPCc = .text:0x8009FF30; // type:function size:0x10C fn_800A0040 = .text:0x800A0040; // type:function size:0x114 @@ -3597,8 +3597,8 @@ fn_800A09B0 = .text:0x800A09B0; // type:function size:0x1D0 fn_800A0B80 = .text:0x800A0B80; // type:function size:0x10 eventRelatedStateFlags_shift0x11_1 = .text:0x800A0B90; // type:function size:0x10 fn_800A0BA0 = .text:0x800A0BA0; // type:function size:0x94 -__ct__5EventFPcUlUlPvPv = .text:0x800A0C40; // type:function size:0xEC -Event__createSimple = .text:0x800A0D30; // type:function size:0xEC +__ct__5EventFPCcUlUlPvPv = .text:0x800A0C40; // type:function size:0xEC +__ct__5EventFPCcPvUlUlPvPv = .text:0x800A0D30; // type:function size:0xEC __ct__5EventFUllUlPvPv = .text:0x800A0E20; // type:function size:0x208 Event__Event4 = .text:0x800A1030; // type:function size:0x208 __dt__5EventFv = .text:0x800A1240; // type:function size:0x40 @@ -13513,7 +13513,7 @@ fn_80251180 = .text:0x80251180; // type:function size:0x44 AcItem__getEventName = .text:0x802511D0; // type:function size:0x6C fn_80251240 = .text:0x80251240; // type:function size:0x6C AcItem__getEventNamePtrForItemId = .text:0x802512B0; // type:function size:0x4C -TBox__getItemEventNamePtr = .text:0x80251300; // type:function size:0x4C +getItemGetEventName__9dAcItem_cFUsPPCc = .text:0x80251300; // type:function size:0x4C fn_80251350 = .text:0x80251350; // type:function size:0x54 AcItem__getPosition = .text:0x802513B0; // type:function size:0x24 fn_802513E0 = .text:0x802513E0; // type:function size:0xC @@ -13676,8 +13676,8 @@ fn_80252A80 = .text:0x80252A80; // type:function size:0xC fn_80252A90 = .text:0x80252A90; // type:function size:0xC fn_80252AA0 = .text:0x80252AA0; // type:function size:0xC itemGetBirdMaybe = .text:0x80252AB0; // type:function size:0x40 -itemGetEventStart = .text:0x80252AF0; // type:function size:0xD8 -AcItem__itemRecieved = .text:0x80252BD0; // type:function size:0x90 +itemGetEventStart__9dAcItem_cFP9dAcBase_c = .text:0x80252AF0; // type:function size:0xD8 +itemGetEventEnd__9dAcItem_cFP9dAcBase_c = .text:0x80252BD0; // type:function size:0x90 AcItem__getItemId2 = .text:0x80252C60; // type:function size:0x8 AcItem__setFinalDeterminedItemId = .text:0x80252C70; // type:function size:0x8 getItemInitStructForItem = .text:0x80252C80; // type:function size:0x5C @@ -14237,15 +14237,15 @@ __sinit_\d_a_obj_fairy_cpp = .text:0x80267F40; // type:function size:0x56C scope __dt__28sFStateID_c<13dAcObjFairy_c>Fv = .text:0x802684B0; // type:function size:0x58 isSameName__28sFStateID_c<13dAcObjFairy_c>CFPCc = .text:0x80268510; // type:function size:0x88 dAcTbox_c_classInit__Fv = .text:0x802685A0; // type:function size:0x30 -fn_802685D0 = .text:0x802685D0; // type:function size:0x68 -fn_80268640 = .text:0x80268640; // type:function size:0x4 -fn_80268650 = .text:0x80268650; // type:function size:0x8 -fn_80268660__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 +tryGetDowsingTargetOffset__9dAcTbox_cFiR7mVec3_c = .text:0x802685D0; // type:function size:0x68 +getDowsingTargetOffset__9dAcTbox_cFiR7mVec3_c = .text:0x80268640; // type:function size:0x4 +getSomeRate__9dAcTbox_cFv = .text:0x80268650; // type:function size:0x8 +isValidGroupIndex__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 hasCollectedAllTears__9dAcTbox_cFv = .text:0x80268680; // type:function size:0x1C -fn_802686A0 = .text:0x802686A0; // type:function size:0x50 -fn_802686F0__9dAcTbox_cFRC7mVec3_cf = .text:0x802686F0; // type:function size:0x5C +getGroundHeight__9dAcTbox_cFPfRC7mVec3_c = .text:0x802686A0; // type:function size:0x50 +isBelowGroundAtPos__9dAcTbox_cFfRC7mVec3_c = .text:0x802686F0; // type:function size:0x5C __ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC -__dt__10dAcTboxCcDFv = .text:0x80268A40; // type:function size:0x98 +__dt__14LinkedColliderFv = .text:0x80268A40; // type:function size:0x98 __dt__21sFState_c<9dAcTbox_c>Fv = .text:0x80268AE0; // type:function size:0x58 __dt__24sFStateFct_c<9dAcTbox_c>Fv = .text:0x80268B40; // type:function size:0x6C __dt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80268BB0; // type:function size:0xA0 @@ -14311,19 +14311,19 @@ initializeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D010; // type:function s executeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D080; // type:function size:0x74 finalizeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D100; // type:function size:0x4 getDowsingTargetOffset__9dAcTbox_cCFP7mVec3_c = .text:0x8026D110; // type:function size:0x8 -fn_8026D120 = .text:0x8026D120; // type:function size:0x8 -fn_8026D130 = .text:0x8026D130; // type:function size:0x10 +fn_8026D120__9dAcTbox_cCFv = .text:0x8026D120; // type:function size:0x8 +fn_8026D130__9dAcTbox_cFv = .text:0x8026D130; // type:function size:0x10 fn_8026D140__9dAcTbox_cFv = .text:0x8026D140; // type:function size:0x10 -AcTbox__doInteraction = .text:0x8026D150; // type:function size:0x98 +doInteraction__9dAcTbox_cFl = .text:0x8026D150; // type:function size:0x98 registerInEvent__9dAcTbox_cFv = .text:0x8026D1F0; // type:function size:0xDC unkVirtFunc_0x6C__9dAcTbox_cFv = .text:0x8026D2D0; // type:function size:0x68 -AcTbox__checkShouldClose = .text:0x8026D340; // type:function size:0xC -AcTbox__setShouldCloseFlag = .text:0x8026D350; // type:function size:0xC -AcTbox__unsetShouldCloseFlag = .text:0x8026D360; // type:function size:0xC -fn_8026D370 = .text:0x8026D370; // type:function size:0x4C +checkShouldClose__9dAcTbox_cFv = .text:0x8026D340; // type:function size:0xC +setShouldCloseFlag__9dAcTbox_cFv = .text:0x8026D350; // type:function size:0xC +unsetShouldCloseFlag__9dAcTbox_cFv = .text:0x8026D360; // type:function size:0xC +fn_8026D370__9dAcTbox_cFv = .text:0x8026D370; // type:function size:0x4C fn_8026D3C0__9dAcTbox_cFv = .text:0x8026D3C0; // type:function size:0xD4 setChestFlag__9dAcTbox_cFv = .text:0x8026D4A0; // type:function size:0x10 -AcTbox__setTboxFlag = .text:0x8026D4B0; // type:function size:0x18 +setTboxFlag__9dAcTbox_cFv = .text:0x8026D4B0; // type:function size:0x18 checkTboxFlag__9dAcTbox_cCFv = .text:0x8026D4D0; // type:function size:0x4C isNotSmall__9dAcTbox_cCFv = .text:0x8026D520; // type:function size:0x18 fn_8026D540__9dAcTbox_cFv = .text:0x8026D540; // type:function size:0x14 @@ -14341,14 +14341,14 @@ registerKeyPieceDowsing__9dAcTbox_cFv = .text:0x8026D830; // type:function size: registerRupeeOrTreasureDowsing__9dAcTbox_cFv = .text:0x8026D8A0; // type:function size:0x48 noUnregisterDowsing__9dAcTbox_cFv = .text:0x8026D8F0; // type:function size:0x4 unregisterDowsing__9dAcTbox_cFv = .text:0x8026D900; // type:function size:0x48 -fn_8026D950 = .text:0x8026D950; // type:function size:0x28 +fn_8026D950__9dAcTbox_cFv = .text:0x8026D950; // type:function size:0x28 checkIsClear__9dAcTbox_cCFv = .text:0x8026D980; // type:function size:0x140 fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 -fn_8026DAD0__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 +fn_8026DAD0__9dAcTbox_cCFPC7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 getCylParams__9dAcTbox_cCFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C getCCBounds__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC getInteractionTargetDef__9dAcTbox_cCFv = .text:0x8026E050; // type:function size:0x40 -fn_8026E090__9dAcTbox_cFv = .text:0x8026E090; // type:function size:0x594 +checkForLinkBonk__9dAcTbox_cFv = .text:0x8026E090; // type:function size:0x594 fn_8026E630__9dAcTbox_cFv = .text:0x8026E630; // type:function size:0x10C build__24sFStateFct_c<9dAcTbox_c>FRC12sStateIDIf_c = .text:0x8026E740; // type:function size:0x60 dispose__24sFStateFct_c<9dAcTbox_c>FRP10sStateIf_c = .text:0x8026E7A0; // type:function size:0xC @@ -14367,8 +14367,8 @@ initializeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E8D0; // t __sinit_\d_a_obj_tbox_cpp = .text:0x8026E900; // type:function size:0xA7C scope:local __dt__23sFStateID_c<9dAcTbox_c>Fv = .text:0x8026F380; // type:function size:0x58 isSameName__23sFStateID_c<9dAcTbox_c>CFPCc = .text:0x8026F3E0; // type:function size:0x88 -@316@__dt__10dAcTboxCcDFv = .text:0x8026F470; // type:function size:0x8 -@272@__dt__10dAcTboxCcDFv = .text:0x8026F480; // type:function size:0x8 +@316@__dt__14LinkedColliderFv = .text:0x8026F470; // type:function size:0x8 +@272@__dt__14LinkedColliderFv = .text:0x8026F480; // type:function size:0x8 AcTimeArea__ctor = .text:0x8026F490; // type:function size:0x1A8 fn_8026F640 = .text:0x8026F640; // type:function size:0x58 fn_8026F6A0 = .text:0x8026F6A0; // type:function size:0x6C @@ -30060,7 +30060,7 @@ lbl_80503278 = .data:0x80503278; // type:object size:0x9C lbl_80503314 = .data:0x80503314; // type:object size:0x6C __vt__7dBase_c = .data:0x80503380; // type:object size:0x4C lbl_805033D0 = .data:0x805033D0; // type:object size:0x10 -lbl_805033E0 = .data:0x805033E0; // type:object size:0x10 +__vt__18ColliderLinkedList = .data:0x805033E0; // type:object size:0x10 __vt__Q24dDvd8loader_c = .data:0x805033F0; // type:object size:0x10 lbl_80503400 = .data:0x80503400; // type:object size:0x40 lbl_80503440 = .data:0x80503440; // type:object size:0x6DF8 @@ -34484,7 +34484,7 @@ __vt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c> = .data:0x80535540; // t __vt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80535570; // type:object size:0x30 __vt__24sFStateFct_c<9dAcTbox_c> = .data:0x805355A0; // type:object size:0x14 __vt__21sFState_c<9dAcTbox_c> = .data:0x805355B8; // type:object size:0x18 -__vt__10dAcTboxCcD = .data:0x805355D0; // type:object size:0x7C +__vt__14LinkedCollider = .data:0x805355D0; // type:object size:0x7C __vt__23sFStateID_c<9dAcTbox_c> = .data:0x805359E0; // type:object size:0x34 g_profile_TIME_AREA = .data:0x80535A18; // type:object size:0x10 lbl_80535A28 = .data:0x80535A28; // type:object size:0x68 @@ -40047,7 +40047,7 @@ lbl_80575698 = .sbss:0x80575698; // type:object size:0x4 data:4byte lbl_8057569C = .sbss:0x8057569C; // type:object size:0x4 data:4byte lbl_805756A0 = .sbss:0x805756A0; // type:object size:0x4 data:4byte lbl_805756A4 = .sbss:0x805756A4; // type:object size:0x4 data:4byte -GODDESS_CHESTS_OPENED_COUNTER = .sbss:0x805756A8; // type:object size:0x8 data:4byte +sInstance__19GoddessChestCounter = .sbss:0x805756A8; // type:object size:0x8 data:4byte BOOT_PTR = .sbss:0x805756B0; // type:object size:0x4 data:4byte lbl_805756B4 = .sbss:0x805756B4; // type:object size:0x4 data:4byte TITLE_SCREEN_CHANGE = .sbss:0x805756B8; // type:object size:0x4 data:4byte @@ -48264,7 +48264,7 @@ lbl_8058F1B8 = .bss:0x8058F1B8; // type:object size:0x10 data:float lbl_8058F1C8 = .bss:0x8058F1C8; // type:object size:0x28 data:float lbl_8058F1F0 = .bss:0x8058F1F0; // type:object size:0x20 data:byte lbl_8058F210 = .bss:0x8058F210; // type:object size:0x10 -BLUR_AND_PALETTE_MGR = .bss:0x8058F220; // type:object size:0x5D70 +sInstance__21BlurAndPaletteManager = .bss:0x8058F220; // type:object size:0x5D70 lbl_80594F90 = .bss:0x80594F90; // type:object size:0x10 data:4byte lbl_80594FA0 = .bss:0x80594FA0; // type:object size:0x18 data:4byte lbl_80594FB8 = .bss:0x80594FB8; // type:object size:0x1C diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 674bb119..1f0b7691 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -59,6 +59,10 @@ public: static bool isKeyPiece(ITEM_ID item); static bool isTreasure(ITEM_ID item); + static bool getItemGetEventName(u16 item, const char **outName); + static void itemGetEventStart(dAcBase_c *); + static void itemGetEventEnd(dAcBase_c *); + private: /* 0x334 */ UNKTYPE *mpMdl; // Model has its own handling system /* 0x338 */ dShadowCircle_c mShdw; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 8c3ea526..8e9c0e79 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -112,7 +112,7 @@ public: /* vt 0x15C */ virtual void vt_0x15C(); /* vt 0x160 */ virtual void vt_0x160(); /* vt 0x164 */ virtual void vt_0x164(); - /* vt 0x168 */ virtual void getCurrentAnimFrame(); + /* vt 0x168 */ virtual f32 getCurrentAnimFrame() const; /* vt 0x16C */ virtual void getFloatIfStruggling(); /* vt 0x170 */ virtual void isSwimming(); /* vt 0x174 */ virtual void isGustBellowsBeingBlown(); diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index f621a13a..255d868b 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -7,6 +7,7 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_w.h" #include "d/col/cc/d_cc_d.h" +#include "d/d_cc.h" #include "d/d_shadow.h" #include "m/m3d/m_anmchr.h" #include "m/m3d/m_anmmatclr.h" @@ -23,30 +24,6 @@ #include "toBeSorted/dowsing_target.h" #include "toBeSorted/stage_render_stuff.h" -// Somewhere in d_cc -class dAcTboxCcD : public dCcD_Unk { -public: - dAcTboxCcD() : mpList(nullptr), field_0x210(this) {} - virtual ~dAcTboxCcD() { - if (mpList != nullptr) { - mpList->remove(&mNode); - mpList = nullptr; - } - } - /* 0x00 */ cListNd_c mNode; - /* 0x08 */ dCcD_Unk *field_0x210; - /* 0x0C */ cListMg_c *mpList; -}; - -struct TboxAndMoreUnkCC { - cListMg_c mList; - virtual ~TboxAndMoreUnkCC(); - - void addCc(dAcTboxCcD &ccD, const dCcD_SrcUnk &src); - void SetStts(cCcD_Stts &stts); - void registerColliders(); -}; - class dAcTbox_c : public dAcObjBase_c { public: enum TboxVariant_e { @@ -68,6 +45,7 @@ public: virtual void registerInEvent() override; virtual void unkVirtFunc_0x6C() override; + virtual void doInteraction(s32) override; virtual void *getObjectListEntry() override; @@ -115,19 +93,23 @@ private: void noRegisterDowsing(); void noUnregisterDowsing(); - static bool fn_80268660(int arg); bool checkForLinkBonk(); void fn_8026E630(); bool fn_8026D540(); - bool fn_8026D3C0(); + void fn_8026D3C0(); void syncScaleToMdl(m3d::scnLeaf_c *lf); void getCCBounds(mVec3_c *out1, mVec3_c *out2) const; void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3) const; - void fn_8026DAD0(mVec3_c *src, mVec3_c *dest) const; - void fn_8026DAC0(mAng& ang); + void fn_8026DAD0(const mVec3_c *src, mVec3_c *dest) const; + void fn_8026DAC0(mAng &ang); static bool hasCollectedAllTears(); static bool isValidVariant(int variant); + static bool tryGetDowsingTargetOffset(int variant, mVec3_c &out); + static void getDowsingTargetOffset(int variant, mVec3_c &out); + static bool isValidGroupIndex(int idx); + static bool getGroundHeight(f32 *height, const mVec3_c &pos); + static bool isBelowGroundAtPos(f32 height, const mVec3_c &pos); void setActionState(); @@ -137,9 +119,14 @@ private: void fn_8026D130(); void fn_8026D140(); void fn_8026D950(); + void fn_8026D370(); + + bool checkShouldClose(); + void setShouldCloseFlag(); + void unsetShouldCloseFlag(); + void setTboxFlag(); bool checkIsClear() const; - static bool fn_802686F0(const mVec3_c &vec, f32 y); const InteractionTargetDef &getInteractionTargetDef() const; /* 0x0330 */ m3d::mdlAnmChr mMdl1; @@ -161,9 +148,9 @@ private: s32 field_0x4F4; /* 0x04F8 */ dBgW mBgWs[2]; - /* 0x0918 */ dAcTboxCcD mCcD1; - /* 0x0B30 */ dAcTboxCcD mCcD2; - /* 0x0D48 */ TboxAndMoreUnkCC field_0x0D48; + /* 0x0918 */ LinkedCollider mCcD1; + /* 0x0B30 */ LinkedCollider mCcD2; + /* 0x0D48 */ ColliderLinkedList field_0x0D48; /* 0x0D54 */ dCcD_Unk mCcD3; /* 0x0F5C */ dCcD_Cyl mCcD4; /* 0x10AC */ STATE_MGR_DECLARE(dAcTbox_c); @@ -184,19 +171,19 @@ private: /* 0x11E4 */ u8 field_0x11E4[0x11E8 - 0x11E4]; /* 0x11E8 */ f32 field_0x11E8; - + /* 0x11EC */ f32 field_0x11EC; /* 0x11F0 */ UNKWORD field_0x11F0; /* 0x11F4 */ UNKWORD field_0x11F4; - + /* 0x11F8 */ UNKWORD field_0x11F8; - + /* 0x11FC */ UNKWORD field_0x11FC; /* 0x1200 */ u16 mItemId; /* 0x1202 */ u16 mItemModelIdx; - + /* 0x1204 */ bool mHasBeenOpened; /* 0x1205 */ u8 mSpawnSceneFlag; /* 0x1206 */ u8 mSetSceneFlag; // set when? diff --git a/include/d/d_cc.h b/include/d/d_cc.h new file mode 100644 index 00000000..42792ea9 --- /dev/null +++ b/include/d/d_cc.h @@ -0,0 +1,32 @@ +#ifndef D_CC_H +#define D_CC_H + +#include "c/c_list.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" + +// Somewhere in d_cc +class LinkedCollider : public dCcD_Unk { +public: + LinkedCollider() : mpList(nullptr), field_0x210(this) {} + virtual ~LinkedCollider() { + if (mpList != nullptr) { + mpList->remove(&mNode); + mpList = nullptr; + } + } + /* 0x00 */ cListNd_c mNode; + /* 0x08 */ dCcD_Unk *field_0x210; + /* 0x0C */ cListMg_c *mpList; +}; + +struct ColliderLinkedList { + cListMg_c mList; + virtual ~ColliderLinkedList(); + + void addCc(LinkedCollider &ccD, const dCcD_SrcUnk &src); + void SetStts(cCcD_Stts &stts); + void registerColliders(); +}; + +#endif diff --git a/include/d/flag/tboxflag_manager.h b/include/d/flag/tboxflag_manager.h index a675b789..dd64a252 100644 --- a/include/d/flag/tboxflag_manager.h +++ b/include/d/flag/tboxflag_manager.h @@ -21,7 +21,7 @@ public: virtual ~TBoxflagManager() {} void init(); void copyFromSave(u32 sceneIndex); - bool checkFlag(u16 sceneIndex, u16 flag); + u16 checkFlag(u16 sceneIndex, u16 flag); virtual u16 getFlagCount() const; void setFlag(u16 flag); bool checkUncommittedFlag(u16 sceneIndex, u16 flag); diff --git a/include/toBeSorted/blur_and_palette_manager.h b/include/toBeSorted/blur_and_palette_manager.h new file mode 100644 index 00000000..cedc1ee4 --- /dev/null +++ b/include/toBeSorted/blur_and_palette_manager.h @@ -0,0 +1,27 @@ +#ifndef BLUR_AND_PALETTE_MANAGER_H +#define BLUR_AND_PALETTE_MANAGER_H + +#include "common.h" +#include "m/m_vec.h" + +class BlurAndPaletteManager { +public: + static BlurAndPaletteManager &GetInstance() { + return sInstance; + } + + void fn_800247D0(mVec3_c, f32); + void fn_80022AF0(f32); + void setField_0x2F20(f32 arg) { + field_0x2F20 = arg; + } + void fn_800223A0(void *); + void fn_80022440(void *); + +private: + u8 field_0x0000[0x2F20 - 0x0000]; + f32 field_0x2F20; + static BlurAndPaletteManager sInstance; +}; + +#endif diff --git a/include/toBeSorted/counters/counter.h b/include/toBeSorted/counters/counter.h index 5d0cc029..07f5b334 100644 --- a/include/toBeSorted/counters/counter.h +++ b/include/toBeSorted/counters/counter.h @@ -16,4 +16,4 @@ public: u16 counterId; }; -#endif COUNTER_H +#endif diff --git a/include/toBeSorted/counters/goddess_chest_counter.h b/include/toBeSorted/counters/goddess_chest_counter.h new file mode 100644 index 00000000..e1c62403 --- /dev/null +++ b/include/toBeSorted/counters/goddess_chest_counter.h @@ -0,0 +1,19 @@ +#ifndef GODDESS_CHEST_COUNTER_H +#define GODDESS_CHEST_COUNTER_H + +#include "toBeSorted/counters/counter.h" + +class GoddessChestCounter : public Counter { +public: + GoddessChestCounter() : Counter(0x43F) {} + virtual ~GoddessChestCounter() {}; + + virtual u16 getCommittedValue() override; + virtual u16 getMax() override; + virtual u16 getUncommittedValue() override; + virtual void setValue(u16 num) override; + + static GoddessChestCounter sInstance; +}; + +#endif diff --git a/include/toBeSorted/event.h b/include/toBeSorted/event.h index 01a6af2e..f07f8aa6 100644 --- a/include/toBeSorted/event.h +++ b/include/toBeSorted/event.h @@ -16,8 +16,9 @@ public: public: /** 0x800A0C40 */ - Event(char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2); + Event(const char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2); Event(u32 eventId, s32 roomId, u32 eventFlags, void *callback1, void *callback2); + Event(const char *eventName, void *zevDat, u32 unk, u32 eventFlags, void *callback1, void *callback2); /** 0x800A1240 */ virtual ~Event(); }; diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index 98997300..bd98a1c9 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -12,6 +12,7 @@ class EventManager { public: static bool isInEvent(dAcBase_c *actor, const char *eventName); static bool finishEvent(dAcBase_c *actor, const char *eventName); + static void changeOwnEvent(dAcBase_c *actor1, dAcBase_c *actor2, Event *event, UNKWORD); static bool alsoSetAsCurrentEvent(dAcBase_c *actor, Event *event, void *unknown); static EventManager *sInstance; 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 212db3fb..45129dd7 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 @@ -18,6 +18,7 @@ #include "m/m_vec.h" #include "rvl/MTX/vec.h" #include "s/s_Math.h" +#include "toBeSorted/blur_and_palette_manager.h" #include "toBeSorted/dowsing_target.h" void float_ordering() { @@ -91,8 +92,6 @@ int dAcOTumbleWeed_c::doDelete() { return SUCCEEDED; } -extern "C" void fn_800247D0(void *, mVec3_c, f32); -extern "C" UNKWORD BLUR_AND_PALETTE_MGR; int dAcOTumbleWeed_c::actorExecute() { if (!mField_0x98C && !isStopped()) { @@ -106,7 +105,7 @@ int dAcOTumbleWeed_c::actorExecute() { calcWind(); sLib::chase(&mField_0x980, 1.f, 0.1f); - fn_800247D0(&BLUR_AND_PALETTE_MGR, mField_0x968, mField_0x980); + BlurAndPaletteManager::GetInstance().fn_800247D0(mField_0x968, mField_0x980); calcVelocity(); position += velocity; diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index c7190f00..c7999e84 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1,6 +1,7 @@ #include "d/a/obj/d_a_obj_tbox.h" #include "c/c_lib.h" +#include "c/c_math.h" #include "common.h" #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" @@ -12,6 +13,7 @@ #include "d/col/cc/d_cc_s.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" +#include "d/flag/tboxflag_manager.h" #include "m/m3d/m_fanm.h" #include "m/m3d/m_scnleaf.h" #include "m/m_mtx.h" @@ -25,13 +27,15 @@ #include "s/s_Math.h" #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/attention.h" +#include "toBeSorted/blur_and_palette_manager.h" +#include "toBeSorted/counters/goddess_chest_counter.h" #include "toBeSorted/dowsing_target.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); -extern "C" mVec3_c vecs[] = { +static mVec3_c sDowsingTargetOffsets[] = { mVec3_c(0.0f, 54.0f, 0.0f), mVec3_c(0.0f, 34.0f, 0.0f), mVec3_c(0.0f, 66.5f, 0.0f), mVec3_c(0.0f, 49.0f, 0.0f) }; @@ -729,13 +733,6 @@ static const u8 sItemToTBoxVariant[MAX_ITEM_ID + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static char *const sMdlNames[] = { - "TBoxNormalT", - "TBoxSmallT", - "TBoxBossT", - "GoddessTBox", -}; - static char *const sAnmNames[] = { "TBoxNormalT", "TBoxSmallT", @@ -743,6 +740,13 @@ static char *const sAnmNames[] = { "TBoxNormalT", }; +static char *const sMdlNames[] = { + "TBoxNormalT", + "TBoxSmallT", + "TBoxBossT", + "GoddessTBox", +}; + static char *const sCloseCcNames[] = { "TBoxNormalTClose", "TBoxSmallTClose", @@ -757,10 +761,55 @@ static char *const sOpenCcNames[] = { "GoddessTBoxOpen", }; +bool dAcTbox_c::tryGetDowsingTargetOffset(int variant, mVec3_c &out) { + bool ok = dAcTbox_c::isValidVariant(variant); + if (ok) { + out.x = sDowsingTargetOffsets[variant].x; + out.y = sDowsingTargetOffsets[variant].y; + out.z = sDowsingTargetOffsets[variant].z; + } + return ok; +} + +void dAcTbox_c::getDowsingTargetOffset(int variant, mVec3_c &out) { + tryGetDowsingTargetOffset(variant, out); +} + f32 dAcTbox_c::getSomeRate() { return 1.0f / 8.333333f; } +bool dAcTbox_c::isValidGroupIndex(int idx) { + return 0 <= idx && idx < 15; +} +extern "C" void *SIREN_TAG; +extern "C" bool hasCollectedAllTears(void *SIREN_TAG); +bool dAcTbox_c::hasCollectedAllTears() { + if (SIREN_TAG == nullptr) { + return false; + } + return ::hasCollectedAllTears(SIREN_TAG); +} + +bool dAcTbox_c::getGroundHeight(f32 *height, const mVec3_c &pos) { + if (height == nullptr) { + return false; + } + bool ok = dBgS_ObjGndChk::CheckPos(pos); + if (ok) { + *height = dBgS_ObjGndChk::GetGroundHeight(); + } + return ok; +} + +bool dAcTbox_c::isBelowGroundAtPos(f32 height, const mVec3_c &pos) { + f32 gndHeight; + if (!getGroundHeight(&gndHeight, pos)) { + return false; + } + return height < gndHeight; +} + dAcTbox_c::dAcTbox_c() : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), mDowsingTarget(this, DowsingTarget::SLOT_NONE), mGoddessDowsingTarget(this, DowsingTarget::SLOT_NONE) { @@ -899,7 +948,7 @@ bool dAcTbox_c::createHeap() { return true; } -static u32 sSomeCounters[16] = {0}; +static u32 sSomeCounters[15] = {0}; int dAcTbox_c::create() { if (!isActualVisibleBox()) { @@ -937,7 +986,7 @@ int dAcTbox_c::create() { // This part of the code checks if there's another chest with similar properties // and only keeps one of them. - if (fn_80268660(field_0x1208) && !field_0x1210) { + if (isValidGroupIndex(field_0x1208) && !field_0x1210) { sSomeCounters[field_0x1208]++; field_0x1210 = true; } @@ -946,12 +995,12 @@ int dAcTbox_c::create() { u32 counterValue = 0; getSomeCounter(&counterValue); if (counterValue > 1) { - bool keepGoing = true; dAcTbox_c *other; + bool keepGoing = true; dAcObjBase_c *cursor = nullptr; do { - cursor = getNextObject(&sTboxActorList, cursor); - other = static_cast(cursor); + other = static_cast(getNextObject(&sTboxActorList, cursor)); + cursor = other; if (other != nullptr && this != other && !other->field_0x120D && field_0x1208 == other->field_0x1208) { keepGoing = false; } @@ -1047,8 +1096,8 @@ int dAcTbox_c::create() { } field_0x0D48.SetStts(mStts); // TODO figure out the right fields - mCcD1.SetTgType(-1); - mCcD2.SetTgType(-1); + mCcD1.SetTg_0x4C(-1); + mCcD2.SetTg_0x4C(-1); mMdl1.setAnm(sAnmNames[mVariant], m3d::PLAY_MODE_4); if (mHasBeenOpened == true) { mMdl1.setFrame(mMdl1.getAnm().getEndFrame()); @@ -1193,7 +1242,7 @@ int dAcTbox_c::actorExecute() { switch (field_0x120C) { case 0: v1.set(-38.0f, 0.0f, -35.0f); - v2.set(38.0f, 45.0f, 35.0f); + v2.set(38.0f, 45.0f, 31.0f); break; case 1: v1.set(-38.0f, 0.0f, -35.0f); @@ -1379,7 +1428,7 @@ int dAcTbox_c::actorExecuteInEvent() { switch (field_0x120C) { case 0: v1.set(-38.0f, 0.0f, -35.0f); - v2.set(38.0f, 45.0f, 35.0f); + v2.set(38.0f, 45.0f, 31.0f); break; case 1: v1.set(-38.0f, 0.0f, -35.0f); @@ -1574,7 +1623,7 @@ void dAcTbox_c::initializeState_DugOut() { } setActorProperty(0x100); if (mVariant == NORMAL) { - mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + mMdl1.setAnm(sAnmNames[0], m3d::PLAY_MODE_4); } if (mVariant == NORMAL) { if (checkTboxFlag()) { @@ -1761,7 +1810,7 @@ void dAcTbox_c::initializeState_WaitOpen() { field_0x120C = 0; clearActorProperty(0x100); if (mVariant == NORMAL) { - mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + mMdl1.setAnm(sAnmNames[0], m3d::PLAY_MODE_4); } if (mVariant == NORMAL) { mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); @@ -1817,7 +1866,7 @@ void dAcTbox_c::initializeState_DeleteArchive() { mScale.set(1.0f, 1.0f, 1.0f); clearActorProperty(0x100); if (mVariant == NORMAL) { - mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + mMdl1.setAnm(sAnmNames[0], m3d::PLAY_MODE_4); } if (mVariant == NORMAL) { mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); @@ -1855,7 +1904,7 @@ void dAcTbox_c::initializeState_LoadArchive() { mScale.set(1.0f, 1.0f, 1.0f); clearActorProperty(0x100); if (mVariant == NORMAL) { - mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + mMdl1.setAnm(sAnmNames[0], m3d::PLAY_MODE_4); } if (mVariant == NORMAL) { mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); @@ -1879,28 +1928,282 @@ void dAcTbox_c::executeState_LoadArchive() { } void dAcTbox_c::finalizeState_LoadArchive() {} -void dAcTbox_c::initializeState_Open() {} -void dAcTbox_c::executeState_Open() {} +extern "C" void fn_800298B0(u16 effectIndex, mVec3_c *, mAng3_c *, mVec3_c *, void *, void *, void *, void *); +extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_209_; +extern "C" bool isPouchItem(u16); +extern "C" u8 adventurePouchFindItemSlot(ITEM_ID item); +extern "C" u16 findItemInItemCheck(ITEM_ID item); +extern "C" dAcItem_c *giveItem3(u16 item, s32); + +void dAcTbox_c::initializeState_Open() { + mScale.set(1.0f, 1.0f, 1.0f); + playSound(0xA36); + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D370(); + + if (isNotSmall()) { + mAnmMatClr2.setFrame(mAnmMatClr2.getFrameStart(0), 0); + mAnmChr.setFrameOnly(mAnmChr.getStartFrame()); + mAnmTexSrt1.setFrame(mAnmTexSrt1.getFrameStart(0), 0); + } + + if (isNotSmall()) { + mVec3_c pos; + fn_8026B380(pos); + mVec3_c p2 = fn_8026B3C0(); + fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_209_, &pos, &rotation, &p2, nullptr, nullptr, nullptr, nullptr); + } + fn_8026D140(); + ITEM_ID itemId = mItemId != 0 ? (ITEM_ID)mItemId : ITEM_GODDESS_HARP; + if (isPouchItem(itemId) && adventurePouchFindItemSlot(ITEM_NONE) == 8 && findItemInItemCheck(ITEM_NONE) == 0x3C) { + setShouldCloseFlag(); + } + dAcItem_c *item = giveItem3(itemId, -1); + if (item != nullptr) { + mItemRef.link(item); + const char *evName; + if (dAcItem_c::getItemGetEventName(itemId, &evName)) { + Event ev(evName, 300, 4, (void *)dAcItem_c::itemGetEventStart, (void *)dAcItem_c::itemGetEventEnd); + EventManager::changeOwnEvent(this, item, &ev, 0); + } + } + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; +} +void dAcTbox_c::executeState_Open() { + mMdl1.setFrame(dAcPy_c::LINK->getCurrentAnimFrame()); + if (mVariant == GODDESS) { + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else if (mVariant != SMALL) { + // exact same code as in the other branch + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } + if (mMdl1.getAnm().isStop()) { + mStateMgr.changeState(StateID_PresentItem); + } +} void dAcTbox_c::finalizeState_Open() {} -void dAcTbox_c::initializeState_PresentItem() {} -void dAcTbox_c::executeState_PresentItem() {} +void dAcTbox_c::initializeState_PresentItem() { + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; +} + +void dAcTbox_c::executeState_PresentItem() { + // Copied from executeState_Open + if (mVariant == GODDESS) { + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else if (mVariant != SMALL) { + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } + mEvent.advanceNext(); + if (checkShouldClose()) { + unsetShouldCloseFlag(); + mStateMgr.changeState(StateID_Close); + } else { + mHasBeenOpened = true; + if (mSetSceneFlag < 0xFF) { + SceneflagManager::sInstance->setFlag(roomid, mSetSceneFlag); + } + setTboxFlag(); + if (mVariant == GODDESS) { + mStateMgr.changeState(StateID_GoddessWait); + GoddessChestCounter::sInstance.checkedAdd(1); + } else { + mStateMgr.changeState(StateID_Wait); + } + } +} void dAcTbox_c::finalizeState_PresentItem() {} -void dAcTbox_c::initializeState_Close() {} -void dAcTbox_c::executeState_Close() {} +void dAcTbox_c::initializeState_Close() { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_3); + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + field_0x11FC = 0x2D; + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; +} +void dAcTbox_c::executeState_Close() { + switch ((u32)mVariant) { + case NORMAL: + case BOSS: + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } + if (!EventManager::isInEvent()) { + if (mMdl1.getAnm().isStop()) { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_1); + mStateMgr.changeState(StateID_WaitOpen); + } else { + mMdl1.play(); + } + } + break; + case SMALL: + if (!EventManager::isInEvent()) { + if (mMdl1.getAnm().isStop()) { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_1); + mStateMgr.changeState(StateID_WaitOpen); + } else { + mMdl1.play(); + } + } + break; + case GODDESS: + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } + if (!EventManager::isInEvent()) { + if (mMdl1.getAnm().isStop()) { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_1); + mStateMgr.changeState(StateID_GoddessWaitOn); + } else { + mMdl1.play(); + } + } + break; + } +} void dAcTbox_c::finalizeState_Close() {} -void dAcTbox_c::initializeState_Wait() {} -void dAcTbox_c::executeState_Wait() {} +void dAcTbox_c::initializeState_Wait() { + mScale.set(1.0f, 1.0f, 1.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + switch ((u32)mVariant) { + case NORMAL: + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + break; + case SMALL: + field_0x11C0.set(-38.0f, 0.0f, -68.0f); + field_0x11CC.set(38.0f, 101.0f, 31.0f); + break; + case BOSS: + field_0x11C0.set(-90.0f, 0.0f, -135.0f); + field_0x11CC.set(90.0f, 163.0f, 56.0f); + break; + } + field_0x120C = 1; + clearActorProperty(0x100); + if (mVariant == 0) { + mMdl1.setAnm(sAnmNames[0], m3d::PLAY_MODE_4); + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + mMdl1.setFrame(mMdl1.getAnm().getEndFrame()); + field_0x11FC = 0x2D; + fn_8026D130(); +} +void dAcTbox_c::executeState_Wait() { + if (mVariant == NORMAL || mVariant == BOSS) { + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } + } +} void dAcTbox_c::finalizeState_Wait() {} -void dAcTbox_c::initializeState_GoddessWait() {} -void dAcTbox_c::executeState_GoddessWait() {} +void dAcTbox_c::initializeState_GoddessWait() { + mScale.set(1.0f, 1.0f, 1.0f); + field_0x11C0.set(-62.0f, 0.0f, -95.0f); + field_0x11CC.set(62.0f, 140.0f, 47.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; + clearActorProperty(0x100); + field_0x11FC = 0x2D; + fn_8026D130(); +} +void dAcTbox_c::executeState_GoddessWait() { + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + // this is apparently not needed here + // BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } +} void dAcTbox_c::finalizeState_GoddessWait() {} -extern "C" dAcBase_c *getCurrentEventActor(); +void dAcTbox_c::getDowsingTargetOffset(mVec3_c *out) const { + return getDowsingTargetOffset(mVariant, *out); +} +bool dAcTbox_c::fn_8026D120() const { + return true; +} + +void dAcTbox_c::fn_8026D130() { + setActorProperty(0x1); +} + +void dAcTbox_c::fn_8026D140() { + clearActorProperty(0x1); +} + +void dAcTbox_c::doInteraction(s32 _unused) { + void *zevDat = getOarcZev(sArcNames[mVariant]); + if (zevDat != nullptr) { + Event ev(sOpenEventNames[mVariant], zevDat, 100, 0x100001, 0, 0); + mEvent.scheduleEvent(ev, 0); + } +} + +extern "C" dAcBase_c *getCurrentEventActor(); void dAcTbox_c::registerInEvent() { if (getCurrentEventActor() == mItemRef.get()) { if (EventManager::isCurrentEvent("ItemGetDefaultTBox") || EventManager::isCurrentEvent("ItemGetGorgeousTBox")) { @@ -1918,10 +2221,88 @@ void dAcTbox_c::unkVirtFunc_0x6C() { } } +bool dAcTbox_c::checkShouldClose() { + return field_0x11F4 & 0x1; +} + +void dAcTbox_c::setShouldCloseFlag() { + setFlags(field_0x11F4 | 0x1); +} + +void dAcTbox_c::unsetShouldCloseFlag() { + setFlags(field_0x11F4 & ~0x1); +} + +void dAcTbox_c::fn_8026D370() { + if (isNotSmall()) { + field_0x11F0 = 1; + BlurAndPaletteManager::GetInstance().fn_800223A0(&field_0x4DC); + } +} + +void dAcTbox_c::fn_8026D3C0() { + if (mAnmChr.isStop() && mAnmTexSrt1.isStop(0) && mAnmMatClr2.isStop(0)) { + field_0x11F0 = 0; + BlurAndPaletteManager::GetInstance().fn_80022440(&field_0x4DC); + } else { + mAnmChr.play(); + mAnmTexSrt1.play(); + mAnmMatClr2.play(); + field_0x4E8.r = 0xAA; + field_0x4E8.g = 0x96; + field_0x4E8.b = 0x96; + field_0x4EC = 125.0f; + } +} + +void dAcTbox_c::setChestFlag() { + field_0x1207 = (rotation.z >> 9) & 0x3F; +} + +void dAcTbox_c::setTboxFlag() { + if (field_0x1207 <= 0x1F) { + TBoxflagManager::sInstance->setFlag(field_0x1207); + } +} + +bool dAcTbox_c::checkTboxFlag() const { + if (field_0x1207 <= 0x1F) { + return TBoxflagManager::sInstance->checkFlag(TBoxflagManager::sInstance->mSceneIndex, field_0x1207); + } + return false; +} + bool dAcTbox_c::isNotSmall() const { return mVariant != SMALL; } +bool dAcTbox_c::fn_8026D540() { + return field_0x11F0 == 1; +} + +bool dAcTbox_c::fn_8026D560() const { + if (isValidGroupIndex(field_0x1208)) { + u32 counterVal; + getSomeCounter(&counterVal); + f32 cmp = 1.0f / counterVal; + return cM::rndF(1.0f) <= cmp; + } + return true; +} + +bool dAcTbox_c::getSomeCounter(u32 *outValue) const { + bool ok = isValidGroupIndex(field_0x1208); + if (ok) { + *outValue = sSomeCounters[field_0x1208]; + ok = *outValue; + } + return ok; +} + +bool dAcTbox_c::fn_8026D670() const { + return isValidGroupIndex(field_0x1208); +} + void dAcTbox_c::syncScaleToMdl(m3d::scnLeaf_c *lf) { lf->setScale(mScale); } @@ -1989,6 +2370,12 @@ void dAcTbox_c::unregisterDowsing() { } } +extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_208_; + +void dAcTbox_c::fn_8026D950() { + fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_208_, &position, &rotation, nullptr, nullptr, nullptr, nullptr, nullptr); +} + bool dAcTbox_c::checkIsClear() const { f32 fs[] = { position.y, @@ -2010,7 +2397,7 @@ bool dAcTbox_c::checkIsClear() const { bool isClear = true; for (u32 i = 0; isClear && i <= 3;) { // @bug should this be points[i] instead? - if (fn_802686F0(points[0], fs[fsIdxes[i]])) { + if (isBelowGroundAtPos(fs[fsIdxes[i]], points[0])) { isClear = false; } else { i++; @@ -2020,6 +2407,14 @@ bool dAcTbox_c::checkIsClear() const { return isClear; } +void dAcTbox_c::fn_8026DAC0(mAng &ang) { + ang = rotation.y - 0x8000; +} + +void dAcTbox_c::fn_8026DAD0(const mVec3_c *a, mVec3_c *b) const { + PSMTXMultVec(mWorldMtx, *a, *b); +} + void dAcTbox_c::getCylParams(mVec3_c *c, f32 *r, f32 *h) const { switch ((u32)mVariant) { case NORMAL: @@ -2240,10 +2635,10 @@ bool dAcTbox_c::checkForLinkBonk() { } bool bonk = false; - bonk = bonk || (ccLo.x <= linkPos.x && linkPos.x <= ccHi.x) && - (ccLo.z - 80.0f <= linkPos.z && linkPos.z <= ccHi.z + 80.0f); - bonk = bonk || (ccLo.z <= linkPos.z && linkPos.z <= ccHi.z) && - (ccLo.x - 80.0f <= linkPos.x && linkPos.x <= ccHi.x + 80.0f); + bonk = bonk || + (ccLo.x <= linkPos.x && linkPos.x <= ccHi.x) && (ccLo.z - 80.0f <= linkPos.z && linkPos.z <= ccHi.z + 80.0f); + bonk = bonk || + (ccLo.z <= linkPos.z && linkPos.z <= ccHi.z) && (ccLo.x - 80.0f <= linkPos.x && linkPos.x <= ccHi.x + 80.0f); bonk = bonk || (linkPos.x < ccLo.x && linkPos.z < ccLo.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); bonk = bonk || (ccHi.x < linkPos.x && ccHi.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); bonk = bonk || (linkPos.x < ccLo.x && ccLo.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); @@ -2260,7 +2655,7 @@ bool dAcTbox_c::checkForLinkBonk() { } // TODO - + link->bonk(); return false; diff --git a/src/d/flag/tboxflag_manager.inc b/src/d/flag/tboxflag_manager.inc index a00ac045..a2eb7e07 100644 --- a/src/d/flag/tboxflag_manager.inc +++ b/src/d/flag/tboxflag_manager.inc @@ -33,7 +33,7 @@ void TBoxflagManager::copyFromSave(u32 sceneIndex) { } /* 0x800BE990 */ -bool TBoxflagManager::checkFlag(u16 sceneIndex, u16 flag) { +u16 TBoxflagManager::checkFlag(u16 sceneIndex, u16 flag) { s32 actualFlag = (flag + sceneIndex * 0x20); return mFlagHelper.checkFlag( actualFlag / 16, flag % 16, FileManager::getInstance()->getTBoxFlagsConst(), getFlagCount() From 531ca3a7aad9181d4eebf3a0f7a8f3b9c4adcb03 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 22 Nov 2024 17:18:31 +0100 Subject: [PATCH 10/17] Cleanup --- src/d/a/obj/d_a_obj_tbox.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index c7999e84..60d07e7c 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -39,10 +39,10 @@ static mVec3_c sDowsingTargetOffsets[] = { mVec3_c(0.0f, 54.0f, 0.0f), mVec3_c(0.0f, 34.0f, 0.0f), mVec3_c(0.0f, 66.5f, 0.0f), mVec3_c(0.0f, 49.0f, 0.0f) }; -extern "C" mVec3_c v1 = mVec3_c(0.0f, 0.0f, -2.0f); -extern "C" mVec3_c v2 = mVec3_c(1.0f, 1.0f, 0.8f); -extern "C" mVec3_c v3 = mVec3_c(1.0f, 1.0f, 1.0f); -extern "C" mVec3_c v4 = mVec3_c(0.0f, 0.0f, 88.0f); +static mVec3_c sVec1 = mVec3_c(0.0f, 0.0f, -2.0f); +static mVec3_c sVec2 = mVec3_c(1.0f, 1.0f, 0.8f); +static mVec3_c sVec3 = mVec3_c(1.0f, 1.0f, 1.0f); +static mVec3_c sVec4 = mVec3_c(0.0f, 0.0f, 88.0f); STATE_DEFINE(dAcTbox_c, DugOut); STATE_DEFINE(dAcTbox_c, WaitAppear); @@ -76,7 +76,7 @@ static const char *const sOpenAnmClrName = "FX_TBoxOpen"; static const char *const sAppearAnmName = "TBoxNormalT_appear"; -extern "C" char *const sOpenEventNames[] = { +static char *const sOpenEventNames[] = { "TreasureBoxOpen", "TreasureBoxOpenSmall", "TreasureBoxOpenBoss", @@ -1360,7 +1360,7 @@ int dAcTbox_c::actorExecuteInEvent() { case 'crct': { mVec3_c v1; mAng a1; - fn_8026DAD0(&v4, &v1); + fn_8026DAD0(&sVec4, &v1); fn_8026DAC0(a1); dAcPy_c *link = dAcPy_c::LINK; if (field_0x120B < 3) { @@ -1601,15 +1601,15 @@ void dAcTbox_c::fn_8026B380(mVec3_c &out) const { out.y = position.y; out.z = position.z; } else { - fn_8026DAD0(&v1, &out); + fn_8026DAD0(&sVec1, &out); } } const mVec3_c &dAcTbox_c::fn_8026B3C0() const { if (mVariant == BOSS) { - return v3; + return sVec3; } - return v2; + return sVec2; } void dAcTbox_c::initializeState_DugOut() { From ee64481b9ca7b80978d93aa717d09f861da2308a Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 22 Nov 2024 19:19:23 +0100 Subject: [PATCH 11/17] Fixes --- config/SOUE01/splits.txt | 3 +++ include/d/d_cc.h | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 7af7199a..0738826f 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -44,6 +44,9 @@ d/a/obj/d_a_obj_base.cpp: d/a/e/d_a_e_base.cpp: .text start:0x8002F300 end:0x80030CB0 .ctors start:0x804DB664 end:0x804DB668 + .data start:0x80501638 end:0x805016E0 + .sbss start:0x80575098 end:0x805750A0 + .bss start:0x80597020 end:0x80597030 d/a/npc/d_a_npc.cpp: .text start:0x80030CB0 end:0x8003F718 diff --git a/include/d/d_cc.h b/include/d/d_cc.h index 42792ea9..e150555f 100644 --- a/include/d/d_cc.h +++ b/include/d/d_cc.h @@ -15,9 +15,9 @@ public: mpList = nullptr; } } - /* 0x00 */ cListNd_c mNode; - /* 0x08 */ dCcD_Unk *field_0x210; - /* 0x0C */ cListMg_c *mpList; + /* 0x208 */ cListNd_c mNode; + /* 0x210 */ dCcD_Unk *field_0x210; + /* 0x214 */ cListMg_c *mpList; }; struct ColliderLinkedList { From d70141b14b9070d1421a672f89f82290856590a5 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 22 Nov 2024 21:30:35 +0100 Subject: [PATCH 12/17] Decompile the ColliderLinkedList stuff too --- config/SOUE01/splits.txt | 3 +- config/SOUE01/symbols.txt | 56 ++++++------ configure.py | 1 + include/c/c_list.h | 2 + include/d/a/obj/d_a_obj_tbox.h | 4 +- include/d/col/c/c_cc_d.h | 18 ++++ include/d/d_cc.h | 89 ++++++++++++++++--- src/c/c_list.cpp | 6 ++ src/d/d_cc.cpp | 157 +++++++++++++++++++++++++++++++++ 9 files changed, 295 insertions(+), 41 deletions(-) create mode 100644 src/d/d_cc.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 0738826f..9ef4c36b 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -72,6 +72,7 @@ d/d_base.cpp: d/d_cc.cpp: .text start:0x80050A20 end:0x800520F0 + .data start:0x805033D0 end:0x805033F0 d/d_dvd.cpp: .text start:0x800520F0 end:0x800522FC @@ -804,7 +805,7 @@ DynamicLink.cpp: .sbss start:0x80575B80 end:0x80575BA0 c/c_list.cpp: - .text start:0x802E08C0 end:0x802E0A10 + .text start:0x802E08C0 end:0x802E0A50 c/c_tree.cpp: .text start:0x802E0E70 end:0x802E1140 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f9eb3290..18acb3b2 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2115,30 +2115,30 @@ fn_800515D0 = .text:0x800515D0; // type:function size:0x60 fn_800051630__13dAcObjRef_unkFv = .text:0x80051630; // type:function size:0x144 fn_80051780__13dAcObjRef_unkFRC8cCcD_Obj = .text:0x80051780; // type:function size:0x464 fn_80051BF0 = .text:0x80051BF0; // type:function size:0x8 -fn_80051C00 = .text:0x80051C00; // type:function size:0x4C -InitColliderAndAddToFront = .text:0x80051C50; // type:function size:0x5C -fn_80051CB0 = .text:0x80051CB0; // type:function size:0x5C -InitCollider2AndAddToFront = .text:0x80051D10; // type:function size:0x5C -addCc__18ColliderLinkedListFR14LinkedColliderRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C -fn_80051DD0 = .text:0x80051DD0; // type:function size:0x64 -fn_80051E40 = .text:0x80051E40; // type:function size:0x64 -ColliderManager__staticAddCollider = .text:0x80051EB0; // type:function size:0x34 +postInit__18ColliderLinkedListFR8cCcD_Obj = .text:0x80051C00; // type:function size:0x4C +addCc__18ColliderLinkedListFR17LinkedColliderCylRC11dCcD_SrcCyl = .text:0x80051C50; // type:function size:0x5C +addCc__18ColliderLinkedListFR17LinkedColliderSphRC11dCcD_SrcSph = .text:0x80051CB0; // type:function size:0x5C +addCc__18ColliderLinkedListFR17LinkedColliderCpsRC11dCcD_SrcCps = .text:0x80051D10; // type:function size:0x5C +addCc__18ColliderLinkedListFR17LinkedColliderUnkRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C +foreachCc__18ColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051DD0; // type:function size:0x64 +foreachCc2__18ColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051E40; // type:function size:0x64 +Set__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051EB0; // type:function size:0x34 registerColliders__18ColliderLinkedListFv = .text:0x80051EF0; // type:function size:0x10 -fn_80051F00 = .text:0x80051F00; // type:function size:0x8 +SetStts__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051F00; // type:function size:0x8 SetStts__18ColliderLinkedListFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 -ColliderLinkedList__search = .text:0x80051F20; // type:function size:0x74 -fn_80051FA0 = .text:0x80051FA0; // type:function size:0x1C -fn_80051FC0 = .text:0x80051FC0; // type:function size:0x10 -fn_80051FD0 = .text:0x80051FD0; // type:function size:0x10 -fn_80051FE0 = .text:0x80051FE0; // type:function size:0x10 -fn_80051FF0 = .text:0x80051FF0; // type:function size:0x1C -fn_80052010 = .text:0x80052010; // type:function size:0x10 -fn_80052020 = .text:0x80052020; // type:function size:0x10 -fn_80052030 = .text:0x80052030; // type:function size:0x10 -fn_80052040 = .text:0x80052040; // type:function size:0x1C -fn_80052060 = .text:0x80052060; // type:function size:0x10 -fn_80052070 = .text:0x80052070; // type:function size:0x10 -fn_80052080 = .text:0x80052080; // type:function size:0x10 +find__18ColliderLinkedListCFM8cCcD_ObjFPCvPv_b = .text:0x80051F20; // type:function size:0x74 +AtSet__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FA0; // type:function size:0x1C +AtSet__18ColliderLinkedListFv = .text:0x80051FC0; // type:function size:0x10 +ClrAt__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FD0; // type:function size:0x10 +ClrAt__18ColliderLinkedListFv = .text:0x80051FE0; // type:function size:0x10 +TgSet__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FF0; // type:function size:0x1C +TgSet__18ColliderLinkedListFv = .text:0x80052010; // type:function size:0x10 +ClrTg__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80052020; // type:function size:0x10 +ClrTg__18ColliderLinkedListFv = .text:0x80052030; // type:function size:0x10 +CoSet__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80052040; // type:function size:0x1C +CoSet__18ColliderLinkedListFv = .text:0x80052060; // type:function size:0x10 +ClrCo__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80052070; // type:function size:0x10 +ClrCo__18ColliderLinkedListFv = .text:0x80052080; // type:function size:0x10 __dt__18ColliderLinkedListFv = .text:0x80052090; // type:function size:0x60 create__4dDvdFlPQ23EGG4HeapPQ23EGG4HeapPQ23EGG4Heap = .text:0x800520F0; // type:function size:0x4 __ct__Q24dDvd8loader_cFv = .text:0x80052100; // type:function size:0x28 @@ -14245,7 +14245,7 @@ hasCollectedAllTears__9dAcTbox_cFv = .text:0x80268680; // type:function size:0x1 getGroundHeight__9dAcTbox_cFPfRC7mVec3_c = .text:0x802686A0; // type:function size:0x50 isBelowGroundAtPos__9dAcTbox_cFfRC7mVec3_c = .text:0x802686F0; // type:function size:0x5C __ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC -__dt__14LinkedColliderFv = .text:0x80268A40; // type:function size:0x98 +__dt__17LinkedColliderUnkFv = .text:0x80268A40; // type:function size:0x98 __dt__21sFState_c<9dAcTbox_c>Fv = .text:0x80268AE0; // type:function size:0x58 __dt__24sFStateFct_c<9dAcTbox_c>Fv = .text:0x80268B40; // type:function size:0x6C __dt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80268BB0; // type:function size:0xA0 @@ -14367,8 +14367,8 @@ initializeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E8D0; // t __sinit_\d_a_obj_tbox_cpp = .text:0x8026E900; // type:function size:0xA7C scope:local __dt__23sFStateID_c<9dAcTbox_c>Fv = .text:0x8026F380; // type:function size:0x58 isSameName__23sFStateID_c<9dAcTbox_c>CFPCc = .text:0x8026F3E0; // type:function size:0x88 -@316@__dt__14LinkedColliderFv = .text:0x8026F470; // type:function size:0x8 -@272@__dt__14LinkedColliderFv = .text:0x8026F480; // type:function size:0x8 +@316@__dt__17LinkedColliderUnkFv = .text:0x8026F470; // type:function size:0x8 +@272@__dt__17LinkedColliderUnkFv = .text:0x8026F480; // type:function size:0x8 AcTimeArea__ctor = .text:0x8026F490; // type:function size:0x1A8 fn_8026F640 = .text:0x8026F640; // type:function size:0x58 fn_8026F6A0 = .text:0x8026F6A0; // type:function size:0x6C @@ -17284,7 +17284,7 @@ insertAfter__9cListMg_cFP9cListNd_cP9cListNd_c = .text:0x802E08C0; // type:funct remove__9cListMg_cFP9cListNd_c = .text:0x802E0900; // type:function size:0xAC append__9cListMg_cFP9cListNd_c = .text:0x802E09B0; // type:function size:0x30 prepend__9cListMg_cFP9cListNd_c = .text:0x802E09E0; // type:function size:0x30 -ListLink__clear = .text:0x802E0A10; // type:function size:0x40 +clear__9cListMg_cFv = .text:0x802E0A10; // type:function size:0x40 cM__rad2s = .text:0x802E0A50; // type:function size:0x5C cM__U_GetAtanTable = .text:0x802E0AB0; // type:function size:0x34 atan2s__2cMFff = .text:0x802E0AF0; // type:function size:0x1BC @@ -30060,7 +30060,7 @@ lbl_80503278 = .data:0x80503278; // type:object size:0x9C lbl_80503314 = .data:0x80503314; // type:object size:0x6C __vt__7dBase_c = .data:0x80503380; // type:object size:0x4C lbl_805033D0 = .data:0x805033D0; // type:object size:0x10 -__vt__18ColliderLinkedList = .data:0x805033E0; // type:object size:0x10 +__vt__18ColliderLinkedList = .data:0x805033E0; // type:object size:0xC __vt__Q24dDvd8loader_c = .data:0x805033F0; // type:object size:0x10 lbl_80503400 = .data:0x80503400; // type:object size:0x40 lbl_80503440 = .data:0x80503440; // type:object size:0x6DF8 @@ -34484,7 +34484,7 @@ __vt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c> = .data:0x80535540; // t __vt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80535570; // type:object size:0x30 __vt__24sFStateFct_c<9dAcTbox_c> = .data:0x805355A0; // type:object size:0x14 __vt__21sFState_c<9dAcTbox_c> = .data:0x805355B8; // type:object size:0x18 -__vt__14LinkedCollider = .data:0x805355D0; // type:object size:0x7C +__vt__17LinkedColliderUnk = .data:0x805355D0; // type:object size:0x7C __vt__23sFStateID_c<9dAcTbox_c> = .data:0x805359E0; // type:object size:0x34 g_profile_TIME_AREA = .data:0x80535A18; // type:object size:0x10 lbl_80535A28 = .data:0x80535A28; // type:object size:0x68 diff --git a/configure.py b/configure.py index fb777b61..9044d9bd 100644 --- a/configure.py +++ b/configure.py @@ -314,6 +314,7 @@ config.libs = [ Object(Matching, "d/flag/flag_managers.cpp"), Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "d/d_base.cpp"), + Object(NonMatching, "d/d_cc.cpp"), Object(Matching, "d/d_dvd.cpp"), Object(NonMatching, "d/d_dvd_unk.cpp"), Object(NonMatching, "d/d_dylink.cpp"), diff --git a/include/c/c_list.h b/include/c/c_list.h index 8fdba626..2c45d27d 100644 --- a/include/c/c_list.h +++ b/include/c/c_list.h @@ -57,6 +57,8 @@ public: */ void prepend(cListNd_c *node); + void clear(); + cListNd_c *getFirst() const { return mpFirst; } diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 255d868b..eaccca94 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -148,8 +148,8 @@ private: s32 field_0x4F4; /* 0x04F8 */ dBgW mBgWs[2]; - /* 0x0918 */ LinkedCollider mCcD1; - /* 0x0B30 */ LinkedCollider mCcD2; + /* 0x0918 */ LinkedColliderUnk mCcD1; + /* 0x0B30 */ LinkedColliderUnk mCcD2; /* 0x0D48 */ ColliderLinkedList field_0x0D48; /* 0x0D54 */ dCcD_Unk mCcD3; /* 0x0F5C */ dCcD_Cyl mCcD4; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 49791e31..b9d9daa4 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -883,6 +883,12 @@ public: u32 ChkAtNoGaurd() const { return mAt.MskSPrm(0x200000); } + void SetAt_0x40000000() { + mAt.OnSPrm(0x40000000); + } + u32 ChkAt_0x40000000() { + return mAt.MskSPrm(0x40000000); + } // Tg @@ -908,6 +914,12 @@ public: void SetTgInfo_0x2(u16 val) { mTg.SetInfo_0x2(val); } + void SetTg_0x40000000() { + mTg.OnSPrm(0x40000000); + } + u32 ChkTg_0x40000000() { + return mTg.MskSPrm(0x40000000); + } // Co @@ -929,6 +941,12 @@ public: void SetCo_0x400() { mCo.OnSPrm(0x400); } + void SetCo_0x40000000() { + mCo.OnSPrm(0x40000000); + } + u32 ChkCo_0x40000000() { + return mCo.MskSPrm(0x40000000); + } /** * SET HIT diff --git a/include/d/d_cc.h b/include/d/d_cc.h index e150555f..2d2f39a4 100644 --- a/include/d/d_cc.h +++ b/include/d/d_cc.h @@ -5,28 +5,97 @@ #include "d/col/c/c_cc_d.h" #include "d/col/cc/d_cc_d.h" -// Somewhere in d_cc -class LinkedCollider : public dCcD_Unk { +class LinkedColliderNode : public cListNd_c { public: - LinkedCollider() : mpList(nullptr), field_0x210(this) {} - virtual ~LinkedCollider() { + LinkedColliderNode(cCcD_Obj *obj) : mpList(nullptr), mpCcDObj(obj) {} + void remove() { if (mpList != nullptr) { - mpList->remove(&mNode); + mpList->remove(this); mpList = nullptr; } } - /* 0x208 */ cListNd_c mNode; - /* 0x210 */ dCcD_Unk *field_0x210; - /* 0x214 */ cListMg_c *mpList; + /* 0x08 */ cCcD_Obj *mpCcDObj; + /* 0x0C */ cListMg_c *mpList; }; -struct ColliderLinkedList { +class LinkedColliderUnk : public dCcD_Unk { +public: + LinkedColliderUnk() : mNode(this) {} + virtual ~LinkedColliderUnk() { + mNode.remove(); + } + /* 0x210 */ LinkedColliderNode mNode; +}; + +class LinkedColliderCyl : public dCcD_Cyl { +public: + LinkedColliderCyl() : mNode(this) {} + virtual ~LinkedColliderCyl() { + mNode.remove(); + } + /* 0x150 */ LinkedColliderNode mNode; +}; + +class LinkedColliderSph : public dCcD_Sph { +public: + LinkedColliderSph() : mNode(this) {} + virtual ~LinkedColliderSph() { + mNode.remove(); + } + /* 0x150 */ LinkedColliderNode mNode; +}; + +class LinkedColliderCps : public dCcD_Cps { +public: + LinkedColliderCps() : mNode(this) {} + virtual ~LinkedColliderCps() { + mNode.remove(); + } + /* 0x170 */ LinkedColliderNode mNode; +}; + +class ColliderLinkedList { +private: cListMg_c mList; + static void Set(cCcD_Obj *obj, void *cbArg); + static void SetStts(cCcD_Obj *obj, void *cbArg); + static void AtSet(cCcD_Obj *obj, void *cbArg); + static void ClrAt(cCcD_Obj *obj, void *cbArg); + static void TgSet(cCcD_Obj *obj, void *cbArg); + static void ClrTg(cCcD_Obj *obj, void *cbArg); + static void CoSet(cCcD_Obj *obj, void *cbArg); + static void ClrCo(cCcD_Obj *obj, void *cbArg); + +public: virtual ~ColliderLinkedList(); - void addCc(LinkedCollider &ccD, const dCcD_SrcUnk &src); + void postInit(cCcD_Obj &ccD); + void addCc(LinkedColliderCyl &ccD, const dCcD_SrcCyl &src); + void addCc(LinkedColliderSph &ccD, const dCcD_SrcSph &src); + void addCc(LinkedColliderCps &ccD, const dCcD_SrcCps &src); + void addCc(LinkedColliderUnk &ccD, const dCcD_SrcUnk &src); void SetStts(cCcD_Stts &stts); void registerColliders(); + + typedef void (*ccCbFunc)(cCcD_Obj *obj, void *cbArg); + void foreachCc(ccCbFunc f, void *cbArg) const; + void foreachCc2(ccCbFunc f, void *cbArg) const; + + // This find function is used by a lot of other + // TUs, all of which own the function passed as + // a ptmf. It's not immediately clear how this works, + // does every actor subclass the LinkedCollider___, + // or are the functions all added here for the other + // files to implement? + typedef bool (cCcD_Obj::*ccPtmf)(); + cCcD_Obj *find(ccPtmf f) const; + + void AtSet(); + void ClrAt(); + void TgSet(); + void ClrTg(); + void CoSet(); + void ClrCo(); }; #endif diff --git a/src/c/c_list.cpp b/src/c/c_list.cpp index 61929a5f..fe0330e9 100644 --- a/src/c/c_list.cpp +++ b/src/c/c_list.cpp @@ -74,3 +74,9 @@ void cListMg_c::prepend(cListNd_c *node) { } this->mpFirst = node; } + +void cListMg_c::clear() { + while (mpFirst != nullptr) { + remove(mpFirst); + } +} diff --git a/src/d/d_cc.cpp b/src/d/d_cc.cpp new file mode 100644 index 00000000..01218cf5 --- /dev/null +++ b/src/d/d_cc.cpp @@ -0,0 +1,157 @@ +#include "d/d_cc.h" + +#include "common.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" + + +void ColliderLinkedList::postInit(cCcD_Obj &ccD) { + if (ccD.ChkAtSet()) { + ccD.SetAt_0x40000000(); + } + if (ccD.ChkTgSet()) { + ccD.SetTg_0x40000000(); + } + if (ccD.ChkCoSet()) { + ccD.SetCo_0x40000000(); + } +} + +void ColliderLinkedList::addCc(LinkedColliderCyl &ccD, const dCcD_SrcCyl &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void ColliderLinkedList::addCc(LinkedColliderSph &ccD, const dCcD_SrcSph &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void ColliderLinkedList::addCc(LinkedColliderCps &ccD, const dCcD_SrcCps &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void ColliderLinkedList::addCc(LinkedColliderUnk &ccD, const dCcD_SrcUnk &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void ColliderLinkedList::foreachCc(ccCbFunc f, void *cbArg) const { + LinkedColliderNode *nd = static_cast(mList.getFirst()); + while (nd != nullptr) { + f(nd->mpCcDObj, cbArg); + nd = static_cast(nd->getNext()); + } +} + +// What's the difference between these two? +void ColliderLinkedList::foreachCc2(ccCbFunc f, void *cbArg) const { + LinkedColliderNode *nd = static_cast(mList.getFirst()); + while (nd != nullptr) { + f(nd->mpCcDObj, cbArg); + nd = static_cast(nd->getNext()); + } +} + +void ColliderLinkedList::Set(cCcD_Obj *obj, void *cbArg) { + dCcS::GetInstance()->Set(obj); +} + +void ColliderLinkedList::registerColliders() { + foreachCc(Set, nullptr); +} + +void ColliderLinkedList::SetStts(cCcD_Obj *obj, void *cbArg) { + obj->SetStts(*static_cast(cbArg)); +} + +void ColliderLinkedList::SetStts(cCcD_Stts &stts) { + foreachCc(SetStts, &stts); +} + +cCcD_Obj *ColliderLinkedList::find(ccPtmf f) const { + cCcD_Obj *o; + LinkedColliderNode *nd = static_cast(mList.getFirst()); + while (nd != nullptr) { + o = nd->mpCcDObj; + if ((o->*f)()) { + return o; + } + nd = static_cast(nd->getNext()); + } + return nullptr; +} + +void ColliderLinkedList::AtSet(cCcD_Obj *obj, void *cbArg) { + if (!obj->ChkAt_0x40000000()) { + return; + } + obj->OnAtSet(); +} + +void ColliderLinkedList::AtSet() { + foreachCc(AtSet, nullptr); +} + +void ColliderLinkedList::ClrAt(cCcD_Obj *obj, void *cbArg) { + obj->ClrAtSet(); + obj->ClrAtHit(); +} + +void ColliderLinkedList::ClrAt() { + foreachCc(ClrAt, nullptr); +} + +void ColliderLinkedList::TgSet(cCcD_Obj *obj, void *cbArg) { + if (!obj->ChkTg_0x40000000()) { + return; + } + obj->OnTgSet(); +} + +void ColliderLinkedList::TgSet() { + foreachCc(TgSet, nullptr); +} + +void ColliderLinkedList::ClrTg(cCcD_Obj *obj, void *cbArg) { + obj->ClrTgSet(); + obj->ClrTgHit(); +} + +void ColliderLinkedList::ClrTg() { + foreachCc(ClrTg, nullptr); +} + +void ColliderLinkedList::CoSet(cCcD_Obj *obj, void *cbArg) { + if (!obj->ChkCo_0x40000000()) { + return; + } + obj->OnCoSet(); +} + +void ColliderLinkedList::CoSet() { + foreachCc(CoSet, nullptr); +} + +void ColliderLinkedList::ClrCo(cCcD_Obj *obj, void *cbArg) { + obj->ClrCoSet(); + obj->ClrCoHit(); +} + +void ColliderLinkedList::ClrCo() { + foreachCc(ClrCo, nullptr); +} + +ColliderLinkedList::~ColliderLinkedList() { + mList.clear(); +} From 36badcfdb1c37028bb0385f7ca2bbc7d20fc95a0 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 22 Nov 2024 21:49:46 +0100 Subject: [PATCH 13/17] Split out d_carry (for vtable alignment) --- config/SOUE01/splits.txt | 8 ++++++-- configure.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 9ef4c36b..479d64a7 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -70,9 +70,13 @@ d/d_base.cpp: .data start:0x80503380 end:0x805033D0 .sbss start:0x805750C0 end:0x805750CC +d/d_carry.cpp: + .text start:0x80050A20 end:0x80051C00 + .data start:0x805033D0 end:0x805033E0 + d/d_cc.cpp: - .text start:0x80050A20 end:0x800520F0 - .data start:0x805033D0 end:0x805033F0 + .text start:0x80051C00 end:0x800520F0 + .data start:0x805033E0 end:0x805033F0 d/d_dvd.cpp: .text start:0x800520F0 end:0x800522FC diff --git a/configure.py b/configure.py index 9044d9bd..bb06f8a6 100644 --- a/configure.py +++ b/configure.py @@ -314,7 +314,8 @@ config.libs = [ Object(Matching, "d/flag/flag_managers.cpp"), Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "d/d_base.cpp"), - Object(NonMatching, "d/d_cc.cpp"), + Object(NonMatching, "d/d_carry.cpp"), + Object(Matching, "d/d_cc.cpp"), Object(Matching, "d/d_dvd.cpp"), Object(NonMatching, "d/d_dvd_unk.cpp"), Object(NonMatching, "d/d_dylink.cpp"), From 4db719e978fe7973f9a886d83dba5b5820a15bce Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 23 Nov 2024 13:34:00 +0100 Subject: [PATCH 14/17] Some adjacent splits --- config/SOUE01/splits.txt | 14 +++++++++++++- config/SOUE01/symbols.txt | 10 +++++----- include/d/a/obj/d_a_obj_base.h | 12 +++++++++--- src/d/col/c/c_cc_d.cpp | 2 +- src/d/d_carry.cpp | 12 ++++++++++++ 5 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 src/d/d_carry.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 479d64a7..6123684c 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -71,8 +71,9 @@ d/d_base.cpp: .sbss start:0x805750C0 end:0x805750CC d/d_carry.cpp: - .text start:0x80050A20 end:0x80051C00 + .text start:0x80050A20 end:0x80051BF8 .data start:0x805033D0 end:0x805033E0 + .sdata2 start:0x80576ED8 end:0x80576F20 d/d_cc.cpp: .text start:0x80051C00 end:0x800520F0 @@ -811,6 +812,17 @@ DynamicLink.cpp: c/c_list.cpp: .text start:0x802E08C0 end:0x802E0A50 +c/c_math.cpp: + .text start:0x802E0A50 end:0x802E0CF8 + .data start:0x80541A70 end:0x80542278 + .sdata2 start:0x8057CC58 end:0x8057CC80 + +c/c_rand.cpp: + .text start:0x802E0D00 end:0x802E0E64 + .ctors start:0x804DB8BC end:0x804DB8C0 + .sdata start:0x80573FB0 end:0x80573FB8 + .sdata2 start:0x8057CC80 end:0x8057CC98 + c/c_tree.cpp: .text start:0x802E0E70 end:0x802E1140 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 18acb3b2..8b09dddb 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2096,17 +2096,17 @@ unloadCallback__7dBase_cFv = .text:0x800509D0; // type:function size:0x4 initLoader__7dBase_cFv = .text:0x800509E0; // type:function size:0x1C createBase__7dBase_cFUsP7dBase_cUlUc = .text:0x80050A00; // type:function size:0x4 createRoot__7dBase_cFUsUlUc = .text:0x80050A10; // type:function size:0x4 -CarriedActorCtor = .text:0x80050A20; // type:function size:0x118 -CarriedActorDtor = .text:0x80050B40; // type:function size:0x80 +__ct__16ActorCarryStructFv = .text:0x80050A20; // type:function size:0x118 +__dt__16ActorCarryStructFv = .text:0x80050B40; // type:function size:0x80 set__16ActorCarryStructFUlfffPv = .text:0x80050BC0; // type:function size:0xB4 actorAttachingRelated = .text:0x80050C80; // type:function size:0x13C fn_80050DC0 = .text:0x80050DC0; // type:function size:0x34 fn_80050E00 = .text:0x80050E00; // type:function size:0x34 fn_80050E40 = .text:0x80050E40; // type:function size:0x60 fn_80050EA0__16ActorCarryStructFP12dAcObjBase_c = .text:0x80050EA0; // type:function size:0xC -fn_80050EB0 = .text:0x80050EB0; // type:function size:0x140 +fn_80050EB0__16ActorCarryStructFP12dAcObjBase_c = .text:0x80050EB0; // type:function size:0x140 bushTpFunc__16ActorCarryStructFR9dBgS_Acch = .text:0x80050FF0; // type:function size:0x19C -fn_80051190 = .text:0x80051190; // type:function size:0x4C +fn_80051190__16ActorCarryStructFP12dAcObjBase_c = .text:0x80051190; // type:function size:0x4C fn_800511E0__16ActorCarryStructFP12dAcObjBase_c = .text:0x800511E0; // type:function size:0x1D8 isCarriedActor_NotGerock = .text:0x800513C0; // type:function size:0x78 fn_80051440 = .text:0x80051440; // type:function size:0x17C @@ -30059,7 +30059,7 @@ lbl_80503248 = .data:0x80503248; // type:object size:0x30 lbl_80503278 = .data:0x80503278; // type:object size:0x9C lbl_80503314 = .data:0x80503314; // type:object size:0x6C __vt__7dBase_c = .data:0x80503380; // type:object size:0x4C -lbl_805033D0 = .data:0x805033D0; // type:object size:0x10 +__vt__16ActorCarryStruct = .data:0x805033D0; // type:object size:0xC __vt__18ColliderLinkedList = .data:0x805033E0; // type:object size:0xC __vt__Q24dDvd8loader_c = .data:0x805033F0; // type:object size:0x10 lbl_80503400 = .data:0x80503400; // type:object size:0x40 diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 8dd4372e..8a44ec00 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -18,7 +18,7 @@ class dBgS_Acch; // Size: 0xA8 struct ActorCarryStruct { - /* 0x00 */ fLiNdBa_c actorLink; + /* 0x00 */ dAcRefBase_c actorLink; /* 0x0C */ fLiNdBa_c *carriedActor; /* 0x10 */ u32 carryFlags; /* 0x14 */ int carryType; @@ -32,7 +32,11 @@ struct ActorCarryStruct { /* 0x90 */ f32 field_0x90; /* 0x94 */ f32 field_0x94; /* 0x98 */ f32 field_0x98; - /* 0x9C */ void *dtor; // ??? + + ActorCarryStruct(); + /* vt 0x9C */ + virtual ~ActorCarryStruct(); + // Is this actually part of this struct? /* 0xA0 */ u32 field_0xA0; /* 0xA4 */ u32 field_0xA4; @@ -43,6 +47,8 @@ struct ActorCarryStruct { void fn_80050EA0(dAcObjBase_c *); void fn_800511E0(dAcObjBase_c *); + void fn_80051190(dAcObjBase_c *); + void fn_80050EB0(dAcObjBase_c *); bool testCarryFlag(u32 flag) { return (carryFlags & flag) != 0; @@ -215,7 +221,7 @@ public: if (!result) \ return result; \ } while (0) -// Use this in actors' createHeap functions +// Use this in actors' create functions #define CREATE_ALLOCATOR(className) \ do { \ if (!initAllocatorWork1Heap(-1, #className "::m_allocator", 0x20)) { \ diff --git a/src/d/col/c/c_cc_d.cpp b/src/d/col/c/c_cc_d.cpp index 1dd65c6d..f8669ee6 100644 --- a/src/d/col/c/c_cc_d.cpp +++ b/src/d/col/c/c_cc_d.cpp @@ -1237,7 +1237,7 @@ bool cCcD_CylAttr::CrossCo(cCcD_CpsAttr &cpsAttr, f32 *pOut) { } bool cCcD_CylAttr::CrossCo(cCcD_UnkAttr &unkAttr, f32 *pOut) { - cM3dGCyl::Cross(unkAttr, pOut); + return cM3dGCyl::Cross(unkAttr, pOut); } void cCcD_CylAttr::CalcAabBox() { diff --git a/src/d/d_carry.cpp b/src/d/d_carry.cpp new file mode 100644 index 00000000..ce473dd4 --- /dev/null +++ b/src/d/d_carry.cpp @@ -0,0 +1,12 @@ +#include "d/a/obj/d_a_obj_base.h" +#include "m/m_mtx.h" + +ActorCarryStruct::ActorCarryStruct() + : actorLink(nullptr), carriedActor(nullptr), carryFlags(0), carryType(0), field_0x18(0), + field_0x1C(0.0f, 0.0f, 0.0f), carryTransMtx(mMtx_c::Identity), field_0x58(mMtx_c::Identity), isCarried(0), + field_0x8C(0.0f), field_0x90(0.0f), field_0x94(0.0f), field_0x98(0.0f) {} + +ActorCarryStruct::~ActorCarryStruct() { + fn_80051190(nullptr); + fn_80050EB0(nullptr); +} From 60cf45a3856e2b0a2b683d76beb12a7385f8ab7e Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 23 Nov 2024 14:44:36 +0100 Subject: [PATCH 15/17] Add those files too --- configure.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.py b/configure.py index bb06f8a6..287c58bb 100644 --- a/configure.py +++ b/configure.py @@ -476,6 +476,8 @@ config.libs = [ "host": False, "objects": [ Object(Matching, "c/c_list.cpp"), + Object(NonMatching, "c/c_math.cpp"), + Object(NonMatching, "c/c_rand.cpp"), Object(Matching, "c/c_tree.cpp"), ], }, From 39ec25ed8a2208742263512a70670e8f3ff29e84 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 23 Nov 2024 16:00:22 +0100 Subject: [PATCH 16/17] Not sure why this PR is suddenly about splits --- config/SOUE01/splits.txt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 6123684c..1300769c 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -224,15 +224,20 @@ d/d_textunk.cpp: .bss start:0x805A6F70 end:0x805A7730 d/d_tag_processor.cpp: - .text start:0x800B35C0 end:0x800B9274 + .text start:0x800B34F0 end:0x800B9274 .ctors start:0x804DB6D4 end:0x804DB6D8 - .rodata start:0x804E4C34 end:0x804E4C50 + .rodata start:0x804E39E0 end:0x804E4C50 .data start:0x805108E8 end:0x805109A0 - .sdata2 start:0x8057986C end:0x805798D0 + .sdata2 start:0x80579868 end:0x805798D0 .bss start:0x805A7730 end:0x805A78B8 toBeSorted/time_area_mgr.cpp: - .text start:0x800B9280 end:0x800BB2A0 + .text start:0x800B9280 end:0x800BC978 + .ctors start:0x804DB6D8 end:0x804DB6DC + .data start:0x805109A0 end:0x80510B30 + .sdata start:0x805722E0 end:0x805722F8 + .sbss start:0x805753C0 end:0x805753D0 + .sdata2 start:0x805798D0 end:0x80579928 d/flag/flag_managers.cpp: .text start:0x800BD8C0 end:0x800C0650 From 4bc35a05c5988e78def8f2eaf96862318d96721b Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 23 Nov 2024 19:13:36 +0100 Subject: [PATCH 17/17] Renames --- config/SOUE01/symbols.txt | 62 +++++++++++++++++----------------- include/d/a/obj/d_a_obj_base.h | 1 - include/d/a/obj/d_a_obj_tbox.h | 8 ++--- include/d/d_cc.h | 36 ++++++++++---------- src/d/a/obj/d_a_obj_tbox.cpp | 4 +-- src/d/d_cc.cpp | 50 +++++++++++++-------------- 6 files changed, 80 insertions(+), 81 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8b09dddb..1f931bbe 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2115,31 +2115,31 @@ fn_800515D0 = .text:0x800515D0; // type:function size:0x60 fn_800051630__13dAcObjRef_unkFv = .text:0x80051630; // type:function size:0x144 fn_80051780__13dAcObjRef_unkFRC8cCcD_Obj = .text:0x80051780; // type:function size:0x464 fn_80051BF0 = .text:0x80051BF0; // type:function size:0x8 -postInit__18ColliderLinkedListFR8cCcD_Obj = .text:0x80051C00; // type:function size:0x4C -addCc__18ColliderLinkedListFR17LinkedColliderCylRC11dCcD_SrcCyl = .text:0x80051C50; // type:function size:0x5C -addCc__18ColliderLinkedListFR17LinkedColliderSphRC11dCcD_SrcSph = .text:0x80051CB0; // type:function size:0x5C -addCc__18ColliderLinkedListFR17LinkedColliderCpsRC11dCcD_SrcCps = .text:0x80051D10; // type:function size:0x5C -addCc__18ColliderLinkedListFR17LinkedColliderUnkRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C -foreachCc__18ColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051DD0; // type:function size:0x64 -foreachCc2__18ColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051E40; // type:function size:0x64 -Set__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051EB0; // type:function size:0x34 -registerColliders__18ColliderLinkedListFv = .text:0x80051EF0; // type:function size:0x10 -SetStts__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051F00; // type:function size:0x8 -SetStts__18ColliderLinkedListFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 -find__18ColliderLinkedListCFM8cCcD_ObjFPCvPv_b = .text:0x80051F20; // type:function size:0x74 -AtSet__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FA0; // type:function size:0x1C -AtSet__18ColliderLinkedListFv = .text:0x80051FC0; // type:function size:0x10 -ClrAt__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FD0; // type:function size:0x10 -ClrAt__18ColliderLinkedListFv = .text:0x80051FE0; // type:function size:0x10 -TgSet__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FF0; // type:function size:0x1C -TgSet__18ColliderLinkedListFv = .text:0x80052010; // type:function size:0x10 -ClrTg__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80052020; // type:function size:0x10 -ClrTg__18ColliderLinkedListFv = .text:0x80052030; // type:function size:0x10 -CoSet__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80052040; // type:function size:0x1C -CoSet__18ColliderLinkedListFv = .text:0x80052060; // type:function size:0x10 -ClrCo__18ColliderLinkedListFP8cCcD_ObjPv = .text:0x80052070; // type:function size:0x10 -ClrCo__18ColliderLinkedListFv = .text:0x80052080; // type:function size:0x10 -__dt__18ColliderLinkedListFv = .text:0x80052090; // type:function size:0x60 +postInit__19dColliderLinkedListFR8cCcD_Obj = .text:0x80051C00; // type:function size:0x4C +addCc__19dColliderLinkedListFR15dCcD_Linked_CylRC11dCcD_SrcCyl = .text:0x80051C50; // type:function size:0x5C +addCc__19dColliderLinkedListFR15dCcD_Linked_SphRC11dCcD_SrcSph = .text:0x80051CB0; // type:function size:0x5C +addCc__19dColliderLinkedListFR15dCcD_Linked_CpsRC11dCcD_SrcCps = .text:0x80051D10; // type:function size:0x5C +addCc__19dColliderLinkedListFR15dCcD_Linked_UnkRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C +foreachCc__19dColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051DD0; // type:function size:0x64 +foreachCc2__19dColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051E40; // type:function size:0x64 +Set__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051EB0; // type:function size:0x34 +registerColliders__19dColliderLinkedListFv = .text:0x80051EF0; // type:function size:0x10 +SetStts__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051F00; // type:function size:0x8 +SetStts__19dColliderLinkedListFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 +find__19dColliderLinkedListCFM8cCcD_ObjFPCvPv_b = .text:0x80051F20; // type:function size:0x74 +AtSet__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FA0; // type:function size:0x1C +AtSet__19dColliderLinkedListFv = .text:0x80051FC0; // type:function size:0x10 +ClrAt__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FD0; // type:function size:0x10 +ClrAt__19dColliderLinkedListFv = .text:0x80051FE0; // type:function size:0x10 +TgSet__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FF0; // type:function size:0x1C +TgSet__19dColliderLinkedListFv = .text:0x80052010; // type:function size:0x10 +ClrTg__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80052020; // type:function size:0x10 +ClrTg__19dColliderLinkedListFv = .text:0x80052030; // type:function size:0x10 +CoSet__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80052040; // type:function size:0x1C +CoSet__19dColliderLinkedListFv = .text:0x80052060; // type:function size:0x10 +ClrCo__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80052070; // type:function size:0x10 +ClrCo__19dColliderLinkedListFv = .text:0x80052080; // type:function size:0x10 +__dt__19dColliderLinkedListFv = .text:0x80052090; // type:function size:0x60 create__4dDvdFlPQ23EGG4HeapPQ23EGG4HeapPQ23EGG4Heap = .text:0x800520F0; // type:function size:0x4 __ct__Q24dDvd8loader_cFv = .text:0x80052100; // type:function size:0x28 __dt__Q24dDvd8loader_cFv = .text:0x80052130; // type:function size:0x40 @@ -14245,7 +14245,7 @@ hasCollectedAllTears__9dAcTbox_cFv = .text:0x80268680; // type:function size:0x1 getGroundHeight__9dAcTbox_cFPfRC7mVec3_c = .text:0x802686A0; // type:function size:0x50 isBelowGroundAtPos__9dAcTbox_cFfRC7mVec3_c = .text:0x802686F0; // type:function size:0x5C __ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC -__dt__17LinkedColliderUnkFv = .text:0x80268A40; // type:function size:0x98 +__dt__15dCcD_Linked_UnkFv = .text:0x80268A40; // type:function size:0x98 __dt__21sFState_c<9dAcTbox_c>Fv = .text:0x80268AE0; // type:function size:0x58 __dt__24sFStateFct_c<9dAcTbox_c>Fv = .text:0x80268B40; // type:function size:0x6C __dt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80268BB0; // type:function size:0xA0 @@ -14341,7 +14341,7 @@ registerKeyPieceDowsing__9dAcTbox_cFv = .text:0x8026D830; // type:function size: registerRupeeOrTreasureDowsing__9dAcTbox_cFv = .text:0x8026D8A0; // type:function size:0x48 noUnregisterDowsing__9dAcTbox_cFv = .text:0x8026D8F0; // type:function size:0x4 unregisterDowsing__9dAcTbox_cFv = .text:0x8026D900; // type:function size:0x48 -fn_8026D950__9dAcTbox_cFv = .text:0x8026D950; // type:function size:0x28 +spawnAppearEffect__9dAcTbox_cFv = .text:0x8026D950; // type:function size:0x28 checkIsClear__9dAcTbox_cCFv = .text:0x8026D980; // type:function size:0x140 fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 fn_8026DAD0__9dAcTbox_cCFPC7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 @@ -14367,8 +14367,8 @@ initializeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E8D0; // t __sinit_\d_a_obj_tbox_cpp = .text:0x8026E900; // type:function size:0xA7C scope:local __dt__23sFStateID_c<9dAcTbox_c>Fv = .text:0x8026F380; // type:function size:0x58 isSameName__23sFStateID_c<9dAcTbox_c>CFPCc = .text:0x8026F3E0; // type:function size:0x88 -@316@__dt__17LinkedColliderUnkFv = .text:0x8026F470; // type:function size:0x8 -@272@__dt__17LinkedColliderUnkFv = .text:0x8026F480; // type:function size:0x8 +@316@__dt__15dCcD_Linked_UnkFv = .text:0x8026F470; // type:function size:0x8 +@272@__dt__15dCcD_Linked_UnkFv = .text:0x8026F480; // type:function size:0x8 AcTimeArea__ctor = .text:0x8026F490; // type:function size:0x1A8 fn_8026F640 = .text:0x8026F640; // type:function size:0x58 fn_8026F6A0 = .text:0x8026F6A0; // type:function size:0x6C @@ -30060,7 +30060,7 @@ lbl_80503278 = .data:0x80503278; // type:object size:0x9C lbl_80503314 = .data:0x80503314; // type:object size:0x6C __vt__7dBase_c = .data:0x80503380; // type:object size:0x4C __vt__16ActorCarryStruct = .data:0x805033D0; // type:object size:0xC -__vt__18ColliderLinkedList = .data:0x805033E0; // type:object size:0xC +__vt__19dColliderLinkedList = .data:0x805033E0; // type:object size:0xC __vt__Q24dDvd8loader_c = .data:0x805033F0; // type:object size:0x10 lbl_80503400 = .data:0x80503400; // type:object size:0x40 lbl_80503440 = .data:0x80503440; // type:object size:0x6DF8 @@ -34484,7 +34484,7 @@ __vt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c> = .data:0x80535540; // t __vt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80535570; // type:object size:0x30 __vt__24sFStateFct_c<9dAcTbox_c> = .data:0x805355A0; // type:object size:0x14 __vt__21sFState_c<9dAcTbox_c> = .data:0x805355B8; // type:object size:0x18 -__vt__17LinkedColliderUnk = .data:0x805355D0; // type:object size:0x7C +__vt__15dCcD_Linked_Unk = .data:0x805355D0; // type:object size:0x7C __vt__23sFStateID_c<9dAcTbox_c> = .data:0x805359E0; // type:object size:0x34 g_profile_TIME_AREA = .data:0x80535A18; // type:object size:0x10 lbl_80535A28 = .data:0x80535A28; // type:object size:0x68 diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 8a44ec00..78d72533 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -36,7 +36,6 @@ struct ActorCarryStruct { ActorCarryStruct(); /* vt 0x9C */ virtual ~ActorCarryStruct(); - // Is this actually part of this struct? /* 0xA0 */ u32 field_0xA0; /* 0xA4 */ u32 field_0xA4; diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index eaccca94..c168d13c 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -118,7 +118,7 @@ private: bool fn_8026D120() const; void fn_8026D130(); void fn_8026D140(); - void fn_8026D950(); + void spawnAppearEffect(); void fn_8026D370(); bool checkShouldClose(); @@ -148,9 +148,9 @@ private: s32 field_0x4F4; /* 0x04F8 */ dBgW mBgWs[2]; - /* 0x0918 */ LinkedColliderUnk mCcD1; - /* 0x0B30 */ LinkedColliderUnk mCcD2; - /* 0x0D48 */ ColliderLinkedList field_0x0D48; + /* 0x0918 */ dCcD_Linked_Unk mCcD1; + /* 0x0B30 */ dCcD_Linked_Unk mCcD2; + /* 0x0D48 */ dColliderLinkedList field_0x0D48; /* 0x0D54 */ dCcD_Unk mCcD3; /* 0x0F5C */ dCcD_Cyl mCcD4; /* 0x10AC */ STATE_MGR_DECLARE(dAcTbox_c); diff --git a/include/d/d_cc.h b/include/d/d_cc.h index 2d2f39a4..c5349190 100644 --- a/include/d/d_cc.h +++ b/include/d/d_cc.h @@ -18,43 +18,43 @@ public: /* 0x0C */ cListMg_c *mpList; }; -class LinkedColliderUnk : public dCcD_Unk { +class dCcD_Linked_Unk : public dCcD_Unk { public: - LinkedColliderUnk() : mNode(this) {} - virtual ~LinkedColliderUnk() { + dCcD_Linked_Unk() : mNode(this) {} + virtual ~dCcD_Linked_Unk() { mNode.remove(); } /* 0x210 */ LinkedColliderNode mNode; }; -class LinkedColliderCyl : public dCcD_Cyl { +class dCcD_Linked_Cyl : public dCcD_Cyl { public: - LinkedColliderCyl() : mNode(this) {} - virtual ~LinkedColliderCyl() { + dCcD_Linked_Cyl() : mNode(this) {} + virtual ~dCcD_Linked_Cyl() { mNode.remove(); } /* 0x150 */ LinkedColliderNode mNode; }; -class LinkedColliderSph : public dCcD_Sph { +class dCcD_Linked_Sph : public dCcD_Sph { public: - LinkedColliderSph() : mNode(this) {} - virtual ~LinkedColliderSph() { + dCcD_Linked_Sph() : mNode(this) {} + virtual ~dCcD_Linked_Sph() { mNode.remove(); } /* 0x150 */ LinkedColliderNode mNode; }; -class LinkedColliderCps : public dCcD_Cps { +class dCcD_Linked_Cps : public dCcD_Cps { public: - LinkedColliderCps() : mNode(this) {} - virtual ~LinkedColliderCps() { + dCcD_Linked_Cps() : mNode(this) {} + virtual ~dCcD_Linked_Cps() { mNode.remove(); } /* 0x170 */ LinkedColliderNode mNode; }; -class ColliderLinkedList { +class dColliderLinkedList { private: cListMg_c mList; static void Set(cCcD_Obj *obj, void *cbArg); @@ -67,13 +67,13 @@ private: static void ClrCo(cCcD_Obj *obj, void *cbArg); public: - virtual ~ColliderLinkedList(); + virtual ~dColliderLinkedList(); void postInit(cCcD_Obj &ccD); - void addCc(LinkedColliderCyl &ccD, const dCcD_SrcCyl &src); - void addCc(LinkedColliderSph &ccD, const dCcD_SrcSph &src); - void addCc(LinkedColliderCps &ccD, const dCcD_SrcCps &src); - void addCc(LinkedColliderUnk &ccD, const dCcD_SrcUnk &src); + void addCc(dCcD_Linked_Cyl &ccD, const dCcD_SrcCyl &src); + void addCc(dCcD_Linked_Sph &ccD, const dCcD_SrcSph &src); + void addCc(dCcD_Linked_Cps &ccD, const dCcD_SrcCps &src); + void addCc(dCcD_Linked_Unk &ccD, const dCcD_SrcUnk &src); void SetStts(cCcD_Stts &stts); void registerColliders(); diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 60d07e7c..78ccd4d4 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1762,7 +1762,7 @@ void dAcTbox_c::executeState_DemoAppear() { if (field_0x11F8 >= 20) { bool b = val < 20; if (b) { - fn_8026D950(); + spawnAppearEffect(); } if (b) { mScale.set(1.0f, 1.0f, 1.0f); @@ -2372,7 +2372,7 @@ void dAcTbox_c::unregisterDowsing() { extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_208_; -void dAcTbox_c::fn_8026D950() { +void dAcTbox_c::spawnAppearEffect() { fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_208_, &position, &rotation, nullptr, nullptr, nullptr, nullptr, nullptr); } diff --git a/src/d/d_cc.cpp b/src/d/d_cc.cpp index 01218cf5..f8c0750f 100644 --- a/src/d/d_cc.cpp +++ b/src/d/d_cc.cpp @@ -6,7 +6,7 @@ #include "d/col/cc/d_cc_s.h" -void ColliderLinkedList::postInit(cCcD_Obj &ccD) { +void dColliderLinkedList::postInit(cCcD_Obj &ccD) { if (ccD.ChkAtSet()) { ccD.SetAt_0x40000000(); } @@ -18,35 +18,35 @@ void ColliderLinkedList::postInit(cCcD_Obj &ccD) { } } -void ColliderLinkedList::addCc(LinkedColliderCyl &ccD, const dCcD_SrcCyl &src) { +void dColliderLinkedList::addCc(dCcD_Linked_Cyl &ccD, const dCcD_SrcCyl &src) { ccD.Set(src); mList.append(&ccD.mNode); ccD.mNode.mpList = &mList; postInit(ccD); } -void ColliderLinkedList::addCc(LinkedColliderSph &ccD, const dCcD_SrcSph &src) { +void dColliderLinkedList::addCc(dCcD_Linked_Sph &ccD, const dCcD_SrcSph &src) { ccD.Set(src); mList.append(&ccD.mNode); ccD.mNode.mpList = &mList; postInit(ccD); } -void ColliderLinkedList::addCc(LinkedColliderCps &ccD, const dCcD_SrcCps &src) { +void dColliderLinkedList::addCc(dCcD_Linked_Cps &ccD, const dCcD_SrcCps &src) { ccD.Set(src); mList.append(&ccD.mNode); ccD.mNode.mpList = &mList; postInit(ccD); } -void ColliderLinkedList::addCc(LinkedColliderUnk &ccD, const dCcD_SrcUnk &src) { +void dColliderLinkedList::addCc(dCcD_Linked_Unk &ccD, const dCcD_SrcUnk &src) { ccD.Set(src); mList.append(&ccD.mNode); ccD.mNode.mpList = &mList; postInit(ccD); } -void ColliderLinkedList::foreachCc(ccCbFunc f, void *cbArg) const { +void dColliderLinkedList::foreachCc(ccCbFunc f, void *cbArg) const { LinkedColliderNode *nd = static_cast(mList.getFirst()); while (nd != nullptr) { f(nd->mpCcDObj, cbArg); @@ -55,7 +55,7 @@ void ColliderLinkedList::foreachCc(ccCbFunc f, void *cbArg) const { } // What's the difference between these two? -void ColliderLinkedList::foreachCc2(ccCbFunc f, void *cbArg) const { +void dColliderLinkedList::foreachCc2(ccCbFunc f, void *cbArg) const { LinkedColliderNode *nd = static_cast(mList.getFirst()); while (nd != nullptr) { f(nd->mpCcDObj, cbArg); @@ -63,23 +63,23 @@ void ColliderLinkedList::foreachCc2(ccCbFunc f, void *cbArg) const { } } -void ColliderLinkedList::Set(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::Set(cCcD_Obj *obj, void *cbArg) { dCcS::GetInstance()->Set(obj); } -void ColliderLinkedList::registerColliders() { +void dColliderLinkedList::registerColliders() { foreachCc(Set, nullptr); } -void ColliderLinkedList::SetStts(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::SetStts(cCcD_Obj *obj, void *cbArg) { obj->SetStts(*static_cast(cbArg)); } -void ColliderLinkedList::SetStts(cCcD_Stts &stts) { +void dColliderLinkedList::SetStts(cCcD_Stts &stts) { foreachCc(SetStts, &stts); } -cCcD_Obj *ColliderLinkedList::find(ccPtmf f) const { +cCcD_Obj *dColliderLinkedList::find(ccPtmf f) const { cCcD_Obj *o; LinkedColliderNode *nd = static_cast(mList.getFirst()); while (nd != nullptr) { @@ -92,66 +92,66 @@ cCcD_Obj *ColliderLinkedList::find(ccPtmf f) const { return nullptr; } -void ColliderLinkedList::AtSet(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::AtSet(cCcD_Obj *obj, void *cbArg) { if (!obj->ChkAt_0x40000000()) { return; } obj->OnAtSet(); } -void ColliderLinkedList::AtSet() { +void dColliderLinkedList::AtSet() { foreachCc(AtSet, nullptr); } -void ColliderLinkedList::ClrAt(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::ClrAt(cCcD_Obj *obj, void *cbArg) { obj->ClrAtSet(); obj->ClrAtHit(); } -void ColliderLinkedList::ClrAt() { +void dColliderLinkedList::ClrAt() { foreachCc(ClrAt, nullptr); } -void ColliderLinkedList::TgSet(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::TgSet(cCcD_Obj *obj, void *cbArg) { if (!obj->ChkTg_0x40000000()) { return; } obj->OnTgSet(); } -void ColliderLinkedList::TgSet() { +void dColliderLinkedList::TgSet() { foreachCc(TgSet, nullptr); } -void ColliderLinkedList::ClrTg(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::ClrTg(cCcD_Obj *obj, void *cbArg) { obj->ClrTgSet(); obj->ClrTgHit(); } -void ColliderLinkedList::ClrTg() { +void dColliderLinkedList::ClrTg() { foreachCc(ClrTg, nullptr); } -void ColliderLinkedList::CoSet(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::CoSet(cCcD_Obj *obj, void *cbArg) { if (!obj->ChkCo_0x40000000()) { return; } obj->OnCoSet(); } -void ColliderLinkedList::CoSet() { +void dColliderLinkedList::CoSet() { foreachCc(CoSet, nullptr); } -void ColliderLinkedList::ClrCo(cCcD_Obj *obj, void *cbArg) { +void dColliderLinkedList::ClrCo(cCcD_Obj *obj, void *cbArg) { obj->ClrCoSet(); obj->ClrCoHit(); } -void ColliderLinkedList::ClrCo() { +void dColliderLinkedList::ClrCo() { foreachCc(ClrCo, nullptr); } -ColliderLinkedList::~ColliderLinkedList() { +dColliderLinkedList::~dColliderLinkedList() { mList.clear(); }