From 1ea69393a8fb9096b6f044cbaafcb28cb794bfa1 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 2 Jan 2026 11:44:31 +0100 Subject: [PATCH] d_a_b_lastboss 99% --- include/d/a/b/d_a_b_lastboss.h | 34 ++-- src/REL/d/a/b/d_a_b_lastboss.cpp | 316 +++++++++++++++++++------------ 2 files changed, 215 insertions(+), 135 deletions(-) diff --git a/include/d/a/b/d_a_b_lastboss.h b/include/d/a/b/d_a_b_lastboss.h index 057ba894..e1100d0f 100644 --- a/include/d/a/b/d_a_b_lastboss.h +++ b/include/d/a/b/d_a_b_lastboss.h @@ -325,14 +325,14 @@ private: /* 0x0620 */ dCcD_Linked_Cyl mCc2; /* 0x0780 */ dCcD_Linked_Cyl mCc3; /* 0x08E0 */ dCcD_Linked_Sph mCc4; - /* 0x0A40 */ dCcD_Linked_Sph mCc5; + /* 0x0A40 */ dCcD_Linked_Sph mLightningCc; /* 0x0BA0 */ dScnCallback_c mScnCallback; /* 0x0BAC */ STATE_MGR_DECLARE(dAcBlastboss_c); /* 0x0BE8 */ dColliderLinkedList mCcList; /* 0x0BF4 */ dEnemySwordMdl_c mSwordMdl; - /* 0x1130 */ u8 field_0x1130; + /* 0x1130 */ u8 mThunderWaitSceneFlag; /* 0x1131 */ u8 field_0x1131; - /* 0x1132 */ u8 field_0x1132; + /* 0x1132 */ bool field_0x1132; /* 0x1133 */ u8 field_0x1133; /* 0x1134 */ u8 field_0x1134; /* 0x1135 */ s8 mNumConsecutiveOppositeDirectionAttacks; @@ -346,23 +346,23 @@ private: /* 0x113D */ u8 field_0x113D; /* 0x113E */ u8 field_0x113E; /* 0x113F */ u8 field_0x113F; - /* 0x1140 */ u8 field_0x1140; - /* 0x1141 */ u8 field_0x1141; + /* 0x1140 */ bool field_0x1140; + /* 0x1141 */ bool mIsDown; /* 0x1142 */ u8 field_0x1142; /* 0x1143 */ u8 mInvulnerabilityTimerMaybe; /* 0x1144 */ s8 mGuardDirection; /* 0x1145 */ s8 mLinkCloseRangeShieldTime; /* 0x1146 */ bool mIsSwordEmpowered; - /* 0x1147 */ u8 field_0x1147; - /* 0x1148 */ u8 field_0x1148; + /* 0x1147 */ bool mIsThunderBeamAttackActive; + /* 0x1148 */ u8 mThunderBeamTimer; /* 0x1149 */ s8 mIsPhaseTwo; - /* 0x114A */ u8 field_0x114A; - /* 0x114B */ u8 field_0x114B; + /* 0x114A */ u8 mLightingFallSwordTimer; + /* 0x114B */ u8 mStunState; /* 0x114C */ u8 field_0x114C; /* 0x114D */ bool mInBossRush; /* 0x114E */ u8 field_0x114E; - /* 0x114F */ u8 field_0x114F; - /* 0x1150 */ u8 field_0x1150; + /* 0x114F */ bool mIsDead; + /* 0x1150 */ bool mThunderBeamReflected; /* 0x1152 */ u16 field_0x1152; /* 0x1154 */ u16 mStunCounter; /* 0x1156 */ u16 mTimers[TIMER_MAX]; @@ -400,8 +400,8 @@ private: /* 0x1194 */ u8 _0x1194[0x119C - 0x1194]; - /* 0x119C */ f32 field_0x119C; - /* 0x11A0 */ f32 field_0x11A0; + /* 0x119C */ f32 mAttackKnockbackX; + /* 0x11A0 */ f32 mAttackKnockbackZ; /* 0x11A4 */ f32 field_0x11A4; /* 0x11A8 */ f32 mAnmRate; /* 0x11AC */ f32 field_0x11AC; @@ -416,14 +416,14 @@ private: /* 0x11D0 */ f32 field_0x11D0; /* 0x11D4 */ s32 mLastAttackDir; /* 0x11D8 */ s32 mSecondLastAttackDirection; - /* 0x11DC */ mAng3_c field_0x11DC; + /* 0x11DC */ mAng3_c mThunderBeamRotation; /* 0x11E4 */ mVec3_c mThumbL2Translation; /* 0x11F0 */ mVec3_c mBackbone1Translation; /* 0x11FC */ mVec3_c mChestTranslation; - /* 0x1208 */ mVec3_c field_0x1208; + /* 0x1208 */ mVec3_c mSwordPosition; /* 0x1214 */ mVec3_c mBugNetPos; - /* 0x1220 */ mVec3_c field_0x1220; - /* 0x122C */ mVec3_c field_0x122C; + /* 0x1220 */ mVec3_c mThunderBeamPosition; + /* 0x122C */ mVec3_c mThunderBeamVelocity; /* 0x1238 */ mVec3_c mToeTranslation[2]; /* 0x1250 */ mVec3_c field_0x1250[2]; 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 4cb77297..0fc2ec6e 100644 --- a/src/REL/d/a/b/d_a_b_lastboss.cpp +++ b/src/REL/d/a/b/d_a_b_lastboss.cpp @@ -170,7 +170,7 @@ bool dAcBlastboss_c::createHeap() { } int dAcBlastboss_c::create() { - field_0x1130 = getFromParams(0, 0xFF); + mThunderWaitSceneFlag = getFromParams(0, 0xFF); if (MinigameManager::GetInstance()->checkInBossRush()) { mInBossRush = true; } @@ -204,9 +204,9 @@ int dAcBlastboss_c::create() { mCc4.Set(sSrcSph1); mCc4.SetStts(mStts); - mCc5.Set(sSrcSph2); - mCc5.mTg.Set_0x4C(-1); - mCc5.SetStts(mStts); + mLightningCc.Set(sSrcSph2); + mLightningCc.mTg.Set_0x4C(-1); + mLightningCc.SetStts(mStts); mAcceleration = -5.0f; mMaxSpeed = -80.0f; @@ -214,7 +214,7 @@ int dAcBlastboss_c::create() { mBoundingBox.Set(mVec3_c(-200.0f, -300.0f, -200.0f), mVec3_c(200.0f, 300.0f, 200.0f)); mStateMgr.changeState(StateID_Fight); - field_0x1132 = 1; + field_0x1132 = true; mCounter = cM::rndF(65536.0f); mHealth = 400; @@ -263,7 +263,7 @@ int dAcBlastboss_c::actorExecute() { field_0x1133 = 0; field_0x1131 = 0; - field_0x1141 = 0; + mIsDown = false; field_0x114E = 0; field_0x11A4 = 0.0f; @@ -305,7 +305,7 @@ int dAcBlastboss_c::actorExecute() { mSwordMdl.disable(); mCc4.ClrAtSet(); - mCc5.ClrAtSet(); + mLightningCc.ClrAtSet(); checkDamage(); if (mpSwordBattleGame == nullptr || mpSwordBattleGame->checkFightStarted() == true) { @@ -317,30 +317,30 @@ int dAcBlastboss_c::actorExecute() { sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800); mMdl.play(); - if (!field_0x114F) { + if (!mIsDead) { mAnmMatClr1.play(); } calcVelocity(); mPosition += mVelocity; mPosition += mStts.GetCcMove(); - mPosition.x += field_0x119C; - mPosition.z += field_0x11A0; + mPosition.x += mAttackKnockbackX; + mPosition.z += mAttackKnockbackZ; - field_0x119C *= 0.6f; - field_0x11A0 *= 0.6f; + mAttackKnockbackX *= 0.6f; + mAttackKnockbackZ *= 0.6f; f32 f5 = 0.0f; if (mRotation.x != 0) { f5 += field_0x11C0 * mRotation.x.sin(); } - field_0x1140 = 0; + field_0x1140 = false; if (mPosition.y <= f5) { mPosition.y = f5; field_0x11BC = mVelocity.y; mVelocity.y = 0.0f; - field_0x1140 = 1; + field_0x1140 = true; } updateMainNodeTransforms(); @@ -350,7 +350,7 @@ int dAcBlastboss_c::actorExecute() { mScale.set(0.95f, 0.95f, 0.95f); mMdl.getModel().setScale(mScale); mMdl.getModel().setLocalMtx(mWorldMtx); - if (!field_0x1141) { + if (!mIsDown) { mAnmTexSrt.play(); } @@ -379,11 +379,11 @@ int dAcBlastboss_c::actorExecute() { } } } - MTXMultVec(nodeMtx, vEff, field_0x1208); + MTXMultVec(nodeMtx, vEff, mSwordPosition); if (mIsSwordEmpowered) { mEmitter4.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_619_, nodeMtx, nullptr, nullptr); - mLightInfo.mPos = field_0x1208; + mLightInfo.mPos = mSwordPosition; if (dScGame_c::getUpdateFrameCount() & 2) { mLightInfo.SetScale(300.0f); } else { @@ -392,13 +392,13 @@ int dAcBlastboss_c::actorExecute() { holdSound(SE_BLasBos_SwordEnpowered); } - if (field_0x114B != 0) { - if (field_0x114B == 1) { + if (mStunState != 0) { + if (mStunState == 1) { mEmitter7.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_852_, nodeMtx, nullptr, nullptr); mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone2").GetID(), nodeMtx); mEmitter6.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_853_, nodeMtx, nullptr, nullptr); holdSound(SE_BLasBos_UnderElecShock); - } else if (field_0x114B == 2) { + } else if (mStunState == 2) { mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone2").GetID(), nodeMtx); dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_851_, nodeMtx, nullptr, nullptr, 0, 0); mMtx_c transMtx; @@ -408,13 +408,13 @@ int dAcBlastboss_c::actorExecute() { mEmitter6.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_853_, nodeMtx, nullptr, nullptr); holdSound(SE_BLasBos_KillOffElecShock); } - mLightInfo.mPos = field_0x1208; + mLightInfo.mPos = mSwordPosition; if (dScGame_c::getUpdateFrameCount() & 2) { mLightInfo.SetScale(400.0f); } else { mLightInfo.SetScale(300.0f); } - field_0x114B = 0; + mStunState = 0; } mMdl.getModel().getNodeWorldMtx(B_LAST_BOSS_NODE_thumbL2, nodeMtx); @@ -485,7 +485,7 @@ int dAcBlastboss_c::actorExecute() { tmpCc.z = mChestTranslation.z; tmpCc.y = mPosition.y; - if (!field_0x1141) { + if (!mIsDown) { mCc3.SetR(100.0f); } else { mCc3.SetR(200.0f); @@ -514,7 +514,7 @@ int dAcBlastboss_c::actorExecute() { if (mInvulnerabilityTimerMaybe == 0) { mCc1.SetTg_0x4B(1); // TODO - mCc1.mTg.field_0x6C = field_0x1208; + mCc1.mTg.field_0x6C = mSwordPosition; } else { mInvulnerabilityTimerMaybe--; tmpCc.set(0.0f, -10000.0f, 0.0); @@ -659,88 +659,90 @@ int dAcBlastboss_c::actorExecute() { dLightEnv_c::GetInstance().GetOverrideSpf().mIdxEnd = 2; dLightEnv_c::GetInstance().GetOverrideSpf().mRatio = field_0x11CC; - if (field_0x1147 && field_0x1148 != 0) { - field_0x1148--; - field_0x1220 += field_0x122C; - nodeMtx.transS(field_0x1220); - nodeMtx.ZXYrotM(field_0x11DC); + if (mIsThunderBeamAttackActive && mThunderBeamTimer != 0) { + mThunderBeamTimer--; + mThunderBeamPosition += mThunderBeamVelocity; + nodeMtx.transS(mThunderBeamPosition); + nodeMtx.ZXYrotM(mThunderBeamRotation); - if (!field_0x1150) { - if (mCc5.ChkAtHit() || mCc5.ChkTgHit()) { + if (!mThunderBeamReflected) { + if (mLightningCc.ChkAtHit() || mLightningCc.ChkTgHit()) { dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_850_, nodeMtx, nullptr, nullptr, 0, 0); - if (mCc5.ChkTgHit() && mCc5.ChkTgAtHitType(AT_TYPE_BUGNET)) { - getSoundSource()->startSoundAtPosition2(SE_BLasBos_EmitThunderBeam, field_0x1220); - field_0x1148 = 0x3C; - field_0x122C *= -1.0f; + if (mLightningCc.ChkTgHit() && mLightningCc.ChkTgAtHitType(AT_TYPE_BUGNET)) { + // Reflect thunder beam attack with Bug Net + getSoundSource()->startSoundAtPosition2(SE_BLasBos_EmitThunderBeam, mThunderBeamPosition); + mThunderBeamTimer = 0x3C; + mThunderBeamVelocity *= -1.0f; dRumble_c::start(dRumble_c::sRumblePreset2, dRumble_c::FLAG_SLOT0); dStageMgr_c::GetInstance()->fn_80199B60(3); - field_0x1150 = 1; + mThunderBeamReflected = true; } else { - field_0x1147 = 0; + mIsThunderBeamAttackActive = false; mMtx_c mtx; mtx.transS(0.0f, -100000.0f, 0.0f); MTXConcat(nodeMtx, mtx, nodeMtx); - getSoundSource()->startSoundAtPosition2(SE_BLasBos_BeamCrossCrush, field_0x1220); + getSoundSource()->startSoundAtPosition2(SE_BLasBos_BeamCrossCrush, mThunderBeamPosition); } - mCc5.SetTgRpm(0); - mCc5.ClrTgActorInfo(); - mCc5.SubtractTgEffCounter(); - mCc5.SetAtRpm(0); - mCc5.ClrAtActorInfo(); - mCc5.SubtractAtEffCounter(); + mLightningCc.SetTgRpm(0); + mLightningCc.ClrTgActorInfo(); + mLightningCc.SubtractTgEffCounter(); + mLightningCc.SetAtRpm(0); + mLightningCc.ClrAtActorInfo(); + mLightningCc.SubtractAtEffCounter(); } } else { - if ((field_0x1220 - mPosition).absXZ() < 150.0f) { + if ((mThunderBeamPosition - mPosition).absXZ() < 150.0f) { + // Boss hit by bug net reflected attack dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_850_, nodeMtx, nullptr, nullptr, 0, 0); - field_0x1147 = false; + mIsThunderBeamAttackActive = false; mMtx_c mtx; mtx.transS(0.0f, -100000.0f, 0.0f); MTXConcat(nodeMtx, mtx, nodeMtx); - getSoundSource()->startSoundAtPosition2(SE_BLasBos_BeamCrossCrush, field_0x1220); + getSoundSource()->startSoundAtPosition2(SE_BLasBos_BeamCrossCrush, mThunderBeamPosition); v3.set(0.0f, 0.0f, 20.0f); rotMtx.YrotS(link->mRotation.y); MTXMultVec(rotMtx, v3, v3); - field_0x119C = v3.x; - field_0x11A0 = v3.z; + mAttackKnockbackX = v3.x; + mAttackKnockbackZ = v3.z; mStateMgr.changeState(StateID_Stun); } } - mLightInfo.mPos = field_0x1220; + mLightInfo.mPos = mThunderBeamPosition; if ((dScGame_c::getUpdateFrameCount() & 2) != 0) { mLightInfo.SetScale(300.0f); } else { mLightInfo.SetScale(200.0f); } - if (field_0x1148 <= 10) { + if (mThunderBeamTimer <= 10) { // TODO: lightning timer? - if (field_0x1148 == 10) { + if (mThunderBeamTimer == 10) { mEmitter5.setFading(10); } - if (field_0x1148 == 0) { - field_0x1147 = 0; + if (mThunderBeamTimer == 0) { + mIsThunderBeamAttackActive = false; } - mCc5.ClrAtSet(); + mLightningCc.ClrAtSet(); } else { - if (!field_0x1150) { - mCc5.OnAtSet(); - mCc5.SetR(100.0f); - mCc5.moveCenter(field_0x1220); - dCcS::GetInstance()->Set(&mCc5); + if (!mThunderBeamReflected) { + mLightningCc.OnAtSet(); + mLightningCc.SetR(100.0f); + mLightningCc.moveCenter(mThunderBeamPosition); + dCcS::GetInstance()->Set(&mLightningCc); } - getSoundSource()->holdSoundAtPosition(SE_BLasBos_ThunderBeamFly, field_0x1220); + getSoundSource()->holdSoundAtPosition(SE_BLasBos_ThunderBeamFly, mThunderBeamPosition); } mEmitter5.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_618_, nodeMtx, nullptr, nullptr); } - if (field_0x114A != 0) { - field_0x114A--; - mCc5.OnAtSet(); - mCc5.SetC(mPosition); - mCc5.SetR(300.0f - field_0x114A * 30.0f); - mCc5.SetAtVec(link->getPosition() - mPosition); - dCcS::GetInstance()->Set(&mCc5); - if (field_0x114A == 8) { + if (mLightingFallSwordTimer != 0) { + mLightingFallSwordTimer--; + mLightningCc.OnAtSet(); + mLightningCc.SetC(mPosition); + mLightningCc.SetR(300.0f - mLightingFallSwordTimer * 30.0f); + mLightningCc.SetAtVec(link->getPosition() - mPosition); + dCcS::GetInstance()->Set(&mLightningCc); + if (mLightingFallSwordTimer == 8) { vEff.x = mPosition.x; vEff.y = 10.0f; vEff.z = mPosition.z; @@ -754,9 +756,9 @@ int dAcBlastboss_c::actorExecute() { SceneflagManager *mgr = SceneflagManager::sInstance; if (mgr != nullptr) { if (mStateMgr.isState(StateID_ThunderWait)) { - mgr->setFlag(getRoomId(), field_0x1130); + mgr->setFlag(getRoomId(), mThunderWaitSceneFlag); } else { - mgr->unsetFlag(getRoomId(), field_0x1130); + mgr->unsetFlag(getRoomId(), mThunderWaitSceneFlag); } } @@ -1474,19 +1476,19 @@ void dAcBlastboss_c::executeState_ThunderAttack() { mIsSwordEmpowered = false; mCc1.ClrTg_0x8000000(); mSwordMdl.fn_8006B800(0); - field_0x1147 = 1; - field_0x1148 = 60; - field_0x1150 = 0; - field_0x11DC = mRotation; + mIsThunderBeamAttackActive = true; + mThunderBeamTimer = 60; + mThunderBeamReflected = false; + mThunderBeamRotation = mRotation; mVec3_c v(0.0f, 100.0f, 300.0f); mMtx_c mtx; mtx.YrotS(mRotation.y); - MTXMultVec(mtx, v, field_0x1220); - field_0x1220 += mPosition; + MTXMultVec(mtx, v, mThunderBeamPosition); + mThunderBeamPosition += mPosition; v.set(0.0f, 0.0f, 50.0f); - MTXMultVec(mtx, v, field_0x122C); - mCc5.setCenter(field_0x1220); + MTXMultVec(mtx, v, mThunderBeamVelocity); + mLightningCc.setCenter(mThunderBeamPosition); setLightningTimerMaybe(30); startSound(SE_BLasBos_EmitThunderBeam); } @@ -1765,7 +1767,7 @@ void dAcBlastboss_c::executeState_Down() { mVec3_c v; mMtx_c mtx; - field_0x1141 = 1; + mIsDown = true; field_0x1142 = 5; bool b = false; setLightningTimerMaybe(30); @@ -1831,7 +1833,7 @@ void dAcBlastboss_c::executeState_Down() { mSubState = SUB_STATE_50; mLightingStrikeState = LIGHTNING_STRIKE_TRIGGER_END; startSound(SE_BLasBos_LastHit); - field_0x114F = 1; + mIsDead = true; resetInteractionFlags(INTERACT_0x1000); resetInteractionFlags(INTERACT_0x1); } else if (mTimers[TIMER_0] == 0) { @@ -1854,7 +1856,7 @@ void dAcBlastboss_c::executeState_Down() { } case SUB_STATE_4: { if (mMdl.getAnm().getFrame() >= 52.0f) { - field_0x1141 = 0; + mIsDown = false; sLib::addCalcAngle(mAngle.x.ref(), 0, 1, 910); } if (mMdl.getAnm().getFrame() >= 170.0f) { @@ -1872,7 +1874,7 @@ void dAcBlastboss_c::executeState_Down() { sLib::addCalcScaledDiff(&field_0x11C8, 15.0f, 1.0f, 5.0f); field_0x11A4 = 20.0f; } else { - field_0x1141 = 0; + mIsDown = false; sLib::addCalcAngle(mAngle.y.ref(), mYAngleToLink, 2, 0x800); sLib::addCalcScaled(&field_0x11C8, 1.0f, 5.0f); } @@ -1911,7 +1913,7 @@ void dAcBlastboss_c::executeState_Down() { break; } case SUB_STATE_20: { - field_0x1141 = 0; + mIsDown = 0; if (mMdl.getAnm().isStop()) { mSubState = SUB_STATE_21; setAnm("CatchThunderLoop", 0.0f); @@ -1919,7 +1921,7 @@ void dAcBlastboss_c::executeState_Down() { break; } case SUB_STATE_21: { - field_0x1141 = 0; + mIsDown = false; if (mMdl.getAnm().isStop()) { mStateMgr.changeState(StateID_Fight); mTimers[TIMER_4] = 15; @@ -1956,7 +1958,7 @@ void dAcBlastboss_c::initializeState_Stun() { } void dAcBlastboss_c::executeState_Stun() { setLightningTimerMaybe(40); - field_0x114B = 1; + mStunState = 1; int frame = mMdl.getAnm().getFrame(); switch (mSubState) { case SUB_STATE_0: { @@ -1977,10 +1979,10 @@ void dAcBlastboss_c::executeState_Stun() { case SUB_STATE_2: { if (frame <= 58) { if (frame == 58) { - field_0x114B = 2; + mStunState = 2; } } else { - field_0x114B = 0; + mStunState = 0; if (frame <= 61) { field_0x11A4 = 25.0f; } @@ -2032,9 +2034,9 @@ void dAcBlastboss_c::executeState_ThunderWait() { mSubState = SUB_STATE_5; setAnm("CatchThunderEnd", 5.0f); mVec3_c vEff; - vEff.x = field_0x1208.x; - vEff.y = field_0x1208.y + 110.0f; - vEff.z = field_0x1208.z; + vEff.x = mSwordPosition.x; + vEff.y = mSwordPosition.y + 110.0f; + vEff.z = mSwordPosition.z; dJEffManager_c::spawnEffect( PARTICLE_RESOURCE_ID_MAPPING_624_, vEff, nullptr, nullptr, nullptr, nullptr, 0, 0 ); @@ -2042,7 +2044,7 @@ void dAcBlastboss_c::executeState_ThunderWait() { mIsSwordEmpowered = true; mSwordMdl.fn_8006B800(4); mCc1.OnTg_0x8000000(); - field_0x114A = 10; + mLightingFallSwordTimer = 10; startSound(SE_BLasBos_ThunderFallSword); } break; @@ -2102,8 +2104,8 @@ bool dAcBlastboss_c::checkDamage() { v.z = 20.0f; mtx.YrotS(link->mRotation.y); MTXMultVec(mtx, v, v2); - field_0x119C = v2.x; - field_0x11A0 = v2.z; + mAttackKnockbackX = v2.x; + mAttackKnockbackZ = v2.z; mStateMgr.changeState(StateID_Stun); break; } @@ -2170,8 +2172,8 @@ bool dAcBlastboss_c::checkDamage() { v.z = -5.0f; mtx.YrotS(mYAngleToLink); MTXMultVec(mtx, v, v2); - field_0x119C = v2.x; - field_0x11A0 = v2.z; + mAttackKnockbackX = v2.x; + mAttackKnockbackZ = v2.z; mLastAttackDir = mLastAttackDirection; break; } @@ -2194,8 +2196,8 @@ bool dAcBlastboss_c::checkDamage() { v.z = -10.0f; mtx.YrotS(mRotation.y); MTXMultVec(mtx, v, v2); - field_0x119C = v2.x; - field_0x11A0 = v2.z; + mAttackKnockbackX = v2.x; + mAttackKnockbackZ = v2.z; } break; @@ -2208,8 +2210,8 @@ bool dAcBlastboss_c::checkDamage() { v.z = 20.0f; mtx.YrotS(link->mRotation.y); MTXMultVec(mtx, v, v2); - field_0x119C = v2.x; - field_0x11A0 = v2.z; + mAttackKnockbackX = v2.x; + mAttackKnockbackZ = v2.z; mStateMgr.changeState(StateID_Stun); break; } @@ -2257,8 +2259,8 @@ bool dAcBlastboss_c::checkDamage() { v.z = -20.0f; mtx.YrotS(mYAngleToLink); MTXMultVec(mtx, v, v2); - field_0x119C = v2.x; - field_0x11A0 = v2.z; + mAttackKnockbackX = v2.x; + mAttackKnockbackZ = v2.z; field_0x1138 = 10; field_0x11B8 = 5.0f; field_0x11A4 = 7.0f; @@ -2304,8 +2306,8 @@ bool dAcBlastboss_c::checkDamage() { v.z = -20.0f; mtx.YrotS(mYAngleToLink); MTXMultVec(mtx, v, v2); - field_0x119C = v2.x; - field_0x11A0 = v2.z; + mAttackKnockbackX = v2.x; + mAttackKnockbackZ = v2.z; field_0x11B8 = 5.0f; field_0x11A4 = 7.0f; if (mLastAttackDirection == daPlayerActBase_c::ATTACK_DIRECTION_LEFT || @@ -2340,8 +2342,8 @@ bool dAcBlastboss_c::checkDamage() { v.z = -20.0f; mtx.YrotS(mYAngleToLink); MTXMultVec(mtx, v, v2); - field_0x119C = v2.x; - field_0x11A0 = v2.z; + mAttackKnockbackX = v2.x; + mAttackKnockbackZ = v2.z; field_0x1138 = 10; field_0x11B8 = 5.0f; field_0x11A4 = 7.0f; @@ -2420,7 +2422,6 @@ bool dAcBlastboss_c::checkForCloseRangeAttack() { } mLinkCloseRangeShieldTime = 0; } - // ret = true; } } else { @@ -2751,7 +2752,7 @@ void dAcBlastboss_c::updateSkirtHairTransforms() { updateHairTransform(i); } - if (field_0x1141 == 0) { + if (!mIsDown) { for (int i = 0; i < 9; i++) { f32 f = (i % 3) * 3 + 1; if (i < 3) { @@ -2849,7 +2850,7 @@ void dAcBlastboss_c::updateSkirtTransform(s32 level) { cc.mCc.SetR(50.0f); } - if (field_0x1141 != 0) { + if (mIsDown) { offset2 = 0; v4.set(0.0f, 0.0f, 0.0f); p2.set(0.0f, 0.0f, 0.0f); @@ -2864,7 +2865,7 @@ void dAcBlastboss_c::updateSkirtTransform(s32 level) { s32 actual = offset2 - 1; for (u32 i = 1; i < 10; i++) { - // TODO: These strength reduced and moved to before the loop. + // TODO: These are strength reduced and moved to before the loop. // However, we need them at the start of the function! mVec3_c *v1 = &cc.field_0x014[i]; mVec3_c *v2 = &cc.field_0x08C[i] - 1; @@ -2888,7 +2889,7 @@ void dAcBlastboss_c::updateSkirtTransform(s32 level) { } f32 f4; - if (field_0x1141 != 0) { + if (mIsDown) { f4 = 5.0f; } else { f4 = sFloats[i - 1]; @@ -2943,12 +2944,91 @@ void dAcBlastboss_c::updateSkirtTransform(s32 level) { } void dAcBlastboss_c::updateHairTransform(s32 level) { - // Might hold off with this one until updateSkirtTransform is fixed + // NONMATCHING but probably equivalent - // floats - 47.5f; - 0.9f; - 1.6f; + UnkLastBossCcSph1 &cc = field_0x2948[level]; + + mMtx_c mtx2; + mMtx_c mtx; + mVec3_c t1(0.0f, 0.0f, 47.5f); + mVec3_c v; + mVec3_c t2(0.0f, 0.0f, -10.0f); + + mtx.YrotS(cc.field_0x002); + mtx.XrotM(cc.field_0x004); + MTXMultVec(mtx, t2, t2); + + f32 f1 = field_0x11B8; + f32 f2 = -field_0x11B8; + f32 fAdd = -5.0f; + f32 fScale = 1.0f; + f32 f4 = 0.9f; + + for (u32 i = 1; i < 5; i++) { + // TODO: These are strength reduced and moved to before the loop. + // However, we need them at the start of the function! + mVec3_c *v1 = &cc.field_0x008[i]; + mVec3_c *v2 = &cc.field_0x044[i] - 1; + mVec3_c *v3 = &cc.field_0x080[i]; + + v.x = f1 * mAng(mCounter * 12000 - (i * 20000)).sin(); + v.y = f1 * mAng(mCounter * 10000 - (i * 20000)).sin(); + v.z = f2; + v.x += mAng(mCounter * 10000 - (i * 20000)).sin() * fScale; + v.y += mAng(mCounter * 12000 - (i * 20000)).sin() * fScale; + MTXMultVec(mtx, v, v); + + f1 *= 1.6f; + + f32 f13; + if (field_0x113D != 0) { + f13 = fAdd + v1[0].y + t2.y + v3[0].y + v.y; + if (f13 < mPositionCopy2.y) { + f13 = mPositionCopy2.y; + } + f13 = f13 - v1[-1].y; + } else if (mIsDown) { + f13 = fAdd + v1[0].y + v3[0].y; + if (f13 <= 0.0f) { + f13 = 0.0f; + } + f13 = f13 - v1[-1].y; + v.set(0.0f, 0.0f, 0.0f); + } else { + f13 = fAdd + (v1[0].y - v1[-1].y) + t2.y + v3[0].y + v.y; + } + + f32 fX2 = (v1[0].x - v1[-1].x) + t2.x + v3[0].x + v.x; + f32 fZ2 = (v1[0].z - v1[-1].z) + t2.z + v3[0].z + v.z; + + t2.x *= 0.6f; + t2.y *= 0.6f; + t2.z *= 0.6f; + v2[0].y = cM::atan2s(fX2, fZ2); + f32 f8 = nw4r::math::FSqrt(fX2 * fX2 + fZ2 * fZ2); + v2[0].x = -cM::atan2s(f13, f8); + v2[0].z = cc.field_0x006; + + mtx2.YrotS(v2[0].y); + mtx2.XrotM(v2[0].x); + MTXMultVec(mtx2, t1, v); + + v3[0] = v1[0]; + v1[0] = v1[-1] + v; + v3[0] = (v1[0] - v3[0]) * f4; + } + + f32 target = 0.0f; + cc.mCc.SetC(mPositionCopy2); + cc.mCc.SetR(30.0f); + if (cc.mCc.ChkTgHit()) { + target = 7.0f; + holdSound(SE_BLasBos_HairAir); + if (field_0x1178 == 0) { + field_0x1178 = 18; + } + } + sLib::addCalcScaledDiff(&field_0x11B8, target, 0.2f, 0.7f); } bool dAcBlastboss_c::checkForLinkSwordBySwordHit() { @@ -3065,7 +3145,7 @@ void dAcBlastboss_c::executeLightningStrike() { dLightEnv_c::GetPInstance()->setField_0x38DC(7); setAnm("CatchThunderEnd", 5.0f); spawnEffect = true; - effPos.set(field_0x1208.x, field_0x1208.y + 110.0f, field_0x1208.z); + effPos.set(mSwordPosition.x, mSwordPosition.y + 110.0f, mSwordPosition.z); mIsSwordEmpowered = true; mSwordMdl.fn_8006B800(4); mCc1.OnTg_0x8000000(); @@ -3217,7 +3297,7 @@ void dAcBlastboss_c::executeLightningStrike() { dJEffManager_c::spawnEffect( PARTICLE_RESOURCE_ID_MAPPING_624_, effPos, nullptr, nullptr, nullptr, nullptr, 0, 0 ); - field_0x114A = 10; + mLightingFallSwordTimer = 10; } if (b1) {