From 1737da2a216a886e93c568622372ad8ecbe276f0 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 16 May 2026 00:35:00 -0400 Subject: [PATCH] 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() {}