From c743b47d7ea25bee800ee76b681dd5564bb38bc3 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 8 Mar 2026 16:21:54 -0400 Subject: [PATCH] actorExecute 99% --- config/SOUE01/rels/d_a_e_remlyNP/symbols.txt | 106 ++++-- include/d/a/e/d_a_e_remly.h | 140 +++++++- include/d/a/e/d_a_en_base.h | 4 +- include/d/d_player_act.h | 7 +- include/toBeSorted/d_emitter.h | 2 +- src/REL/d/a/e/d_a_e_remly.cpp | 329 +++++++++++++++++++ 6 files changed, 549 insertions(+), 39 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt index d45cf35b..4254c2bd 100644 --- a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt @@ -8,20 +8,20 @@ __dt__24sFState_c<11dAcEremly_c>Fv = .text:0x00000270; // type:function size:0x5 __dt__27sFStateFct_c<11dAcEremly_c>Fv = .text:0x000002D0; // type:function size:0x6C __dt__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000340; // type:function size:0xA0 __dt__50sFStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003E0; // type:function size:0xA4 -fn_177_490 = .text:0x00000490; // type:function size:0x58 -fn_177_4F0 = .text:0x000004F0; // type:function size:0x58 -fn_177_550 = .text:0x00000550; // type:function size:0x5C -fn_177_5B0 = .text:0x000005B0; // type:function size:0xD8 -fn_177_690 = .text:0x00000690; // type:function size:0x104 -fn_177_7A0 = .text:0x000007A0; // type:function size:0x498 +__dt__15dShadowCircle_cFv = .text:0x00000490; // type:function size:0x58 +__dt__Q211dAcEremly_c10callback_cFv = .text:0x000004F0; // type:function size:0x58 +__dt__14dWaterEffect_cFv = .text:0x00000550; // type:function size:0x5C +timingB__Q211dAcEremly_c10callback_cFUlPQ34nw4r3g3d13WorldMtxManipQ34nw4r3g3d6ResMdl = .text:0x000005B0; // type:function size:0xD8 +createHeap__11dAcEremly_cFv = .text:0x00000690; // type:function size:0x104 +actorCreate__11dAcEremly_cFv = .text:0x000007A0; // type:function size:0x498 changeState__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000C40; // type:function size:0x10 -fn_177_C50 = .text:0x00000C50; // type:function size:0x10C -fn_177_D60 = .text:0x00000D60; // type:function size:0x8 -fn_177_D70 = .text:0x00000D70; // type:function size:0x108C +actorPostCreate__11dAcEremly_cFv = .text:0x00000C50; // type:function size:0x10C +doDelete__11dAcEremly_cFv = .text:0x00000D60; // type:function size:0x8 +actorExecute__11dAcEremly_cFv = .text:0x00000D70; // type:function size:0x108C executeState__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00001E00; // type:function size:0x10 getStateID__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001E10; // type:function size:0x10 -fn_177_1E20 = .text:0x00001E20; // type:function size:0x1C -fn_177_1E40 = .text:0x00001E40; // type:function size:0x24C +calcTimer__4sLibFPUs_Us = .text:0x00001E20; // type:function size:0x1C +draw__11dAcEremly_cFv = .text:0x00001E40; // type:function size:0x24C initializeState_Wait__11dAcEremly_cFv = .text:0x00002090; // type:function size:0x104 executeState_Wait__11dAcEremly_cFv = .text:0x000021A0; // type:function size:0x478 finalizeState_Wait__11dAcEremly_cFv = .text:0x00002620; // type:function size:0x4 @@ -117,10 +117,10 @@ fn_177_8AC0 = .text:0x00008AC0; // type:function size:0x160 fn_177_8C20 = .text:0x00008C20; // type:function size:0x36C fn_177_8F90 = .text:0x00008F90; // type:function size:0x3E0 fn_177_9370 = .text:0x00009370; // type:function size:0xE8 -fn_177_9460 = .text:0x00009460; // type:function size:0x8 -fn_177_9470 = .text:0x00009470; // type:function size:0x4 -fn_177_9480 = .text:0x00009480; // type:function size:0x4 -fn_177_9490 = .text:0x00009490; // type:function size:0x8 +vt_0x88__11dAcEnBase_cFi = .text:0x00009460; // type:function size:0x8 +vt_0x84__11dAcEnBase_cFv = .text:0x00009470; // type:function size:0x4 +vt_0x80__11dAcEnBase_cFv = .text:0x00009480; // type:function size:0x4 +getObjectListEntry__11dAcEnBase_cFv = .text:0x00009490; // type:function size:0x8 __dt__11dAcEremly_cFv = .text:0x000094A0; // type:function size:0x168 build__27sFStateFct_c<11dAcEremly_c>FRC12sStateIDIf_c = .text:0x00009610; // type:function size:0x60 dispose__27sFStateFct_c<11dAcEremly_c>FRP10sStateIf_c = .text:0x00009670; // type:function size:0xC @@ -196,27 +196,63 @@ lbl_177_data_29C = .data:0x0000029C; // type:object size:0x5 data:string lbl_177_data_2A4 = .data:0x000002A4; // type:object size:0x64 jumptable_177_data_308 = .data:0x00000308; // type:object size:0x30 scope:local lbl_177_data_338 = .data:0x00000338; // type:object size:0xB data:string -lbl_177_data_344 = .data:0x00000344; // type:object size:0x8C -lbl_177_data_3D0 = .data:0x000003D0; // type:object size:0x30 -lbl_177_data_400 = .data:0x00000400; // type:object size:0x30 -lbl_177_data_430 = .data:0x00000430; // type:object size:0x18 -lbl_177_data_448 = .data:0x00000448; // type:object size:0x18 -lbl_177_data_460 = .data:0x00000460; // type:object size:0x18 -lbl_177_data_478 = .data:0x00000478; // type:object size:0xC -lbl_177_data_484 = .data:0x00000484; // type:object size:0x64C +__vt__11dAcEremly_c = .data:0x00000344; // type:object size:0x8C +__vt__50sFStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c> = .data:0x000003D0; // type:object size:0x30 +__vt__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000400; // type:object size:0x30 +__vt__27sFStateFct_c<11dAcEremly_c> = .data:0x00000430; // type:object size:0x18 +__vt__24sFState_c<11dAcEremly_c> = .data:0x00000448; // type:object size:0x18 +__vt__Q211dAcEremly_c10callback_c = .data:0x00000460; // type:object size:0x18 +__vt__14dWaterEffect_c = .data:0x00000478; // type:object size:0xC +__vt__15dShadowCircle_c = .data:0x00000484; // type:object size:0x64C lbl_177_data_AD0 = .data:0x00000AD0; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_177_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -lbl_177_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte -lbl_177_bss_58 = .bss:0x00000058; // type:object size:0x80 data:4byte -lbl_177_bss_D8 = .bss:0x000000D8; // type:object size:0x40 data:4byte -lbl_177_bss_118 = .bss:0x00000118; // type:object size:0x100 data:4byte -lbl_177_bss_218 = .bss:0x00000218; // type:object size:0x80 data:4byte -lbl_177_bss_298 = .bss:0x00000298; // type:object size:0x40 data:4byte -lbl_177_bss_2D8 = .bss:0x000002D8; // type:object size:0x140 data:4byte -lbl_177_bss_418 = .bss:0x00000418; // type:object size:0x80 data:4byte -lbl_177_bss_498 = .bss:0x00000498; // type:object size:0x80 data:4byte -lbl_177_bss_518 = .bss:0x00000518; // type:object size:0x40 data:4byte -lbl_177_bss_558 = .bss:0x00000558; // type:object size:0xB0 data:4byte +lbl_177_bss_8 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte +StateID_Wait__11dAcEremly_c = .bss:0x00000018; // type:object size:0x30 data:4byte +lbl_177_bss_48 = .bss:0x00000048; // type:object size:0xC scope:local data:4byte +StateID_Walk__11dAcEremly_c = .bss:0x00000058; // type:object size:0x30 data:4byte +lbl_177_bss_88 = .bss:0x00000088; // type:object size:0xC scope:local data:4byte +StateID_Run__11dAcEremly_c = .bss:0x00000098; // type:object size:0x30 data:4byte +lbl_177_bss_C8 = .bss:0x000000C8; // type:object size:0xC scope:local data:4byte +StateID_Escape__11dAcEremly_c = .bss:0x000000D8; // type:object size:0x30 data:4byte +lbl_177_bss_108 = .bss:0x00000108; // type:object size:0xC scope:local data:4byte +StateID_EscapeDash__11dAcEremly_c = .bss:0x00000118; // type:object size:0x30 data:4byte +lbl_177_bss_148 = .bss:0x00000148; // type:object size:0xC scope:local data:4byte +StateID_Wind__11dAcEremly_c = .bss:0x00000158; // type:object size:0x30 data:4byte +lbl_177_bss_188 = .bss:0x00000188; // type:object size:0xC scope:local data:4byte +StateID_Hold__11dAcEremly_c = .bss:0x00000198; // type:object size:0x30 data:4byte +lbl_177_bss_1C8 = .bss:0x000001C8; // type:object size:0xC scope:local data:4byte +StateID_Jump__11dAcEremly_c = .bss:0x000001D8; // type:object size:0x30 data:4byte +lbl_177_bss_208 = .bss:0x00000208; // type:object size:0xC scope:local data:4byte +StateID_Fly__11dAcEremly_c = .bss:0x00000218; // type:object size:0x30 data:4byte +lbl_177_bss_248 = .bss:0x00000248; // type:object size:0xC scope:local data:4byte +StateID_Damage__11dAcEremly_c = .bss:0x00000258; // type:object size:0x30 data:4byte +lbl_177_bss_288 = .bss:0x00000288; // type:object size:0xC scope:local data:4byte +StateID_Sleep__11dAcEremly_c = .bss:0x00000298; // type:object size:0x30 data:4byte +lbl_177_bss_2C8 = .bss:0x000002C8; // type:object size:0xC scope:local data:4byte +StateID_Scared__11dAcEremly_c = .bss:0x000002D8; // type:object size:0x30 data:4byte +lbl_177_bss_308 = .bss:0x00000308; // type:object size:0xC scope:local data:4byte +StateID_Stun__11dAcEremly_c = .bss:0x00000318; // type:object size:0x30 data:4byte +lbl_177_bss_348 = .bss:0x00000348; // type:object size:0xC scope:local data:4byte +StateID_Water__11dAcEremly_c = .bss:0x00000358; // type:object size:0x30 data:4byte +lbl_177_bss_388 = .bss:0x00000388; // type:object size:0xC scope:local data:4byte +StateID_Hear__11dAcEremly_c = .bss:0x00000398; // type:object size:0x30 data:4byte +lbl_177_bss_3C8 = .bss:0x000003C8; // type:object size:0xC scope:local data:4byte +StateID_NightSleepDemo__11dAcEremly_c = .bss:0x000003D8; // type:object size:0x30 data:4byte +lbl_177_bss_408 = .bss:0x00000408; // type:object size:0xC scope:local data:4byte +StateID_NightFoo__11dAcEremly_c = .bss:0x00000418; // type:object size:0x30 data:4byte +lbl_177_bss_448 = .bss:0x00000448; // type:object size:0xC scope:local data:4byte +StateID_NightReflectionFoo__11dAcEremly_c = .bss:0x00000458; // type:object size:0x30 data:4byte +lbl_177_bss_488 = .bss:0x00000488; // type:object size:0xC scope:local data:4byte +StateID_NightWait__11dAcEremly_c = .bss:0x00000498; // type:object size:0x30 data:4byte +lbl_177_bss_4C8 = .bss:0x000004C8; // type:object size:0xC scope:local data:4byte +StateID_NightWalk__11dAcEremly_c = .bss:0x000004D8; // type:object size:0x30 data:4byte +lbl_177_bss_508 = .bss:0x00000508; // type:object size:0xC scope:local data:4byte +StateID_NightRun__11dAcEremly_c = .bss:0x00000518; // type:object size:0x30 data:4byte +lbl_177_bss_548 = .bss:0x00000548; // type:object size:0xC scope:local data:4byte +StateID_NightRet__11dAcEremly_c = .bss:0x00000558; // type:object size:0x30 data:4byte +lbl_177_bss_588 = .bss:0x00000588; // type:object size:0xC scope:local data:4byte +StateID_NightJumpAttack__11dAcEremly_c = .bss:0x00000598; // type:object size:0x30 data:4byte +lbl_177_bss_5C8 = .bss:0x000005C8; // type:object size:0xC scope:local data:4byte +StateID_BirthWait__11dAcEremly_c = .bss:0x000005D8; // type:object size:0x30 data:4byte lbl_177_bss_608 = .bss:0x00000608; // type:object size:0x4 data:4byte lbl_177_bss_60C = .bss:0x0000060C; // type:object size:0x14 data:byte diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index c958e582..07fc5716 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -1,14 +1,72 @@ #ifndef D_A_E_REMLY_H #define D_A_E_REMLY_H +#include "common.h" +#include "d/a/d_a_base.h" #include "d/a/e/d_a_en_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_anmtexpat.h" +#include "m/m3d/m_mdl.h" +#include "m/m_angle.h" +#include "m/m_vec.h" #include "s/s_State.hpp" +#include "toBeSorted/d_d3d.h" +#include "toBeSorted/d_emitter.h" + +class dAcBomb_c; class dAcEremly_c : public dAcEnBase_c { +public: + class callback_c : public m3d::callback_c { + public: + virtual ~callback_c() {} + virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; + + private: + /* 0x04 */ mAng3_c mAng; + /* 0x0C */ UNKWORD field_0x0C; // Guess + }; + + enum State_e { + STATE_0 = 0, + STATE_1 = 1, + STATE_2 = 2, + STATE_3 = 3, + STATE_4 = 4, + STATE_5 = 5, + STATE_6 = 6, + STATE_7 = 7, + STATE_8 = 8, + STATE_9 = 9, + STATE_10 = 10, + STATE_11 = 11, + STATE_12 = 12, + STATE_13 = 13, + STATE_14 = 14, + STATE_15 = 15, + STATE_16 = 16, + STATE_17 = 17, + STATE_18 = 18, + STATE_19 = 19, + STATE_20 = 20, + + // + FAKE_STATE_30 = 30, + }; + public: dAcEremly_c() : mStateMgr(*this) {} virtual ~dAcEremly_c() {} + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcEremly_c, Wait); STATE_FUNC_DECLARE(dAcEremly_c, Walk); STATE_FUNC_DECLARE(dAcEremly_c, Run); @@ -34,8 +92,88 @@ public: STATE_FUNC_DECLARE(dAcEremly_c, NightJumpAttack); STATE_FUNC_DECLARE(dAcEremly_c, BirthWait); + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcEremly_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEremly_c); + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcEremly_c); + void fn_177_6A40(); + + // Checks if Batreaux is Human + bool fn_177_7330(); + + bool fn_177_75E0(); + + /** false -> comapres to camera + * true -> compares to player */ + bool fn_177_7650(bool comparePlayer); + + bool fn_177_7B10(); + + void fn_177_8520(bool); + bool fn_177_8980(f32); + bool fn_177_8AC0(); + +private: + /* 0x378 */ STATE_MGR_DECLARE(dAcEremly_c); + + /* 0x3B4 */ dShadowCircle_c mShadow; + /* 0x3BC */ d3d::AnmMdlWrapper mMdl; + /* 0x438 */ m3d::anmTexPat_c mTexPat; + + /* 0x458 */ dBgS_AcchCir mAcchCir; + /* 0x3B4 */ dBgS_ObjAcch mAcch; + /* 0x864 */ dCcD_Sph mSph; + + /* 0x9B4 */ callback_c mMdlCallback; + + /* 0x9C4 */ dEmitter_c mEmitters[2]; + + /* 0xA2C */ dAcRef_c mRef1; // Temporary until type known + /* 0xA38 */ dAcRef_c mNearbyBombRef; + + /* 0xA44 */ u8 _A44[0xA5C - 0xA44]; + + /* 0xA5C */ dWaterEffect_c mWaterEffect; + + /* 0xAA4 */ mVec3_c field_0xAA4; + + /* 0xAB0 */ u8 _AB0[0xAF8 - 0xAB0]; + + /* 0xAF8 */ mVec3_c field_0xAF8; + + /* 0xB04 */ u8 _B04[0xB10 - 0xB04]; + /* 0xB10 */ f32 field_0xB10; + /* 0xB14 */ u8 _B14[0xB1E - 0xB14]; + /* 0xB1E */ mAng3_c field_0xB1E; + /* 0xB24 */ s16 field_0xB24; + /* 0xB26 */ s16 field_0xB26; + /* 0xB28 */ u8 _B28[0xB38 - 0xB28]; + /* 0xB38 */ f32 field_0xB38; + /* 0xB3C */ f32 field_0xB3C; + /* 0xB40 */ f32 field_0xB40; + /* */ u8 _B44[0xB48 - 0xB44]; + /* 0xB48 */ u16 field_0xB48; + /* */ u8 _B4A[0xB4E - 0xB4A]; + /* 0xB4E */ u16 field_0xB4E; + /* */ u8 _B50[0xB52 - 0xB50]; + /* 0xB52 */ u16 field_0xB52; + /* 0xB54 */ u16 field_0xB54; + /* 0xB56 */ u16 field_0xB56; + /* 0xB58 */ u16 field_0xB58; + /* */ u8 _B56[0xB60 - 0xB5A]; + /* 0xB60 */ u8 field_0xB60; // Some State representation + /* 0xB61 */ u8 field_0xB61; + /* */ u8 _B62; + /* */ u8 _B63; + /* 0xB64 */ u8 field_0xB64; + /* */ u8 _B65; + /* 0xB66 */ u8 field_0xB66; + /* */ u8 _B67; + /* 0xB68 */ u8 field_0xB68; + /* 0xB69 */ u8 field_0xB69; + /* 0xB6A */ u8 field_0xB6A; + /* 0xB6B */ u8 field_0xB6B; + /* 0xB6C */ u8 field_0xB6C; }; #endif diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index 328992a1..48c9f920 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -5,6 +5,7 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_bomb.h" #include "d/d_cc.h" +#include "m/m3d/m_mdl.h" #include "m/m_angle.h" #include "m/m_vec.h" @@ -22,6 +23,7 @@ public: INTERACT_0x4 = (1 << 2), INTERACT_0x40 = (1 << 6), INTERACT_0x1000 = (1 << 12), + INTERACT_0x2000 = (1 << 13), }; public: @@ -71,8 +73,8 @@ public: int fn_8002fde0(cCcD_Obj &mCc, u16 *pTgOut); // Returns 0-3 based on collision - // 2 int fn_800301b0(const mVec3_c &pos, mAng ang, bool, f32); + void fn_80030400(m3d::mdl_c &, u8, bool, u8); void fn_800306d0(); void fn_80030700(); void fn_80030c20(u32 flags, f32, f32, f32, f32); diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index a360676f..4df6e4db 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -1,6 +1,8 @@ #ifndef D_A_PLAYER_ACT_H #define D_A_PLAYER_ACT_H +#include "d/a/d_a_base.h" +#include "d/a/obj/d_a_obj_bomb.h" #include "d/d_player_base.h" #include "m/m_vec.h" @@ -413,7 +415,7 @@ public: /* vt 0x2A8 */ virtual void lookTowardItem() {} /* vt 0x2AC */ virtual void vt_0x2AC() {} /* vt 0x2B0 */ virtual void vt_0x2B0() {} - /* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, const mVec3_c *, const mAng&, u32, u32) {} + /* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, const mVec3_c *, const mAng &, u32, u32) {} /* vt 0x2B8 */ virtual void setActorRef9() {} /* vt 0x2BC */ virtual void unlinkActorRef9() {} /* vt 0x2C0 */ virtual bool vt_0x2C0() { @@ -654,6 +656,9 @@ public: return sCurrentSword; } + // Checks through beetle actor references and + static dAcBomb_c *getBombWithinRadius(dAcBase_c *, const mVec3_c &, f32); + static bool isInEvent(); bool isAttackingLeft() const; bool isAttackingRight() const; diff --git a/include/toBeSorted/d_emitter.h b/include/toBeSorted/d_emitter.h index 8f68cd05..8b8ae66f 100644 --- a/include/toBeSorted/d_emitter.h +++ b/include/toBeSorted/d_emitter.h @@ -207,7 +207,7 @@ private: } public: - dWaterEffect_c() : mIsInWater(1), mIsSmall(false) {} + dWaterEffect_c() : mIsInWater(true), mIsSmall(false) {} virtual ~dWaterEffect_c() {} void init(dAcObjBase_c *, f32 height, f32 scale, f32 depth); diff --git a/src/REL/d/a/e/d_a_e_remly.cpp b/src/REL/d/a/e/d_a_e_remly.cpp index 85034734..36a5ed16 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -1,5 +1,29 @@ #include "d/a/e/d_a_e_remly.h" +#include "c/c_counter.h" +#include "c/c_math.h" +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_bomb.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_s.h" +#include "d/d_linkage.h" +#include "f/f_base.h" +#include "m/m3d/m_fanm.h" +#include "m/m3d/m_smdl.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "nw4r/g3d/res/g3d_resnode.h" +#include "s/s_Math.h" +#include "toBeSorted/attention.h" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/event_manager.h" + SPECIAL_ACTOR_PROFILE(E_REMLY, dAcEremly_c, fProfile::E_REMLY, 0xE1, 0, 3); STATE_DEFINE(dAcEremly_c, Wait); @@ -27,6 +51,311 @@ STATE_DEFINE(dAcEremly_c, NightRet); STATE_DEFINE(dAcEremly_c, NightJumpAttack); STATE_DEFINE(dAcEremly_c, BirthWait); +void dAcEremly_c::callback_c::timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) {} + +bool dAcEremly_c::createHeap() { + nw4r::g3d::ResFile res(getOarcResFile("Remly")); +} + +int dAcEremly_c::actorCreate() {} +int dAcEremly_c::actorPostCreate() {} + +int dAcEremly_c::doDelete() { + return SUCCEEDED; +} + +int dAcEremly_c::actorExecute() { + mHealth = 100; + nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl(); + + mStateMgr.executeState(); + if (mStateMgr.isState(StateID_BirthWait)) { + return SUCCEEDED; + } + + if (field_0xB60 == 32) { + mSpeed = 0.f; + + if (mMdl.getAnm().isStop()) { + mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f); + } + field_0xB60 = 0; + field_0xB66 = 1; + field_0xB48 = 48.f + cM::rndF(48.f); + field_0xB6A = 1; + mStateMgr.changeState(StateID_Wait); + } + + if (!isState(StateID_Hold)) { + mSph.OnCoSet(); + } + + if ((cCounter_c::GetGameFrame() & 0xF) == 0) { + dAcBomb_c *pBomb = dAcPy_c::getBombWithinRadius(this, mPosition, 600.f); + if (pBomb != nullptr) { + mNearbyBombRef.link(pBomb); + field_0xB6C = 1; + } else { + mNearbyBombRef.unlink(); + } + } + + if (isState(StateID_EscapeDash) || isState(StateID_Water) || isState(StateID_Scared)) { + if (fn_177_7650(false)) { + if (fn_177_7330()) { + deleteRequest(); + return SUCCEEDED; + } + mStateMgr.changeState(StateID_BirthWait); + } + } + + if (0 == sLib::calcTimer(&field_0xB4E)) { + s32 damageTypeMaybe = fn_8002fde0(mSph, nullptr); + switch (damageTypeMaybe) { + case 7: { + if (isState(StateID_Fly) && field_0xB60 != 20) { + if (field_0xB60 == 16) { + mMdl.setAnm("RemlyFlyDamage", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 17; + field_0xB4E = 48; + } + } else { + if (field_0xB60 == 6) { + mMdl.setAnm("RemlySwimDamage", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 8; + } else { + mSph.ClrAtSet(); + mStateMgr.changeState(StateID_Wind); + } + } + } break; + case 12: { + if (!isState(StateID_Fly) && field_0xB60 != 6 && field_0xB60 != 11) { + if (mSph.ChkCoHit() && mSph.ChkTgAtHitType(AT_TYPE_0x80000 | AT_TYPE_SLINGSHOT)) { + mAngle.y = getXZAngleToPlayer(); + mSpeed = -15.f; + mStateMgr.changeState(StateID_Stun); + break; + } + } + } + // fallthrough + default: { + if (damageTypeMaybe != 0) { + field_0xB52 = 8; + field_0xB4E = 8; + dJEffManager_c::spawnHitMarkEffect(6, mSph, nullptr, true); + + if (isState(StateID_Fly) && field_0xB60 != 20) { + if (field_0xB60 == 16) { + mMdl.setAnm("RemlyFlyDamage", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 17; + } + } else if (field_0xB60 == 6 || field_0xB60 == 8) { + mMdl.setAnm("RemlySwimDamage", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 8; + } else { + if (field_0xB64 != 0) { + field_0xB64--; + if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BOMB | AT_TYPE_ARROW)) { + field_0xB64 = 0; + } + } + field_0xB6A = 0; + mSph.ClrAtSet(); + + field_0xB68 = 1; + field_0xB6B = 0; + + if (isState(StateID_Scared)) { + field_0xB6B = 1; + } + + mStateMgr.changeState(StateID_Damage); + } + } + } break; + } + } + + if (!isState(StateID_Hold)) { + field_0xAA4 = mPosition; + calcVelocity(); + mPosition += mVelocity; + mPosition += mStts.GetCcMove(); + mPosition += field_0xAF8; + field_0xAF8 *= 0.7f; + } + + if (fn_177_7330()) { + if (field_0xB64 == 0 || fn_177_8AC0()) { + if (field_0xB40 != 1.0f) { + field_0xB54 = 7; + field_0xB40 = 1.f; + } + } else { + if (field_0xB40 != 1.3f) { + field_0xB54 = 7; + field_0xB40 = 1.3f; + } + } + + if (0 != sLib::calcTimer(&field_0xB54)) { + sLib::addCalcScaledDiff(&field_0xB10, field_0xB40, 1.f, 0.05f); + } + } + + mScale.set(field_0xB10, field_0xB10, field_0xB10); + + mMdl.getModel().setScale(mScale); + mMdl.play(); + if (!isState(StateID_Hold)) { + mAcch.CrrPos(*dBgS::GetInstance()); + mWaterEffect.execute(mAcch.GetWtrGroundH(), mAcch.GetGroundH()); + } else { + mLinkage.bushTpFunc(mAcch); + } + + if (!isState(StateID_Hold) && !isState(StateID_NightSleepDemo) && !isState(StateID_Damage) && + !isState(StateID_Fly) && !isState(StateID_Jump)) { + sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800); + } + + if (!isState(StateID_Fly) && !isState(StateID_Hold) && !isState(StateID_BirthWait) && !isState(StateID_Water)) { + if (!mAcch.ChkGndHit()) { + if (fn_177_8980(100.f) && field_0xB58 == 0) { + field_0xB58 = 1; + } + if (field_0xB58 != 0) { + if (field_0xB61 == 1 && !fn_177_75E0() && EventManager::isInEvent()) { + setActorProperty(AC_PROP_0x1); + mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z); + mRotation.y = mStartingRot.y; + mAngle.y = mStartingRot.y; + mStateMgr.changeState(StateID_Sleep); + } + field_0xB58++; + // Why cast? + if ((s32)field_0xB58 > 30) { + mStateMgr.changeState(StateID_Fly); + } + } + + field_0xB38 = mPosition.y; + } else { + sLib::chase(&field_0xB38, mPosition.y, 10.f); + fn_177_8520(false); + + if (field_0xB24 != 0 || field_0xB26 != 0) { + field_0xB38 = mPosition.y; + } + field_0xB58 = 0; + } + } else { + field_0xB26 = 0; + field_0xB24 = 0; + field_0xB38 = mPosition.y + field_0xB3C; + } + + if (!fn_177_7B10() && isState(StateID_Water)) { + field_0xB6B = 1; + } + + sLib::addCalcAngle(field_0xB1E.x.ref(), field_0xB24, 2, 0x1000); + sLib::addCalcAngle(field_0xB1E.z.ref(), field_0xB26, 2, 0x1000); + + mWorldMtx.transS(mPosition.x, field_0xB38, mPosition.z); + + mWorldMtx.XrotM(field_0xB1E.x); + mWorldMtx.ZrotM(field_0xB1E.z); + mWorldMtx.ZXYrotM(mRotation); + + mMdl.getModel().setLocalMtx(mWorldMtx); + mMdl.getModel().calc(false); + fn_177_6A40(); + + f32 radius = 40.f + mAng(0); + mVec3_c center; + + center.x = mPosition.x; + center.y = mPosition.y; + center.z = mPosition.z; + + center.y += (30.f + mAng(0)); + + mSph.SetC(center); + if (isState(StateID_Fly)) { + mMtx_c m; + mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone3").GetID(), m); + m.getTranslation(center); + mSph.SetC(center); + } + mSph.SetR(radius * field_0xB10); + + dCcS::GetInstance()->Set(&mSph); + + if (!(fn_177_7330() && field_0xB64) // Check Batreaux Human + && !(isState(StateID_Hold) || field_0xB60 == 6) // Hold + && !isState(StateID_Stun) && !isState(StateID_Jump)) { + AttentionManager::GetInstance()->addPickUpTarget(*this, 3.f * radius * field_0xB10); + if (mLinkage.checkConnection(dLinkage_c::CONNECTION_1)) { + mStateMgr.changeState(StateID_Hold); + } + } + + if (field_0xB60 == 7) { + mMtx_c m; + mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone3").GetID(), m); + m.getTranslation(center); + + mEmitters[1].holdEffect(PARTICLE_RESOURCE_ID_MAPPING_859_, center, nullptr, nullptr, nullptr, nullptr); + } + + mPositionCopy2 = mPosition; + mPositionCopy2.y += 30.f; + + mPositionCopy3 = mPositionCopy2; + mPositionCopy3.y += 50.f; + + if (isState(StateID_Fly)) { + mPositionCopy3.y += 50.f; + } + + if (!isState(StateID_Hold)) { + if (!fn_177_7330()) { + setInteractionFlags(INTERACT_0x2000); + } + fn_80030c20(3, 600.f, radius, -400.f, 400.f); + } + + sLib::calcTimer(&field_0xB52); + fn_80030400(mMdl.getModel(), 100, false, field_0xB52); + return SUCCEEDED; +} + +int dAcEremly_c::draw() { + if (mStateMgr.isState(StateID_BirthWait)) { + return SUCCEEDED; + } + + if (mStateMgr.isState(StateID_Fly)) { + if (EventManager::isInEvent()) { + if (EventManager::isCurrentEvent("RescuePlayer") || EventManager::isCurrentEvent("RescuePlayerToUpward")) { + return SUCCEEDED; + } + } + } + + m3d::smdl_c &mdl = mMdl.getModel(); + drawModelType1(&mdl); + + static mQuat_c shadow = mQuat_c(mVec3_c(0, 70.f + mAng(0), 0), 290.f + mAng(0)); + fn_8002edb0(mShadow, mdl, &shadow, -1, -1, mPosition.y - mAcch.GetGroundH()); + + return SUCCEEDED; +} + void dAcEremly_c::initializeState_Wait() {} void dAcEremly_c::executeState_Wait() {} void dAcEremly_c::finalizeState_Wait() {}