From b577f14b6c235d86ada8deb11002316c7b700448 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 4 May 2026 21:48:13 -0400 Subject: [PATCH 01/17] dAcEKs_c start --- config/SOUE01/rels/d_a_e_ksNP/symbols.txt | 10 +- include/d/a/e/d_a_e_ks.h | 68 ++++++++++- src/REL/d/a/e/d_a_e_ks.cpp | 132 ++++++++++++++++++++++ 3 files changed, 203 insertions(+), 7 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt index 0737e933..0df53838 100644 --- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt @@ -12,12 +12,12 @@ __dt__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDCh __dt__46sFStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000490; // type:function size:0xA4 fn_155_540 = .text:0x00000540; // type:function size:0x5C fn_155_5A0 = .text:0x000005A0; // type:function size:0x4 -fn_155_5B0 = .text:0x000005B0; // type:function size:0x134 -fn_155_6F0 = .text:0x000006F0; // type:function size:0x8 -fn_155_700 = .text:0x00000700; // type:function size:0x1A8 +restorePosRotFromCopy__8dAcEKs_cFv = .text:0x000005B0; // type:function size:0x134 +linkKiesuTag__8dAcEKs_cFP13dTgKiesuTag_c = .text:0x000006F0; // type:function size:0x8 +setStartingState__8dAcEKs_cFv = .text:0x00000700; // type:function size:0x1A8 changeState__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000008B0; // type:function size:0x10 -AcEKs__idleBasedOnSubtypeMaybe = .text:0x000008C0; // type:function size:0xCC -fn_155_990 = .text:0x00000990; // type:function size:0xD0 +setIdleState__8dAcEKs_cFv = .text:0x000008C0; // type:function size:0xCC +getLineCrossYRange__8dAcEKs_cFRC7mVec3_cf = .text:0x00000990; // type:function size:0xD0 fn_155_A60 = .text:0x00000A60; // type:function size:0x6B0 getStateID__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001110; // type:function size:0x10 fn_155_1120 = .text:0x00001120; // type:function size:0x1C diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index 73fbc269..06629604 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -1,14 +1,34 @@ #ifndef D_A_E_KS_H #define D_A_E_KS_H +#include "common.h" +#include "d/a/d_a_base.h" #include "d/a/e/d_a_en_base.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/col/cc/d_cc_d.h" +#include "m/m3d/m_anmtexpat.h" +#include "m/m_color.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/d_path.h" +class dTgKiesuTag_c; class dAcEKs_c : public dAcEnBase_c { public: - dAcEKs_c() : mStateMgr(*this) {} + dAcEKs_c() : mStateMgr(*this), field_0xAA8(0.f), field_0xAB0(0) {} virtual ~dAcEKs_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; + virtual bool restorePosRotFromCopy() override; + STATE_FUNC_DECLARE(dAcEKs_c, Wait); STATE_FUNC_DECLARE(dAcEKs_c, WakeUp); STATE_FUNC_DECLARE(dAcEKs_c, ReturnToWait); @@ -24,8 +44,52 @@ public: STATE_FUNC_DECLARE(dAcEKs_c, WindBlow); STATE_FUNC_DECLARE(dAcEKs_c, PathMove); +public: + void linkKiesuTag(dTgKiesuTag_c *pTgKs); + void setStartingState(); + void setIdleState(); + + f32 getLineCrossYRange(const mVec3_c &pos, f32 range); + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcEKs_c); + /* 0x378 */ dAcRef_c mTgRef; + /* 0x384 */ nw4r::g3d::ResFile mRres; + /* 0x388 */ d3d::AnmMdlWrapper mMdl; + /* 0x3F8 */ m3d::anmTexPat_c mAnmTexPat; + /* 0x324 */ dShadowCircle_c mShadow; + /* 0x42C */ dBgS_AcchCir mAcchCir; + /* 0x488 */ dBgS_ObjAcch mAcch; + /* 0x838 */ dCcD_Sph mSph; + /* 0x988 */ STATE_MGR_DECLARE(dAcEKs_c); + /* 0x9C4 */ dEmitter_c mEmitter1; + /* 0x9F8 */ dEmitter_c mEmitter2; + /* 0xA2C */ dWaterEffect_c mWaterEmitter; + /* 0xA74 */ ActorOnRail_Ext mRail; + /* 0xAA8 */ f32 field_0xAA8; + /* 0xAAC */ UNKWORD field_0xAAC; + /* 0xAA8 */ u8 field_0xAB0; + /* 0xAB1 */ u8 _0xAB1[0xB14 - 0xAB1]; + /* 0xB14 */ mVec3_c mPnts[10]; + /* 0xB8C */ u8 _0xB8C[0xD20 - 0xB8C]; + /* 0xD20 */ f32 field_0xD20; + /* 0xD24 */ u8 _0xD24[0xD32 - 0xD24]; + /* 0xD32 */ s16 mTimer; + /* 0xD34 */ u8 _0xD34[0xDB1 - 0xD34]; + /* 0xDB1 */ u8 field_0xDB1; + /* 0xDB2 */ u8 _0xDB2[0xDBC - 0xDB2]; + /* 0xDBC */ u8 mType; + /* 0xDBD */ u8 _0xDBD[0xDC2 - 0xDBD]; + /* 0xDC2 */ u8 mCurrentState; + /* 0xDC3 */ u8 mNextState; + /* 0xDC4 */ u8 _0xDC4[0xDC7 - 0xDC4]; + /* 0xDC7 */ u8 mStartingState; + /* 0xDC8 */ u8 _0xDC8[0xDCF - 0xDB8]; + /* 0xDCF */ u8 field_0xDCF; + /* 0xDD0 */ u8 _0xDD0[0xDD4 - 0xDD0]; + /* 0xDD4 */ mVec3_c mHomePos; + /* 0xDE0 */ mColor mColor; + /* 0xDE4 */ f32 field_0xDE4; + /* 0xDE8 */ u8 _0xDE8[0xDF0 - 0xDE8]; }; #endif diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index b9f2d8d1..5a22460c 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -1,5 +1,13 @@ #include "d/a/e/d_a_e_ks.h" +#include "c/c_math.h" +#include "common.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/t/d_t_ks.h" +#include "m/m_vec.h" +#include "toBeSorted/time_area_mgr.h" + SPECIAL_ACTOR_PROFILE(E_KS, dAcEKs_c, fProfile::E_KS, 0xFE, 0, 4099); STATE_DEFINE(dAcEKs_c, Wait); @@ -17,45 +25,169 @@ STATE_DEFINE(dAcEKs_c, Stun); STATE_DEFINE(dAcEKs_c, WindBlow); STATE_DEFINE(dAcEKs_c, PathMove); +bool dAcEKs_c::restorePosRotFromCopy() { + if (field_0xDCF == 0) { + if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition) != 0) { + field_0xAA8 = 0.f; + mSph.ClrCoSet(); + mSph.ClrTgSet(); + mSph.ClrAtSet(); + fn_800306d0(); + if (mType == 1 || mType == 2) { + field_0xD20 = 0.f; + field_0xDE4 = 0.f; + if (mEmitter1.hasEmitters()) { + mEmitter1.remove(true); + } + } + } else { + field_0xAA8 = 1.f; + fn_80030700(); + mSph.OnCoSet(); + mSph.OnTgSet(); + } + mMdl.getModel().setScale(mScale * field_0xAA8); + } + return true; +} + +void dAcEKs_c::linkKiesuTag(dTgKiesuTag_c *pTgKs) { + mTgRef.link(pTgKs); +} + +void dAcEKs_c::setStartingState() { + mTimer = cM::rndInt(1000); + switch (mStartingState) { + case 0: { + mStateMgr.changeState(StateID_Move); + mCurrentState = mStartingState; + mAcch.ClrRoofNone(); + mAcch.SetField_0xD4(55.f); + mAcch.SetGroundUpY(30.f); + mAcchCir.SetWall(20.f, 60.f); + } break; + case 1: { + mStateMgr.changeState(StateID_Wait); + mCurrentState = mStartingState; + if ((s32)getFromParams(30, 0x3) == 1) { + field_0xDB1 = 1; + } + mAcch.ClrRoofHit(); + mAcch.SetGroundUpY(0.f); + mAcch.SetField_0xD4(0.f); + mAcchCir.SetWall(0.f, 5.f); + + } break; + case 2: { + mCurrentState = mStartingState; + mAcch.ClrRoofNone(); + mAcch.SetField_0xD4(55.f); + mAcch.SetGroundUpY(30.f); + mAcchCir.SetWall(20.f, 60.f); + mStateMgr.changeState(StateID_PathMove); + } break; + default: { + mStateMgr.changeState(StateID_Move); + mCurrentState = mStartingState; + } break; + } + + mCurrentState = mNextState; +} + +void dAcEKs_c::setIdleState() { + switch (mStartingState) { + case 0: { + mStateMgr.changeState(StateID_Move); + mCurrentState = 0; + } break; + case 1: { + mStateMgr.changeState(StateID_ReturnToWait); + mCurrentState = 5; + } break; + case 2: { + mStateMgr.changeState(StateID_PathMove); + mCurrentState = 2; + } break; + default: { + mStateMgr.changeState(StateID_Move); + mCurrentState = 0; + } break; + } +} + +f32 dAcEKs_c::getLineCrossYRange(const mVec3_c &pos, f32 range) { + dBgS_ObjLinChk linChk; + + mVec3_c start, end; + start.set(pos); + start.y -= range; + + end.set(pos); + end.y += range; + + linChk.Set(&start, &end, nullptr); + if (dBgS::GetInstance()->LineCross(&linChk)) { + return linChk.GetLinEnd().y; + } else { + return mStartingPos.y; + } +} + +// idk + void dAcEKs_c::initializeState_Wait() {} void dAcEKs_c::executeState_Wait() {} void dAcEKs_c::finalizeState_Wait() {} + void dAcEKs_c::initializeState_WakeUp() {} void dAcEKs_c::executeState_WakeUp() {} void dAcEKs_c::finalizeState_WakeUp() {} + void dAcEKs_c::initializeState_ReturnToWait() {} void dAcEKs_c::executeState_ReturnToWait() {} void dAcEKs_c::finalizeState_ReturnToWait() {} + void dAcEKs_c::initializeState_WaitReady() {} void dAcEKs_c::executeState_WaitReady() {} void dAcEKs_c::finalizeState_WaitReady() {} + void dAcEKs_c::initializeState_Move() {} void dAcEKs_c::executeState_Move() {} void dAcEKs_c::finalizeState_Move() {} + void dAcEKs_c::initializeState_Chase() {} void dAcEKs_c::executeState_Chase() {} void dAcEKs_c::finalizeState_Chase() {} + void dAcEKs_c::initializeState_ChaseAttack() {} void dAcEKs_c::executeState_ChaseAttack() {} void dAcEKs_c::finalizeState_ChaseAttack() {} + void dAcEKs_c::initializeState_Fighting() {} void dAcEKs_c::executeState_Fighting() {} void dAcEKs_c::finalizeState_Fighting() {} + void dAcEKs_c::initializeState_AttackReady() {} void dAcEKs_c::executeState_AttackReady() {} void dAcEKs_c::finalizeState_AttackReady() {} + void dAcEKs_c::initializeState_Attack() {} void dAcEKs_c::executeState_Attack() {} void dAcEKs_c::finalizeState_Attack() {} + void dAcEKs_c::initializeState_Damage() {} void dAcEKs_c::executeState_Damage() {} void dAcEKs_c::finalizeState_Damage() {} + void dAcEKs_c::initializeState_Stun() {} void dAcEKs_c::executeState_Stun() {} void dAcEKs_c::finalizeState_Stun() {} + void dAcEKs_c::initializeState_WindBlow() {} void dAcEKs_c::executeState_WindBlow() {} void dAcEKs_c::finalizeState_WindBlow() {} + void dAcEKs_c::initializeState_PathMove() {} void dAcEKs_c::executeState_PathMove() {} void dAcEKs_c::finalizeState_PathMove() {} From 7da9558daa9d376f9be9ab079706dd606ac1fef8 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 6 May 2026 21:44:09 -0400 Subject: [PATCH 02/17] dAcEKs_c progess 5/6/26 --- config/SOUE01/rels/d_a_e_ksNP/symbols.txt | 53 +++-- config/SOUE01/symbols.txt | 2 +- include/d/a/e/d_a_e_ks.h | 61 +++++- include/d/a/e/d_a_en_base.h | 2 +- include/d/col/c/c_cc_d.h | 13 ++ src/REL/d/a/e/d_a_e_ks.cpp | 253 +++++++++++++++++++++- 6 files changed, 348 insertions(+), 36 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt index 0df53838..7fd527e4 100644 --- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt @@ -34,36 +34,35 @@ fn_155_29D0 = .text:0x000029D0; // type:function size:0x1A8 fn_155_2B80 = .text:0x00002B80; // type:function size:0x1E0 fn_155_2D60 = .text:0x00002D60; // type:function size:0x138 fn_155_2EA0 = .text:0x00002EA0; // type:function size:0x118 -fn_155_2FC0 = .text:0x00002FC0; // type:function size:0x84 -fn_155_3050 = .text:0x00003050; // type:function size:0xAC -fn_155_3100 = .text:0x00003100; // type:function size:0xF4 -fn_155_3200 = .text:0x00003200; // type:function size:0xA4 -fn_155_32B0 = .text:0x000032B0; // type:function size:0x94 -fn_155_3350 = .text:0x00003350; // type:function size:0x94 -fn_155_33F0 = .text:0x000033F0; // type:function size:0x68 -fn_155_3460 = .text:0x00003460; // type:function size:0x14 -fn_155_3480 = .text:0x00003480; // type:function size:0x34 -fn_155_34C0 = .text:0x000034C0; // type:function size:0x1A8 -AcEKs__setAnim = .text:0x00003670; // type:function size:0xA8 -fn_155_3720 = .text:0x00003720; // type:function size:0x30 -fn_155_3750 = .text:0x00003750; // type:function size:0x44 -fn_155_37A0 = .text:0x000037A0; // type:function size:0x50 -fn_155_37F0 = .text:0x000037F0; // type:function size:0x44 -fn_155_3840 = .text:0x00003840; // type:function size:0x4C -fn_155_3890 = .text:0x00003890; // type:function size:0x40 -fn_155_38D0 = .text:0x000038D0; // type:function size:0x10 -fn_155_38E0 = .text:0x000038E0; // type:function size:0x10 -fn_155_38F0 = .text:0x000038F0; // type:function size:0x4 -fn_155_3900 = .text:0x00003900; // type:function size:0x268 -AcEKs__setAnglesToPoints = .text:0x00003B70; // type:function size:0x58 -fn_155_3BD0 = .text:0x00003BD0; // type:function size:0x10 -fn_155_3BE0 = .text:0x00003BE0; // type:function size:0x178 -fn_155_3D60 = .text:0x00003D60; // type:function size:0xA8 +isOutsideRange__8dAcEKs_cFv = .text:0x00002FC0; // type:function size:0x84 +isNotWaitingNorDamage__8dAcEKs_cFv = .text:0x00003050; // type:function size:0xAC +isTargeted__8dAcEKs_cFv = .text:0x00003100; // type:function size:0xF4 +ChkWall__8dAcEKs_cFv = .text:0x00003200; // type:function size:0xA4 +ChkGnd__8dAcEKs_cFv = .text:0x000032B0; // type:function size:0x94 +ChkRoof__8dAcEKs_cFv = .text:0x00003350; // type:function size:0x94 +ChkHit__8dAcEKs_cFv = .text:0x000033F0; // type:function size:0x68 +fn_155_3460__8dAcEKs_cFv = .text:0x00003460; // type:function size:0x14 +fn_155_3480__8dAcEKs_cFv = .text:0x00003480; // type:function size:0x34 +transitionToNextState__8dAcEKs_cFv = .text:0x000034C0; // type:function size:0x1A8 +setAnim__8dAcEKs_cFPcfff = .text:0x00003670; // type:function size:0xA8 +fn_155_3720__8dAcEKs_cFff = .text:0x00003720; // type:function size:0x30 +fn_155_3750__8dAcEKs_cFUc = .text:0x00003750; // type:function size:0x44 +fn_155_37A0__8dAcEKs_cFv = .text:0x000037A0; // type:function size:0x50 +fn_155_37F0__8dAcEKs_cFv = .text:0x000037F0; // type:function size:0x44 +fn_155_3840__8dAcEKs_cFv = .text:0x00003840; // type:function size:0x4C +fn_155_3890__8dAcEKs_cFv = .text:0x00003890; // type:function size:0x40 +on_lbl_155_bss_389__8dAcEKs_cFv = .text:0x000038D0; // type:function size:0x10 +setBlinkChecked__8dAcEKs_cFUc = .text:0x000038E0; // type:function size:0x14 +fn_155_3900__8dAcEKs_cFl = .text:0x00003900; // type:function size:0x268 +setPitchYawToPoint__8dAcEKs_cFRC7mVec3_c = .text:0x00003B70; // type:function size:0x58 +fn_155_3BD0__8dAcEKs_cFRC7mVec3_c = .text:0x00003BD0; // type:function size:0x10 +fn_155_3BE0__8dAcEKs_cFRC7mVec3_c = .text:0x00003BE0; // type:function size:0x178 +setBlink__8dAcEKs_cFUc = .text:0x00003D60; // type:function size:0xA8 fn_155_3E10 = .text:0x00003E10; // type:function size:0x1C fn_155_3E30 = .text:0x00003E30; // type:function size:0x24 fn_155_3E60 = .text:0x00003E60; // type:function size:0x2C -fn_155_3E90 = .text:0x00003E90; // type:function size:0x24 -fn_155_3EC0 = .text:0x00003EC0; // type:function size:0x24 +fn_155_3E90__8dAcEKs_cFv = .text:0x00003E90; // type:function size:0x24 +fn_155_3EC0__8dAcEKs_cFv = .text:0x00003EC0; // type:function size:0x24 fn_155_3EF0 = .text:0x00003EF0; // type:function size:0x5C fn_155_3F50 = .text:0x00003F50; // type:function size:0x10C AcEKs__initModels = .text:0x00004060; // type:function size:0x120 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index ca7cffb4..4891a582 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1182,7 +1182,7 @@ fn_80030570 = .text:0x80030570; // type:function size:0x144 fn_800306C0 = .text:0x800306C0; // type:function size:0x10 fn_800306D0 = .text:0x800306D0; // type:function size:0x24 fn_80030700 = .text:0x80030700; // type:function size:0x24 -fn_80030730 = .text:0x80030730; // type:function size:0xB0 +attackPlayerOrScrapper__11dAcEnBase_cFf = .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 diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index 06629604..a16652f1 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -4,7 +4,6 @@ #include "common.h" #include "d/a/d_a_base.h" #include "d/a/e/d_a_en_base.h" -#include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s_acch.h" #include "d/col/cc/d_cc_d.h" #include "m/m3d/m_anmtexpat.h" @@ -51,9 +50,38 @@ public: f32 getLineCrossYRange(const mVec3_c &pos, f32 range); + /* 0 -> blink_1, 1 -> blink_2, 2 -> blink_3*/ + void setBlink(u8 blink); + void setBlinkChecked(u8 blink); + bool isOutsideRange(); + bool isNotWaitingNorDamage(); + bool isTargeted(); + bool ChkWall(); + void ChkGnd(); + void ChkRoof(); + bool ChkHit(); + void fn_155_3460(); + void fn_155_3480(); + bool transitionToNextState(); + void setAnim(char *, f32, f32, f32); + void fn_155_3720(f32, f32); + void fn_155_3750(u8 state); + void fn_155_37A0(); + void fn_155_37F0(); + void fn_155_3840(); + void fn_155_3890(); + void on_lbl_155_bss_389(); + /* 0: Checks states to set AC_PROP_0x1 - 1: Unset AC_PROP_0x1*/ + void fn_155_3900(s32 p0); + void setPitchYawToPoint(const mVec3_c &pnt); + void fn_155_3BD0(const mVec3_c &); + void fn_155_3BE0(const mVec3_c &); + void fn_155_3E90(); + void fn_155_3EC0(); + private: /* 0x378 */ dAcRef_c mTgRef; - /* 0x384 */ nw4r::g3d::ResFile mRres; + /* 0x384 */ nw4r::g3d::ResFile mResFile; /* 0x388 */ d3d::AnmMdlWrapper mMdl; /* 0x3F8 */ m3d::anmTexPat_c mAnmTexPat; /* 0x324 */ dShadowCircle_c mShadow; @@ -70,15 +98,32 @@ private: /* 0xAA8 */ u8 field_0xAB0; /* 0xAB1 */ u8 _0xAB1[0xB14 - 0xAB1]; /* 0xB14 */ mVec3_c mPnts[10]; - /* 0xB8C */ u8 _0xB8C[0xD20 - 0xB8C]; + /* 0xB8C */ u8 _0xB8C[0xBB0 - 0xB8C]; + /* 0xBB0 */ mVec3_c field_0xBB0; + /* 0xBBC */ mVec3_c field_0xBBC; + /* 0xBC8 */ u8 _0xBC8[0xC34 - 0xBC8]; + /* 0xD32 */ mAng mPitch_0xC34; + /* 0xD32 */ mAng mYaw_0xC36; + /* 0xC38 */ u8 _0xC38[0xD20 - 0xC38]; /* 0xD20 */ f32 field_0xD20; /* 0xD24 */ u8 _0xD24[0xD32 - 0xD24]; /* 0xD32 */ s16 mTimer; - /* 0xD34 */ u8 _0xD34[0xDB1 - 0xD34]; + /* 0xD34 */ u8 _0xD34[0xD60 - 0xD34]; + /* 0xD60 */ s16 field_0xD60; + /* 0xD62 */ u8 _0xD62[0xDA6 - 0xD62]; + /* 0xDA6 */ u8 field_0xDA6; + /* 0xDA7 */ u8 field_0xDA7; + /* 0xDA8 */ u8 field_0xDA8; + /* 0xDA9 */ u8 field_0xDA9; + /* 0xDAA */ u8 _0xDAA[0xDB1 - 0xDAA]; /* 0xDB1 */ u8 field_0xDB1; - /* 0xDB2 */ u8 _0xDB2[0xDBC - 0xDB2]; + /* 0xDB2 */ u8 field_0xDB2; + /* 0xDB3 */ u8 _0xDB3[0xDBB - 0xDB3]; + /* 0xDBB */ u8 field_0xDBB; /* 0xDBC */ u8 mType; - /* 0xDBD */ u8 _0xDBD[0xDC2 - 0xDBD]; + /* 0xDBD */ u8 _0xDBD[0xDC0 - 0xDBD]; + /* 0xDC2 */ u8 mCurrentAnmTexPat; // blink + /* 0xDC1 */ u8 field_0xDC1; /* 0xDC2 */ u8 mCurrentState; /* 0xDC3 */ u8 mNextState; /* 0xDC4 */ u8 _0xDC4[0xDC7 - 0xDC4]; @@ -90,6 +135,10 @@ private: /* 0xDE0 */ mColor mColor; /* 0xDE4 */ f32 field_0xDE4; /* 0xDE8 */ u8 _0xDE8[0xDF0 - 0xDE8]; + + // Controlled by dTgKiesuTag_c + static bool lbl_155_bss_388; + static bool lbl_155_bss_389; }; #endif diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index 258cc9b7..d94633c6 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -77,7 +77,7 @@ public: void fn_80030400(m3d::mdl_c &, u8, bool, u8); void fn_800306d0(); void fn_80030700(); - + dAcObjBase_c *attackPlayerOrScrapper(f32 biasToScrapper); static void fn_80030980(m3d::mdl_c &, s32, bool markDirty); void fn_80030c20(u32 flags, f32, f32, f32, f32); diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 384d253d..7d8c49e9 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -680,6 +680,10 @@ public: mSrc.mInfo.field_0x2 |= val; } + void Set_0x50(u32 val) { + field_0x50 = val; + } + public: /* 0x1C */ cCcD_SrcGObjTg mSrc; /* 0x2C */ mVec3_c mAtHitDir; @@ -1082,6 +1086,9 @@ public: void OnTgInfo_0x2(u16 val) { mTg.OnInfo_0x2(val); } + void SetTg_0x50(u16 val) { + mTg.Set_0x50(val); + } void SetTg_0x40000000() { mTg.OnSPrm(0x40000000); } @@ -1108,6 +1115,12 @@ public: void ClrCo_0x400() { mCo.OffSPrm(0x400); } + void OnCo_0x8000() { + mCo.OnSPrm(0x8000); + } + void ClrCo_0x8000() { + mCo.OffSPrm(0x8000); + } void SetCo_0x400() { mCo.OnSPrm(0x400); } diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index 5a22460c..c6667fcd 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -1,11 +1,21 @@ #include "d/a/e/d_a_e_ks.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/obj/d_a_obj_base.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_lin_chk.h" +#include "d/col/bg/d_bg_s_roof_chk.h" #include "d/t/d_t_ks.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_fanm.h" #include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resanmtexpat.h" +#include "toBeSorted/attention.h" #include "toBeSorted/time_area_mgr.h" SPECIAL_ACTOR_PROFILE(E_KS, dAcEKs_c, fProfile::E_KS, 0xFE, 0, 4099); @@ -134,7 +144,248 @@ f32 dAcEKs_c::getLineCrossYRange(const mVec3_c &pos, f32 range) { } } -// idk +// idk. + +bool dAcEKs_c::isOutsideRange() { + return attackPlayerOrScrapper(0.f)->mPosition.squareDistanceToXZ(mPosition) > 360000.f; +} + +bool dAcEKs_c::isNotWaitingNorDamage() { + if (!(mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Damage))) { + return true; + } + return false; +} + +bool dAcEKs_c::isTargeted() { + dAcObjBase_c *pTarget = AttentionManager::GetInstance()->getTargetedActor(); + if (!pTarget) { + return false; + } + + if (pTarget->mProfileName == fProfile::E_KS && pTarget == this) { + return true; + } + return false; +} + +bool dAcEKs_c::ChkWall() { + field_0xDBB++; + if (field_0xDBB > 5) { + field_0xDBB = 0; + mVec3_c offset(0, 0, 200.f); + mVec3_c pos; + mWorldMtx.multVec(offset, pos); + if (dBgS_ObjLinChk::LineCross(&mPosition, &pos, nullptr) && dBgS_ObjLinChk::ChkWall()) { + return true; + } + } + return false; +} + +void dAcEKs_c::ChkGnd() { + dBgS_ObjGndChk gndChk; + mVec3_c pos = field_0xBB0; + pos.y += 150.f; + gndChk.SetPos(&pos); + f32 chk = dBgS::GetInstance()->GroundCross(&gndChk); + if (field_0xBB0.y < chk + 120.f) { + field_0xBB0.y = chk + 120.f; + } +} + +void dAcEKs_c::ChkRoof() { + dBgS_ObjRoofChk roofChk; + mVec3_c pos = field_0xBB0; + pos.y -= 150.f; + roofChk.SetPos(&pos); + f32 chk = dBgS::GetInstance()->RoofChk(&roofChk); + if (field_0xBB0.y > chk - 120.f) { + field_0xBB0.y = chk - 120.f; + } +} + +bool dAcEKs_c::ChkHit() { + if (mAcch.ChkWallHit(nullptr) || mAcch.ChkGndHit() || mAcch.ChkRoofHit()) { + return true; + } else { + return false; + } +} + +void dAcEKs_c::fn_155_3460() { + lbl_155_bss_388 = true; + field_0xDA7 = true; +} + +void dAcEKs_c::fn_155_3480() { + if (field_0xDA7) { + lbl_155_bss_388 = 0; + field_0xDA7 = 0; + if (field_0xDA6) { + lbl_155_bss_389 = 0; + } + } +} + +bool dAcEKs_c::transitionToNextState() { + if (mCurrentState != mNextState) { + switch (mNextState) { + case 0: mStateMgr.changeState(StateID_Move); break; + case 1: mStateMgr.changeState(StateID_Wait); break; + case 2: mStateMgr.changeState(StateID_PathMove); break; + case 4: mStateMgr.changeState(StateID_WakeUp); break; + case 5: mStateMgr.changeState(StateID_ReturnToWait); break; + case 6: mStateMgr.changeState(StateID_Chase); break; + case 7: mStateMgr.changeState(StateID_ChaseAttack); break; + case 8: mStateMgr.changeState(StateID_Fighting); break; + case 9: mStateMgr.changeState(StateID_AttackReady); break; + case 10: mStateMgr.changeState(StateID_Attack); break; + case 11: mStateMgr.changeState(StateID_Damage); break; + case 12: mStateMgr.changeState(StateID_Stun); break; + case 13: mStateMgr.changeState(StateID_WindBlow); break; + } + mCurrentState = mNextState; + return true; + } + return false; +} + +void dAcEKs_c::setAnim(char *anm, f32 f0, f32 rate, f32 frame) { + mMdl.setAnm(anm, m3d::PLAY_MODE_4, f0); + mMdl.setRate(rate); + if (frame > 0.f) { + mMdl.setFrame(frame); + } +} + +void dAcEKs_c::fn_155_3720(f32 scale, f32 rate) { + f32 a = rate + scale * 0.01f; + f32 endFrame = mMdl.getAnm().getEndFrame(); + if (a > endFrame) { + a = endFrame; + } + mMdl.setRate(a); +} + +void dAcEKs_c::fn_155_3750(u8 state) { + switch (state) { + case 0: mNextState = state; break; + case 1: mNextState = 5; break; + case 2: mNextState = state; break; + default: mNextState = 0; break; + } +} + +void dAcEKs_c::fn_155_37A0() { + mSph.OnAtSet(); + if (mType == 2) { + fn_155_3E90(); + field_0xDA9 = 0; + field_0xD60 = 0; + } +} + +void dAcEKs_c::fn_155_37F0() { + if (mType == 2) { + fn_155_3E90(); + field_0xDA9 = 0; + field_0xD60 = 0; + } +} + +void dAcEKs_c::fn_155_3840() { + mSph.ClrAtSet(); + if (mType == 2) { + fn_155_3EC0(); + field_0xDA9 = 1; + } +} + +void dAcEKs_c::fn_155_3890() { + if (mType == 2) { + fn_155_3EC0(); + field_0xDA9 = 1; + } +} + +void dAcEKs_c::on_lbl_155_bss_389() { + lbl_155_bss_389 = true; +} + +void dAcEKs_c::setBlinkChecked(u8 blink) { + if (blink == mCurrentAnmTexPat) { + return; + } + setBlink(blink); +} + +void dAcEKs_c::fn_155_3900(s32 p0) { + switch (p0) { + case 0: { + if (!(mStateMgr.isState(StateID_Stun) || mStateMgr.isState(StateID_Damage) || + mStateMgr.isState(StateID_ReturnToWait) || mStateMgr.isState(StateID_Chase) || + mStateMgr.isState(StateID_ChaseAttack) || mStateMgr.isState(StateID_Fighting) || + mStateMgr.isState(StateID_AttackReady) || mStateMgr.isState(StateID_Attack) || + mStateMgr.isState(StateID_WindBlow))) { + setActorProperty(AC_PROP_0x1); + } else { + field_0xDB2 = 1; + } + } break; + case 1: { + unsetActorProperty(AC_PROP_0x1); + } break; + } +} + +void dAcEKs_c::setPitchYawToPoint(const mVec3_c &pnt) { + mPitch_0xC34 = -cLib::targetAngleX(mPosition, pnt); + mYaw_0xC36 = cLib::targetAngleY(mPosition, pnt); +} + +void dAcEKs_c::fn_155_3BD0(const mVec3_c &pnt) { + mWorldMtx.multVec(pnt, field_0xBB0); +} + +void dAcEKs_c::fn_155_3BE0(const mVec3_c &pnt) { + if (mStateMgr.isState(StateID_AttackReady) || mStateMgr.isState(StateID_Attack)) { + dAcObjBase_c *pAttack = attackPlayerOrScrapper(0.f); + if (pAttack->isPlayer()) { + mVec3_c v = static_cast(pAttack)->getCenterTranslation(); + pAttack->mWorldMtx.multVecSR(pnt, field_0xBBC); + field_0xBBC += v; + } else { + pAttack->mWorldMtx.multVec(pnt, field_0xBBC); + } + } else { + dAcObjBase_c *pAttack = attackPlayerOrScrapper(0.f); + pAttack->mWorldMtx.multVec(pnt, field_0xBB0); + } +} + +void dAcEKs_c::setBlink(u8 blink) { + nw4r::g3d::ResAnmTexPat pat(nullptr); + mCurrentAnmTexPat = blink; + switch (mCurrentAnmTexPat) { + case 0: pat = mResFile.GetResAnmTexPat("blink_1"); break; + case 1: pat = mResFile.GetResAnmTexPat("blink_2"); break; + case 2: pat = mResFile.GetResAnmTexPat("blink_3"); break; + } + mAnmTexPat.setAnm(mMdl.getModel(), pat, 0, m3d::PLAY_MODE_4); +} + +void dAcEKs_c::fn_155_3E90() { + mSph.OnTgElectric(); + mSph.SetTg_0x50(2); + mSph.OnCo_0x8000(); +} + +void dAcEKs_c::fn_155_3EC0() { + mSph.ClrTgElectric(); + mSph.SetTg_0x50(0); + mSph.ClrCo_0x8000(); +} void dAcEKs_c::initializeState_Wait() {} void dAcEKs_c::executeState_Wait() {} From 5b6788804a0d401aba6b2cfb6dc90e137e6dc02a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Thu, 7 May 2026 10:02:46 -0400 Subject: [PATCH 03/17] dAcEKs_c + vt_1C0 name for dAcPy_c --- config/SOUE01/rels/d_a_e_ksNP/symbols.txt | 4 +- config/SOUE01/symbols.txt | 2 +- include/d/a/d_a_player.h | 4 -- include/d/a/e/d_a_e_ks.h | 18 +++++++-- include/d/d_player_act.h | 8 ++-- src/REL/d/a/e/d_a_e_ks.cpp | 37 +++++++++++++++++++ src/REL/d/a/e/d_a_e_remly.cpp | 3 +- src/d/d_pad.cpp | 2 +- src/d/lyt/meter/d_lyt_meter.cpp | 13 ++++--- src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp | 4 +- src/d/snd/d_snd_sound_equipment_callbacks.cpp | 2 +- 11 files changed, 72 insertions(+), 25 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt index 7fd527e4..33d4f584 100644 --- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt @@ -32,8 +32,8 @@ fn_155_1C80 = .text:0x00001C80; // type:function size:0x5E4 fn_155_2270 = .text:0x00002270; // type:function size:0x754 fn_155_29D0 = .text:0x000029D0; // type:function size:0x1A8 fn_155_2B80 = .text:0x00002B80; // type:function size:0x1E0 -fn_155_2D60 = .text:0x00002D60; // type:function size:0x138 -fn_155_2EA0 = .text:0x00002EA0; // type:function size:0x118 +fn_155_2D60__8dAcEKs_cFv = .text:0x00002D60; // type:function size:0x138 +fn_155_2EA0__8dAcEKs_cFv = .text:0x00002EA0; // type:function size:0x118 isOutsideRange__8dAcEKs_cFv = .text:0x00002FC0; // type:function size:0x84 isNotWaitingNorDamage__8dAcEKs_cFv = .text:0x00003050; // type:function size:0xAC isTargeted__8dAcEKs_cFv = .text:0x00003100; // type:function size:0xF4 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4891a582..bad4ce91 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -978,7 +978,7 @@ polyAttrsToGroundEffectIdx__14dJEffManager_cFll = .text:0x8002A380; // type:func spawnGroundEffect__14dJEffManager_cFRC7mVec3_cUcUcRC7mVec3_clff = .text:0x8002A450; // type:function size:0x1C0 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 +getBeetleInFlight__17daPlayerActBase_cCFv = .text:0x8002B0F0; // type:function size:0x8 init__14dWaterEffect_cFP12dAcObjBase_cfff = .text:0x8002B100; // type:function size:0x14 execute__14dWaterEffect_cFff = .text:0x8002B120; // type:function size:0x1F4 drawAfter__18JPAEmitterCallBackFP14JPABaseEmitter = .text:0x8002B320; // type:function size:0x4 diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index c1d45efd..e5e6669c 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -91,10 +91,6 @@ public: return mHeldResFile; } - inline bool hasvt_0x1C0() const { - return vt_0x1C0() != nullptr; - } - inline bool isAffectedByStaminaPotion() const { return FileManager::GetInstance()->hasStaminaPotionNormal() && getRidingActorType() != RIDING_BOAT; } diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index a16652f1..21f29941 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -53,6 +53,9 @@ public: /* 0 -> blink_1, 1 -> blink_2, 2 -> blink_3*/ void setBlink(u8 blink); void setBlinkChecked(u8 blink); + bool fn_155_29D0(s32 p1); + bool fn_155_2D60(bool b, s32 p1); + bool fn_155_2EA0(); bool isOutsideRange(); bool isNotWaitingNorDamage(); bool isTargeted(); @@ -101,10 +104,17 @@ private: /* 0xB8C */ u8 _0xB8C[0xBB0 - 0xB8C]; /* 0xBB0 */ mVec3_c field_0xBB0; /* 0xBBC */ mVec3_c field_0xBBC; - /* 0xBC8 */ u8 _0xBC8[0xC34 - 0xBC8]; - /* 0xD32 */ mAng mPitch_0xC34; - /* 0xD32 */ mAng mYaw_0xC36; - /* 0xC38 */ u8 _0xC38[0xD20 - 0xC38]; + /* 0xBC8 */ u8 _0xBC8[0xBF8 - 0xBC8]; + /* 0xBF8 */ mVec3_c field_0xBF8; + /* 0xC04 */ u8 _0xC04[0xC28 - 0xC04]; + /* 0xC28 */ mVec3_c field_0xC28; + /* 0xC34 */ mAng mPitch_0xC34; + /* 0xC36 */ mAng mYaw_0xC36; + /* 0xC38 */ u8 _0xC38[0xC3C - 0xC38]; + /* 0xC3C */ f32 field_0xC3C; + /* 0xC40 */ f32 field_0xC40; + /* 0xC44 */ u8 _0xC44[0xD1C - 0xC44]; + /* 0xD1C */ f32 field_0xD1C; /* 0xD20 */ f32 field_0xD20; /* 0xD24 */ u8 _0xD24[0xD32 - 0xD24]; /* 0xD32 */ s16 mTimer; diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index 1d4a0096..a9a9a2b3 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -250,7 +250,9 @@ public: /* vt 0x1BC */ virtual UNKWORD vt_0x1BC() { return 0; } - /* vt 0x1C0 */ virtual void *vt_0x1C0() const { + + // I believe this can only return the Beetle Actor in-flight (not on hand) + /* vt 0x1C0 */ virtual dAcObjBase_c *getBeetleInFlight() const { return nullptr; } /* vt 0x1C4 */ virtual UNKWORD getActorInActorRef1() { @@ -648,8 +650,8 @@ public: return mSpecificAttackDirection; } - inline bool hasvt_0x1C0() const { - return vt_0x1C0() != nullptr; + inline bool isBeetleInFlight() const { + return getBeetleInFlight() != nullptr; } static s32 getCurrentSwordTypeInline() { diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index c6667fcd..fd0ae575 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -146,6 +146,43 @@ f32 dAcEKs_c::getLineCrossYRange(const mVec3_c &pos, f32 range) { // idk. +bool dAcEKs_c::fn_155_2D60(bool b, s32 p1) { + f32 f0 = field_0xC40 + 1500.f; + f32 f1 = field_0xC3C + 700.f; + dAcObjBase_c *pObj = attackPlayerOrScrapper(0.f); + field_0xBF8.set(pObj->mPosition); + if (field_0xBF8.squareDistanceToXZ(mPosition) < f1 * f1) { + f32 f2 = field_0xBF8.y - mPosition.y; + if (f2 <= 0.f && f2 > -f0) { + if (b) { + if (!fn_155_29D0(p1)) { + return true; + } + } else { + return true; + } + } + } + return false; +} + +bool dAcEKs_c::fn_155_2EA0() { + f32 f0 = field_0xC40 + 1500.f; + f32 f1 = field_0xC3C + 700.f; + dAcObjBase_c *pObj = dAcPy_c::GetLink()->getBeetleInFlight(); + if (pObj) { + field_0xC28.set(pObj->mPosition); + field_0xD1C = field_0xC28.squareDistanceToXZ(mPosition); + if (field_0xD1C < f1 * f1) { + f32 f2 = field_0xC28.y - mPosition.y; + if (f2 <= 0.f && f2 > -f0) { + return true; + } + } + } + return false; +} + bool dAcEKs_c::isOutsideRange() { return attackPlayerOrScrapper(0.f)->mPosition.squareDistanceToXZ(mPosition) > 360000.f; } 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 5b363fa1..90ad9b28 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -1999,8 +1999,7 @@ bool dAcEremly_c::calcHeadRotation(bool lookAtTarget, const mAng &range) { 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()); + dAcObjBase_c *pActor = pPlayer->getBeetleInFlight(); if (pActor) { field_0xA50.set(pActor->mPosition); field_0xB56 = 30; diff --git a/src/d/d_pad.cpp b/src/d/d_pad.cpp index d20ec8f5..c49a6f0d 100644 --- a/src/d/d_pad.cpp +++ b/src/d/d_pad.cpp @@ -225,7 +225,7 @@ void beginPad_BR() { if ((dCsGame_c::GetInstance() != nullptr && dCsGame_c::GetInstance()->shouldDraw() && !ex.field_0x22D0) || (dAcPy_c::GetLink() != nullptr && dAcPy_c::GetLink()->checkActionFlagsCont(0x400 | 0x100 | 0x80 | 0x40 | 0x10 | 0x4 | 0x2 | 0x1) && - !dAcPy_c::GetLink()->vt_0x1C0() && !dLytMeter_c::GetMain()->getField_0x1377F()) || + !dAcPy_c::GetLink()->getBeetleInFlight() && !dLytMeter_c::GetMain()->getField_0x1377F()) || ex.field_0x22CF) { if (dLytControlGame_c::getInstance() && dLytControlGame_c::getInstance()->isStateNormal()) { if (!(dPadManager_c::GetInstance() && dPadManager_c::GetInstance()->getField_0x25())) { diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index 4de66635..25798d54 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -1179,8 +1179,9 @@ void dLytMeterMain_c::checkPaneVisibility() { || (MinigameManager::isInMinigameState(MinigameManager::TRIAL_TIME_ATTACK) && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_B) == LytDoButtonRelated::ACT_IE_NONE) || - (dLytMeter_c::getField_0x13B66() || (shouldBeHiddenGeneral() && !mItemSelect.fn_800F02F0() && !isDoingSkyKeepPuzzle()) || - isInModeMap() || isInModePause())) { + (dLytMeter_c::getField_0x13B66() || + (shouldBeHiddenGeneral() && !mItemSelect.fn_800F02F0() && !isDoingSkyKeepPuzzle()) || isInModeMap() || + isInModePause())) { mPanesVisible[METER_ANIM_ITEM_SELECT] = false; } @@ -1278,7 +1279,8 @@ void dLytMeterMain_c::checkPaneVisibility() { MinigameManager::isInMinigameState(MinigameManager::TRIAL_TIME_ATTACK) || MinigameManager::isInMinigameState(MinigameManager::PUMPKIN_ARCHERY) || MinigameManager::isInMinigameState(MinigameManager::SPIRAL_CHARGE_TUTORIAL) || - MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER) || shouldBeHiddenGeneral() || mIsInSwordDrawEvent) + MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER) || shouldBeHiddenGeneral() || + mIsInSwordDrawEvent) || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) || @@ -1352,7 +1354,7 @@ void dLytMeterMain_c::checkPaneVisibility() { } } - if ((dAcPy_c::GetLink()->hasvt_0x1C0() || dAcPy_c::GetLink()->checkActionFlagsCont(0x10) || + if ((dAcPy_c::GetLink()->isBeetleInFlight() || dAcPy_c::GetLink()->checkActionFlagsCont(0x10) || (shouldBeHiddenGeneral() && !mHelpOpen) || mGanbariGauge.fn_80104760() || MinigameManager::isInMinigameState(MinigameManager::FUN_FUN_ISLAND) || @@ -1490,7 +1492,8 @@ void dLytMeterMain_c::checkPaneVisibility() { if (!field_0x137B2 || dLytAreaCaption_c::getVisible() || fn_800D5380(false) || MinigameManager::isInAnyMinigame() || mIsInSwordDrawEvent - || shouldBeHiddenGeneral() || dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause()) { + || shouldBeHiddenGeneral() || dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || + isInModePause()) { mDrinkVisible = false; } diff --git a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp index da100999..6a7d7618 100644 --- a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp +++ b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp @@ -600,7 +600,7 @@ bool dLytMeterGanbariGauge_c::execute() { mAnm[GANBARI_ANIM_DRINK].setFrame(drinkFrame); mAnm[GANBARI_ANIM_DRINK].setAnimEnable(true); - if (!EventManager::isInEvent() && !dAcPy_c::GetLink()->hasvt_0x1C0() && + if (!EventManager::isInEvent() && !dAcPy_c::GetLink()->isBeetleInFlight() && !dAcPy_c::GetLink()->checkActionFlagsCont(0x10) && (d3d::isOnScreen(dAcPy_c::GetLink()->mPositionCopy3) || fn_80104710(false) || isCrawling()) && *mStateMgrWheel.getStateID() != StateID_Full && *mStateMgrMain.getStateID() == StateID_InvisibleWait && @@ -609,7 +609,7 @@ bool dLytMeterGanbariGauge_c::execute() { } else if (!EventManager::isInEvent() && *mStateMgrWheel.getStateID() == StateID_Full && *mStateMgrWheel.getOldStateID() != StateID_Full && *mStateMgrMain.getStateID() == StateID_Wait) { mStateMgrMain.changeState(StateID_OutWait); - } else if ((EventManager::isInEvent() || dAcPy_c::GetLink()->hasvt_0x1C0() || + } else if ((EventManager::isInEvent() || dAcPy_c::GetLink()->isBeetleInFlight() || dAcPy_c::GetLink()->checkActionFlagsCont(0x10) || (!d3d::isOnScreen(dAcPy_c::GetLink()->mPositionCopy3) && !fn_80104710(false) && !isCrawling())) && *mStateMgrMain.getStateID() == StateID_Wait) { diff --git a/src/d/snd/d_snd_sound_equipment_callbacks.cpp b/src/d/snd/d_snd_sound_equipment_callbacks.cpp index d5260734..75d9e10f 100644 --- a/src/d/snd/d_snd_sound_equipment_callbacks.cpp +++ b/src/d/snd/d_snd_sound_equipment_callbacks.cpp @@ -27,7 +27,7 @@ void dSndSourceEquipment_c::cbBeFlyLv(dSndSeSound_c *sound, dSoundSource_c *sour } void dSndSourceEquipment_c::cbBeThrowRc(dSndSeSound_c *sound, dSoundSource_c *source, nw4r::snd::SoundHandle &handle) { - if (dAcPy_c::GetLink() != nullptr && !dAcPy_c::GetLink()->hasvt_0x1C0()) { + if (dAcPy_c::GetLink() != nullptr && !dAcPy_c::GetLink()->isBeetleInFlight()) { handle.Stop(10); return; } From d2d52cc88c6c4223d6eb892055c73bd937054e2f Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Thu, 14 May 2026 17:50:49 -0400 Subject: [PATCH 04/17] dAcEKs_c + dTgKiesuTag_c progress --- config/SOUE01/rels/d_a_e_ksNP/symbols.txt | 89 +- config/SOUE01/symbols.txt | 12 +- include/d/a/e/d_a_e_ks.h | 129 ++- include/d/a/e/d_a_en_base.h | 7 +- include/d/a/obj/d_a_obj_base.h | 3 + include/d/col/c/c_cc_d.h | 2 +- include/d/d_pouch.h | 2 + include/d/t/d_t_ks.h | 78 +- src/REL/d/a/e/d_a_e_ks.cpp | 946 ++++++++++++++++++++-- src/REL/d/a/e/d_a_e_sm.cpp | 12 +- src/d/col/c/c_cc_d.cpp | 2 +- 11 files changed, 1156 insertions(+), 126 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt index 33d4f584..69398a65 100644 --- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt @@ -3,43 +3,43 @@ _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global -fn_155_F0 = .text:0x000000F0; // type:function size:0x40 +__dt__7mVec3_cFv = .text:0x000000F0; // type:function size:0x40 dAcEKs_c_classInit__Fv = .text:0x00000130; // type:function size:0x190 -fn_155_2C0 = .text:0x000002C0; // type:function size:0x58 +__dt__15dShadowCircle_cFv = .text:0x000002C0; // type:function size:0x58 __dt__20sFState_c<8dAcEKs_c>Fv = .text:0x00000320; // type:function size:0x58 __dt__23sFStateFct_c<8dAcEKs_c>Fv = .text:0x00000380; // type:function size:0x6C __dt__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000003F0; // type:function size:0xA0 __dt__46sFStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000490; // type:function size:0xA4 -fn_155_540 = .text:0x00000540; // type:function size:0x5C -fn_155_5A0 = .text:0x000005A0; // type:function size:0x4 +__dt__14dWaterEffect_cFv = .text:0x00000540; // type:function size:0x5C +__ct__7mVec3_cFv = .text:0x000005A0; // type:function size:0x4 restorePosRotFromCopy__8dAcEKs_cFv = .text:0x000005B0; // type:function size:0x134 linkKiesuTag__8dAcEKs_cFP13dTgKiesuTag_c = .text:0x000006F0; // type:function size:0x8 setStartingState__8dAcEKs_cFv = .text:0x00000700; // type:function size:0x1A8 changeState__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000008B0; // type:function size:0x10 setIdleState__8dAcEKs_cFv = .text:0x000008C0; // type:function size:0xCC getLineCrossYRange__8dAcEKs_cFRC7mVec3_cf = .text:0x00000990; // type:function size:0xD0 -fn_155_A60 = .text:0x00000A60; // type:function size:0x6B0 +fn_155_A60__8dAcEKs_cFv = .text:0x00000A60; // type:function size:0x6B0 getStateID__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001110; // type:function size:0x10 -fn_155_1120 = .text:0x00001120; // type:function size:0x1C -fn_155_1140 = .text:0x00001140; // type:function size:0x12C -fn_155_1270 = .text:0x00001270; // type:function size:0x54 -fn_155_12D0 = .text:0x000012D0; // type:function size:0xA0 -fn_155_1370 = .text:0x00001370; // type:function size:0x58 -fn_155_13D0 = .text:0x000013D0; // type:function size:0x58 -fn_155_1430 = .text:0x00001430; // type:function size:0x38 -fn_155_1470 = .text:0x00001470; // type:function size:0x80C -fn_155_1C80 = .text:0x00001C80; // type:function size:0x5E4 -fn_155_2270 = .text:0x00002270; // type:function size:0x754 -fn_155_29D0 = .text:0x000029D0; // type:function size:0x1A8 -fn_155_2B80 = .text:0x00002B80; // type:function size:0x1E0 +calcTimer__4sLibFPUc_Uc = .text:0x00001120; // type:function size:0x1C +kill__8dAcEKs_cFb = .text:0x00001140; // type:function size:0x12C +chaseTargetY__8dAcEKs_cFff = .text:0x00001270; // type:function size:0x54 +playBlinkAnm__8dAcEKs_cFv = .text:0x000012D0; // type:function size:0xA0 +soundSqueak__8dAcEKs_cFv = .text:0x00001370; // type:function size:0x58 +soundStun__8dAcEKs_cFv = .text:0x000013D0; // type:function size:0x58 +fn_155_1430__8dAcEKs_cFv = .text:0x00001430; // type:function size:0x38 +fn_155_1470__8dAcEKs_cFv = .text:0x00001470; // type:function size:0x80C +fn_155_1C80__8dAcEKs_cFv = .text:0x00001C80; // type:function size:0x5E4 +fn_155_2270__8dAcEKs_cFv = .text:0x00002270; // type:function size:0x754 +fn_155_29D0__8dAcEKs_cFl = .text:0x000029D0; // type:function size:0x1A8 +fn_155_2B80__8dAcEKs_cFbl = .text:0x00002B80; // type:function size:0x1E0 fn_155_2D60__8dAcEKs_cFv = .text:0x00002D60; // type:function size:0x138 fn_155_2EA0__8dAcEKs_cFv = .text:0x00002EA0; // type:function size:0x118 isOutsideRange__8dAcEKs_cFv = .text:0x00002FC0; // type:function size:0x84 isNotWaitingNorDamage__8dAcEKs_cFv = .text:0x00003050; // type:function size:0xAC isTargeted__8dAcEKs_cFv = .text:0x00003100; // type:function size:0xF4 -ChkWall__8dAcEKs_cFv = .text:0x00003200; // type:function size:0xA4 -ChkGnd__8dAcEKs_cFv = .text:0x000032B0; // type:function size:0x94 -ChkRoof__8dAcEKs_cFv = .text:0x00003350; // type:function size:0x94 +checkWallCross__8dAcEKs_cFv = .text:0x00003200; // type:function size:0xA4 +adjustTargetGnd__8dAcEKs_cFv = .text:0x000032B0; // type:function size:0x94 +adjustTargetRoof__8dAcEKs_cFv = .text:0x00003350; // type:function size:0x94 ChkHit__8dAcEKs_cFv = .text:0x000033F0; // type:function size:0x68 fn_155_3460__8dAcEKs_cFv = .text:0x00003460; // type:function size:0x14 fn_155_3480__8dAcEKs_cFv = .text:0x00003480; // type:function size:0x34 @@ -58,13 +58,13 @@ setPitchYawToPoint__8dAcEKs_cFRC7mVec3_c = .text:0x00003B70; // type:function si fn_155_3BD0__8dAcEKs_cFRC7mVec3_c = .text:0x00003BD0; // type:function size:0x10 fn_155_3BE0__8dAcEKs_cFRC7mVec3_c = .text:0x00003BE0; // type:function size:0x178 setBlink__8dAcEKs_cFUc = .text:0x00003D60; // type:function size:0xA8 -fn_155_3E10 = .text:0x00003E10; // type:function size:0x1C -fn_155_3E30 = .text:0x00003E30; // type:function size:0x24 -fn_155_3E60 = .text:0x00003E60; // type:function size:0x2C +checkPathPntParam__8dAcEKs_cFUl = .text:0x00003E10; // type:function size:0x1C +fn_155_3E30__8dAcEKs_cFv = .text:0x00003E30; // type:function size:0x24 +clampRotationX__8dAcEKs_cFv = .text:0x00003E60; // type:function size:0x2C fn_155_3E90__8dAcEKs_cFv = .text:0x00003E90; // type:function size:0x24 fn_155_3EC0__8dAcEKs_cFv = .text:0x00003EC0; // type:function size:0x24 -fn_155_3EF0 = .text:0x00003EF0; // type:function size:0x5C -fn_155_3F50 = .text:0x00003F50; // type:function size:0x10C +fn_155_3EF0__8dAcEKs_cFv = .text:0x00003EF0; // type:function size:0x5C +fn_155_3F50__8dAcEKs_cFv = .text:0x00003F50; // type:function size:0x10C AcEKs__initModels = .text:0x00004060; // type:function size:0x120 AcEKs__init1 = .text:0x00004180; // type:function size:0x57C AcEKs__init2 = .text:0x00004700; // type:function size:0x178 @@ -174,27 +174,30 @@ lbl_155_data_188 = .data:0x00000188; // type:object size:0x7 data:string lbl_155_data_190 = .data:0x00000190; // type:object size:0x8 data:string lbl_155_data_198 = .data:0x00000198; // type:object size:0x4 data:4byte lbl_155_data_19C = .data:0x0000019C; // type:object size:0x4 data:4byte -AcEKs__vtable = .data:0x000001A0; // type:object size:0x90 -lbl_155_data_230 = .data:0x00000230; // type:object size:0x30 -lbl_155_data_260 = .data:0x00000260; // type:object size:0x30 -lbl_155_data_290 = .data:0x00000290; // type:object size:0x18 -lbl_155_data_2A8 = .data:0x000002A8; // type:object size:0x18 -lbl_155_data_2C0 = .data:0x000002C0; // type:object size:0xC -lbl_155_data_2CC = .data:0x000002CC; // type:object size:0x388 +__vt__8dAcEKs_c = .data:0x000001A0; // type:object size:0x90 +__vt__46sFStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c> = .data:0x00000230; // type:object size:0x30 +__vt__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000260; // type:object size:0x30 +__vt__23sFStateFct_c<8dAcEKs_c> = .data:0x00000290; // type:object size:0x18 +__vt__20sFState_c<8dAcEKs_c> = .data:0x000002A8; // type:object size:0x18 +__vt__14dWaterEffect_c = .data:0x000002C0; // type:object size:0xC +__vt__15dShadowCircle_c = .data:0x000002CC; // type:object size:0x388 lbl_155_data_654 = .data:0x00000654; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_155_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -AcEKs__StateID_Wait = .bss:0x00000018; // type:object size:0x40 data:4byte -AcEKs__StateID_WakeUp = .bss:0x00000058; // type:object size:0x40 data:4byte -AcEKs__StateID_ReturnToWait = .bss:0x00000098; // type:object size:0x40 data:4byte -AcEKs__StateID_WaitReady = .bss:0x000000D8; // type:object size:0x80 data:4byte -AcEKs__StateID_Chase = .bss:0x00000158; // type:object size:0x40 data:4byte -AcEKs__StateID_ChaseAttack = .bss:0x00000198; // type:object size:0x40 data:4byte -AcEKs__StateID_Fighting = .bss:0x000001D8; // type:object size:0x40 data:4byte -AcEKs__StateID_AttackReady = .bss:0x00000218; // type:object size:0x40 data:4byte -AcEKs__StateID_Attack = .bss:0x00000258; // type:object size:0x40 data:4byte -AcEKs__StateID_Damage = .bss:0x00000298; // type:object size:0x40 data:4byte -AcEKs__StateID_Stun = .bss:0x000002D8; // type:object size:0xB0 data:4byte +StateID_Wait__8dAcEKs_c = .bss:0x00000018; // type:object size:0x30 data:4byte +StateID_WakeUp__8dAcEKs_c = .bss:0x00000058; // type:object size:0x30 data:4byte +StateID_ReturnToWait__8dAcEKs_c = .bss:0x00000098; // type:object size:0x30 data:4byte +StateID_WaitReady__8dAcEKs_c = .bss:0x000000D8; // type:object size:0x30 data:4byte +StateID_Move__8dAcEKs_c = .bss:0x00000118; // type:object size:0x30 data:4byte +StateID_Chase__8dAcEKs_c = .bss:0x00000158; // type:object size:0x30 data:4byte +StateID_ChaseAttack__8dAcEKs_c = .bss:0x00000198; // type:object size:0x30 data:4byte +StateID_Fighting__8dAcEKs_c = .bss:0x000001D8; // type:object size:0x30 data:4byte +StateID_AttackReady__8dAcEKs_c = .bss:0x00000218; // type:object size:0x30 data:4byte +StateID_Attack__8dAcEKs_c = .bss:0x00000258; // type:object size:0x30 data:4byte +StateID_Damage__8dAcEKs_c = .bss:0x00000298; // type:object size:0x30 data:4byte +StateID_Stun__8dAcEKs_c = .bss:0x000002D8; // type:object size:0x30 data:4byte +StateID_WindBlow__8dAcEKs_c = .bss:0x00000318; // type:object size:0x30 data:4byte +StateID_PathMove__8dAcEKs_c = .bss:0x00000358; // type:object size:0x30 data:4byte lbl_155_bss_388 = .bss:0x00000388; // type:object size:0x1 data:byte lbl_155_bss_389 = .bss:0x00000389; // type:object size:0x1 data:byte lbl_155_bss_38A = .bss:0x0000038A; // type:object size:0x1 data:byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index bad4ce91..64adb455 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1159,8 +1159,8 @@ fn_8002F710 = .text:0x8002F710; // type:function size:0x110 checkRefArrayAtIndex__17daPlayerActBase_cFv = .text:0x8002F820; // type:function size:0x8 sizeOfActorRefs_16__17daPlayerActBase_cFv = .text:0x8002F830; // type:function size:0x8 fn_8002F840 = .text:0x8002F840; // type:function size:0x8 -fn_8002F850 = .text:0x8002F850; // type:function size:0x70 -fn_8002F8C0 = .text:0x8002F8C0; // type:function size:0x70 +playDeathEffect0__11dAcEnBase_cFRC7mVec3_cPC7mVec3_cb = .text:0x8002F850; // type:function size:0x70 +playDeathEffect1__11dAcEnBase_cFRC7mVec3_cPC7mVec3_cb = .text:0x8002F8C0; // type:function size:0x70 fn_8002F930 = .text:0x8002F930; // type:function size:0xB4 ActorEnemyBase__setEndat = .text:0x8002F9F0; // type:function size:0x88 fn_8002FA80 = .text:0x8002FA80; // type:function size:0xB4 @@ -1180,9 +1180,9 @@ fn_80030390 = .text:0x80030390; // type:function size:0x64 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 -fn_80030700 = .text:0x80030700; // type:function size:0x24 -attackPlayerOrScrapper__11dAcEnBase_cFf = .text:0x80030730; // type:function size:0xB0 +fn_800306D0__11dAcEnBase_cFv = .text:0x800306D0; // type:function size:0x24 +fn_80030700__11dAcEnBase_cFv = .text:0x80030700; // type:function size:0x24 +targetPlayerOrScrapper__11dAcEnBase_cFf = .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 @@ -10102,7 +10102,7 @@ fn_8018B1D0 = .text:0x8018B1D0; // type:function size:0x60 fn_8018B230 = .text:0x8018B230; // type:function size:0x74 ActorLink__handleHotPumpkinSoup = .text:0x8018B2B0; // type:function size:0xE4 fn_8018B3A0 = .text:0x8018B3A0; // type:function size:0x80 -shouldDropItemForChance = .text:0x8018B420; // type:function size:0x84 +tryDropItem__Ff = .text:0x8018B420; // type:function size:0x84 getMaxBeaconCount__Fv = .text:0x8018B4B0; // type:function size:0x44 doesStageForbidBeaconPlacement__Fv = .text:0x8018B500; // type:function size:0x40 getBeaconPosition__FUl = .text:0x8018B540; // type:function size:0x60 diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index 21f29941..05e94685 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -43,25 +43,46 @@ public: STATE_FUNC_DECLARE(dAcEKs_c, WindBlow); STATE_FUNC_DECLARE(dAcEKs_c, PathMove); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEKs_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEKs_c); + public: void linkKiesuTag(dTgKiesuTag_c *pTgKs); void setStartingState(); void setIdleState(); + void fn_155_A60(); + f32 getLineCrossYRange(const mVec3_c &pos, f32 range); + void kill(bool dropItem); + void chaseTargetY(f32, f32); + void playBlinkAnm(); + void soundSqueak(); + void soundStun(); + void fn_155_1430(); + + void fn_155_1470(); + + // Move impl? + void fn_155_1C80(); + /* 0 -> blink_1, 1 -> blink_2, 2 -> blink_3*/ void setBlink(u8 blink); void setBlinkChecked(u8 blink); + + void fn_155_2270(); + /* p1 = 0 -> just LineCross return check, 1 -> increment field_0xDCB till 10 then return check*/ bool fn_155_29D0(s32 p1); + bool fn_155_2B80(bool b, s32 p1); bool fn_155_2D60(bool b, s32 p1); bool fn_155_2EA0(); bool isOutsideRange(); bool isNotWaitingNorDamage(); bool isTargeted(); - bool ChkWall(); - void ChkGnd(); - void ChkRoof(); + bool checkWallCross(); + void adjustTargetGnd(); + void adjustTargetRoof(); bool ChkHit(); void fn_155_3460(); void fn_155_3480(); @@ -79,9 +100,17 @@ public: void setPitchYawToPoint(const mVec3_c &pnt); void fn_155_3BD0(const mVec3_c &); void fn_155_3BE0(const mVec3_c &); + void clampRotationX(); + bool checkPathPntParam(u32 param); + void fn_155_3E30(); void fn_155_3E90(); void fn_155_3EC0(); + /* Some Timestone Check */ + bool fn_155_3EF0(); + + void fn_155_3F50(); + private: /* 0x378 */ dAcRef_c mTgRef; /* 0x384 */ nw4r::g3d::ResFile mResFile; @@ -101,44 +130,112 @@ private: /* 0xAA8 */ u8 field_0xAB0; /* 0xAB1 */ u8 _0xAB1[0xB14 - 0xAB1]; /* 0xB14 */ mVec3_c mPnts[10]; - /* 0xB8C */ u8 _0xB8C[0xBB0 - 0xB8C]; - /* 0xBB0 */ mVec3_c field_0xBB0; + /* 0xB8C */ mVec3_c field_0xB8C; + /* 0xB98 */ u8 _0xB98[0xBB0 - 0xB98]; + /* 0xBB0 */ mVec3_c mTargetPos; /* 0xBBC */ mVec3_c field_0xBBC; - /* 0xBC8 */ u8 _0xBC8[0xBF8 - 0xBC8]; + /* 0xBC8 */ mVec3_c field_0xBC8; + /* 0xBD4 */ mVec3_c field_0xBD4; + /* 0xBE0 */ mVec3_c field_0xBE0; + /* 0xBEC */ mVec3_c field_0xBEC; /* 0xBF8 */ mVec3_c field_0xBF8; - /* 0xC04 */ u8 _0xC04[0xC28 - 0xC04]; + /* 0xC04 */ mVec3_c field_0xC04; + /* 0xC10 */ mVec3_c field_0xC10; + /* 0xC1C */ mVec3_c field_0xC1C; /* 0xC28 */ mVec3_c field_0xC28; /* 0xC34 */ mAng mPitch_0xC34; /* 0xC36 */ mAng mYaw_0xC36; /* 0xC38 */ u8 _0xC38[0xC3C - 0xC38]; /* 0xC3C */ f32 field_0xC3C; /* 0xC40 */ f32 field_0xC40; - /* 0xC44 */ u8 _0xC44[0xD1C - 0xC44]; + /* 0xC44 */ f32 field_0xC44; + /* 0xC48 */ f32 field_0xC48; + /* 0xC4C */ u8 _0xC4C[0xC70 - 0xC4C]; + /* 0xC70 */ f32 field_0xC70; + /* 0xC74 */ u8 _0xC74[0xD00 - 0xC74]; + /* 0xD00 */ f32 field_0xD00; + /* 0xD04 */ f32 field_0xD04; + /* 0xD08 */ f32 field_0xD08; + /* 0xD0C */ f32 field_0xD0C; + /* 0xD10 */ f32 field_0xD10; + /* 0xD14 */ f32 field_0xD14; + /* 0xD18 */ f32 field_0xD18; /* 0xD1C */ f32 field_0xD1C; /* 0xD20 */ f32 field_0xD20; /* 0xD24 */ u8 _0xD24[0xD32 - 0xD24]; /* 0xD32 */ s16 mTimer; - /* 0xD34 */ u8 _0xD34[0xD60 - 0xD34]; + /* 0xD34 */ u8 _0xD34[0xD52 - 0xD34]; + /* 0xD52 */ s16 field_0xD52; + /* 0xD54 */ s16 field_0xD54; + /* 0xD56 */ u8 _0xD56[0xD5E - 0xD56]; + /* 0xD5E */ s16 field_0xD5E; /* 0xD60 */ s16 field_0xD60; - /* 0xD62 */ u8 _0xD62[0xDA6 - 0xD62]; + /* 0xD62 */ u8 _0xD62[0xD6A - 0xD62]; + /* 0xD6A */ s16 field_0xD6A; + /* 0xD6C */ s16 field_0xD6C; + /* 0xD6E */ s16 field_0xD6E; + /* 0xD70 */ s16 field_0xD70; + /* 0xD72 */ s16 field_0xD72; + /* 0xD74 */ s16 field_0xD74; + /* 0xD76 */ s16 field_0xD76; + /* 0xD78 */ s16 mBlinkTimer; + /* 0xD7A */ s16 field_0xD7A; + /* 0xD7C */ s16 field_0xD7C; + /* 0xD7E */ s16 mSqueakSoundTimer; + /* 0xD80 */ s16 mStunSoundTimer; + /* 0xD82 */ s16 field_0xD82; + /* 0xD84 */ s16 field_0xD84; + /* 0xD86 */ s16 field_0xD86; + /* 0xD88 */ s16 field_0xD88; + /* 0xD8A */ s16 field_0xD8A; + /* 0xD8C */ s16 field_0xD8C; + /* 0xD8E */ s16 field_0xD8E; + /* 0xD90 */ s16 field_0xD90; + /* 0xD92 */ s16 field_0xD92; + /* 0xD94 */ s16 field_0xD94; + /* 0xD96 */ s16 field_0xD96; + /* 0xD98 */ s16 field_0xD98; + /* 0xD9A */ s16 field_0xD9A; + /* 0xD9C */ s16 field_0xD9C; + /* 0xD9E */ s16 field_0xD9E; + /* 0xDA0 */ s16 field_0xDA0; + /* 0xDA2 */ u8 _0xDA2[0xDA5 - 0xDA2]; + /* 0xDA5 */ u8 field_0xDA5; /* 0xDA6 */ u8 field_0xDA6; /* 0xDA7 */ u8 field_0xDA7; /* 0xDA8 */ u8 field_0xDA8; /* 0xDA9 */ u8 field_0xDA9; - /* 0xDAA */ u8 _0xDAA[0xDB1 - 0xDAA]; + /* 0xDAA */ u8 _0xDAA[0xDAF - 0xDAA]; + /* 0xDAF */ u8 field_0xDAF; + /* 0xDB0 */ u8 field_0xDB0; /* 0xDB1 */ u8 field_0xDB1; /* 0xDB2 */ u8 field_0xDB2; - /* 0xDB3 */ u8 _0xDB3[0xDBB - 0xDB3]; + /* 0xDB3 */ u8 field_0xDB3; + /* 0xDB4 */ u8 field_0xDB4; + /* 0xDB5 */ u8 field_0xDB5; + /* 0xDB6 */ u8 field_0xDB6; + /* 0xDB7 */ u8 field_0xDB7; + /* 0xDB8 */ u8 field_0xDB8; + /* 0xDB9 */ u8 field_0xDB9; + /* 0xDBA */ u8 field_0xDBA; /* 0xDBB */ u8 field_0xDBB; /* 0xDBC */ u8 mType; - /* 0xDBD */ u8 _0xDBD[0xDC0 - 0xDBD]; - /* 0xDC2 */ u8 mCurrentAnmTexPat; // blink + /* 0xDBD */ u8 field_0xDBD; + /* 0xDBE */ u8 field_0xDBE; + /* 0xDBF */ u8 field_0xDBF; + /* 0xDC0 */ u8 mCurrentAnmTexPat; // blink /* 0xDC1 */ u8 field_0xDC1; /* 0xDC2 */ u8 mCurrentState; /* 0xDC3 */ u8 mNextState; - /* 0xDC4 */ u8 _0xDC4[0xDC7 - 0xDC4]; + /* 0xDC4 */ u8 field_0xDC4; + /* 0xDC5 */ u8 field_0xDC5; + /* 0xDC6 */ u8 field_0xDC6; /* 0xDC7 */ u8 mStartingState; - /* 0xDC8 */ u8 _0xDC8[0xDCF - 0xDB8]; + /* 0xDC8 */ u8 field_0xDC8; + /* 0xDC9 */ u8 field_0xDC9; + /* 0xDCA */ u8 field_0xDCA; + /* 0xDCB */ u8 field_0xDCB; + /* 0xDCC */ u8 _0xDCC[0xDCF - 0xDCC]; /* 0xDCF */ u8 field_0xDCF; /* 0xDD0 */ u8 _0xDD0[0xDD4 - 0xDD0]; /* 0xDD4 */ mVec3_c mHomePos; diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index d94633c6..3dc5d670 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -68,6 +68,9 @@ public: dAcBomb_c *getBombWithinRadius(f32 radius); // fn_8002f700 + void playDeathEffect0(const mVec3_c &pos, const mVec3_c *pScale, bool skipKill); + void playDeathEffect1(const mVec3_c &pos, const mVec3_c *pScale, bool skipKill); + // Deals with dealing damage to Enemy // Returns a value 0-13 (similar to mStts rank?) int fn_8002FDE0(cCcD_Obj &mCc, u16 *pTgOut); @@ -75,9 +78,9 @@ public: // 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); - void fn_800306d0(); + void fn_800306D0(); void fn_80030700(); - dAcObjBase_c *attackPlayerOrScrapper(f32 biasToScrapper); + dAcObjBase_c *targetPlayerOrScrapper(f32 biasToScrapper); static void fn_80030980(m3d::mdl_c &, s32, bool markDirty); void fn_80030c20(u32 flags, f32, f32, f32, f32); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index b2ae203d..fab81e6d 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -101,6 +101,9 @@ public: mVec3_c &getStartingPosition() { return mStartingPos; } + const mVec3_c &getStartingPos() const { + return mStartingPos; + } void setStartingPosition(const mVec3_c &v) { mStartingPos = v; } diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 7d8c49e9..362d88b1 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -813,7 +813,7 @@ public: bool ChkTgBit23() const; bool ChkTgBit24() const; bool ChkTgBit25() const; - u16 GetTgSoundID() const; + s32 GetTgSoundID() const; s16 GetTg_0x6A() const; bool ChkTgBit8() const; u8 GetTg_0x4A() const; diff --git a/include/d/d_pouch.h b/include/d/d_pouch.h index 3b3ae555..1c10c91f 100644 --- a/include/d/d_pouch.h +++ b/include/d/d_pouch.h @@ -25,6 +25,8 @@ bool swapStockItems(s32 slot1, s32 slot2); void sortStock(); +bool tryDropItem(f32 chance); + #define ITEM_CHECK_SLOT_NONE 60 u16 itemCheckFindItemSlot(ITEM_ID item); diff --git a/include/d/t/d_t_ks.h b/include/d/t/d_t_ks.h index e0b066c0..bfa0afb9 100644 --- a/include/d/t/d_t_ks.h +++ b/include/d/t/d_t_ks.h @@ -1,9 +1,16 @@ #ifndef D_T_KS_H #define D_T_KS_H +#include "d/a/d_a_base.h" #include "d/t/d_tg.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" #include "s/s_State.hpp" +#include "toBeSorted/d_path.h" +#include "toBeSorted/time_area_mgr.h" +class dAcEKs_c; class dTgKiesuTag_c : public dTg_c { public: dTgKiesuTag_c() : mStateMgr(*this) {} @@ -17,8 +24,77 @@ public: STATE_FUNC_DECLARE(dTgKiesuTag_c, ControlPathMove); STATE_FUNC_DECLARE(dTgKiesuTag_c, DoNothing); + /* fn_154_8B0 */ + mVec3_c &getSpawnKsPosition(); + + void incrementField_0x456() { + field_0x456++; + } + private: - /* 0x??? */ STATE_MGR_DECLARE(dTgKiesuTag_c); + /* 0x0FC */ STATE_MGR_DECLARE(dTgKiesuTag_c); + /* 0x138 */ dAcRef_c mKsRefs[16]; + /* 0x1F8 */ mMtx_c mAreaMtx; + /* 0x228 */ ActorOnRail_Ext mRail; + /* 0x25C */ TimeAreaStruct mTimeArea; + /* 0x268 */ mMtx_c field_0x268; + + /* 0x31C */ mVec3_c field_0x31C; + /* 0x328 */ mVec3_c field_0x328; + /* 0x334 */ mVec3_c field_0x334; + /* 0x340 */ mVec3_c field_0x340; + /* 0x34C */ mVec3_c field_0x34C; + + /* 0x37C */ mVec3_c mTargetPosition; + /* 0x388 */ mVec3_c mSpawnKsPosition; + + /* 0x3A0 */ mAng3_c mSpawnKsAngle; + /* 0x3A8 */ mAng3_c field_0x3A8; + /* 0x3AC */ mAng field_0x3AC; // pitch + /* 0x3AE */ mAng field_0x3AE; // yaw + + /* 0x3B4 */ f32 field_0x3B4; + /* 0x3B8 */ f32 field_0x3B8; // Y pos offset + /* 0x3BC */ f32 field_0x3BC; // X/Z scale + /* 0x3C0 */ f32 field_0x3C0; // Y scale + + /* 0x3D8 */ f32 field_0x3D8; // Y scale + /* 0x3DC */ f32 field_0x3DC; // X/Z scale + + /* 0x3EC */ mVec3_c field_0x3EC; + + /* 0x44C */ s16 field_0x448; + + // Related to Control? + /* 0x44C */ s16 field_0x44C; + /* 0x44E */ s16 field_0x44E; + /* 0x450 */ s16 field_0x450; + + // Related to ControlFighting? + /* 0x452 */ s16 field_0x452; + /* 0x454 */ s16 field_0x454; + /* 0x456 */ s16 field_0x456; + /* 0x458 */ s16 field_0x458; + /* 0x45A */ s16 field_0x45A; + /* 0x45C */ s16 field_0x45C; + /* 0x45E */ s16 field_0x45E; + + /* 0x460 */ s16 field_0x460; + /* 0x462 */ s16 mMaxKsToLink; + + /* 0x468 */ s16 field_0x468; + + /* 0x46C */ s16 mNumKsAlive; + /* 0x46E */ s16 field435_0x46e; + + /* 0x44A */ s16 mNumKsControl; + + /* 0x474 */ bool field_0x474; + /* 0x47E */ bool mbAllKsActive; + + /* 0x48A */ u8 field_0x48A; // Related to getting spawnPos/ Type? + + /* 0x48E */ u8 mNumKsActive; }; #endif diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index fd0ae575..c68673ad 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -4,20 +4,101 @@ #include "c/c_math.h" #include "common.h" #include "d/a/d_a_base.h" +#include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_base.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_lin_chk.h" #include "d/col/bg/d_bg_s_roof_chk.h" +#include "d/col/bg/d_bg_s_wtr_chk.h" +#include "d/col/c/c_cc_d.h" +#include "d/d_light_env.h" +#include "d/d_pouch.h" +#include "d/snd/d_snd_wzsound.h" #include "d/t/d_t_ks.h" #include "f/f_profile_name.h" #include "m/m3d/m_fanm.h" +#include "m/m_angle.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resanmtexpat.h" +#include "s/s_Math.h" #include "toBeSorted/attention.h" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/event_manager.h" #include "toBeSorted/time_area_mgr.h" +struct dAcEKs_HIO_c { + f32 _0x00; // 400.0 + s16 _0x04; // 0h + s16 _0x06; // FFh + s16 _0x08; // A0h + s16 _0x0A; // 50h + s16 _0x0C; // FFh + s16 _0x0E; // 64h + s16 _0x10; // FFh + s16 _0x12; // FFh + s16 _0x14; // FFh + f32 _0x18; // 1.2 + f32 _0x1C; // 1.5 + f32 _0x20; // 1.0 + f32 _0x24; // 1.0 + f32 _0x28; // -35.0 + f32 _0x2C; // 30.0 + f32 _0x30; // 1.0 + s16 _0x34; // 71Ch + s16 _0x36; // 0h + f32 _0x38; // 30.0 + f32 _0x3C; // 15.0 + f32 _0x40; // 0.0 + f32 _0x44; // 100.0 + f32 _0x48; // 150.0 + f32 _0x4C; // 250.0 + f32 _0x50; // 150.0 + f32 _0x54; // 120.0 + f32 _0x58; // 3.5 + f32 _0x5C; // 3.5 + f32 _0x60; // 3.5 + f32 _0x64; // 10.0 + f32 _0x68; // 20.0 + f32 _0x6C; // 35.0 + f32 _0x70; // 7.0 + f32 _0x74; // 200.0 + f32 _0x78; // 10.0 + f32 _0x7C; // 0.0 + f32 _0x80; // 0.5 + s16 _0x84; // 1555h + s16 _0x86; // 0h + f32 _0x88; // 500.0 + f32 _0x8C; // 150.0 + f32 _0x90; // 150.0 + f32 _0x94; // 3000.0 + f32 _0x98; // 120.0 + f32 _0x9C; // 1.0 + s16 _0xA0; // Fh + s16 _0xA2; // AABh + f32 _0xA4; // 1.0 + s16 _0xA8; // 1Eh + s16 _0xAA; // AABh + f32 _0xAC; // 300.0 + f32 _0xB0; // 3.0 + s16 _0xB4; // 3h + s16 _0xB6; // 1h + f32 _0xB8; // 0.0099999998 + f32 _0xBC; // 100.0 + s16 _0xC0; // AABh + s16 _0xC2; // 0h + f32 _0xC4; // -0.5 + + static const dAcEKs_HIO_c sInstance; +}; +const dAcEKs_HIO_c dAcEKs_HIO_c::sInstance = { + 400.0, 0, 0xFF, 0xA0, 0x50, 0xFF, 0x64, 0xFF, 0xFF, 0xFF, 1.2, 1.5, 1.0, 1.0, -35.0, + 30.0, 1.0, 0x71C, 0, 30.0, 15.0, 0.0, 100.0, 150.0, 250.0, 150.0, 120.0, 3.5, 3.5, 3.5, + 10.0, 20.0, 35.0, 7.0, 200.0, 10.0, 0.0, 0.5, 0x1555, 0x0, 500.0, 150.0, 150.0, 3000.0, 120.0, + 1.0, 0xF, 0xAAB, 1.0, 0x1E, 0xAAB, 300.0, 3.0, 0x3, 0x1, 0.0099999998, 100.0, 0xAAB, 0, -0.5, +}; + SPECIAL_ACTOR_PROFILE(E_KS, dAcEKs_c, fProfile::E_KS, 0xFE, 0, 4099); STATE_DEFINE(dAcEKs_c, Wait); @@ -35,6 +116,9 @@ STATE_DEFINE(dAcEKs_c, Stun); STATE_DEFINE(dAcEKs_c, WindBlow); STATE_DEFINE(dAcEKs_c, PathMove); +bool dAcEKs_c::lbl_155_bss_388; +bool dAcEKs_c::lbl_155_bss_389; + bool dAcEKs_c::restorePosRotFromCopy() { if (field_0xDCF == 0) { if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition) != 0) { @@ -42,7 +126,7 @@ bool dAcEKs_c::restorePosRotFromCopy() { mSph.ClrCoSet(); mSph.ClrTgSet(); mSph.ClrAtSet(); - fn_800306d0(); + fn_800306D0(); if (mType == 1 || mType == 2) { field_0xD20 = 0.f; field_0xDE4 = 0.f; @@ -69,7 +153,7 @@ void dAcEKs_c::setStartingState() { mTimer = cM::rndInt(1000); switch (mStartingState) { case 0: { - mStateMgr.changeState(StateID_Move); + changeState(StateID_Move); mCurrentState = mStartingState; mAcch.ClrRoofNone(); mAcch.SetField_0xD4(55.f); @@ -77,7 +161,7 @@ void dAcEKs_c::setStartingState() { mAcchCir.SetWall(20.f, 60.f); } break; case 1: { - mStateMgr.changeState(StateID_Wait); + changeState(StateID_Wait); mCurrentState = mStartingState; if ((s32)getFromParams(30, 0x3) == 1) { field_0xDB1 = 1; @@ -94,10 +178,10 @@ void dAcEKs_c::setStartingState() { mAcch.SetField_0xD4(55.f); mAcch.SetGroundUpY(30.f); mAcchCir.SetWall(20.f, 60.f); - mStateMgr.changeState(StateID_PathMove); + changeState(StateID_PathMove); } break; default: { - mStateMgr.changeState(StateID_Move); + changeState(StateID_Move); mCurrentState = mStartingState; } break; } @@ -108,19 +192,19 @@ void dAcEKs_c::setStartingState() { void dAcEKs_c::setIdleState() { switch (mStartingState) { case 0: { - mStateMgr.changeState(StateID_Move); + changeState(StateID_Move); mCurrentState = 0; } break; case 1: { - mStateMgr.changeState(StateID_ReturnToWait); + changeState(StateID_ReturnToWait); mCurrentState = 5; } break; case 2: { - mStateMgr.changeState(StateID_PathMove); + changeState(StateID_PathMove); mCurrentState = 2; } break; default: { - mStateMgr.changeState(StateID_Move); + changeState(StateID_Move); mCurrentState = 0; } break; } @@ -140,17 +224,737 @@ f32 dAcEKs_c::getLineCrossYRange(const mVec3_c &pos, f32 range) { if (dBgS::GetInstance()->LineCross(&linChk)) { return linChk.GetLinEnd().y; } else { - return mStartingPos.y; + return getStartingPos().y; } } -// idk. +void dAcEKs_c::fn_155_A60() { + if (sLib::calcTimer(&field_0xDBD)) { + return; + } + + s32 s = fn_8002FDE0(mSph, nullptr); + if (s == 6 || s == 7) { + return; + } + switch (s) { + case 12: + case 13: + if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_SWORD)) { + return; + } + default: + field_0xDBD = 5; + dJEffManager_c::spawnHitMarkEffect(0, mSph, nullptr, true); + + if (!mSph.ChkTgHit()) { + return; + } + + field_0xD96 = mSph.GetTgAtHitDir().atan2sX_Z(); + field_0xD98 = mSph.GetTgAtHitDir().atan2sY_XZ(); + field_0xD98 = -field_0xD98; + + if (mSph.ChkTgAtHitType(AT_TYPE_SWORD)) { + s16 a = 0; + s16 x = -cLib::targetAngleX(mPosition, dAcPy_c::GetLink()->mPosition); + + if (mSph.GetTgSoundID() == 0x01) { + x += 0x2000; + } else if (mSph.GetTgSoundID() == 0x80) { + a = 0x1000; + x += 0x1000; + } else if (mSph.GetTgSoundID() == 0x40) { + a = 0x2000; + } else if (mSph.GetTgSoundID() == 0x20) { + a = 0x1000; + x += -0x1000; + } else if (mSph.GetTgSoundID() == 0x10) { + x += -0x2000; + } else if (mSph.GetTgSoundID() == 0x08) { + a = -0x1000; + x += -0x1000; + } else if (mSph.GetTgSoundID() == 0x04) { + a = -0x2000; + } else if (mSph.GetTgSoundID() == 0x02) { + a = -0x1000; + x += 0x1000; + } else if (mSph.GetTgSoundID() == 0x100) { + x += -0x4000; + } + + field_0xD92 = x * 0.5f; + field_0xD94 = a * 0.5f; + + if (mHealth == 0) { + if (!isState(StateID_Wait)) { + mVelocity.y += 30.f; + } + changeState(StateID_Damage); + if (field_0xD86 > 0) { + field_0xDA9 = 1; + } + mSpeed = 65.f; + mAcchCir.SetWall(20.f, 60.f); + mAcceleration = -6.f; + field_0xD5E = 5; + mAcch.SetGroundUpY(0.f); + + unsetActorProperty(AC_PROP_0x1); + mSph.ClrTgSet(); + } else { + if (!isState(StateID_Wait)) { + mVelocity.y += 30.f; + } + changeState(StateID_Damage); + if (field_0xD86 > 0) { + field_0xDA9 = 1; + } + mRotation.x += field_0xD98 * 0.5f; + mRotation.y += field_0xD96 * 0.5f; + mSpeed = 30.f; + field_0xDC6 = 8; + field_0xDBF = 8; + } + } else { + if (mSph.ChkTgAtHitType(AT_TYPE_WHIP)) { + field_0xDB6 = 1; + } + mHealth = 0; + if (isState(StateID_Wait)) { + changeState(StateID_Damage); + if (field_0xD86 > 0) { + field_0xDA9 = 1; + } + if (mHealth == 0) { + mAcceleration = -4.f; + field_0xD92 = field_0xD98 * 0.2f; + field_0xD94 = field_0xD96 * 0.1f; + } + } else { + changeState(StateID_Damage); + + if (field_0xD86 > 0) { + field_0xDA9 = 1; + } + if (mHealth == 0) { + mSpeed = 65.f; + mAcchCir.SetWall(20, 60); + mAcceleration = -6.f; + field_0xD5E = 5; + mAcch.SetGroundUpY(0); + unsetActorProperty(AC_PROP_0x1); + mSph.ClrTgSet(); + } + field_0xD92 = field_0xD98 * 0.2f; + field_0xD94 = field_0xD96 * 0.1f; + mVelocity.y += 30.f; + } + } + break; + case 0: { + return; + } + } +} + +// TODO (I dont want to mess with Item stuff with the other PR open) +extern "C" void spawnDrop(ITEM_ID, s32 roomId, const mVec3_c &pos, const mAng3_c &rot); + +void dAcEKs_c::kill(bool dropItem) { + dLightEnv_c::GetPInstance()->setBPM8_Type4(&mPosition); + mTgRef.unlink(); + + if (field_0xDB6 != 0) { + killWithFlagNoItemDrop(); + } else if (dropItem == true) { + if (mType == 3) { + if (tryDropItem(0.05f)) { + spawnDrop(ITEM_EVIL_CRYSTAL, mRoomID, mPosition, mAngle); + } + } else { + if (tryDropItem(0.05f)) { + spawnDrop(ITEM_MONSTER_CLAW, mRoomID, mPosition, mAngle); + } + } + } else { + killWithFlagNoItemDrop(); + } + + static mVec3_c deathEffectScale(0.8, 0.8, 0.8); + playDeathEffect0(mPosition, &deathEffectScale, false); +} + +void dAcEKs_c::chaseTargetY(f32 ratio, f32 maxStepSize) { + sLib::addCalcScaledDiff(&mPosition.y, mTargetPos.y, ratio, maxStepSize); + sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 10, 0x38E); +} + +void dAcEKs_c::playBlinkAnm() { + mAnmTexPat.play(); + if (mAnmTexPat.isStop(0)) { + if (mCurrentAnmTexPat == 2) { + setBlink(0); + } + + mBlinkTimer--; + if (mBlinkTimer <= 0) { + mAnmTexPat.setFrame(0, 0); + mBlinkTimer = cM::rndInt(75) + 15; + } + } +} + +void dAcEKs_c::soundSqueak() { + if (mSqueakSoundTimer > 0) { + mSqueakSoundTimer--; + } else { + startSound(SE_EKs_V_NAKU); + mSqueakSoundTimer = cM::rndInt(20) + 20; + } +} + +void dAcEKs_c::soundStun() { + if (mStunSoundTimer > 0) { + mStunSoundTimer--; + } else { + startSound(SE_EKs_V_FAINT); + mStunSoundTimer = cM::rndInt(20) + 20; + } +} + +void dAcEKs_c::fn_155_1430() { + field_0xD6C = cM::rndInt(1) + 3; +} + +void dAcEKs_c::fn_155_1470() { + field_0xD52--; + + if (field_0xD54 > 0) { + field_0xD54--; + } + + if (field_0xD90 > 0) { + field_0xD90--; + } + + if (field_0xDA6 != 0) { + if (!transitionToNextState()) { + if (field_0xD54 <= 0) { + f32 yDiff = getStartingPos().y - mPosition.y; + if (yDiff >= 0.f && yDiff <= 150.f) { + field_0xDC1 = 0; + if (getStartingPos().squareDistanceToXZ(mPosition) < 6400.f) { + changeState(StateID_WaitReady); + mCurrentState = 1; + return; + } + } else { + if (yDiff < 0.f) { + field_0xDC1 = 2; + } + } + } + adjustTargetGnd(); + adjustTargetRoof(); + setPitchYawToPoint(mTargetPos); + chaseTargetY(0.1f, 3.0f); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); + } + } else { + field_0xB8C.set(mPnts[field_0xD9E]); + f32 f = mPosition.squareDistance(field_0xB8C); + + if (checkWallCross()) { + field_0xDB7++; + if (field_0xDB7 < 5) { + field_0xDC1 = 0; + + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + + adjustTargetGnd(); + adjustTargetRoof(); + } else if (field_0xDB7 < 10) { + field_0xDC1 = 1; + + fn_155_3BD0(mVec3_c(cM::rndFX(300), cM::rndFX(300), -cM::rndF(300))); + + field_0xD52 = cM::rndInt(20) + 20; + + adjustTargetGnd(); + adjustTargetRoof(); + } + if (field_0xDB7 > 20) { + field_0xDB7 = 0; + } + } + + if (field_0xD54 <= 0) { + f32 yDiff = getStartingPos().y - mPosition.y; + if (yDiff >= 0.f && yDiff <= 150.f) { + field_0xDC1 = 0; + if (field_0xD9E == 0) { + if (getStartingPos().squareDistanceToXZ(mPosition) < 6400.f) { + changeState(StateID_WaitReady); + return; + } + } + } else { + if (yDiff < 0.f) { + field_0xDC1 = 2; + } + } + } + + if (!checkBeyondRadius(getStartingPos(), 490000) && field_0xD54 <= 0 && field_0xD90 <= 0) { + if (fn_155_2B80(true, 0)) { + changeState(StateID_Chase); + return; + } + field_0xD90 = 3; + } + + if (field_0xDC1 == 0) { + if (checkBeyondRadius(getStartingPos(), 490000) && field_0xD52 <= 0) { + field_0xDA0++; + if (field_0xDA0 > 5) { + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndFX(30); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + field_0xDA0 = 0; + } else { + mTargetPos.x = field_0xB8C.x + cM::rndFX(30); + mTargetPos.y = field_0xB8C.y + cM::rndFX(30); + mTargetPos.z = field_0xB8C.z + cM::rndFX(30); + } + field_0xD52 = cM::rndInt(20) + 20; + adjustTargetGnd(); + adjustTargetRoof(); + } + } else if (field_0xDC1 == 2) { + field_0xDBA++; + if (field_0xDBA < 20) { + if (field_0xDBA % 2) { + field_0xDC1 = 0; + fn_155_3BD0(mVec3_c(cM::rndFX(800), cM::rndFX(400), cM::rndFX(800))); + adjustTargetGnd(); + adjustTargetRoof(); + } + } else if (field_0xDBA < 40) { + if (field_0xDBA % 2) { + fn_155_3BD0(mVec3_c(cM::rndFX(800), -cM::rndF(400), cM::rndFX(800))); + field_0xD52 = cM::rndInt(20) + 20; + adjustTargetGnd(); + adjustTargetRoof(); + } + } + + if (field_0xDBA > 60) { + field_0xDBA = 0; + field_0xDC1 = 0; + } + } + + if (field_0xD52 <= 0) { + if (field_0xD9E > 0) { + mVec3_c startPos = mPosition; + for (s32 i = 0; i <= field_0xD9E; ++i) { + if (!dBgS_ObjLinChk::LineCross(&startPos, &mPnts[i], nullptr)) { + field_0xD9E = i; + field_0xB8C.set(mPnts[field_0xD9E]); + } + } + } + + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndFX(400); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + + field_0xDC1 = 0; + + field_0xD52 = cM::rndInt(20) + 20; + + adjustTargetGnd(); + adjustTargetRoof(); + } + + setPitchYawToPoint(mTargetPos); + chaseTargetY(0.1f, 3.0f); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); + + if (field_0xD9E != 0 && f < 2500.f) { + field_0xD9E--; + } + } +} + +void dAcEKs_c::fn_155_1C80() { + if (field_0xDC8 != 0) { + field_0xDC8--; + field_0xDA5 = 1; + } else { + field_0xDA5 = 0; + } + + if (field_0xD52 > 0) { + field_0xD52--; + } + + if (field_0xD90 > 0) { + field_0xD90--; + } + + if (field_0xDA6 != 0) { + adjustTargetGnd(); + adjustTargetRoof(); + if (field_0xDC8 > 120 || !transitionToNextState()) { + setPitchYawToPoint(mTargetPos); + chaseTargetY(field_0xD00 + 0.1f, field_0xD04 + 3.0f); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); + } + } else { + if (field_0xD54 > 0) { + field_0xD54--; + } + + field_0xB8C.set(mPnts[field_0xD9E]); + + f32 f = mPosition.squareDistance(field_0xB8C); + if (checkWallCross()) { + field_0xDB7++; + if (field_0xDB7 < 5) { + field_0xDC1 = 0; + + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndF(400); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + + adjustTargetGnd(); + adjustTargetRoof(); + } else if (field_0xDB7 < 10) { + field_0xDC1 = 1; + + fn_155_3BD0(mVec3_c(cM::rndFX(200), cM::rndFX(200), cM::rndF(-300))); + + field_0xD52 = cM::rndInt(20) + 20; + + adjustTargetGnd(); + adjustTargetRoof(); + } else if (field_0xDB7 > 20) { + field_0xDB7 = 0; + } + } + + if (field_0xDC1 == 0) { + if (checkBeyondRadius(getStartingPos(), 490000)) { + if (field_0xD52 <= 0) { + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndFX(400); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + field_0xD52 = cM::rndInt(20) + 20; + adjustTargetGnd(); + adjustTargetRoof(); + } + } else { + if (field_0xDC8 <= 120 && field_0xD54 <= 0 && field_0xD90 <= 0) { + if (fn_155_2B80(true, 0)) { + changeState(StateID_Chase); + return; + } + field_0xD90 = 3; + } + } + } + + if (field_0xD52 <= 0) { + if (field_0xD9E > 0) { + mVec3_c startPos = mPosition; + for (s32 i = 0; i <= field_0xD9E; ++i) { + if (!dBgS_ObjLinChk::LineCross(&startPos, &mPnts[i], nullptr)) { + field_0xD9E = i; + field_0xB8C.set(mPnts[field_0xD9E]); + } + } + } + + field_0xDC1 = 0; + + field_0xD52 = cM::rndInt(20) + 20; + + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndFX(400); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + + field_0xD52 = cM::rndInt(20) + 20; // Set twice lol + + adjustTargetGnd(); + adjustTargetRoof(); + } + + if (mTargetPos.squareDistanceToXZ(mPosition) < 10000.f) { + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndFX(400); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + + adjustTargetGnd(); + adjustTargetRoof(); + } + + setPitchYawToPoint(mTargetPos); + chaseTargetY(field_0xD00 + 0.1f, field_0xD04 + 3.0f); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); + + if (field_0xD9E != 0 && f < 2500.f) { + field_0xD9E--; + } + } +} + +void dAcEKs_c::fn_155_2270() { + // NONMATCHING + if (field_0xD6A > 0) { + field_0xD6A--; + } + + dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f); + field_0xBF8.set(pTarget->mPosition + field_0xBEC); + + mAng y = cLib::targetAngleY(mPosition, mTargetPos); + y = y - mRotation.y; + if (field_0xDA6 != 0) { + if (transitionToNextState()) { + if (mType == 2) { + fn_155_3EC0(); + field_0xDA9 = 1; + } + } else { + if (field_0xDC5 != 0) { + field_0xDC5--; + } else { + if (field_0xDAF != 0 && dAcPy_c::GetLink()->checkCurrentAction(/* SHIELD_BASH*/ 73)) { + ; + mWorldMtx.multVecSR(mVec3_c(0, 0, -250), field_0xC1C); + mTargetPos += field_0xC1C; + field_0xDC5 = 20; + } + } + + if (field_0xD6A <= 0) { + if (lbl_155_bss_389) { + field_0xC70 = 0.f; + if (field_0xD6A <= 0) { + field_0xC70 = 0.f; + if (isTargeted()) { + field_0xD6C -= 2; + } else { + field_0xD6C -= 1; + } + + if (field_0xD6C <= 0) { + fn_155_3460(); + if (mTgRef.isLinked()) { + mTgRef.get()->incrementField_0x456(); + } + changeState(StateID_AttackReady); + mCurrentState = 9; + + if (mType == 2) { + fn_155_3EC0(); + field_0xDA9 = 1; + } + return; + } + } + } + fn_155_3BE0(field_0xBC8); + field_0xD6A = cM::rndInt(30) + 15; + adjustTargetGnd(); + adjustTargetRoof(); + } + + if (field_0xD9A > 0) { + field_0xC70 = 0.f; + } else { + sLib::addCalcScaledDiff(&field_0xC70, 35, 1, 3); + } + cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xC70); + setPitchYawToPoint(field_0xBF8); + sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 12, 0x1555); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 12, 0x1555); + sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555); + // ?? + if (u16(y + 0x3FFF) <= 0x7FFE) { + y = mRotation.x + 0xAAA; + } else { + y = mRotation.x - 0xAAA; + } + sLib::addCalcAngle(mRotation.x.ref(), y, 12, 0x1555); + } + } else { + if (field_0xD90 > 0) { + field_0xD90--; + } + if (field_0xDC5 != 0) { + field_0xDC5--; + } else { + if (dAcPy_c::GetLink()->checkCurrentAction(/* SHIELD_BASH*/ 73)) { + ; + mWorldMtx.multVecSR(mVec3_c(0, 0, -250), field_0xC1C); + mTargetPos += field_0xC1C; + field_0xDC5 = 20; + } + } + f32 r = field_0xC44 + 1600.f; + if (checkBeyondRadius(getStartingPos(), r * r)) { + setIdleState(); + } else { + if (field_0xD90 <= 0) { + if (!fn_155_2B80(true, 1)) { + setIdleState(); + return; + } + field_0xD90 = 3; + } + + if (dAcPy_c::GetLink()->checkFlags0x340(0x100)) { + if (isOutsideRange()) { + changeState(StateID_Chase); + return; + } + } else { + if (field_0xDB3 == 0 && dBgS_WtrChk::CheckPos(&mPosition, true, 100, -2000)) { + field_0xD10 = dBgS_WtrChk::GetWaterHeight(); + field_0xDB3 = 1; + } + } + if (field_0xD6A <= 0) { + field_0xC70 = 0.f; + if (lbl_155_bss_388) { + fn_155_1430(); + } else { + if (isTargeted()) { + field_0xD6C -= 2; + } else { + field_0xD6C -= 1; + } + if (field_0xD6C <= 0 && dAcPy_c::GetLink()->checkFlags0x340(0x100) && + field_0xBF8.squareDistanceToXZ(mPosition) < 160000.f) { + fn_155_3460(); + changeState(StateID_AttackReady); + return; + } + } + field_0xBC8.set(cM::rndFX(250), cM::rndF(150) + 100.f, cM::rndF(120) + 150.f); + fn_155_3BE0(field_0xBC8); + + if (!dAcPy_c::GetLink()->checkFlags0x340(0x100)) { + mTargetPos.y = field_0xD10 + 50.f; + } + field_0xD6A = cM::rndInt(30) + 15; + adjustTargetGnd(); + adjustTargetRoof(); + } + if (field_0xD9A > 0) { + field_0xC70 = 0.f; + } else { + sLib::addCalcScaledDiff(&field_0xC70, 20, 1, 1); + } + + cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xC70); + setPitchYawToPoint(field_0xBF8); + sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 12, 0x1555); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 12, 0x1555); + sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555); + + // ?? + if (u16(y + 0x3FFF) <= 0x7FFE) { + y = mRotation.x + 0xAAA; + } else { + y = mRotation.x - 0xAAA; + } + sLib::addCalcAngle(mRotation.x.ref(), y, 12, 0x1555); + } + } +} + +bool dAcEKs_c::fn_155_29D0(s32 p1) { + dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f); + field_0xBF8.set(pTarget->mPosition); + field_0xBF8.y += 100.f; + + dBgS_ObjLinChk linChk; + if (isState(StateID_Wait)) { + mVec3_c start = mPosition; + start.y -= 70.f; + linChk.Set(&start, &field_0xBF8, nullptr); + } else { + linChk.Set(&mPosition, &field_0xBF8, nullptr); + } + linChk.OnBackFlag(); + + switch (p1) { + case 0: { + if (dBgS::GetInstance()->LineCross(&linChk)) { + return true; + } + } break; + case 1: { + if (dBgS::GetInstance()->LineCross(&linChk)) { + field_0xDCB++; + } else { + field_0xDCB = 0; + } + if (field_0xDCB > 10) { + field_0xDCB = 0; + + return true; + } + } break; + } + return false; +} + +bool dAcEKs_c::fn_155_2B80(bool b, s32 p1) { + f32 f0 = field_0xDA5 != 0 ? field_0xC48 + 1200.f : 700.f; + dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f); + field_0xBF8.set(pTarget->mPosition); + if (field_0xBF8.squareDistanceToXZ(mPosition) < f0 * f0) { + f32 f2 = mPosition.y - field_0xBF8.y; + if (f2 >= -300.f && f2 <= 1500.f) { + if (dAcPy_c::GetLink()->isRecovering() || + /* cannot be EventManager::isInEventOtherThan0Or7 */ + (EventManager::isInEvent() && !EventManager::isInEvent0Or7())) { + return false; + } + if (fn_155_3EF0()) { + return false; + } + if (b) { + if (!fn_155_29D0(p1)) { + return true; + } + } else { + return true; + } + } + } + return false; +} bool dAcEKs_c::fn_155_2D60(bool b, s32 p1) { f32 f0 = field_0xC40 + 1500.f; f32 f1 = field_0xC3C + 700.f; - dAcObjBase_c *pObj = attackPlayerOrScrapper(0.f); - field_0xBF8.set(pObj->mPosition); + dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f); + field_0xBF8.set(pTarget->mPosition); if (field_0xBF8.squareDistanceToXZ(mPosition) < f1 * f1) { f32 f2 = field_0xBF8.y - mPosition.y; if (f2 <= 0.f && f2 > -f0) { @@ -169,9 +973,9 @@ bool dAcEKs_c::fn_155_2D60(bool b, s32 p1) { bool dAcEKs_c::fn_155_2EA0() { f32 f0 = field_0xC40 + 1500.f; f32 f1 = field_0xC3C + 700.f; - dAcObjBase_c *pObj = dAcPy_c::GetLink()->getBeetleInFlight(); - if (pObj) { - field_0xC28.set(pObj->mPosition); + dAcObjBase_c *pTarget = dAcPy_c::GetLink()->getBeetleInFlight(); + if (pTarget) { + field_0xC28.set(pTarget->mPosition); field_0xD1C = field_0xC28.squareDistanceToXZ(mPosition); if (field_0xD1C < f1 * f1) { f32 f2 = field_0xC28.y - mPosition.y; @@ -184,11 +988,11 @@ bool dAcEKs_c::fn_155_2EA0() { } bool dAcEKs_c::isOutsideRange() { - return attackPlayerOrScrapper(0.f)->mPosition.squareDistanceToXZ(mPosition) > 360000.f; + return targetPlayerOrScrapper(0.f)->mPosition.squareDistanceToXZ(mPosition) > 360000.f; } bool dAcEKs_c::isNotWaitingNorDamage() { - if (!(mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Damage))) { + if (!(isState(StateID_Wait) || isState(StateID_Damage))) { return true; } return false; @@ -206,7 +1010,7 @@ bool dAcEKs_c::isTargeted() { return false; } -bool dAcEKs_c::ChkWall() { +bool dAcEKs_c::checkWallCross() { field_0xDBB++; if (field_0xDBB > 5) { field_0xDBB = 0; @@ -220,25 +1024,25 @@ bool dAcEKs_c::ChkWall() { return false; } -void dAcEKs_c::ChkGnd() { +void dAcEKs_c::adjustTargetGnd() { dBgS_ObjGndChk gndChk; - mVec3_c pos = field_0xBB0; + mVec3_c pos = mTargetPos; pos.y += 150.f; gndChk.SetPos(&pos); f32 chk = dBgS::GetInstance()->GroundCross(&gndChk); - if (field_0xBB0.y < chk + 120.f) { - field_0xBB0.y = chk + 120.f; + if (mTargetPos.y < chk + 120.f) { + mTargetPos.y = chk + 120.f; } } -void dAcEKs_c::ChkRoof() { +void dAcEKs_c::adjustTargetRoof() { dBgS_ObjRoofChk roofChk; - mVec3_c pos = field_0xBB0; + mVec3_c pos = mTargetPos; pos.y -= 150.f; roofChk.SetPos(&pos); f32 chk = dBgS::GetInstance()->RoofChk(&roofChk); - if (field_0xBB0.y > chk - 120.f) { - field_0xBB0.y = chk - 120.f; + if (mTargetPos.y > chk - 120.f) { + mTargetPos.y = chk - 120.f; } } @@ -268,19 +1072,19 @@ void dAcEKs_c::fn_155_3480() { bool dAcEKs_c::transitionToNextState() { if (mCurrentState != mNextState) { switch (mNextState) { - case 0: mStateMgr.changeState(StateID_Move); break; - case 1: mStateMgr.changeState(StateID_Wait); break; - case 2: mStateMgr.changeState(StateID_PathMove); break; - case 4: mStateMgr.changeState(StateID_WakeUp); break; - case 5: mStateMgr.changeState(StateID_ReturnToWait); break; - case 6: mStateMgr.changeState(StateID_Chase); break; - case 7: mStateMgr.changeState(StateID_ChaseAttack); break; - case 8: mStateMgr.changeState(StateID_Fighting); break; - case 9: mStateMgr.changeState(StateID_AttackReady); break; - case 10: mStateMgr.changeState(StateID_Attack); break; - case 11: mStateMgr.changeState(StateID_Damage); break; - case 12: mStateMgr.changeState(StateID_Stun); break; - case 13: mStateMgr.changeState(StateID_WindBlow); break; + case 0: changeState(StateID_Move); break; + case 1: changeState(StateID_Wait); break; + case 4: changeState(StateID_WakeUp); break; + case 5: changeState(StateID_ReturnToWait); break; + case 6: changeState(StateID_Chase); break; + case 7: changeState(StateID_ChaseAttack); break; + case 8: changeState(StateID_Fighting); break; + case 9: changeState(StateID_AttackReady); break; + case 10: changeState(StateID_Attack); break; + case 11: changeState(StateID_Damage); break; + case 12: changeState(StateID_Stun); break; + case 13: changeState(StateID_WindBlow); break; + case 2: changeState(StateID_PathMove); break; } mCurrentState = mNextState; return true; @@ -360,11 +1164,9 @@ void dAcEKs_c::setBlinkChecked(u8 blink) { void dAcEKs_c::fn_155_3900(s32 p0) { switch (p0) { case 0: { - if (!(mStateMgr.isState(StateID_Stun) || mStateMgr.isState(StateID_Damage) || - mStateMgr.isState(StateID_ReturnToWait) || mStateMgr.isState(StateID_Chase) || - mStateMgr.isState(StateID_ChaseAttack) || mStateMgr.isState(StateID_Fighting) || - mStateMgr.isState(StateID_AttackReady) || mStateMgr.isState(StateID_Attack) || - mStateMgr.isState(StateID_WindBlow))) { + if (!(isState(StateID_Stun) || isState(StateID_Damage) || isState(StateID_ReturnToWait) || + isState(StateID_Chase) || isState(StateID_ChaseAttack) || isState(StateID_Fighting) || + isState(StateID_AttackReady) || isState(StateID_Attack) || isState(StateID_WindBlow))) { setActorProperty(AC_PROP_0x1); } else { field_0xDB2 = 1; @@ -382,12 +1184,12 @@ void dAcEKs_c::setPitchYawToPoint(const mVec3_c &pnt) { } void dAcEKs_c::fn_155_3BD0(const mVec3_c &pnt) { - mWorldMtx.multVec(pnt, field_0xBB0); + mWorldMtx.multVec(pnt, mTargetPos); } void dAcEKs_c::fn_155_3BE0(const mVec3_c &pnt) { - if (mStateMgr.isState(StateID_AttackReady) || mStateMgr.isState(StateID_Attack)) { - dAcObjBase_c *pAttack = attackPlayerOrScrapper(0.f); + if (isState(StateID_AttackReady) || isState(StateID_Attack)) { + dAcObjBase_c *pAttack = targetPlayerOrScrapper(0.f); if (pAttack->isPlayer()) { mVec3_c v = static_cast(pAttack)->getCenterTranslation(); pAttack->mWorldMtx.multVecSR(pnt, field_0xBBC); @@ -396,8 +1198,8 @@ void dAcEKs_c::fn_155_3BE0(const mVec3_c &pnt) { pAttack->mWorldMtx.multVec(pnt, field_0xBBC); } } else { - dAcObjBase_c *pAttack = attackPlayerOrScrapper(0.f); - pAttack->mWorldMtx.multVec(pnt, field_0xBB0); + dAcObjBase_c *pAttack = targetPlayerOrScrapper(0.f); + pAttack->mWorldMtx.multVec(pnt, mTargetPos); } } @@ -412,6 +1214,25 @@ void dAcEKs_c::setBlink(u8 blink) { mAnmTexPat.setAnm(mMdl.getModel(), pat, 0, m3d::PLAY_MODE_4); } +bool dAcEKs_c::checkPathPntParam(u32 param) { + return param != 0 && param < 0xFF; +} + +void dAcEKs_c::fn_155_3E30() { + if (field_0xDB2 != 0) { + setActorProperty(AC_PROP_0x1); + } + field_0xDB2 = 0; +} + +void dAcEKs_c::clampRotationX() { + if (mRotation.x >= 0xE39) { + mRotation.x.set(0xE39); + } else if (mRotation.x <= -0xE39) { + mRotation.x.set(-0xE39); + } +} + void dAcEKs_c::fn_155_3E90() { mSph.OnTgElectric(); mSph.SetTg_0x50(2); @@ -424,6 +1245,31 @@ void dAcEKs_c::fn_155_3EC0() { mSph.ClrCo_0x8000(); } +bool dAcEKs_c::fn_155_3EF0() { + if (field_0xDCF == 0 && dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, dAcPy_c::GetLink()->mPosition)) { + return true; + } else { + return false; + } +} + +void dAcEKs_c::fn_155_3F50() { + if ((field_0xD9C & 1) == 0 && field_0xD9E < 9) { + mVec3_c end = mPosition; + if (dBgS_ObjLinChk::LineCross(&mPnts[field_0xD9E], &end, nullptr)) { + field_0xD9E++; + mPnts[field_0xD9E].set(end); + } + } + + if (field_0xD9E != 0 && ((field_0xD9C + 4) & 7) == 0) { + mVec3_c end = mPosition; + if (!dBgS_ObjLinChk::LineCross(&mPnts[field_0xD9E - 1], &end, nullptr)) { + field_0xD9E--; + } + } +} + void dAcEKs_c::initializeState_Wait() {} void dAcEKs_c::executeState_Wait() {} void dAcEKs_c::finalizeState_Wait() {} 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 fec93ee2..11c7d558 100644 --- a/src/REL/d/a/e/d_a_e_sm.cpp +++ b/src/REL/d/a/e/d_a_e_sm.cpp @@ -285,7 +285,7 @@ int dAcEsm_c::actorPostCreate() { } else { mTimeArea.setField0x00(0.f); field_0xB8C = 0.f; - fn_800306d0(); + fn_800306D0(); } } break; case 2: { @@ -293,7 +293,7 @@ int dAcEsm_c::actorPostCreate() { if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(getRoomId(), getPosition())) { field_0xB8C = 0.f; mTimeArea.setField0x00(0.f); - fn_800306d0(); + fn_800306D0(); } else { field_0xB8C = 1.f; mTimeArea.setField0x00(1.f); @@ -309,7 +309,7 @@ int dAcEsm_c::actorPostCreate() { if (field_0xBBF == 1 || field_0xBBF == 3) { unsetActorProperty(AC_PROP_0x1); - fn_800306d0(); + fn_800306D0(); setBattleBgmRelated(0); } @@ -370,7 +370,7 @@ int dAcEsm_c::actorExecute() { if (timeCheck != 0) { if (field_0xBBF == 3) { if (checkInteractionFlags(INTERACT_0x4)) { - fn_800306d0(); + fn_800306D0(); } return SUCCEEDED; } @@ -392,7 +392,7 @@ int dAcEsm_c::actorExecute() { if (timeCheck > 0) { startSound(SE_TIMESLIP_TIMESLIP); - fn_800306d0(); + fn_800306D0(); } else { startSound(SE_TIMESLIP_TIMESLIP_REV); fn_80030700(); @@ -401,7 +401,7 @@ int dAcEsm_c::actorExecute() { if (field_0xBBF == 3 && mTimeArea.isNearZero()) { if (checkInteractionFlags(INTERACT_0x4)) { - fn_800306d0(); + fn_800306D0(); } return SUCCEEDED; } diff --git a/src/d/col/c/c_cc_d.cpp b/src/d/col/c/c_cc_d.cpp index e54f258e..ebf84503 100644 --- a/src/d/col/c/c_cc_d.cpp +++ b/src/d/col/c/c_cc_d.cpp @@ -486,7 +486,7 @@ bool cCcD_Obj::ChkTgBit25() const { return mTg.MskAtHitSPrm(0x2000000); } -u16 cCcD_Obj::GetTgSoundID() const { +s32 cCcD_Obj::GetTgSoundID() const { return mTg.mAtHitSrc.field_0x10; } From 1737da2a216a886e93c568622372ad8ecbe276f0 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 16 May 2026 00:35:00 -0400 Subject: [PATCH 05/17] dAcEKs_c: all non-state functions --- config/SOUE01/rels/d_a_e_ksNP/symbols.txt | 20 +- include/d/a/e/d_a_e_ks.h | 81 ++- include/d/col/c/c_cc_d.h | 3 + include/d/t/d_t_ks.h | 5 + src/REL/d/a/e/d_a_e_ks.cpp | 572 ++++++++++++++++++++-- 5 files changed, 606 insertions(+), 75 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt index 69398a65..97299607 100644 --- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt @@ -65,13 +65,13 @@ fn_155_3E90__8dAcEKs_cFv = .text:0x00003E90; // type:function size:0x24 fn_155_3EC0__8dAcEKs_cFv = .text:0x00003EC0; // type:function size:0x24 fn_155_3EF0__8dAcEKs_cFv = .text:0x00003EF0; // type:function size:0x5C fn_155_3F50__8dAcEKs_cFv = .text:0x00003F50; // type:function size:0x10C -AcEKs__initModels = .text:0x00004060; // type:function size:0x120 -AcEKs__init1 = .text:0x00004180; // type:function size:0x57C -AcEKs__init2 = .text:0x00004700; // type:function size:0x178 -AcEKs__destroy = .text:0x00004880; // type:function size:0x44 -AcEKs__update = .text:0x000048D0; // type:function size:0xCEC +createHeap__8dAcEKs_cFv = .text:0x00004060; // type:function size:0x120 +actorCreate__8dAcEKs_cFv = .text:0x00004180; // type:function size:0x57C +actorPostCreate__8dAcEKs_cFv = .text:0x00004700; // type:function size:0x178 +doDelete__8dAcEKs_cFv = .text:0x00004880; // type:function size:0x44 +actorExecute__8dAcEKs_cFv = .text:0x000048D0; // type:function size:0xCEC executeState__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000055C0; // type:function size:0x10 -AcEKs__draw = .text:0x000055D0; // type:function size:0x1F4 +draw__8dAcEKs_cFv = .text:0x000055D0; // type:function size:0x1F4 initializeState_Wait__8dAcEKs_cFv = .text:0x000057D0; // type:function size:0x1EC executeState_Wait__8dAcEKs_cFv = .text:0x000059C0; // type:function size:0x768 finalizeState_Wait__8dAcEKs_cFv = .text:0x00006130; // type:function size:0xA4 @@ -114,10 +114,10 @@ finalizeState_WindBlow__8dAcEKs_cFv = .text:0x000092E0; // type:function size:0x initializeState_PathMove__8dAcEKs_cFv = .text:0x00009380; // type:function size:0x184 executeState_PathMove__8dAcEKs_cFv = .text:0x00009510; // type:function size:0x7A8 finalizeState_PathMove__8dAcEKs_cFv = .text:0x00009CC0; // type:function size:0xC -fn_155_9CD0 = .text:0x00009CD0; // type:function size:0x8 -fn_155_9CE0 = .text:0x00009CE0; // type:function size:0x4 -fn_155_9CF0 = .text:0x00009CF0; // type:function size:0x4 -fn_155_9D00 = .text:0x00009D00; // type:function size:0x8 +vt_0x88__11dAcEnBase_cFi = .text:0x00009CD0; // type:function size:0x8 +vt_0x84__11dAcEnBase_cFv = .text:0x00009CE0; // type:function size:0x4 +vt_0x80__11dAcEnBase_cFv = .text:0x00009CF0; // type:function size:0x4 +getObjectListEntry__11dAcEnBase_cFv = .text:0x00009D00; // type:function size:0x8 __dt__8dAcEKs_cFv = .text:0x00009D10; // type:function size:0x16C build__23sFStateFct_c<8dAcEKs_c>FRC12sStateIDIf_c = .text:0x00009E80; // type:function size:0x60 dispose__23sFStateFct_c<8dAcEKs_c>FRP10sStateIf_c = .text:0x00009EE0; // type:function size:0xC diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index 05e94685..0df03993 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -6,18 +6,20 @@ #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_light_env.h" #include "m/m3d/m_anmtexpat.h" -#include "m/m_color.h" +#include "m/m_mtx.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" #include "toBeSorted/d_emitter.h" #include "toBeSorted/d_path.h" +#include "toBeSorted/time_area_mgr.h" class dTgKiesuTag_c; class dAcEKs_c : public dAcEnBase_c { public: - dAcEKs_c() : mStateMgr(*this), field_0xAA8(0.f), field_0xAB0(0) {} + dAcEKs_c() : mStateMgr(*this) {} virtual ~dAcEKs_c() {} virtual int doDelete() override; @@ -46,6 +48,38 @@ public: STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEKs_c); STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEKs_c); + enum Type_e { + EKS_NORMAL, + EKS_FIRE, + EKS_ELECTRIC, + EKS_CURSED, + }; + enum StartingStateParam_e { + EKS_STARTSTATE_Move = 0, + EKS_STARTSTATE_Wait = 1, + EKS_STARTSTATE_PathMove = 2, + }; + enum State_e { + EKS_STATE_Move = 0, + EKS_STATE_Wait = 1, + EKS_STATE_PathMove = 2, + EKS_STATE_WakeUp = 4, + EKS_STATE_ReturnToWait = 5, + EKS_STATE_Chase = 6, + EKS_STATE_ChaseAttack = 7, + EKS_STATE_Fighting = 8, + EKS_STATE_AttackReady = 9, + EKS_STATE_Attack = 10, + EKS_STATE_Damage = 11, + EKS_STATE_Stun = 12, + EKS_STATE_WindBlow = 13, + }; + enum AnmTexPat_e { + EKS_TEXPAT_BLINK1, + EKS_TEXPAT_BLINK2, + EKS_TEXPAT_BLINK3, + }; + public: void linkKiesuTag(dTgKiesuTag_c *pTgKs); void setStartingState(); @@ -125,13 +159,13 @@ private: /* 0x9F8 */ dEmitter_c mEmitter2; /* 0xA2C */ dWaterEffect_c mWaterEmitter; /* 0xA74 */ ActorOnRail_Ext mRail; - /* 0xAA8 */ f32 field_0xAA8; - /* 0xAAC */ UNKWORD field_0xAAC; - /* 0xAA8 */ u8 field_0xAB0; - /* 0xAB1 */ u8 _0xAB1[0xB14 - 0xAB1]; + /* 0xAA8 */ TimeAreaStruct mTimeArea; + /* 0xAB4 */ mMtx_c mCenterWorldMtx; + /* 0xAE4 */ mMtx_c field_0xAE4; /* 0xB14 */ mVec3_c mPnts[10]; /* 0xB8C */ mVec3_c field_0xB8C; - /* 0xB98 */ u8 _0xB98[0xBB0 - 0xB98]; + /* 0xB98 */ mVec3_c field_0xB98; + /* 0xBA4 */ mVec3_c field_0xBA4; /* 0xBB0 */ mVec3_c mTargetPos; /* 0xBBC */ mVec3_c field_0xBBC; /* 0xBC8 */ mVec3_c field_0xBC8; @@ -152,7 +186,9 @@ private: /* 0xC48 */ f32 field_0xC48; /* 0xC4C */ u8 _0xC4C[0xC70 - 0xC4C]; /* 0xC70 */ f32 field_0xC70; - /* 0xC74 */ u8 _0xC74[0xD00 - 0xC74]; + /* 0xC74 */ u8 _0xC74[0xCE4 - 0xC74]; + /* 0xCE4 */ f32 field_0xCE4; + /* 0xCE8 */ u8 _0xCE8[0xD00 - 0xCE8]; /* 0xD00 */ f32 field_0xD00; /* 0xD04 */ f32 field_0xD04; /* 0xD08 */ f32 field_0xD08; @@ -162,15 +198,22 @@ private: /* 0xD18 */ f32 field_0xD18; /* 0xD1C */ f32 field_0xD1C; /* 0xD20 */ f32 field_0xD20; - /* 0xD24 */ u8 _0xD24[0xD32 - 0xD24]; - /* 0xD32 */ s16 mTimer; + /* 0xD24 */ f32 field_0xD24; + /* 0xD28 */ f32 field_0xD28; + /* 0xD2C */ u32 mCenterNode; + /* 0xD30 */ u8 field_0xD30; + /* 0xD31 */ u8 field_0xD31; + /* 0xD32 */ u16 mTimer; /* 0xD34 */ u8 _0xD34[0xD52 - 0xD34]; /* 0xD52 */ s16 field_0xD52; /* 0xD54 */ s16 field_0xD54; /* 0xD56 */ u8 _0xD56[0xD5E - 0xD56]; /* 0xD5E */ s16 field_0xD5E; /* 0xD60 */ s16 field_0xD60; - /* 0xD62 */ u8 _0xD62[0xD6A - 0xD62]; + /* 0xD62 */ s16 field_0xD62; + /* 0xD64 */ s16 field_0xD64; + /* 0xD66 */ s16 field_0xD66; + /* 0xD68 */ s16 field_0xD68; /* 0xD6A */ s16 field_0xD6A; /* 0xD6C */ s16 field_0xD6C; /* 0xD6E */ s16 field_0xD6E; @@ -199,13 +242,18 @@ private: /* 0xD9C */ s16 field_0xD9C; /* 0xD9E */ s16 field_0xD9E; /* 0xDA0 */ s16 field_0xDA0; - /* 0xDA2 */ u8 _0xDA2[0xDA5 - 0xDA2]; + /* 0xDA2 */ u8 _0xDA2[0xDA4 - 0xDA2]; + /* 0xDA4 */ u8 field_0xDA4; /* 0xDA5 */ u8 field_0xDA5; /* 0xDA6 */ u8 field_0xDA6; /* 0xDA7 */ u8 field_0xDA7; /* 0xDA8 */ u8 field_0xDA8; /* 0xDA9 */ u8 field_0xDA9; - /* 0xDAA */ u8 _0xDAA[0xDAF - 0xDAA]; + /* 0xDAA */ u8 field_0xDAA; + /* 0xDAB */ u8 field_0xDAB; + /* 0xDAC */ u8 field_0xDAC; + /* 0xDAD */ u8 field_0xDAD; + /* 0xDAE */ u8 field_0xDAE; /* 0xDAF */ u8 field_0xDAF; /* 0xDB0 */ u8 field_0xDB0; /* 0xDB1 */ u8 field_0xDB1; @@ -237,11 +285,8 @@ private: /* 0xDCB */ u8 field_0xDCB; /* 0xDCC */ u8 _0xDCC[0xDCF - 0xDCC]; /* 0xDCF */ u8 field_0xDCF; - /* 0xDD0 */ u8 _0xDD0[0xDD4 - 0xDD0]; - /* 0xDD4 */ mVec3_c mHomePos; - /* 0xDE0 */ mColor mColor; - /* 0xDE4 */ f32 field_0xDE4; - /* 0xDE8 */ u8 _0xDE8[0xDF0 - 0xDE8]; + /* 0xDD0 */ u8 field_0xDD0; + /* 0xDD4 */ LIGHT_INFLUENCE mLightInfluence; // Controlled by dTgKiesuTag_c static bool lbl_155_bss_388; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 362d88b1..fa5fec03 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -1124,6 +1124,9 @@ public: void SetCo_0x400() { mCo.OnSPrm(0x400); } + void SetCo_0x8000() { + mCo.OnSPrm(0x8000); + } void SetCo_0x40000000() { mCo.OnSPrm(0x40000000); } diff --git a/include/d/t/d_t_ks.h b/include/d/t/d_t_ks.h index bfa0afb9..c676ff32 100644 --- a/include/d/t/d_t_ks.h +++ b/include/d/t/d_t_ks.h @@ -31,6 +31,10 @@ public: field_0x456++; } + void setField_0x47A() { + field_0x47A = true; + } + private: /* 0x0FC */ STATE_MGR_DECLARE(dTgKiesuTag_c); /* 0x138 */ dAcRef_c mKsRefs[16]; @@ -90,6 +94,7 @@ private: /* 0x44A */ s16 mNumKsControl; /* 0x474 */ bool field_0x474; + /* 0x47A */ bool field_0x47A; /* 0x47E */ bool mbAllKsActive; /* 0x48A */ u8 field_0x48A; // Related to getting spawnPos/ Type? diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index c68673ad..5159967a 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -13,15 +13,27 @@ #include "d/col/bg/d_bg_s_roof_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_d.h" +#include "d/col/cc/d_cc_s.h" +#include "d/d_camera.h" #include "d/d_light_env.h" #include "d/d_pouch.h" +#include "d/d_sc_game.h" +#include "d/d_stage_mgr.h" +#include "d/flag/storyflag_manager.h" #include "d/snd/d_snd_wzsound.h" #include "d/t/d_t_ks.h" +#include "f/f_base.h" #include "f/f_profile_name.h" #include "m/m3d/m_fanm.h" #include "m/m_angle.h" +#include "m/m_color.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" #include "s/s_Math.h" #include "toBeSorted/attention.h" #include "toBeSorted/d_emitter.h" @@ -84,12 +96,16 @@ struct dAcEKs_HIO_c { f32 _0xB0; // 3.0 s16 _0xB4; // 3h s16 _0xB6; // 1h - f32 _0xB8; // 0.0099999998 + f32 _0xB8; // 0.01 f32 _0xBC; // 100.0 s16 _0xC0; // AABh s16 _0xC2; // 0h f32 _0xC4; // -0.5 + const s32 getZero() const { + s32 _weird_zero = 0; + return _0x04; + } static const dAcEKs_HIO_c sInstance; }; const dAcEKs_HIO_c dAcEKs_HIO_c::sInstance = { @@ -101,6 +117,8 @@ const dAcEKs_HIO_c dAcEKs_HIO_c::sInstance = { SPECIAL_ACTOR_PROFILE(E_KS, dAcEKs_c, fProfile::E_KS, 0xFE, 0, 4099); +static dCcD_SrcSph sSrcSph = {{0x400}}; + STATE_DEFINE(dAcEKs_c, Wait); STATE_DEFINE(dAcEKs_c, WakeUp); STATE_DEFINE(dAcEKs_c, ReturnToWait); @@ -122,25 +140,25 @@ bool dAcEKs_c::lbl_155_bss_389; bool dAcEKs_c::restorePosRotFromCopy() { if (field_0xDCF == 0) { if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition) != 0) { - field_0xAA8 = 0.f; + mTimeArea.setField0x00(0); mSph.ClrCoSet(); mSph.ClrTgSet(); mSph.ClrAtSet(); fn_800306D0(); - if (mType == 1 || mType == 2) { + if (mType == EKS_FIRE || mType == EKS_ELECTRIC) { field_0xD20 = 0.f; - field_0xDE4 = 0.f; + mLightInfluence.SetScale(0); if (mEmitter1.hasEmitters()) { mEmitter1.remove(true); } } } else { - field_0xAA8 = 1.f; + mTimeArea.setField0x00(1); fn_80030700(); mSph.OnCoSet(); mSph.OnTgSet(); } - mMdl.getModel().setScale(mScale * field_0xAA8); + mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe()); } return true; } @@ -152,7 +170,7 @@ void dAcEKs_c::linkKiesuTag(dTgKiesuTag_c *pTgKs) { void dAcEKs_c::setStartingState() { mTimer = cM::rndInt(1000); switch (mStartingState) { - case 0: { + case EKS_STARTSTATE_Move: { changeState(StateID_Move); mCurrentState = mStartingState; mAcch.ClrRoofNone(); @@ -160,7 +178,7 @@ void dAcEKs_c::setStartingState() { mAcch.SetGroundUpY(30.f); mAcchCir.SetWall(20.f, 60.f); } break; - case 1: { + case EKS_STARTSTATE_Wait: { changeState(StateID_Wait); mCurrentState = mStartingState; if ((s32)getFromParams(30, 0x3) == 1) { @@ -172,7 +190,7 @@ void dAcEKs_c::setStartingState() { mAcchCir.SetWall(0.f, 5.f); } break; - case 2: { + case EKS_STARTSTATE_PathMove: { mCurrentState = mStartingState; mAcch.ClrRoofNone(); mAcch.SetField_0xD4(55.f); @@ -191,21 +209,21 @@ void dAcEKs_c::setStartingState() { void dAcEKs_c::setIdleState() { switch (mStartingState) { - case 0: { + case EKS_STARTSTATE_Move: { changeState(StateID_Move); - mCurrentState = 0; + mCurrentState = EKS_STATE_Move; } break; - case 1: { + case EKS_STARTSTATE_Wait: { changeState(StateID_ReturnToWait); - mCurrentState = 5; + mCurrentState = EKS_STATE_ReturnToWait; } break; - case 2: { + case EKS_STARTSTATE_PathMove: { changeState(StateID_PathMove); - mCurrentState = 2; + mCurrentState = EKS_STATE_PathMove; } break; default: { changeState(StateID_Move); - mCurrentState = 0; + mCurrentState = EKS_STATE_Move; } break; } } @@ -368,7 +386,7 @@ void dAcEKs_c::kill(bool dropItem) { if (field_0xDB6 != 0) { killWithFlagNoItemDrop(); } else if (dropItem == true) { - if (mType == 3) { + if (mType == EKS_CURSED) { if (tryDropItem(0.05f)) { spawnDrop(ITEM_EVIL_CRYSTAL, mRoomID, mPosition, mAngle); } @@ -393,8 +411,8 @@ void dAcEKs_c::chaseTargetY(f32 ratio, f32 maxStepSize) { void dAcEKs_c::playBlinkAnm() { mAnmTexPat.play(); if (mAnmTexPat.isStop(0)) { - if (mCurrentAnmTexPat == 2) { - setBlink(0); + if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK3) { + setBlink(EKS_TEXPAT_BLINK1); } mBlinkTimer--; @@ -446,7 +464,7 @@ void dAcEKs_c::fn_155_1470() { field_0xDC1 = 0; if (getStartingPos().squareDistanceToXZ(mPosition) < 6400.f) { changeState(StateID_WaitReady); - mCurrentState = 1; + mCurrentState = EKS_STATE_Wait; return; } } else { @@ -732,7 +750,7 @@ void dAcEKs_c::fn_155_2270() { y = y - mRotation.y; if (field_0xDA6 != 0) { if (transitionToNextState()) { - if (mType == 2) { + if (mType == EKS_ELECTRIC) { fn_155_3EC0(); field_0xDA9 = 1; } @@ -765,9 +783,9 @@ void dAcEKs_c::fn_155_2270() { mTgRef.get()->incrementField_0x456(); } changeState(StateID_AttackReady); - mCurrentState = 9; + mCurrentState = EKS_STATE_AttackReady; - if (mType == 2) { + if (mType == EKS_ELECTRIC) { fn_155_3EC0(); field_0xDA9 = 1; } @@ -1072,19 +1090,19 @@ void dAcEKs_c::fn_155_3480() { bool dAcEKs_c::transitionToNextState() { if (mCurrentState != mNextState) { switch (mNextState) { - case 0: changeState(StateID_Move); break; - case 1: changeState(StateID_Wait); break; - case 4: changeState(StateID_WakeUp); break; - case 5: changeState(StateID_ReturnToWait); break; - case 6: changeState(StateID_Chase); break; - case 7: changeState(StateID_ChaseAttack); break; - case 8: changeState(StateID_Fighting); break; - case 9: changeState(StateID_AttackReady); break; - case 10: changeState(StateID_Attack); break; - case 11: changeState(StateID_Damage); break; - case 12: changeState(StateID_Stun); break; - case 13: changeState(StateID_WindBlow); break; - case 2: changeState(StateID_PathMove); break; + case EKS_STATE_Move: changeState(StateID_Move); break; + case EKS_STATE_Wait: changeState(StateID_Wait); break; + case EKS_STATE_WakeUp: changeState(StateID_WakeUp); break; + case EKS_STATE_ReturnToWait: changeState(StateID_ReturnToWait); break; + case EKS_STATE_Chase: changeState(StateID_Chase); break; + case EKS_STATE_ChaseAttack: changeState(StateID_ChaseAttack); break; + case EKS_STATE_Fighting: changeState(StateID_Fighting); break; + case EKS_STATE_AttackReady: changeState(StateID_AttackReady); break; + case EKS_STATE_Attack: changeState(StateID_Attack); break; + case EKS_STATE_Damage: changeState(StateID_Damage); break; + case EKS_STATE_Stun: changeState(StateID_Stun); break; + case EKS_STATE_WindBlow: changeState(StateID_WindBlow); break; + case EKS_STATE_PathMove: changeState(StateID_PathMove); break; } mCurrentState = mNextState; return true; @@ -1111,16 +1129,16 @@ void dAcEKs_c::fn_155_3720(f32 scale, f32 rate) { void dAcEKs_c::fn_155_3750(u8 state) { switch (state) { - case 0: mNextState = state; break; - case 1: mNextState = 5; break; - case 2: mNextState = state; break; - default: mNextState = 0; break; + case EKS_STATE_Move: mNextState = state; break; + case EKS_STATE_Wait: mNextState = EKS_STATE_ReturnToWait; break; + case EKS_STATE_PathMove: mNextState = state; break; + default: mNextState = EKS_STATE_Move; break; } } void dAcEKs_c::fn_155_37A0() { mSph.OnAtSet(); - if (mType == 2) { + if (mType == EKS_ELECTRIC) { fn_155_3E90(); field_0xDA9 = 0; field_0xD60 = 0; @@ -1128,7 +1146,7 @@ void dAcEKs_c::fn_155_37A0() { } void dAcEKs_c::fn_155_37F0() { - if (mType == 2) { + if (mType == EKS_ELECTRIC) { fn_155_3E90(); field_0xDA9 = 0; field_0xD60 = 0; @@ -1137,14 +1155,14 @@ void dAcEKs_c::fn_155_37F0() { void dAcEKs_c::fn_155_3840() { mSph.ClrAtSet(); - if (mType == 2) { + if (mType == EKS_ELECTRIC) { fn_155_3EC0(); field_0xDA9 = 1; } } void dAcEKs_c::fn_155_3890() { - if (mType == 2) { + if (mType == EKS_ELECTRIC) { fn_155_3EC0(); field_0xDA9 = 1; } @@ -1207,9 +1225,9 @@ void dAcEKs_c::setBlink(u8 blink) { nw4r::g3d::ResAnmTexPat pat(nullptr); mCurrentAnmTexPat = blink; switch (mCurrentAnmTexPat) { - case 0: pat = mResFile.GetResAnmTexPat("blink_1"); break; - case 1: pat = mResFile.GetResAnmTexPat("blink_2"); break; - case 2: pat = mResFile.GetResAnmTexPat("blink_3"); break; + case EKS_TEXPAT_BLINK1: pat = mResFile.GetResAnmTexPat("blink_1"); break; + case EKS_TEXPAT_BLINK2: pat = mResFile.GetResAnmTexPat("blink_2"); break; + case EKS_TEXPAT_BLINK3: pat = mResFile.GetResAnmTexPat("blink_3"); break; } mAnmTexPat.setAnm(mMdl.getModel(), pat, 0, m3d::PLAY_MODE_4); } @@ -1270,6 +1288,466 @@ void dAcEKs_c::fn_155_3F50() { } } +bool dAcEKs_c::createHeap() { + static const char *resFiles[] = {"Kiesu", "Kiesu_fire", "Kiesu_electric", "KiesuDevil"}; + static const char *mdlNames[] = {"kiesu", "F_kiesu", "EKiesu", "DKiesu"}; + + mType = getFromParams(0, 0x7); + nw4r::g3d::ResFile mdlResFile(getOarcResFile(resFiles[mType])); + nw4r::g3d::ResFile anmResFile(getOarcResFile("Kiesu_anime")); + + TRY_CREATE(mMdl.create3(*this, mdlResFile.ptr(), anmResFile.ptr(), mdlNames[mType], "fly", 0x133)); + + mResFile = mdlResFile; + + nw4r::g3d::ResAnmTexPat anmTexPat(mResFile.GetResAnmTexPat("blink_1")); + + TRY_CREATE(mAnmTexPat.create(mMdl.getModel().getResMdl(), anmTexPat, &mAllocator, nullptr, 1)); + + fn_80030980(mMdl.getModel(), 1, false); + mMdl.getModel().setAnm(mAnmTexPat); + + return true; +} + +int dAcEKs_c::actorCreate() { + if (StoryflagManager::sInstance->getFlag(STORYFLAG_GRATITUDE_QUEST_FINISHED)) { + if (dScGame_c::isCurrentStage("F000") || dScGame_c::isCurrentStage("D000")) { + return FAILED; + } + } + + CREATE_ALLOCATOR(dAcEKs_c); + + mAcch.Set(this, 1, &mAcchCir); + mAcchCir.SetWall(20, 60); + + mStts.SetRank(2); + + mSph.Set(sSrcSph); + mSph.SetStts(mStts); + + mAcceleration = 0.f; + mMaxSpeed = -40.f; + + setStartingPosition(mPosition); + field_0xBE0 = mPosition; + field_0xBEC.set(0, 100, 0); + field_0xC10.set(0, 0, 0); + field_0xCE4 = 500.f; + + field_0xDB7 = 0; + field_0xDA5 = 0; + field_0xDA9 = 0; + field_0xDAA = 0; + field_0xDB6 = 0; + field_0xDAC = 1; + field_0xDBE = 45; + field_0xDBB = 0; + field_0xDC1 = 0; + + mSph.ClrAtSet(); + mHealth = 4; + field_0xD84 = 0; + + mEmitter1.init(this); + mEmitter2.init(this); + + field_0xDA7 = 0; + field_0xDAD = 0; + field_0xDAE = 0; + field_0xDC8 = 0; + + field_0xD04 = 0.f; + field_0xD00 = 0.f; + + field_0xD88 = mRotation.y; + field_0xD8A = mRotation.y - 0x8000; + + field_0xDBF = 0; + field_0xD60 = 0; + field_0xD62 = 10 + cM::rndInt(5); + field_0xDB1 = 0; + field_0xDCF = (mRotation.z >> 12) & 1; + field_0xD9A = 0; + if (field_0xDCF == 0) { + field_0xDD0 = 0; + mTimeArea.setField0x08(1); + mTimeArea.setField0x00(1); + + if (dScGame_c::isCurrentStage("D301")) { + setActorProperty(AC_PROP_0x400); + } + } + field_0xC3C = getFromParams(6, 0xF) * 100.f; + field_0xC40 = getFromParams(10, 0xF) * 100.f; + field_0xC44 = ((mRotation.z >> 0) & 0xF) * 100.f; + field_0xC48 = ((mRotation.z >> 4) & 0xF) * 100.f; + + if (!mTgRef.isLinked() || ((mRotation.z >> 8) & 0xF) < 3) { + field_0xDA6 = 0; + } + + mAngle.z = mRotation.z = 0; + + lbl_155_bss_388 = 0; + lbl_155_bss_389 = 0; + + field_0xDB0 = mRail.init(getFromParams(22, 0xFF), mRoomID, 1, 0, false, 0.f, 0.f, 0.01f); + if (field_0xDB0 != 0) { + mRail.setSpeed(15.f); + } + if (field_0xDB0 != 0) { + mStartingState = 2; + } else { + mStartingState = getFromParams(3, 0x7); + } + + mVec3_c bboxMin(-250, -800, -250); + mVec3_c bboxMax(250, 250, 250); + mBoundingBox.Set(bboxMin, bboxMax); + + field_0xD9C = cM::rndF(0x10000); + field_0xD9E = 0; + mScale.set(1.2, 1.2, 1.2); + + mMdl.getModel().setScale(mScale); + mWaterEmitter.init(this, 30, 1, 0); + if (mType != EKS_NORMAL) { + field_0xDA4 = 1; + nw4r::g3d::ResNode node = mMdl.getModel().getResMdl().GetResNode("center"); + mCenterNode = node.GetID(); + } else { + field_0xDA4 = 0; + } + + if (mType == EKS_FIRE) { + mSph.SetAtModifier(AT_MOD_FIRE); + mSph.SetCo_0x8000(); + mTargetFiTextID = 0xE; + } else if (mType == EKS_ELECTRIC) { + mSph.SetAtModifier(AT_MOD_ELECTRIC); + field_0xDA9 = 1; + mTargetFiTextID = 0xD; + } else if (mType == EKS_CURSED) { + mSph.SetAtModifier(AT_MOD_CURSED); + mTargetFiTextID = 0xC; + } + + if (mType == EKS_FIRE) { + mLightInfluence.mPos = mPosition; + mLightInfluence.mClr.Set(0xFF, 0xA0, 0x50, 0xFF); + mLightInfluence.SetScale(400); + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + dLightEnv_c::GetPInstance()->plight_set(&mLightInfluence); + } else if (mType == EKS_ELECTRIC) { + mLightInfluence.mPos = mPosition; + mLightInfluence.mClr.Set(0x64, 0xFF, 0xFF, 0xFF); + mLightInfluence.SetScale(300); + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + dLightEnv_c::GetPInstance()->plight_set(&mLightInfluence); + } + setStartingState(); + mAcch.CrrPos(*dBgS::GetInstance()); + + return SUCCEEDED; +} + +int dAcEKs_c::actorPostCreate() { + if (field_0xDCF == 0) { + if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition)) { + mTimeArea.setField0x00(0.f); + } + mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe()); + } + + if (isState(StateID_Wait)) { + mPosition.y = getLineCrossYRange(mPosition, 200); + setStartingPosition(mPosition); + } + + mPnts[0].set(mStartingPos); + + if (isState(StateID_Wait)) { + mPnts[0].y -= 20.f; + } + + updateMatrix(); + + return SUCCEEDED; +} + +int dAcEKs_c::doDelete() { + if (mType == EKS_FIRE || mType == EKS_ELECTRIC) { + dLightEnv_c::GetPInstance()->plight_cut(&mLightInfluence); + } + return SUCCEEDED; +} + +int dAcEKs_c::actorExecute() { + s32 _weird_zero = 0; + + mTimer++; + + if (field_0xDCF == 0) { + int checkedTime = mTimeArea.check(mRoomID, mPosition, 0, 30, 0.2); + if (checkedTime != 0) { + if (checkedTime > 0) { + startSound(SE_TIMESLIP_TIMESLIP); + field_0xD9A = 15; + } else { + startSound(SE_TIMESLIP_TIMESLIP_REV); + mSph.OnCoSet(); + mSph.OnTgSet(); + } + + static mVec3_c effScale(1, 1, 1); + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_464_, mPosition, nullptr, &effScale, nullptr, nullptr, 0, 0 + ); + fn_80030700(); + } + + if (mTimeArea.isNearZero()) { + mSph.ClrCoSet(); + mSph.ClrTgSet(); + mSph.ClrAtSet(); + + fn_800306D0(); + if (mType == EKS_FIRE || mType == EKS_ELECTRIC) { + field_0xD20 = 0.f; + mLightInfluence.SetScale(0.f); + } + + return SUCCEEDED; + } + + if (field_0xD9A > 0) { + field_0xD9A--; + } + } + if (mHealth != 0) { + fn_155_A60(); + } + + mStateMgr.executeState(); + field_0xD9C++; + + if (isState(StateID_Chase) || isState(StateID_ChaseAttack) || isState(StateID_Fighting) || + isState(StateID_AttackReady) || isState(StateID_Attack) || isState(StateID_WindBlow)) { + fn_155_3F50(); + } + + if (mType == EKS_FIRE) { + if (field_0xDA9 != 0 || isState(StateID_Wait)) { + field_0xD20 = 0.f; + mLightInfluence.SetScale(0.f); + } else { + if (field_0xD60 > 0) { + field_0xD20 = 0.f; + } else { + field_0xD20 = 400.f; + } + } + + mLightInfluence.mClr.Set(0xFF, 0xA0, 0x50, 0xFF); + sLib::addCalcScaledDiff(&mLightInfluence.mScale, field_0xD20, field_0xD24, field_0xD28); + } else if (mType == EKS_ELECTRIC) { + if (field_0xDA9 != 0 || isState(StateID_Wait) || field_0xD60 > 0) { + field_0xD20 = 0.f; + mLightInfluence.SetScale(0.f); + } else { + if ((dScGame_c::getUpdateFrameCount() & 8) != 0) { + mLightInfluence.SetScale(300.f); + } else { + mLightInfluence.SetScale(200.f); + } + } + mLightInfluence.mClr.Set(0x64, 0xFF, 0xFF, 0xFF); + } + + if (!isState(StateID_WindBlow)) { + if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BELLOWS) && mSph.GetTgDamageFlags() == 0x8) { + if (field_0xDA6 != 0) { + mCurrentState = EKS_STATE_WindBlow; + if (mTgRef.isLinked()) { + mTgRef.get()->setField_0x47A(); + } + } + mVelocity.set(0, 0, 0); + mAngle.y = cLib::targetAngleY(dAcPy_c::GetLink()->mPositionCopy2, mPosition); + mAngle.x = cLib::targetAngleX(dAcPy_c::GetLink()->mPositionCopy2, mPosition); + + // I Guess we funky + s32 t = 7281; + field_0xD66 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.75f + (0.01f * _weird_zero))) * t; + field_0xD68 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.65f + (0.01f * _weird_zero))) * t; + + if (field_0xD66 < 0) { + field_0xD64 = -910; + } else { + field_0xD64 = 910; + } + if (isState(StateID_Wait)) { + mSpeed = 0.f; + mVelocity.set(0, 0, 0); + field_0xDAA = 1; + mPosition.y -= 30.f; + changeState(StateID_WindBlow); + } else { + mSpeed = 35.f; + if (mAngle.x > 0xAAB) { + mVelocity.y = 15.f; + } else if (mAngle.x < -0xAAB) { + mVelocity.y = -15.f; + } + changeState(StateID_WindBlow); + } + } + } + + calcVelocity(); + + mPosition += mVelocity; + mPosition += mStts.GetCcMove(); + + if (!(isState(StateID_Wait) || isState(StateID_WaitReady))) { + mAcch.CrrPos(*dBgS::GetInstance()); + mWaterEmitter.execute(mAcch.GetWtrGroundH(), mAcch.GetGroundH()); + } + + if (field_0xDCF == 0) { + mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe()); + } else { + mMdl.getModel().setScale(mScale); + } + + updateMatrix(); + mMdl.getModel().setLocalMtx(mWorldMtx); + mMdl.getModel().calc(false); + mSph.SetC(mPosition + field_0xC10); + dCcS::GetInstance()->Set(&mSph); + + if (isNotWaitingNorDamage()) { + mPositionCopy2.set(mPosition); + mPositionCopy3.set(mPosition); + if (!isState(StateID_Stun)) { + mPositionCopy3.y += 60.f; + } else { + mPositionCopy3.y += 40.f; + } + fn_80030c20(0x2, 700, 50, -500, 500); + } + + fn_80030400(mMdl.getModel(), 100, false, field_0xDBF); + + if (field_0xD30 != 0) { + if (checkObjectProperty(OBJ_PROP_0x1)) { + field_0xD31 = 0; + } else { + if ((mTimer % 12) == 0) { + mVec3_c start = mPosition; + mVec3_c end = dScGame_c::getCamera()->getPosition(); + end.y += 100.f; + end += start; + end *= 0.5f; + + if (dBgS_ObjLinChk::LineCross(&start, &end, nullptr)) { + field_0xD31 = 0; + } else { + field_0xD31 = 1; + } + } + } + } else { + field_0xD31 = 1; + if (checkObjectProperty(OBJ_PROP_0x1)) { + field_0xD31 = 0; + } + } + + if (field_0xDA9 == 0) { + if (!isState(StateID_Wait) && field_0xDA4 != 0) { + if (mType == EKS_FIRE) { + if (field_0xD60 > 0) { + field_0xD60--; + } else { + if (field_0xD31 != 0) { + holdSound(SE_EKs_FIRE_LV); + mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx); + mCenterWorldMtx.getTranslation(field_0xB98); + mEmitter1.holdEffect( + PARTICLE_RESOURCE_ID_MAPPING_402_, field_0xB98, nullptr, &mScale, nullptr, nullptr + ); + mLightInfluence.mPos = field_0xB98; + } + } + } else if (mType == EKS_ELECTRIC) { + if (field_0xD60 > 0) { + field_0xD60--; + } else { + if (field_0xD31 != 0) { + fn_155_3E90(); + holdSound(SE_EKs_ELEC_LV); + mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx); + mCenterWorldMtx.getTranslation(field_0xB98); + mEmitter1.holdEffect( + PARTICLE_RESOURCE_ID_MAPPING_401_, field_0xB98, nullptr, &mScale, nullptr, nullptr + ); + mLightInfluence.mPos = field_0xB98; + } + } + } else if (mType == EKS_CURSED) { + if (field_0xD60 > 0) { + field_0xD60--; + } else { + if (field_0xD31 != 0) { + holdSound(SE_EKs_MA_LV); + mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx); + mCenterWorldMtx.getTranslation(field_0xB98); + mEmitter1.holdEffect( + PARTICLE_RESOURCE_ID_MAPPING_400_, field_0xB98, nullptr, &mScale, nullptr, nullptr + ); + mEmitter1.setGlobalAlpha(dStageMgr_c::GetInstance()->getGlobalAlpha()); + } + } + } + } + } + + return SUCCEEDED; +} +int dAcEKs_c::draw() { + if (field_0xDCF == 0 && mTimeArea.isNearZero()) { + return SUCCEEDED; + } + + if (field_0xDA9 == 0 && !isState(StateID_Wait) && field_0xDA4 != 0) { + if (mType == EKS_FIRE || mType == EKS_ELECTRIC) { + mLightingInfo.mLightingCode = 0xF; + } + } + + drawModelType1(&mMdl.getModel()); + + if (!isState(StateID_Wait)) { + field_0xD18 = mPosition.y - mAcch.GetGroundH(); + // I hate this xD + mQuat_c shadowRot( + mVec3_c(0.f + dAcEKs_HIO_c::sInstance.getZero(), 5, 0.f + dAcEKs_HIO_c::sInstance.getZero()), + 50.f + dAcEKs_HIO_c::sInstance.getZero() + ); + field_0xAE4.transS(mPosition); + drawShadow(mShadow, nullptr, field_0xAE4, &shadowRot, -1, -1, -1, -1, -1, field_0xD18); + } + + return SUCCEEDED; +} + void dAcEKs_c::initializeState_Wait() {} void dAcEKs_c::executeState_Wait() {} void dAcEKs_c::finalizeState_Wait() {} From 488874b370057e1a8b76926d34750e6cc28bd2eb Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 16 May 2026 00:39:59 -0400 Subject: [PATCH 06/17] fix d_t_beetle for vt_0x1C0 change --- src/REL/d/t/d_t_beetle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REL/d/t/d_t_beetle.cpp b/src/REL/d/t/d_t_beetle.cpp index dbd5432e..cc0c305c 100644 --- a/src/REL/d/t/d_t_beetle.cpp +++ b/src/REL/d/t/d_t_beetle.cpp @@ -56,7 +56,7 @@ int dTgBeetle_c::actorExecute() { if (!SceneflagManager::sInstance->checkBoolFlag(mRoomID, mBeetleFlag) || mActorSubtype) { dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)dAcPy_c::GetLink() - ->vt_0x1C0(); // boomerang pointer cast required because function currently returns void* + ->getBeetleInFlight(); // boomerang pointer cast required because function currently returns void* if (mZoneShape == RectangularPrismShape) { // rectangular prism if (beetlePtr && checkAreaBox(mMatrix1, beetlePtr->mPosition)) { From 7d2f5d2e35abd38d02ec8191fab69f62235abecd Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 16 May 2026 12:50:40 -0400 Subject: [PATCH 07/17] dAcEKs_c State Wait --- config/SOUE01/rels/d_a_e_ksNP/symbols.txt | 2 +- include/d/a/e/d_a_e_ks.h | 16 +- src/REL/d/a/e/d_a_e_ks.cpp | 247 +++++++++++++++++++++- 3 files changed, 256 insertions(+), 9 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt index 97299607..1065fcf7 100644 --- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt @@ -32,7 +32,7 @@ fn_155_1C80__8dAcEKs_cFv = .text:0x00001C80; // type:function size:0x5E4 fn_155_2270__8dAcEKs_cFv = .text:0x00002270; // type:function size:0x754 fn_155_29D0__8dAcEKs_cFl = .text:0x000029D0; // type:function size:0x1A8 fn_155_2B80__8dAcEKs_cFbl = .text:0x00002B80; // type:function size:0x1E0 -fn_155_2D60__8dAcEKs_cFv = .text:0x00002D60; // type:function size:0x138 +fn_155_2D60__8dAcEKs_cFbl = .text:0x00002D60; // type:function size:0x138 fn_155_2EA0__8dAcEKs_cFv = .text:0x00002EA0; // type:function size:0x118 isOutsideRange__8dAcEKs_cFv = .text:0x00002FC0; // type:function size:0x84 isNotWaitingNorDamage__8dAcEKs_cFv = .text:0x00003050; // type:function size:0xAC diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index 0df03993..589ec6d8 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -188,7 +188,9 @@ private: /* 0xC70 */ f32 field_0xC70; /* 0xC74 */ u8 _0xC74[0xCE4 - 0xC74]; /* 0xCE4 */ f32 field_0xCE4; - /* 0xCE8 */ u8 _0xCE8[0xD00 - 0xCE8]; + /* 0xCE8 */ u8 _0xCE8[0xCF8 - 0xCE8]; + /* 0xCF8 */ f32 field_0xCF8; + /* 0xCFC */ f32 field_0xCFC; /* 0xD00 */ f32 field_0xD00; /* 0xD04 */ f32 field_0xD04; /* 0xD08 */ f32 field_0xD08; @@ -204,7 +206,11 @@ private: /* 0xD30 */ u8 field_0xD30; /* 0xD31 */ u8 field_0xD31; /* 0xD32 */ u16 mTimer; - /* 0xD34 */ u8 _0xD34[0xD52 - 0xD34]; + /* 0xD34 */ u8 _0xD34[0xD4A - 0xD34]; + /* 0xD4A */ s16 field_0xD4A; + /* 0xD4C */ s16 field_0xD4C; + /* 0xD4E */ s16 field_0xD4E; + /* 0xD50 */ s16 field_0xD50; /* 0xD52 */ s16 field_0xD52; /* 0xD54 */ s16 field_0xD54; /* 0xD56 */ u8 _0xD56[0xD5E - 0xD56]; @@ -232,7 +238,7 @@ private: /* 0xD88 */ s16 field_0xD88; /* 0xD8A */ s16 field_0xD8A; /* 0xD8C */ s16 field_0xD8C; - /* 0xD8E */ s16 field_0xD8E; + /* 0xD8E */ u16 field_0xD8E; /* 0xD90 */ s16 field_0xD90; /* 0xD92 */ s16 field_0xD92; /* 0xD94 */ s16 field_0xD94; @@ -283,7 +289,9 @@ private: /* 0xDC9 */ u8 field_0xDC9; /* 0xDCA */ u8 field_0xDCA; /* 0xDCB */ u8 field_0xDCB; - /* 0xDCC */ u8 _0xDCC[0xDCF - 0xDCC]; + /* 0xDCC */ u8 field_0xDCC; + /* 0xDCD */ u8 field_0xDCD; + /* 0xDCE */ u8 field_0xDCE; /* 0xDCF */ u8 field_0xDCF; /* 0xDD0 */ u8 field_0xDD0; /* 0xDD4 */ LIGHT_INFLUENCE mLightInfluence; diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index 5159967a..94f2ba8b 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -20,6 +20,7 @@ #include "d/d_pouch.h" #include "d/d_sc_game.h" #include "d/d_stage_mgr.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_ks.h" @@ -28,6 +29,7 @@ #include "m/m3d/m_fanm.h" #include "m/m_angle.h" #include "m/m_color.h" +#include "m/m_mtx.h" #include "m/m_quat.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resanmtexpat.h" @@ -1748,9 +1750,244 @@ int dAcEKs_c::draw() { return SUCCEEDED; } -void dAcEKs_c::initializeState_Wait() {} -void dAcEKs_c::executeState_Wait() {} -void dAcEKs_c::finalizeState_Wait() {} +void dAcEKs_c::initializeState_Wait() { + // Float Ordering + static const f32 __f[1] = {0.f}; + + mAcchCir.SetWall(0, 5); + setAnim("wait", 4, 1, 0); + setBlink(EKS_TEXPAT_BLINK1); + mAnmTexPat.setFrame(3, 0); + mStts.SetRank(11); + mSpeed = 0.f; + field_0xC10.y = -35.f; + field_0xD4A = 30; + field_0xDA5 = 0; + field_0xDAA = 0; + field_0xDC4 = cM::rndInt(35); + field_0xD90 = 3; + field_0xDCE = 0; + field_0xDB4 = 0; + if (field_0xDB0 != 0) { + field_0xDB1 = 1; + field_0xD8E = field_0xDCA * 30; + } else if ((s32)getFromParams(30, 3) == 1) { + field_0xDB1 = 1; + field_0xD8E = (cM::rndInt(20) + 10) * 30; + } + + mRotation.y = field_0xD8A; + mRotation.x = mAng(0); + mAcch.ClrRoofHit(); + mAcch.SetField_0xD4(0); + mAcch.SetGroundUpY(0); + setBattleBgmRelated(0); + + if (field_0xDA6 != 0) { + fn_155_3E30(); + } else { + setActorProperty(AC_PROP_0x1); + } + + if (mType == EKS_FIRE) { + mSph.ClrCo_0x8000(); + field_0xD20 = 0.f; + mLightInfluence.SetScale(0.f); + } else if (mType == EKS_ELECTRIC) { + fn_155_3EC0(); + field_0xD20 = 0.f; + mLightInfluence.SetScale(0.f); + } + mPosition.y = getLineCrossYRange(mPosition, 200); + setStartingPosition(mPosition); +} + +// NONMATCHING +void dAcEKs_c::executeState_Wait() { + mMdl.play(); + u16 flag = getFromParams(14, 0xFF); + if (flag < 0xFF) { + if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, flag)) { + if (field_0xDCE == 0) { + bool b = false; + mStartingState = EKS_STARTSTATE_Move; + if (field_0xDA6 == 0) { + mMtx_c m; + m.YrotS(mRotation.y + 0x8000); + mVec3_c out, in(0, 0, 500); + m.multVecSR(in, out); + + mVec3_c start(getStartingPos() + out); + mVec3_c out2 = out * 2.f; + mVec3_c end(getStartingPos() + out2); + if (dBgS_ObjLinChk::LineCross(&start, &end, nullptr) && dBgS_ObjLinChk::ChkWall()) { + b = true; + } + if (!b) { + out *= 2.f; + } + setStartingPosition(getStartingPos() + out); + } + field_0xCF8 = 20.f; + field_0xDC8 = 150; + field_0xD04 = 0.9f; + field_0xD00 = 1.7f; + field_0xDCE = 1; + + } else if (field_0xDCE == 1) { + changeState(StateID_WakeUp); + return; + } + } else if (field_0xDB4 != 0 && --field_0xD4A < 0xF) { + mAnmTexPat.play(); + if (field_0xD4A < 0) { + mStartingState = EKS_STARTSTATE_Move; + field_0xDAA = 1; + dTgKiesuTag_c *pTg = mTgRef.get(); + if (pTg) { + pTg->setField_0x47A(); + } + changeState(StateID_WakeUp); + return; + } + } + + if (fn_155_2EA0()) { + playBlinkAnm(); + if (field_0xD62 > 0) { + field_0xD62--; + } else { + field_0xD62 = cM::rndInt(5) + 10; + f32 f = 800.f; + if (field_0xD1C < f * f && !dBgS_ObjLinChk::LineCross(&mPosition, &field_0xC28, nullptr)) { + field_0xDB4 = 1; + field_0xD4A = cM::rndInt(15); + } + } + } else if (field_0xDA5 == 0) { + mAnmTexPat.setFrame(3, 0); + } + return; + } + + if (field_0xDA6 != 0) { + if (field_0xDA5 == 0) { + if (field_0xDAD != 0) { + if (field_0xDC4 != 0) { + field_0xDC4--; + } else { + field_0xDA5 = 1; + field_0xD4C = cLib::targetAngleY(mPosition, targetPlayerOrScrapper(0)->mPosition) - 0x8000; + } + } + } else { + sLib::addCalcAngle(mRotation.y.ref(), field_0xD4C, 5, 0xAAB); + + if (--field_0xD4A < 15) { + mAnmTexPat.play(); + if (field_0xD4A < 0) { + field_0xD4C = field_0xD4C + 0x8000; + changeState(StateID_WakeUp); + return; + } + } + } + if (field_0xDB4 != 0 || field_0xDAA != 0) { + if (--field_0xD4A < 15) { + mAnmTexPat.play(); + if (field_0xD4A < 0) { + field_0xDAA = 1; + if (mTgRef.isLinked()) { + mTgRef.get()->setField_0x47A(); + } + changeState(StateID_WakeUp); + return; + } + } + } + } else { + fn_155_3E30(); + if (field_0xDA5 == 0) { + if (field_0xD90 > 0) { + field_0xD90--; + } else { + if (fn_155_2D60(true, 0)) { + field_0xDA5 = 1; + field_0xD4C = cLib::targetAngleY(mPosition, targetPlayerOrScrapper(0)->mPosition) - 0x8000; + } else { + field_0xD90 = 3; + } + } + } else { + sLib::addCalcAngle(mRotation.y.ref(), field_0xD4C, 5, 0xAAB); + + if (--field_0xD4A < 15) { + mAnmTexPat.play(); + if (field_0xD4A < 0) { + field_0xD4C = field_0xD4C + 0x8000; + changeState(StateID_WakeUp); + return; + } + } + } + if (field_0xDAA != 0 || field_0xDB4 != 0) { + if (--field_0xD4A < 15) { + mAnmTexPat.play(); + if (field_0xD4A < 0) { + changeState(StateID_WakeUp); + return; + } + } + } + if (field_0xDB1 != 0) { + if (field_0xD8E != 0) { + field_0xD8E--; + } else { + field_0xDAA = 1; + changeState(StateID_WakeUp); + return; + } + } + } + + if (dLightEnv_c::GetPInstance()->check_BPM8(&mPosition, nullptr) || field_0xDAE != 0) { + field_0xDAA = 1; + field_0xD4A = cM::rndInt(10); + } + if (fn_155_2EA0()) { + playBlinkAnm(); + if (field_0xD62 > 0) { + field_0xD62--; + } else { + field_0xD62 = cM::rndInt(5) + 10; + f32 f = 800.f; + if (field_0xD1C < f * f && !dBgS_ObjLinChk::LineCross(&mPosition, &field_0xC28, nullptr)) { + field_0xDB4 = 1; + field_0xD4A = cM::rndInt(15); + } + } + } else { + if (field_0xDA5 == 0) { + mAnmTexPat.setFrame(3, 0); + } + } +} +void dAcEKs_c::finalizeState_Wait() { + mStts.SetRank(2); + field_0xC10.y = 0.f; + setBattleBgmRelated(2); + + if (mType == EKS_FIRE) { + mSph.SetCo_0x8000(); + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + } else if (mType == EKS_ELECTRIC) { + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + } +} void dAcEKs_c::initializeState_WakeUp() {} void dAcEKs_c::executeState_WakeUp() {} @@ -1802,4 +2039,6 @@ void dAcEKs_c::finalizeState_WindBlow() {} void dAcEKs_c::initializeState_PathMove() {} void dAcEKs_c::executeState_PathMove() {} -void dAcEKs_c::finalizeState_PathMove() {} +void dAcEKs_c::finalizeState_PathMove() { + field_0xD30 = 0; +} From e6a0994f00d0e24ae6e287d3e592e02417cfac03 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 16 May 2026 15:36:01 -0400 Subject: [PATCH 08/17] dAcEKs_c State WakeUp and State ReturnToWait --- src/REL/d/a/e/d_a_e_ks.cpp | 116 +++++++++++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 6 deletions(-) diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index 94f2ba8b..5a4cd206 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -1989,13 +1989,117 @@ void dAcEKs_c::finalizeState_Wait() { } } -void dAcEKs_c::initializeState_WakeUp() {} -void dAcEKs_c::executeState_WakeUp() {} -void dAcEKs_c::finalizeState_WakeUp() {} +void dAcEKs_c::initializeState_WakeUp() { + setAnim("turn_st", 10, 1, 0); + setBlink(EKS_TEXPAT_BLINK1); + mBlinkTimer = cM::rndInt(75) + 15; + field_0xCFC = mPosition.y - 70.f; + field_0xD4E = 15; -void dAcEKs_c::initializeState_ReturnToWait() {} -void dAcEKs_c::executeState_ReturnToWait() {} -void dAcEKs_c::finalizeState_ReturnToWait() {} + if (field_0xDAA) { + field_0xDA5 = 0; + } else { + field_0xDA5 = 1; + } + mAcch.ClrRoofNone(); + mAcchCir.SetWall(-20, 5); +} +void dAcEKs_c::executeState_WakeUp() { + mMdl.play(); + playBlinkAnm(); + sLib::addCalcScaledDiff(&mPosition.y, field_0xCFC, 0.1, 3); + sLib::addCalcAngle(mRotation.y.ref(), field_0xD4C, 12, 0xAAB); + sLib::addCalcAngle(mAngle.y.ref(), field_0xD4C, 12, 0xAAB); + if (field_0xDA6 != 0) { + if (--field_0xD4E < 0) { + if (transitionToNextState()) { + return; + } + } + } else if (--field_0xD4E < 0) { + if (field_0xDAA != 0) { + if (fn_155_2B80(true, 0)) { + changeState(StateID_Chase); + } else if (field_0xDB0) { + changeState(StateID_PathMove); + } else { + changeState(StateID_ReturnToWait); + } + } else if (field_0xDC8 != 0) { + changeState(StateID_Move); + } else { + changeState(StateID_Chase); + } + } +} +void dAcEKs_c::finalizeState_WakeUp() { + mAngle.y = mRotation.y; + mAcch.ClrRoofNone(); + mAcchCir.SetWall(20, 60); + mAcch.SetField_0xD4(55); + mAcch.SetGroundUpY(30); +} + +void dAcEKs_c::initializeState_ReturnToWait() { + field_0xD30 = 1; + setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0); + if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) { + setBlink(EKS_TEXPAT_BLINK3); + } else { + setBlink(EKS_TEXPAT_BLINK1); + } + + mBlinkTimer = cM::rndInt(75) + 15; + field_0xD52 = cM::rndInt(20) + 20; + field_0xD54 = cM::rndInt(30) + 30; + + if (field_0xDA6 == 0) { + mTargetPos.x = getStartingPos().x + cM::rndFX(800); + mTargetPos.y = getStartingPos().y + cM::rndFX(400); + mTargetPos.z = getStartingPos().z + cM::rndFX(800); + } + + setPitchYawToPoint(mTargetPos); + mSpeed = 15.f; + field_0xC70 = 0.f; + field_0xDB7 = 0; + field_0xDBA = 0; + field_0xDC1 = 0; + field_0xD90 = 3; + field_0xDA5 = 0; + mSqueakSoundTimer = cM::rndInt(20) + 20; + unsetActorProperty(AC_PROP_0x1); + field_0xD82 = 0; + field_0xDA0 = 0; +} +void dAcEKs_c::executeState_ReturnToWait() { + if ((s32)getFromParams(30, 0x3) == 2) { + if (field_0xD82 > 1) { + field_0xD82 = 0; + if (!checkBeyondRadius(getStartingPos(), 490000.f)) { + setActorProperty(AC_PROP_0x1); + } + } else { + field_0xD82++; + } + } + fn_155_3720(mSpeed, cM::rndFX(0.1) + 1.f); + mMdl.play(); + playBlinkAnm(); + soundSqueak(); + if (field_0xD9A > 0) { + mSpeed = 0.f; + } else { + sLib::addCalcScaledDiff(&mSpeed, 15, 0.1, 0.1); + } + fn_155_1470(); +} +void dAcEKs_c::finalizeState_ReturnToWait() { + mAngle.y = mRotation.y; + field_0xDAD = 0; + field_0xDAE = 0; + field_0xD30 = 0; +} void dAcEKs_c::initializeState_WaitReady() {} void dAcEKs_c::executeState_WaitReady() {} From f65d59d315ff007b2cc9940be54cf0843f1ebcf7 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 16 May 2026 17:16:01 -0400 Subject: [PATCH 09/17] dAcEKs_c State WaitReady, Move, and Chase --- include/d/a/e/d_a_e_ks.h | 8 +- src/REL/d/a/e/d_a_e_ks.cpp | 228 +++++++++++++++++++++++++++++++++++-- 2 files changed, 227 insertions(+), 9 deletions(-) diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index 589ec6d8..73822fae 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -186,7 +186,8 @@ private: /* 0xC48 */ f32 field_0xC48; /* 0xC4C */ u8 _0xC4C[0xC70 - 0xC4C]; /* 0xC70 */ f32 field_0xC70; - /* 0xC74 */ u8 _0xC74[0xCE4 - 0xC74]; + /* 0xC74 */ u8 _0xC74[0xCE0 - 0xC74]; + /* 0xCE0 */ f32 field_0xCE0; /* 0xCE4 */ f32 field_0xCE4; /* 0xCE8 */ u8 _0xCE8[0xCF8 - 0xCE8]; /* 0xCF8 */ f32 field_0xCF8; @@ -213,7 +214,10 @@ private: /* 0xD50 */ s16 field_0xD50; /* 0xD52 */ s16 field_0xD52; /* 0xD54 */ s16 field_0xD54; - /* 0xD56 */ u8 _0xD56[0xD5E - 0xD56]; + /* 0xD56 */ s16 field_0xD56; + /* 0xD58 */ s16 field_0xD58; + /* 0xD5A */ s16 field_0xD5A; + /* 0xD5C */ s16 field_0xD5C; /* 0xD5E */ s16 field_0xD5E; /* 0xD60 */ s16 field_0xD60; /* 0xD62 */ s16 field_0xD62; diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index 5a4cd206..d6bca526 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -2101,16 +2101,230 @@ void dAcEKs_c::finalizeState_ReturnToWait() { field_0xD30 = 0; } -void dAcEKs_c::initializeState_WaitReady() {} -void dAcEKs_c::executeState_WaitReady() {} +void dAcEKs_c::initializeState_WaitReady() { + setAnim("turn_ed", 1, 1, 0); + setBlink(EKS_TEXPAT_BLINK1); + mBlinkTimer = cM::rndInt(75) + 15; + mAcchCir.SetWall(0, 5); + mSpeed = 0.f; + field_0xDA5 = 0; + field_0xD50 = 30; + mAcch.ClrRoofHit(); + mAcch.SetField_0xD4(0.f); + mAcch.SetGroundUpY(0.f); + field_0xDAD = 0; + field_0xDAE = 0; +} +void dAcEKs_c::executeState_WaitReady() { + mMdl.play(); + playBlinkAnm(); + if (field_0xD50 > 0) { + field_0xD50++; + } + sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0xAAB); + sLib::addCalcAngle(mRotation.y.ref(), field_0xD8A, 12, 0xAAB); + sLib::addCalcAngle(mAngle.y.ref(), field_0xD8A, 12, 0xAAB); + + sLib::addCalcScaledDiff(&mPosition.x, getStartingPos().x, 0.1, 3); + sLib::addCalcScaledDiff(&mPosition.z, getStartingPos().z, 0.1, 3); + if (sLib::chase(&mPosition.y, getStartingPos().y, 6) || mAcch.ChkRoofHit()) { + if (field_0xD50 <= 0) { + changeState(StateID_Wait); + mCurrentState = EKS_STATE_Wait; + } + } +} void dAcEKs_c::finalizeState_WaitReady() {} -void dAcEKs_c::initializeState_Move() {} -void dAcEKs_c::executeState_Move() {} -void dAcEKs_c::finalizeState_Move() {} +void dAcEKs_c::initializeState_Move() { + field_0xD30 = 1; + setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0); + if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) { + setBlink(EKS_TEXPAT_BLINK3); + } else { + setBlink(EKS_TEXPAT_BLINK1); + } -void dAcEKs_c::initializeState_Chase() {} -void dAcEKs_c::executeState_Chase() {} + mBlinkTimer = cM::rndInt(75) + 15; + field_0xD52 = cM::rndInt(20) + 20; + field_0xD54 = cM::rndInt(30) + 30; + + if (field_0xDA6 == 0) { + mTargetPos.x = getStartingPos().x + cM::rndFX(800); + mTargetPos.y = getStartingPos().y + cM::rndFX(400); + mTargetPos.z = getStartingPos().z + cM::rndFX(800); + } + + setPitchYawToPoint(mTargetPos); + mSpeed = field_0xCF8 + 15.f; + field_0xC70 = 0.f; + field_0xDB7 = 0; + field_0xDC1 = 0; + field_0xD90 = 3; + field_0xDA5 = 0; + mSqueakSoundTimer = cM::rndInt(20) + 20; + field_0xD82 = 0; +} +void dAcEKs_c::executeState_Move() { + if (field_0xD82 > 1) { + field_0xD82 = 0; + if (!checkBeyondRadius(getStartingPos(), 490000.f)) { + setActorProperty(AC_PROP_0x1); + } + } else { + field_0xD82++; + } + + fn_155_3720(mSpeed, cM::rndFX(0.2) + 1.f); + mMdl.play(); + playBlinkAnm(); + soundSqueak(); + if (field_0xD9A > 0) { + mSpeed = 0.f; + } else { + sLib::addCalcScaledDiff(&mSpeed, 15, 0.1, 0.1); + } + + if (std::abs(field_0xD00) > 0.01f) { + sLib::addCalcScaled(&field_0xD00, 0.1, 1); + } else { + field_0xD00 = 0.f; + } + if (std::abs(field_0xD04) > 0.01f) { + sLib::addCalcScaled(&field_0xD04, 0.1, 1); + } else { + field_0xD04 = 0.f; + } + fn_155_1C80(); +} +void dAcEKs_c::finalizeState_Move() { + field_0xD30 = 0; + field_0xCF8 = 0.f; + field_0xDC8 = 0; + field_0xD04 = 0.f; + field_0xD00 = 0.f; +} + +void dAcEKs_c::initializeState_Chase() { + setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0); + + if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) { + setBlink(EKS_TEXPAT_BLINK3); + } else { + setBlink(EKS_TEXPAT_BLINK1); + } + + mBlinkTimer = cM::rndInt(75) + 15; + field_0xD56 = 0; + field_0xD58 = cM::rndInt(20) + 20; + + field_0xD90 = 3; + field_0xDB7 = 0; + field_0xDB8 = 0; + field_0xDB9 = 0; + field_0xDA5 = 1; + + field_0xBC8.set(cM::rndFX(200), cM::rndF(100) + 100.f, cM::rndF(100) + 200.f); + fn_155_3BE0(field_0xBC8); + + setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC); + mAngle.y = mRotation.y; + mSpeed = 0.f; + field_0xCE0 = 0.f; + mSqueakSoundTimer = cM::rndInt(20) + 20; + unsetActorProperty(AC_PROP_0x1); +} +void dAcEKs_c::executeState_Chase() { + fn_155_3720(field_0xCE0, cM::rndFX(0.1) + 1.f); + mMdl.play(); + playBlinkAnm(); + soundSqueak(); + + dAcObjBase_c *pTarget = targetPlayerOrScrapper(0); + dAcPy_c *pPlayer = nullptr; + if (pTarget->isPlayer()) { + pPlayer = static_cast(pTarget); + } + mVec3_c targetPos = pTarget->mPosition; + s16 targetRot = pTarget->mRotation.y; + + if (pPlayer && !pPlayer->checkFlags0x340(0x100)) { + changeState(StateID_Fighting); + return; + } + + if (field_0xD56 > 0) { + field_0xD56--; + } + if (field_0xD90 > 0) { + field_0xD90--; + } + targetRot = cLib::targetAngleY(targetPos, mPosition) - targetRot; + if (field_0xD56 <= 0) { + field_0xD56 = cM::rndInt(10) + 10; + if (u16(targetRot + 0x3FFF) <= 0x7FFE) { + field_0xBC8.set(cM::rndFX(200), cM::rndF(200), -200 - cM::rndF(150)); + adjustTargetRoof(); + adjustTargetGnd(); + } else { + field_0xBC8.set(cM::rndFX(200), cM::rndF(200), cM::rndF(150) + 200.f); + adjustTargetRoof(); + adjustTargetGnd(); + } + fn_155_3BE0(field_0xBC8); + + if (mAcch.ChkGndHit() || mAcch.ChkWallHit(0) || mAcch.ChkRoofHit()) { + if (field_0xCE0 >= 50.f) { + field_0xCE0 = 50.f; + } + if (++field_0xDB8 < 2) { + field_0xDB8 = 0; + field_0xD56 = cM::rndInt(10) + 10; + mVec3_c v(cM::rndFX(150), cM::rndFX(150), 0); + fn_155_3BD0(v); + adjustTargetRoof(); + adjustTargetGnd(); + } + } + } + + setPitchYawToPoint(targetPos + field_0xBEC); + if (field_0xD9A > 0) { + field_0xCE0 = 0; + } else { + sLib::addCalcScaledDiff(&field_0xCE0, 30, 0.1, 1); + } + + cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xCE0); + sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 10, 0x71C); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x71C); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); + f32 r = field_0xC44 + 1600.f; + if (checkBeyondRadius(getStartingPos(), r * r)) { + setIdleState(); + } else { + if (field_0xD90 <= 0) { + if (!fn_155_2B80(true, 1)) { + setIdleState(); + return; + } + field_0xD90 = 3; + } + if (targetPos.squareDistanceToXZ(mPosition) < 90000.f) { + if (mTargetPos.squareDistanceToXZ(mPosition) < 90000.f) { + if (u16(targetRot + 0x3FFF) <= 0x7FFE) { + changeState(StateID_Fighting); + } else if (pPlayer && (pPlayer->checkCurrentAction(0x70) || pPlayer->checkActionFlags(0x20000))) { + changeState(StateID_Fighting); + } + } else if (--field_0xD58 <= 0) { + field_0xD58 = cM::rndInt(20) + 20; + changeState(StateID_ChaseAttack); + } + } + } +} void dAcEKs_c::finalizeState_Chase() {} void dAcEKs_c::initializeState_ChaseAttack() {} From 0b6f97ed73be491908b754ecfb2c231abc61d613 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 14:29:43 -0400 Subject: [PATCH 10/17] dAcEKs_c State ChaseAttack, Fighting, AttackReady, Attack, Damage, Stun, WindBlow and PathMove --- config/SOUE01/symbols.txt | 6 +- include/c/c_lib.h | 1 + include/d/a/e/d_a_e_ks.h | 8 +- include/d/a/e/d_a_en_base.h | 12 +- include/toBeSorted/d_path.h | 18 + src/REL/d/a/e/d_a_e_ks.cpp | 826 +++++++++++++++++++++++++++++++++++- src/toBeSorted/d_path.cpp | 16 + 7 files changed, 855 insertions(+), 32 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 64adb455..954befa5 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1178,7 +1178,7 @@ checkSlope__11dAcEnBase_cFRC7mVec3_cRsRsf = .text:0x80030030; // type:function s fn_800301b0__11dAcEnBase_cFRC7mVec3_c4mAngbf = .text:0x800301B0; // type:function size:0x1D4 fn_80030390 = .text:0x80030390; // type:function size:0x64 fn_80030400__11dAcEnBase_cFRQ23m3d5mdl_cUcbUc = .text:0x80030400; // type:function size:0x168 -fn_80030570 = .text:0x80030570; // type:function size:0x144 +fn_80030570__11dAcEnBase_cFRQ23m3d5mdl_cUcf = .text:0x80030570; // type:function size:0x144 fn_800306C0 = .text:0x800306C0; // type:function size:0x10 fn_800306D0__11dAcEnBase_cFv = .text:0x800306D0; // type:function size:0x24 fn_80030700__11dAcEnBase_cFv = .text:0x80030700; // type:function size:0x24 @@ -3718,7 +3718,7 @@ fn_800A9860 = .text:0x800A9860; // type:function size:0x50 getRemainingDistanceOnSegment__15ActorOnRail_ExtCFv = .text:0x800A98B0; // type:function size:0x58 getNextPointIndex__15ActorOnRail_ExtCFl = .text:0x800A9910; // type:function size:0x48 getNextPointIndex__15ActorOnRail_ExtCFv = .text:0x800A9960; // type:function size:0x8 -fn_800A9970 = .text:0x800A9970; // type:function size:0x58 +getNextPointIndex2__15ActorOnRail_ExtCFv = .text:0x800A9970; // type:function size:0x58 getClosestXZPoint__15ActorOnRail_ExtCFRC7mVec3_c = .text:0x800A99D0; // type:function size:0xE0 setSegment__15ActorOnRail_ExtFlf = .text:0x800A9AB0; // type:function size:0x50 checkPosInAREA = .text:0x800A9B00; // type:function size:0xC4 @@ -17268,7 +17268,7 @@ addCalcPos__4cLibFP7mVec3_cRC7mVec3_cfff = .text:0x802DFD90; // type:function si addCalcPosXZ__4cLibFP7mVec3_cRC7mVec3_cfff = .text:0x802DFFD0; // type:function size:0x1B8 addCalcPos2__4cLibFP7mVec3_cRC7mVec3_cff = .text:0x802E0190; // type:function size:0x13C cLib__addCalcPosXZ2 = .text:0x802E02D0; // type:function size:0xF8 -cLib__chasePos = .text:0x802E03D0; // type:function size:0x174 +chasePos__4cLibFR7mVec3_cR7mVec3_cf = .text:0x802E03D0; // type:function size:0x174 chasePosXZ__4cLibFR7mVec3_cR7mVec3_cf = .text:0x802E0550; // type:function size:0x124 targetAngleY__4cLibFRC7mVec3_cRC7mVec3_c = .text:0x802E0680; // type:function size:0x1C targetAngleX__4cLibFRC7mVec3_cRC7mVec3_c = .text:0x802E06A0; // type:function size:0x68 diff --git a/include/c/c_lib.h b/include/c/c_lib.h index be7b0d5e..c31d9bf9 100644 --- a/include/c/c_lib.h +++ b/include/c/c_lib.h @@ -12,6 +12,7 @@ s16 offsetPos(mVec3_c &target, const mVec3_c &v1, s16 angle, const mVec3_c &v2); void addCalcPos2(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep); f32 addCalcPosXZ(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep, f32 minStep); f32 addCalcPos(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep, f32 minStep); +bool chasePos(mVec3_c &, mVec3_c &, f32); bool chasePosXZ(mVec3_c &, mVec3_c &, f32); // made up name diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h index 73822fae..d63150e8 100644 --- a/include/d/a/e/d_a_e_ks.h +++ b/include/d/a/e/d_a_e_ks.h @@ -186,7 +186,9 @@ private: /* 0xC48 */ f32 field_0xC48; /* 0xC4C */ u8 _0xC4C[0xC70 - 0xC4C]; /* 0xC70 */ f32 field_0xC70; - /* 0xC74 */ u8 _0xC74[0xCE0 - 0xC74]; + /* 0xC74 */ u8 _0xC74[0xC90 - 0xC74]; + /* 0xC90 */ f32 field_0xC90; + /* 0xC94 */ u8 _0xC94[0xCE0 - 0xC94]; /* 0xCE0 */ f32 field_0xCE0; /* 0xCE4 */ f32 field_0xCE4; /* 0xCE8 */ u8 _0xCE8[0xCF8 - 0xCE8]; @@ -232,7 +234,7 @@ private: /* 0xD74 */ s16 field_0xD74; /* 0xD76 */ s16 field_0xD76; /* 0xD78 */ s16 mBlinkTimer; - /* 0xD7A */ s16 field_0xD7A; + /* 0xD7A */ u16 field_0xD7A; /* 0xD7C */ s16 field_0xD7C; /* 0xD7E */ s16 mSqueakSoundTimer; /* 0xD80 */ s16 mStunSoundTimer; @@ -252,7 +254,7 @@ private: /* 0xD9C */ s16 field_0xD9C; /* 0xD9E */ s16 field_0xD9E; /* 0xDA0 */ s16 field_0xDA0; - /* 0xDA2 */ u8 _0xDA2[0xDA4 - 0xDA2]; + /* 0xDA2 */ s16 field_0xDA2; /* 0xDA4 */ u8 field_0xDA4; /* 0xDA5 */ u8 field_0xDA5; /* 0xDA6 */ u8 field_0xDA6; diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index 3dc5d670..adbc1d0c 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -51,12 +51,14 @@ public: /* 0x33C */ u32 mInteractionFlags; /* 0x340 */ u16 field_0x338; /* 0x342 */ u16 mHealth; - /* 0x344 */ u8 _344[0x358 - 0x344]; + /* 0x344 */ u8 _0x344[0x346 - 0x344]; + /* 0x346 */ u8 field_0x346; + /* 0x347 */ u8 _0x347[0x358 - 0x347]; /* 0x358 */ mVec3_c mFinalBlowPosition; - /* 0x364 */ u8 _364[0x374 - 0x364]; + /* 0x364 */ u8 _0x364[0x374 - 0x364]; /* 0x374 */ dAcEnData *mpEnemyData; - bool checkInteractionFlags(u32 mask) { + bool checkInteractionFlags(u32 mask) const { return mInteractionFlags & mask; } void setInteractionFlags(u32 flag) { @@ -65,6 +67,9 @@ public: void resetInteractionFlags(u32 flag) { mInteractionFlags &= ~flag; } + void setFinalBlowPosition(const mVec3_c &v) { + mFinalBlowPosition = v; + } dAcBomb_c *getBombWithinRadius(f32 radius); // fn_8002f700 @@ -78,6 +83,7 @@ public: // 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); + bool fn_80030570(m3d::mdl_c &, u8, f32); // lighting related void fn_800306D0(); void fn_80030700(); dAcObjBase_c *targetPlayerOrScrapper(f32 biasToScrapper); diff --git a/include/toBeSorted/d_path.h b/include/toBeSorted/d_path.h index 56856008..6337f5b4 100644 --- a/include/toBeSorted/d_path.h +++ b/include/toBeSorted/d_path.h @@ -59,6 +59,11 @@ public: return mpPathPtr->pointCount; } + s32 getLastPointIdx() const { + s32 pnt = getNumPoints() - 1; + return pnt >= 0 ? pnt : 0; + } + bool initWithPathId(s32 pathId, s32 roomId, bool pathSubtype); bool initWithPathIndex(s32 pathIndex, s32 roomId, bool pathSubtype); @@ -138,10 +143,18 @@ public: mSpeed = speed; } + f32 getSpeed() const { + return mSpeed; + } + void getDirection(mVec3_c &result) { mPath.getDirection(mSegmentIndex, mSegmentTime, result); } + const Vec *getPoint(s32 idx) const { + return mPath.getPoint(idx); + } + bool checkFlag(u32 flags) const { return (mFlags & flags) != 0; } @@ -154,6 +167,11 @@ public: mFlags |= flags; } + const dPath_c &getPath() const { + return mPath; + } + s32 getNextPointIndex2() const; + private: s32 getNextPointIndex(s32 point) const; s32 getNextPointIndex() const; diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index d6bca526..df30c244 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -7,6 +7,7 @@ #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_pc.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_lin_chk.h" @@ -36,9 +37,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 "s/s_Math.h" #include "toBeSorted/attention.h" #include "toBeSorted/d_emitter.h" +#include "toBeSorted/d_path.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/time_area_mgr.h" @@ -827,7 +830,6 @@ void dAcEKs_c::fn_155_2270() { field_0xDC5--; } else { if (dAcPy_c::GetLink()->checkCurrentAction(/* SHIELD_BASH*/ 73)) { - ; mWorldMtx.multVecSR(mVec3_c(0, 0, -250), field_0xC1C); mTargetPos += field_0xC1C; field_0xDC5 = 20; @@ -2327,36 +2329,814 @@ void dAcEKs_c::executeState_Chase() { } void dAcEKs_c::finalizeState_Chase() {} -void dAcEKs_c::initializeState_ChaseAttack() {} -void dAcEKs_c::executeState_ChaseAttack() {} -void dAcEKs_c::finalizeState_ChaseAttack() {} +void dAcEKs_c::initializeState_ChaseAttack() { + setBlink(EKS_TEXPAT_BLINK2); + field_0xDA5 = 1; + fn_155_3BE0(mVec3_c(0, 100, 200)); + setPitchYawToPoint(mTargetPos); + field_0xD5A = 0; + field_0xDAB = 0; + startSound(SE_EKs_V_ATTACK); + field_0xD9C = cM::rndF(65536); + if (mType == EKS_ELECTRIC) { + fn_155_3E90(); + field_0xDA9 = 0; + field_0xD60 = 0; + } +} +void dAcEKs_c::executeState_ChaseAttack() { + mMdl.play(); + if (!mAnmTexPat.isStop(0)) { + mAnmTexPat.play(); + } + fn_155_3BE0(mVec3_c(0, 100, 200)); + adjustTargetGnd(); + setPitchYawToPoint(mTargetPos); + if (field_0xD9A > 0) { + field_0xCE0 = 0.f; + } else { + sLib::addCalcScaledDiff(&field_0xCE0, 30, 0.1, 1); + } + cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xCE0); + sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 10, 0x71C); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x71C); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); + field_0xD5A++; + if (field_0xDAB != 0) { + changeState(StateID_Chase); + } else if (field_0xD5A > 8) { + mSph.OnAtSet(); + field_0xDAB = 1; + } +} +void dAcEKs_c::finalizeState_ChaseAttack() { + mSph.ClrAtSet(); + field_0xDAB = 1; + if (mType == EKS_ELECTRIC) { + fn_155_3EC0(); + field_0xDA9 = 1; + } +} -void dAcEKs_c::initializeState_Fighting() {} -void dAcEKs_c::executeState_Fighting() {} +void dAcEKs_c::initializeState_Fighting() { + setAnim("hovering", 1, cM::rndFX(0.2) + 1.f, 0); + if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) { + setBlink(EKS_TEXPAT_BLINK3); + field_0xD7A = 0; + } else { + setBlink(EKS_TEXPAT_BLINK1); + field_0xD7A = 17; + } + mBlinkTimer = cM::rndInt(75) + 15; + mSpeed = 0.f; + field_0xC70 = 0.f; + field_0xD6A = cM::rndInt(30) + 15; + if (field_0xDA6 == 0) { + field_0xBC8.set(cM::rndFX(250), cM::rndF(150) + 100.f, cM::rndF(120) + 150.f); + } + adjustTargetGnd(); + adjustTargetRoof(); + fn_155_3BE0(field_0xBC8); + + setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC); + fn_155_1430(); + field_0xDA5 = 1; + field_0xD90 = 3; + field_0xDC5 = 0; + mSqueakSoundTimer = cM::rndInt(20) + 20; + unsetActorProperty(AC_PROP_0x1); + if (dBgS_WtrChk::CheckPos(&mPosition, true, 100, -2000)) { + field_0xD10 = dBgS_WtrChk::GetWaterHeight(); + field_0xDB3 = 1; + } +} +void dAcEKs_c::executeState_Fighting() { + fn_155_3720(field_0xC70, cM::rndFX(0.1) + 1.f); + mMdl.play(); + if (field_0xD7A < (s16)17) { + field_0xD7A++; + } else if (field_0xDA6 != 0) { + if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) { + mAnmTexPat.play(); + } else { + playBlinkAnm(); + } + } else { + playBlinkAnm(); + } + soundSqueak(); + fn_155_2270(); +} void dAcEKs_c::finalizeState_Fighting() {} -void dAcEKs_c::initializeState_AttackReady() {} -void dAcEKs_c::executeState_AttackReady() {} -void dAcEKs_c::finalizeState_AttackReady() {} +void dAcEKs_c::initializeState_AttackReady() { + setBlink(EKS_TEXPAT_BLINK2); + mVec3_c v(0, 150, 200); + v += field_0xBC8; + fn_155_3BE0(v); -void dAcEKs_c::initializeState_Attack() {} -void dAcEKs_c::executeState_Attack() {} -void dAcEKs_c::finalizeState_Attack() {} + dAcObjBase_c *pTarget = AttentionManager::GetInstance()->getTargetedActor(); + if (pTarget != this) { + const f32 y = (targetPlayerOrScrapper(0)->mPosition.y + 100.f); + if (field_0xBBC.y > y + 200.f) { + field_0xBBC.y = y + 200.f; + } + } + if (dBgS_ObjLinChk::LineCross(&mPosition, &field_0xBBC, nullptr)) { + field_0xBBC = dBgS_ObjLinChk::GetInstance().GetLinEnd(); + } + mSpeed = 0.f; + field_0xD72 = cM::rndInt(15) + 15; + field_0xC90 = 100.f; + field_0xDA5 = 1; + fn_155_3720(0, 0.7); + if (mType == EKS_ELECTRIC) { + fn_155_3E90(); + field_0xDA9 = 0; + field_0xD60 = 0; + } +} +void dAcEKs_c::executeState_AttackReady() { + f32 f = 10.f; + mMdl.play(); + if (!mAnmTexPat.isStop(0)) { + mAnmTexPat.play(); + } -void dAcEKs_c::initializeState_Damage() {} -void dAcEKs_c::executeState_Damage() {} -void dAcEKs_c::finalizeState_Damage() {} + if (dAcPy_c::GetLink()->isRecovering() || !dAcPy_c::GetLink()->checkFlags0x340(0x100) || + (EventManager::isInEvent() && !EventManager::isInEvent0Or7())) { + if (mType == EKS_ELECTRIC) { + fn_155_3EC0(); + field_0xDA9 = 1; + } + changeState(StateID_Fighting); + return; + } + if (fn_155_3EF0()) { + if (mType == EKS_ELECTRIC) { + fn_155_3EC0(); + field_0xDA9 = 1; + } + changeState(StateID_Fighting); + return; + } + setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC); + sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 0xc, 0x1555); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 0xc, 0x1555); + sLib::addCalcAngle(mRotation.x.ref(), 0, 0xc, 0x1555); + if (field_0xD9A <= 0) { + sLib::addCalcScaled(&field_0xC90, 0.8, 6.5); + cLib::addCalcPos2(&mPosition, field_0xBBC, 0.1, field_0xC90); + if (std::abs(field_0xC90) < 0.01f) { + fn_155_3720(f, 1.3); + if (--field_0xD72 <= 0) { + changeState(StateID_Attack); + } + } else { + fn_155_3720(0, 0.7); + } + } +} +void dAcEKs_c::finalizeState_AttackReady() { + fn_155_3480(); +} -void dAcEKs_c::initializeState_Stun() {} -void dAcEKs_c::executeState_Stun() {} -void dAcEKs_c::finalizeState_Stun() {} +void dAcEKs_c::initializeState_Attack() { + setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0); + setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC); + fn_155_3BE0(mVec3_c(0, 0, -50)); -void dAcEKs_c::initializeState_WindBlow() {} -void dAcEKs_c::executeState_WindBlow() {} -void dAcEKs_c::finalizeState_WindBlow() {} + /* TODO Probably an inline, but I have no clue what to call it */ + bool b = dAcPy_c::GetLink()->checkActionFlags(0x40000) != 0 && dAcPy_c::GetLink()->checkFlags0x340(0x100); + if (b) { + field_0xBBC.set(dAcPy_c::GetLink()->getHeadTranslation()); + } -void dAcEKs_c::initializeState_PathMove() {} -void dAcEKs_c::executeState_PathMove() {} + field_0xD74 = 15; + field_0xDA5 = 1; + mRotation.x = 0; + startSound(SE_EKs_V_ATTACK); + mSph.OnAtSet(); + mSph.setCenter(mPosition); + if (mType == EKS_ELECTRIC) { + fn_155_3E90(); + field_0xDA9 = 0; + field_0xD60 = 0; + } + field_0xDA2 = 0; +} +void dAcEKs_c::executeState_Attack() { + f32 scale = 25.f; + if (field_0xD9A > 0) { + scale = 0.f; + } + fn_155_3720(scale, cM::rndFX(0.1) + 1.f); + mMdl.play(); + if (!mAnmTexPat.isStop(0)) { + mAnmTexPat.play(); + } + if (dAcPy_c::GetLink()->isRecovering() || !dAcPy_c::GetLink()->checkFlags0x340(0x100) || + (EventManager::isInEvent() && !EventManager::isInEvent0Or7())) { + changeState(StateID_Fighting); + return; + } + if (fn_155_3EF0()) { + changeState(StateID_Fighting); + return; + } + + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0x38E); + if (mSph.ChkAtHit()) { + if (mSph.GetAtFlag0x8() != 0) { + changeState(StateID_Stun); + return; + } + + if (mSph.GetAtActor()->isPlayer()) { + changeState(StateID_Fighting); + return; + } + } + + if (cLib::chasePos(mPosition, field_0xBBC, scale)) { + changeState(StateID_Fighting); + return; + } + + if (ChkHit() && --field_0xD74 <= 0) { + changeState(StateID_Fighting); + return; + } + + if (++field_0xDA2 > 90) { + changeState(StateID_Fighting); + return; + } + + mSph.OnAtSet(); + mSph.moveCenter(mPosition); +} +void dAcEKs_c::finalizeState_Attack() { + mSph.ClrAtSet(); + if (mType == EKS_ELECTRIC) { + fn_155_3EC0(); + field_0xDA9 = 1; + } + field_0xD60 = 40; +} + +void dAcEKs_c::initializeState_Damage() { + if (mHealth == 0) { + setAnim("dead", 4, 1, 0); + mAngle.y = field_0xD96; + mAngle.x = field_0xD98; + } else { + setAnim("hura2", 4, 1, 0); + } + + if (mType == EKS_FIRE) { + field_0xD20 = 0.f; + field_0xD24 = 1.f; + field_0xD28 = mLightInfluence.mScale / (field_0xD5E * 2.f); + } else if (mType == EKS_ELECTRIC) { + field_0xD20 = 0.f; + field_0xD24 = 1.f; + field_0xD28 = mLightInfluence.mScale / (field_0xD5E * 2.f); + } + field_0xDB5 = 1; + field_0x346 = 1; // Part of dAcEnBase_c +} +void dAcEKs_c::executeState_Damage() { + mMdl.play(); + if (mHealth == 0) { + if (field_0xD9A > 0) { + mSpeed = 0; + } + + mRotation.x += field_0xD92; + mRotation.y += field_0xD94; + + if (field_0xD60 > 0) { + field_0xD5E = 0; + field_0xDA9 = 1; + } + if (field_0xD5E > 0) { + field_0xD5E--; + } else { + field_0xDA9 = 1; + } + + if (mAcch.ChkGroundLanding() && field_0xDB5 != 0) { + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0); + field_0xDB5 = 0; + } + + if (mAcch.ChkGndHit() || mAcch.ChkWallHit(nullptr)) { + field_0xDA9 = 1; + if (dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()) == POLY_ATTR_LAVA) { + kill(false); + } else { + kill(true); + } + } else if (mAcch.ChkWaterIn()) { + field_0xDA9 = 1; + kill(false); + } else if (!sLib::calcTimer(&field_0xDBE)) { + field_0xDA9 = 1; + kill(false); + } + + return; + } + + if (std::abs(mSpeed) > 0.01f) { + sLib::addCalcScaled(&mSpeed, 1, 5); + } else { + mSpeed = 0.f; + } + + if (std::abs(mVelocity.y) > 0.01f) { + sLib::addCalcScaled(&mVelocity.y, 1, 5); + } else { + mVelocity.y = 0.f; + } + + if (field_0xDC6 != 0) { + field_0xDC6--; + } else { + field_0x346 = 0; // Part of dAcEnBase_c + changeState(StateID_Fighting); + } +} +void dAcEKs_c::finalizeState_Damage() { + mAngle.x = mRotation.x; + mAngle.y = mRotation.y; + field_0xDBF = 0; +} +void dAcEKs_c::initializeState_Stun() { + setAnim("chance", 1, 1, 0); + setBlink(EKS_TEXPAT_BLINK1); + field_0xD76 = 150; + field_0xDA5 = 0; + mAngle.y = cLib::targetAngleY(dAcPy_c::GetLink()->mPosition, mPosition); + mSpeed = 30.f; + mAcceleration = -2.5f; + field_0xD5C = 5; + mStunSoundTimer = cM::rndInt(20) + 20; + mAcch.SetGroundUpY(0); + field_0xC10.y = 20.f; + field_0xDCC = 0; + if (mType == EKS_FIRE) { + mSph.ClrCo_0x8000(); + } else if (mType == EKS_ELECTRIC) { + fn_155_3EC0(); + } + + unsetActorProperty(AC_PROP_0x1); + + if (mType == EKS_FIRE) { + field_0xD20 = 0.f; + field_0xD24 = 1.f; + field_0xD28 = mLightInfluence.mScale / (field_0xD5C * 2.f); + } else if (mType == EKS_ELECTRIC) { + field_0xD20 = 0.f; + field_0xD24 = 1.f; + field_0xD28 = mLightInfluence.mScale / (field_0xD5C * 2.f); + } + field_0xDB5 = 1; + startSound(SE_EKs_V_DAMAGE); + field_0x346 = 1; // Part of dAcEnBase_c +} +void dAcEKs_c::executeState_Stun() { + setFinalBlowPosition(mPosition); + switch (field_0xDCC) { + case 0: { + mMdl.play(); + soundStun(); + sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555); + if (field_0xD5C > 0) { + field_0xD5C--; + } else { + field_0xDA9 = 1; + } + if (mAcch.ChkGndHit()) { + if (field_0xDB5 != 0) { + dJEffManager_c::spawnGroundEffect( + mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0 + ); + field_0xDB5 = 0; + } + field_0xD5C = 0; + field_0xDA9 = 1; + if (dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()) == POLY_ATTR_LAVA) { + dJEffManager_c::spawnGroundEffect( + mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0 + ); + resetInteractionFlags(0x1); + startSound(SE_EKs_V_DEATH2); + unsetActorProperty(AC_PROP_0x1); + kill(false); + return; + } + if (std::abs(mSpeed) > 0.01f) { + sLib::addCalcScaled(&mSpeed, 1, 10); + } else { + mSpeed = 0.f; + setInteractionFlags(0x1); + } + + mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx); + mCenterWorldMtx.getTranslation(field_0xBA4); + field_0xBA4.y += 50.f; + + mEmitter2.holdEffect( + PARTICLE_RESOURCE_ID_MAPPING_309_, field_0xBA4, nullptr, &mScale, nullptr, nullptr + ); + mEmitter2.setGlobalAlpha(dStageMgr_c::GetInstance()->getGlobalAlpha()); + holdSound(SE_E_PIYORI_LV); + } + if (mAcch.ChkWaterIn()) { + resetInteractionFlags(0x1); + startSound(SE_EKs_V_DEATH2); + unsetActorProperty(AC_PROP_0x1); + kill(false); + } else { + if (!dAcPy_c::GetLink()->checkCurrentAction(/* FINAL_BLOW */ 96)) { + field_0xD76--; + mSph.OnCoSet(); + } else { + mSph.ClrCoSet(); + } + if (checkInteractionFlags(0x1000)) { + mSph.ClrCoSet(); + field_0xDCC = 1; + mHealth = 0; + } else { + if (field_0xD76 <= 0) { + resetInteractionFlags(0x1); + mAcch.SetGroundUpY(30); + mAngle.y = mRotation.y; + if (mType == EKS_ELECTRIC) { + field_0xDA9 = 1; + } else { + field_0xDA9 = 0; + } + changeState(StateID_Fighting); + } + } + } + } break; + case 1: { + mSph.ClrTgSet(); + mMdl.play(); + field_0xDCC = 2; + mMdl.setRate(0.5f); + startSound(SE_EKs_V_DEATH2); + field_0xDCD = 5; + field_0xD0C = 1.f; + setAnim("Deliver", 4, 1, 0); + mHealth = 0; + resetInteractionFlags(0x1); + } break; + case 2: { + bool b = false; + if (field_0xDCD != 0) { + field_0xDCD--; + } else { + b = fn_80030570(mMdl.getModel(), 1, 1); + } + mMdl.play(); + if (mMdl.getAnm().isStop() && b) { + kill(true); + } + } break; + } +} +void dAcEKs_c::finalizeState_Stun() { + field_0xC10.y = 0.f; + mAcceleration = 0.f; + mSph.OnCoSet(); + resetInteractionFlags(0x1); + if (mType == EKS_FIRE) { + mSph.SetCo_0x8000(); + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + } else if (mType == EKS_ELECTRIC) { + field_0xD60 = 0; + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + } + field_0x346 = 0; // Part of dAcEnBase_c +} + +void dAcEKs_c::initializeState_WindBlow() { + setAnim("hura2", 1, 1, 0); + field_0xD86 = cM::rndInt(30) + 120; + field_0xDA9 = 1; + + if (mType == EKS_FIRE) { + mSph.ClrCo_0x8000(); + field_0xD20 = 0.f; + mLightInfluence.SetScale(0); + } else if (mType == EKS_ELECTRIC) { + fn_155_3EC0(); + field_0xD20 = 0.f; + mLightInfluence.SetScale(0); + } + mAcceleration = -0.5f; + mAcch.ClrRoofNone(); + mAcchCir.SetWall(20, 60); + mAcch.SetField_0xD4(55); + mAcch.SetGroundUpY(30); +} +void dAcEKs_c::executeState_WindBlow() { + s32 _weird_zero = 0; + + mMdl.play(); + + if (field_0xD9A > 0) { + mSpeed = 0.f; + } + + if (mAcch.ChkGroundLanding() && dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()) == POLY_ATTR_LAVA) { + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0); + startSound(SE_EKs_V_DEATH2); + unsetActorProperty(AC_PROP_0x1); + kill(false); + return; + } + + if (mAcch.ChkWaterIn()) { + startSound(SE_EKs_V_DEATH2); + unsetActorProperty(AC_PROP_0x1); + kill(false); + return; + } + + if (nw4r::math::FAbs(mSpeed) < 1.0f) { + if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BELLOWS) && mSph.GetTgDamageFlags() == 0x8) { + mAngle.y = cLib::targetAngleY(dAcPy_c::GetLink()->mPosition, mPosition); + mAngle.x = cLib::targetAngleX(dAcPy_c::GetLink()->mPosition, mPosition); + s32 t = 7281; + field_0xD66 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.75f + (0.01f * _weird_zero))) * t; + field_0xD68 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.65f + (0.01f * _weird_zero))) * t; + + if (field_0xD66 < 0) { + field_0xD64 = -0x38E; + } else { + field_0xD64 = 0x38E; + } + + if (mAngle.x > 0xAAB) { + mVelocity.y = 15.f; + } else if (mAngle.x < -0xAAB) { + mVelocity.y = -15.f; + } + + if (field_0xD9A > 0) { + mSpeed = 0.f; + } else { + mSpeed = 35.f; + } + } + } + + if (std::abs(mSpeed) > 0.01f) { + sLib::addCalcScaled(&mSpeed, 0.3, 1.5); + mRotation.x += field_0xD66; + mRotation.y += field_0xD68; + } else { + mSpeed = 0.f; + if (mRotation.x.abs() < 0x444) { + mRotation.x = 0; + } else { + mRotation.x += field_0xD64; + } + } + + sLib::addCalcAngle(&field_0xD66, 0, 16, 0x16C); + sLib::addCalcAngle(&field_0xD68, 0, 16, 0x16C); + + f32 add = 0.1f * _weird_zero; + if (std::abs(mVelocity.y) > 0.01f + add) { + sLib::addCalcScaled(&mVelocity.y, 0.3, 1.5); + } else { + mVelocity.y = -(0.1f * _weird_zero); + } + + if (field_0xD86 > 0) { + field_0xD86--; + } else if (field_0xDA6) { + if (transitionToNextState()) { + return; + } + } else { + changeState(StateID_Fighting); + } +} +void dAcEKs_c::finalizeState_WindBlow() { + mSpeed = 0.f; + mAcceleration = 0.f; + mVelocity.y = 0.f; + mRotation.x = 0; + mAngle.set(mRotation); + field_0xDA9 = 0; + if (mType == EKS_FIRE) { + mSph.SetCo_0x8000(); + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + } else if (mType == EKS_ELECTRIC) { + field_0xDA9 = 1; + field_0xD20 = 400.f; + field_0xD24 = 1.f; + field_0xD28 = 40.f; + } +} + +void dAcEKs_c::initializeState_PathMove() { + field_0xD30 = 1; + setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0); + + if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) { + setBlink(EKS_TEXPAT_BLINK3); + } else { + setBlink(EKS_TEXPAT_BLINK1); + } + mBlinkTimer = cM::rndInt(75) + 15; + mSpeed = 15.f; + if (field_0xDA6 != 0) { + field_0xDC9 = 3; + } else { + if (mRail.getSpeed() >= 0.f) { + mRail.setSpeed(15.f); + } else { + mRail.setSpeed(-15.f); + } + mTargetPos.set(mRail.getPosition()); + field_0xDC9 = 0; + } + setPitchYawToPoint(mTargetPos); + field_0xD54 = cM::rndInt(30) + 30; + field_0xD90 = 3; + field_0xDA5 = 0; + field_0xDB1 = 0; + + if (field_0xDA6 != 0) { + fn_155_3E30(); + } else { + setActorProperty(AC_PROP_0x1); + } + + mSqueakSoundTimer = cM::rndInt(20) + 20; + field_0xDB7 = 0; + field_0xDC1 = 0; + field_0xD52 = cM::rndInt(20) + 20; +} +void dAcEKs_c::executeState_PathMove() { + mMdl.play(); + playBlinkAnm(); + soundSqueak(); + + if (field_0xD54 > 0) { + field_0xD54--; + } + if (field_0xD90 > 0) { + field_0xD90--; + } + + if (field_0xDA6 != 0) { + if (transitionToNextState()) { + if (mNextState == EKS_STATE_ReturnToWait) { + f32 y = getLineCrossYRange(mStartingPos, 300); + mStartingPos.set(mStartingPos.x + cM::rndFX(100), y, mStartingPos.z + cM::rndFX(100)); + } + return; + } + } else { + if (field_0xDC9 == 3) { + field_0xDC9 = 0; + setActorProperty(AC_PROP_0x1); + mRail.setSegment(mRail.getClosestXZPoint(mPosition), 0.f); + setStartingPosition(mRail.getPosition()); + mPnts[0].set(mRail.getPosition()); + mRail.setSpeed(15); + } + + if (!checkBeyondRadius(getStartingPos(), 490000.f)) { + field_0xDC9 = 0; + setStartingPosition(mRail.getPosition()); + mPnts[0].set(mRail.getPosition()); + + if (field_0xD54 <= 0 && field_0xD90 <= 0) { + if (fn_155_2B80(true, 0)) { + changeState(StateID_Chase); + return; + } + field_0xD90 = 3; + } + u8 railStatus = mRail.execute(); + if (railStatus != 0 && (railStatus != 3 || mRail.getSpeed() > 0.f)) { + s32 idx; + if (mRail.getSpeed() > 0.f) { + idx = mRail.getSegmentIndex(); + } else if (mRail.getSpeed() < 0.f) { + idx = mRail.getNextPointIndex2(); + } + field_0xDCA = mRail.getPath().getPointParam(idx, 0); + if (checkPathPntParam(field_0xDCA)) { + setStartingPosition(*(const mVec3_c *)mRail.getPath().getPoint(idx)); + mStartingPos.y = getLineCrossYRange(getStartingPosition(), 300); + changeState(StateID_ReturnToWait); + return; + } + } + } else if (field_0xDC9 == 0) { + field_0xDC9 = 1; + } + if (field_0xDC9 == 1) { + field_0xDC9 = 2; + mVec3_c pnt; + const s32 pntIdx = mRail.getClosestXZPoint(mPosition); + const Vec *pPnt = mRail.getPoint(pntIdx); + pnt.copyFrom(pPnt); + if (mRail.getPosition().squareDistanceToXZ(mPosition) > pnt.squareDistanceToXZ(mPosition)) { + mRail.setSegment(pntIdx, 0.f); + setStartingPosition(mRail.getPosition()); + mPnts[0].set(mRail.getPosition()); + } + } + if (field_0xDC9 == 2) { + if (field_0xD52 > 0) { + field_0xD52--; + } + field_0xB8C.set(mPnts[field_0xD9E]); + f32 dist = mPosition.squareDistance(field_0xB8C); + if (checkWallCross()) { + field_0xDB7++; + + if (field_0xDB7 < 5) { + field_0xDC1 = 0; + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndF(400); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + adjustTargetGnd(); + adjustTargetRoof(); + } else if (field_0xDB7 < 10) { + field_0xDC1 = 1; + + fn_155_3BD0(mVec3_c(cM::rndFX(200), cM::rndFX(200), cM::rndF(-300))); + field_0xD52 = cM::rndInt(20) + 20; + + adjustTargetGnd(); + adjustTargetRoof(); + } else if (field_0xDB7 > 20) { + field_0xDB7 = 0; + } + } + if (field_0xD52 <= 0) { + if (field_0xD9E > 0) { + mVec3_c startPos = mPosition; + for (s32 i = 0; i <= field_0xD9E; ++i) { + if (!dBgS_ObjLinChk::LineCross(&startPos, &mPnts[i], nullptr)) { + field_0xD9E = i; + field_0xB8C.set(mPnts[field_0xD9E]); + } + } + } + field_0xDC1 = 0; + field_0xD52 = cM::rndInt(20) + 20; + mTargetPos.x = field_0xB8C.x + cM::rndFX(800); + mTargetPos.y = field_0xB8C.y + cM::rndFX(400); + mTargetPos.z = field_0xB8C.z + cM::rndFX(800); + adjustTargetGnd(); + adjustTargetRoof(); + } + + chaseTargetY(0.1, 3); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); + if (field_0xD9E != 0 && dist < 2500.f) { + field_0xD9E--; + } + + if (field_0xD9E == 0 && !checkBeyondRadius(getStartingPos(), 490000)) { + field_0xDC9 = 0; + } + } else { + mTargetPos.set(mRail.getPosition()); + } + } + setPitchYawToPoint(mTargetPos); + chaseTargetY(0.5, 4); + sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E); + sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6); + clampRotationX(); +} void dAcEKs_c::finalizeState_PathMove() { field_0xD30 = 0; } diff --git a/src/toBeSorted/d_path.cpp b/src/toBeSorted/d_path.cpp index 43b2b896..6a539796 100644 --- a/src/toBeSorted/d_path.cpp +++ b/src/toBeSorted/d_path.cpp @@ -589,6 +589,22 @@ s32 ActorOnRail_Ext::getNextPointIndex() const { return getNextPointIndex(mSegmentIndex); } +s32 ActorOnRail_Ext::getNextPointIndex2() const { + if (mSpeed >= 0.0f) { + return mSegmentIndex; + } + + if (mSegmentIndex + 1 < mPath.getNumPoints()) { + return mSegmentIndex + 1; + } + + if (mPath.isWrapping()) { + return 0; + } + + return mPath.getLastPointIdx(); +} + s32 ActorOnRail_Ext::getClosestXZPoint(const mVec3_c &pos) const { f32 max = EGG::Math::maxNumber(); s32 best = 0; From c15f7fb519b46f64f0de51063b2adb270f730b10 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 14:36:00 -0400 Subject: [PATCH 11/17] fixup: dAcEKs_c::executeState_WindBlow --- src/REL/d/a/e/d_a_e_ks.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index df30c244..c9f1ca83 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -2920,11 +2920,10 @@ void dAcEKs_c::executeState_WindBlow() { sLib::addCalcAngle(&field_0xD66, 0, 16, 0x16C); sLib::addCalcAngle(&field_0xD68, 0, 16, 0x16C); - f32 add = 0.1f * _weird_zero; - if (std::abs(mVelocity.y) > 0.01f + add) { + if (std::abs(mVelocity.y) > 0.01f + (_weird_zero * 0.1f)) { sLib::addCalcScaled(&mVelocity.y, 0.3, 1.5); } else { - mVelocity.y = -(0.1f * _weird_zero); + mVelocity.y = -(_weird_zero * 0.1f); } if (field_0xD86 > 0) { From 45cc86893d40285ef48d7da8107ce9f8011c68f4 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 15:02:22 -0400 Subject: [PATCH 12/17] ActorOnRail_Ext getPoint Inline return type change to mVec3_c* instead of Vec* --- include/toBeSorted/d_path.h | 4 ++-- src/REL/d/a/e/d_a_e_ks.cpp | 8 ++++---- src/toBeSorted/d_path.cpp | 3 +-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/include/toBeSorted/d_path.h b/include/toBeSorted/d_path.h index 6337f5b4..9f4e7fbb 100644 --- a/include/toBeSorted/d_path.h +++ b/include/toBeSorted/d_path.h @@ -151,8 +151,8 @@ public: mPath.getDirection(mSegmentIndex, mSegmentTime, result); } - const Vec *getPoint(s32 idx) const { - return mPath.getPoint(idx); + const mVec3_c *getPoint(s32 idx) const { + return reinterpret_cast(mPath.getPoint(idx)); } bool checkFlag(u32 flags) const { diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index c9f1ca83..8a1d8f36 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -3047,7 +3047,7 @@ void dAcEKs_c::executeState_PathMove() { } field_0xDCA = mRail.getPath().getPointParam(idx, 0); if (checkPathPntParam(field_0xDCA)) { - setStartingPosition(*(const mVec3_c *)mRail.getPath().getPoint(idx)); + setStartingPosition(*mRail.getPoint(idx)); mStartingPos.y = getLineCrossYRange(getStartingPosition(), 300); changeState(StateID_ReturnToWait); return; @@ -3058,10 +3058,10 @@ void dAcEKs_c::executeState_PathMove() { } if (field_0xDC9 == 1) { field_0xDC9 = 2; - mVec3_c pnt; const s32 pntIdx = mRail.getClosestXZPoint(mPosition); - const Vec *pPnt = mRail.getPoint(pntIdx); - pnt.copyFrom(pPnt); + + mVec3_c pnt = *mRail.getPoint(pntIdx); + if (mRail.getPosition().squareDistanceToXZ(mPosition) > pnt.squareDistanceToXZ(mPosition)) { mRail.setSegment(pntIdx, 0.f); setStartingPosition(mRail.getPosition()); diff --git a/src/toBeSorted/d_path.cpp b/src/toBeSorted/d_path.cpp index 6a539796..0003a739 100644 --- a/src/toBeSorted/d_path.cpp +++ b/src/toBeSorted/d_path.cpp @@ -610,8 +610,7 @@ s32 ActorOnRail_Ext::getClosestXZPoint(const mVec3_c &pos) const { s32 best = 0; mVec3_c c; for (s32 i = 0; i < mPath.getNumPoints(); i++) { - const Vec *point = mPath.getPoint(i); - c = *reinterpret_cast(point) - pos; + c = *getPoint(i) - pos; f32 dist = c.squareMagXZ(); if (max > dist) { best = i; From 6cea9c566ba392b5840738acf471a4ef4f980f33 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 15:06:07 -0400 Subject: [PATCH 13/17] ActorOnRail_Ext remove duplicate set of flag inlines, conform to check/set/unset --- include/toBeSorted/d_path.h | 16 ++-------------- src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp | 20 ++++++++------------ src/toBeSorted/d_path.cpp | 4 ++-- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/include/toBeSorted/d_path.h b/include/toBeSorted/d_path.h index 9f4e7fbb..1208c191 100644 --- a/include/toBeSorted/d_path.h +++ b/include/toBeSorted/d_path.h @@ -123,18 +123,6 @@ public: return mSegmentTime; } - bool CheckFlag(u32 flag) const { - return (mFlags & flag) != 0; - } - - void ClearFlag(u32 flag) { - mFlags &= ~flag; - } - - void SetFlag(u32 flag) { - mFlags |= flag; - } - const mVec3_c &getPosition() const { return mPosition; } @@ -159,11 +147,11 @@ public: return (mFlags & flags) != 0; } - void offFlag(u32 flags) { + void unsetFlag(u32 flags) { mFlags &= ~flags; } - void onFlag(u32 flags) { + void setFlag(u32 flags) { mFlags |= flags; } diff --git a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp index fdece84a..b82aef58 100644 --- a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp +++ b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp @@ -285,10 +285,10 @@ void dAcODungeonShip_c::executeState_Transparency() { if (isWithinDist1 && field_0x868 == 0 && field_0x862 == 0 && tmp2) { if (field_0x856 > 0) { field_0x856 = 0xFF; - mPath.SetFlag(0x40000000); + mPath.setFlag(0x40000000); } else { field_0x856 = 1; - mPath.ClearFlag(0x40000000); + mPath.unsetFlag(0x40000000); } u16 idx = fn_485_1900(); @@ -302,7 +302,7 @@ void dAcODungeonShip_c::executeState_Transparency() { field_0x858 = 50.0f; } - if (mPath.CheckFlag(0x40000000) && field_0x858 > 0.0f) { + if (mPath.checkFlag(0x40000000) && field_0x858 > 0.0f) { field_0x858 *= -1; } } @@ -433,26 +433,22 @@ void dAcODungeonShip_c::fn_485_1660() { } } -static u32 rot_7fff = 0x7FFF; -static u32 rot_4000 = 0x4000; - void dAcODungeonShip_c::fn_485_1720() { mPath.setSpeed(mSpeed); mPath.execute(); - // TODO mPosition = mPath.getPosition(); mVec3_c tmp; mPath.getDirection(tmp); mRotation.y = cM::atan2s(tmp.x, tmp.z); - if (mPath.CheckFlag(0x40000000)) { - mRotation.y += rot_7fff; + if (mPath.checkFlag(0x40000000)) { + mRotation.y += 0x7FFF; } - mRotation.y += rot_4000; + mRotation.y += 0x4000; mAngle.y = mRotation.y; int factor = 0x12C; - f32 tmp2 = nw4r::math::SinIdx((field_0x850 * 800)); + f32 tmp2 = nw4r::math::SinIdx(field_0x850 * 800); tmp2 *= factor; field_0x84C = tmp2; } @@ -460,7 +456,7 @@ void dAcODungeonShip_c::fn_485_1720() { bool dAcODungeonShip_c::fn_485_1830(s32 pathSegmentIndex, s32 direction, s32 *out) {} u16 dAcODungeonShip_c::fn_485_1900() { - s32 sign = mPath.CheckFlag(0x40000000) ? -1 : 1; + s32 sign = mPath.checkFlag(0x40000000) ? -1 : 1; s32 result; if (fn_485_1830(mPath.getSegmentIndex(), sign, &result)) { return result; diff --git a/src/toBeSorted/d_path.cpp b/src/toBeSorted/d_path.cpp index 0003a739..d68856b0 100644 --- a/src/toBeSorted/d_path.cpp +++ b/src/toBeSorted/d_path.cpp @@ -517,7 +517,7 @@ s32 ActorOnRail_Ext::execute() { mSegmentDistance = 0.0f; if (checkFlag(0x1)) { ret = 3; - offFlag(0x40000000); + unsetFlag(0x40000000); mSpeed *= -1.0f; } break; @@ -545,7 +545,7 @@ s32 ActorOnRail_Ext::execute() { mSegmentDistance = segmentLength; if (checkFlag(0x1)) { ret = 3; - onFlag(0x40000000); + setFlag(0x40000000); mSpeed *= -1.0f; } break; From 85df7c194db50b7fe774889780280c0a330d1c5a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 15:16:15 -0400 Subject: [PATCH 14/17] fixup: dAcEKs_c::actorCreate, dAcEKs_c::fn_155_2270, dAcEKs_c::executeState_WaitReady --- include/f/f_base.h | 3 +++ src/REL/d/a/e/d_a_e_ks.cpp | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/include/f/f_base.h b/include/f/f_base.h index 8ef5ac43..296fca1e 100644 --- a/include/f/f_base.h +++ b/include/f/f_base.h @@ -92,6 +92,9 @@ public: u32 getFromParams(u8 shift, u32 mask) { return (mParams >> shift) & mask; } + f32 getFromParams(u8 shift, u32 mask, f32 scale) { + return ((mParams >> shift) & mask) * scale; + } public: fBase_c(); diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index 8a1d8f36..e6b781fe 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -743,7 +743,6 @@ void dAcEKs_c::fn_155_1C80() { } void dAcEKs_c::fn_155_2270() { - // NONMATCHING if (field_0xD6A > 0) { field_0xD6A--; } @@ -751,8 +750,8 @@ void dAcEKs_c::fn_155_2270() { dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f); field_0xBF8.set(pTarget->mPosition + field_0xBEC); - mAng y = cLib::targetAngleY(mPosition, mTargetPos); - y = y - mRotation.y; + mAng yAngleDiff = cLib::targetAngleY(mPosition, mTargetPos); + yAngleDiff = yAngleDiff - mRotation.y; if (field_0xDA6 != 0) { if (transitionToNextState()) { if (mType == EKS_ELECTRIC) { @@ -814,8 +813,9 @@ void dAcEKs_c::fn_155_2270() { sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 12, 0x1555); sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 12, 0x1555); sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555); - // ?? - if (u16(y + 0x3FFF) <= 0x7FFE) { + + s16 y; + if (u16(yAngleDiff + 0x3FFF) <= 0x7FFE) { y = mRotation.x + 0xAAA; } else { y = mRotation.x - 0xAAA; @@ -897,13 +897,13 @@ void dAcEKs_c::fn_155_2270() { sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 12, 0x1555); sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555); - // ?? - if (u16(y + 0x3FFF) <= 0x7FFE) { - y = mRotation.x + 0xAAA; + s16 x; + if (u16(yAngleDiff + 0x3FFF) <= 0x7FFE) { + x = mRotation.x + 0xAAA; } else { - y = mRotation.x - 0xAAA; + x = mRotation.x - 0xAAA; } - sLib::addCalcAngle(mRotation.x.ref(), y, 12, 0x1555); + sLib::addCalcAngle(mRotation.x.ref(), x, 12, 0x1555); } } } @@ -1383,8 +1383,8 @@ int dAcEKs_c::actorCreate() { setActorProperty(AC_PROP_0x400); } } - field_0xC3C = getFromParams(6, 0xF) * 100.f; - field_0xC40 = getFromParams(10, 0xF) * 100.f; + field_0xC3C = getFromParams(6, 0xF, 100); + field_0xC40 = getFromParams(10, 0xF, 100); field_0xC44 = ((mRotation.z >> 0) & 0xF) * 100.f; field_0xC48 = ((mRotation.z >> 4) & 0xF) * 100.f; @@ -2121,7 +2121,7 @@ void dAcEKs_c::executeState_WaitReady() { mMdl.play(); playBlinkAnm(); if (field_0xD50 > 0) { - field_0xD50++; + field_0xD50--; } sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0xAAB); sLib::addCalcAngle(mRotation.y.ref(), field_0xD8A, 12, 0xAAB); From 8b86a0ce51e9862c24c95dc0ea372b35d8193745 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 15:50:34 -0400 Subject: [PATCH 15/17] fixup: dAcEKs_c::executeState_Wait thx robo --- src/REL/d/a/e/d_a_e_ks.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index e6b781fe..a601f5b8 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -1811,7 +1811,6 @@ void dAcEKs_c::executeState_Wait() { if (flag < 0xFF) { if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, flag)) { if (field_0xDCE == 0) { - bool b = false; mStartingState = EKS_STARTSTATE_Move; if (field_0xDA6 == 0) { mMtx_c m; @@ -1819,13 +1818,11 @@ void dAcEKs_c::executeState_Wait() { mVec3_c out, in(0, 0, 500); m.multVecSR(in, out); - mVec3_c start(getStartingPos() + out); - mVec3_c out2 = out * 2.f; - mVec3_c end(getStartingPos() + out2); - if (dBgS_ObjLinChk::LineCross(&start, &end, nullptr) && dBgS_ObjLinChk::ChkWall()) { - b = true; - } - if (!b) { + // TODO Fixup LineCross for Const References + if (!(dBgS_ObjLinChk::LineCross( + &(getStartingPos() + out), &(getStartingPos() + out * 2.0f), nullptr + ) && + dBgS_ObjLinChk::ChkWall())) { out *= 2.f; } setStartingPosition(getStartingPos() + out); From da805d6109d313b98c1a86612602a6b7200880d1 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 15:50:58 -0400 Subject: [PATCH 16/17] dAcEKs_c Linked --- config/SOUE01/rels/d_a_e_ksNP/symbols.txt | 4 ++-- configure.py | 2 +- include/d/t/d_t_ks.h | 26 ++++++++++++++++++++--- src/REL/d/a/e/d_a_e_ks.cpp | 11 ++++++++-- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt index 1065fcf7..0ff7baa8 100644 --- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt +++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt @@ -198,7 +198,7 @@ StateID_Damage__8dAcEKs_c = .bss:0x00000298; // type:object size:0x30 data:4byte StateID_Stun__8dAcEKs_c = .bss:0x000002D8; // type:object size:0x30 data:4byte StateID_WindBlow__8dAcEKs_c = .bss:0x00000318; // type:object size:0x30 data:4byte StateID_PathMove__8dAcEKs_c = .bss:0x00000358; // type:object size:0x30 data:4byte -lbl_155_bss_388 = .bss:0x00000388; // type:object size:0x1 data:byte -lbl_155_bss_389 = .bss:0x00000389; // type:object size:0x1 data:byte +lbl_155_bss_388__8dAcEKs_c = .bss:0x00000388; // type:object size:0x1 data:byte +lbl_155_bss_389__8dAcEKs_c = .bss:0x00000389; // type:object size:0x1 data:byte lbl_155_bss_38A = .bss:0x0000038A; // type:object size:0x1 data:byte lbl_155_bss_38C = .bss:0x0000038C; // type:object size:0x1C align:4 data:float diff --git a/configure.py b/configure.py index 3358aed1..332b7d83 100644 --- a/configure.py +++ b/configure.py @@ -2118,7 +2118,7 @@ config.libs = [ Rel(NonMatching, "d_a_e_hp", "REL/d/a/e/d_a_e_hp.cpp"), Rel(NonMatching, "d_a_e_hydra", "REL/d/a/e/d_a_e_hydra.cpp"), Rel(NonMatching, "d_a_e_kg", "REL/d/a/e/d_a_e_kg.cpp"), - Rel(NonMatching, "d_a_e_ks", "REL/d/a/e/d_a_e_ks.cpp"), + Rel(Matching, "d_a_e_ks", "REL/d/a/e/d_a_e_ks.cpp"), Rel(NonMatching, "d_a_e_kumite_gira", "REL/d/a/e/d_a_e_kumite_gira.cpp"), Rel(NonMatching, "d_a_e_lizarufos", "REL/d/a/e/d_a_e_lizarufos.cpp"), Rel(NonMatching, "d_a_e_liza_tail", "REL/d/a/e/d_a_e_liza_tail.cpp"), diff --git a/include/d/t/d_t_ks.h b/include/d/t/d_t_ks.h index c676ff32..aedcf9dd 100644 --- a/include/d/t/d_t_ks.h +++ b/include/d/t/d_t_ks.h @@ -43,33 +43,48 @@ private: /* 0x25C */ TimeAreaStruct mTimeArea; /* 0x268 */ mMtx_c field_0x268; + /* 0x298 */ u8 _0x298[0x31C - 0x298]; + /* 0x31C */ mVec3_c field_0x31C; /* 0x328 */ mVec3_c field_0x328; /* 0x334 */ mVec3_c field_0x334; /* 0x340 */ mVec3_c field_0x340; /* 0x34C */ mVec3_c field_0x34C; + /* 0x358 */ u8 _0x358[0x37C - 0x358]; + /* 0x37C */ mVec3_c mTargetPosition; /* 0x388 */ mVec3_c mSpawnKsPosition; + /* 0x394 */ u8 _0x394[0x3A0 - 0x394]; + /* 0x3A0 */ mAng3_c mSpawnKsAngle; /* 0x3A8 */ mAng3_c field_0x3A8; /* 0x3AC */ mAng field_0x3AC; // pitch /* 0x3AE */ mAng field_0x3AE; // yaw + /* 0x3B0 */ u8 _0x3B0[0x3B4 - 0x3B0]; + /* 0x3B4 */ f32 field_0x3B4; /* 0x3B8 */ f32 field_0x3B8; // Y pos offset /* 0x3BC */ f32 field_0x3BC; // X/Z scale /* 0x3C0 */ f32 field_0x3C0; // Y scale + /* 0x3C4 */ u8 _0x3C4[0x3D8 - 0x3C4]; + /* 0x3D8 */ f32 field_0x3D8; // Y scale /* 0x3DC */ f32 field_0x3DC; // X/Z scale + /* 0x3E0 */ u8 _0x3E0[0x3EC - 0x3E0]; + /* 0x3EC */ mVec3_c field_0x3EC; - /* 0x44C */ s16 field_0x448; + /* 0x3F8 */ u8 _0x3F8[0x448 - 0x3F8]; + + /* 0x448 */ s16 field_0x448; // Related to Control? + /* 0x44A */ s16 mNumKsControl; /* 0x44C */ s16 field_0x44C; /* 0x44E */ s16 field_0x44E; /* 0x450 */ s16 field_0x450; @@ -86,14 +101,19 @@ private: /* 0x460 */ s16 field_0x460; /* 0x462 */ s16 mMaxKsToLink; - /* 0x468 */ s16 field_0x468; + /* 0x464 */ u8 _0x464[0x468 - 0x464]; + /* 0x468 */ s16 field_0x468; + /* 0x46A */ s16 field_0x46A; /* 0x46C */ s16 mNumKsAlive; /* 0x46E */ s16 field435_0x46e; - /* 0x44A */ s16 mNumKsControl; + /* 0x470 */ u8 _0x470[0x474 - 0x470]; /* 0x474 */ bool field_0x474; + + /* 0x475 */ u8 _0x475[0x47A - 0x475]; + /* 0x47A */ bool field_0x47A; /* 0x47E */ bool mbAllKsActive; diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp index a601f5b8..baee6dfc 100644 --- a/src/REL/d/a/e/d_a_e_ks.cpp +++ b/src/REL/d/a/e/d_a_e_ks.cpp @@ -122,7 +122,15 @@ const dAcEKs_HIO_c dAcEKs_HIO_c::sInstance = { SPECIAL_ACTOR_PROFILE(E_KS, dAcEKs_c, fProfile::E_KS, 0xFE, 0, 4099); -static dCcD_SrcSph sSrcSph = {{0x400}}; +static dCcD_SrcSph sSrcSph = { + { + /* mObjAt */ {AT_TYPE_DAMAGE, 0x1D, {0, 0, 0}, 2, 0, 0, 0, 0, 0}, + /* mObjTg */ + {~AT_TYPE_COMMON0, 0x200303, {0, 1, 0x40F}, 8, 0}, + /* mObjCo*/ {0xE5}, + }, + {35.f} +}; STATE_DEFINE(dAcEKs_c, Wait); STATE_DEFINE(dAcEKs_c, WakeUp); @@ -1804,7 +1812,6 @@ void dAcEKs_c::initializeState_Wait() { setStartingPosition(mPosition); } -// NONMATCHING void dAcEKs_c::executeState_Wait() { mMdl.play(); u16 flag = getFromParams(14, 0xFF); From 1b61a62a004ceb93a60eb4192ccbb6b601494d5c Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 24 May 2026 20:44:09 -0400 Subject: [PATCH 17/17] fix rebase vt_0x1C0 -> getBeetleInFlight --- src/d/a/d_a_item.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index 1452dd69..3de0f79f 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -445,15 +445,13 @@ extern const UnkFloat f2(1.0f); SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2); const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs1[] = { - &dAcItem_c::fn_80248020, nullptr, - &dAcItem_c::fn_80248010, nullptr, - &dAcItem_c::fn_80255B30, &dAcItem_c::fn_80255BA0, + &dAcItem_c::fn_80248020, nullptr, &dAcItem_c::fn_80248010, nullptr, &dAcItem_c::fn_80255B30, + &dAcItem_c::fn_80255BA0, }; const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs2[] = { - &dAcItem_c::fn_80248040, nullptr, - &dAcItem_c::fn_80248030, nullptr, - &dAcItem_c::fn_80255BD0, &dAcItem_c::fn_80255C40, + &dAcItem_c::fn_80248040, nullptr, &dAcItem_c::fn_80248030, nullptr, &dAcItem_c::fn_80255BD0, + &dAcItem_c::fn_80255C40, }; fLiMgBa_c dAcItem_c::sItemList; @@ -1429,7 +1427,7 @@ void dAcItem_c::executeState_Wait() { if (fn_802574A0() && !tgBit1) { // TODO weird double load of link link = dAcPy_c::GetLinkM(); - if (!link->vt_0x1C0()) { + if (!link->getBeetleInFlight()) { addToGetQueue(); if ((link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && @@ -1752,7 +1750,7 @@ void dAcItem_c::executeState_Carry() { if (fn_802574A0()) { // TODO weird double load dAcPy_c *link = dAcPy_c::GetLinkM(); - if (!link->vt_0x1C0()) { + if (!link->getBeetleInFlight()) { addToGetQueue(); if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && FileManager::sInstance->getCurrentHealth() != 0) { @@ -1816,7 +1814,7 @@ void dAcItem_c::executeState_GetBeetle() { if (link == nullptr) { return; } - dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)link->vt_0x1C0(); + dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)link->getBeetleInFlight(); if (beetlePtr == nullptr) { if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && FileManager::sInstance->getCurrentHealth() != 0) {