mirror of
https://github.com/zeldaret/ss
synced 2026-05-26 23:47:22 -04:00
d_a_b_lastboss 99%
This commit is contained in:
@@ -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];
|
||||
|
||||
|
||||
+198
-118
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user