CFlyingPirateRagDoll: Implement Update

This commit is contained in:
Luke Street 2020-03-18 04:50:41 -04:00
parent 851304ded9
commit 6d757f021f
2 changed files with 100 additions and 32 deletions

View File

@ -101,7 +101,8 @@ CFlyingPirate::CFlyingPirateData::CFlyingPirateData(CInputStream& in, u32 propCo
CFlyingPirate::CFlyingPirateRagDoll::CFlyingPirateRagDoll(CStateManager& mgr, CFlyingPirate* actor, u16 w1, u16 w2) CFlyingPirate::CFlyingPirateRagDoll::CFlyingPirateRagDoll(CStateManager& mgr, CFlyingPirate* actor, u16 w1, u16 w2)
: CRagDoll(-actor->GetGravityConstant(), 3.f, 8.f, 0) : CRagDoll(-actor->GetGravityConstant(), 3.f, 8.f, 0)
, x88_(w1) , x6c_actor(actor)
, x88_sfx(w1)
, x9c_(w2) , x9c_(w2)
, xa4_(actor->GetDestPos() - actor->GetTranslation()) , xa4_(actor->GetDestPos() - actor->GetTranslation())
, xb0_24_(false) { , xb0_24_(false) {
@ -208,15 +209,85 @@ void CFlyingPirate::CFlyingPirateRagDoll::PreRender(const zeus::CVector3f& v, CM
} }
void CFlyingPirate::CFlyingPirateRagDoll::Prime(CStateManager& mgr, const zeus::CTransform& xf, CModelData& mData) { void CFlyingPirate::CFlyingPirateRagDoll::Prime(CStateManager& mgr, const zeus::CTransform& xf, CModelData& mData) {
if (x6c_actor->x6a1_30_) { if (x6c_actor->x6a1_30_spinToDeath) {
xa0_ = CSfxManager::AddEmitter(x9c_, x6c_actor->GetTranslation(), zeus::skZero3f, true, true, 0x7f, kInvalidAreaId); xa0_ = CSfxManager::AddEmitter(x9c_, x6c_actor->GetTranslation(), zeus::skZero3f, true, true, 0x7f, kInvalidAreaId);
} }
CRagDoll::Prime(mgr, xf, mData); CRagDoll::Prime(mgr, xf, mData);
} }
void CFlyingPirate::CFlyingPirateRagDoll::Update(CStateManager& mgr, float dt, float waterTop) { void CFlyingPirate::CFlyingPirateRagDoll::Update(CStateManager& mgr, float dt, float waterTop) {
// TODO if (!x68_25_over) {
CRagDoll::Update(mgr, dt, waterTop); if (x6c_actor->x6a1_30_spinToDeath) {
x84_ -= dt;
const zeus::CVector3f& v9c = (x6c_actor->x2e0_destPos - x4_particles[14].GetPosition()).normalized();
x74_ = zeus::CVector3f::slerp(x74_, v9c, zeus::degToRad(360.f * dt));
x70_ = 25.f;
zeus::CVector3f mul = x70_ * x74_;
if (x84_ <= 0.f) {
x4_particles[14].Velocity() += 11.f * mul;
} else {
x4_particles[14].Velocity() += 25.f * mul;
}
zeus::CVector3f inv = -4 * mul;
x4_particles[4].Velocity() += -mul;
x4_particles[7].Velocity() += -mul;
x4_particles[10].Velocity() += inv;
x4_particles[10].Velocity() += inv;
x4_particles[1].Velocity() += -mul;
x80_ = std::min(1000.f * dt + x80_, 1000.f);
zeus::CVector3f vc0 = ((x4_particles[5].Position() - x4_particles[2].Position())
.cross(x4_particles[8].Position() - x4_particles[2].Position()) +
0.25f * (x4_particles[2].Position() - x4_particles[5].Position()))
.normalized() *
x80_;
x4_particles[2].Velocity() += vc0;
x4_particles[5].Velocity() += -vc0;
x44_normalGravity = 0.f;
CSfxManager::UpdateEmitter(xa0_, x6c_actor->GetTranslation(), x58_averageVel, 1.f);
}
// Collar-hips weighted center
zeus::CVector3f oldTorsoCenter = x4_particles[8].GetPosition() * 0.25f + x4_particles[11].GetPosition() * 0.25f +
x4_particles[0].GetPosition() * 0.5f;
oldTorsoCenter.z() = std::min({x4_particles[0].GetPosition().z() - x4_particles[0].GetRadius(),
x4_particles[8].GetPosition().z() - x4_particles[8].GetRadius(),
x4_particles[11].GetPosition().z() - x4_particles[11].GetRadius()});
CRagDoll::Update(mgr, dt, waterTop);
// Collar-hips weighted center
zeus::CVector3f newTorsoCenter = x4_particles[8].GetPosition() * 0.25f + x4_particles[11].GetPosition() * 0.25f +
x4_particles[0].GetPosition() * 0.5f;
newTorsoCenter.z() = std::min({x4_particles[0].GetPosition().z() - x4_particles[0].GetRadius(),
x4_particles[8].GetPosition().z() - x4_particles[8].GetRadius(),
x4_particles[11].GetPosition().z() - x4_particles[11].GetRadius()});
x6c_actor->SetTransform({zeus::CMatrix3f(false), newTorsoCenter});
x6c_actor->SetVelocityWR((newTorsoCenter - oldTorsoCenter) * (1.f / dt));
if (x6c_actor->x6a1_30_spinToDeath) {
if ((newTorsoCenter - x6c_actor->GetDestPos()).magSquared() > 0.f) {
x6c_actor->x88c_ragDollTimer = 0.5f * dt;
}
}
x8c_ -= dt;
if (x54_impactVel > 2.f && x8c_ < 0.f) {
if (xb0_24_ || (x6c_actor->GetTranslation() - x90_).magSquared() > 0.1f) {
float vol = std::min(10.f * x54_impactVel, 127.f) / 127.f;
CSfxManager::AddEmitter(x88_sfx, x6c_actor->GetTranslation(), zeus::skZero3f, vol, true, false, 0x7f,
kInvalidAreaId);
x8c_ = 0.222f * mgr.GetActiveRandom()->Float() + 0.222f;
xb0_24_ = false;
x90_ = x6c_actor->GetTranslation();
}
}
} else {
x6c_actor->SetMomentumWR(zeus::skZero3f);
x6c_actor->Stop();
}
} }
CFlyingPirate::CFlyingPirate(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, CFlyingPirate::CFlyingPirate(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
@ -239,7 +310,7 @@ CFlyingPirate::CFlyingPirate(TUniqueId uid, std::string_view name, const CEntity
, x6a1_27_(false) , x6a1_27_(false)
, x6a1_28_(false) , x6a1_28_(false)
, x6a1_29_isMoving(false) , x6a1_29_isMoving(false)
, x6a1_30_(false) , x6a1_30_spinToDeath(false)
, x6a1_31_stopped(false) , x6a1_31_stopped(false)
, x6a2_24_aggressive(false) , x6a2_24_aggressive(false)
, x6a2_25_aggressionChecked(false) , x6a2_25_aggressionChecked(false)
@ -296,7 +367,7 @@ void CFlyingPirate::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CSt
x7ec_burstFire.SetBurstType(2); x7ec_burstFire.SetBurstType(2);
break; break;
case EScriptObjectMessage::Falling: case EScriptObjectMessage::Falling:
if (x450_bodyController->GetPercentageFrozen() == 0.f && !x400_28_pendingMassiveDeath && !x6a1_30_) { if (x450_bodyController->GetPercentageFrozen() == 0.f && !x400_28_pendingMassiveDeath && !x6a1_30_spinToDeath) {
SetMomentumWR({0.f, 0.f, -GetGravityConstant() * xe8_mass}); SetMomentumWR({0.f, 0.f, -GetGravityConstant() * xe8_mass});
} }
x7ec_burstFire.SetBurstType(0); x7ec_burstFire.SetBurstType(0);
@ -859,7 +930,7 @@ void CFlyingPirate::KnockBack(const zeus::CVector3f& pos, CStateManager& mgr, co
UpdateParticleEffects(mgr, 0.f, false); UpdateParticleEffects(mgr, 0.f, false);
SetMomentumWR({0.f, 0.f, -GetGravityConstant() * xe8_mass}); SetMomentumWR({0.f, 0.f, -GetGravityConstant() * xe8_mass});
} else { } else {
x6a1_30_ = true; x6a1_30_spinToDeath = true;
x150_momentum.zeroOut(); x150_momentum.zeroOut();
} }
x460_knockBackController.SetAnimationStateRange(EKnockBackAnimationState::Hurled, EKnockBackAnimationState::Hurled); x460_knockBackController.SetAnimationStateRange(EKnockBackAnimationState::Hurled, EKnockBackAnimationState::Hurled);
@ -892,7 +963,7 @@ void CFlyingPirate::KnockBack(const zeus::CVector3f& pos, CStateManager& mgr, co
CSfxManager::AddEmitter(x568_data.xe6_deathSfx, GetTranslation(), zeus::skZero3f, 1.f, true, false, 0x7f, CSfxManager::AddEmitter(x568_data.xe6_deathSfx, GetTranslation(), zeus::skZero3f, 1.f, true, false, 0x7f,
kInvalidAreaId); kInvalidAreaId);
if (x400_27_fadeToDeath) { if (x400_27_fadeToDeath) {
x6a1_30_ = false; x6a1_30_spinToDeath = false;
UpdateParticleEffects(mgr, 0.f, false); UpdateParticleEffects(mgr, 0.f, false);
SetMomentumWR({0.f, 0.f, -GetGravityConstant() * xe8_mass}); SetMomentumWR({0.f, 0.f, -GetGravityConstant() * xe8_mass});
} }
@ -1322,10 +1393,7 @@ void CFlyingPirate::DeliverGetUp() {
} }
void CFlyingPirate::UpdateCanSeePlayer(CStateManager& mgr) { void CFlyingPirate::UpdateCanSeePlayer(CStateManager& mgr) {
int iVar3 = x7dc_; if (x7dc_ % 7 == 0) {
int iVar1 = iVar3 / 7 + (iVar3 >> 0x1f) * 7;
// x7dc % 7 == ?
if (iVar3 == (iVar1 - (iVar1 >> 0x1f)) * 7) {
bool bVar4 = true; bool bVar4 = true;
const zeus::CVector3f& start = GetGunEyePos() - x34_transform.rightVector(); const zeus::CVector3f& start = GetGunEyePos() - x34_transform.rightVector();
const zeus::CVector3f& end = GetAimPosition(mgr, 0.f); const zeus::CVector3f& end = GetAimPosition(mgr, 0.f);
@ -1608,13 +1676,7 @@ void CFlyingPirate::Think(float dt, CStateManager& mgr) {
} }
if (x89c_ragDoll) { if (x89c_ragDoll) {
if (!x89c_ragDoll->IsPrimed()) { if (x89c_ragDoll->IsPrimed()) {
// SetMuted(true); ??
SetMuted(false);
x89c_ragDoll->Prime(mgr, x34_transform, *x64_modelData);
SetTransform(zeus::CTransform::Translate(x34_transform.origin));
x450_bodyController->SetPlaybackRate(0.f);
} else {
float waterTop = -FLT_MAX; float waterTop = -FLT_MAX;
if (xc4_fluidId != kInvalidUniqueId) { if (xc4_fluidId != kInvalidUniqueId) {
if (TCastToPtr<CScriptWater> water = mgr.ObjectById(xc4_fluidId)) { if (TCastToPtr<CScriptWater> water = mgr.ObjectById(xc4_fluidId)) {
@ -1623,24 +1685,30 @@ void CFlyingPirate::Think(float dt, CStateManager& mgr) {
} }
x89c_ragDoll->Update(mgr, dt * CalcDyingThinkRate(), waterTop); x89c_ragDoll->Update(mgr, dt * CalcDyingThinkRate(), waterTop);
x64_modelData->AdvanceParticles(x34_transform, dt, mgr); x64_modelData->AdvanceParticles(x34_transform, dt, mgr);
} else {
// SetMuted(true); ??
SetMuted(false);
x89c_ragDoll->Prime(mgr, x34_transform, *x64_modelData);
SetTransform(zeus::CTransform::Translate(x34_transform.origin));
x450_bodyController->SetPlaybackRate(0.f);
} }
if (x89c_ragDoll->IsPrimed() && !x400_27_fadeToDeath) {
if (x89c_ragDoll->IsOver() && !x400_27_fadeToDeath) {
x400_27_fadeToDeath = true; x400_27_fadeToDeath = true;
x3e8_alphaDelta = -1.f / 3.f; x3e8_alphaDelta = -1.f / 3.f;
SetVelocityWR(zeus::skZero3f); SetVelocityWR(zeus::skZero3f);
x150_momentum.zeroOut(); x150_momentum.zeroOut();
x870_.zeroOut(); x870_.zeroOut();
} }
if (x89c_ragDoll) {
bool wasGtZero = x88c_ragDollTimer > 0.f; bool wasGtZero = x88c_ragDollTimer > 0.f;
x88c_ragDollTimer -= dt; x88c_ragDollTimer -= dt;
if (x88c_ragDollTimer < 2.f) { if (x88c_ragDollTimer < 2.f) {
if (x89c_ragDoll->GetImpactCount() > 2) { if (x89c_ragDoll->GetImpactCount() > 2) {
x88c_ragDollTimer = std::min(0.1f, x88c_ragDollTimer); x88c_ragDollTimer = std::min(0.1f, x88c_ragDollTimer);
} }
if (wasGtZero && x88c_ragDollTimer <= 0.f) { if (wasGtZero && x88c_ragDollTimer <= 0.f) {
x330_stateMachineState.SetState(mgr, *this, GetStateMachine(), "Explode"); x330_stateMachineState.SetState(mgr, *this, GetStateMachine(), "Explode");
}
} }
} }
} }

View File

@ -57,7 +57,7 @@ private:
zeus::CVector3f x74_ = zeus::skUp; zeus::CVector3f x74_ = zeus::skUp;
float x80_ = 0.f; float x80_ = 0.f;
float x84_ = 5.f; float x84_ = 5.f;
u16 x88_; u16 x88_sfx;
float x8c_ = 0.f; float x8c_ = 0.f;
zeus::CVector3f x90_ = zeus::skZero3f; zeus::CVector3f x90_ = zeus::skZero3f;
u16 x9c_; u16 x9c_;
@ -154,7 +154,7 @@ private:
bool x6a1_27_ : 1; bool x6a1_27_ : 1;
bool x6a1_28_ : 1; bool x6a1_28_ : 1;
bool x6a1_29_isMoving : 1; bool x6a1_29_isMoving : 1;
bool x6a1_30_ : 1; bool x6a1_30_spinToDeath : 1;
bool x6a1_31_stopped : 1; bool x6a1_31_stopped : 1;
bool x6a2_24_aggressive : 1; bool x6a2_24_aggressive : 1;
bool x6a2_25_aggressionChecked : 1; bool x6a2_25_aggressionChecked : 1;