diff --git a/include/d/a/b/d_a_b_lastboss.h b/include/d/a/b/d_a_b_lastboss.h index e2ea6bbf..0097aeec 100644 --- a/include/d/a/b/d_a_b_lastboss.h +++ b/include/d/a/b/d_a_b_lastboss.h @@ -202,6 +202,14 @@ class dAcBlastboss_c : public dAcEnBase_c { B_LAST_BOSS_NODE_skirtHU1 = 134, }; + enum FightState_e { + FIGHT_STATE_0, + FIGHT_STATE_1, + FIGHT_STATE_2, + FIGHT_STATE_3, + FIGHT_STATE_4, + }; + public: dAcBlastboss_c() : mStateMgr(*this, sStateID::null), mScnCallback(this) {} virtual ~dAcBlastboss_c() {} @@ -228,10 +236,14 @@ public: STATE_FUNC_DECLARE(dAcBlastboss_c, ThunderWait); private: - void fn_143_6720(); void setAnm(const char *anim, f32 blend); void forceSetAnm(const char *anim, f32 blend); void setAnmRate(f32 rate); + + void fn_143_6720(); + bool fn_143_7420(); + bool fn_143_75A0(); + bool fn_143_77C0(); void fn_143_7B00(); void fn_143_7F80(); void fn_143_9610(); @@ -293,7 +305,7 @@ private: /* 0x1162 */ u8 _0x1162[0x1164 - 0x1162]; /* 0x1164 */ s16 field_0x1164; - /* 0x1166 */ s16 field_0x1166; + /* 0x1166 */ s16 mFightState; /* 0x1168 */ u8 _0x1168[0x116A - 0x1168]; @@ -303,8 +315,10 @@ private: /* 0x1172 */ s16 field_0x1172; - /* 0x1174 */ u8 _0x1174[0x117C - 0x1174]; + /* 0x1174 */ u8 _0x1174[0x1178 - 0x1174]; + /* 0x1178 */ s16 field_0x1178; + /* 0x117A */ s16 field_0x117A; /* 0x117C */ s16 field_0x117C; /* 0x117E */ s16 field_0x117E; /* 0x1180 */ s16 field_0x1180; diff --git a/src/REL/d/a/b/d_a_b_lastboss.cpp b/src/REL/d/a/b/d_a_b_lastboss.cpp index 7414ba30..46d595b3 100644 --- a/src/REL/d/a/b/d_a_b_lastboss.cpp +++ b/src/REL/d/a/b/d_a_b_lastboss.cpp @@ -917,7 +917,7 @@ void dAcBlastboss_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *m void dAcBlastboss_c::initializeState_Fight() { setAnm("WaitBt", 20.0f); mAnmRate = 1.0f; - field_0x1166 = 0; + mFightState = FIGHT_STATE_0; field_0x118A = 0; if (field_0x1149 == 0) { field_0x1156[2] = cM::rndF(50.0f) + 50.0f; @@ -933,42 +933,44 @@ void dAcBlastboss_c::executeState_Fight() { f32 targetAnmRate = 1.5f; f32 puVar2 = 0.0f; - s16 diff = mAngle.y - mYAngleToLink; bool b = false; + s16 diff = mAngle.y - mYAngleToLink; - if (field_0x2CEC >= 100 && field_0x2CEC < 300) { + if (field_0x2CEC >= 200 && field_0x2CEC < 300) { puVar2 = -100.0f; field_0x1156[2] = cM::rndF(50.0f) + 100.0f; } - switch (field_0x1166) { - case 0: { + switch (mFightState) { + case FIGHT_STATE_0: { b = true; field_0x118C = 0; targetAnmRate = 1.0f; field_0x117E = 0; if (mXZDistanceToLink > puVar2 + 450.0f) { - field_0x1166 = 2; + mFightState = FIGHT_STATE_2; + break; } else if (mXZDistanceToLink < puVar2 + 250.0f + 100.0f) { - field_0x1166 = 1; + mFightState = FIGHT_STATE_1; field_0x1156[0] = 8; mAnmRate = -1.0f; field_0x1180 = 0; + // fall-through... } else { setAnm("WaitBt", 20.0f); - mAnmRate = targetAnmRate; + mAnmRate = 1.0f; if (diff < -0x1000 || diff > 0x1000) { - field_0x1166 = 4; + mFightState = FIGHT_STATE_4; if (diff < 0) { setAnm("TurnL", 10.0f); } else { setAnm("TurnR", 10.0f); } } + break; } - break; } - case 1: { + case FIGHT_STATE_1: { b = true; setAnm("WalkBt", 20.0f); targetSpeed = -5.0f; @@ -980,15 +982,15 @@ void dAcBlastboss_c::executeState_Fight() { return; } } else if (mXZDistanceToLink >= puVar2 + 200.0f && field_0x1156[0] == 0) { - field_0x1166 = 0; + mFightState = FIGHT_STATE_0; } break; } - case 2: { + case FIGHT_STATE_2: { b = true; field_0x117E = 0; if (mXZDistanceToLink > puVar2 + 850.0f) { - field_0x1166 = 3; + mFightState = FIGHT_STATE_3; } else { setAnm("WalkBt", 20.0f); if (mMdl.getAnm().getFrame() >= 25.0f && mMdl.getAnm().getFrame() <= 50.0f) { @@ -998,7 +1000,7 @@ void dAcBlastboss_c::executeState_Fight() { targetAnmRate = 1.5f; } if (mXZDistanceToLink < puVar2 + 400.0f) { - field_0x1166 = 0; + mFightState = FIGHT_STATE_0; if (field_0x1149 == 0) { field_0x1156[2] = cM::rndF(50.0f) + 50.0f; } else { @@ -1007,13 +1009,13 @@ void dAcBlastboss_c::executeState_Fight() { } break; } - case 3: { + case FIGHT_STATE_3: { setAnm("Walk", 20.0f); targetSpeed = 7.5f; field_0x11A4 = 7.5f; targetAnmRate = 1.0f; if (mXZDistanceToLink < puVar2 + 750.0f) { - field_0x1166 = 3; + mFightState = FIGHT_STATE_2; } else if (!link->isRecovering()) { field_0x117E++; if (field_0x117E > 70) { @@ -1025,11 +1027,11 @@ void dAcBlastboss_c::executeState_Fight() { } break; } - case 4: { + case FIGHT_STATE_4: { field_0x117E = 0; b = true; if (mMdl.getAnm().isStop()) { - field_0x1166 = 0; + mFightState = FIGHT_STATE_0; } break; } @@ -1039,7 +1041,7 @@ void dAcBlastboss_c::executeState_Fight() { setAnmRate(mAnmRate); sLib::addCalcScaledDiff(&mSpeed, targetSpeed, 1.0f, 2.0f); - if (field_0x1166 != 0) { + if (mFightState != FIGHT_STATE_0) { sLib::addCalcAngle(field_0x118C.ref(), 0x800, 1, 100); sLib::addCalcAngle(mAngle.y.ref(), mYAngleToLink, 2, field_0x118C); } @@ -1053,6 +1055,52 @@ void dAcBlastboss_c::executeState_Fight() { field_0x1172 = diff / 2; // TODO what is this constant sLib::addCalcScaledDiff(&mMdlCallback.field_0x30, diff * (1.0f / 409.6f), 0.5f, 1.0f); + if (field_0x2CEC == 0 && !link->isUsingShield() && link->isUsingSword()) { + mMtx_c rotMtx; + rotMtx.YrotS(-mYAngleToLink); + mVec3_c v = mVec3_c(link->getSwordPos() - mPosition); + MTXMultVec(rotMtx, v, v); + if (v.x > 150.0f) { + v.x = 150.0f; + } else if (v.x < -150.0f) { + v.x = -150.0f; + } + sLib::addCalcAngle(field_0x118A.ref(), 400, 1, 20); + sLib::addCalcAngle(mMdlCallback.field_0x18.ref(), mAng(v.x * -40.0f), 2, field_0x118A); + v.y -= 270.0f; + if (v.y > 100.0f) { + v.y = 100.0f; + } else if (v.y < -150.0f) { + v.y = -150.0f; + } + sLib::addCalcAngle(mMdlCallback.field_0x1A.ref(), mAng(v.y * -40.0f), 2, field_0x118A); + } else { + field_0x118A = 0; + sLib::addCalcAngle(mMdlCallback.field_0x18.ref(),0, 4, 400); + sLib::addCalcAngle(mMdlCallback.field_0x1A.ref(),0, 4, 400); + } + field_0x1133 = 1; + } + + if (field_0x117C == 0) { + if (!fn_143_75A0()) { + fn_143_7420(); + fn_143_77C0(); + } + // TODO + mCc1.mTg.mSrc.field_0x0E = 0x1FF; + } else { + // TODO + mCc1.mTg.mSrc.field_0x0E = 0; + } + + if (field_0x1156[4] == 1) { + field_0x1178 = 0x28; + } else if (field_0x1156[4] <= 10) { + field_0x1136 = 0; + field_0x1135 = 0; + field_0x113A = 0; + field_0x11D4 = field_0x11D8 = -1; } } void dAcBlastboss_c::finalizeState_Fight() {}