From b577f14b6c235d86ada8deb11002316c7b700448 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 4 May 2026 21:48:13 -0400 Subject: [PATCH] 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() {}