CThardus: Fix knee collider, attempt to fix healthbar

This commit is contained in:
Phillip Stephens 2020-09-12 21:07:39 -07:00
parent e512ba1336
commit e64591bbf8
Signed by: Antidote
GPG Key ID: F8BEE4C83DACA60D
4 changed files with 41 additions and 24 deletions

View File

@ -9,6 +9,7 @@
#include "Runtime/Collision/CCollisionActor.hpp"
#include "Runtime/Collision/CCollisionActorManager.hpp"
#include "Runtime/MP1/CSamusHud.hpp"
#include "Runtime/MP1/World/CIceAttackProjectile.hpp"
#include "Runtime/MP1/World/CThardusRockProjectile.hpp"
#include "Runtime/Weapon/CGameProjectile.hpp"
#include "Runtime/World/CActorParameters.hpp"
@ -20,7 +21,6 @@
#include "Runtime/World/CScriptDistanceFog.hpp"
#include "Runtime/World/CScriptWaypoint.hpp"
#include "Runtime/World/CWorld.hpp"
#include "Runtime/MP1/World/CIceAttackProjectile.hpp"
#include "TCastTo.hpp" // Generated file, do not modify include path
@ -29,7 +29,7 @@
namespace urde::MP1 {
namespace {
constexpr std::array<SSphereJointInfo, 7> skDamageableSphereJointInfoList1{{
{"R_Knee", 1.f},
{"R_knee", 1.f},
{"R_Elbow_Collision_LCTR", 1.5f},
{"L_Elbow_Collision_LCTR", 1.5f},
{"L_Knee_Collision_LCTR", 1.f},
@ -52,7 +52,7 @@ constexpr std::array<SAABoxJointInfo, 2> skFootCollision{{
}};
constexpr std::array skSearchJointNames{
"R_Knee"sv,
"R_knee"sv,
"R_Elbow_Collision_LCTR"sv,
"L_Elbow_Collision_LCTR"sv,
"L_Knee_Collision_LCTR"sv,
@ -314,9 +314,9 @@ void CThardus::Think(float dt, CStateManager& mgr) {
sub801dbf34(dt, mgr);
if (!sub801dc2c8()) {
if (x648_currentRock < x610_destroyableRocks.size() - 2)
if (x648_currentRock < x610_destroyableRocks.size() - 2) {
x690_ = 1.f;
else {
} else {
x690_ = 1.f;
}
} else {
@ -347,12 +347,15 @@ void CThardus::Think(float dt, CStateManager& mgr) {
sub801dd608(mgr);
sub801dcfa4(mgr);
if (x610_destroyableRocks.size() <= x648_currentRock)
if (x610_destroyableRocks.size() <= x648_currentRock) {
Death(mgr, zeus::skZero3f, EScriptObjectState::DeathRattle);
}
if (mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Thermal) {
x402_29_drawParticles = false;
UpdateNonDestroyableCollisionActorMaterials(EUpdateMaterialMode::Remove, EMaterialTypes::ProjectilePassthrough, mgr);
for (size_t i = 0; i < x610_destroyableRocks.size(); ++i) {
if (CActor* act = static_cast<CActor*>(mgr.ObjectById(x610_destroyableRocks[i]))) {
if (auto* act = static_cast<CActor*>(mgr.ObjectById(x610_destroyableRocks[i]))) {
if (x648_currentRock == i && !x688_ && !x93c_ && !x909_ && !x93d_) {
act->AddMaterial(EMaterialTypes::Orbit, mgr);
act->AddMaterial(EMaterialTypes::Target, mgr);
@ -362,14 +365,16 @@ void CThardus::Think(float dt, CStateManager& mgr) {
}
}
}
if (x688_)
if (x688_) {
x688_ = false;
}
} else {
UpdateNonDestroyableCollisionActorMaterials(EUpdateMaterialMode::Remove, EMaterialTypes::ProjectilePassthrough,
x402_29_drawParticles = true;
UpdateNonDestroyableCollisionActorMaterials(EUpdateMaterialMode::Add, EMaterialTypes::ProjectilePassthrough,
mgr);
for (size_t i = 0; i < x610_destroyableRocks.size(); ++i) {
if (CActor* act = static_cast<CActor*>(mgr.ObjectById(x610_destroyableRocks[i]))) {
if (auto* act = static_cast<CActor*>(mgr.ObjectById(x610_destroyableRocks[i]))) {
if (!x688_ && !x93c_ && !x909_ && !x93d_) {
bool found = act->GetName().find("Neck_1"sv) != std::string::npos;
if (!found || !x6b0_[x648_currentRock] || x648_currentRock == x610_destroyableRocks.size() - 1) {
@ -394,6 +399,7 @@ void CThardus::Think(float dt, CStateManager& mgr) {
}
}
}
if (x644_ == 1) {
UpdateExcludeList(x5f0_rockColliders, EUpdateMaterialMode::Add, EMaterialTypes::Player, mgr);
UpdateExcludeList(x5f4_, EUpdateMaterialMode::Add, EMaterialTypes::Player, mgr);
@ -604,7 +610,7 @@ void CThardus::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMa
if (TCastToConstPtr<CGameProjectile> proj = mgr.GetObjectById(lastTouchedObj)) {
if (GetBodyController()->GetBodyStateInfo().GetCurrentAdditiveStateId() !=
pas::EAnimationState::AdditiveReaction &&
rock->GetThrmalMag() <= 0.f) {
rock->Get_x324() <= 0.f) {
GetBodyController()->GetCommandMgr().DeliverCmd(
CBCAdditiveReactionCmd(pas::EAdditiveReactionType::Five, 1.f, false));
}
@ -993,8 +999,9 @@ void CThardus::TelegraphAttack(CStateManager& mgr, EStateMsg msg, float arg) {
if (GetBodyController()->GetBodyStateInfo().GetCurrentStateId() != pas::EAnimationState::ProjectileAttack) {
GetBodyController()->GetCommandMgr().DeliverCmd(CBCProjectileAttackCmd(pas::ESeverity::One, {}, false));
x5ec_ = 0;
} else
} else {
x5ec_ = 2;
}
} else if (x5ec_ == 2 &&
GetBodyController()->GetBodyStateInfo().GetCurrentStateId() != pas::EAnimationState::ProjectileAttack) {
x5ec_ = 3;
@ -1243,7 +1250,7 @@ void CThardus::sub801dae2c(CStateManager& mgr, u32 rockIndex) {
hInfo = rockCol->HealthInfo(mgr);
hInfo->SetHP(hp);
hInfo->SetKnockbackResistance(2.f);
auto light = static_cast<CGameLight*>(mgr.ObjectById(x6c0_rockLights[rockIndex]));
auto* light = static_cast<CGameLight*>(mgr.ObjectById(x6c0_rockLights[rockIndex]));
light->SetActive(true);
if (mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Thermal ||
(mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::Thermal && x7c4_ != 3)) {
@ -1293,10 +1300,11 @@ void CThardus::UpdateNonDestroyableCollisionActorMaterials(EUpdateMaterialMode m
urde::CStateManager& mgr) {
for (const auto& uid : x634_nonDestroyableActors) {
if (TCastToPtr<CCollisionActor> col = mgr.ObjectById(uid)) {
if (mode == EUpdateMaterialMode::Remove)
if (mode == EUpdateMaterialMode::Remove) {
col->RemoveMaterial(mat, mgr);
else if (mode == EUpdateMaterialMode::Add)
} else if (mode == EUpdateMaterialMode::Add) {
col->AddMaterial(mat, mgr);
}
*col->HealthInfo(mgr) = CHealthInfo(1000000.0f, 10.f);
}
@ -1308,10 +1316,11 @@ void CThardus::UpdateExcludeList(const std::unique_ptr<CCollisionActorManager>&
for (size_t i = 0; i < colMgr->GetNumCollisionActors(); ++i) {
if (TCastToPtr<CActor> colAct = mgr.ObjectById(colMgr->GetCollisionDescFromIndex(i).GetCollisionActorId())) {
CMaterialList exclude = colAct->GetMaterialFilter().GetExcludeList();
if (mode == EUpdateMaterialMode::Remove)
if (mode == EUpdateMaterialMode::Remove) {
exclude.Remove(w2);
else if (mode == EUpdateMaterialMode::Add)
} else if (mode == EUpdateMaterialMode::Add) {
exclude.Add(w2);
}
colAct->SetMaterialFilter(
CMaterialFilter::MakeIncludeExclude(colAct->GetMaterialFilter().GetIncludeList(), exclude));
@ -1471,7 +1480,7 @@ void CThardus::ApplyCameraShake(float magnitude, float sfxDistance, float durati
void CThardus::UpdateHealthInfo(CStateManager& mgr) {
// TODO: This isn't quite right, need to figure out why
float hp = 0.f;
for (size_t i = 0; i < x610_destroyableRocks.size(); ++i) {
for (size_t i = x648_currentRock; i < x610_destroyableRocks.size(); ++i) {
float fVar1 = x648_currentRock == (x610_destroyableRocks.size() - 1) ? 2.f * x6a4_ : x6a4_;
if (auto rock = static_cast<CDestroyableRock*>(mgr.ObjectById(x610_destroyableRocks[i]))) {
if (!rock->IsUsingPhazonModel()) {
@ -1533,5 +1542,4 @@ zeus::CVector2f CThardus::sub801dc60c(float arg, CStateManager& mgr) {
return ret;
}
} // namespace urde::MP1

View File

@ -169,6 +169,7 @@ class CThardus : public CPatterned {
zeus::CVector3f sub801de434(CStateManager& mgr);
zeus::CVector2f sub801dc60c(float f1, CStateManager& mgr);
void sub801dbc40();
void UpdateNonDestroyableActors(bool remove, EMaterialTypes mat, CStateManager& mgr);
std::optional<CTexturedQuadFilter> m_flareFilter;

View File

@ -28,7 +28,12 @@ void CDestroyableRock::PreRender(CStateManager& mgr, const zeus::CFrustum& frust
if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::Thermal) {
xb4_drawFlags = CModelFlags(0, 0, 1, zeus::skWhite);
} else {
if (x330_.r() >= 1.f && x330_.g() >= 1.f && x330_.b() >= 1.f) {
u8 r;
u8 g;
u8 b;
u8 a;
x330_.toRGBA8(r, g, b, a);
if ((r & g & b) == 0xFF) {
xb4_drawFlags = CModelFlags(0, 0, 3, zeus::skWhite);
} else {
x330_.a() = 1.f;
@ -40,13 +45,16 @@ void CDestroyableRock::PreRender(CStateManager& mgr, const zeus::CFrustum& frust
CActor::PreRender(mgr, frustum);
}
void CDestroyableRock::Think(float dt, CStateManager& mgr) {
if (!GetActive())
if (!GetActive()) {
return;
}
float damageMag = x32c_thermalMag;
if (x324_ > 0.f) {
x324_ = zeus::max(0.f, x324_ - dt);
x330_ = zeus::CColor::lerp(zeus::skBlack, zeus::CColor(0.5, 0.f, 0.f, 1.f), x324_);
x324_ = std::max(0.f, x324_ - dt);
zeus::CColor tmpColor = zeus::CColor(0.5, 0.f, 0.f, 1.f);
// TODO: Use skBlack once CModelFlags is properly reverse engineered
x330_ = zeus::CColor::lerp(/*zeus::skBlack*/ zeus::skWhite, tmpColor, x324_);
damageMag = ((x335_usePhazonModel ? 0.5f : 0.25f) * x324_) + damageMag;
}
xd0_damageMag = damageMag;

View File

@ -52,7 +52,7 @@ public:
void Think(float dt, CStateManager& mgr) override;
float GetThrmalMag() const { return x324_; }
float Get_x324() const { return x324_; }
void SetThermalMag(float val) { x32c_thermalMag = val; }
void SetIsCold(bool v) { x334_isCold = v; }
bool IsUsingPhazonModel() const { return x335_usePhazonModel; }