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() {}