From c76fde39c9b74f5f4f2c9b7319b34553ee262506 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 5 Apr 2026 21:52:02 -0400 Subject: [PATCH] dAcEremly_c::StateDamage and various cleanup --- src/REL/d/a/e/d_a_e_remly.cpp | 189 +++++++++++++++++++++++++--------- 1 file changed, 140 insertions(+), 49 deletions(-) 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 8bab1cf7..13300484 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -18,7 +18,6 @@ #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" -#include "m/m3d/m_anmmdl.h" #include "m/m3d/m_fanm.h" #include "m/m3d/m_smdl.h" #include "m/m_angle.h" @@ -30,7 +29,6 @@ #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resnode.h" #include "nw4r/math/math_arithmetic.h" -#include "nw4r/math/math_triangular.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" #include "toBeSorted/d_d3d.h" @@ -62,6 +60,45 @@ static dCcD_SrcSph sSphSrc = { 50.f, }, }; +struct dAcEremly_HIO_c { + f32 _0x00; + f32 _0x04; + f32 _0x08; + f32 _0x0C; + f32 _0x10; + f32 _0x14; + f32 _0x18; + f32 _0x1C; + f32 _0x20; + f32 _0x24; + f32 _0x28; + f32 _0x2C; + f32 _0x30; + f32 _0x34; + f32 _0x38; + f32 _0x3C; + f32 _0x40; + f32 _0x44; + s16 _0x48; + f32 _0x4C; + f32 _0x50; + f32 _0x54; + f32 _0x58; + s16 _0x5C; + s16 _0x5E; + s16 _0x60; + s16 _0x62; + s16 _0x64; + f32 _0x68; + f32 _0x6C; + static const dAcEremly_HIO_c sInstance; +}; +const dAcEremly_HIO_c dAcEremly_HIO_c::sInstance = { + 1.f, 1000.f, 500.0f, 200.0f, 120.0f, 250.0f, 400.0f, 400.0f, 600.0f, 0.8f, 5.0f, 20.0f, 10.0f, -8.0f, 20.0f, 7.0f, + 15.0f, 50.0f, 30, 1000.f, 300.f, 8.f, 1.3f, 300, 300, 30, 90, 90, 40.f, 0.f + +}; + STATE_DEFINE(dAcEremly_c, Wait); STATE_DEFINE(dAcEremly_c, Walk); STATE_DEFINE(dAcEremly_c, Run); @@ -99,7 +136,7 @@ void dAcEremly_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *resu } bool dAcEremly_c::createHeap() { - TRY_CREATE(mMdl.create(*this, getOarcResFile("Remly"), "Remly", "RemlyWalk", 0x133)); + TRY_CREATE(mMdl.create3(*this, getOarcResFile("Remly"), "Remly", "RemlyWalk", 0x133)); fn_80030980(mMdl.getModel(), 1, false); mMdl.getModel().setCallback(&mMdlCallback); @@ -476,9 +513,9 @@ int dAcEremly_c::actorExecute() { center.y += 30.f + _weird_zero; + mMtx_c m; mSph.SetC(center); if (isState(StateID_Fly)) { - mMtx_c m; mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone3").GetID(), m); m.getTranslation(center); mSph.SetC(center); @@ -497,17 +534,16 @@ int dAcEremly_c::actorExecute() { } if (field_0xB60 == 7) { - mMtx_c m; mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone3").GetID(), m); m.getTranslation(center); mEmitters[1].holdEffect(PARTICLE_RESOURCE_ID_MAPPING_859_, center, nullptr, nullptr, nullptr, nullptr); } - mPositionCopy2 = mPosition; + mPositionCopy2.set(mPosition); mPositionCopy2.y += 30.f; - mPositionCopy3 = mPositionCopy2; + mPositionCopy3.set(mPositionCopy2); mPositionCopy3.y += 50.f; if (isState(StateID_Fly)) { @@ -543,7 +579,9 @@ int dAcEremly_c::draw() { m3d::smdl_c &mdl = mMdl.getModel(); drawModelType1(&mdl); - static mQuat_c shadow = mQuat_c(mVec3_c(0, 70.f + _weird_zero, 0), 290.f + _weird_zero); + + // elp + static mQuat_c shadow(0.f, 70.f + _weird_zero, 0.f, 290.f + _weird_zero); fn_8002edb0(mShadow, mdl, &shadow, -1, -1, mPosition.y - mAcch.GetGroundH()); return SUCCEEDED; @@ -561,7 +599,7 @@ void dAcEremly_c::initializeState_Wait() { field_0xB48 = cM::rndF(48.f) + 48.f; } else { - mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 4.f); + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f); field_0xB60 = 1; field_0xB44 = cM::rndF(128.f) + 128.f; @@ -585,7 +623,7 @@ void dAcEremly_c::executeState_Wait() { if (field_0xB60 == 2) { if (mMdl.getAnm().isStop()) { - mMdl.setAnm("RemlytWaitSit", m3d::PLAY_MODE_4, 10.f); + mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f); field_0xB60 = 1; } return; @@ -661,7 +699,7 @@ void dAcEremly_c::executeState_Wait() { } if (field_0xB60 == 1) { - mMdl.setAnm("RemlytWaitSitCry", m3d::PLAY_MODE_4, 10.f); + mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 10.f); field_0xB60 = 2; } field_0xB44 = 128.f + cM::rndF(128.f); @@ -677,6 +715,7 @@ void dAcEremly_c::initializeState_Walk() { field_0xB60 = 4; } + // These two values somehow need to be before the RemlyCryWalk data field_0xB32 = 0; field_0xB34 = 0; @@ -708,7 +747,7 @@ void dAcEremly_c::executeState_Walk() { m.YrotS(field_0xB32); mVec3_c in(0.f, 0.f, 180.f), out; m.multVec(in, out); - out += mPosition; + out += pPlayer->mPosition; field_0xA44.set(out); if (fn_177_7040(2, 0.8f)) { @@ -717,46 +756,35 @@ void dAcEremly_c::executeState_Walk() { bool b0 = false; if (mSph.ChkCoHit()) { b0 = true; - if (mSph.GetCoActor()->isActorPlayer()) { - mAng a = (pPlayer->mRotation.y + 0x8000); - if (mAng::abs(getXZAngleToPlayer() - a) > mAng(1024.f + cM::rndF(1024.f))) { - b0 = false; - } + if (mSph.GetCoActor()->isActorPlayer() && + mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) > + mAng(1024.f + cM::rndF(1024.f))) { + b0 = false; } } - if (!b0) { - mAng a = (pPlayer->mRotation.y + 0x8000); - if (mAng::abs(getXZAngleToPlayer() - a) >= mAng(1024.f + cM::rndF(1024.f))) { - if (fn_177_8C20(mRotation.y)) { - field_0xB69 = 0; - changeState(StateID_Walk); - } - } + if (b0 || + mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) < mAng(1024.f + cM::rndF(1024.f)) || + fn_177_8C20(mRotation.y)) { + field_0xB69 = 0; + changeState(StateID_Wait); return; } - } + } else if (field_0xB6A == 0 && !fn_177_8C20(mRotation.y)) { + fn_177_6B10(false, 0); - if (field_0xB6A == 0) { - if (!fn_177_8C20(mRotation.y)) { - fn_177_6B10(false, 0); - - if (fn_177_75E0()) { - field_0xA44.set(mNearbyBombRef.get()->mPosition); - fn_177_7040(2, 0.8f); - } else { - fn_177_7040(0, 0.8f); - } + if (fn_177_75E0()) { + field_0xA44.set(mRef1.get()->mPosition); + fn_177_7040(2, 0.8f); + } else { + fn_177_7040(0, 0.8f); } - return; - } - - sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + _weird_zero); - fn_177_7040(0, 0.f); - if (mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x400) { - if (!fn_177_6B10(false, -1000)) { + } else { + sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + _weird_zero); + fn_177_7040(0, 0.f); + if (mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x400 && !fn_177_6B10(false, -1000)) { changeState(StateID_Wait); - mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 2.f); + mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 4.f); field_0xB60 = 2; } return; @@ -796,7 +824,7 @@ void dAcEremly_c::executeState_Run() { return; } if (fn_177_75E0()) { - field_0xA44.set(mNearbyBombRef.get()->mPosition); + field_0xA44.set(mRef1.get()->mPosition); fn_177_7040(2, 5.f); } else { fn_177_7040(0, 5.f); @@ -841,8 +869,9 @@ void dAcEremly_c::executeState_Escape() { } if (field_0xB6A != 0) { + f32 f = (_weird_zero + 400.f); field_0xB6C = 1; - if (!fn_177_7510((_weird_zero + 400.f) + 600.f) && !mNearbyBombRef.isLinked()) { + if (!fn_177_7510(600.f + f) && !mNearbyBombRef.isLinked()) { field_0xB69 = 0; changeState(StateID_Walk); } @@ -875,7 +904,7 @@ void dAcEremly_c::executeState_EscapeDash() { } if (field_0xB6B != 0) { - mVec3_c v = mPosition; + mVec3_c v(mPosition); sLib::addCalcScaledDiff(&mSpeed, 30.f, 0.7f, 3.f); if (fn_177_8C20(mRotation.y)) { @@ -1225,8 +1254,70 @@ void dAcEremly_c::executeState_Fly() { } void dAcEremly_c::finalizeState_Fly() {} -void dAcEremly_c::initializeState_Damage() {} -void dAcEremly_c::executeState_Damage() {} +void dAcEremly_c::initializeState_Damage() { + field_0xB14 = 0; + mAcceleration = -3.f; + if (field_0xB60 == 21) { + field_0xB14 = 1; + } + + if (!fn_177_7330()) { + mSpeed = 7.f; + } else { + mSpeed = 15.f; + } + + f32 blend = 10.f; + if (field_0xB6B != 0) { + blend = 0.f; + mSpeed = 0.f; + } + mStts.SetRank(5); + field_0xB6B = 0; + if (mAcch.ChkGndHit()) { + field_0xB6B = 1; + } + mMdl.setAnm("RemlyDamage", m3d::PLAY_MODE_4, blend); + field_0xB60 = 18; + mAngle.y = getXZAngleToPlayer() + 0x8000; +} +void dAcEremly_c::executeState_Damage() { + if (mAcch.ChkGndHit()) { + sLib::addCalcScaled(&mSpeed, 0.5f, 1.f); + if (field_0xB6B == 0) { + fn_177_8600(); + field_0xB6B = 1; + } + } + + if (field_0xB14 != 0) { + field_0xB4E = 8; + s32 targetAngle = getXZAngleToPlayer() + 0x8000; + if (mAng::abs(mAng(targetAngle) - mAngle.y) > 0x1000) { + sLib::addCalcAngle(mRotation.y.ref(), targetAngle, 1, 0x1000); + } else { + mRotation.y = targetAngle; + } + } + + if (mSpeed < 0.1f && mMdl.getAnm().isStop()) { + if (field_0xB14) { + changeState(StateID_EscapeDash); + field_0xB6B = 1; + } else { + mAngle.y = mRotation.y; + if (fn_177_7330() && field_0xB64 != 0) { + if (fn_177_9370(100.f)) { + changeState(StateID_NightRun); + } else { + changeState(StateID_NightRet); + } + } else { + changeState(StateID_EscapeDash); + } + } + } +} void dAcEremly_c::finalizeState_Damage() {} void dAcEremly_c::initializeState_Sleep() {}