From c743b47d7ea25bee800ee76b681dd5564bb38bc3 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 8 Mar 2026 16:21:54 -0400 Subject: [PATCH 01/16] 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() {} From 413682ed6f9a004893916af850fc13fd21c46703 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 8 Mar 2026 21:32:32 -0400 Subject: [PATCH 02/16] actorCreate 99% --- include/d/a/e/d_a_e_remly.h | 22 +++-- src/REL/d/a/e/d_a_e_remly.cpp | 166 +++++++++++++++++++++++++++++++++- 2 files changed, 176 insertions(+), 12 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 07fc5716..64397db2 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -16,7 +16,7 @@ #include "toBeSorted/d_emitter.h" class dAcBomb_c; - +class dAcNpcSkn2_c; class dAcEremly_c : public dAcEnBase_c { public: class callback_c : public m3d::callback_c { @@ -24,7 +24,6 @@ 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 }; @@ -51,9 +50,6 @@ public: STATE_18 = 18, STATE_19 = 19, STATE_20 = 20, - - // - FAKE_STATE_30 = 30, }; public: @@ -107,6 +103,11 @@ private: * true -> compares to player */ bool fn_177_7650(bool comparePlayer); + // Set Scary Face + void fn_177_78D0(); + + bool fn_177_79D0(bool); + bool fn_177_7B10(); void fn_177_8520(bool); @@ -128,10 +129,11 @@ private: /* 0x9C4 */ dEmitter_c mEmitters[2]; - /* 0xA2C */ dAcRef_c mRef1; // Temporary until type known + /* 0xA2C */ dAcRef_c mRef1; // Temporary until type known /* 0xA38 */ dAcRef_c mNearbyBombRef; - /* 0xA44 */ u8 _A44[0xA5C - 0xA44]; + /* 0xA44 */ mVec3_c field_0xA44; + /* 0xA50 */ mVec3_c field_0xA50; /* 0xA5C */ dWaterEffect_c mWaterEffect; @@ -141,7 +143,9 @@ private: /* 0xAF8 */ mVec3_c field_0xAF8; - /* 0xB04 */ u8 _B04[0xB10 - 0xB04]; + /* 0xB04 */ f32 field_0xB04; + /* 0xB08 */ f32 field_0xB08; + /* 0xB0C */ f32 field_0xB0C; /* 0xB10 */ f32 field_0xB10; /* 0xB14 */ u8 _B14[0xB1E - 0xB14]; /* 0xB1E */ mAng3_c field_0xB1E; @@ -163,7 +167,7 @@ private: /* */ u8 _B56[0xB60 - 0xB5A]; /* 0xB60 */ u8 field_0xB60; // Some State representation /* 0xB61 */ u8 field_0xB61; - /* */ u8 _B62; + /* 0xB62 */ u8 mSleepDemoPlayedSceneflag; /* */ u8 _B63; /* 0xB64 */ u8 field_0xB64; /* */ u8 _B65; 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 36a5ed16..4538ae90 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -1,16 +1,23 @@ #include "d/a/e/d_a_e_remly.h" #include "c/c_counter.h" +#include "c/c_lib.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/npc/d_a_npc_shinkan2.h" +#include "d/a/obj/d_a_obj_base.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 "d/d_sc_game.h" +#include "d/flag/sceneflag_manager.h" #include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" #include "m/m3d/m_fanm.h" #include "m/m3d/m_smdl.h" #include "m/m_mtx.h" @@ -26,6 +33,29 @@ SPECIAL_ACTOR_PROFILE(E_REMLY, dAcEremly_c, fProfile::E_REMLY, 0xE1, 0, 3); +static dCcD_SrcSph sSphSrc = { + {{ + AT_TYPE_DAMAGE, + 0xD, + {0, 0, 0}, + 2, + 0, + 0, + 0, + 0, + }, { + ~AT_TYPE_COMMON0, + 0x303, + {0, 0, 0x407}, + 8, + 0, + }, { + 0x28, + }}, + { + 50.f, }, +}; + STATE_DEFINE(dAcEremly_c, Wait); STATE_DEFINE(dAcEremly_c, Walk); STATE_DEFINE(dAcEremly_c, Run); @@ -51,14 +81,144 @@ 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) {} +void dAcEremly_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl) {} bool dAcEremly_c::createHeap() { nw4r::g3d::ResFile res(getOarcResFile("Remly")); } -int dAcEremly_c::actorCreate() {} -int dAcEremly_c::actorPostCreate() {} +int dAcEremly_c::actorCreate() { + CREATE_ALLOCATOR(dAcEremly_c); + + u8 p = getFromParams(0, 0xF); + field_0xB61 = p != 15 ? p : 0; + mSleepDemoPlayedSceneflag = getFromParams(4, 0xFF); + + s32 f = getFromParams(12, 0xFF); + field_0xB08 = f != 0xFF ? f * 100.f : 1000.f; + + mAcch.Set(this, 1, &mAcchCir); + + mBoundingBox.Set(mVec3_c(-150.f, -700.f, -150.f), mVec3_c(150.f, 150.f, 150.f)); + + mAcceleration = -3.f; + mMaxSpeed = -60.f; + mScale.set(1.f, 1.f, 1.f); + + field_0xB10 = 1.f; + field_0xB1E.clear(); + mStts.SetRank(5); + mSph.Set(sSphSrc); + mSph.SetStts(mStts); + + mMdlCallback.mAng.clear(); + + mMdl.getModel().setScale(mScale); + mMdl.play(); + + updateMatrix(); + mMdl.getModel().setLocalMtx(mWorldMtx); + mMdl.getModel().calc(false); + + mSph.ClrAtSet(); + mLinkage.set(0, 0.f, 0.f, 0.f, nullptr); + + mStartingPos.set(mPosition.x, mPosition.y, mPosition.z); + field_0xA44.set(mPosition.x, mPosition.y, mPosition.z); + field_0xB38 = mPosition.y; + mStartingRot = mRotation; + + mRef1.unlink(); + mNearbyBombRef.unlink(); + + field_0xB64 = 1; + mSph.ClrAtSet(); // Duplicated clear + + mEmitters[0].init(this); + mEmitters[1].init(this); + + mWaterEffect.init(this, 100.f, mScale.x * 0.7f, 0.f); + mWaterEffect.setIsSmall(true); + + field_0xA50.x = mPosition.x; + field_0xA50.y = mPosition.y; + field_0xA50.z = mPosition.z; + mAcchCir.SetWall(field_0xB10 * 10.f, field_0xB10 * 60.f); + + mAcch.SetField_0xD4(100.f + mAng(0)); + field_0xB04 = 60.f; + + if (field_0xB61 == 0) { + mAcch.SetGndThinCellingOff(); + if (dScGame_c::currentSpawnInfo.isNight()) { + mTargetFiTextID = 1; + } else { + mTargetFiTextID = 0; + } + + if (!fn_177_7330()) { + setBattleBgmRelated(0); + mStateMgr.changeState(StateID_Sleep); + mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 0.f); + mAcchCir.SetWall(30.f, 50.f); + return SUCCEEDED; + } + + mScale.set(1.3f, 1.3f, 1.3f); + + field_0xB10 = 1.3f; + field_0xB40 = 1.3f; + + field_0xB64 = 2; + + (void)mMdl.getModel().getResMdl(); + fn_177_78D0(); + + field_0xB48 = 24.f + cM::rndF(24.f); + if (mSleepDemoPlayedSceneflag == 0xFF || + SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSleepDemoPlayedSceneflag)) { + mStateMgr.changeState(StateID_NightWait); + } else { + mStateMgr.changeState(StateID_NightSleepDemo); + } + } else if (field_0xB61 == 1) { + setBattleBgmRelated(0); + mStateMgr.changeState(StateID_Sleep); + } else { + mStateMgr.changeState(StateID_Run); + } + return SUCCEEDED; +} + +int dAcEremly_c::actorPostCreate() { + if (field_0xB61 == 1) { + fBase_c *pActor = fManager_c::searchBaseByProfName(fProfile::NPC_SKN2); + if (pActor != nullptr) { + dAcNpcSkn2_c *pSkn2 = static_cast(pActor); + mRef1.link(pSkn2); + + mAcch.ClrRoofNone(); + if (fn_177_75E0()) { + fn_177_79D0(false); + + mRotation.y = mAngle.y = cLib::targetAngleY(mPosition, mStartingPos); + + updateMatrix(); + mMdl.getModel().setLocalMtx(mWorldMtx); + mMdl.getModel().calc(false); + mStateMgr.changeState(StateID_Wait); + return SUCCEEDED; + } + + mStateMgr.changeState(StateID_Sleep); + return SUCCEEDED; + } + + mRef1.unlink(); + field_0xB61 = 0; + } + return SUCCEEDED; +} int dAcEremly_c::doDelete() { return SUCCEEDED; From 19ccd68a75ae7f9a2926d7c16402ee0844d5af8f Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 8 Mar 2026 22:05:58 -0400 Subject: [PATCH 03/16] timingB and createHeap 100% --- include/d/a/e/d_a_en_base.h | 3 +++ include/m/m3d/m_anmmdl.h | 7 +++++++ src/REL/d/a/e/d_a_e_remly.cpp | 27 +++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index 48c9f920..81ef2761 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -77,6 +77,9 @@ public: void fn_80030400(m3d::mdl_c &, u8, bool, u8); void fn_800306d0(); void fn_80030700(); + + static void fn_80030980(m3d::mdl_c &, s32, bool markDirty); + void fn_80030c20(u32 flags, f32, f32, f32, f32); s32 someEnemyDamageCollisionStuffMaybe(dColliderLinkedList &list, u16 *pOutFlags); diff --git a/include/m/m3d/m_anmmdl.h b/include/m/m3d/m_anmmdl.h index cb8ec945..29cf6e2e 100644 --- a/include/m/m3d/m_anmmdl.h +++ b/include/m/m3d/m_anmmdl.h @@ -60,6 +60,13 @@ public: void setAnmFile(void *data) { mAnmFile = nw4r::g3d::ResFile(data); } + nw4r::g3d::ResFile getAnmFile() { + return mAnmFile; + } + + nw4r::g3d::ResFile getMdlFile() { + return mMdlFile; + } protected: nw4r::g3d::ResFile mMdlFile; 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 4538ae90..7ad1addd 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -23,6 +23,7 @@ #include "m/m_mtx.h" #include "m/m_quat.h" #include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resanmtexpat.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resnode.h" @@ -81,10 +82,32 @@ STATE_DEFINE(dAcEremly_c, NightRet); STATE_DEFINE(dAcEremly_c, NightJumpAttack); STATE_DEFINE(dAcEremly_c, BirthWait); -void dAcEremly_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl) {} +void dAcEremly_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl resMdl) { + static u32 headNode = resMdl.GetResNode("head").GetID(); + + if (nodeId == headNode) { + mMtx_c m; + result->GetMtx(m); + m.ZXYrotM(mAng); + result->SetMtx(m); + } +} bool dAcEremly_c::createHeap() { - nw4r::g3d::ResFile res(getOarcResFile("Remly")); + TRY_CREATE(mMdl.create(*this, getOarcResFile("Remly"), "Remly", "RemlyWalk", 0x133)); + fn_80030980(mMdl.getModel(), 1, false); + + mMdl.getModel().setCallback(&mMdlCallback); + + nw4r::g3d::ResFile res = mMdl.getMdlFile(); + nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl(); + nw4r::g3d::ResAnmTexPat resTexPat = res.GetResAnmTexPat("RemlyWink"); + + bool result; + TRY_CREATE2(mTexPat.create(resMdl, resTexPat, &mAllocator, nullptr, 1)); + mMdl.getModel().setAnm(mTexPat); + + return true; } int dAcEremly_c::actorCreate() { From 28df560cc5b30cdbbc7f5d637c3a71de9e015166 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 1 Apr 2026 20:47:48 -0400 Subject: [PATCH 04/16] dAcEremly_c::StateWait --- include/d/a/e/d_a_e_remly.h | 19 ++++- src/REL/d/a/e/d_a_e_remly.cpp | 140 +++++++++++++++++++++++++++++++++- 2 files changed, 153 insertions(+), 6 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 64397db2..7419f7ea 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -93,10 +93,14 @@ public: private: void fn_177_6A40(); + bool fn_177_6B10(bool, mAng); + void fn_177_6EA0(bool); // Checks if Batreaux is Human bool fn_177_7330(); + bool fn_177_73C0(); + bool fn_177_75E0(); /** false -> comapres to camera @@ -111,8 +115,11 @@ private: bool fn_177_7B10(); void fn_177_8520(bool); + bool fn_177_86C0(); bool fn_177_8980(f32); bool fn_177_8AC0(); + bool fn_177_8C20(mAng); + bool fn_177_8F90(); private: /* 0x378 */ STATE_MGR_DECLARE(dAcEremly_c); @@ -147,7 +154,8 @@ private: /* 0xB08 */ f32 field_0xB08; /* 0xB0C */ f32 field_0xB0C; /* 0xB10 */ f32 field_0xB10; - /* 0xB14 */ u8 _B14[0xB1E - 0xB14]; + /* 0xB14 */ u32 field_0xB14; + /* 0xB18 */ u8 _B14[0xB1E - 0xB18]; /* 0xB1E */ mAng3_c field_0xB1E; /* 0xB24 */ s16 field_0xB24; /* 0xB26 */ s16 field_0xB26; @@ -155,11 +163,12 @@ private: /* 0xB38 */ f32 field_0xB38; /* 0xB3C */ f32 field_0xB3C; /* 0xB40 */ f32 field_0xB40; - /* */ u8 _B44[0xB48 - 0xB44]; + /* 0xB44 */ u16 field_0xB44; + /* 0xB46 */ u16 field_0xB46; /* 0xB48 */ u16 field_0xB48; /* */ u8 _B4A[0xB4E - 0xB4A]; /* 0xB4E */ u16 field_0xB4E; - /* */ u8 _B50[0xB52 - 0xB50]; + /* 0xB50 */ u16 field_0xB50; /* 0xB52 */ u16 field_0xB52; /* 0xB54 */ u16 field_0xB54; /* 0xB56 */ u16 field_0xB56; @@ -172,12 +181,14 @@ private: /* 0xB64 */ u8 field_0xB64; /* */ u8 _B65; /* 0xB66 */ u8 field_0xB66; - /* */ u8 _B67; + /* 0xB67 */ u8 field_0xB67; /* 0xB68 */ u8 field_0xB68; /* 0xB69 */ u8 field_0xB69; /* 0xB6A */ u8 field_0xB6A; /* 0xB6B */ u8 field_0xB6B; /* 0xB6C */ u8 field_0xB6C; + /* 0xB6D */ u8 field_0xB6D; + /* 0xB6E */ u8 field_0xB6E; }; #endif 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 7ad1addd..93b6133f 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -539,9 +539,125 @@ int dAcEremly_c::draw() { return SUCCEEDED; } -void dAcEremly_c::initializeState_Wait() {} -void dAcEremly_c::executeState_Wait() {} +void dAcEremly_c::initializeState_Wait() { + field_0xB14 = 0; + mAcceleration = -3.f; + + fn_177_8520(true); + + if (field_0xB66 || field_0xB6A) { + mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 0; + + field_0xB48 = cM::rndF(48.f) + 48.f; + } else { + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 1; + + field_0xB44 = cM::rndF(128.f) + 128.f; + } +} +void dAcEremly_c::executeState_Wait() { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + if (field_0xB6A == 0) { + fn_177_6EA0(false); + } + sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); + + if (fn_177_7330()) { + mStateMgr.changeState(StateID_EscapeDash); + return; + } + + if (fn_177_86C0()) { + return; + } + + if (field_0xB60 == 2) { + if (mMdl.getAnm().isStop()) { + mMdl.setAnm("RemlytWaitSit", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 1; + } + return; + } + + if (fn_177_73C0()) { + if (field_0xB6E == 0) { + if (fn_800301b0(mPositionCopy2, mRotation.y + 0x8000, true, 140.f) != 0 /* TODO: Enum?*/) { + field_0xB6E = 1; + } else if (isWithinPlayerRadius(600.f) || mNearbyBombRef.isLinked()) { + mStateMgr.changeState(StateID_Escape); + field_0xB6A = 1; + } else { + fn_177_6B10(false, 0); + field_0xB48 = 48.f + cM::rndF(48.f); + field_0xB44 = 0x80; + if (isWithinPlayerRadius(250.f)) { + mStateMgr.changeState(StateID_Scared); + } + } + } else if (fn_177_6B10(0, 0)) { + mStateMgr.changeState(StateID_Escape); + field_0xB6A = 1; + field_0xB48 = 20; + field_0xB44 = 128; + } else if (isWithinPlayerRadius(250.f)) { + mStateMgr.changeState(StateID_Scared); + } + return; + } + + field_0xB6E = 0; + fn_177_6B10(0, 0); + if (field_0xB56 != 0 || fn_177_8F90()) { + return; + } + + if (0 == sLib::calcTimer(&field_0xB48) && field_0xB66 != 0) { + field_0xB66 = 0; + field_0xB6A = 0; + field_0xB6E = 0; + field_0xB44 = 128.f + cM::rndF(128.f); + + mStateMgr.changeState(StateID_Wait); + return; + } + + if (field_0xB61 == 1) { + return; + } + if (sLib::calcTimer(&field_0xB44)) { + return; + } + + // Maybe Inline + bool coPlayer = false; + if (mSph.ChkCoHit()) { + coPlayer = true; + if (mSph.GetCoActor()->isActorPlayer()) { + coPlayer = false; + } + } + + if (field_0xB50 == 0 && !coPlayer && !fn_177_8C20(getXZAngleToPlayer())) { + mAng a = (pPlayer->mRotation.y + 0x8000); + if (mAng::abs(getXZAngleToPlayer() - a) > 0x2000) { + field_0xB69 = 1; + field_0xB67 = 0; + + mStateMgr.changeState(StateID_Walk); + return; + } + } + + if (field_0xB60 == 1) { + mMdl.setAnm("RemlytWaitSitCry", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 2; + } + field_0xB44 = 128.f + cM::rndF(128.f); +} void dAcEremly_c::finalizeState_Wait() {} + void dAcEremly_c::initializeState_Walk() {} void dAcEremly_c::executeState_Walk() {} void dAcEremly_c::finalizeState_Walk() {} @@ -611,3 +727,23 @@ void dAcEremly_c::finalizeState_NightJumpAttack() {} void dAcEremly_c::initializeState_BirthWait() {} void dAcEremly_c::executeState_BirthWait() {} void dAcEremly_c::finalizeState_BirthWait() {} + +bool dAcEremly_c::fn_177_73C0() { + if (isState(StateID_Sleep) || fn_177_7330() || field_0xB68) { + return false; + } + + dAcPy_c *pPlayer = dAcPy_c::GetLinkM(); + if (pPlayer->isUsingSword() || pPlayer->checkActionFlagsCont(0x2) || pPlayer->checkActionFlagsCont(0x80) || + pPlayer->isCarryingBomb() || pPlayer->isUsingWhip() || pPlayer->checkActionFlagsCont(0x4) || + pPlayer->checkActionFlagsCont(0x100) || pPlayer->checkActionFlagsCont(0x10)) { + return true; + } + + if (mNearbyBombRef.isLinked()) { + return true; + } + + field_0xB6C = 0; + return false; +} From df28d80c29368ea124f2ad2072359821df0ff8e9 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Thu, 2 Apr 2026 08:43:29 -0400 Subject: [PATCH 05/16] dAcEremly_c::StateWalk --- include/d/a/e/d_a_e_remly.h | 10 ++- src/REL/d/a/e/d_a_e_remly.cpp | 149 ++++++++++++++++++++++++++++------ 2 files changed, 134 insertions(+), 25 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 7419f7ea..0f0deea2 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -90,11 +90,15 @@ public: STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcEremly_c); STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEremly_c); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEremly_c); private: void fn_177_6A40(); bool fn_177_6B10(bool, mAng); void fn_177_6EA0(bool); + void fn_177_6FC0(bool); + + bool fn_177_7040(s32, f32); // Checks if Batreaux is Human bool fn_177_7330(); @@ -107,6 +111,8 @@ private: * true -> compares to player */ bool fn_177_7650(bool comparePlayer); + void fn_177_77C0(); + // Set Scary Face void fn_177_78D0(); @@ -159,7 +165,9 @@ private: /* 0xB1E */ mAng3_c field_0xB1E; /* 0xB24 */ s16 field_0xB24; /* 0xB26 */ s16 field_0xB26; - /* 0xB28 */ u8 _B28[0xB38 - 0xB28]; + /* 0xB28 */ u8 _B28[0xB32 - 0xB28]; + /* 0xB32 */ mAng field_0xB32; + /* 0xB34 */ mAng field_0xB34; /* 0xB38 */ f32 field_0xB38; /* 0xB3C */ f32 field_0xB3C; /* 0xB40 */ f32 field_0xB40; 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 93b6133f..72a7d55a 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -181,7 +181,7 @@ int dAcEremly_c::actorCreate() { if (!fn_177_7330()) { setBattleBgmRelated(0); - mStateMgr.changeState(StateID_Sleep); + changeState(StateID_Sleep); mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 0.f); mAcchCir.SetWall(30.f, 50.f); return SUCCEEDED; @@ -200,15 +200,15 @@ int dAcEremly_c::actorCreate() { field_0xB48 = 24.f + cM::rndF(24.f); if (mSleepDemoPlayedSceneflag == 0xFF || SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSleepDemoPlayedSceneflag)) { - mStateMgr.changeState(StateID_NightWait); + changeState(StateID_NightWait); } else { - mStateMgr.changeState(StateID_NightSleepDemo); + changeState(StateID_NightSleepDemo); } } else if (field_0xB61 == 1) { setBattleBgmRelated(0); - mStateMgr.changeState(StateID_Sleep); + changeState(StateID_Sleep); } else { - mStateMgr.changeState(StateID_Run); + changeState(StateID_Run); } return SUCCEEDED; } @@ -229,11 +229,11 @@ int dAcEremly_c::actorPostCreate() { updateMatrix(); mMdl.getModel().setLocalMtx(mWorldMtx); mMdl.getModel().calc(false); - mStateMgr.changeState(StateID_Wait); + changeState(StateID_Wait); return SUCCEEDED; } - mStateMgr.changeState(StateID_Sleep); + changeState(StateID_Sleep); return SUCCEEDED; } @@ -266,7 +266,7 @@ int dAcEremly_c::actorExecute() { field_0xB66 = 1; field_0xB48 = 48.f + cM::rndF(48.f); field_0xB6A = 1; - mStateMgr.changeState(StateID_Wait); + changeState(StateID_Wait); } if (!isState(StateID_Hold)) { @@ -289,7 +289,7 @@ int dAcEremly_c::actorExecute() { deleteRequest(); return SUCCEEDED; } - mStateMgr.changeState(StateID_BirthWait); + changeState(StateID_BirthWait); } } @@ -309,7 +309,7 @@ int dAcEremly_c::actorExecute() { field_0xB60 = 8; } else { mSph.ClrAtSet(); - mStateMgr.changeState(StateID_Wind); + changeState(StateID_Wind); } } } break; @@ -318,7 +318,7 @@ int dAcEremly_c::actorExecute() { if (mSph.ChkCoHit() && mSph.ChkTgAtHitType(AT_TYPE_0x80000 | AT_TYPE_SLINGSHOT)) { mAngle.y = getXZAngleToPlayer(); mSpeed = -15.f; - mStateMgr.changeState(StateID_Stun); + changeState(StateID_Stun); break; } } @@ -355,7 +355,7 @@ int dAcEremly_c::actorExecute() { field_0xB6B = 1; } - mStateMgr.changeState(StateID_Damage); + changeState(StateID_Damage); } } } break; @@ -416,12 +416,12 @@ int dAcEremly_c::actorExecute() { mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z); mRotation.y = mStartingRot.y; mAngle.y = mStartingRot.y; - mStateMgr.changeState(StateID_Sleep); + changeState(StateID_Sleep); } field_0xB58++; // Why cast? if ((s32)field_0xB58 > 30) { - mStateMgr.changeState(StateID_Fly); + changeState(StateID_Fly); } } @@ -483,7 +483,7 @@ int dAcEremly_c::actorExecute() { && !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); + changeState(StateID_Hold); } } @@ -565,7 +565,7 @@ void dAcEremly_c::executeState_Wait() { sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); if (fn_177_7330()) { - mStateMgr.changeState(StateID_EscapeDash); + changeState(StateID_EscapeDash); return; } @@ -586,23 +586,23 @@ void dAcEremly_c::executeState_Wait() { if (fn_800301b0(mPositionCopy2, mRotation.y + 0x8000, true, 140.f) != 0 /* TODO: Enum?*/) { field_0xB6E = 1; } else if (isWithinPlayerRadius(600.f) || mNearbyBombRef.isLinked()) { - mStateMgr.changeState(StateID_Escape); + changeState(StateID_Escape); field_0xB6A = 1; } else { fn_177_6B10(false, 0); field_0xB48 = 48.f + cM::rndF(48.f); field_0xB44 = 0x80; if (isWithinPlayerRadius(250.f)) { - mStateMgr.changeState(StateID_Scared); + changeState(StateID_Scared); } } } else if (fn_177_6B10(0, 0)) { - mStateMgr.changeState(StateID_Escape); + changeState(StateID_Escape); field_0xB6A = 1; field_0xB48 = 20; field_0xB44 = 128; } else if (isWithinPlayerRadius(250.f)) { - mStateMgr.changeState(StateID_Scared); + changeState(StateID_Scared); } return; } @@ -619,7 +619,7 @@ void dAcEremly_c::executeState_Wait() { field_0xB6E = 0; field_0xB44 = 128.f + cM::rndF(128.f); - mStateMgr.changeState(StateID_Wait); + changeState(StateID_Wait); return; } @@ -645,7 +645,7 @@ void dAcEremly_c::executeState_Wait() { field_0xB69 = 1; field_0xB67 = 0; - mStateMgr.changeState(StateID_Walk); + changeState(StateID_Walk); return; } } @@ -658,9 +658,110 @@ void dAcEremly_c::executeState_Wait() { } void dAcEremly_c::finalizeState_Wait() {} -void dAcEremly_c::initializeState_Walk() {} -void dAcEremly_c::executeState_Walk() {} +void dAcEremly_c::initializeState_Walk() { + if (field_0xB67 != 0 && field_0xB6A == 0) { + mMdl.setAnm("RemlyCryWalk", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 3; + } else { + mMdl.setAnm("RemlyWalk", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 4; + } + + field_0xB32 = 0; + field_0xB34 = 0; + + if (field_0xB69 != 0) { + fn_177_77C0(); + } + field_0xB14 = 0; + field_0xB66 = 1; +} +void dAcEremly_c::executeState_Walk() { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + + fn_177_6FC0(true); + + if (fn_177_86C0()) { + return; + } + + if (!field_0xB6A && mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x4000 && fn_177_73C0() && field_0xB6E == 0) { + changeState(StateID_Escape); + field_0xB6A = 1; + return; + } + + if (field_0xB69 != 0) { + mMtx_c m; + m.YrotS(field_0xB32); + mVec3_c in(0.f, 0.f, 180.f), out; + m.multVec(in, out); + out += mPosition; + field_0xA44.set(out); + + if (fn_177_7040(2, 0.8f)) { + field_0xB32 += field_0xB34; + } + bool b0 = false; + if (mSph.ChkCoHit()) { + b0 = true; + if (mSph.GetCoActor()->isActorPlayer()) { + mAng a = (pPlayer->mRotation.y + 0x8000); + if (mAng::abs(getXZAngleToPlayer() - a) > mAng(1024.f + cM::rndF(1024.f))) { + b0 = false; + } + } + } + + if (!b0) { + mAng a = (pPlayer->mRotation.y + 0x8000); + if (mAng::abs(getXZAngleToPlayer() - a) >= mAng(1024.f + cM::rndF(1024.f))) { + if (fn_177_8C20(mRotation.y)) { + field_0xB69 = 0; + changeState(StateID_Walk); + } + } + return; + } + } + + if (field_0xB6A == 0) { + if (!fn_177_8C20(mRotation.y)) { + fn_177_6B10(false, 0); + + if (fn_177_75E0()) { + field_0xA44.set(mNearbyBombRef.get()->mPosition); + fn_177_7040(2, 0.8f); + } else { + fn_177_7040(0, 0.8f); + } + } + return; + } + sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + mAng(0)); + fn_177_7040(0, 0.f); + if (mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x400) { + if (!fn_177_6B10(false, -1000)) { + changeState(StateID_Wait); + mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 2.f); + field_0xB60 = 2; + } + return; + } + + if (field_0xB60 == 3 && mMdl.getAnm().isStop()) { + field_0xB67 = 0; + mMdl.setAnm("RemlyWalk", m3d::PLAY_MODE_4, 2.f); + field_0xB60 = 4; + } + + if (fn_177_8F90()) { + return; + } +} + void dAcEremly_c::finalizeState_Walk() {} + void dAcEremly_c::initializeState_Run() {} void dAcEremly_c::executeState_Run() {} void dAcEremly_c::finalizeState_Run() {} From 7d1748a99325a286663e53d08fd7322469168a1d Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Thu, 2 Apr 2026 08:52:44 -0400 Subject: [PATCH 06/16] dAcEremly_c::StateRun --- src/REL/d/a/e/d_a_e_remly.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) 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 72a7d55a..e70847d8 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -759,12 +759,41 @@ void dAcEremly_c::executeState_Walk() { return; } } - void dAcEremly_c::finalizeState_Walk() {} -void dAcEremly_c::initializeState_Run() {} -void dAcEremly_c::executeState_Run() {} +void dAcEremly_c::initializeState_Run() { + mMdl.setAnm("RemlyRun", m3d::PLAY_MODE_4, 2.f); + field_0xB60 = 5; + mMdl.setRate(1.5f); + field_0xB66 = 1; +} +void dAcEremly_c::executeState_Run() { + fn_177_6FC0(true); + fn_177_6B10(false, 0); + if (fn_177_86C0()) { + return; + } + if (fn_177_73C0()) { + if (isWithinPlayerRadius(600.f)) { + changeState(StateID_Escape); + field_0xB6A = 1; + } else { + changeState(StateID_Walk); + } + return; + } + if (fn_177_75E0()) { + field_0xA44.set(mNearbyBombRef.get()->mPosition); + fn_177_7040(2, 5.f); + } else { + fn_177_7040(0, 5.f); + } + if (fn_177_8F90()) { + return; + } +} void dAcEremly_c::finalizeState_Run() {} + void dAcEremly_c::initializeState_Escape() {} void dAcEremly_c::executeState_Escape() {} void dAcEremly_c::finalizeState_Escape() {} From cbb28071ad4eedc34b79c10f1e7aef6e607de01b Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Fri, 3 Apr 2026 21:28:58 -0400 Subject: [PATCH 07/16] dAcEremly_c::StateEscape --- include/d/a/e/d_a_e_remly.h | 5 +++- src/REL/d/a/e/d_a_e_remly.cpp | 43 +++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 0f0deea2..2ae47f81 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -105,6 +105,8 @@ private: bool fn_177_73C0(); + bool fn_177_7510(f32); + bool fn_177_75E0(); /** false -> comapres to camera @@ -161,7 +163,8 @@ private: /* 0xB0C */ f32 field_0xB0C; /* 0xB10 */ f32 field_0xB10; /* 0xB14 */ u32 field_0xB14; - /* 0xB18 */ u8 _B14[0xB1E - 0xB18]; + /* 0xB18 */ u32 field_0xB18; + /* 0xB1C */ u8 _B1C[0xB1E - 0xB1C]; /* 0xB1E */ mAng3_c field_0xB1E; /* 0xB24 */ s16 field_0xB24; /* 0xB26 */ s16 field_0xB26; 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 e70847d8..7b84f28a 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -794,9 +794,48 @@ void dAcEremly_c::executeState_Run() { } void dAcEremly_c::finalizeState_Run() {} -void dAcEremly_c::initializeState_Escape() {} -void dAcEremly_c::executeState_Escape() {} +void dAcEremly_c::initializeState_Escape() { + field_0xB6E = 0; + mAcceleration = -3.f; + mMdl.setAnm("RemlyRun", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 5; + mMdl.setRate(2.f); + field_0xB66 = 1; + field_0xB6A = 0; + field_0xB69 = 0; + field_0xB48 = 0; + field_0xB18 = 0; +} +void dAcEremly_c::executeState_Escape() { + fn_177_6FC0(false); + if (0 == sLib::calcTimer(&field_0xB48)) { + fn_177_7040(1, 20.f); + } else { + sLib::addCalcScaledDiff(&mSpeed, 20.f, 0.7f, 3.f); + } + + if (fn_177_8C20(mRotation.y) || fn_177_8980(140.f)) { + field_0xB6E = 1; + if (field_0xB64 == 0) { + changeState(StateID_Scared); + } else { + field_0xB69 = 0; + changeState(StateID_Walk); + } + return; + } + + if (field_0xB6A != 0) { + f32 f = mAng(0) + 400.f; + field_0xB6C = 1; + if (!fn_177_7510(f + 600.f) && !mNearbyBombRef.isLinked()) { + field_0xB69 = 0; + changeState(StateID_Walk); + } + } +} void dAcEremly_c::finalizeState_Escape() {} + void dAcEremly_c::initializeState_EscapeDash() {} void dAcEremly_c::executeState_EscapeDash() {} void dAcEremly_c::finalizeState_EscapeDash() {} From b369832664b4f3c0fbd2f32cb19f9620f4b4c87f Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 4 Apr 2026 14:11:01 -0400 Subject: [PATCH 08/16] dAcEremly_c::StateEscapeDash + Wind --- include/d/a/e/d_a_e_remly.h | 1 + src/REL/d/a/e/d_a_e_remly.cpp | 103 ++++++++++++++++++++++++++++++++-- 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 2ae47f81..cd7751bd 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -128,6 +128,7 @@ private: bool fn_177_8AC0(); bool fn_177_8C20(mAng); bool fn_177_8F90(); + bool fn_177_9370(f32); private: /* 0x378 */ STATE_MGR_DECLARE(dAcEremly_c); 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 7b84f28a..3a52626a 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -836,63 +836,158 @@ void dAcEremly_c::executeState_Escape() { } void dAcEremly_c::finalizeState_Escape() {} -void dAcEremly_c::initializeState_EscapeDash() {} -void dAcEremly_c::executeState_EscapeDash() {} +void dAcEremly_c::initializeState_EscapeDash() { + mMdl.setAnm("RemlyRun", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 5; + mMdl.setRate(2.f); + field_0xB66 = 1; + field_0xB6A = 0; + field_0xB6B = 0; + field_0xB18 = 0; +} +void dAcEremly_c::executeState_EscapeDash() { + fn_177_6FC0(false); + + // Idk + s32 a = getXZAngleToPlayer() + 0x8000; + if (field_0xB6B == 0) { + mAng compare = a; + if (mAng::abs(compare - mAngle.y) > 0x1000) { + sLib::addCalcAngle(mAngle.y.ref(), a, 1, 0x1000); + } else { + field_0xB6B = 1; + mAngle.y = a; + } + } + + if (field_0xB6B != 0) { + mVec3_c v = mPosition; + sLib::addCalcScaledDiff(&mSpeed, 30.f, 0.7f, 3.f); + + if (fn_177_8C20(mRotation.y)) { + changeState(StateID_Scared); + } else if (fn_177_8980(200.f)) { + changeState(StateID_Scared); + } + } +} void dAcEremly_c::finalizeState_EscapeDash() {} -void dAcEremly_c::initializeState_Wind() {} -void dAcEremly_c::executeState_Wind() {} + +void dAcEremly_c::initializeState_Wind() { + if (field_0xB60 != 10 && field_0xB60 != 9) { + if (field_0xB60 == 21 || mAng::abs(getXZAngleToPlayer() - mAng(mRotation.y + 0x8000)) < 0x6000) { + mMdl.setAnm("RemlyWindBack", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 10; + } else { + mMdl.setAnm("RemlyWind", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 9; + } + field_0xB4E = 11; + } + field_0xB48 = 11; +} +void dAcEremly_c::executeState_Wind() { + fn_177_6FC0(false); + sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); + if (field_0xB60 == 9) { + fn_177_7040(0, 0.f); + sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800); + } + + if (0 != sLib::calcTimer(&field_0xB48)) { + return; + } + + if (field_0xB64 == 0) { + changeState(StateID_EscapeDash); + return; + } + + if (!fn_177_7330()) { + field_0xB66 = 1; + changeState(StateID_Wait); + + mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 0; + return; + } + + if (fn_177_9370(100.f)) { + changeState(StateID_NightRun); + } else { + changeState(StateID_NightRet); + } +} void dAcEremly_c::finalizeState_Wind() {} + void dAcEremly_c::initializeState_Hold() {} void dAcEremly_c::executeState_Hold() {} void dAcEremly_c::finalizeState_Hold() {} + void dAcEremly_c::initializeState_Jump() {} void dAcEremly_c::executeState_Jump() {} void dAcEremly_c::finalizeState_Jump() {} + void dAcEremly_c::initializeState_Fly() {} void dAcEremly_c::executeState_Fly() {} void dAcEremly_c::finalizeState_Fly() {} + void dAcEremly_c::initializeState_Damage() {} void dAcEremly_c::executeState_Damage() {} void dAcEremly_c::finalizeState_Damage() {} + void dAcEremly_c::initializeState_Sleep() {} void dAcEremly_c::executeState_Sleep() {} void dAcEremly_c::finalizeState_Sleep() {} + void dAcEremly_c::initializeState_Scared() {} void dAcEremly_c::executeState_Scared() {} void dAcEremly_c::finalizeState_Scared() {} + void dAcEremly_c::initializeState_Stun() {} void dAcEremly_c::executeState_Stun() {} void dAcEremly_c::finalizeState_Stun() {} + void dAcEremly_c::initializeState_Water() {} void dAcEremly_c::executeState_Water() {} void dAcEremly_c::finalizeState_Water() {} + void dAcEremly_c::initializeState_Hear() {} void dAcEremly_c::executeState_Hear() {} void dAcEremly_c::finalizeState_Hear() {} + void dAcEremly_c::initializeState_NightSleepDemo() {} void dAcEremly_c::executeState_NightSleepDemo() {} void dAcEremly_c::finalizeState_NightSleepDemo() {} + void dAcEremly_c::initializeState_NightFoo() {} void dAcEremly_c::executeState_NightFoo() {} void dAcEremly_c::finalizeState_NightFoo() {} + void dAcEremly_c::initializeState_NightReflectionFoo() {} void dAcEremly_c::executeState_NightReflectionFoo() {} void dAcEremly_c::finalizeState_NightReflectionFoo() {} + void dAcEremly_c::initializeState_NightWait() {} void dAcEremly_c::executeState_NightWait() {} void dAcEremly_c::finalizeState_NightWait() {} + void dAcEremly_c::initializeState_NightWalk() {} void dAcEremly_c::executeState_NightWalk() {} void dAcEremly_c::finalizeState_NightWalk() {} + void dAcEremly_c::initializeState_NightRun() {} void dAcEremly_c::executeState_NightRun() {} void dAcEremly_c::finalizeState_NightRun() {} + void dAcEremly_c::initializeState_NightRet() {} void dAcEremly_c::executeState_NightRet() {} void dAcEremly_c::finalizeState_NightRet() {} + void dAcEremly_c::initializeState_NightJumpAttack() {} void dAcEremly_c::executeState_NightJumpAttack() {} void dAcEremly_c::finalizeState_NightJumpAttack() {} + void dAcEremly_c::initializeState_BirthWait() {} void dAcEremly_c::executeState_BirthWait() {} void dAcEremly_c::finalizeState_BirthWait() {} From 39caf00af62271dbd0c96e48ce402841dab1fe5c Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 4 Apr 2026 15:13:24 -0400 Subject: [PATCH 09/16] dAcEremly_c::StateHold + Jump --- include/d/a/e/d_a_e_remly.h | 1 + src/REL/d/a/e/d_a_e_remly.cpp | 120 ++++++++++++++++++++++++++++++++-- 2 files changed, 117 insertions(+), 4 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index cd7751bd..351ff156 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -123,6 +123,7 @@ private: bool fn_177_7B10(); void fn_177_8520(bool); + void fn_177_8600(); bool fn_177_86C0(); bool fn_177_8980(f32); bool fn_177_8AC0(); 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 3a52626a..110c74f3 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -920,12 +920,124 @@ void dAcEremly_c::executeState_Wind() { } void dAcEremly_c::finalizeState_Wind() {} -void dAcEremly_c::initializeState_Hold() {} -void dAcEremly_c::executeState_Hold() {} +void dAcEremly_c::initializeState_Hold() { + mMdl.setAnm("RemlyHold", m3d::PLAY_MODE_4, 4.f); + + field_0xB60 = 11; + mSph.ClrCoSet(); + field_0xB3C = 0.f; + field_0xB38 = mPosition.y; + + field_0xB6A = 0; + field_0xB6C = 0; + field_0xB56 = 0; + field_0xB6E = 0; + + mStts.SetRank(5); + field_0xB1E.clear(); + field_0xB26 = 0; + field_0xB24 = 0; + if (fn_177_7330() || field_0xB68) { + mMdl.setAnm("RemlyHoldBata", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 13; + } + + if (fn_177_7330()) { + field_0xB64 = 2; + field_0xB68 = 0; + } + + mLinkage.field_0x90 = 13.f + mAng(0); + mLinkage.field_0x8C = 13.f + mAng(0); + if (field_0xB61 == 1) { + mLinkage.field_0x90 = 26.f + mAng(0); + mLinkage.field_0x8C = 13.f + mAng(0); + } + + mAcceleration = -1.75f + mAng(0); + field_0xB48 = 64.f + cM::rndF(64.f); + field_0xB4E = 90; +} +void dAcEremly_c::executeState_Hold() { + fn_177_6FC0(false); + field_0xB4E = 90; + + mRotation.y = mAngle.y = getXZAngleToPlayer(); + + if (field_0xB60 == 12 && mMdl.getAnm().isStop()) { + mMdl.setAnm("RemlyHold", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 11; + } + + if (0 == sLib::calcTimer(&field_0xB48)) { + if (field_0xB60 == 11) { + mMdl.setAnm("RemlyHoldMozo", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 12; + } + field_0xB48 = 64.f + cM::rndF(64.f); + } + + if (mLinkage.checkConnection(dLinkage_c::CONNECTION_1)) { + return; + } + + if (mLinkage.checkState(dLinkage_c::STATE_2)) { + mAngle.y = getXZAngleToPlayer(); + mAngle.y += 0x8000; + changeState(StateID_Jump); + return; + } + + if (fn_177_7330()) { + mAcceleration = -3.f; + changeState(StateID_NightFoo); + } else if (field_0xB68 == 0) { + mAcceleration = -3.f; + field_0xB48 = 0; + changeState(StateID_Wait); + } else { + mAcceleration = -3.f; + changeState(StateID_EscapeDash); + } +} void dAcEremly_c::finalizeState_Hold() {} -void dAcEremly_c::initializeState_Jump() {} -void dAcEremly_c::executeState_Jump() {} +void dAcEremly_c::initializeState_Jump() { + field_0xB14 = 0; + unsetActorProperty(AC_PROP_0x1); + field_0xB50 = 90; + mMdl.setAnm("RemlyHoldJumpStart", m3d::PLAY_MODE_4, 0.f); + field_0xB60 = 14; + field_0xB4E = 90; +} +void dAcEremly_c::executeState_Jump() { + field_0xB4E = 90; + if (field_0xB60 == 14 && !fn_177_8980(100.f) && (mAcch.ChkGndHit() || mVelocity.y < 0.f)) { + mMdl.setAnm("RemlyHoldJumpEnd", m3d::PLAY_MODE_4, 0.f + mAng(0)); + field_0xB60 = 15; + return; + } + + sLib::addCalcScaled(&mSpeed, 0.3f, 0.2f); + if (mSpeed && mAcch.ChkGndHit()) { + fn_177_8600(); + mSpeed = 0.f; + } + + if (mAcch.ChkGndHit() && mMdl.getAnm().isStop()) { + mAngle.y = mRotation.y; + setActorProperty(AC_PROP_0x1); + mAcceleration = -3.f; + + if (fn_177_7330()) { + changeState(StateID_NightFoo); + } else if (field_0xB68 == 0) { + changeState(StateID_Wait); + } else { + changeState(StateID_EscapeDash); + } + } +} void dAcEremly_c::finalizeState_Jump() {} void dAcEremly_c::initializeState_Fly() {} From 689fdc7c8acb2dd9373fea93587fe8a99691073a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 5 Apr 2026 17:16:58 -0400 Subject: [PATCH 10/16] dAcEremly_c::StateFly --- include/d/a/e/d_a_e_remly.h | 8 +- src/REL/d/a/e/d_a_e_remly.cpp | 213 +++++++++++++++++++++++++++++++--- 2 files changed, 202 insertions(+), 19 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 351ff156..c29a48b0 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -164,7 +164,7 @@ private: /* 0xB08 */ f32 field_0xB08; /* 0xB0C */ f32 field_0xB0C; /* 0xB10 */ f32 field_0xB10; - /* 0xB14 */ u32 field_0xB14; + /* 0xB14 */ s32 field_0xB14; /* 0xB18 */ u32 field_0xB18; /* 0xB1C */ u8 _B1C[0xB1E - 0xB1C]; /* 0xB1E */ mAng3_c field_0xB1E; @@ -186,13 +186,15 @@ private: /* 0xB54 */ u16 field_0xB54; /* 0xB56 */ u16 field_0xB56; /* 0xB58 */ u16 field_0xB58; - /* */ u8 _B56[0xB60 - 0xB5A]; + /* 0xB5A */ u16 field_0xB5A; + /* 0xB5C */ u16 field_0xB5C; + /* 0xB5E */ u16 field_0xB5E; /* 0xB60 */ u8 field_0xB60; // Some State representation /* 0xB61 */ u8 field_0xB61; /* 0xB62 */ u8 mSleepDemoPlayedSceneflag; /* */ u8 _B63; /* 0xB64 */ u8 field_0xB64; - /* */ u8 _B65; + /* 0xB65 */ u8 field_0xB65; /* 0xB66 */ u8 field_0xB66; /* 0xB67 */ u8 field_0xB67; /* 0xB68 */ u8 field_0xB68; 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 110c74f3..8bab1cf7 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -18,8 +18,10 @@ #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" +#include "m/m3d/m_anmmdl.h" #include "m/m3d/m_fanm.h" #include "m/m3d/m_smdl.h" +#include "m/m_angle.h" #include "m/m_mtx.h" #include "m/m_quat.h" #include "m/m_vec.h" @@ -27,8 +29,11 @@ #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resnode.h" +#include "nw4r/math/math_arithmetic.h" +#include "nw4r/math/math_triangular.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" +#include "toBeSorted/d_d3d.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" @@ -111,6 +116,8 @@ bool dAcEremly_c::createHeap() { } int dAcEremly_c::actorCreate() { + s32 _weird_zero = 0; + CREATE_ALLOCATOR(dAcEremly_c); u8 p = getFromParams(0, 0xF); @@ -168,7 +175,7 @@ int dAcEremly_c::actorCreate() { field_0xA50.z = mPosition.z; mAcchCir.SetWall(field_0xB10 * 10.f, field_0xB10 * 60.f); - mAcch.SetField_0xD4(100.f + mAng(0)); + mAcch.SetField_0xD4(100.f + _weird_zero); field_0xB04 = 60.f; if (field_0xB61 == 0) { @@ -248,6 +255,8 @@ int dAcEremly_c::doDelete() { } int dAcEremly_c::actorExecute() { + s32 _weird_zero = 0; + mHealth = 100; nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl(); @@ -458,14 +467,14 @@ int dAcEremly_c::actorExecute() { mMdl.getModel().calc(false); fn_177_6A40(); - f32 radius = 40.f + mAng(0); + f32 radius = 40.f + _weird_zero; mVec3_c center; center.x = mPosition.x; center.y = mPosition.y; center.z = mPosition.z; - center.y += (30.f + mAng(0)); + center.y += 30.f + _weird_zero; mSph.SetC(center); if (isState(StateID_Fly)) { @@ -518,6 +527,8 @@ int dAcEremly_c::actorExecute() { } int dAcEremly_c::draw() { + s32 _weird_zero = 0; + if (mStateMgr.isState(StateID_BirthWait)) { return SUCCEEDED; } @@ -532,8 +543,7 @@ int dAcEremly_c::draw() { 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)); + static mQuat_c shadow = mQuat_c(mVec3_c(0, 70.f + _weird_zero, 0), 290.f + _weird_zero); fn_8002edb0(mShadow, mdl, &shadow, -1, -1, mPosition.y - mAcch.GetGroundH()); return SUCCEEDED; @@ -677,6 +687,8 @@ void dAcEremly_c::initializeState_Walk() { field_0xB66 = 1; } void dAcEremly_c::executeState_Walk() { + s32 _weird_zero = 0; + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); fn_177_6FC0(true); @@ -738,7 +750,8 @@ void dAcEremly_c::executeState_Walk() { } return; } - sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + mAng(0)); + + sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + _weird_zero); fn_177_7040(0, 0.f); if (mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x400) { if (!fn_177_6B10(false, -1000)) { @@ -807,6 +820,8 @@ void dAcEremly_c::initializeState_Escape() { field_0xB18 = 0; } void dAcEremly_c::executeState_Escape() { + s32 _weird_zero = 0; + fn_177_6FC0(false); if (0 == sLib::calcTimer(&field_0xB48)) { fn_177_7040(1, 20.f); @@ -826,9 +841,8 @@ void dAcEremly_c::executeState_Escape() { } if (field_0xB6A != 0) { - f32 f = mAng(0) + 400.f; field_0xB6C = 1; - if (!fn_177_7510(f + 600.f) && !mNearbyBombRef.isLinked()) { + if (!fn_177_7510((_weird_zero + 400.f) + 600.f) && !mNearbyBombRef.isLinked()) { field_0xB69 = 0; changeState(StateID_Walk); } @@ -921,6 +935,8 @@ void dAcEremly_c::executeState_Wind() { void dAcEremly_c::finalizeState_Wind() {} void dAcEremly_c::initializeState_Hold() { + s32 _weird_zero = 0; + mMdl.setAnm("RemlyHold", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 11; @@ -947,14 +963,14 @@ void dAcEremly_c::initializeState_Hold() { field_0xB68 = 0; } - mLinkage.field_0x90 = 13.f + mAng(0); - mLinkage.field_0x8C = 13.f + mAng(0); + mLinkage.field_0x90 = 13.f + _weird_zero; + mLinkage.field_0x8C = 13.f + _weird_zero; if (field_0xB61 == 1) { - mLinkage.field_0x90 = 26.f + mAng(0); - mLinkage.field_0x8C = 13.f + mAng(0); + mLinkage.field_0x90 = 26.f + _weird_zero; + mLinkage.field_0x8C = 13.f + _weird_zero; } - mAcceleration = -1.75f + mAng(0); + mAcceleration = -1.75f + _weird_zero; field_0xB48 = 64.f + cM::rndF(64.f); field_0xB4E = 90; } @@ -1011,9 +1027,11 @@ void dAcEremly_c::initializeState_Jump() { field_0xB4E = 90; } void dAcEremly_c::executeState_Jump() { + s32 _weird_zero = 0; + field_0xB4E = 90; if (field_0xB60 == 14 && !fn_177_8980(100.f) && (mAcch.ChkGndHit() || mVelocity.y < 0.f)) { - mMdl.setAnm("RemlyHoldJumpEnd", m3d::PLAY_MODE_4, 0.f + mAng(0)); + mMdl.setAnm("RemlyHoldJumpEnd", m3d::PLAY_MODE_4, 0.f + _weird_zero); field_0xB60 = 15; return; } @@ -1040,8 +1058,171 @@ void dAcEremly_c::executeState_Jump() { } void dAcEremly_c::finalizeState_Jump() {} -void dAcEremly_c::initializeState_Fly() {} -void dAcEremly_c::executeState_Fly() {} +void dAcEremly_c::initializeState_Fly() { + s32 _weird_zero = 0; + + mAcch.ClrGndThinCellingOff(); + field_0xB5C = 0; + field_0xB5E = 0; + field_0xB58 = 0; + unsetActorProperty(AC_PROP_0x1); + + field_0xB6B = 0; + mMdl.setAnm("RemlyFly", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 16; + mMdl.setRate(1.3f); + field_0xB66 = 1; + field_0xB6A = 0; + field_0xB14 = 0; + field_0xB68 = 0; + + if (fn_177_7330()) { + field_0xB64 = 2; + } else { + field_0xB64 = 1; + } + + mAcch.ClrRoofNone(); + + f32 f = 200.f + _weird_zero; + + field_0xB3C = 0.f; + field_0xB65 = 0; + + mAcch.SetField_0xD4(f); + + mVelocity.x = mVelocity.z = 0.f; + mSpeed = 0.f; +} +void dAcEremly_c::executeState_Fly() { + s32 _weird_zero = 0; + + if (field_0xB61 == 1 && !fn_177_75E0() && EventManager::isInEvent()) { + setActorProperty(AC_PROP_0x1); + mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z); + mAngle.y = mRotation.y = mStartingRot.y; + changeState(StateID_Sleep); + return; + } + + fn_177_6FC0(false); + + if (field_0xB60 == 17 && mMdl.getAnm().isStop()) { + mMdl.setAnm("RemlyFly", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 16; + mMdl.setRate(1.3f); + } + + if (mAcch.ChkWallHit(nullptr) || mAcch.ChkRoofHit()) { + mAng a; + if (mAcch.ChkWallHit(nullptr)) { + a = mAcchCir.GetWallAngleY() + 0x8000; + } else { + a = mAngle.y + 0x8000; + } + + field_0xB14++; + mVec3_c v(0.f, 0.f, 0.f); + + v.offsetWithAngle(a, -10.f + _weird_zero); + + field_0xAF8.set(v); + } + + mAng toStartingPosAngle = cLib::targetAngleY(mPosition, mStartingPos); + + switch (field_0xB65) { + default: { + sLib::addCalcScaledDiff(&mVelocity.y, 8.f, 0.7f, 2.f); + sLib::addCalcScaled(&mAcceleration, 0.7f, 2.f); + sLib::addCalcAngle(mAngle.y.ref(), getXZAngleToPlayer(), 2, 0x800); + sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800); + if (mStartingPos.y + 300.f < mPosition.y) { + mAcceleration = 0.f; + mVelocity.y = 0.f; + field_0xB65++; + } + } break; + case 1: { + if (field_0xB14 < 120 && fn_177_7650(false)) { + changeState(StateID_BirthWait); + return; + } + + f32 targetSpeed; + if (field_0xB14 < 120 && mStartingPos.squareDistanceToXZ(mPosition) > 2500.f) { + u32 angle = ++field_0xB5C * 1000; + targetSpeed = mAng(angle).sin(); + targetSpeed *= _weird_zero + 30.f; + } else { + targetSpeed = 0.f; + } + sLib::addCalcScaledDiff(&field_0xB3C, targetSpeed, 0.5f, 10.f); + + if (field_0xB14 < 120 && mStartingPos.squareDistanceToXZ(mPosition) > 2500.f) { + s32 angle = ++field_0xB5E * 300; + f32 tmp = mAng(angle).cos(); + tmp *= 10000.f + _weird_zero; + + sLib::addCalcAngle(mAngle.y.ref(), toStartingPosAngle + tmp, 2, 0x800); + sLib::addCalcAngle(mRotation.y.ref(), toStartingPosAngle, 2, 0x800); + + if (mAcch.ChkWallHit(nullptr)) { + sLib::addCalcScaledDiff(&mVelocity.y, 8.f, 0.7f, 2.f); + if (std::abs(mPosition.y - field_0xAA4.y) < 4.f) { + field_0xB14++; + } + } else { + mAcceleration = 0.f; + mVelocity.y = 0.f; + field_0xB14 = 0; + } + targetSpeed = 8.f; + } else { + sLib::addCalcScaledDiff(&mVelocity.y, -8.f, 0.7f, 2.f); + + targetSpeed = 0.f; + + if (field_0xB14 >= 120 && fn_177_8980(100.f) && !d3d::isOnScreen(mPosition)) { + changeState(StateID_BirthWait); + return; + } + if (mAcch.ChkGndHit()) { + field_0xB3C = 0.f; + mAcceleration = -3.f; + mSpeed = 0.f; + field_0xB65++; + mAcch.SetRoofNone(); + + setActorProperty(AC_PROP_0x1); + if (field_0xB14 >= 120) { + field_0xB64 = 0; + changeState(StateID_Scared); + } else { + if (fn_177_7330()) { + changeState(StateID_NightWait); + } else { + mMdl.setAnm("RemlyWakeUp", m3d::PLAY_MODE_4, 4.f); + mMdl.setFrame(mMdl.getAnm().getEndFrame() - 1.f); + mMdl.setRate(-1.f); + field_0xB60 = 20; + } + } + return; + } + } + sLib::addCalcScaledDiff(&mSpeed, targetSpeed, 0.7f, 3.f); + } break; + case 2: { + if (mMdl.getAnm().checkFrame(0.f)) { + setActorProperty(AC_PROP_0x1); + mAngle.y = mRotation.y; + changeState(StateID_Sleep); + } + + } break; + } +} void dAcEremly_c::finalizeState_Fly() {} void dAcEremly_c::initializeState_Damage() {} From c76fde39c9b74f5f4f2c9b7319b34553ee262506 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 5 Apr 2026 21:52:02 -0400 Subject: [PATCH 11/16] dAcEremly_c::StateDamage and various cleanup --- src/REL/d/a/e/d_a_e_remly.cpp | 189 +++++++++++++++++++++++++--------- 1 file changed, 140 insertions(+), 49 deletions(-) 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 8bab1cf7..13300484 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -18,7 +18,6 @@ #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" -#include "m/m3d/m_anmmdl.h" #include "m/m3d/m_fanm.h" #include "m/m3d/m_smdl.h" #include "m/m_angle.h" @@ -30,7 +29,6 @@ #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resnode.h" #include "nw4r/math/math_arithmetic.h" -#include "nw4r/math/math_triangular.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" #include "toBeSorted/d_d3d.h" @@ -62,6 +60,45 @@ static dCcD_SrcSph sSphSrc = { 50.f, }, }; +struct dAcEremly_HIO_c { + f32 _0x00; + f32 _0x04; + f32 _0x08; + f32 _0x0C; + f32 _0x10; + f32 _0x14; + f32 _0x18; + f32 _0x1C; + f32 _0x20; + f32 _0x24; + f32 _0x28; + f32 _0x2C; + f32 _0x30; + f32 _0x34; + f32 _0x38; + f32 _0x3C; + f32 _0x40; + f32 _0x44; + s16 _0x48; + f32 _0x4C; + f32 _0x50; + f32 _0x54; + f32 _0x58; + s16 _0x5C; + s16 _0x5E; + s16 _0x60; + s16 _0x62; + s16 _0x64; + f32 _0x68; + f32 _0x6C; + static const dAcEremly_HIO_c sInstance; +}; +const dAcEremly_HIO_c dAcEremly_HIO_c::sInstance = { + 1.f, 1000.f, 500.0f, 200.0f, 120.0f, 250.0f, 400.0f, 400.0f, 600.0f, 0.8f, 5.0f, 20.0f, 10.0f, -8.0f, 20.0f, 7.0f, + 15.0f, 50.0f, 30, 1000.f, 300.f, 8.f, 1.3f, 300, 300, 30, 90, 90, 40.f, 0.f + +}; + STATE_DEFINE(dAcEremly_c, Wait); STATE_DEFINE(dAcEremly_c, Walk); STATE_DEFINE(dAcEremly_c, Run); @@ -99,7 +136,7 @@ void dAcEremly_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *resu } bool dAcEremly_c::createHeap() { - TRY_CREATE(mMdl.create(*this, getOarcResFile("Remly"), "Remly", "RemlyWalk", 0x133)); + TRY_CREATE(mMdl.create3(*this, getOarcResFile("Remly"), "Remly", "RemlyWalk", 0x133)); fn_80030980(mMdl.getModel(), 1, false); mMdl.getModel().setCallback(&mMdlCallback); @@ -476,9 +513,9 @@ int dAcEremly_c::actorExecute() { center.y += 30.f + _weird_zero; + mMtx_c m; mSph.SetC(center); if (isState(StateID_Fly)) { - mMtx_c m; mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone3").GetID(), m); m.getTranslation(center); mSph.SetC(center); @@ -497,17 +534,16 @@ int dAcEremly_c::actorExecute() { } 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.set(mPosition); mPositionCopy2.y += 30.f; - mPositionCopy3 = mPositionCopy2; + mPositionCopy3.set(mPositionCopy2); mPositionCopy3.y += 50.f; if (isState(StateID_Fly)) { @@ -543,7 +579,9 @@ int dAcEremly_c::draw() { m3d::smdl_c &mdl = mMdl.getModel(); drawModelType1(&mdl); - static mQuat_c shadow = mQuat_c(mVec3_c(0, 70.f + _weird_zero, 0), 290.f + _weird_zero); + + // elp + static mQuat_c shadow(0.f, 70.f + _weird_zero, 0.f, 290.f + _weird_zero); fn_8002edb0(mShadow, mdl, &shadow, -1, -1, mPosition.y - mAcch.GetGroundH()); return SUCCEEDED; @@ -561,7 +599,7 @@ void dAcEremly_c::initializeState_Wait() { field_0xB48 = cM::rndF(48.f) + 48.f; } else { - mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 4.f); + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f); field_0xB60 = 1; field_0xB44 = cM::rndF(128.f) + 128.f; @@ -585,7 +623,7 @@ void dAcEremly_c::executeState_Wait() { if (field_0xB60 == 2) { if (mMdl.getAnm().isStop()) { - mMdl.setAnm("RemlytWaitSit", m3d::PLAY_MODE_4, 10.f); + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f); field_0xB60 = 1; } return; @@ -661,7 +699,7 @@ void dAcEremly_c::executeState_Wait() { } if (field_0xB60 == 1) { - mMdl.setAnm("RemlytWaitSitCry", m3d::PLAY_MODE_4, 10.f); + mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 10.f); field_0xB60 = 2; } field_0xB44 = 128.f + cM::rndF(128.f); @@ -677,6 +715,7 @@ void dAcEremly_c::initializeState_Walk() { field_0xB60 = 4; } + // These two values somehow need to be before the RemlyCryWalk data field_0xB32 = 0; field_0xB34 = 0; @@ -708,7 +747,7 @@ void dAcEremly_c::executeState_Walk() { m.YrotS(field_0xB32); mVec3_c in(0.f, 0.f, 180.f), out; m.multVec(in, out); - out += mPosition; + out += pPlayer->mPosition; field_0xA44.set(out); if (fn_177_7040(2, 0.8f)) { @@ -717,46 +756,35 @@ void dAcEremly_c::executeState_Walk() { bool b0 = false; if (mSph.ChkCoHit()) { b0 = true; - if (mSph.GetCoActor()->isActorPlayer()) { - mAng a = (pPlayer->mRotation.y + 0x8000); - if (mAng::abs(getXZAngleToPlayer() - a) > mAng(1024.f + cM::rndF(1024.f))) { - b0 = false; - } + if (mSph.GetCoActor()->isActorPlayer() && + mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) > + mAng(1024.f + cM::rndF(1024.f))) { + b0 = false; } } - if (!b0) { - mAng a = (pPlayer->mRotation.y + 0x8000); - if (mAng::abs(getXZAngleToPlayer() - a) >= mAng(1024.f + cM::rndF(1024.f))) { - if (fn_177_8C20(mRotation.y)) { - field_0xB69 = 0; - changeState(StateID_Walk); - } - } + if (b0 || + mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) < mAng(1024.f + cM::rndF(1024.f)) || + fn_177_8C20(mRotation.y)) { + field_0xB69 = 0; + changeState(StateID_Wait); return; } - } + } else if (field_0xB6A == 0 && !fn_177_8C20(mRotation.y)) { + fn_177_6B10(false, 0); - if (field_0xB6A == 0) { - if (!fn_177_8C20(mRotation.y)) { - fn_177_6B10(false, 0); - - if (fn_177_75E0()) { - field_0xA44.set(mNearbyBombRef.get()->mPosition); - fn_177_7040(2, 0.8f); - } else { - fn_177_7040(0, 0.8f); - } + if (fn_177_75E0()) { + field_0xA44.set(mRef1.get()->mPosition); + fn_177_7040(2, 0.8f); + } else { + fn_177_7040(0, 0.8f); } - return; - } - - sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + _weird_zero); - fn_177_7040(0, 0.f); - if (mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x400) { - if (!fn_177_6B10(false, -1000)) { + } else { + sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + _weird_zero); + fn_177_7040(0, 0.f); + if (mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x400 && !fn_177_6B10(false, -1000)) { changeState(StateID_Wait); - mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 2.f); + mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 2; } return; @@ -796,7 +824,7 @@ void dAcEremly_c::executeState_Run() { return; } if (fn_177_75E0()) { - field_0xA44.set(mNearbyBombRef.get()->mPosition); + field_0xA44.set(mRef1.get()->mPosition); fn_177_7040(2, 5.f); } else { fn_177_7040(0, 5.f); @@ -841,8 +869,9 @@ void dAcEremly_c::executeState_Escape() { } if (field_0xB6A != 0) { + f32 f = (_weird_zero + 400.f); field_0xB6C = 1; - if (!fn_177_7510((_weird_zero + 400.f) + 600.f) && !mNearbyBombRef.isLinked()) { + if (!fn_177_7510(600.f + f) && !mNearbyBombRef.isLinked()) { field_0xB69 = 0; changeState(StateID_Walk); } @@ -875,7 +904,7 @@ void dAcEremly_c::executeState_EscapeDash() { } if (field_0xB6B != 0) { - mVec3_c v = mPosition; + mVec3_c v(mPosition); sLib::addCalcScaledDiff(&mSpeed, 30.f, 0.7f, 3.f); if (fn_177_8C20(mRotation.y)) { @@ -1225,8 +1254,70 @@ void dAcEremly_c::executeState_Fly() { } void dAcEremly_c::finalizeState_Fly() {} -void dAcEremly_c::initializeState_Damage() {} -void dAcEremly_c::executeState_Damage() {} +void dAcEremly_c::initializeState_Damage() { + field_0xB14 = 0; + mAcceleration = -3.f; + if (field_0xB60 == 21) { + field_0xB14 = 1; + } + + if (!fn_177_7330()) { + mSpeed = 7.f; + } else { + mSpeed = 15.f; + } + + f32 blend = 10.f; + if (field_0xB6B != 0) { + blend = 0.f; + mSpeed = 0.f; + } + mStts.SetRank(5); + field_0xB6B = 0; + if (mAcch.ChkGndHit()) { + field_0xB6B = 1; + } + mMdl.setAnm("RemlyDamage", m3d::PLAY_MODE_4, blend); + field_0xB60 = 18; + mAngle.y = getXZAngleToPlayer() + 0x8000; +} +void dAcEremly_c::executeState_Damage() { + if (mAcch.ChkGndHit()) { + sLib::addCalcScaled(&mSpeed, 0.5f, 1.f); + if (field_0xB6B == 0) { + fn_177_8600(); + field_0xB6B = 1; + } + } + + if (field_0xB14 != 0) { + field_0xB4E = 8; + s32 targetAngle = getXZAngleToPlayer() + 0x8000; + if (mAng::abs(mAng(targetAngle) - mAngle.y) > 0x1000) { + sLib::addCalcAngle(mRotation.y.ref(), targetAngle, 1, 0x1000); + } else { + mRotation.y = targetAngle; + } + } + + if (mSpeed < 0.1f && mMdl.getAnm().isStop()) { + if (field_0xB14) { + changeState(StateID_EscapeDash); + field_0xB6B = 1; + } else { + mAngle.y = mRotation.y; + if (fn_177_7330() && field_0xB64 != 0) { + if (fn_177_9370(100.f)) { + changeState(StateID_NightRun); + } else { + changeState(StateID_NightRet); + } + } else { + changeState(StateID_EscapeDash); + } + } + } +} void dAcEremly_c::finalizeState_Damage() {} void dAcEremly_c::initializeState_Sleep() {} From 27bdd1c8af3a62701acd3afa87fb28b87c460304 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 5 Apr 2026 22:26:08 -0400 Subject: [PATCH 12/16] dAcEremly_c::StateSleep + Scared + Stun --- src/REL/d/a/e/d_a_e_remly.cpp | 138 ++++++++++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 6 deletions(-) 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 13300484..52b95fc0 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -15,6 +15,7 @@ #include "d/d_linkage.h" #include "d/d_sc_game.h" #include "d/flag/sceneflag_manager.h" +#include "d/snd/d_snd_wzsound.h" #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" @@ -1320,16 +1321,141 @@ void dAcEremly_c::executeState_Damage() { } void dAcEremly_c::finalizeState_Damage() {} -void dAcEremly_c::initializeState_Sleep() {} -void dAcEremly_c::executeState_Sleep() {} +void dAcEremly_c::initializeState_Sleep() { + mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 19; + mTexPat.setFrame(2.f, 0); + mMdlCallback.mAng.clear(); +} +void dAcEremly_c::executeState_Sleep() { + if (field_0xB60 == 20) { + if (mMdl.getAnm().isStop()) { + changeState(StateID_Wait); + } + } else if (fn_177_86C0() || fn_177_8F90() || mSph.ChkCoHit()) { + if (field_0xB60 != 20) { + mMdl.setAnm("RemlyWakeUp", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 20; + } + } +} void dAcEremly_c::finalizeState_Sleep() {} -void dAcEremly_c::initializeState_Scared() {} -void dAcEremly_c::executeState_Scared() {} +void dAcEremly_c::initializeState_Scared() { + mMdl.setAnm("RemlyScared", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 21; + field_0xB66 = 1; + mSpeed = 0.f; + field_0xB14 = 0; + mStts.SetRank(11); +} +void dAcEremly_c::executeState_Scared() { + if (fn_177_7330()) { + return; + } + + fn_177_86C0(); + if (mMdl.getAnm().getRate()) { + fn_177_6FC0(false); + } else if (field_0xB64) { + sLib::addCalcAngle(mMdlCallback.mAng.z.ref(), 8000, 20, 0x100); + if (field_0xB14 > 80 && !fn_177_73C0()) { + field_0xB68 = 0; + field_0xB66 = 1; + changeState(StateID_Wait); + } + } + + sLib::addCalcScaled(&mSpeed, 0.7f, 3.f); + + if (!field_0xB64) { + return; + } + + if (!fn_177_73C0()) { + if (++field_0xB14 > 30) { + mMdl.setRate(0.f); + } + } else { + field_0xB14 = 0; + mMdl.setRate(1.f); + } +} void dAcEremly_c::finalizeState_Scared() {} -void dAcEremly_c::initializeState_Stun() {} -void dAcEremly_c::executeState_Stun() {} +void dAcEremly_c::initializeState_Stun() { + field_0xB6B = 0; + mAcceleration = -3.f; + if (field_0xB60 != 22 && field_0xB60 != 23) { + mMdl.setAnm("RemlyPiyol", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 22; + } else { + mMdl.setAnm("RemlyPiyol", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 22; + mMdl.setFrame(11.f); + field_0xB6B = 1; + } + + if (!fn_177_7330()) { + field_0xB64 = 0; + } + + mStts.SetRank(11); + fn_177_8520(true); + field_0xB6A = 0; + mSph.ClrAtSet(); + field_0xB68 = 1; +} +void dAcEremly_c::executeState_Stun() { + switch (field_0xB60) { + default: { + if (mMdl.getAnm().isStop()) { + mMdl.setAnm("RemlyPiyo2", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 23; + field_0xB48 = 300; + fn_177_8520(true); + } + } break; + case 23: { + if (sLib::calcTimer(&field_0xB48)) { + field_0xB6B = 1; + } else { + mMdl.setAnm("RemlyPiyo3", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 24; + } + } break; + case 24: { + if (mMdl.getAnm().checkFrame(36.f)) { + mSpeed = 15.f; + } + if (mMdl.getAnm().isStop()) { + mStts.SetRank(5); + if (fn_177_7330()) { + if (fn_177_9370(100.f)) { + changeState(StateID_NightRun); + } else { + changeState(StateID_NightRet); + } + } else { + changeState(StateID_Escape); + } + } + } break; + } + if (field_0xB60 != 23 && field_0xB60 != 24) {} + + sLib::addCalcScaled(&mSpeed, 0.5f, 1.f); + if (field_0xB6B) { + mVec3_c pos, scale; + pos.set(mPosition); + pos.y += 50.f; + + scale.set(mScale); + scale *= 0.5f; + mEmitters[0].holdEffect(PARTICLE_RESOURCE_ID_MAPPING_309_, pos, &mRotation, &scale, nullptr, nullptr); + holdSound(SE_E_PIYORI_LV); + } +} void dAcEremly_c::finalizeState_Stun() {} void dAcEremly_c::initializeState_Water() {} From 355ac6990470a0e5f3c8231c9637844c899880fc Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 6 Apr 2026 20:13:30 -0400 Subject: [PATCH 13/16] dAcEremly_c::StateWater --- include/d/a/e/d_a_e_remly.h | 1 + include/d/t/d_t_stream.h | 3 + src/REL/d/a/e/d_a_e_remly.cpp | 139 +++++++++++++++++++++++++++++----- 3 files changed, 123 insertions(+), 20 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index c29a48b0..2bc9ac85 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -204,6 +204,7 @@ private: /* 0xB6C */ u8 field_0xB6C; /* 0xB6D */ u8 field_0xB6D; /* 0xB6E */ u8 field_0xB6E; + /* 0xB6F */ u8 field_0xB6F; }; #endif diff --git a/include/d/t/d_t_stream.h b/include/d/t/d_t_stream.h index ef32391f..9a52f1d9 100644 --- a/include/d/t/d_t_stream.h +++ b/include/d/t/d_t_stream.h @@ -5,6 +5,7 @@ #include "f/f_list_mg.h" #include "f/f_list_nd.h" #include "m/m_mtx.h" +#include "m/m_vec.h" class dTgStream_c : public dTg_c { public: @@ -21,6 +22,8 @@ public: void addToList(fLiMgBa_c &list); + static bool getForce(const mVec3_c &position, mVec3_c &force, const fLiMgBa_c &list = sStreamList); + private: /* 0x0FC */ u8 mSceneflag; ///< Sceneflag to indicate when to flow /* 0x0FD */ u8 mAreaIdx; 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 52b95fc0..6067ef0e 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -16,6 +16,7 @@ #include "d/d_sc_game.h" #include "d/flag/sceneflag_manager.h" #include "d/snd/d_snd_wzsound.h" +#include "d/t/d_t_stream.h" #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" @@ -49,13 +50,13 @@ static dCcD_SrcSph sSphSrc = { 0, 0, }, { - ~AT_TYPE_COMMON0, + ~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x303, - {0, 0, 0x407}, + {0, 0, 0x40F}, 8, 0, }, { - 0x28, + 0xE5, }}, { 50.f, }, @@ -308,12 +309,12 @@ int dAcEremly_c::actorExecute() { 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; + changeState(StateID_Wait); } - field_0xB60 = 0; - field_0xB66 = 1; - field_0xB48 = 48.f + cM::rndF(48.f); - field_0xB6A = 1; - changeState(StateID_Wait); } if (!isState(StateID_Hold)) { @@ -353,6 +354,7 @@ int dAcEremly_c::actorExecute() { } else { if (field_0xB60 == 6) { mMdl.setAnm("RemlySwimDamage", m3d::PLAY_MODE_4, 4.f); + field_0xB4E = 90; field_0xB60 = 8; } else { mSph.ClrAtSet(); @@ -361,8 +363,8 @@ int dAcEremly_c::actorExecute() { } } break; case 12: { - if (!isState(StateID_Fly) && field_0xB60 != 6 && field_0xB60 != 11) { - if (mSph.ChkCoHit() && mSph.ChkTgAtHitType(AT_TYPE_0x80000 | AT_TYPE_SLINGSHOT)) { + if (!isState(StateID_Fly) && field_0xB60 != 6 && field_0xB60 != 8) { + if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_0x80000 | AT_TYPE_SLINGSHOT)) { mAngle.y = getXZAngleToPlayer(); mSpeed = -15.f; changeState(StateID_Stun); @@ -410,7 +412,7 @@ int dAcEremly_c::actorExecute() { } if (!isState(StateID_Hold)) { - field_0xAA4 = mPosition; + field_0xAA4.set(mPosition); calcVelocity(); mPosition += mVelocity; mPosition += mStts.GetCcMove(); @@ -465,9 +467,7 @@ int dAcEremly_c::actorExecute() { mAngle.y = mStartingRot.y; changeState(StateID_Sleep); } - field_0xB58++; - // Why cast? - if ((s32)field_0xB58 > 30) { + if ((s32)++field_0xB58 > 30) { changeState(StateID_Fly); } } @@ -535,7 +535,7 @@ int dAcEremly_c::actorExecute() { } if (field_0xB60 == 7) { - mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone3").GetID(), m); + mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone02").GetID(), m); m.getTranslation(center); mEmitters[1].holdEffect(PARTICLE_RESOURCE_ID_MAPPING_859_, center, nullptr, nullptr, nullptr, nullptr); @@ -1387,10 +1387,10 @@ void dAcEremly_c::initializeState_Stun() { field_0xB6B = 0; mAcceleration = -3.f; if (field_0xB60 != 22 && field_0xB60 != 23) { - mMdl.setAnm("RemlyPiyol", m3d::PLAY_MODE_4, 4.f); + mMdl.setAnm("RemlyPiyo1", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 22; } else { - mMdl.setAnm("RemlyPiyol", m3d::PLAY_MODE_4, 4.f); + mMdl.setAnm("RemlyPiyo1", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 22; mMdl.setFrame(11.f); field_0xB6B = 1; @@ -1458,11 +1458,110 @@ void dAcEremly_c::executeState_Stun() { } void dAcEremly_c::finalizeState_Stun() {} -void dAcEremly_c::initializeState_Water() {} -void dAcEremly_c::executeState_Water() {} +void dAcEremly_c::initializeState_Water() { + mMdl.setAnm("RemlySwim", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 6; + field_0xB6B = 0; + mAcceleration = 0.f; + mSpeed = 0.f; + mSph.ClrAtSet(); + field_0xB68 = 0; + + if (!fn_177_7330()) { + field_0xB64 = 1; + } else { + field_0xB64 = 2; + } + + mStts.SetRank(11); + field_0xB6E = 0; + field_0xB6A = 0; + startSound(SE_ERemly_DIVE_WATER); + field_0xB6F = 0; + field_0xB66 = 1; +} +void dAcEremly_c::executeState_Water() { + s32 _weird_zero = 0; + + fn_177_6FC0(false); + if (field_0xB6B) { + mVec3_c out(mVec3_c::Zero); + mVec3_c pos; + pos.set(mPosition); + pos.y = field_0xB0C; + if (dTgStream_c::getForce(pos, out)) { + mAngle.y = out.atan2sX_Z(); + sLib::addCalcScaledDiff(&mSpeed, out.absXZ(), 0.2f, 0.2f); + field_0xB6F = 1; + } else if (field_0xB6F) { + mStts.SetRank(5); + mAcceleration = -3.f; + + if ((s32)++field_0xB58 > 30) { + changeState(StateID_Fly); + } + } else { + mSpeed = 0.f; + mAcceleration = -3.f; + mStts.SetRank(5); + + if (field_0xB60 != 8 && field_0xB60 != 7) { + mMdl.setAnm("RemlyWater", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 7; + + } else if (field_0xB60 == 8 || mMdl.getAnm().isStop()) { + if (fn_177_7330()) { + field_0xB6E = 1; + changeState(StateID_Fly); + } else { + changeState(StateID_Walk); + } + } + } + } else { + if (field_0xB60 == 8 && mMdl.getAnm().isStop()) { + mMdl.setAnm("RemlySwim", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 6; + } + field_0xB5A++; + f32 yOffset = -35.f + _weird_zero; + if (field_0xB4E != 0) { + yOffset -= 10.f + _weird_zero; + } + fn_177_7040(0, 0.8f); + (void)dAcPy_c::GetLink()->mPosition.absXZTo(mPosition); + if (fn_177_7510(220.f)) { + mSpeed = 0.f; + } + f32 yTarget = field_0xB0C + yOffset + mAng(field_0xB5A * 2000).sin() * 3.f; + sLib::addCalcScaledDiff(&mPosition.y, yTarget, 0.7f, 3.f); + sLib::addCalcScaled(&mVelocity.y, 0.8f, 10.f); + } +} void dAcEremly_c::finalizeState_Water() {} -void dAcEremly_c::initializeState_Hear() {} +void dAcEremly_c::initializeState_Hear() { + field_0xB14 = 0; + field_0xB65 = 0; + switch (field_0xB60) { + default: { + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 1; + field_0xB66 = 0; + } // fallthrough + case 1: { + field_0xB65 = 1; + } break; + case 3: + case 4: + case 5: { + mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 0; + field_0xB66 = 1; + field_0xB48 = 24.f + cM::rndF(24.f); + } + } +} void dAcEremly_c::executeState_Hear() {} void dAcEremly_c::finalizeState_Hear() {} From 84a65865d0a553befe08d17a75401f63db44fcda Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Tue, 7 Apr 2026 16:49:25 -0400 Subject: [PATCH 14/16] the rest of dAcEremly_c states --- include/d/a/e/d_a_e_remly.h | 4 +- include/d/a/obj/d_a_obj_base.h | 3 + include/m/m_angle.h | 4 + src/REL/d/a/e/d_a_e_remly.cpp | 433 ++++++++++++++++++++++++++++++--- 4 files changed, 413 insertions(+), 31 deletions(-) diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 2bc9ac85..9629855c 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -121,6 +121,7 @@ private: bool fn_177_79D0(bool); bool fn_177_7B10(); + void nightSleepDemoImpl(); void fn_177_8520(bool); void fn_177_8600(); @@ -179,7 +180,8 @@ private: /* 0xB44 */ u16 field_0xB44; /* 0xB46 */ u16 field_0xB46; /* 0xB48 */ u16 field_0xB48; - /* */ u8 _B4A[0xB4E - 0xB4A]; + /* 0xB4A */ u16 field_0xB4A; + /* 0xB4C */ u16 field_0xB4C; /* 0xB4E */ u16 field_0xB4E; /* 0xB50 */ u16 field_0xB50; /* 0xB52 */ u16 field_0xB52; diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 57f1222a..272f9ec0 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -95,6 +95,9 @@ public: mVec3_c &getOldPosition() { return mOldPosition; } + mVec3_c &getStartingPosition() { + return mStartingPos; + } mVec3_c &getVelocity() { return mVelocity; } diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 1de484bc..d952b612 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -63,6 +63,10 @@ public: s32 absDiff(const mAng &other) const { return sLib::absDiff(mVal, other.mVal); } + template + static s32 absDiff2(T a, T b) { + return abs(a - b); + } f32 sin() const { return nw4r::math::SinIdx(*this); } 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 6067ef0e..4f1ccd14 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -12,6 +12,7 @@ #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_camera.h" #include "d/d_linkage.h" #include "d/d_sc_game.h" #include "d/flag/sceneflag_manager.h" @@ -689,8 +690,7 @@ void dAcEremly_c::executeState_Wait() { } if (field_0xB50 == 0 && !coPlayer && !fn_177_8C20(getXZAngleToPlayer())) { - mAng a = (pPlayer->mRotation.y + 0x8000); - if (mAng::abs(getXZAngleToPlayer() - a) > 0x2000) { + if (mAng::absDiff2(getXZAngleToPlayer(), mAng(pPlayer->mRotation.y + 0x8000)) > 0x2000) { field_0xB69 = 1; field_0xB67 = 0; @@ -729,6 +729,7 @@ void dAcEremly_c::initializeState_Walk() { void dAcEremly_c::executeState_Walk() { s32 _weird_zero = 0; + bool b0 = false; const dAcPy_c *pPlayer = dAcPy_c::GetLink(); fn_177_6FC0(true); @@ -737,7 +738,8 @@ void dAcEremly_c::executeState_Walk() { return; } - if (!field_0xB6A && mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x4000 && fn_177_73C0() && field_0xB6E == 0) { + if (!field_0xB6A && mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x4000 && fn_177_73C0() && + field_0xB6E == 0) { changeState(StateID_Escape); field_0xB6A = 1; return; @@ -754,18 +756,18 @@ void dAcEremly_c::executeState_Walk() { if (fn_177_7040(2, 0.8f)) { field_0xB32 += field_0xB34; } - bool b0 = false; if (mSph.ChkCoHit()) { b0 = true; if (mSph.GetCoActor()->isActorPlayer() && - mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) > + mAng::absDiff2(getXZAngleToPlayer(), pPlayer->mRotation.y + 0x8000) > mAng(1024.f + cM::rndF(1024.f))) { b0 = false; } } if (b0 || - mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) < mAng(1024.f + cM::rndF(1024.f)) || + mAng::absDiff2(getXZAngleToPlayer(), pPlayer->mRotation.y + 0x8000) < + mAng(1024.f + cM::rndF(1024.f)) || fn_177_8C20(mRotation.y)) { field_0xB69 = 0; changeState(StateID_Wait); @@ -783,7 +785,7 @@ void dAcEremly_c::executeState_Walk() { } else { sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + _weird_zero); fn_177_7040(0, 0.f); - if (mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x400 && !fn_177_6B10(false, -1000)) { + if (mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x400 && !fn_177_6B10(false, -1000)) { changeState(StateID_Wait); mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 2; @@ -895,8 +897,7 @@ void dAcEremly_c::executeState_EscapeDash() { // Idk s32 a = getXZAngleToPlayer() + 0x8000; if (field_0xB6B == 0) { - mAng compare = a; - if (mAng::abs(compare - mAngle.y) > 0x1000) { + if (mAng::absDiff2(a, mAngle.y) > 0x1000) { sLib::addCalcAngle(mAngle.y.ref(), a, 1, 0x1000); } else { field_0xB6B = 1; @@ -919,7 +920,7 @@ void dAcEremly_c::finalizeState_EscapeDash() {} void dAcEremly_c::initializeState_Wind() { if (field_0xB60 != 10 && field_0xB60 != 9) { - if (field_0xB60 == 21 || mAng::abs(getXZAngleToPlayer() - mAng(mRotation.y + 0x8000)) < 0x6000) { + if (field_0xB60 == 21 || mAng::absDiff2(getXZAngleToPlayer(), mRotation.y + 0x8000) < 0x6000) { mMdl.setAnm("RemlyWindBack", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 10; } else { @@ -1294,7 +1295,7 @@ void dAcEremly_c::executeState_Damage() { if (field_0xB14 != 0) { field_0xB4E = 8; s32 targetAngle = getXZAngleToPlayer() + 0x8000; - if (mAng::abs(mAng(targetAngle) - mAngle.y) > 0x1000) { + if (mAng::absDiff2(targetAngle, mAngle.y) > 0x1000) { sLib::addCalcAngle(mRotation.y.ref(), targetAngle, 1, 0x1000); } else { mRotation.y = targetAngle; @@ -1562,43 +1563,415 @@ void dAcEremly_c::initializeState_Hear() { } } } -void dAcEremly_c::executeState_Hear() {} +void dAcEremly_c::executeState_Hear() { + sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); + switch (field_0xB65) { + case 0: { + if (mSpeed < 0.2f && 0 == sLib::calcTimer(&field_0xB48)) { + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 1; + field_0xB66 = 0; + field_0xB65++; + } + } break; + case 1: { + if (!fn_177_6B10(false, 0) && fn_177_86C0()) { + if (field_0xB60 == 2 && mMdl.getAnm().isStop()) { + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 20.f); + field_0xB60 = 1; + } else { + if (field_0xB4C > 50) { + field_0xB4C = 50; + if (field_0xB60 == 1) { + mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 2; + } + } + fn_177_6EA0(false); + } + } else if (fn_177_73C0()) { + changeState(StateID_Escape); + field_0xB6A = 1; + } else { + if (field_0xB60 != 1) { + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f); + field_0xB60 = 1; + } + fn_177_8F90(); + fn_177_6FC0(true); + } + } break; + } +} void dAcEremly_c::finalizeState_Hear() {} -void dAcEremly_c::initializeState_NightSleepDemo() {} -void dAcEremly_c::executeState_NightSleepDemo() {} +void dAcEremly_c::initializeState_NightSleepDemo() { + mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 25; + mSph.ClrAtSet(); + mSph.ClrTgSet(); + mSph.ClrCoSet(); +} +void dAcEremly_c::executeState_NightSleepDemo() { + nightSleepDemoImpl(); +} void dAcEremly_c::finalizeState_NightSleepDemo() {} -void dAcEremly_c::initializeState_NightFoo() {} -void dAcEremly_c::executeState_NightFoo() {} +void dAcEremly_c::initializeState_NightFoo() { + mMdl.setAnm("RemlyFoo", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 28; + field_0xB48 = 12.f + cM::rndF(12.f); + field_0xB6D = 0; + field_0xB6E = 0; + field_0xB6B = 0; + mSph.ClrAtSet(); +} +void dAcEremly_c::executeState_NightFoo() { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + + fn_177_6FC0(false); + sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); + sLib::addCalcAngle(mAngle.y.ref(), getXZAngleToPlayer(), 2, 0x1000); + sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x1000); + if (field_0xB6D == 0) { + if (0 != sLib::calcTimer(&field_0xB48)) { + return; + } + if (mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) > 0x400) { + return; + } + } else { + if (!mNearbyBombRef.isLinked()) { + changeState(StateID_NightWait); + return; + } + if (pPlayer->getPosition().absXZTo(mPosition) > mNearbyBombRef.get()->mPosition.absXZTo(mPosition)) { + sLib::addCalcAngle( + mAngle.y.ref(), cLib::targetAngleY(mPosition, mNearbyBombRef.get()->mPosition), 2, 0x800 + ); + return; + } + } + if (field_0xB6E != 0) { + changeState(StateID_Fly); + return; + } + + if (field_0xB6B != 0 || pPlayer->mPosition.absXZTo(mStartingPos) > field_0xB08 + 500.f) { + changeState(StateID_NightRet); + return; + } + + if (mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x1000) { + changeState(StateID_NightJumpAttack); + if (!mAcch.ChkWallHit(nullptr) && fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) == 0) { + return; + } + field_0xB6E = 1; + } +} void dAcEremly_c::finalizeState_NightFoo() {} -void dAcEremly_c::initializeState_NightReflectionFoo() {} -void dAcEremly_c::executeState_NightReflectionFoo() {} +void dAcEremly_c::initializeState_NightReflectionFoo() { + mMdl.setAnm("RemlyFoo", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 28; + mMdl.setRate(0.f); + mSpeed *= -1.f; + field_0xB48 = 24.f + cM::rndF(24.f); + field_0xB6B = 0; + if (mAcch.ChkGndHit()) { + field_0xB6B = 1; + } + mSph.ClrAtSet(); +} +void dAcEremly_c::executeState_NightReflectionFoo() { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + fn_177_6FC0(false); + if (mAcch.ChkGndHit()) { + sLib::addCalcScaled(&mSpeed, 0.5f, 2.f); + if (field_0xB6B == 0) { + fn_177_8600(); + field_0xB6B = 1; + } + } + + if (!mMdl.getAnm().getRate()) { + if (mSpeed < 0.1f) { + mMdl.setRate(1.f); + } + return; + } + + if (pPlayer->isRecovering() || sLib::calcTimer(&field_0xB48)) { + return; + } + + if (pPlayer->mPosition.absXZTo(mStartingPos) > field_0xB08 + 500.f || !fn_177_9370(100.f)) { + changeState(StateID_NightRet); + } else { + changeState(StateID_NightRun); + field_0xB48 = 24.f + cM::rndF(24.f); + } +} void dAcEremly_c::finalizeState_NightReflectionFoo() {} -void dAcEremly_c::initializeState_NightWait() {} -void dAcEremly_c::executeState_NightWait() {} +void dAcEremly_c::initializeState_NightWait() { + fn_177_8520(true); + mMdl.setAnm("RemlyWaitStandNight", m3d::PLAY_MODE_4, 4.f); + field_0xB48 = 24.f + cM::rndF(24.f); + mSph.ClrAtSet(); +} +void dAcEremly_c::executeState_NightWait() { + if (mNearbyBombRef.isLinked()) { + changeState(StateID_NightRet); + return; + } + + if (fn_177_9370(0.f)) { + changeState(StateID_NightRun); + return; + } + + if (fn_177_86C0()) { + changeState(StateID_NightFoo); + field_0xB6D = 1; + return; + } + + if (0 == sLib::calcTimer(&field_0xB48)) { + changeState(StateID_NightWalk); + return; + } + + sLib::addCalcScaled(&mSpeed, 0.5f, 5.f); +} void dAcEremly_c::finalizeState_NightWait() {} -void dAcEremly_c::initializeState_NightWalk() {} -void dAcEremly_c::executeState_NightWalk() {} +// ??? +inline bool compareDistance(const mVec3_c &v0, const mVec3_c &v1, f32 f) { + return v0.squareDistanceToXZ(v1) > f * f; +} +void dAcEremly_c::initializeState_NightWalk() { + mMdl.setAnm("RemlyWalkNight", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 29; + + field_0xA44.set(mStartingPos); + + // odd + if (!compareDistance(mPosition, mStartingPos, field_0xB08)) { + field_0xA44.x += cM::rndFX(field_0xB08 * 0.5f); + field_0xA44.z += cM::rndFX(field_0xB08 * 0.5f); + } +} +void dAcEremly_c::executeState_NightWalk() { + fn_177_6B10(true, 0); + if (mNearbyBombRef.isLinked()) { + changeState(StateID_NightRet); + return; + } + + s32 idk = fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f); + if (idk != 0) { + field_0xA44.set(getStartingPosition()); + if (idk == 1) { + mAng a = cLib::targetAngleY(mPosition, getStartingPosition()); + if (mAng::absDiff2(mRotation.y, a) < 0x400) { + field_0xB6E = 1; + changeState(StateID_Fly); + return; + } + } + } + + if (fn_177_7040(2, 0.8f)) { + field_0xA44.set(mStartingPos); + if (idk == 0) { + field_0xA44.x += cM::rndFX(field_0xB08 * 0.5f); + field_0xA44.z += cM::rndFX(field_0xB08 * 0.5f); + } + } + + if (fn_177_9370(0.f)) { + changeState(StateID_NightRun); + } else if (fn_177_86C0()) { + changeState(StateID_NightFoo); + field_0xB6D = 1; + } +} void dAcEremly_c::finalizeState_NightWalk() {} -void dAcEremly_c::initializeState_NightRun() {} -void dAcEremly_c::executeState_NightRun() {} +void dAcEremly_c::initializeState_NightRun() { + mMdl.setAnm("RemlyRunFast", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 30; + field_0xB18 = 0; + field_0xB6B = 0; + mSph.ClrAtSet(); + mAcceleration = -3.f; + mMdl.setRate(1.5f); + field_0xB48 = 0; + fn_177_77C0(); +} +void dAcEremly_c::executeState_NightRun() { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + fn_177_6B10(false, 0); + + mMtx_c m; + mVec3_c in, out; + mVec3_c stuffs0, stuffs1; + + if (field_0xB6B == 0) { + // What... + const mVec3_c &target = dScGame_c::getCamera()->getTarget(); + f32 z = target.z; + f32 y = target.y; + f32 x = target.x; + stuffs0.x = x; + stuffs0.y = y; + stuffs1.z = z; + + if (fn_177_7040(2, 10.f)) { + field_0xB32 += field_0xB34; + } + + if (fn_177_8C20(mRotation.y)) { + changeState(StateID_NightFoo); + return; + } + + m.YrotS(field_0xB32); + in.set(0.f, 0.f, 320.f); + m.multVec(in, out); + out += pPlayer->mPosition; + field_0xA44.set(out); + } + + if (mNearbyBombRef.isLinked()) { + changeState(StateID_NightRet); + return; + } + + if (!fn_177_9370(100.f)) { + changeState(StateID_NightFoo); + field_0xB6B = 1; + return; + } + + if (0 == sLib::calcTimer(&field_0xB48) && isWithinPlayerRadius(400.f) && d3d::isOnScreen(mPosition)) { + field_0xB6B = 1; + } + + if (field_0xB6B) { + fn_177_7040(0, 5.0f); + if (field_0xB48 == 0) { + if (mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < mAng(4608.f + cM::rndF(4096.f))) { + changeState(StateID_NightFoo); + } + } + } +} void dAcEremly_c::finalizeState_NightRun() {} -void dAcEremly_c::initializeState_NightRet() {} -void dAcEremly_c::executeState_NightRet() {} +void dAcEremly_c::initializeState_NightRet() { + mMdl.setAnm("RemlyRunFast", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 30; + field_0xA44.set(mStartingPos); + field_0xB6B = 0; + field_0xB18 = 0; +} +void dAcEremly_c::executeState_NightRet() { + fn_177_6FC0(true); + if (mNearbyBombRef.isLinked()) { + mSpeed = 10.f; + f32 radius = 500.f; + mAngle.y = cLib::targetAngleY(mNearbyBombRef.get()->mPosition, mPosition); + sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800); + + if (mNearbyBombRef.get()->mPosition.squareDistanceToXZ(mPosition) > radius * radius) { + changeState(StateID_NightFoo); + field_0xB6D = 1; + } + return; + } + + if (fn_177_8C20(mRotation.y)) { + changeState(StateID_NightFoo); + field_0xB6E = 1; + return; + } + + if (fn_177_7040(2, 10.f)) { + changeState(StateID_NightWait); + } +} void dAcEremly_c::finalizeState_NightRet() {} -void dAcEremly_c::initializeState_NightJumpAttack() {} -void dAcEremly_c::executeState_NightJumpAttack() {} +void dAcEremly_c::initializeState_NightJumpAttack() { + mSpeed = 20.f; + mVelocity.y = 27.f + cM::rndF(3.f); + mSph.OnAtSet(); + mMdl.setAnm("RemlyJump", m3d::PLAY_MODE_4, 0.f); + field_0xB60 = 31; + field_0xB6E = 0; + field_0xB32 = 0; + field_0xB6B = 0; +} +void dAcEremly_c::executeState_NightJumpAttack() { + fn_177_6FC0(false); + if (mSph.ChkAtHit()) { + if (mSph.GetAtFlag0x8()) { + setBattleBgmRelated(0); + mSpeed = -20.f; + changeState(StateID_Stun); + return; + } + + if (mSph.GetAtFlag0x2()) { + changeState(StateID_NightReflectionFoo); + return; + } + } + + if (mAcch.ChkGndHit()) { + fn_177_8600(); + if (field_0xB6E != 0 && + (mAcch.ChkWallHit(nullptr) || fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) != 0)) { + changeState(StateID_NightFoo); + field_0xB6B = 1; + return; + } + changeState(StateID_NightRun); + field_0xB48 = 24.f + cM::rndF(24.f); + } +} void dAcEremly_c::finalizeState_NightJumpAttack() {} -void dAcEremly_c::initializeState_BirthWait() {} -void dAcEremly_c::executeState_BirthWait() {} +void dAcEremly_c::initializeState_BirthWait() { + field_0xB48 = 300; + unsetActorProperty(AC_PROP_0x1); + field_0xB64 = 2; + field_0xB68 = 0; + mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 0; +} +void dAcEremly_c::executeState_BirthWait() { + if (!sLib::calcTimer(&field_0xB48) && fn_177_7650(true)) { + mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z); + mOldPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z); + mPosition.y += 10.f; + mVelocity.set(0.f, 0.f, 0.f); + mSpeed = 0.f; + mAcceleration = -3.f; + setActorProperty(AC_PROP_0x1); + + if (fn_177_7330()) { + changeState(StateID_NightWait); + } else if (field_0xB61 == 1 && fn_177_75E0()) { + changeState(StateID_Wait); + } else { + changeState(StateID_Sleep); + } + } +} void dAcEremly_c::finalizeState_BirthWait() {} bool dAcEremly_c::fn_177_73C0() { From 5d27cfd9a517fc13342c3b9bef917647c66c8d0c Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 8 Apr 2026 23:52:22 -0400 Subject: [PATCH 15/16] dAcEremly_c:: oh thats a lot of changes --- config/SOUE01/rels/d_a_e_remlyNP/symbols.txt | 4 +- config/SOUE01/symbols.txt | 2 +- include/d/a/e/d_a_e_remly.h | 39 +- include/d/a/e/d_a_en_base.h | 2 +- include/d/a/obj/d_a_obj_base.h | 10 + include/d/d_player_act.h | 2 +- include/d/d_player_mdl.h | 2 +- include/m/m_angle.h | 5 + src/REL/d/a/e/d_a_e_remly.cpp | 659 +++++++++++++++++-- 9 files changed, 638 insertions(+), 87 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt index 4254c2bd..bf3e6b48 100644 --- a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt @@ -95,7 +95,7 @@ initializeState_BirthWait__11dAcEremly_cFv = .text:0x00006870; // type:function executeState_BirthWait__11dAcEremly_cFv = .text:0x000068F0; // type:function size:0x13C finalizeState_BirthWait__11dAcEremly_cFv = .text:0x00006A30; // type:function size:0x4 fn_177_6A40 = .text:0x00006A40; // type:function size:0xCC -fn_177_6B10 = .text:0x00006B10; // type:function size:0x38C +fn_177_6B10__11dAcEremly_cFbRC4mAng = .text:0x00006B10; // type:function size:0x38C fn_177_6EA0 = .text:0x00006EA0; // type:function size:0x120 fn_177_6FC0 = .text:0x00006FC0; // type:function size:0x78 fn_177_7040 = .text:0x00007040; // type:function size:0x2EC @@ -103,7 +103,7 @@ fn_177_7330 = .text:0x00007330; // type:function size:0x90 fn_177_73C0 = .text:0x000073C0; // type:function size:0x144 fn_177_7510 = .text:0x00007510; // type:function size:0xC8 fn_177_75E0 = .text:0x000075E0; // type:function size:0x6C -fn_177_7650 = .text:0x00007650; // type:function size:0x164 +fn_177_7650__11dAcEremly_cCFb = .text:0x00007650; // type:function size:0x164 fn_177_77C0 = .text:0x000077C0; // type:function size:0x108 fn_177_78D0 = .text:0x000078D0; // type:function size:0xF4 fn_177_79D0 = .text:0x000079D0; // type:function size:0x134 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 19e43777..faa037fc 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2722,7 +2722,7 @@ getBodyMtx__19daPlayerModelBase_cFP6mMtx_ci = .text:0x800614F0; // type:function getCurrentCarriedActor__19daPlayerModelBase_cFv = .text:0x80061510; // type:function size:0x8 scope:weak vt_0x0F4__19daPlayerModelBase_cCFv = .text:0x80061520; // type:function size:0x8 scope:weak vt_0x0F0__19daPlayerModelBase_cCFv = .text:0x80061530; // type:function size:0x8 scope:weak -vt_0x0EC__19daPlayerModelBase_cCFv = .text:0x80061540; // type:function size:0x8 scope:weak +getHeadTranslation__19daPlayerModelBase_cCFv = .text:0x80061540; // type:function size:0x8 scope:weak vt_0x0E8__19daPlayerModelBase_cCFv = .text:0x80061550; // type:function size:0x8 scope:weak getCenterTranslation__19daPlayerModelBase_cCFv = .text:0x80061560; // type:function size:0x8 scope:weak canBlockAttack__19daPlayerModelBase_cFv = .text:0x80061570; // type:function size:0x8 scope:weak diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index 9629855c..f90d622d 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -24,7 +24,7 @@ public: virtual ~callback_c() {} virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; - /* 0x04 */ mAng3_c mAng; + /* 0x04 */ mAng3_c mHeadRotation; /* 0x0C */ UNKWORD field_0x0C; // Guess }; @@ -50,6 +50,18 @@ public: STATE_18 = 18, STATE_19 = 19, STATE_20 = 20, + STATE_21 = 21, + STATE_22 = 22, + STATE_23 = 23, + STATE_24 = 24, + STATE_25 = 25, + STATE_26 = 26, + STATE_27 = 27, + STATE_28 = 28, + STATE_29 = 29, + STATE_30 = 30, + STATE_31 = 31, + STATE_32 = 32, }; public: @@ -93,17 +105,16 @@ public: STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEremly_c); private: - void fn_177_6A40(); - bool fn_177_6B10(bool, mAng); + void playWink(); + bool fn_177_6B10(bool lookAtTarget, const mAng &); void fn_177_6EA0(bool); - void fn_177_6FC0(bool); + void adjustHeadRotation(bool); - bool fn_177_7040(s32, f32); + bool fn_177_7040(u32, f32); - // Checks if Batreaux is Human - bool fn_177_7330(); + bool isScary(); - bool fn_177_73C0(); + bool shouldBeScared(); bool fn_177_7510(f32); @@ -111,14 +122,14 @@ private: /** false -> comapres to camera * true -> compares to player */ - bool fn_177_7650(bool comparePlayer); + bool fn_177_7650(bool comparePlayer) const; void fn_177_77C0(); // Set Scary Face void fn_177_78D0(); - bool fn_177_79D0(bool); + void fn_177_79D0(bool); bool fn_177_7B10(); void nightSleepDemoImpl(); @@ -150,7 +161,7 @@ private: /* 0xA2C */ dAcRef_c mRef1; // Temporary until type known /* 0xA38 */ dAcRef_c mNearbyBombRef; - /* 0xA44 */ mVec3_c field_0xA44; + /* 0xA44 */ mVec3_c mTargetPosition; /* 0xA50 */ mVec3_c field_0xA50; /* 0xA5C */ dWaterEffect_c mWaterEffect; @@ -171,7 +182,9 @@ private: /* 0xB1E */ mAng3_c field_0xB1E; /* 0xB24 */ s16 field_0xB24; /* 0xB26 */ s16 field_0xB26; - /* 0xB28 */ u8 _B28[0xB32 - 0xB28]; + /* 0xB26 */ u32 field_0xB28; + /* 0xB2C */ s32 field_0xB2C; + /* 0xB30 */ mAng field_0xB30; /* 0xB32 */ mAng field_0xB32; /* 0xB34 */ mAng field_0xB34; /* 0xB38 */ f32 field_0xB38; @@ -180,7 +193,7 @@ private: /* 0xB44 */ u16 field_0xB44; /* 0xB46 */ u16 field_0xB46; /* 0xB48 */ u16 field_0xB48; - /* 0xB4A */ u16 field_0xB4A; + /* 0xB4A */ u16 mWinkTimer; /* 0xB4C */ u16 field_0xB4C; /* 0xB4E */ u16 field_0xB4E; /* 0xB50 */ u16 field_0xB50; diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index 81ef2761..77eb12e4 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -71,7 +71,7 @@ public: // Deals with dealing damage to Enemy // Returns a value 0-13 (similar to mStts rank?) int fn_8002fde0(cCcD_Obj &mCc, u16 *pTgOut); - + void fn_80030030(const mVec3_c &pos, s16 &, s16 &, f32); // Returns 0-3 based on collision int fn_800301b0(const mVec3_c &pos, mAng ang, bool, f32); void fn_80030400(m3d::mdl_c &, u8, bool, u8); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 272f9ec0..ff29770a 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -95,9 +95,15 @@ public: mVec3_c &getOldPosition() { return mOldPosition; } + void setOldPosition(const mVec3_c &v) { + mOldPosition = v; + } mVec3_c &getStartingPosition() { return mStartingPos; } + void setStartingPosition(const mVec3_c &v) { + mStartingPos = v; + } mVec3_c &getVelocity() { return mVelocity; } @@ -105,6 +111,10 @@ public: return mAngle; } + void setStartingRotation(const mAng3_c &v) { + mStartingRot = v; + } + f32 getVelocityMag() const { return fabsf(nw4r::math::VEC3LenSq(mVelocity)); } diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index 4df6e4db..1d4a0096 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -95,7 +95,7 @@ public: // unused; overridden by daPlayerModelBase_c return mVec3_c::Zero; } - /* vt 0x0EC */ virtual const mVec3_c &vt_0x0EC() const { + /* vt 0x0EC */ virtual const mVec3_c &getHeadTranslation() const { // unused; overridden by daPlayerModelBase_c return mVec3_c::Zero; } diff --git a/include/d/d_player_mdl.h b/include/d/d_player_mdl.h index c52ab8f6..a01d0a5a 100644 --- a/include/d/d_player_mdl.h +++ b/include/d/d_player_mdl.h @@ -824,7 +824,7 @@ public: /* vt 0x0E8 */ virtual const mVec3_c &vt_0x0E8() const override { return field_0x12F4; } - /* vt 0x0EC */ virtual const mVec3_c &vt_0x0EC() const override { + /* vt 0x0EC */ virtual const mVec3_c &getHeadTranslation() const override { return mHeadTranslation; } /* vt 0x0F0 */ virtual const mVec3_c &vt_0x0F0() const override { diff --git a/include/m/m_angle.h b/include/m/m_angle.h index d952b612..4aea9f51 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -53,6 +53,11 @@ public: return *this; } + template + bool operator==(const T other) { + return mVal == other; + } + public: static s32 abs(const mAng b) { return labs(b); 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 4f1ccd14..8d80ef03 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -10,17 +10,22 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_bomb.h" #include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/bg/d_bg_s_wtr_chk.h" #include "d/col/c/c_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/d_camera.h" +#include "d/d_light_env.h" #include "d/d_linkage.h" #include "d/d_sc_game.h" #include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" #include "d/snd/d_snd_wzsound.h" #include "d/t/d_t_stream.h" #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" +#include "m/m3d/m3d.h" #include "m/m3d/m_fanm.h" #include "m/m3d/m_smdl.h" #include "m/m_angle.h" @@ -32,6 +37,7 @@ #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resnode.h" #include "nw4r/math/math_arithmetic.h" +#include "rvl/GX/GXTypes.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" #include "toBeSorted/d_d3d.h" @@ -97,9 +103,8 @@ struct dAcEremly_HIO_c { static const dAcEremly_HIO_c sInstance; }; const dAcEremly_HIO_c dAcEremly_HIO_c::sInstance = { - 1.f, 1000.f, 500.0f, 200.0f, 120.0f, 250.0f, 400.0f, 400.0f, 600.0f, 0.8f, 5.0f, 20.0f, 10.0f, -8.0f, 20.0f, 7.0f, - 15.0f, 50.0f, 30, 1000.f, 300.f, 8.f, 1.3f, 300, 300, 30, 90, 90, 40.f, 0.f - + 1.f, 1000.f, 500.0f, 200.0f, 120.0f, 250.0f, 400.0f, 400.0f, 600.0f, 0.8f, 5.0f, 20.0f, 10.0f, -8.0f, 20.0f, + 7.0f, 15.0f, 50.0f, 30, 1000.f, 300.f, 8.f, 1.3f, 300, 300, 30, 90, 90, 40.f, 0.f, }; STATE_DEFINE(dAcEremly_c, Wait); @@ -133,7 +138,7 @@ void dAcEremly_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *resu if (nodeId == headNode) { mMtx_c m; result->GetMtx(m); - m.ZXYrotM(mAng); + m.ZXYrotM(mHeadRotation); result->SetMtx(m); } } @@ -181,7 +186,7 @@ int dAcEremly_c::actorCreate() { mSph.Set(sSphSrc); mSph.SetStts(mStts); - mMdlCallback.mAng.clear(); + mMdlCallback.mHeadRotation.clear(); mMdl.getModel().setScale(mScale); mMdl.play(); @@ -194,7 +199,7 @@ int dAcEremly_c::actorCreate() { mLinkage.set(0, 0.f, 0.f, 0.f, nullptr); mStartingPos.set(mPosition.x, mPosition.y, mPosition.z); - field_0xA44.set(mPosition.x, mPosition.y, mPosition.z); + mTargetPosition.set(mPosition.x, mPosition.y, mPosition.z); field_0xB38 = mPosition.y; mStartingRot = mRotation; @@ -226,7 +231,7 @@ int dAcEremly_c::actorCreate() { mTargetFiTextID = 0; } - if (!fn_177_7330()) { + if (!isScary()) { setBattleBgmRelated(0); changeState(StateID_Sleep); mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 0.f); @@ -334,7 +339,7 @@ int dAcEremly_c::actorExecute() { if (isState(StateID_EscapeDash) || isState(StateID_Water) || isState(StateID_Scared)) { if (fn_177_7650(false)) { - if (fn_177_7330()) { + if (isScary()) { deleteRequest(); return SUCCEEDED; } @@ -421,7 +426,7 @@ int dAcEremly_c::actorExecute() { field_0xAF8 *= 0.7f; } - if (fn_177_7330()) { + if (isScary()) { if (field_0xB64 == 0 || fn_177_8AC0()) { if (field_0xB40 != 1.0f) { field_0xB54 = 7; @@ -504,7 +509,7 @@ int dAcEremly_c::actorExecute() { mMdl.getModel().setLocalMtx(mWorldMtx); mMdl.getModel().calc(false); - fn_177_6A40(); + playWink(); f32 radius = 40.f + _weird_zero; mVec3_c center; @@ -526,7 +531,7 @@ int dAcEremly_c::actorExecute() { dCcS::GetInstance()->Set(&mSph); - if (!(fn_177_7330() && field_0xB64) // Check Batreaux Human + if (!(isScary() && 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); @@ -553,7 +558,7 @@ int dAcEremly_c::actorExecute() { } if (!isState(StateID_Hold)) { - if (!fn_177_7330()) { + if (!isScary()) { setInteractionFlags(INTERACT_0x2000); } fn_80030c20(3, 600.f, radius, -400.f, 400.f); @@ -614,7 +619,7 @@ void dAcEremly_c::executeState_Wait() { } sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); - if (fn_177_7330()) { + if (isScary()) { changeState(StateID_EscapeDash); return; } @@ -631,9 +636,9 @@ void dAcEremly_c::executeState_Wait() { return; } - if (fn_177_73C0()) { + if (shouldBeScared()) { if (field_0xB6E == 0) { - if (fn_800301b0(mPositionCopy2, mRotation.y + 0x8000, true, 140.f) != 0 /* TODO: Enum?*/) { + if (fn_800301b0(mPositionCopy2, mRotation.y + 0x8000, true, 140.f) != 0) { field_0xB6E = 1; } else if (isWithinPlayerRadius(600.f) || mNearbyBombRef.isLinked()) { changeState(StateID_Escape); @@ -646,7 +651,7 @@ void dAcEremly_c::executeState_Wait() { changeState(StateID_Scared); } } - } else if (fn_177_6B10(0, 0)) { + } else if (fn_177_6B10(false, 0)) { changeState(StateID_Escape); field_0xB6A = 1; field_0xB48 = 20; @@ -658,7 +663,7 @@ void dAcEremly_c::executeState_Wait() { } field_0xB6E = 0; - fn_177_6B10(0, 0); + fn_177_6B10(false, 0); if (field_0xB56 != 0 || fn_177_8F90()) { return; } @@ -732,13 +737,13 @@ void dAcEremly_c::executeState_Walk() { bool b0 = false; const dAcPy_c *pPlayer = dAcPy_c::GetLink(); - fn_177_6FC0(true); + adjustHeadRotation(true); if (fn_177_86C0()) { return; } - if (!field_0xB6A && mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x4000 && fn_177_73C0() && + if (!field_0xB6A && mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x4000 && shouldBeScared() && field_0xB6E == 0) { changeState(StateID_Escape); field_0xB6A = 1; @@ -751,7 +756,7 @@ void dAcEremly_c::executeState_Walk() { mVec3_c in(0.f, 0.f, 180.f), out; m.multVec(in, out); out += pPlayer->mPosition; - field_0xA44.set(out); + mTargetPosition.set(out); if (fn_177_7040(2, 0.8f)) { field_0xB32 += field_0xB34; @@ -777,7 +782,7 @@ void dAcEremly_c::executeState_Walk() { fn_177_6B10(false, 0); if (fn_177_75E0()) { - field_0xA44.set(mRef1.get()->mPosition); + mTargetPosition.set(mRef1.get()->mPosition); fn_177_7040(2, 0.8f); } else { fn_177_7040(0, 0.8f); @@ -812,12 +817,12 @@ void dAcEremly_c::initializeState_Run() { field_0xB66 = 1; } void dAcEremly_c::executeState_Run() { - fn_177_6FC0(true); + adjustHeadRotation(true); fn_177_6B10(false, 0); if (fn_177_86C0()) { return; } - if (fn_177_73C0()) { + if (shouldBeScared()) { if (isWithinPlayerRadius(600.f)) { changeState(StateID_Escape); field_0xB6A = 1; @@ -827,7 +832,7 @@ void dAcEremly_c::executeState_Run() { return; } if (fn_177_75E0()) { - field_0xA44.set(mRef1.get()->mPosition); + mTargetPosition.set(mRef1.get()->mPosition); fn_177_7040(2, 5.f); } else { fn_177_7040(0, 5.f); @@ -853,7 +858,7 @@ void dAcEremly_c::initializeState_Escape() { void dAcEremly_c::executeState_Escape() { s32 _weird_zero = 0; - fn_177_6FC0(false); + adjustHeadRotation(false); if (0 == sLib::calcTimer(&field_0xB48)) { fn_177_7040(1, 20.f); } else { @@ -892,7 +897,7 @@ void dAcEremly_c::initializeState_EscapeDash() { field_0xB18 = 0; } void dAcEremly_c::executeState_EscapeDash() { - fn_177_6FC0(false); + adjustHeadRotation(false); // Idk s32 a = getXZAngleToPlayer() + 0x8000; @@ -906,7 +911,7 @@ void dAcEremly_c::executeState_EscapeDash() { } if (field_0xB6B != 0) { - mVec3_c v(mPosition); + mVec3_c v(getPosition()); sLib::addCalcScaledDiff(&mSpeed, 30.f, 0.7f, 3.f); if (fn_177_8C20(mRotation.y)) { @@ -932,7 +937,7 @@ void dAcEremly_c::initializeState_Wind() { field_0xB48 = 11; } void dAcEremly_c::executeState_Wind() { - fn_177_6FC0(false); + adjustHeadRotation(false); sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); if (field_0xB60 == 9) { fn_177_7040(0, 0.f); @@ -948,7 +953,7 @@ void dAcEremly_c::executeState_Wind() { return; } - if (!fn_177_7330()) { + if (!isScary()) { field_0xB66 = 1; changeState(StateID_Wait); @@ -984,12 +989,12 @@ void dAcEremly_c::initializeState_Hold() { field_0xB1E.clear(); field_0xB26 = 0; field_0xB24 = 0; - if (fn_177_7330() || field_0xB68) { + if (isScary() || field_0xB68) { mMdl.setAnm("RemlyHoldBata", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 13; } - if (fn_177_7330()) { + if (isScary()) { field_0xB64 = 2; field_0xB68 = 0; } @@ -1006,7 +1011,7 @@ void dAcEremly_c::initializeState_Hold() { field_0xB4E = 90; } void dAcEremly_c::executeState_Hold() { - fn_177_6FC0(false); + adjustHeadRotation(false); field_0xB4E = 90; mRotation.y = mAngle.y = getXZAngleToPlayer(); @@ -1035,7 +1040,7 @@ void dAcEremly_c::executeState_Hold() { return; } - if (fn_177_7330()) { + if (isScary()) { mAcceleration = -3.f; changeState(StateID_NightFoo); } else if (field_0xB68 == 0) { @@ -1078,7 +1083,7 @@ void dAcEremly_c::executeState_Jump() { setActorProperty(AC_PROP_0x1); mAcceleration = -3.f; - if (fn_177_7330()) { + if (isScary()) { changeState(StateID_NightFoo); } else if (field_0xB68 == 0) { changeState(StateID_Wait); @@ -1107,7 +1112,7 @@ void dAcEremly_c::initializeState_Fly() { field_0xB14 = 0; field_0xB68 = 0; - if (fn_177_7330()) { + if (isScary()) { field_0xB64 = 2; } else { field_0xB64 = 1; @@ -1136,7 +1141,7 @@ void dAcEremly_c::executeState_Fly() { return; } - fn_177_6FC0(false); + adjustHeadRotation(false); if (field_0xB60 == 17 && mMdl.getAnm().isStop()) { mMdl.setAnm("RemlyFly", m3d::PLAY_MODE_4, 4.f); @@ -1230,7 +1235,7 @@ void dAcEremly_c::executeState_Fly() { field_0xB64 = 0; changeState(StateID_Scared); } else { - if (fn_177_7330()) { + if (isScary()) { changeState(StateID_NightWait); } else { mMdl.setAnm("RemlyWakeUp", m3d::PLAY_MODE_4, 4.f); @@ -1263,7 +1268,7 @@ void dAcEremly_c::initializeState_Damage() { field_0xB14 = 1; } - if (!fn_177_7330()) { + if (!isScary()) { mSpeed = 7.f; } else { mSpeed = 15.f; @@ -1308,7 +1313,7 @@ void dAcEremly_c::executeState_Damage() { field_0xB6B = 1; } else { mAngle.y = mRotation.y; - if (fn_177_7330() && field_0xB64 != 0) { + if (isScary() && field_0xB64 != 0) { if (fn_177_9370(100.f)) { changeState(StateID_NightRun); } else { @@ -1326,7 +1331,7 @@ void dAcEremly_c::initializeState_Sleep() { mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 19; mTexPat.setFrame(2.f, 0); - mMdlCallback.mAng.clear(); + mMdlCallback.mHeadRotation.clear(); } void dAcEremly_c::executeState_Sleep() { if (field_0xB60 == 20) { @@ -1351,16 +1356,16 @@ void dAcEremly_c::initializeState_Scared() { mStts.SetRank(11); } void dAcEremly_c::executeState_Scared() { - if (fn_177_7330()) { + if (isScary()) { return; } fn_177_86C0(); if (mMdl.getAnm().getRate()) { - fn_177_6FC0(false); + adjustHeadRotation(false); } else if (field_0xB64) { - sLib::addCalcAngle(mMdlCallback.mAng.z.ref(), 8000, 20, 0x100); - if (field_0xB14 > 80 && !fn_177_73C0()) { + sLib::addCalcAngle(mMdlCallback.mHeadRotation.z.ref(), 8000, 20, 0x100); + if (field_0xB14 > 80 && !shouldBeScared()) { field_0xB68 = 0; field_0xB66 = 1; changeState(StateID_Wait); @@ -1373,7 +1378,7 @@ void dAcEremly_c::executeState_Scared() { return; } - if (!fn_177_73C0()) { + if (!shouldBeScared()) { if (++field_0xB14 > 30) { mMdl.setRate(0.f); } @@ -1397,7 +1402,7 @@ void dAcEremly_c::initializeState_Stun() { field_0xB6B = 1; } - if (!fn_177_7330()) { + if (!isScary()) { field_0xB64 = 0; } @@ -1431,7 +1436,7 @@ void dAcEremly_c::executeState_Stun() { } if (mMdl.getAnm().isStop()) { mStts.SetRank(5); - if (fn_177_7330()) { + if (isScary()) { if (fn_177_9370(100.f)) { changeState(StateID_NightRun); } else { @@ -1468,7 +1473,7 @@ void dAcEremly_c::initializeState_Water() { mSph.ClrAtSet(); field_0xB68 = 0; - if (!fn_177_7330()) { + if (!isScary()) { field_0xB64 = 1; } else { field_0xB64 = 2; @@ -1484,7 +1489,7 @@ void dAcEremly_c::initializeState_Water() { void dAcEremly_c::executeState_Water() { s32 _weird_zero = 0; - fn_177_6FC0(false); + adjustHeadRotation(false); if (field_0xB6B) { mVec3_c out(mVec3_c::Zero); mVec3_c pos; @@ -1511,7 +1516,7 @@ void dAcEremly_c::executeState_Water() { field_0xB60 = 7; } else if (field_0xB60 == 8 || mMdl.getAnm().isStop()) { - if (fn_177_7330()) { + if (isScary()) { field_0xB6E = 1; changeState(StateID_Fly); } else { @@ -1589,7 +1594,7 @@ void dAcEremly_c::executeState_Hear() { } fn_177_6EA0(false); } - } else if (fn_177_73C0()) { + } else if (shouldBeScared()) { changeState(StateID_Escape); field_0xB6A = 1; } else { @@ -1598,7 +1603,7 @@ void dAcEremly_c::executeState_Hear() { field_0xB60 = 1; } fn_177_8F90(); - fn_177_6FC0(true); + adjustHeadRotation(true); } } break; } @@ -1629,7 +1634,7 @@ void dAcEremly_c::initializeState_NightFoo() { void dAcEremly_c::executeState_NightFoo() { const dAcPy_c *pPlayer = dAcPy_c::GetLink(); - fn_177_6FC0(false); + adjustHeadRotation(false); sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); sLib::addCalcAngle(mAngle.y.ref(), getXZAngleToPlayer(), 2, 0x1000); sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x1000); @@ -1686,7 +1691,7 @@ void dAcEremly_c::initializeState_NightReflectionFoo() { } void dAcEremly_c::executeState_NightReflectionFoo() { const dAcPy_c *pPlayer = dAcPy_c::GetLink(); - fn_177_6FC0(false); + adjustHeadRotation(false); if (mAcch.ChkGndHit()) { sLib::addCalcScaled(&mSpeed, 0.5f, 2.f); if (field_0xB6B == 0) { @@ -1755,12 +1760,12 @@ void dAcEremly_c::initializeState_NightWalk() { mMdl.setAnm("RemlyWalkNight", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 29; - field_0xA44.set(mStartingPos); + mTargetPosition.set(mStartingPos); // odd if (!compareDistance(mPosition, mStartingPos, field_0xB08)) { - field_0xA44.x += cM::rndFX(field_0xB08 * 0.5f); - field_0xA44.z += cM::rndFX(field_0xB08 * 0.5f); + mTargetPosition.x += cM::rndFX(field_0xB08 * 0.5f); + mTargetPosition.z += cM::rndFX(field_0xB08 * 0.5f); } } void dAcEremly_c::executeState_NightWalk() { @@ -1772,7 +1777,7 @@ void dAcEremly_c::executeState_NightWalk() { s32 idk = fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f); if (idk != 0) { - field_0xA44.set(getStartingPosition()); + mTargetPosition.set(getStartingPosition()); if (idk == 1) { mAng a = cLib::targetAngleY(mPosition, getStartingPosition()); if (mAng::absDiff2(mRotation.y, a) < 0x400) { @@ -1784,10 +1789,10 @@ void dAcEremly_c::executeState_NightWalk() { } if (fn_177_7040(2, 0.8f)) { - field_0xA44.set(mStartingPos); + mTargetPosition.set(mStartingPos); if (idk == 0) { - field_0xA44.x += cM::rndFX(field_0xB08 * 0.5f); - field_0xA44.z += cM::rndFX(field_0xB08 * 0.5f); + mTargetPosition.x += cM::rndFX(field_0xB08 * 0.5f); + mTargetPosition.z += cM::rndFX(field_0xB08 * 0.5f); } } @@ -1842,7 +1847,7 @@ void dAcEremly_c::executeState_NightRun() { in.set(0.f, 0.f, 320.f); m.multVec(in, out); out += pPlayer->mPosition; - field_0xA44.set(out); + mTargetPosition.set(out); } if (mNearbyBombRef.isLinked()) { @@ -1874,12 +1879,12 @@ void dAcEremly_c::finalizeState_NightRun() {} void dAcEremly_c::initializeState_NightRet() { mMdl.setAnm("RemlyRunFast", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 30; - field_0xA44.set(mStartingPos); + mTargetPosition.set(mStartingPos); field_0xB6B = 0; field_0xB18 = 0; } void dAcEremly_c::executeState_NightRet() { - fn_177_6FC0(true); + adjustHeadRotation(true); if (mNearbyBombRef.isLinked()) { mSpeed = 10.f; f32 radius = 500.f; @@ -1916,7 +1921,7 @@ void dAcEremly_c::initializeState_NightJumpAttack() { field_0xB6B = 0; } void dAcEremly_c::executeState_NightJumpAttack() { - fn_177_6FC0(false); + adjustHeadRotation(false); if (mSph.ChkAtHit()) { if (mSph.GetAtFlag0x8()) { setBattleBgmRelated(0); @@ -1963,7 +1968,7 @@ void dAcEremly_c::executeState_BirthWait() { mAcceleration = -3.f; setActorProperty(AC_PROP_0x1); - if (fn_177_7330()) { + if (isScary()) { changeState(StateID_NightWait); } else if (field_0xB61 == 1 && fn_177_75E0()) { changeState(StateID_Wait); @@ -1974,8 +1979,192 @@ void dAcEremly_c::executeState_BirthWait() { } void dAcEremly_c::finalizeState_BirthWait() {} -bool dAcEremly_c::fn_177_73C0() { - if (isState(StateID_Sleep) || fn_177_7330() || field_0xB68) { +void dAcEremly_c::playWink() { + if (isState(StateID_Sleep)) { + return; + } + + if (sLib::calcTimer(&mWinkTimer)) { + mTexPat.play(); + } else { + mWinkTimer = 40.f + cM::rndF(120.f); + mTexPat.setFrame(0.f, 0); + } +} + +// NONMATCHING +bool dAcEremly_c::fn_177_6B10(bool lookAtTarget, const mAng &range) { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + + mAng angleTargetX, angleTargetY; + if (lookAtTarget) { + angleTargetX = cLib::targetAngleX(mPosition, mTargetPosition) * 0.7f; + + angleTargetY = (mAng)cLib::targetAngleY(mPosition, mTargetPosition); + angleTargetY -= mRotation.y; + } else { + angleTargetX = cLib::targetAngleX(mPosition, pPlayer->getHeadTranslation()) * 0.7f; + + angleTargetY = getXZAngleToPlayer(); + angleTargetY -= mRotation.y; + } + + mVec3_c outpos; + if (!dLightEnv_c::GetPInstance()->check_BPM8(&mPosition, &outpos)) { + // TODO - Return type pPlayer->vt_0x1C0() + dAcBase_c *pActor = static_cast(pPlayer->vt_0x1C0()); + if (pActor) { + field_0xA50.set(pActor->mPosition); + field_0xB56 = 30; + } + } + + if (sLib::calcTimer(&field_0xB56)) { + angleTargetX = cLib::targetAngleX(mPosition, field_0xA50) * 0.7f; + angleTargetY = (mAng)cLib::targetAngleY(mPosition, field_0xA50); + angleTargetY -= mRotation.y; + } + + if (fn_177_75E0()) { + outpos.set(mRef1.get()->mPosition); + outpos.y += 100.f; + + angleTargetX = cLib::targetAngleX(mPosition, outpos) * 0.7f; + angleTargetY = (mAng)cLib::targetAngleY(mPosition, outpos); + angleTargetY -= mRotation.y; + fn_177_79D0(true); + } + + if (angleTargetX < 0) { + angleTargetY = 0; + } else if (angleTargetX > 2500) { + angleTargetX = 2500; + } + sLib::addCalcAngle(mMdlCallback.mHeadRotation.z.ref(), angleTargetX, 2, 0x800); + if (field_0xB60 == 2) { + return false; + } + + bool b = false; + s32 t0 = range + 8000; + if (isState(StateID_Wait) || isState(StateID_Walk)) { + t0 = range + 6000; + } + s16 t = t0; + + if (angleTargetY < -t) { + angleTargetY = -t; + b = true; + } else if (angleTargetY > t) { + angleTargetY = t; + b = true; + } + sLib::addCalcAngle(mMdlCallback.mHeadRotation.y.ref(), angleTargetY, 2, 0x800); + return b; +} + +void dAcEremly_c::fn_177_6EA0(bool b) { + if (!b && shouldBeScared()) { + return; + } + + if (!sLib::calcTimer(&field_0xB4C)) { + field_0xB4C = 100.f + cM::rndF(100.f); + if (cM::rnd() < 0.3f) { + field_0xB30 = 0; + } else if (field_0xB30 == 0) { + if (cM::rnd() < 0.5f) { + field_0xB30 = 5000; + } else { + field_0xB30 = -5000; + } + } else { + field_0xB30 *= -1; + field_0xB4C = 50.f + cM::rndF(100.f); + } + } + sLib::addCalcAngle(mMdlCallback.mHeadRotation.x.ref(), field_0xB30, 10, 0x200); +} + +void dAcEremly_c::adjustHeadRotation(bool bOnlyRotX) { + sLib::addCalcAngle(mMdlCallback.mHeadRotation.x.ref(), 0, 2, 0x400); + if (!bOnlyRotX) { + sLib::addCalcAngle(mMdlCallback.mHeadRotation.y.ref(), 0, 2, 0x400); + sLib::addCalcAngle(mMdlCallback.mHeadRotation.z.ref(), 0, 2, 0x400); + } +} + +// I do not like how this is written and somehow it matches +bool dAcEremly_c::fn_177_7040(u32 param0, f32 f) { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + + f32 f0; + s16 targetAngle; + s16 targetRatio; + s16 targetStepSize; + + targetAngle = getXZAngleToPlayer(); + if (param0 != 2) { + mTargetPosition.set(pPlayer->mPosition); + } + + if (param0 == 1) { + targetAngle += 0x8000; + } else if (param0 == 2) { + targetAngle = cLib::targetAngleY(mPosition, mTargetPosition); + } + + f0 = mAng(mAng::abs(mAngle.y - targetAngle)).sin(); + targetRatio = 4.f - std::abs(f0 * 2.f); + + f0 = mAng(mAng::abs(mAngle.y - targetAngle)).sin(); + targetStepSize = 2048.f + std::abs(f0 * 512.f); + + if (field_0xB60 == 29 || field_0xB60 == 4) { + f32 f = mAng(mAng::abs(mAngle.y - targetAngle)).sin(); + mMdl.setRate(f * 4.f + 1.f); + targetRatio = 10; + targetStepSize = 0x400; + } + + if (field_0xB60 == 4) { + f32 f = mAng(mAng::abs(mAngle.y - targetAngle)).sin(); + mMdl.setRate(f + 1.f); + targetRatio = 5; + targetStepSize = 0x400; + } + + if (field_0xB60 == 9 || mNearbyBombRef.isLinked()) { + targetRatio = 1; + targetStepSize = 0x2000; + } + + sLib::addCalcAngle(mAngle.y.ref(), targetAngle, targetRatio, targetStepSize); + f0 = 1.5f; + f0 -= std::abs(mAng(mAng::abs(mAngle.y - targetAngle)).sin()); + sLib::addCalcScaledDiff(&mSpeed, f * f0, 0.7f, 3.f); + if (mTargetPosition.squareDistanceToXZ(mPosition) < 10000.f) { + return true; + } else { + return false; + } +} + +bool dAcEremly_c::isScary() { + if (StoryflagManager::sInstance->getFlag(STORYFLAG_GRATITUDE_QUEST_FINISHED) && + (dScGame_c::isCurrentStage("F000") || dScGame_c::isCurrentStage("D000"))) { + return false; + } + + if (dScGame_c::currentSpawnInfo.isNight()) { + return true; + } + + return false; +} + +bool dAcEremly_c::shouldBeScared() { + if (isState(StateID_Sleep) || isScary() || field_0xB68) { return false; } @@ -1993,3 +2182,337 @@ bool dAcEremly_c::fn_177_73C0() { field_0xB6C = 0; return false; } + +bool dAcEremly_c::fn_177_7510(f32 radius) { + if (fn_177_75E0()) { + mTargetPosition.set(mRef1.get()->getPosition()); + if (mTargetPosition.squareDistanceToXZ(mPosition) < radius * radius) { + return true; + } + } + + if (isWithinPlayerRadius(radius)) { + return true; + } + + return false; +} + +bool dAcEremly_c::fn_177_75E0() { + if (mRef1.isLinked() && mSleepDemoPlayedSceneflag != 0xFF) { + if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSleepDemoPlayedSceneflag)) { + return true; + } + } + return false; +} + +bool dAcEremly_c::fn_177_7650(bool comparePlayer) const { + f32 radius = 0.f; + mVec3_c pos = mPosition; + + if (comparePlayer) { + pos.set(mStartingPos); + } + + if (d3d::isOnScreen(pos)) { + return false; + } + + radius = 40.f; + radius *= 100.f; + if (comparePlayer) { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + return pPlayer->mPosition.squareDistanceToXZ(pos) > radius * radius; + } else { + mVec3_c camPos = dScGame_c::getCamera()->getPosition(); + return camPos.squareDistanceToXZ(pos) > radius * radius; + } +} + +// NONMATCHING +void dAcEremly_c::fn_177_77C0() { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + mAng a0 = getXZAngleToPlayer() + -0x7800; + mAng a1 = getXZAngleToPlayer() + 0x7800; + + field_0xB32 = getXZAngleToPlayer() + 0x8000; + field_0xB32 += cM::rndFX(12288.f); + + if (mAng::abs(a0 - pPlayer->mRotation.y) < mAng::abs(a1 - pPlayer->mRotation.y)) { + field_0xB34 = mAng(0x800); + } else { + field_0xB34 = mAng(0xf800); + } + + field_0xB32 += field_0xB34; +} + +void dAcEremly_c::fn_177_78D0() { + mWinkTimer = 0; + nw4r::g3d::ResFile fil = mMdl.getMdlFile(); + nw4r::g3d::ResMdl mdl = fil.GetResMdl("Remly"); + mMdl.getModel().setCullMode(m3d::getMatID(mdl, "mouth"), GX_CULL_BACK, false); + mMdl.getModel().setCullMode(m3d::getMatID(mdl, "eye_scary"), GX_CULL_BACK, false); + mMdl.getModel().setCullMode(m3d::getMatID(mdl, "night_set"), GX_CULL_BACK, false); + + mTexPat.setAnm(mMdl.getModel(), fil.GetResAnmTexPat("RemlyScaryFace"), 0, m3d::PLAY_MODE_4); +} + +// NONMATCHING +void dAcEremly_c::fn_177_79D0(bool b) { + mMtx_c m; + mVec3_c in, out; + if (mRef1.isLinked()) { + m.YrotS(mRef1.get()->mRotationCopy.y + 0x5000); + in.set(0.f, 0.f, 120.f); + m.multVec(in, out); + out += mRef1.get()->getPosition(); + + if (!b) { + setPosition(out); + setOldPosition(getStartingPosition()); + field_0xB38 = out.y; + setStartingRotation(mRotation); + } + setStartingPosition(out); + mTargetPosition.set(out); + } +} + +bool dAcEremly_c::fn_177_7B10() { + s32 _weird_zero = 0; + + if (dBgS_WtrChk::CheckPos(&mPosition, true, 600.f + _weird_zero, -100.f + _weird_zero)) { + field_0xB0C = dBgS_WtrChk::GetWaterHeight(); + + if (mPosition.y < dBgS_WtrChk::GetWaterHeight() && mAcch.GetGroundH() < dBgS_WtrChk::GetWaterHeight()) { + if (mAcch.GetGroundH() < -8.f + field_0xB0C) { + if (isState(StateID_Hold)) { + mLinkage.fn_80050EA0(this); + } + if (isState(StateID_Jump)) { + mAngle.y = mRotation.y; + } + if (!isState(StateID_Water)) { + changeState(StateID_Water); + } + } + return true; + } + } + return false; +} + +void dAcEremly_c::nightSleepDemoImpl() {} + +void dAcEremly_c::fn_177_8520(bool b) { + s32 _weird_zero = 0; + if (!b && !mSpeed) { + return; + } + + if ((++field_0xB28 & 3) == 0) { + fn_80030030(mPosition, field_0xB24, field_0xB26, 4.f + _weird_zero); + if ((u16)(field_0xB24 + 0x1800) > 0x3000U) { + field_0xB24 = 0; + } else if ((u16)(field_0xB26 + 0x1800) > 0x3000U) { + field_0xB26 = 0; + } + } +} + +void dAcEremly_c::fn_177_8600() { + mMtx_c m; + mVec3_c in, out; + m.YrotS(mRotation.y); + in.set(0.f, 0.f, 15.f); + m.multVec(in, out); + out += mPosition; + + dJEffManager_c::spawnGroundEffect(out, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, mScale.x * 0.7f, field_0x1B0); +} + +bool dAcEremly_c::fn_177_86C0() { + mVec3_c outpos; + if (dLightEnv_c::GetPInstance()->check_BPM8(&mPosition, &outpos)) { + field_0xA50.set(outpos); + + if (!isScary()) { + if (isState(StateID_Hear) || isState(StateID_Sleep)) { + return true; + } + + if (!dAcPy_c::GetLinkM()->isUsingHarp()) { + if (!isState(StateID_Scared) && field_0xB60 != 32) { + mMdl.setAnm("RemlySound", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 32; + mSpeed = 0.f; + } + } else if (isState(StateID_Scared) || + (isState(StateID_Wait) && mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x400)) { + if (field_0xB60 == 21) { + if (++field_0xB2C > 40) { + field_0xB64 = 1; + field_0xB14++; + } + return true; + } + changeState(StateID_Hear); + return true; + } + return false; + } + } + + if (field_0xB2C > 0) { + field_0xB2C--; + } + return false; +} + +// TODO - Have its own location +inline void offsetWithAngle(mVec3_c &v, const mAng &a, f32 f) { + v.x += f * a.sin(); + v.z += f * a.cos(); +} + +bool dAcEremly_c::fn_177_8980(f32 f) { + dBgS_ObjGndChk gndChk; + mVec3_c v(mPosition); + + v.y += 100.f; + + offsetWithAngle(v, mRotation.y, f); + + gndChk.SetPos(v); + + f32 cross = dBgS::GetInstance()->GroundCross(&gndChk); + if (cross < mPosition.y - 1000.f || cross == -1e9f || dBgS::GetInstance()->GetGroundCode(gndChk) == 4) { + return true; + } + return false; +} + +// NONMATCHING +bool dAcEremly_c::fn_177_8AC0() { + if ((field_0xB60 != STATE_16) && (field_0xB60 != STATE_17) && (field_0xB60 != STATE_13) && + (field_0xB60 != STATE_14) && (field_0xB60 != STATE_15) && (field_0xB60 != STATE_5) && + (field_0xB60 != STATE_21) && (field_0xB60 != STATE_6) && (field_0xB60 != STATE_8) && (field_0xB60 != STATE_7) && + (field_0xB60 != STATE_10) && (field_0xB60 != STATE_22) && (field_0xB60 != STATE_23) && + (field_0xB60 != STATE_24)) { + return false; + } else { + return true; + } +} + +bool dAcEremly_c::fn_177_8C20(mAng a) { + s32 _weird_zero = 0; + if (fn_800301b0(mPositionCopy2, a, true, mSpeed + (120.f + _weird_zero)) == 2) { + if (std::abs(mPosition.y - field_0xAA4.y) < 4.f) { + field_0xB14++; + } + mStts.SetRank(11); + return true; + } + + if (field_0xB6C || field_0xB6A || isState(StateID_Escape) || isState(StateID_EscapeDash)) { + mVec3_c v(mPosition); + f32 f = 150.f + _weird_zero; + offsetWithAngle(v, mAngle.y, f); + if (dBgS_WtrChk::CheckPos(&v, true, 600.f + _weird_zero, -100.f + _weird_zero)) { + if (mPosition.y < dBgS_WtrChk::GetWaterHeight() && mAcch.GetGroundH() < dBgS_WtrChk::GetWaterHeight()) { + return true; + } + } + } + + if (fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) == 1 || + (mAcch.ChkWallHit(nullptr) && (mAng::abs(mAcchCir.GetWallAngleY() - mAng(mRotation.y + 0x8000)) < 0x800 || + (mSpeed && std::abs(mPosition.y - field_0xAA4.y) < 4.f)))) { + if (mAng::absDiff2(mRotation.y, cLib::targetAngleY(mPosition, mTargetPosition) < 0x200)) { + if ((++field_0xB18 & 7) == 0) { + field_0xB18 = 1; + return true; + } + } + } else { + field_0xB18 = 0; + } + return false; +} + +bool dAcEremly_c::fn_177_8F90() { + if (field_0xB6A != 0) { + return false; + } + if (sLib::calcTimer(&field_0xB50)) { + return false; + } + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + + if (isState(StateID_Sleep)) { + if (fn_177_7510(400.f) && std::abs(mPosition.y - pPlayer->mPosition.y) < 100.f) { + return true; + } + } else if (isState(StateID_Walk)) { + if (!fn_177_7510(300.f)) { + changeState(StateID_Run); + return true; + } + + if (!fn_177_6B10(false, -1000) && field_0xB69 == 0 && fn_177_7510(120.f)) { + sLib::addCalcScaled(&mSpeed, 0.7f, 5.f); + if (++field_0xB14 < 20) { + return false; + } + changeState(StateID_Wait); + return true; + } + } else if (isState(StateID_Run)) { + if (fn_177_7510(200.f)) { + field_0xB67 = 1; + changeState(StateID_Walk); + return true; + } + + if (fn_177_8C20(mRotation.y)) { + changeState(StateID_Wait); + mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 4.f); + field_0xB60 = 2; + return true; + } + } else if (field_0xB6E == 0 && field_0xB6C == 0) { + if (fn_177_8C20(getXZAngleToPlayer())) { + return false; + } + + if (field_0xB18 == 0) { + (void)pPlayer->mPosition.absXZTo(mPosition); + if (!fn_177_7510(220.f)) { + field_0xB67 = 1; + changeState(StateID_Walk); + return true; + } + } + + if (fn_177_6B10(false, 0)) { + field_0xB67 = 1; + changeState(StateID_Walk); + return true; + } + } + return false; +} + +bool dAcEremly_c::fn_177_9370(f32 f) { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + + if (!pPlayer->isRecovering() && pPlayer->mPosition.absXZTo(mStartingPos) < field_0xB08 && + std::abs(mPosition.y - pPlayer->mPosition.y) < f + 2000.f) { + return true; + } + + return false; +} From 9f4cf0c308b483556a513d6b438041a47b52a71a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 18 Apr 2026 14:35:02 -0400 Subject: [PATCH 16/16] dAcEremly_c equivalent --- config/SOUE01/rels/d_a_e_remlyNP/symbols.txt | 42 ++-- config/SOUE01/symbols.txt | 22 +- include/d/a/e/d_a_e_remly.h | 15 +- include/d/a/e/d_a_en_base.h | 2 +- include/m/m_angle.h | 2 + include/toBeSorted/event_manager.h | 3 + src/REL/d/a/e/d_a_e_remly.cpp | 216 +++++++++++++++++-- src/REL/d/a/e/d_a_e_sm.cpp | 2 +- 8 files changed, 243 insertions(+), 61 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt index bf3e6b48..99dce6b4 100644 --- a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt @@ -94,29 +94,29 @@ finalizeState_NightJumpAttack__11dAcEremly_cFv = .text:0x00006860; // type:funct initializeState_BirthWait__11dAcEremly_cFv = .text:0x00006870; // type:function size:0x7C executeState_BirthWait__11dAcEremly_cFv = .text:0x000068F0; // type:function size:0x13C finalizeState_BirthWait__11dAcEremly_cFv = .text:0x00006A30; // type:function size:0x4 -fn_177_6A40 = .text:0x00006A40; // type:function size:0xCC +playWink__11dAcEremly_cFv = .text:0x00006A40; // type:function size:0xCC fn_177_6B10__11dAcEremly_cFbRC4mAng = .text:0x00006B10; // type:function size:0x38C -fn_177_6EA0 = .text:0x00006EA0; // type:function size:0x120 -fn_177_6FC0 = .text:0x00006FC0; // type:function size:0x78 -fn_177_7040 = .text:0x00007040; // type:function size:0x2EC -fn_177_7330 = .text:0x00007330; // type:function size:0x90 -fn_177_73C0 = .text:0x000073C0; // type:function size:0x144 -fn_177_7510 = .text:0x00007510; // type:function size:0xC8 -fn_177_75E0 = .text:0x000075E0; // type:function size:0x6C +fn_177_6EA0__11dAcEremly_cFb = .text:0x00006EA0; // type:function size:0x120 +adjustHeadRotation__11dAcEremly_cFb = .text:0x00006FC0; // type:function size:0x78 +fn_177_7040__11dAcEremly_cFUlf = .text:0x00007040; // type:function size:0x2EC +isScary__11dAcEremly_cFv = .text:0x00007330; // type:function size:0x90 +shouldBeScared__11dAcEremly_cFv = .text:0x000073C0; // type:function size:0x144 +fn_177_7510__11dAcEremly_cFf = .text:0x00007510; // type:function size:0xC8 +fn_177_75E0__11dAcEremly_cFv = .text:0x000075E0; // type:function size:0x6C fn_177_7650__11dAcEremly_cCFb = .text:0x00007650; // type:function size:0x164 -fn_177_77C0 = .text:0x000077C0; // type:function size:0x108 -fn_177_78D0 = .text:0x000078D0; // type:function size:0xF4 -fn_177_79D0 = .text:0x000079D0; // type:function size:0x134 -fn_177_7B10 = .text:0x00007B10; // type:function size:0x1B4 -AcERemly__handleRemlitEventsMaybe2 = .text:0x00007CD0; // type:function size:0x844 -fn_177_8520 = .text:0x00008520; // type:function size:0xD8 -fn_177_8600 = .text:0x00008600; // type:function size:0xC0 -fn_177_86C0 = .text:0x000086C0; // type:function size:0x2B4 -fn_177_8980 = .text:0x00008980; // type:function size:0x13C -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_77C0__11dAcEremly_cFv = .text:0x000077C0; // type:function size:0x108 +fn_177_78D0__11dAcEremly_cFv = .text:0x000078D0; // type:function size:0xF4 +fn_177_79D0__11dAcEremly_cFb = .text:0x000079D0; // type:function size:0x134 +fn_177_7B10__11dAcEremly_cFv = .text:0x00007B10; // type:function size:0x1B4 +nightSleepDemoImpl__11dAcEremly_cFv = .text:0x00007CD0; // type:function size:0x844 +fn_177_8520__11dAcEremly_cFb = .text:0x00008520; // type:function size:0xD8 +fn_177_8600__11dAcEremly_cFv = .text:0x00008600; // type:function size:0xC0 +fn_177_86C0__11dAcEremly_cFv = .text:0x000086C0; // type:function size:0x2B4 +fn_177_8980__11dAcEremly_cFf = .text:0x00008980; // type:function size:0x13C +fn_177_8AC0__11dAcEremly_cFv = .text:0x00008AC0; // type:function size:0x160 +fn_177_8C20__11dAcEremly_cF4mAng = .text:0x00008C20; // type:function size:0x36C +fn_177_8F90__11dAcEremly_cFv = .text:0x00008F90; // type:function size:0x3E0 +fn_177_9370__11dAcEremly_cFf = .text:0x00009370; // type:function size:0xE8 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 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index faa037fc..f53009d5 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -976,7 +976,7 @@ setupEffect__10dEmitter_cFbUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColo setupEffect__10dEmitter_cFbUsRC6mMtx_cPC8_GXColorPC8_GXColor = .text:0x8002A230; // type:function size:0x150 polyAttrsToGroundEffectIdx__14dJEffManager_cFll = .text:0x8002A380; // type:function size:0xCC spawnGroundEffect__14dJEffManager_cFRC7mVec3_cUcUcRC7mVec3_clff = .text:0x8002A450; // type:function size:0x1C0 -fn_8002A610 = .text:0x8002A610; // type:function size:0x678 +spawnHitMarkEffect__14dJEffManager_cFiR8cCcD_ObjPC7mVec3_cb = .text:0x8002A610; // type:function size:0x678 fn_8002AC90 = .text:0x8002AC90; // type:function size:0x460 vt_0x1C0__17daPlayerActBase_cCFv = .text:0x8002B0F0; // type:function size:0x8 init__14dWaterEffect_cFP12dAcObjBase_cfff = .text:0x8002B100; // type:function size:0x14 @@ -1153,7 +1153,7 @@ preDraw__11dAcEnBase_cFv = .text:0x8002F540; // type:function size:0x74 fn_8002F5C0 = .text:0x8002F5C0; // type:function size:0x110 checkBeetleActorReferences__17daPlayerActBase_cFl = .text:0x8002F6D0; // type:function size:0x8 getBeetleActorReferencesSize__17daPlayerActBase_cFv = .text:0x8002F6E0; // type:function size:0x8 -fn_8002F6F0 = .text:0x8002F6F0; // type:function size:0xC +getBombWithinRadius__17daPlayerActBase_cFP9dAcBase_cRC7mVec3_cf = .text:0x8002F6F0; // type:function size:0xC fn_8002F700 = .text:0x8002F700; // type:function size:0x8 fn_8002F710 = .text:0x8002F710; // type:function size:0x110 checkRefArrayAtIndex__17daPlayerActBase_cFv = .text:0x8002F820; // type:function size:0x8 @@ -1172,12 +1172,12 @@ fn_8002FBF0 = .text:0x8002FBF0; // type:function size:0x20 fn_8002FC10 = .text:0x8002FC10; // type:function size:0xF4 someEnemyDamageCollisionStuffMaybe__11dAcEnBase_cFR19dColliderLinkedListPUs = .text:0x8002FD10; // type:function size:0x7C fn_8002FD90 = .text:0x8002FD90; // type:function size:0x4C -fn_8002FDE0 = .text:0x8002FDE0; // type:function size:0x170 +fn_8002FDE0__11dAcEnBase_cFR8cCcD_ObjPUs = .text:0x8002FDE0; // type:function size:0x170 fn_8002FF50 = .text:0x8002FF50; // type:function size:0xD4 -fn_80030030 = .text:0x80030030; // type:function size:0x174 -fn_800301B0 = .text:0x800301B0; // type:function size:0x1D4 +fn_80030030__11dAcEnBase_cFRC7mVec3_cRsRsf = .text:0x80030030; // type:function size:0x174 +fn_800301b0__11dAcEnBase_cFRC7mVec3_c4mAngbf = .text:0x800301B0; // type:function size:0x1D4 fn_80030390 = .text:0x80030390; // type:function size:0x64 -fn_80030400 = .text:0x80030400; // type:function size:0x168 +fn_80030400__11dAcEnBase_cFRQ23m3d5mdl_cUcbUc = .text:0x80030400; // type:function size:0x168 fn_80030570 = .text:0x80030570; // type:function size:0x144 fn_800306C0 = .text:0x800306C0; // type:function size:0x10 fn_800306D0 = .text:0x800306D0; // type:function size:0x24 @@ -1186,7 +1186,7 @@ fn_80030730 = .text:0x80030730; // type:function size:0xB0 fn_800307E0 = .text:0x800307E0; // type:function size:0x34 fn_80030820 = .text:0x80030820; // type:function size:0x14 fn_80030840 = .text:0x80030840; // type:function size:0x13C -fn_80030980 = .text:0x80030980; // type:function size:0x188 +fn_80030980__11dAcEnBase_cFRQ23m3d5mdl_clb = .text:0x80030980; // type:function size:0x188 fn_80030B10 = .text:0x80030B10; // type:function size:0x10C fn_80030c20__11dAcEnBase_cFUlffff = .text:0x80030C20; // type:function size:0x28 fn_80030C50 = .text:0x80030C50; // type:function size:0x8 @@ -3545,7 +3545,7 @@ ActorEventRelated__isInEvent = .text:0x8009D950; // type:function size:0x54 isThisActorInEvent__17ActorEventRelatedFv = .text:0x8009D9B0; // type:function size:0x5C fn_8009DA10 = .text:0x8009DA10; // type:function size:0x30 fn_8009DA40 = .text:0x8009DA40; // type:function size:0x40 -getSkipOnlyEvent = .text:0x8009DA80; // type:function size:0xC +getSkipOnlyEvent__12EventManagerFv = .text:0x8009DA80; // type:function size:0xC EventManager__ctorCont = .text:0x8009DA90; // type:function size:0x11C fn_8009DBB0 = .text:0x8009DBB0; // type:function size:0x128 startEventManager = .text:0x8009DCE0; // type:function size:0x280 @@ -3566,7 +3566,7 @@ fn_8009EEA0 = .text:0x8009EEA0; // type:function size:0x53C alsoSetAsCurrentEvent__12EventManagerFP9dAcBase_cP5EventPv = .text:0x8009F3E0; // type:function size:0x470 fn_8009F850 = .text:0x8009F850; // type:function size:0x134 fn_8009F990__12EventManagerFv = .text:0x8009F990; // type:function size:0x80 -fn_8009FA10 = .text:0x8009FA10; // type:function size:0x8 +fn_8009FA10__12EventManagerFP9dAcBase_cP5EventPv = .text:0x8009FA10; // type:function size:0x8 attachSkipEvent = .text:0x8009FA20; // type:function size:0x1A0 setEvent__12EventManagerFP9dAcBase_cP5EventP9dAcBase_c = .text:0x8009FBC0; // type:function size:0x120 changeOwnEvent__12EventManagerFP9dAcBase_cP9dAcBase_cP5Eventi = .text:0x8009FCE0; // type:function size:0x11C @@ -3594,7 +3594,7 @@ getCurrentEventActorBasedOnGroup = .text:0x800A0890; // type:function size:0x58 fn_800A08F0__12EventManagerFQ27fBase_c12GROUP_TYPE_e = .text:0x800A08F0; // type:function size:0x58 checkButton2HeldForCutscenes = .text:0x800A0950; // type:function size:0x60 canSkipCurrentEvent__12EventManagerFv = .text:0x800A09B0; // type:function size:0x1D0 -fn_800A0B80 = .text:0x800A0B80; // type:function size:0x10 +fn_800A0B80__12EventManagerFv = .text:0x800A0B80; // type:function size:0x10 eventRelatedStateFlags_shift0x11_1__12EventManagerFv = .text:0x800A0B90; // type:function size:0x10 fn_800A0BA0 = .text:0x800A0BA0; // type:function size:0x94 __ct__5EventFPCcUlUlPvPv = .text:0x800A0C40; // type:function size:0xEC @@ -10411,7 +10411,7 @@ GoddessChestsOpenedCounter__init_vtable = .text:0x801947A0; // type:function siz GoddessChestsOpenedCounter__dtor = .text:0x801947C0; // type:function size:0x58 GoddessChestsOpenedCounter__getMaxGoddessChests = .text:0x80194820; // type:function size:0x8 GoddessChestsOpenedCounter__init = .text:0x80194830; // type:function size:0x3C -angleToRotate = .text:0x80194870; // type:function size:0x194 +getForce__11dTgStream_cFRC7mVec3_cR7mVec3_cRC9fLiMgBa_c = .text:0x80194870; // type:function size:0x194 fn_80194A10 = .text:0x80194A10; // type:function size:0xC getStatueType__10dAcOSave_cCFv = .text:0x80194A20; // type:function size:0xC getStatueNameId__10dAcOSave_cCFv = .text:0x80194A30; // type:function size:0x24 diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h index f90d622d..7935e323 100644 --- a/include/d/a/e/d_a_e_remly.h +++ b/include/d/a/e/d_a_e_remly.h @@ -100,6 +100,10 @@ public: STATE_FUNC_DECLARE(dAcEremly_c, NightJumpAttack); STATE_FUNC_DECLARE(dAcEremly_c, BirthWait); + bool isState(State_e state) { + return field_0xB60 == (u32)state; + } + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcEremly_c); STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEremly_c); STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEremly_c); @@ -167,9 +171,12 @@ private: /* 0xA5C */ dWaterEffect_c mWaterEffect; /* 0xAA4 */ mVec3_c field_0xAA4; - - /* 0xAB0 */ u8 _AB0[0xAF8 - 0xAB0]; - + /* 0xAB0 */ mVec3_c field_0xAB0; + /* 0xABC */ mVec3_c field_0xABC; + /* 0xAC8 */ mVec3_c field_0xAC8; + /* 0xAD4 */ mVec3_c field_0xAD4; + /* 0xAE0 */ mVec3_c field_0xAE0; + /* 0xAEC */ mVec3_c field_0xAEC; /* 0xAF8 */ mVec3_c field_0xAF8; /* 0xB04 */ f32 field_0xB04; @@ -207,7 +214,7 @@ private: /* 0xB60 */ u8 field_0xB60; // Some State representation /* 0xB61 */ u8 field_0xB61; /* 0xB62 */ u8 mSleepDemoPlayedSceneflag; - /* */ u8 _B63; + /* 0xB63 */ u8 field_0xB63; /* 0xB64 */ u8 field_0xB64; /* 0xB65 */ u8 field_0xB65; /* 0xB66 */ u8 field_0xB66; diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index 77eb12e4..4424cfdf 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -70,7 +70,7 @@ public: // Deals with dealing damage to Enemy // Returns a value 0-13 (similar to mStts rank?) - int fn_8002fde0(cCcD_Obj &mCc, u16 *pTgOut); + int fn_8002FDE0(cCcD_Obj &mCc, u16 *pTgOut); void fn_80030030(const mVec3_c &pos, s16 &, s16 &, f32); // Returns 0-3 based on collision int fn_800301b0(const mVec3_c &pos, mAng ang, bool, f32); diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 4aea9f51..bd3e30f3 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -68,6 +68,8 @@ public: s32 absDiff(const mAng &other) const { return sLib::absDiff(mVal, other.mVal); } + // NOTE: Try not to use this one... + // May need a better home in future. template static s32 absDiff2(T a, T b) { return abs(a - b); diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index 3f3946ab..929cb869 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -20,6 +20,9 @@ public: static bool canSkipCurrentEvent(); static dAcBase_c *getMainActorInEvent(); + static Event *getSkipOnlyEvent(); + static bool fn_800A0B80(); + static void fn_8009FA10(dAcBase_c *actor, Event *event, void *unknown); static void execute(); static EventManager *sInstance; 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 8d80ef03..413cc16d 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -17,7 +17,10 @@ #include "d/d_camera.h" #include "d/d_light_env.h" #include "d/d_linkage.h" +#include "d/d_rumble.h" #include "d/d_sc_game.h" +#include "d/d_stage_mgr.h" +#include "d/d_vec.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/snd/d_snd_wzsound.h" @@ -42,6 +45,7 @@ #include "toBeSorted/attention.h" #include "toBeSorted/d_d3d.h" #include "toBeSorted/d_emitter.h" +#include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" SPECIAL_ACTOR_PROFILE(E_REMLY, dAcEremly_c, fProfile::E_REMLY, 0xE1, 0, 3); @@ -348,7 +352,7 @@ int dAcEremly_c::actorExecute() { } if (0 == sLib::calcTimer(&field_0xB4E)) { - s32 damageTypeMaybe = fn_8002fde0(mSph, nullptr); + s32 damageTypeMaybe = fn_8002FDE0(mSph, nullptr); switch (damageTypeMaybe) { case 7: { if (isState(StateID_Fly) && field_0xB60 != 20) { @@ -569,6 +573,11 @@ int dAcEremly_c::actorExecute() { return SUCCEEDED; } +/// Ugh +inline f32 getValue0() { + s32 _weird_zero = 0; + return _weird_zero + 70.f; +} int dAcEremly_c::draw() { s32 _weird_zero = 0; @@ -588,7 +597,7 @@ int dAcEremly_c::draw() { drawModelType1(&mdl); // elp - static mQuat_c shadow(0.f, 70.f + _weird_zero, 0.f, 290.f + _weird_zero); + static mQuat_c shadow(0.f, getValue0(), 0.f, _weird_zero + 290.f); fn_8002edb0(mShadow, mdl, &shadow, -1, -1, mPosition.y - mAcch.GetGroundH()); return SUCCEEDED; @@ -911,8 +920,8 @@ void dAcEremly_c::executeState_EscapeDash() { } if (field_0xB6B != 0) { - mVec3_c v(getPosition()); - sLib::addCalcScaledDiff(&mSpeed, 30.f, 0.7f, 3.f); + mVec3_c v; + sLib::addCalcScaledDiff(&mSpeed, (v = mPosition, 30.f), 0.7f, 3.f); if (fn_177_8C20(mRotation.y)) { changeState(StateID_Scared); @@ -2233,7 +2242,7 @@ bool dAcEremly_c::fn_177_7650(bool comparePlayer) const { // NONMATCHING void dAcEremly_c::fn_177_77C0() { const dAcPy_c *pPlayer = dAcPy_c::GetLink(); - mAng a0 = getXZAngleToPlayer() + -0x7800; + s32 a0 = getXZAngleToPlayer().mVal + -(s32)(0x7800); mAng a1 = getXZAngleToPlayer() + 0x7800; field_0xB32 = getXZAngleToPlayer() + 0x8000; @@ -2304,7 +2313,174 @@ bool dAcEremly_c::fn_177_7B10() { return false; } -void dAcEremly_c::nightSleepDemoImpl() {} +void dAcEremly_c::nightSleepDemoImpl() { + s32 _weird_zero = 0; + + if (mSleepDemoPlayedSceneflag == 0xFF || + SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSleepDemoPlayedSceneflag)) { + return; + } + + dAcPy_c *pPlayer = dAcPy_c::GetLinkM(); + dCamera_c *pCamera = dScGame_c::getCamera(); + + f32 x, y, z; + mVec3_c v, v2; + mMtx_c m, m2; + mAng a = mAngle.y - 0x4000; + + switch (field_0xB63) { + case 0: { + if (!isWithinPlayerRadius(1500.f)) { + break; + } + field_0xB63++; + } // fallthrough + case 1: { + { + Event e("dAcEremly_c_nightRemly", 100, Event::makeEventFlag(1, 0x100001), nullptr, nullptr); + EventManager::alsoSetAsCurrentEvent(this, &e, nullptr); + } + if (!EventManager::isInEvent(this, "dAcEremly_c_nightRemly")) { + break; + } + mStartingRot = mRotation; + EventManager::fn_8009FA10(this, EventManager::getSkipOnlyEvent(), nullptr); + pPlayer->vt_0x2AC(); + field_0xB63++; + } // fallthrough + case 2: { + mMdl.setAnm("RemlyDemo", m3d::PLAY_MODE_4, 0.f); + field_0xB60 = 26; + + z = _weird_zero + -160.f; + y = _weird_zero + 80.f; + x = _weird_zero + 410.f; + v.set(x, y, z); + m.YrotS(a + 0x8000); + m.multVec(v, field_0xAB0); + + field_0xAB0 += mStartingPos; + field_0xAC8 = field_0xAB0; + field_0xAE0 = field_0xAB0; + + x = _weird_zero + 30.f; + y = _weird_zero + 30.f; + z = _weird_zero + 30.f; + v.set(z, y, x); + + m.YrotS(a); + m.multVec(v, field_0xABC); + + field_0xABC += mStartingPos; + field_0xAD4 = field_0xABC; + field_0xAEC = field_0xABC; + + x = _weird_zero + -370.f; + y = 0.f; + z = 250.f; + v.set(x, y, z); + + m.YrotS(a); + m.multVec(v, v2); + v2 += mStartingPos; + + mAng3_c rot(0, getXZAngleToPlayer() + 0x8000, 0); + dAcPy_c::GetLinkM()->setPosRot(&v2, &rot, true, 0, 0); + dAcPy_c::GetLinkM()->triggerMoveEventMaybe(13, 1, 0, 0, 0, 0, 0); + field_0xB63++; + } // fallthrough + case 3: { + if (sLib::calcTimer(&field_0xB48)) { + break; + } + field_0xB48 = 60; + field_0xB63++; + } // fallthrough + case 4: { + if (sLib::calcTimer(&field_0xB48)) { + if (field_0xB48 == 58) { + z = _weird_zero + 170.f; + x = _weird_zero + -120.f; + v.set(x, 0.f, z); + m.YrotS(a); + m.multVec(v, v2); + v2 += mStartingPos; + dAcPy_c::GetLinkM()->triggerMoveEventMaybe(2, 0, 0, &v2, 0, 0, 0); + } + break; + } + field_0xB48 = 100; + field_0xB63++; + } // fallthrough + case 5: { + a = cLib::targetAngleY(field_0xAD4, field_0xAC8); + m.YrotS(a); + z = _weird_zero + -330.f; + y = _weird_zero; + x = _weird_zero; + v.set(x, y, z); + m.multVec(v, field_0xAE0); + field_0xAE0 += field_0xAC8; + if (sLib::calcTimer(&field_0xB48)) { + break; + } + field_0xB63++; + } // fallthrough + case 6: { + if (mMdl.getAnm().checkFrame(320.f)) { + mMtx_c m3, m4; + s32 scale = 95; + m2.transS(0.5f, 0.5f, 0.f); + y = scale / 100.f; + x = scale / 100.f; + m3.scaleS(x, y, 0.f); + m2 += m3; + m4.transS(-0.5f, -0.5f, 0.f); + m2 += m4; + dStageMgr_c::GetInstance()->procfn_800192F0(150, m2, 100); + dRumble_c::start(dRumble_c::sRumblePreset1, 1); + } + if (mMdl.getAnm().isStop()) { + mMdl.setRate(0.f); + field_0xB63 = 10; + } + break; + } + case 10: { + mSph.OnTgSet(); + mSph.OnCoSet(); + EventManager::finishEvent(this, nullptr); + dScGame_c::getCamera()->fn_8019EA70(true); + field_0xB48 = 3; + field_0xB63 = 11; + break; + } + case 11: { + if (0 == sLib::calcTimer(&field_0xB48)) { + changeState(StateID_NightWait); + mMdl.setAnm("RemlyWaitStandNight", m3d::PLAY_MODE_4, 0.f); + mAngle.y = mStartingRot.y + -30000; + mRotation.y = mAngle.y; + if (mSleepDemoPlayedSceneflag != 0xFF) { + SceneflagManager::sInstance->setFlag(mRoomID, mSleepDemoPlayedSceneflag); + } + } + } + } + + if (field_0xB63 == 5) { + cLib::addCalcPos2(&field_0xAB0, field_0xAE0, 0.3f, 10.f); + } + if (field_0xB63 == 2 || field_0xB63 == 3 || field_0xB63 == 4 || field_0xB63 == 5 || field_0xB63 == 6 || + field_0xB63 == 7 || field_0xB63 == 8 || field_0xB63 == 9) { + pCamera->setEventCamView(field_0xABC, field_0xAB0, 50.f, 0.f); + if (EventManager::fn_800A0B80()) { + mMdl.setRate(0.f); + field_0xB63 = 10; + } + } +} void dAcEremly_c::fn_177_8520(bool b) { s32 _weird_zero = 0; @@ -2371,21 +2547,15 @@ bool dAcEremly_c::fn_177_86C0() { return false; } -// TODO - Have its own location -inline void offsetWithAngle(mVec3_c &v, const mAng &a, f32 f) { - v.x += f * a.sin(); - v.z += f * a.cos(); -} - bool dAcEremly_c::fn_177_8980(f32 f) { dBgS_ObjGndChk gndChk; mVec3_c v(mPosition); v.y += 100.f; - offsetWithAngle(v, mRotation.y, f); + getXZCirclePoint(v, mRotation.y, f); - gndChk.SetPos(v); + gndChk.SetPos(&v); f32 cross = dBgS::GetInstance()->GroundCross(&gndChk); if (cross < mPosition.y - 1000.f || cross == -1e9f || dBgS::GetInstance()->GetGroundCode(gndChk) == 4) { @@ -2396,14 +2566,14 @@ bool dAcEremly_c::fn_177_8980(f32 f) { // NONMATCHING bool dAcEremly_c::fn_177_8AC0() { - if ((field_0xB60 != STATE_16) && (field_0xB60 != STATE_17) && (field_0xB60 != STATE_13) && - (field_0xB60 != STATE_14) && (field_0xB60 != STATE_15) && (field_0xB60 != STATE_5) && - (field_0xB60 != STATE_21) && (field_0xB60 != STATE_6) && (field_0xB60 != STATE_8) && (field_0xB60 != STATE_7) && - (field_0xB60 != STATE_10) && (field_0xB60 != STATE_22) && (field_0xB60 != STATE_23) && - (field_0xB60 != STATE_24)) { - return false; - } else { + bool b = (isState(STATE_16)) || (isState(STATE_17)) || (isState(STATE_13)) || (isState(STATE_14)) || + (isState(STATE_15)) || (isState(STATE_5)) || (isState(STATE_21)) || (isState(STATE_6)) || + (isState(STATE_8)) || (isState(STATE_7)) || (isState(STATE_10)) || (isState(STATE_22)) || + (isState(STATE_23)) || (isState(STATE_24)); + if (b) { return true; + } else { + return false; } } @@ -2420,7 +2590,7 @@ bool dAcEremly_c::fn_177_8C20(mAng a) { if (field_0xB6C || field_0xB6A || isState(StateID_Escape) || isState(StateID_EscapeDash)) { mVec3_c v(mPosition); f32 f = 150.f + _weird_zero; - offsetWithAngle(v, mAngle.y, f); + getXZCirclePoint(v, mAngle.y, f); if (dBgS_WtrChk::CheckPos(&v, true, 600.f + _weird_zero, -100.f + _weird_zero)) { if (mPosition.y < dBgS_WtrChk::GetWaterHeight() && mAcch.GetGroundH() < dBgS_WtrChk::GetWaterHeight()) { return true; @@ -2510,7 +2680,7 @@ bool dAcEremly_c::fn_177_9370(f32 f) { const dAcPy_c *pPlayer = dAcPy_c::GetLink(); if (!pPlayer->isRecovering() && pPlayer->mPosition.absXZTo(mStartingPos) < field_0xB08 && - std::abs(mPosition.y - pPlayer->mPosition.y) < f + 2000.f) { + std::abs(mPosition.y - pPlayer->mPosition.y) < f + 200.f) { return true; } diff --git a/src/REL/d/a/e/d_a_e_sm.cpp b/src/REL/d/a/e/d_a_e_sm.cpp index 195289f9..fec93ee2 100644 --- a/src/REL/d/a/e/d_a_e_sm.cpp +++ b/src/REL/d/a/e/d_a_e_sm.cpp @@ -512,7 +512,7 @@ int dAcEsm_c::actorExecute() { mHitPos.set(0.f, 0.f, 0.f); if (0 == sLib::calcTimer(&mDamageTimer)) { - field_0xB94 = fn_8002fde0(mSph, nullptr); + field_0xB94 = fn_8002FDE0(mSph, nullptr); if (field_0xB94 != 0) { if (mSph.ChkTgHit()) { if (field_0xB94 == 7) {