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