the rest of dAcEremly_c states

This commit is contained in:
elijah-thomas774
2026-04-07 16:49:25 -04:00
parent 355ac69904
commit 84a65865d0
4 changed files with 413 additions and 31 deletions
+3 -1
View File
@@ -121,6 +121,7 @@ private:
bool fn_177_79D0(bool);
bool fn_177_7B10();
void nightSleepDemoImpl();
void fn_177_8520(bool);
void fn_177_8600();
@@ -179,7 +180,8 @@ private:
/* 0xB44 */ u16 field_0xB44;
/* 0xB46 */ u16 field_0xB46;
/* 0xB48 */ u16 field_0xB48;
/* */ u8 _B4A[0xB4E - 0xB4A];
/* 0xB4A */ u16 field_0xB4A;
/* 0xB4C */ u16 field_0xB4C;
/* 0xB4E */ u16 field_0xB4E;
/* 0xB50 */ u16 field_0xB50;
/* 0xB52 */ u16 field_0xB52;
+3
View File
@@ -95,6 +95,9 @@ public:
mVec3_c &getOldPosition() {
return mOldPosition;
}
mVec3_c &getStartingPosition() {
return mStartingPos;
}
mVec3_c &getVelocity() {
return mVelocity;
}
+4
View File
@@ -63,6 +63,10 @@ public:
s32 absDiff(const mAng &other) const {
return sLib::absDiff(mVal, other.mVal);
}
template <typename T>
static s32 absDiff2(T a, T b) {
return abs(a - b);
}
f32 sin() const {
return nw4r::math::SinIdx(*this);
}
+403 -30
View File
@@ -12,6 +12,7 @@
#include "d/col/bg/d_bg_s.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_camera.h"
#include "d/d_linkage.h"
#include "d/d_sc_game.h"
#include "d/flag/sceneflag_manager.h"
@@ -689,8 +690,7 @@ void dAcEremly_c::executeState_Wait() {
}
if (field_0xB50 == 0 && !coPlayer && !fn_177_8C20(getXZAngleToPlayer())) {
mAng a = (pPlayer->mRotation.y + 0x8000);
if (mAng::abs(getXZAngleToPlayer() - a) > 0x2000) {
if (mAng::absDiff2(getXZAngleToPlayer(), mAng(pPlayer->mRotation.y + 0x8000)) > 0x2000) {
field_0xB69 = 1;
field_0xB67 = 0;
@@ -729,6 +729,7 @@ void dAcEremly_c::initializeState_Walk() {
void dAcEremly_c::executeState_Walk() {
s32 _weird_zero = 0;
bool b0 = false;
const dAcPy_c *pPlayer = dAcPy_c::GetLink();
fn_177_6FC0(true);
@@ -737,7 +738,8 @@ void dAcEremly_c::executeState_Walk() {
return;
}
if (!field_0xB6A && mAng::abs(getXZAngleToPlayer() - mRotation.y) < 0x4000 && fn_177_73C0() && field_0xB6E == 0) {
if (!field_0xB6A && mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x4000 && fn_177_73C0() &&
field_0xB6E == 0) {
changeState(StateID_Escape);
field_0xB6A = 1;
return;
@@ -754,18 +756,18 @@ void dAcEremly_c::executeState_Walk() {
if (fn_177_7040(2, 0.8f)) {
field_0xB32 += field_0xB34;
}
bool b0 = false;
if (mSph.ChkCoHit()) {
b0 = true;
if (mSph.GetCoActor()->isActorPlayer() &&
mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) >
mAng::absDiff2<mAng>(getXZAngleToPlayer(), pPlayer->mRotation.y + 0x8000) >
mAng(1024.f + cM::rndF(1024.f))) {
b0 = false;
}
}
if (b0 ||
mAng::abs(getXZAngleToPlayer() - mAng(pPlayer->mRotation.y + 0x8000)) < mAng(1024.f + cM::rndF(1024.f)) ||
mAng::absDiff2<mAng>(getXZAngleToPlayer(), pPlayer->mRotation.y + 0x8000) <
mAng(1024.f + cM::rndF(1024.f)) ||
fn_177_8C20(mRotation.y)) {
field_0xB69 = 0;
changeState(StateID_Wait);
@@ -783,7 +785,7 @@ void dAcEremly_c::executeState_Walk() {
} 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)) {
if (mAng::absDiff2<mAng>(getXZAngleToPlayer(), mRotation.y) < 0x400 && !fn_177_6B10(false, -1000)) {
changeState(StateID_Wait);
mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 2;
@@ -895,8 +897,7 @@ void dAcEremly_c::executeState_EscapeDash() {
// Idk
s32 a = getXZAngleToPlayer() + 0x8000;
if (field_0xB6B == 0) {
mAng compare = a;
if (mAng::abs(compare - mAngle.y) > 0x1000) {
if (mAng::absDiff2<mAng>(a, mAngle.y) > 0x1000) {
sLib::addCalcAngle(mAngle.y.ref(), a, 1, 0x1000);
} else {
field_0xB6B = 1;
@@ -919,7 +920,7 @@ void dAcEremly_c::finalizeState_EscapeDash() {}
void dAcEremly_c::initializeState_Wind() {
if (field_0xB60 != 10 && field_0xB60 != 9) {
if (field_0xB60 == 21 || mAng::abs(getXZAngleToPlayer() - mAng(mRotation.y + 0x8000)) < 0x6000) {
if (field_0xB60 == 21 || mAng::absDiff2<mAng>(getXZAngleToPlayer(), mRotation.y + 0x8000) < 0x6000) {
mMdl.setAnm("RemlyWindBack", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 10;
} else {
@@ -1294,7 +1295,7 @@ void dAcEremly_c::executeState_Damage() {
if (field_0xB14 != 0) {
field_0xB4E = 8;
s32 targetAngle = getXZAngleToPlayer() + 0x8000;
if (mAng::abs(mAng(targetAngle) - mAngle.y) > 0x1000) {
if (mAng::absDiff2<mAng>(targetAngle, mAngle.y) > 0x1000) {
sLib::addCalcAngle(mRotation.y.ref(), targetAngle, 1, 0x1000);
} else {
mRotation.y = targetAngle;
@@ -1562,43 +1563,415 @@ void dAcEremly_c::initializeState_Hear() {
}
}
}
void dAcEremly_c::executeState_Hear() {}
void dAcEremly_c::executeState_Hear() {
sLib::addCalcScaled(&mSpeed, 0.7f, 5.f);
switch (field_0xB65) {
case 0: {
if (mSpeed < 0.2f && 0 == sLib::calcTimer(&field_0xB48)) {
mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f);
field_0xB60 = 1;
field_0xB66 = 0;
field_0xB65++;
}
} break;
case 1: {
if (!fn_177_6B10(false, 0) && fn_177_86C0()) {
if (field_0xB60 == 2 && mMdl.getAnm().isStop()) {
mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 20.f);
field_0xB60 = 1;
} else {
if (field_0xB4C > 50) {
field_0xB4C = 50;
if (field_0xB60 == 1) {
mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 10.f);
field_0xB60 = 2;
}
}
fn_177_6EA0(false);
}
} else if (fn_177_73C0()) {
changeState(StateID_Escape);
field_0xB6A = 1;
} else {
if (field_0xB60 != 1) {
mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f);
field_0xB60 = 1;
}
fn_177_8F90();
fn_177_6FC0(true);
}
} break;
}
}
void dAcEremly_c::finalizeState_Hear() {}
void dAcEremly_c::initializeState_NightSleepDemo() {}
void dAcEremly_c::executeState_NightSleepDemo() {}
void dAcEremly_c::initializeState_NightSleepDemo() {
mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 25;
mSph.ClrAtSet();
mSph.ClrTgSet();
mSph.ClrCoSet();
}
void dAcEremly_c::executeState_NightSleepDemo() {
nightSleepDemoImpl();
}
void dAcEremly_c::finalizeState_NightSleepDemo() {}
void dAcEremly_c::initializeState_NightFoo() {}
void dAcEremly_c::executeState_NightFoo() {}
void dAcEremly_c::initializeState_NightFoo() {
mMdl.setAnm("RemlyFoo", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 28;
field_0xB48 = 12.f + cM::rndF(12.f);
field_0xB6D = 0;
field_0xB6E = 0;
field_0xB6B = 0;
mSph.ClrAtSet();
}
void dAcEremly_c::executeState_NightFoo() {
const dAcPy_c *pPlayer = dAcPy_c::GetLink();
fn_177_6FC0(false);
sLib::addCalcScaled(&mSpeed, 0.7f, 5.f);
sLib::addCalcAngle(mAngle.y.ref(), getXZAngleToPlayer(), 2, 0x1000);
sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x1000);
if (field_0xB6D == 0) {
if (0 != sLib::calcTimer(&field_0xB48)) {
return;
}
if (mAng::absDiff2<s32>(getXZAngleToPlayer(), mRotation.y) > 0x400) {
return;
}
} else {
if (!mNearbyBombRef.isLinked()) {
changeState(StateID_NightWait);
return;
}
if (pPlayer->getPosition().absXZTo(mPosition) > mNearbyBombRef.get()->mPosition.absXZTo(mPosition)) {
sLib::addCalcAngle(
mAngle.y.ref(), cLib::targetAngleY(mPosition, mNearbyBombRef.get()->mPosition), 2, 0x800
);
return;
}
}
if (field_0xB6E != 0) {
changeState(StateID_Fly);
return;
}
if (field_0xB6B != 0 || pPlayer->mPosition.absXZTo(mStartingPos) > field_0xB08 + 500.f) {
changeState(StateID_NightRet);
return;
}
if (mAng::absDiff2<s32>(getXZAngleToPlayer(), mRotation.y) < 0x1000) {
changeState(StateID_NightJumpAttack);
if (!mAcch.ChkWallHit(nullptr) && fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) == 0) {
return;
}
field_0xB6E = 1;
}
}
void dAcEremly_c::finalizeState_NightFoo() {}
void dAcEremly_c::initializeState_NightReflectionFoo() {}
void dAcEremly_c::executeState_NightReflectionFoo() {}
void dAcEremly_c::initializeState_NightReflectionFoo() {
mMdl.setAnm("RemlyFoo", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 28;
mMdl.setRate(0.f);
mSpeed *= -1.f;
field_0xB48 = 24.f + cM::rndF(24.f);
field_0xB6B = 0;
if (mAcch.ChkGndHit()) {
field_0xB6B = 1;
}
mSph.ClrAtSet();
}
void dAcEremly_c::executeState_NightReflectionFoo() {
const dAcPy_c *pPlayer = dAcPy_c::GetLink();
fn_177_6FC0(false);
if (mAcch.ChkGndHit()) {
sLib::addCalcScaled(&mSpeed, 0.5f, 2.f);
if (field_0xB6B == 0) {
fn_177_8600();
field_0xB6B = 1;
}
}
if (!mMdl.getAnm().getRate()) {
if (mSpeed < 0.1f) {
mMdl.setRate(1.f);
}
return;
}
if (pPlayer->isRecovering() || sLib::calcTimer(&field_0xB48)) {
return;
}
if (pPlayer->mPosition.absXZTo(mStartingPos) > field_0xB08 + 500.f || !fn_177_9370(100.f)) {
changeState(StateID_NightRet);
} else {
changeState(StateID_NightRun);
field_0xB48 = 24.f + cM::rndF(24.f);
}
}
void dAcEremly_c::finalizeState_NightReflectionFoo() {}
void dAcEremly_c::initializeState_NightWait() {}
void dAcEremly_c::executeState_NightWait() {}
void dAcEremly_c::initializeState_NightWait() {
fn_177_8520(true);
mMdl.setAnm("RemlyWaitStandNight", m3d::PLAY_MODE_4, 4.f);
field_0xB48 = 24.f + cM::rndF(24.f);
mSph.ClrAtSet();
}
void dAcEremly_c::executeState_NightWait() {
if (mNearbyBombRef.isLinked()) {
changeState(StateID_NightRet);
return;
}
if (fn_177_9370(0.f)) {
changeState(StateID_NightRun);
return;
}
if (fn_177_86C0()) {
changeState(StateID_NightFoo);
field_0xB6D = 1;
return;
}
if (0 == sLib::calcTimer(&field_0xB48)) {
changeState(StateID_NightWalk);
return;
}
sLib::addCalcScaled(&mSpeed, 0.5f, 5.f);
}
void dAcEremly_c::finalizeState_NightWait() {}
void dAcEremly_c::initializeState_NightWalk() {}
void dAcEremly_c::executeState_NightWalk() {}
// ???
inline bool compareDistance(const mVec3_c &v0, const mVec3_c &v1, f32 f) {
return v0.squareDistanceToXZ(v1) > f * f;
}
void dAcEremly_c::initializeState_NightWalk() {
mMdl.setAnm("RemlyWalkNight", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 29;
field_0xA44.set(mStartingPos);
// odd
if (!compareDistance(mPosition, mStartingPos, field_0xB08)) {
field_0xA44.x += cM::rndFX(field_0xB08 * 0.5f);
field_0xA44.z += cM::rndFX(field_0xB08 * 0.5f);
}
}
void dAcEremly_c::executeState_NightWalk() {
fn_177_6B10(true, 0);
if (mNearbyBombRef.isLinked()) {
changeState(StateID_NightRet);
return;
}
s32 idk = fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f);
if (idk != 0) {
field_0xA44.set(getStartingPosition());
if (idk == 1) {
mAng a = cLib::targetAngleY(mPosition, getStartingPosition());
if (mAng::absDiff2<mAng>(mRotation.y, a) < 0x400) {
field_0xB6E = 1;
changeState(StateID_Fly);
return;
}
}
}
if (fn_177_7040(2, 0.8f)) {
field_0xA44.set(mStartingPos);
if (idk == 0) {
field_0xA44.x += cM::rndFX(field_0xB08 * 0.5f);
field_0xA44.z += cM::rndFX(field_0xB08 * 0.5f);
}
}
if (fn_177_9370(0.f)) {
changeState(StateID_NightRun);
} else if (fn_177_86C0()) {
changeState(StateID_NightFoo);
field_0xB6D = 1;
}
}
void dAcEremly_c::finalizeState_NightWalk() {}
void dAcEremly_c::initializeState_NightRun() {}
void dAcEremly_c::executeState_NightRun() {}
void dAcEremly_c::initializeState_NightRun() {
mMdl.setAnm("RemlyRunFast", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 30;
field_0xB18 = 0;
field_0xB6B = 0;
mSph.ClrAtSet();
mAcceleration = -3.f;
mMdl.setRate(1.5f);
field_0xB48 = 0;
fn_177_77C0();
}
void dAcEremly_c::executeState_NightRun() {
const dAcPy_c *pPlayer = dAcPy_c::GetLink();
fn_177_6B10(false, 0);
mMtx_c m;
mVec3_c in, out;
mVec3_c stuffs0, stuffs1;
if (field_0xB6B == 0) {
// What...
const mVec3_c &target = dScGame_c::getCamera()->getTarget();
f32 z = target.z;
f32 y = target.y;
f32 x = target.x;
stuffs0.x = x;
stuffs0.y = y;
stuffs1.z = z;
if (fn_177_7040(2, 10.f)) {
field_0xB32 += field_0xB34;
}
if (fn_177_8C20(mRotation.y)) {
changeState(StateID_NightFoo);
return;
}
m.YrotS(field_0xB32);
in.set(0.f, 0.f, 320.f);
m.multVec(in, out);
out += pPlayer->mPosition;
field_0xA44.set(out);
}
if (mNearbyBombRef.isLinked()) {
changeState(StateID_NightRet);
return;
}
if (!fn_177_9370(100.f)) {
changeState(StateID_NightFoo);
field_0xB6B = 1;
return;
}
if (0 == sLib::calcTimer(&field_0xB48) && isWithinPlayerRadius(400.f) && d3d::isOnScreen(mPosition)) {
field_0xB6B = 1;
}
if (field_0xB6B) {
fn_177_7040(0, 5.0f);
if (field_0xB48 == 0) {
if (mAng::absDiff2<mAng>(getXZAngleToPlayer(), mRotation.y) < mAng(4608.f + cM::rndF(4096.f))) {
changeState(StateID_NightFoo);
}
}
}
}
void dAcEremly_c::finalizeState_NightRun() {}
void dAcEremly_c::initializeState_NightRet() {}
void dAcEremly_c::executeState_NightRet() {}
void dAcEremly_c::initializeState_NightRet() {
mMdl.setAnm("RemlyRunFast", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 30;
field_0xA44.set(mStartingPos);
field_0xB6B = 0;
field_0xB18 = 0;
}
void dAcEremly_c::executeState_NightRet() {
fn_177_6FC0(true);
if (mNearbyBombRef.isLinked()) {
mSpeed = 10.f;
f32 radius = 500.f;
mAngle.y = cLib::targetAngleY(mNearbyBombRef.get()->mPosition, mPosition);
sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800);
if (mNearbyBombRef.get()->mPosition.squareDistanceToXZ(mPosition) > radius * radius) {
changeState(StateID_NightFoo);
field_0xB6D = 1;
}
return;
}
if (fn_177_8C20(mRotation.y)) {
changeState(StateID_NightFoo);
field_0xB6E = 1;
return;
}
if (fn_177_7040(2, 10.f)) {
changeState(StateID_NightWait);
}
}
void dAcEremly_c::finalizeState_NightRet() {}
void dAcEremly_c::initializeState_NightJumpAttack() {}
void dAcEremly_c::executeState_NightJumpAttack() {}
void dAcEremly_c::initializeState_NightJumpAttack() {
mSpeed = 20.f;
mVelocity.y = 27.f + cM::rndF(3.f);
mSph.OnAtSet();
mMdl.setAnm("RemlyJump", m3d::PLAY_MODE_4, 0.f);
field_0xB60 = 31;
field_0xB6E = 0;
field_0xB32 = 0;
field_0xB6B = 0;
}
void dAcEremly_c::executeState_NightJumpAttack() {
fn_177_6FC0(false);
if (mSph.ChkAtHit()) {
if (mSph.GetAtFlag0x8()) {
setBattleBgmRelated(0);
mSpeed = -20.f;
changeState(StateID_Stun);
return;
}
if (mSph.GetAtFlag0x2()) {
changeState(StateID_NightReflectionFoo);
return;
}
}
if (mAcch.ChkGndHit()) {
fn_177_8600();
if (field_0xB6E != 0 &&
(mAcch.ChkWallHit(nullptr) || fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) != 0)) {
changeState(StateID_NightFoo);
field_0xB6B = 1;
return;
}
changeState(StateID_NightRun);
field_0xB48 = 24.f + cM::rndF(24.f);
}
}
void dAcEremly_c::finalizeState_NightJumpAttack() {}
void dAcEremly_c::initializeState_BirthWait() {}
void dAcEremly_c::executeState_BirthWait() {}
void dAcEremly_c::initializeState_BirthWait() {
field_0xB48 = 300;
unsetActorProperty(AC_PROP_0x1);
field_0xB64 = 2;
field_0xB68 = 0;
mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f);
field_0xB60 = 0;
}
void dAcEremly_c::executeState_BirthWait() {
if (!sLib::calcTimer(&field_0xB48) && fn_177_7650(true)) {
mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z);
mOldPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z);
mPosition.y += 10.f;
mVelocity.set(0.f, 0.f, 0.f);
mSpeed = 0.f;
mAcceleration = -3.f;
setActorProperty(AC_PROP_0x1);
if (fn_177_7330()) {
changeState(StateID_NightWait);
} else if (field_0xB61 == 1 && fn_177_75E0()) {
changeState(StateID_Wait);
} else {
changeState(StateID_Sleep);
}
}
}
void dAcEremly_c::finalizeState_BirthWait() {}
bool dAcEremly_c::fn_177_73C0() {