From 98020cc73e47c7df5f1c6fda07561ce884d1069b Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 13 Sep 2026 10:18:31 +0200 Subject: [PATCH] Fish --- config/SOUE01/splits.txt | 4 + config/SOUE01/symbols.txt | 174 ++++++------ include/d/a/d_a_fish.h | 13 +- include/d/a/d_a_fish_base.h | 161 +++++++++++ include/d/a/d_a_fish_mgr.h | 4 +- include/d/a/d_a_fish_mgr_base.h | 53 ++++ src/d/a/d_a_fish_base.cpp | 465 ++++++++++++++++++++++++++++++++ src/d/a/d_a_fish_mgr_base.cpp | 62 +++++ 8 files changed, 845 insertions(+), 91 deletions(-) create mode 100644 include/d/a/d_a_fish_base.h create mode 100644 include/d/a/d_a_fish_mgr_base.h create mode 100644 src/d/a/d_a_fish_base.cpp create mode 100644 src/d/a/d_a_fish_mgr_base.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 2f25777f..6f5aaef3 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1313,9 +1313,11 @@ d/d_pouch.cpp: .text start:0x80189FA0 end:0x8018B4A4 align:16 .rodata start:0x804E9CB0 end:0x804E9CD8 .data start:0x8052A880 end:0x8052A890 + .sdata2 start:0x8057ACF0 end:0x8057AD00 toBeSorted/d_beacon.cpp: .text start:0x8018B4B0 end:0x8018B800 align:16 + .sdata2 start:0x8057AD00 end:0x8057AD18 toBeSorted/d_underground.cpp: .text start:0x8018B800 end:0x8018B874 align:16 @@ -1326,12 +1328,14 @@ d/a/d_a_fish_mgr_base.cpp: .text start:0x8018B880 end:0x8018BFC8 align:16 .ctors start:0x804DB7E4 end:0x804DB7E8 .data start:0x8052A890 end:0x8052A9C0 + .sdata2 start:0x8057AD18 end:0x8057AD28 .bss start:0x805B2068 end:0x805B20A8 d/a/d_a_fish_base.cpp: .text start:0x8018BFD0 end:0x8018E378 align:16 .ctors start:0x804DB7E8 end:0x804DB7EC .data start:0x8052A9C0 end:0x8052ABD8 + .sdata2 start:0x8057AD28 end:0x8057ADA8 .bss start:0x805B20A8 end:0x805B2128 toBeSorted/sword_proj_effect_list.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 303631b6..78ff8d1d 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -10114,93 +10114,93 @@ fn_8018B830 = .text:0x8018B830; // type:function size:0x4 fn_8018B840 = .text:0x8018B840; // type:function size:0x8 fn_8018B850 = .text:0x8018B850; // type:function size:0x8 fn_8018B860 = .text:0x8018B860; // type:function size:0x14 -fn_8018B880 = .text:0x8018B880; // type:function size:0xC -ActorBase__init = .text:0x8018B890; // type:function size:0x4 -fn_8018B8A0 = .text:0x8018B8A0; // type:function size:0x118 -fn_8018B9C0 = .text:0x8018B9C0; // type:function size:0x4 -fn_8018B9D0 = .text:0x8018B9D0; // type:function size:0x8 -fn_8018B9E0 = .text:0x8018B9E0; // type:function size:0x8 -fn_8018B9F0 = .text:0x8018B9F0; // type:function size:0x4 -fn_8018BA00 = .text:0x8018BA00; // type:function size:0x4 -fn_8018BA10 = .text:0x8018BA10; // type:function size:0x4 -fn_8018BA20 = .text:0x8018BA20; // type:function size:0xD8 -fn_8018BB00 = .text:0x8018BB00; // type:function size:0x30 -fn_8018BB30 = .text:0x8018BB30; // type:function size:0x30 -fn_8018BB60 = .text:0x8018BB60; // type:function size:0x30 -AcFishMgrBase__initStates = .text:0x8018BB90; // type:function size:0x124 -fn_8018BCC0 = .text:0x8018BCC0; // type:function size:0x58 -AcFishMgrBase__dtor = .text:0x8018BD20; // type:function size:0x5C -fn_8018BD80 = .text:0x8018BD80; // type:function size:0xDC -fn_8018BE60 = .text:0x8018BE60; // type:function size:0xE0 -fn_8018BF40 = .text:0x8018BF40; // type:function size:0x88 -fn_8018BFD0 = .text:0x8018BFD0; // type:function size:0xC -fn_8018BFE0 = .text:0x8018BFE0; // type:function size:0xC -fn_8018BFF0 = .text:0x8018BFF0; // type:function size:0xB4 -fn_8018C0B0 = .text:0x8018C0B0; // type:function size:0xA0 -fn_8018C150 = .text:0x8018C150; // type:function size:0x44 -fn_8018C1A0 = .text:0x8018C1A0; // type:function size:0x4 -fBase__draw = .text:0x8018C1B0; // type:function size:0x4 +baseID_Wait<10sStateID_c>__Fv_RC12sStateIDIf_c = .text:0x8018B880; // type:function size:0xC scope:local +actorCreate__16dAcFishMgrBase_cFv = .text:0x8018B890; // type:function size:0x4 +actorPostCreate__16dAcFishMgrBase_cFv = .text:0x8018B8A0; // type:function size:0x118 +doDelete__16dAcFishMgrBase_cFv = .text:0x8018B9C0; // type:function size:0x4 +draw__16dAcFishMgrBase_cFv = .text:0x8018B9D0; // type:function size:0x8 +vt_0x80__16dAcFishMgrBase_cFv = .text:0x8018B9E0; // type:function size:0x8 +initializeState_Wait__16dAcFishMgrBase_cFv = .text:0x8018B9F0; // type:function size:0x4 +executeState_Wait__16dAcFishMgrBase_cFv = .text:0x8018BA00; // type:function size:0x4 +finalizeState_Wait__16dAcFishMgrBase_cFv = .text:0x8018BA10; // type:function size:0x4 +__dt__16dAcFishMgrBase_cFv = .text:0x8018BA20; // type:function size:0xD8 +finalizeState__31sFStateID_c<16dAcFishMgrBase_c>CFR16dAcFishMgrBase_c = .text:0x8018BB00; // type:function size:0x30 +executeState__31sFStateID_c<16dAcFishMgrBase_c>CFR16dAcFishMgrBase_c = .text:0x8018BB30; // type:function size:0x30 +initializeState__31sFStateID_c<16dAcFishMgrBase_c>CFR16dAcFishMgrBase_c = .text:0x8018BB60; // type:function size:0x30 +__sinit_\d_a_fish_mgr_base_cpp = .text:0x8018BB90; // type:function size:0x124 scope:local +__dt__31sFStateID_c<16dAcFishMgrBase_c>Fv = .text:0x8018BCC0; // type:function size:0x58 +__dt__38sFStateVirtualID_c<16dAcFishMgrBase_c>Fv = .text:0x8018BD20; // type:function size:0x5C +number__38sFStateVirtualID_c<16dAcFishMgrBase_c>CFv = .text:0x8018BD80; // type:function size:0xDC +superID__38sFStateVirtualID_c<16dAcFishMgrBase_c>CFv = .text:0x8018BE60; // type:function size:0xE0 +isSameName__31sFStateID_c<16dAcFishMgrBase_c>CFPCc = .text:0x8018BF40; // type:function size:0x88 +baseID_Swim<10sStateID_c>__Fv_RC12sStateIDIf_c = .text:0x8018BFD0; // type:function size:0xC +baseID_Escape<10sStateID_c>__Fv_RC12sStateIDIf_c = .text:0x8018BFE0; // type:function size:0xC +createHeap__13dAcFishBase_cFv = .text:0x8018BFF0; // type:function size:0xB4 +create__13dAcFishBase_cFv = .text:0x8018C0B0; // type:function size:0xA0 +actorExecute__13dAcFishBase_cFv = .text:0x8018C150; // type:function size:0x44 +doDelete__13dAcFishBase_cFv = .text:0x8018C1A0; // type:function size:0x4 +draw__13dAcFishBase_cFv = .text:0x8018C1B0; // type:function size:0x4 fn_8018C1C0 = .text:0x8018C1C0; // type:function size:0x2C -fn_8018C1F0 = .text:0x8018C1F0; // type:function size:0x48 -fn_8018C240 = .text:0x8018C240; // type:function size:0x8 -fn_8018C250 = .text:0x8018C250; // type:function size:0x2DC -fn_8018C530 = .text:0x8018C530; // type:function size:0x8 -fn_8018C540 = .text:0x8018C540; // type:function size:0x8 -fn_8018C550 = .text:0x8018C550; // type:function size:0x8 -fn_8018C560 = .text:0x8018C560; // type:function size:0x8 -fn_8018C570 = .text:0x8018C570; // type:function size:0x8 -fn_8018C580 = .text:0x8018C580; // type:function size:0x8 -fn_8018C590 = .text:0x8018C590; // type:function size:0x8 -fn_8018C5A0 = .text:0x8018C5A0; // type:function size:0x180 -fn_8018C720 = .text:0x8018C720; // type:function size:0x8 -fn_8018C730 = .text:0x8018C730; // type:function size:0x8 -fn_8018C740 = .text:0x8018C740; // type:function size:0x8 -fn_8018C750 = .text:0x8018C750; // type:function size:0x8 -fn_8018C760 = .text:0x8018C760; // type:function size:0x108 -fn_8018C870 = .text:0x8018C870; // type:function size:0x41C -fn_8018CC90 = .text:0x8018CC90; // type:function size:0x8 -fn_8018CCA0 = .text:0x8018CCA0; // type:function size:0x300 -fn_8018CFA0 = .text:0x8018CFA0; // type:function size:0x8 -fn_8018CFB0 = .text:0x8018CFB0; // type:function size:0x8 -fn_8018CFC0 = .text:0x8018CFC0; // type:function size:0x108 -fn_8018D0D0 = .text:0x8018D0D0; // type:function size:0xB4 -fn_8018D190 = .text:0x8018D190; // type:function size:0x23C -fn_8018D3D0 = .text:0x8018D3D0; // type:function size:0xF4 -fn_8018D4D0 = .text:0x8018D4D0; // type:function size:0xC4 -fn_8018D5A0 = .text:0x8018D5A0; // type:function size:0x54 -fn_8018D600 = .text:0x8018D600; // type:function size:0x60 -fn_8018D660 = .text:0x8018D660; // type:function size:0x68 -fn_8018D6D0 = .text:0x8018D6D0; // type:function size:0x8 -fn_8018D6E0 = .text:0x8018D6E0; // type:function size:0x50 -fn_8018D730 = .text:0x8018D730; // type:function size:0x28 -fn_8018D760 = .text:0x8018D760; // type:function size:0x14 -fn_8018D780 = .text:0x8018D780; // type:function size:0x58 -fn_8018D7E0 = .text:0x8018D7E0; // type:function size:0x4 -fn_8018D7F0 = .text:0x8018D7F0; // type:function size:0x8 -fn_8018D800 = .text:0x8018D800; // type:function size:0x1E4 -fn_8018D9F0 = .text:0x8018D9F0; // type:function size:0x8 -fn_8018DA00 = .text:0x8018DA00; // type:function size:0x8 -fn_8018DA10 = .text:0x8018DA10; // type:function size:0x8 -fn_8018DA20 = .text:0x8018DA20; // type:function size:0x4 -fn_8018DA30 = .text:0x8018DA30; // type:function size:0x98 -fn_8018DAD0 = .text:0x8018DAD0; // type:function size:0x4 -fn_8018DAE0 = .text:0x8018DAE0; // type:function size:0x8 -fn_8018DAF0 = .text:0x8018DAF0; // type:function size:0x8 -fn_8018DB00 = .text:0x8018DB00; // type:function size:0x8 -fn_8018DB10 = .text:0x8018DB10; // type:function size:0x1A8 -fn_8018DCC0 = .text:0x8018DCC0; // type:function size:0x8 -fn_8018DCD0 = .text:0x8018DCD0; // type:function size:0x8 -fn_8018DCE0 = .text:0x8018DCE0; // type:function size:0x4 -fn_8018DCF0 = .text:0x8018DCF0; // type:function size:0x10C -fn_8018DE00 = .text:0x8018DE00; // type:function size:0x30 -fn_8018DE30 = .text:0x8018DE30; // type:function size:0x30 -fn_8018DE60 = .text:0x8018DE60; // type:function size:0x30 -AcFishBase__sinit = .text:0x8018DE90; // type:function size:0x1E0 -fn_8018E070 = .text:0x8018E070; // type:function size:0x58 -AcFishBase__dtor = .text:0x8018E0D0; // type:function size:0x5C -fn_8018E130 = .text:0x8018E130; // type:function size:0xDC -fn_8018E210 = .text:0x8018E210; // type:function size:0xE0 -fn_8018E2F0 = .text:0x8018E2F0; // type:function size:0x88 +vt_0x8C__13dAcFishBase_cFv = .text:0x8018C1F0; // type:function size:0x48 +getFishMgr__13dAcFishBase_cFv = .text:0x8018C240; // type:function size:0x8 +fn_8018C250__13dAcFishBase_cFv = .text:0x8018C250; // type:function size:0x2DC +vt_0xFC__13dAcFishBase_cCFv = .text:0x8018C530; // type:function size:0x8 +vt_0xDC__13dAcFishBase_cCFv = .text:0x8018C540; // type:function size:0x8 +vt_0xF4__13dAcFishBase_cCFv = .text:0x8018C550; // type:function size:0x8 +vt_0xD8__13dAcFishBase_cCFv = .text:0x8018C560; // type:function size:0x8 +vt_0xE0__13dAcFishBase_cCFv = .text:0x8018C570; // type:function size:0x8 +vt_0xE4__13dAcFishBase_cCFv = .text:0x8018C580; // type:function size:0x8 +vt_0xF8__13dAcFishBase_cCFv = .text:0x8018C590; // type:function size:0x8 +fn_8018C5A0__13dAcFishBase_cFv = .text:0x8018C5A0; // type:function size:0x180 +vt_0x104__13dAcFishBase_cCFv = .text:0x8018C720; // type:function size:0x8 +vt_0x108__13dAcFishBase_cCFv = .text:0x8018C730; // type:function size:0x8 +vt_0x114__13dAcFishBase_cCFv = .text:0x8018C740; // type:function size:0x8 +vt_0x118__13dAcFishBase_cCFv = .text:0x8018C750; // type:function size:0x8 +fn_8018C760__13dAcFishBase_cFv = .text:0x8018C760; // type:function size:0x108 +fn_8018C870__13dAcFishBase_cFv = .text:0x8018C870; // type:function size:0x41C +vt_0x120__13dAcFishBase_cCFv = .text:0x8018CC90; // type:function size:0x8 +fn_8018CCA0__13dAcFishBase_cFv = .text:0x8018CCA0; // type:function size:0x300 +vt_0xEC__13dAcFishBase_cCFv = .text:0x8018CFA0; // type:function size:0x8 +vt_0xD4__13dAcFishBase_cCFv = .text:0x8018CFB0; // type:function size:0x8 +fn_8018CFC0__13dAcFishBase_cFf = .text:0x8018CFC0; // type:function size:0x108 +fn_8018D0D0__13dAcFishBase_cFf = .text:0x8018D0D0; // type:function size:0xB4 +fn_8018D190__13dAcFishBase_cFff = .text:0x8018D190; // type:function size:0x23C +vt_0xB4__13dAcFishBase_cFv = .text:0x8018D3D0; // type:function size:0xF4 +fn_8018D4D0__13dAcFishBase_cFv = .text:0x8018D4D0; // type:function size:0xC4 +fn_8018D5A0__13dAcFishBase_cFv = .text:0x8018D5A0; // type:function size:0x54 +fn_8018D600__13dAcFishBase_cFv = .text:0x8018D600; // type:function size:0x60 +fn_8018D660__13dAcFishBase_cFv = .text:0x8018D660; // type:function size:0x68 +vt_0xC0__13dAcFishBase_cCFv = .text:0x8018D6D0; // type:function size:0x8 +fn_8018D6E0__13dAcFishBase_cFv = .text:0x8018D6E0; // type:function size:0x50 +fn_8018D730__13dAcFishBase_cFv = .text:0x8018D730; // type:function size:0x28 +fn_8018D760__13dAcFishBase_cFv = .text:0x8018D760; // type:function size:0x14 +initializeState_Swim__13dAcFishBase_cFv = .text:0x8018D780; // type:function size:0x58 +vt_0xA8__13dAcFishBase_cFv = .text:0x8018D7E0; // type:function size:0x4 +vt_0xE8__13dAcFishBase_cCFv = .text:0x8018D7F0; // type:function size:0x8 +executeState_Swim__13dAcFishBase_cFv = .text:0x8018D800; // type:function size:0x1E4 +vt_0xF0__13dAcFishBase_cCFv = .text:0x8018D9F0; // type:function size:0x8 +vt_0xCC__13dAcFishBase_cCFv = .text:0x8018DA00; // type:function size:0x8 +vt_0x100__13dAcFishBase_cCFv = .text:0x8018DA10; // type:function size:0x8 +finalizeState_Swim__13dAcFishBase_cFv = .text:0x8018DA20; // type:function size:0x4 +initializeState_Escape__13dAcFishBase_cFv = .text:0x8018DA30; // type:function size:0x98 +vt_0xAC__13dAcFishBase_cFv = .text:0x8018DAD0; // type:function size:0x4 +vt_0x10C__13dAcFishBase_cCFv = .text:0x8018DAE0; // type:function size:0x8 +vt_0x110__13dAcFishBase_cCFv = .text:0x8018DAF0; // type:function size:0x8 +vt_0x11C__13dAcFishBase_cCFv = .text:0x8018DB00; // type:function size:0x8 +executeState_Escape__13dAcFishBase_cFv = .text:0x8018DB10; // type:function size:0x1A8 +vt_0x124__13dAcFishBase_cCFv = .text:0x8018DCC0; // type:function size:0x8 +vt_0xD0__13dAcFishBase_cFv = .text:0x8018DCD0; // type:function size:0x8 +finalizeState_Escape__13dAcFishBase_cFv = .text:0x8018DCE0; // type:function size:0x4 +__dt__13dAcFishBase_cFv = .text:0x8018DCF0; // type:function size:0x10C +finalizeState__28sFStateID_c<13dAcFishBase_c>CFR13dAcFishBase_c = .text:0x8018DE00; // type:function size:0x30 +executeState__28sFStateID_c<13dAcFishBase_c>CFR13dAcFishBase_c = .text:0x8018DE30; // type:function size:0x30 +initializeState__28sFStateID_c<13dAcFishBase_c>CFR13dAcFishBase_c = .text:0x8018DE60; // type:function size:0x30 +__sinit_\d_a_fish_base_cpp = .text:0x8018DE90; // type:function size:0x1E0 +__dt__28sFStateID_c<13dAcFishBase_c>Fv = .text:0x8018E070; // type:function size:0x58 +__dt__35sFStateVirtualID_c<13dAcFishBase_c>Fv = .text:0x8018E0D0; // type:function size:0x5C +number__35sFStateVirtualID_c<13dAcFishBase_c>CFv = .text:0x8018E130; // type:function size:0xDC +superID__35sFStateVirtualID_c<13dAcFishBase_c>CFv = .text:0x8018E210; // type:function size:0xE0 +isSameName__28sFStateID_c<13dAcFishBase_c>CFPCc = .text:0x8018E2F0; // type:function size:0x88 fn_8018E380 = .text:0x8018E380; // type:function size:0x6C fn_8018E3F0 = .text:0x8018E3F0; // type:function size:0x1C fn_8018E410 = .text:0x8018E410; // type:function size:0x4 @@ -35591,7 +35591,7 @@ __vt__15dLytMapIcon01_c = .data:0x8052A860; // type:object size:0x20 lbl_8052A880 = .data:0x8052A880; // type:object size:0x10 lbl_8052A890 = .data:0x8052A890; // type:object size:0xC8 lbl_8052A958 = .data:0x8052A958; // type:object size:0x68 -lbl_8052A9C0 = .data:0x8052A9C0; // type:object size:0x1AC +__vt__13dAcFishBase_c = .data:0x8052A9C0; // type:object size:0x1AC lbl_8052AB6C = .data:0x8052AB6C; // type:object size:0x6C @LOCAL@addAttentionTarget__12dAcOInsect_cFv@tmpTarget = .data:0x8052ABD8; // type:object size:0x30 scope:local __vt__12dAcOInsect_c = .data:0x8052AC08; // type:object size:0xB4 diff --git a/include/d/a/d_a_fish.h b/include/d/a/d_a_fish.h index cfaceb5f..8d3b5f00 100644 --- a/include/d/a/d_a_fish.h +++ b/include/d/a/d_a_fish.h @@ -1,13 +1,22 @@ #ifndef D_A_FISH_H #define D_A_FISH_H -#include "d/a/obj/d_a_obj_base.h" +#include "d/a/d_a_fish_base.h" -class dAcFish_c : public dAcObjBase_c { +class dAcFish_c : public dAcFishBase_c { public: dAcFish_c() {} virtual ~dAcFish_c() {} + virtual const char *getResFileName() override; + virtual const char *getMdlName() override; + virtual const char *getAnmName() override; + virtual UNKWORD vt_0xB0() override; + virtual f32 vt_0xB8() override; + virtual f32 vt_0xBC() override; + virtual void vt_0xC4() override; + virtual void vt_0xC8() override; + private: }; diff --git a/include/d/a/d_a_fish_base.h b/include/d/a/d_a_fish_base.h new file mode 100644 index 00000000..bb55c0ea --- /dev/null +++ b/include/d/a/d_a_fish_base.h @@ -0,0 +1,161 @@ +#ifndef D_A_FISH_BASE_H +#define D_A_FISH_BASE_H + +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_shadow.h" +#include "m/m3d/m_anmmdl.h" +#include "s/s_State.hpp" + +class dAcFishMgrBase_c; + +class dAcFishBase_c : public dAcObjBase_c { +public: + dAcFishBase_c() : mStateMgr(*this) {} + virtual ~dAcFishBase_c() {} + + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int doDelete() override; + virtual int draw() override; + +protected: + /* vt 0x80 */ virtual const char *getResFileName() = 0; + /* vt 0x84 */ virtual const char *getMdlName() = 0; + /* vt 0x88 */ virtual const char *getAnmName() = 0; + /* vt 0x8C */ virtual void vt_0x8C(); + /* vt 0x90-0x9C */ STATE_VIRTUAL_FUNC_DECLARE(dAcFishBase_c, Swim); + /* vt 0x9C-0xA4 */ STATE_VIRTUAL_FUNC_DECLARE(dAcFishBase_c, Escape); + /* vt 0xA8 */ virtual void vt_0xA8() {} + /* vt 0xAC */ virtual void vt_0xAC() {} + /* vt 0xB0 */ virtual UNKWORD vt_0xB0() = 0; + /* vt 0xB4 */ virtual void vt_0xB4(); + /* vt 0xB8 */ virtual f32 vt_0xB8() = 0; + /* vt 0xBC */ virtual f32 vt_0xBC() = 0; + /* vt 0xC0 */ virtual s16 vt_0xC0() const { + return 100; + } + /* vt 0xC4 */ virtual void vt_0xC4() = 0; + /* vt 0xC8 */ virtual void vt_0xC8() = 0; + /* vt 0xCC */ virtual f32 vt_0xCC() const { + return 0.1f; + } + /* vt 0xD0 */ virtual f32 vt_0xD0() { + return 2.0f; + } + /* vt 0xD4 */ virtual f32 vt_0xD4() const { + return 200.0f; + } + /* vt 0xD8 */ virtual f32 vt_0xD8() const { + return 3.0f; + } + /* vt 0xDC */ virtual f32 vt_0xDC() const { + return 5.0f; + } + /* vt 0xE0 */ virtual s32 vt_0xE0() const { + return 90; + } + /* vt 0xE4 */ virtual s32 vt_0xE4() const { + return 180; + } + /* vt 0xE8 */ virtual s16 vt_0xE8() const { + return 15; + } + /* vt 0xEC */ virtual f32 vt_0xEC() const { + return 300.0f; + } + /* vt 0xF0 */ virtual f32 vt_0xF0() const { + return 100.0f; + } + /* vt 0xF4 */ virtual s32 vt_0xF4() const { + return 30; + } + /* vt 0xF8 */ virtual s32 vt_0xF8() const { + return 45; + } + /* vt 0xFC */ virtual f32 vt_0xFC() const { + return 200.0f; + } + /* vt 0x100 */ virtual f32 vt_0x100() const { + return 400.0f; + } + /* vt 0x104 */ virtual f32 vt_0x104() const { + return 15.0f; + } + /* vt 0x108 */ virtual f32 vt_0x108() const { + return 20.0f; + } + /* vt 0x10C */ virtual s32 vt_0x10C() const { + return 30; + } + /* vt 0x110 */ virtual s32 vt_0x110() const { + return 60; + } + /* vt 0x114 */ virtual s32 vt_0x114() const { + return 10; + } + /* vt 0x118 */ virtual s32 vt_0x118() const { + return 20; + } + /* vt 0x11C */ virtual s16 vt_0x11C() const { + return 15; + } + /* vt 0x120 */ virtual f32 vt_0x120() const { + return 500.0f; + } + /* vt 0x124 */ virtual f32 vt_0x124() const { + return 300.0f; + } + + dAcFishMgrBase_c *getFishMgr(); + // TODO - unknown callback signature for 0x8018c1c0 + void fn_8018C240(); + void fn_8018C250(); + void fn_8018C5A0(); + void fn_8018C760(); + void fn_8018C870(); + void fn_8018CCA0(); + bool fn_8018CFC0(f32 arg); + bool fn_8018D0D0(f32 arg); + void fn_8018D190(f32 arg, f32 unused); + void fn_8018D4D0(); + void fn_8018D5A0(); + bool fn_8018D600(); + void fn_8018D660(); + void fn_8018D6E0(); + void fn_8018D730(); + void fn_8018D760(); + + /* 0x330 */ m3d::mdlAnmChr mMdl; + /* 0x398 */ dShadowCircle_c mShadow; + /* 0x3A0 */ dBgS_AcchCir mAcch; + /* 0x3FC */ dBgS_ObjAcch mObjAcch; + /* 0x7AC */ dCcD_Sph mSph1; + /* 0x8FC */ dCcD_Sph mSph2; + /* 0xA4C */ mVec3_c field_0xA4C; + /* 0xA58 */ u8 field_0xA58; + + /* 0xA59 */ u8 _0xA59[0xA60 - 0xA59]; + + /* 0xA60 */ mVec3_c field_0xA60; + /* 0xA6C */ mVec3_c field_0xA6C; + /* 0xA78 */ u8 field_0xA78; + /* 0xA79 */ u8 field_0xA79; + /* 0xA7A */ u8 field_0xA7A; + /* 0xA7C */ s16 field_0xA7C; + /* 0xA7E */ s16 field_0xA7E; + /* 0xA80 */ s16 field_0xA80; + /* 0xA82 */ s16 field_0xA82; + /* 0xA84 */ s16 field_0xA84; + /* 0xA86 */ s16 field_0xA86; + /* 0xA88 */ s16 field_0xA88; + /* 0xA8A */ s16 field_0xA8A; + /* 0xA86 */ s16 field_0xA8C; + /* 0xA90 */ f32 field_0xA90; + /* 0xA94 */ f32 field_0xA94; + /* 0xA98 */ STATE_MGR_DECLARE(dAcFishBase_c); +}; + +#endif diff --git a/include/d/a/d_a_fish_mgr.h b/include/d/a/d_a_fish_mgr.h index 1cdd1d34..e1fb6f4c 100644 --- a/include/d/a/d_a_fish_mgr.h +++ b/include/d/a/d_a_fish_mgr.h @@ -1,9 +1,9 @@ #ifndef D_A_FISH_MGR_H #define D_A_FISH_MGR_H -#include "d/a/d_a_base.h" +#include "d/a/d_a_fish_mgr_base.h" -class dAcFishMgr_c : public dAcBase_c { +class dAcFishMgr_c : public dAcFishMgrBase_c { public: dAcFishMgr_c() {} virtual ~dAcFishMgr_c() {} diff --git a/include/d/a/d_a_fish_mgr_base.h b/include/d/a/d_a_fish_mgr_base.h new file mode 100644 index 00000000..39abbde4 --- /dev/null +++ b/include/d/a/d_a_fish_mgr_base.h @@ -0,0 +1,53 @@ +#ifndef D_A_FISH_MGR_BASE_H +#define D_A_FISH_MGR_BASE_H + +#include "d/t/d_tg.h" +#include "d/a/d_a_fish_base.h" +#include "s/s_State.hpp" + +// Not sure if dTg_c is the right parent class but there is one parent before dAcBase_c without extra data +class dAcFishMgrBase_c : public dTg_c { +public: + dAcFishMgrBase_c() : mStateMgr(*this) {} + virtual ~dAcFishMgrBase_c() {} + + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int doDelete() override; + virtual int draw() override; + + dAcFishBase_c *getFish() { + return mRef.get(); + } + + f32 getField_0x144() const { + return field_0x144; + } + + f32 getField_0x148() const { + return field_0x148; + } + + f32 getField_0x14C() const { + return field_0x14C; + } + + bool getField_0x151() const { + return field_0x151; + } + +protected: + STATE_VIRTUAL_FUNC_DECLARE(dAcFishMgrBase_c, Wait); + virtual bool vt_0x80(); + +private: + /* 0x0FC */ STATE_MGR_DECLARE(dAcFishMgrBase_c); + /* 0x138 */ dAcRef_c mRef; + /* 0x144 */ f32 field_0x144; + /* 0x148 */ f32 field_0x148; + /* 0x14C */ f32 field_0x14C; + /* 0x150 */ bool field_0x150; + /* 0x151 */ bool field_0x151; +}; + +#endif diff --git a/src/d/a/d_a_fish_base.cpp b/src/d/a/d_a_fish_base.cpp new file mode 100644 index 00000000..dda5be90 --- /dev/null +++ b/src/d/a/d_a_fish_base.cpp @@ -0,0 +1,465 @@ +#include "d/a/d_a_fish_base.h" + +#include "c/c_lib.h" +#include "d/a/d_a_fish_mgr_base.h" +#include "d/a/d_a_player.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/col/cc/d_cc_s.h" +#include "d/d_vec.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "s/s_Math.h" + +STATE_VIRTUAL_DEFINE(dAcFishBase_c, Swim); +STATE_VIRTUAL_DEFINE(dAcFishBase_c, Escape); + +bool dAcFishBase_c::createHeap() { + void *data = getOarcResFile(getResFileName()); + TRY_CREATE(mMdl.create(data, getMdlName(), getAnmName(), &mAllocator, 0x120, 1, nullptr)); + + return true; +} + +int dAcFishBase_c::create() { + mAcceleration = 0.0f; + mMaxSpeed = -40.0f; + field_0xA7C = 0; + field_0xA7E = 0; + field_0xA80 = cM::rndF(65536.0f); + field_0xA82 = 0; + field_0xA84 = 0; + field_0xA60.set(0.0f, 0.0f, 0.0f); + field_0xA86 = 0; + field_0xA88 = 0; + field_0xA8A = 0; + field_0xA8C = 0; + field_0xA90 = 0.0f; + + field_0xA78 = 0; + field_0xA79 = 0; + field_0xA7A = 0; + + return SUCCEEDED; +} + +int dAcFishBase_c::actorExecute() { + vt_0x8C(); + fn_8018D5A0(); + return SUCCEEDED; +} + +int dAcFishBase_c::doDelete() { + return dAcObjBase_c::doDelete(); +} + +int dAcFishBase_c::draw() { + return dAcObjBase_c::draw(); +} + +void dAcFishBase_c::vt_0x8C() { + mSph1.SetC(mPosition); + dCcS::GetInstance()->Set(&mSph1); + fn_8018D4D0(); +} + +dAcFishMgrBase_c *dAcFishBase_c::getFishMgr() { + return static_cast(mActorNode.get()); +} + +extern "C" s32 fn_800406D0(s32, s32); +extern "C" f32 fn_800408B0(f32, f32); +extern "C" s32 fn_800408F0(s32, s32); + +void dAcFishBase_c::fn_8018C250() { + dAcFishBase_c *fish = getFishMgr()->getFish(); + if (fish == nullptr) { + field_0xA58 = 1; + } + + if (field_0xA58 != 0) { + fn_8018C760(); + } else { + field_0xA60 = fish->getPosition() + field_0xA4C; + } + + field_0xA8A = 0; + field_0xA8C = vt_0xB8() + cM::rndF(vt_0xBC()); + field_0xA86 = cLib::targetAngleY(mPosition, field_0xA60); + field_0xA88 = -cLib::targetAngleX(mPosition, field_0xA60); + if (field_0xA88 > 0x1800) { + field_0xA88 = 0x1800; + } else if (field_0xA88 < -0x1800) { + field_0xA88 = -0x1800; + } + + if (field_0xA58 == 0 && mPosition.distance(fish->getPosition()) > vt_0xFC()) { + field_0xA90 = vt_0xDC(); + field_0xA7E = vt_0xF4(); + } else { + s32 t1, t2; + t1 = vt_0xD8(); + t2 = vt_0xDC(); + field_0xA90 = fn_800406D0(t1, t2); + if (field_0xA58 != 0) { + t1 = vt_0xE0(); + t2 = vt_0xE4(); + } else { + t1 = vt_0xF4(); + t2 = vt_0xF8(); + } + field_0xA7E = fn_800406D0(t1, t2); + + if (field_0xA58 != 0) { + field_0xA7E *= (s16)(getFishMgr()->getField_0x144() / 1000.0f); + } + } + + field_0xA78 = 0; + field_0xA79 = 0; +} + +void dAcFishBase_c::fn_8018C5A0() { + fn_8018C870(); + field_0xA8A = 0; + field_0xA86 = cLib::targetAngleY(getPosition(), field_0xA60) + (s16)cM::rndFX(8192.0f); + field_0xA88 = -cLib::targetAngleX(getPosition(), field_0xA60); + if (field_0xA88 > 0x1800) { + field_0xA88 = 0x1800; + } else if (field_0xA88 < -0x1800) { + field_0xA88 = -0x1800; + } + + field_0xA90 = fn_800408B0(vt_0x104(), vt_0x108()); + if (field_0xA78 != 0 || field_0xA79 != 0) { + field_0xA7E = fn_800406D0(vt_0xE0(), vt_0xE4()); + } else { + field_0xA7E = fn_800406D0(vt_0x114(), vt_0x118()); + } + + field_0xA78 = 0; + field_0xA79 = 0; +} + +void dAcFishBase_c::fn_8018C760() { + dAcFishMgrBase_c *mgr = getFishMgr(); + f32 f1 = mgr->getField_0x144(); + f32 f2 = mgr->getField_0x148(); + + if (field_0xA78 != 0) { + mMtx_c mtx; + mtx.YrotS(cLib::targetAngleY(field_0xA6C, getPosition())); + mVec3_c v(0.0f, 0.0f, 500.0f); + mtx.multVec(v, field_0xA60); + field_0xA60.x += getPosition().x; + field_0xA60.z += getPosition().z; + } else { + field_0xA60.x = mStartingPos.x + cM::rndFX(f1); + field_0xA60.z = mStartingPos.z + cM::rndFX(f1); + } + + field_0xA60.y = mStartingPos.y + cM::rndF(f2); + fn_8018CCA0(); +} + +void dAcFishBase_c::fn_8018C870() { + f32 f1 = vt_0x120(); + mVec3_c v1 = mPosition; + getXZCirclePoint(v1, mAngle.y + 0x4000, f1); + + mVec3_c v2 = mPosition; + getXZCirclePoint(v2, mAngle.y + -0x4000, f1); + + bool b1 = false, b2 = false; + if (dBgS_ObjLinChk::LineCross(&mPosition, &v1, this)) { + b1 = true; + } + if (dBgS_ObjLinChk::LineCross(&mPosition, &v2, this)) { + b2 = true; + } + + mMtx_c mtx; + if ((field_0xA78 != 0 || field_0xA79 != 0) && b1 && b2) { + mtx.YrotS(cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition)); + } else if ((field_0xA78 != 0 || field_0xA79 != 0) && b1 && !b2) { + mtx.YrotS(cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition) + fn_800408F0(1820, 8192)); + } else if ((field_0xA78 != 0 || field_0xA79 != 0) && !b1 && b2) { + mtx.YrotS(cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition) + fn_800406D0(-8192, -1820)); + } else if ((field_0xA78 != 0 || field_0xA79 != 0) && !b1 && !b2) { + if (cM::rndF(1.0f) < 0.5f) { + mtx.YrotS(cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition) + fn_800408F0(1820, 8192)); + } else { + mtx.YrotS(cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition) + fn_800406D0(-8192, -1820)); + } + } else { + mtx.YrotS(cLib::targetAngleY(dAcPy_c::GetLink()->mPosition, mPosition)); + } + + dAcFishMgrBase_c *mgr = getFishMgr(); + mVec3_c v3(0.0f, 0.0f, 500.0f); + mtx.multVec(v3, field_0xA60); + field_0xA60.x += getPosition().x; + field_0xA60.z += getPosition().z; + field_0xA60.y = mStartingPos.y + cM::rndF(mgr->getField_0x148()); + + if ((field_0xA78 || field_0xA79) && b1 && b2) { + f32 f3 = field_0xA60.y - dAcPy_c::GetLink()->getPosition().y; + if (nw4r::math::FAbs(f3) < 50.0f) { + if (f3 > 0.0f) { + field_0xA60.y += 50.0f; + } else { + field_0xA60.y -= 50.0f; + } + } + } + + fn_8018CCA0(); +} + +void dAcFishBase_c::fn_8018CCA0() { + // NONMATCHING + dBgS_LinChk chk; + chk.Set(&mPosition, &field_0xA60, this); + if (dBgS::GetInstance()->LineCross(&chk)) { + mVec3_c end = chk.GetLinEnd(); + f32 dist = mPosition.distance(end); + if ((mStateMgr.getStateID()->isEqual(StateID_Swim) && dist < vt_0xEC()) || + (mStateMgr.getStateID()->isEqual(StateID_Escape) && dist < vt_0x120())) { + mVec3_c t1 = field_0xA60 - mPosition; + t1.rotY(0x8000); + field_0xA60 = t1 + mPosition; + } + } + dAcFishMgrBase_c *mgr = getFishMgr(); + f32 f2 = mgr->getPosition().absXZTo(field_0xA60); + if (f2 > mgr->getField_0x144()) { + // TODO FPR Regswaps + f2 = mgr->getField_0x144() / f2; + + field_0xA60.x -= mgr->getPosition().x; + field_0xA60.z -= mgr->getPosition().z; + + field_0xA60.x *= f2; + field_0xA60.z *= f2; + + field_0xA60.x += mgr->getPosition().x; + field_0xA60.z += mgr->getPosition().z; + } + + if (field_0xA60.y < mgr->getPosition().y) { + field_0xA60.y = mgr->getPosition().y + 100.0f; + } else if (field_0xA60.y > mgr->getPosition().y + mgr->getField_0x148()) { + field_0xA60.y = mgr->getPosition().y + mgr->getField_0x148() - 100.0f; + } + + f32 f3 = mgr->getField_0x14C() - field_0xA60.y; + bool b1 = field_0xA60.y > mPosition.y; + + if ((f3 < vt_0xD4() && b1) || mgr->getField_0x151()) { + field_0xA60.y = mPosition.y; + } +} + +bool dAcFishBase_c::fn_8018CFC0(f32 arg) { + mVec3_c t1 = mPosition; + getXZCirclePoint(t1, mAngle.y, arg); + dAcFishMgrBase_c *mgr = getFishMgr(); + mVec3_c t2 = mgr->getPosition() - t1; + return t2.absXZ() > mgr->getField_0x144(); +} + +bool dAcFishBase_c::fn_8018D0D0(f32 arg) { + dAcFishBase_c *fish = nullptr; + while ((fish = static_cast(fManager_c::searchBaseByProfName(fProfile::FISH, fish))) != nullptr) { + if (fish->field_0xA82 != 0 && field_0xA94 < arg) { + return true; + } + } + + while ((fish = static_cast(fManager_c::searchBaseByProfName(fProfile::EEL, fish))) != nullptr) { + if (fish->field_0xA82 != 0 && field_0xA94 < arg) { + return true; + } + } + + return false; +} + +void dAcFishBase_c::fn_8018D190(f32 arg, f32 unused) { + vt_0x120(); + mVec3_c t1 = mPosition; + getXZCirclePoint(t1, mAngle.y, arg); + if (dBgS_ObjLinChk::LineCross(&mPosition, &t1, this)) { + field_0xA78 = 1; + field_0xA6C.x = dBgS_ObjLinChk::GetInstance().GetLinEnd().x; + field_0xA6C.y = dBgS_ObjLinChk::GetInstance().GetLinEnd().y; + field_0xA6C.z = dBgS_ObjLinChk::GetInstance().GetLinEnd().z; + } else { + field_0xA78 = 0; + if (mObjAcch.ChkWallHit(nullptr) || mSph2.ChkCoHit() || mSph1.ChkCoHit()) { + field_0xA78 = 1; + mMtx_c mtx; + mtx.YrotS(mRotation.y); + mtx.XrotM(mRotation.x); + mMtx_c mtx2; + mtx2.transS(mVec3_c(0.0f, 0.0f, 100.0f)); + MTXConcat(mtx, mtx2, mtx); + mVec3_c t; + mtx.getTranslation(t); + field_0xA6C = mPosition + t; + } else if (fn_8018CFC0(arg)) { + field_0xA79 = 1; + } else { + field_0xA79 = 0; + } + } +} + +void dAcFishBase_c::vt_0xB4() { + mMtx_c mtx; + mtx.YrotS(mRotation.y); + mtx.XrotM(mRotation.x); + mVec3_c v(0.0f, 0.0f, mSpeed); + MTXMultVec(mtx, v, mVelocity); + + if (field_0xA7A != 0) { + mPosition.x += mVelocity.x; + mPosition.z += mVelocity.z; + } else { + mPosition += mVelocity; + } + mPosition += mStts.GetCcMove(); +} + +void dAcFishBase_c::fn_8018D4D0() { + mMtx_c mtx; + mtx.YrotS(mRotation.y); + mtx.XrotM(mRotation.x); + mMtx_c mtx2; + mtx2.transS(mVec3_c(0.0f, 0.0f, 200.0f)); + MTXConcat(mtx, mtx2, mtx); + mVec3_c t; + mtx.getTranslation(t); + mSph2.SetC(mPosition + t); + dCcS::GetInstance()->Set(&mSph2); +} + +void dAcFishBase_c::fn_8018D5A0() { + sLib::calcTimer(&field_0xA7C); + sLib::calcTimer(&field_0xA7E); + sLib::calcTimer(&field_0xA82); + sLib::calcTimer(&field_0xA84); + field_0xA80 += 1; +} + +bool dAcFishBase_c::fn_8018D600() { + // NINMATCHING + dAcFishMgrBase_c *mgr = getFishMgr(); + // TODO + f32 lim = mgr->getPosition().y + mgr->getField_0x148(); + if (mPosition.y >= lim && mAngle.x < 0) { + return false; + } else { + return true; + } +} + +void dAcFishBase_c::fn_8018D660() { + sLib::addCalcAngle(&mAngle.y.mVal, field_0xA86, 8, field_0xA8A); + sLib::addCalcAngle(&field_0xA8A, field_0xA8C, 1, vt_0xC0()); +} + +void dAcFishBase_c::fn_8018D6E0() { + sLib::addCalcAngle(&mAngle.y.mVal, field_0xA86, 8, field_0xA8A); + sLib::addCalcAngle(&field_0xA8A, 3000, 1, 1000); +} + +void dAcFishBase_c::fn_8018D730() { + s16 invScale = 8; + s16 maxStep = 20; + if (field_0xA7A != 0) { + invScale = 6; + maxStep = 30; + } + sLib::addCalcAngle(&mAngle.x.mVal, field_0xA88, invScale, maxStep); +} + +void dAcFishBase_c::fn_8018D760() { + sLib::addCalcAngle(&mAngle.x.mVal, field_0xA88, 4, 40); +} + +void dAcFishBase_c::initializeState_Swim() { + vt_0xA8(); + field_0xA7E = 0; + field_0xA84 = vt_0xE8(); +} + +void dAcFishBase_c::executeState_Swim() { + if (field_0xA84 == 0) { + fn_8018D190(vt_0xEC(), vt_0xF0()); + field_0xA84 = vt_0xE8(); + } + + if (field_0xA7E == 0 || field_0xA78 != 0 || field_0xA79 != 0) { + fn_8018C250(); + } + vt_0xC4(); + sLib::addCalcScaledDiff(&mSpeed, field_0xA90 * mScale.y, 0.1f, vt_0xCC()); + + if (vt_0xB0() == 0) { + mMdl.setRate(mSpeed * 0.3f); + } + + if (fn_8018D600()) { + field_0xA7A = 0; + } else { + field_0xA7A = 1; + field_0xA88 = 0; + field_0xA90 = vt_0xD8(); + } + + if ((field_0xA80 & 7) == 0 && (field_0xA94 < vt_0x100() || fn_8018D0D0(800.0f))) { + mStateMgr.changeState(StateID_Escape); + field_0xA82 = 20; + } +} + +void dAcFishBase_c::finalizeState_Swim() {} + +void dAcFishBase_c::initializeState_Escape() { + vt_0xAC(); + field_0xA7E = 0; + field_0xA7C = fn_800406D0(vt_0x10C(), vt_0x110()); + field_0xA84 = vt_0x11C(); +} + +void dAcFishBase_c::executeState_Escape() { + if (field_0xA84 == 0) { + fn_8018D190(vt_0x120(), vt_0x124()); + field_0xA84 = vt_0x11C(); + } + + if (field_0xA7E == 0 || field_0xA78 != 0 || field_0xA79 != 0) { + fn_8018C250(); + } + vt_0xC8(); + sLib::addCalcScaledDiff(&mSpeed, field_0xA90 * mScale.y, 0.5f, vt_0xD0()); + + if (vt_0xB0() == 0) { + mMdl.setRate(mSpeed * 0.3f); + } + + if (fn_8018D600()) { + field_0xA7A = 0; + } else { + field_0xA7A = 1; + field_0xA88 = 0; + field_0xA90 = vt_0xD8(); + } + + if (field_0xA7C == 0) { + mStateMgr.changeState(StateID_Escape); + } +} + +void dAcFishBase_c::finalizeState_Escape() {} diff --git a/src/d/a/d_a_fish_mgr_base.cpp b/src/d/a/d_a_fish_mgr_base.cpp new file mode 100644 index 00000000..6fbecc70 --- /dev/null +++ b/src/d/a/d_a_fish_mgr_base.cpp @@ -0,0 +1,62 @@ +#include "d/a/d_a_fish_mgr_base.h" + +#include "d/col/bg/d_bg_s_lin_chk.h" + +STATE_VIRTUAL_DEFINE(dAcFishMgrBase_c, Wait); + +int dAcFishMgrBase_c::actorCreate() { + return dTg_c::actorCreate(); +} + +int dAcFishMgrBase_c::actorPostCreate() { + // TODO - FPR regswaps + field_0x148 = 1000.0f; + mVec3_c v = mPosition; + v.y += 20000.0f; + + if (dBgS_WtrLinChk::SetIsWater(&v, &mPosition, nullptr)) { + field_0x14C = dBgS_WtrLinChk::GetInstance().GetLinEnd().y; + if (mPosition.y + field_0x148 > field_0x14C) { + field_0x150 = true; + field_0x148 = nw4r::math::FAbs(field_0x14C - mPosition.y); + } else { + field_0x150 = false; + } + } else { + field_0x150 = false; + } + + f32 offset = 200.0f; + if (field_0x14C - field_0x148 - mPosition.y < offset) { + f32 t = field_0x14C - mPosition.y - offset; + if (t > offset) { + field_0x148 = t; + field_0x151 = false; + } else { + field_0x148 = t + offset; + field_0x151 = true; + } + } else { + field_0x151 = false; + } + + return SUCCEEDED; +} + +int dAcFishMgrBase_c::doDelete() { + return dTg_c::doDelete(); +} + +int dAcFishMgrBase_c::draw() { + return SUCCEEDED; +} + +bool dAcFishMgrBase_c::vt_0x80() { + return true; +} + +void dAcFishMgrBase_c::initializeState_Wait() {} + +void dAcFishMgrBase_c::executeState_Wait() {} + +void dAcFishMgrBase_c::finalizeState_Wait() {}