CIceSheegoth: Implement ShakePlayer and minor fixes

This commit is contained in:
Phillip Stephens 2020-04-24 16:34:23 -07:00
parent 86acf6dce7
commit 4e0b933357
Signed by: Antidote
GPG Key ID: F8BEE4C83DACA60D
2 changed files with 89 additions and 27 deletions

View File

@ -2,6 +2,9 @@
#include "Runtime/CSimplePool.hpp" #include "Runtime/CSimplePool.hpp"
#include "Runtime/CStateManager.hpp" #include "Runtime/CStateManager.hpp"
#include "Runtime/Camera/CCameraManager.hpp"
#include "Runtime/Camera/CCameraShakeData.hpp"
#include "Runtime/Camera/CFirstPersonCamera.hpp"
#include "Runtime/Character/CPASAnimParmData.hpp" #include "Runtime/Character/CPASAnimParmData.hpp"
#include "Runtime/Collision/CCollisionActor.hpp" #include "Runtime/Collision/CCollisionActor.hpp"
#include "Runtime/Collision/CCollisionActorManager.hpp" #include "Runtime/Collision/CCollisionActorManager.hpp"
@ -142,7 +145,7 @@ void CIceSheegoth::Think(float dt, CStateManager& mgr) {
CPatterned::Think(dt, mgr); CPatterned::Think(dt, mgr);
AttractProjectiles(mgr); AttractProjectiles(mgr);
sub_801a0b8c(dt); UpdateTimers(dt);
sub_8019e6f0(mgr); sub_8019e6f0(mgr);
if (!IsAlive()) { if (!IsAlive()) {
x974_ = std::max(0.f, x974_ - (dt * x56c_sheegothData.Get_x170())); x974_ = std::max(0.f, x974_ - (dt * x56c_sheegothData.Get_x170()));
@ -163,7 +166,7 @@ void CIceSheegoth::Think(float dt, CStateManager& mgr) {
xa2c_collisionManager->Update(dt, mgr, CCollisionActorManager::EUpdateOptions::ObjectSpace); xa2c_collisionManager->Update(dt, mgr, CCollisionActorManager::EUpdateOptions::ObjectSpace);
PreventWorldCollisions(dt, mgr); PreventWorldCollisions(dt, mgr);
UpdateHealthInfo(mgr); UpdateHealthInfo(mgr);
sub_8019f5cc(dt, mgr); SetSteeringSpeed(dt, mgr);
UpdateParticleEffects(dt, mgr); UpdateParticleEffects(dt, mgr);
UpdateThermalFrozenState(x428_damageCooldownTimer > 0.f); UpdateThermalFrozenState(x428_damageCooldownTimer > 0.f);
} }
@ -236,7 +239,7 @@ void CIceSheegoth::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, C
} }
} else { } else {
TakeDamage(zeus::skZero3f, 0.f); TakeDamage(zeus::skZero3f, 0.f);
if (sub_8019fc40(colAct)) { if (IsGillCollider(colAct)) {
x97c_ = 0.2f; x97c_ = 0.2f;
x980_ = GetTransform().basis[1]; x980_ = GetTransform().basis[1];
} }
@ -284,6 +287,7 @@ void CIceSheegoth::AddToRenderer(const zeus::CFrustum& frustum, CStateManager& m
} }
void CIceSheegoth::Render(CStateManager& mgr) { CPatterned::Render(mgr); } void CIceSheegoth::Render(CStateManager& mgr) { CPatterned::Render(mgr); }
zeus::CVector3f CIceSheegoth::GetAimPosition(const CStateManager& mgr, float dt) const { zeus::CVector3f CIceSheegoth::GetAimPosition(const CStateManager& mgr, float dt) const {
return CPatterned::GetAimPosition(mgr, dt); return CPatterned::GetAimPosition(mgr, dt);
} }
@ -347,7 +351,7 @@ void CIceSheegoth::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node
} }
break; break;
case EUserEventType::ScreenShake: case EUserEventType::ScreenShake:
sub_801a0708(mgr); ShakePlayer(mgr);
return; return;
case EUserEventType::BecomeShootThrough: case EUserEventType::BecomeShootThrough:
SetPassthroughVulnerability(mgr); SetPassthroughVulnerability(mgr);
@ -491,6 +495,7 @@ void CIceSheegoth::Deactivate(CStateManager& mgr, EStateMsg msg, float dt) {
} }
} }
} }
void CIceSheegoth::Attack(CStateManager& mgr, EStateMsg msg, float dt) { void CIceSheegoth::Attack(CStateManager& mgr, EStateMsg msg, float dt) {
if (msg == EStateMsg::Activate) { if (msg == EStateMsg::Activate) {
x568_ = 0; x568_ = 0;
@ -739,6 +744,7 @@ void CIceSheegoth::Approach(CStateManager& mgr, EStateMsg msg, float dt) {
x3b4_speed = x94c_; x3b4_speed = x94c_;
} }
} }
void CIceSheegoth::Enraged(CStateManager& mgr, EStateMsg msg, float dt) { void CIceSheegoth::Enraged(CStateManager& mgr, EStateMsg msg, float dt) {
if (msg == EStateMsg::Activate) { if (msg == EStateMsg::Activate) {
x568_ = 0; x568_ = 0;
@ -827,10 +833,7 @@ bool CIceSheegoth::InDetectionRange(CStateManager& mgr, float arg) {
} }
bool CIceSheegoth::SpotPlayer(CStateManager& mgr, float arg) { bool CIceSheegoth::SpotPlayer(CStateManager& mgr, float arg) {
if (!xb28_24_shotAt) { return xb28_24_shotAt || CPatterned::SpotPlayer(mgr, arg);
return CPatterned::SpotPlayer(mgr, arg);
}
return true;
} }
bool CIceSheegoth::AnimOver(CStateManager& mgr, float arg) { return x568_ == 4; } bool CIceSheegoth::AnimOver(CStateManager& mgr, float arg) { return x568_ == 4; }
@ -928,7 +931,7 @@ void CIceSheegoth::ApplyContactDamage(TUniqueId sender, CStateManager& mgr) {
if (colAct->GetHealthInfo(mgr)->GetHP() <= 0.f) { if (colAct->GetHealthInfo(mgr)->GetHP() <= 0.f) {
return; return;
} }
bool bVar5 = (xb28_29_ && !xb28_25_ && xb28_28_) ? true : sub_8019fc84(sender); bool bVar5 = (xb28_29_ && !xb28_25_ && xb28_28_) ? true : IsMouthCollider(sender);
if (colAct->GetLastTouchedObject() == mgr.GetPlayer().GetUniqueId()) { if (colAct->GetLastTouchedObject() == mgr.GetPlayer().GetUniqueId()) {
if (bVar5) { if (bVar5) {
@ -979,7 +982,7 @@ void CIceSheegoth::SetupCollisionActorManager(CStateManager& mgr) {
xa2c_collisionManager->SetActive(mgr, GetActive()); xa2c_collisionManager->SetActive(mgr, GetActive());
xa2c_collisionManager->AddMaterial(mgr, EMaterialTypes::CameraPassthrough); xa2c_collisionManager->AddMaterial(mgr, EMaterialTypes::CameraPassthrough);
xb04_.clear(); xb04_.clear();
xafc_.clear(); xafc_gillColliders.clear();
for (size_t i = 0; i < xa2c_collisionManager->GetNumCollisionActors(); ++i) { for (size_t i = 0; i < xa2c_collisionManager->GetNumCollisionActors(); ++i) {
const auto& desc = xa2c_collisionManager->GetCollisionDescFromIndex(i); const auto& desc = xa2c_collisionManager->GetCollisionDescFromIndex(i);
@ -993,7 +996,7 @@ void CIceSheegoth::SetupCollisionActorManager(CStateManager& mgr) {
} else if (desc.GetName() == "Ice_Shards_LCTR"sv) { } else if (desc.GetName() == "Ice_Shards_LCTR"sv) {
colAct->SetWeaponCollisionResponseType(EWeaponCollisionResponseTypes::None); colAct->SetWeaponCollisionResponseType(EWeaponCollisionResponseTypes::None);
} else if (desc.GetName() == "GillL_LCTR"sv || desc.GetName() == "GillR_LCTR"sv) { } else if (desc.GetName() == "GillL_LCTR"sv || desc.GetName() == "GillR_LCTR"sv) {
xafc_.emplace_back(desc.GetCollisionActorId()); xafc_gillColliders.emplace_back(desc.GetCollisionActorId());
} else { } else {
xb04_.emplace_back(desc.GetCollisionActorId()); xb04_.emplace_back(desc.GetCollisionActorId());
colAct->SetDamageVulnerability(x56c_sheegothData.Get_x80()); colAct->SetDamageVulnerability(x56c_sheegothData.Get_x80());
@ -1011,7 +1014,7 @@ void CIceSheegoth::SetupCollisionActorManager(CStateManager& mgr) {
void CIceSheegoth::SetupHealthInfo(CStateManager& mgr) { void CIceSheegoth::SetupHealthInfo(CStateManager& mgr) {
CHealthInfo* thisHealth = HealthInfo(mgr); CHealthInfo* thisHealth = HealthInfo(mgr);
x970_maxHp = thisHealth->GetHP(); x970_maxHp = thisHealth->GetHP();
for (auto& id : xafc_) { for (auto& id : xafc_gillColliders) {
if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(id)) { if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(id)) {
*colAct->HealthInfo(mgr) = *thisHealth; *colAct->HealthInfo(mgr) = *thisHealth;
} }
@ -1057,7 +1060,23 @@ void CIceSheegoth::CreateFlameThrower(CStateManager& mgr) {
x56c_sheegothData.Get_x1ec())); x56c_sheegothData.Get_x1ec()));
} }
void CIceSheegoth::AttractProjectiles(CStateManager& mgr) {} void CIceSheegoth::AttractProjectiles(CStateManager& mgr) {}
void CIceSheegoth::sub_801a0b8c(float dt) {} void CIceSheegoth::UpdateTimers(float dt) {
if (x954_attackTimeLeft > 0.f) {
x954_attackTimeLeft -= (xb29_27_ ? 2.f : 1.f) * dt;
}
if (x960_ > 0.f) {
x960_ -= dt;
}
if (x97c_ > 0.f) {
x97c_ -= dt;
}
if (x958_ > 0.f) {
x958_ -= dt;
}
if (x968_interestTimer < x56c_sheegothData.GetMaxInterestTime()) {
x968_interestTimer += dt;
}
}
void CIceSheegoth::sub_8019e6f0(CStateManager& mgr) {} void CIceSheegoth::sub_8019e6f0(CStateManager& mgr) {}
void CIceSheegoth::SetPassthroughVulnerability(CStateManager& mgr) { void CIceSheegoth::SetPassthroughVulnerability(CStateManager& mgr) {
for (size_t i = 0; i < xa2c_collisionManager->GetNumCollisionActors(); ++i) { for (size_t i = 0; i < xa2c_collisionManager->GetNumCollisionActors(); ++i) {
@ -1114,7 +1133,7 @@ void CIceSheegoth::UpdateHealthInfo(CStateManager& mgr) {
hpDelta = std::max(hpDelta, x970_maxHp - colAct->GetHealthInfo(mgr)->GetHP()); hpDelta = std::max(hpDelta, x970_maxHp - colAct->GetHealthInfo(mgr)->GetHP());
} }
for (TUniqueId uid : xafc_) { for (TUniqueId uid : xafc_gillColliders) {
if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(uid)) { if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(uid)) {
hpDelta = std::max(hpDelta, x970_maxHp - colAct->GetHealthInfo(mgr)->GetHP()); hpDelta = std::max(hpDelta, x970_maxHp - colAct->GetHealthInfo(mgr)->GetHP());
} }
@ -1130,7 +1149,7 @@ void CIceSheegoth::UpdateHealthInfo(CStateManager& mgr) {
if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(xaf8_mouthCollider)) { if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(xaf8_mouthCollider)) {
colAct->HealthInfo(mgr)->SetHP(x970_maxHp); colAct->HealthInfo(mgr)->SetHP(x970_maxHp);
} }
for (TUniqueId uid : xafc_) { for (TUniqueId uid : xafc_gillColliders) {
if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(uid)) { if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(uid)) {
colAct->HealthInfo(mgr)->SetHP(x970_maxHp); colAct->HealthInfo(mgr)->SetHP(x970_maxHp);
} }
@ -1145,8 +1164,21 @@ void CIceSheegoth::UpdateHealthInfo(CStateManager& mgr) {
Death(mgr, zeus::skZero3f, EScriptObjectState::DeathRattle); Death(mgr, zeus::skZero3f, EScriptObjectState::DeathRattle);
} }
} }
void CIceSheegoth::sub_8019f5cc(float dt, CStateManager& mgr) {}
void CIceSheegoth::SetSteeringSpeed(float dt, CStateManager& mgr) {
const float steeringSpeedRange = x95c_ > 0.f ? 1.f : x944_;
if (steeringSpeedRange > x948_) {
x948_ = std::max(steeringSpeedRange, x948_ - (2.f * dt));
} else if (steeringSpeedRange < x948_) {
x948_ = std::min(steeringSpeedRange, x948_ + (2.f * dt));
}
GetBodyController()->GetCommandMgr().SetSteeringSpeedRange(x948_, x948_);
}
void CIceSheegoth::UpdateParticleEffects(float dt, CStateManager& mgr) {} void CIceSheegoth::UpdateParticleEffects(float dt, CStateManager& mgr) {}
void CIceSheegoth::UpdateAttackPosition(CStateManager& mgr, zeus::CVector3f& attackPos) { void CIceSheegoth::UpdateAttackPosition(CStateManager& mgr, zeus::CVector3f& attackPos) {
attackPos = GetTranslation(); attackPos = GetTranslation();
if (x954_attackTimeLeft > 0.f) { if (x954_attackTimeLeft > 0.f) {
@ -1159,6 +1191,7 @@ void CIceSheegoth::UpdateAttackPosition(CStateManager& mgr, zeus::CVector3f& att
attackPos += x2fc_minAttackRange * distVec.normalized(); attackPos += x2fc_minAttackRange * distVec.normalized();
} }
} }
bool CIceSheegoth::sub_8019ecdc(CStateManager& mgr, float minAngle) { bool CIceSheegoth::sub_8019ecdc(CStateManager& mgr, float minAngle) {
const zeus::CVector3f plAimPos = const zeus::CVector3f plAimPos =
mgr.GetPlayer().GetAimPosition(mgr, GetModelData()->GetAnimationData()->GetSpeedScale() > 0.f mgr.GetPlayer().GetAimPosition(mgr, GetModelData()->GetAnimationData()->GetSpeedScale() > 0.f
@ -1173,7 +1206,7 @@ void CIceSheegoth::SetMouthVulnerability(CStateManager& mgr, bool isVulnerable)
} }
} }
void CIceSheegoth::SetGillVulnerability(CStateManager& mgr, bool isVulnerable) { void CIceSheegoth::SetGillVulnerability(CStateManager& mgr, bool isVulnerable) {
for (TUniqueId uid : xafc_) { for (TUniqueId uid : xafc_gillColliders) {
if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(uid)) { if (TCastToPtr<CCollisionActor> colAct = mgr.ObjectById(uid)) {
colAct->SetDamageVulnerability(isVulnerable ? x56c_sheegothData.Get_x18() colAct->SetDamageVulnerability(isVulnerable ? x56c_sheegothData.Get_x18()
: CDamageVulnerability::ImmuneVulnerabilty()); : CDamageVulnerability::ImmuneVulnerabilty());
@ -1189,5 +1222,34 @@ void CIceSheegoth::SetCollisionActorExtendedTouchBounds(CStateManager& mgr, cons
} }
} }
} }
void CIceSheegoth::sub_801a0708(CStateManager& mgr) {} void CIceSheegoth::ShakePlayer(CStateManager& mgr) {
const zeus::CVector3f posDiff = mgr.GetPlayer().GetTranslation() - GetTranslation();
const float magnitude = (0.5f - (0.01f * posDiff.magnitude()));
if (magnitude > 0.f) {
bool applyImpulseToPlayer = true;
if (mgr.GetPlayer().GetSurfaceRestraint() != CPlayer::ESurfaceRestraints::Air &&
!mgr.GetPlayer().IsInWaterMovement()) {
if (mgr.GetCameraManager()->GetCurrentCameraId() ==
mgr.GetCameraManager()->GetFirstPersonCamera()->GetUniqueId()) {
mgr.GetCameraManager()->AddCameraShaker(
CCameraShakeData::BuildPatternedExplodeShakeData(GetTranslation(), 0.5f, magnitude, 50.f), true);
}
applyImpulseToPlayer = xb28_27_;
}
if (applyImpulseToPlayer) {
const zeus::CVector3f direction = magnitude * ((xb28_27_ ? 40.f : 25.f) * zeus::skUp);
zeus::CVector3f impulse = zeus::skZero3f;
if (x978_ < posDiff.magnitude() && xb28_27_ && posDiff.toVec2f().canBeNormalized()) {
impulse = magnitude * (12.5f * posDiff.toVec2f().normalized());
}
mgr.GetPlayer().ApplyImpulseWR(mgr.GetPlayer().GetMass() * (direction + impulse), zeus::CAxisAngle{});
mgr.GetPlayer().SetMoveState(CPlayer::EPlayerMovementState::ApplyJump, mgr);
}
}
if (xb28_28_) {
sub_8019ebf0(mgr, 0.25f * x56c_sheegothData.Get_x170());
}
}
} // namespace urde::MP1 } // namespace urde::MP1

View File

@ -63,7 +63,7 @@ public:
[[nodiscard]] float Get_x1b0() const { return x1b0_; } [[nodiscard]] float Get_x1b0() const { return x1b0_; }
[[nodiscard]] CDamageInfo Get_x1b8() const { return x1b8_; } [[nodiscard]] CDamageInfo Get_x1b8() const { return x1b8_; }
[[nodiscard]] float Get_x1d8() const { return x1d8_; } [[nodiscard]] float Get_x1d8() const { return x1d8_; }
[[nodiscard]] float Get_x1dc() const { return x1dc_; } [[nodiscard]] float Get_x1dc() const { return x1dc_; }
[[nodiscard]] float GetMaxInterestTime() const { return x1e0_maxInterestTime; } [[nodiscard]] float GetMaxInterestTime() const { return x1e0_maxInterestTime; }
[[nodiscard]] CAssetId Get_x1e4() const { return x1e4_; } [[nodiscard]] CAssetId Get_x1e4() const { return x1e4_; }
[[nodiscard]] s16 Get_x1e8() const { return x1e8_; } [[nodiscard]] s16 Get_x1e8() const { return x1e8_; }
@ -123,7 +123,7 @@ class CIceSheegoth : public CPatterned {
CSegId xaf4_mouthLocator; CSegId xaf4_mouthLocator;
TUniqueId xaf6_ = kInvalidUniqueId; TUniqueId xaf6_ = kInvalidUniqueId;
TUniqueId xaf8_mouthCollider = kInvalidUniqueId; TUniqueId xaf8_mouthCollider = kInvalidUniqueId;
rstl::reserved_vector<TUniqueId, 2> xafc_; rstl::reserved_vector<TUniqueId, 2> xafc_gillColliders;
rstl::reserved_vector<TUniqueId, 10> xb04_; rstl::reserved_vector<TUniqueId, 10> xb04_;
rstl::reserved_vector<CSegId, 7> xb1c_; rstl::reserved_vector<CSegId, 7> xb1c_;
bool xb28_24_shotAt : 1; bool xb28_24_shotAt : 1;
@ -142,10 +142,10 @@ class CIceSheegoth : public CPatterned {
bool xb29_29_ : 1; bool xb29_29_ : 1;
void UpdateTouchBounds(); void UpdateTouchBounds();
bool sub_8019fc84(TUniqueId uid) { return xaf8_mouthCollider == uid; } bool IsMouthCollider(TUniqueId uid) { return xaf8_mouthCollider == uid; }
bool sub_8019fc40(const CEntity* ent) const { bool IsGillCollider(const CEntity* ent) const {
return std::find_if(xafc_.cbegin(), xafc_.cend(), [&ent](TUniqueId uid) { return uid == ent->GetUniqueId(); }) != return std::find_if(xafc_gillColliders.cbegin(), xafc_gillColliders.cend(),
xafc_.cend(); [&ent](TUniqueId uid) { return uid == ent->GetUniqueId(); }) != xafc_gillColliders.cend();
} }
void sub_8019ebf0(CStateManager& mgr, float damage); void sub_8019ebf0(CStateManager& mgr, float damage);
void ApplyWeaponDamage(CStateManager& mgr, TUniqueId sender); void ApplyWeaponDamage(CStateManager& mgr, TUniqueId sender);
@ -157,12 +157,12 @@ class CIceSheegoth : public CPatterned {
void SetupCollisionActorManager(CStateManager& mgr); void SetupCollisionActorManager(CStateManager& mgr);
void SetupHealthInfo(CStateManager& mgr); void SetupHealthInfo(CStateManager& mgr);
void AttractProjectiles(CStateManager& mgr); void AttractProjectiles(CStateManager& mgr);
void sub_801a0b8c(float dt); void UpdateTimers(float dt);
void sub_8019e6f0(CStateManager& mgr); void sub_8019e6f0(CStateManager& mgr);
void SetPassthroughVulnerability(CStateManager& mgr); void SetPassthroughVulnerability(CStateManager& mgr);
void PreventWorldCollisions(float dt, CStateManager& mgr); void PreventWorldCollisions(float dt, CStateManager& mgr);
void UpdateHealthInfo(CStateManager& mgr); void UpdateHealthInfo(CStateManager& mgr);
void sub_8019f5cc(float dt, CStateManager& mgr); void SetSteeringSpeed(float dt, CStateManager& mgr);
void SetPathFindMode(EPathFindMode mode) { x928_pathFindMode = mode; } void SetPathFindMode(EPathFindMode mode) { x928_pathFindMode = mode; }
void UpdateParticleEffects(float dt, CStateManager& mgr); void UpdateParticleEffects(float dt, CStateManager& mgr);
bool sub_801a1794(CStateManager& mgr) const { bool sub_801a1794(CStateManager& mgr) const {
@ -174,7 +174,7 @@ class CIceSheegoth : public CPatterned {
bool sub_8019ecdc(CStateManager& mgr, float minAngle); bool sub_8019ecdc(CStateManager& mgr, float minAngle);
void SetMouthVulnerability(CStateManager& mgr, bool isVulnerable); void SetMouthVulnerability(CStateManager& mgr, bool isVulnerable);
void SetGillVulnerability(CStateManager& mgr, bool isVulnerable); void SetGillVulnerability(CStateManager& mgr, bool isVulnerable);
void sub_801a0708(CStateManager& mgr); void ShakePlayer(CStateManager& mgr);
void SetCollisionActorExtendedTouchBounds(CStateManager& mgr, const zeus::CVector3f& extents); void SetCollisionActorExtendedTouchBounds(CStateManager& mgr, const zeus::CVector3f& extents);
void UpdateAttackPosition(CStateManager& mgr, zeus::CVector3f& attackPos); void UpdateAttackPosition(CStateManager& mgr, zeus::CVector3f& attackPos);