Thardus: fix locking onto destroyed rocks

This commit is contained in:
Phillip Stephens 2020-09-13 13:24:16 -07:00
parent 951fe12f41
commit 4c3d7193b1
Signed by: Antidote
GPG Key ID: F8BEE4C83DACA60D
2 changed files with 14 additions and 11 deletions

View File

@ -249,7 +249,7 @@ void CThardus::sub801dcfa4(CStateManager& mgr) {
TUniqueId rockId = x610_destroyableRocks[j]; TUniqueId rockId = x610_destroyableRocks[j];
if (auto* rock = static_cast<CDestroyableRock*>(mgr.ObjectById(rockId))) { if (auto* rock = static_cast<CDestroyableRock*>(mgr.ObjectById(rockId))) {
if (x909_) { if (x909_) {
*rock->HealthInfo(mgr) = CHealthInfo(x90c_[j], 0.f); *rock->HealthInfo(mgr) = CHealthInfo(x90c_rockHealths[j], 0.f);
} }
if (j == x648_currentRock && !x93d_) { if (j == x648_currentRock && !x93d_) {
colAct->SetDamageVulnerability(*rock->GetDamageVulnerability()); colAct->SetDamageVulnerability(*rock->GetDamageVulnerability());
@ -264,7 +264,7 @@ void CThardus::sub801dcfa4(CStateManager& mgr) {
if (hInfo->GetHP() > 0.f) { if (hInfo->GetHP() > 0.f) {
*rock->HealthInfo(mgr) = *hInfo; *rock->HealthInfo(mgr) = *hInfo;
if (!x909_) { if (!x909_) {
x90c_[j] = hInfo->GetHP(); x90c_rockHealths[j] = hInfo->GetHP();
} }
} else if (!rock->IsUsingPhazonModel()) { } else if (!rock->IsUsingPhazonModel()) {
sub801dae2c(mgr, j); sub801dae2c(mgr, j);
@ -385,9 +385,9 @@ void CThardus::Think(float dt, CStateManager& mgr) {
if (auto* 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_) { if (!x688_ && !x93c_ && !x909_ && !x93d_) {
bool found = act->GetName().find("Neck_1"sv) != std::string::npos; bool found = act->GetName().find("Neck_1"sv) != std::string::npos;
if (!found || !x6b0_[x648_currentRock] || x648_currentRock == x610_destroyableRocks.size() - 1) { if (!found || !x6b0_destroyedRocks[x648_currentRock] || x648_currentRock == x610_destroyableRocks.size() - 1) {
if (!x6b0_[i]) { if (!x6b0_destroyedRocks[i]) {
if (!found || x6b0_[i]) { if (!found || x6b0_destroyedRocks[i]) {
act->RemoveMaterial(EMaterialTypes::Orbit, mgr); act->RemoveMaterial(EMaterialTypes::Orbit, mgr);
act->RemoveMaterial(EMaterialTypes::Target, mgr); act->RemoveMaterial(EMaterialTypes::Target, mgr);
} }
@ -503,9 +503,9 @@ void CThardus::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMa
} }
case EScriptObjectMessage::Registered: { case EScriptObjectMessage::Registered: {
x610_destroyableRocks.reserve(x5cc_.size()); x610_destroyableRocks.reserve(x5cc_.size());
x6b0_.reserve(x5cc_.size()); x6b0_destroyedRocks.reserve(x5cc_.size());
x6c0_rockLights.reserve(x5cc_.size()); x6c0_rockLights.reserve(x5cc_.size());
x90c_.reserve(x5cc_.size()); x90c_rockHealths.reserve(x5cc_.size());
for (size_t i = 0; i < x5cc_.size(); ++i) { for (size_t i = 0; i < x5cc_.size(); ++i) {
float health = (i == x5cc_.size() - 1) ? 2.f * x6a8_ : x6a8_; float health = (i == x5cc_.size() - 1) ? 2.f * x6a8_ : x6a8_;
TUniqueId rockId = mgr.AllocateUniqueId(); TUniqueId rockId = mgr.AllocateUniqueId();
@ -526,14 +526,14 @@ void CThardus::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMa
{}, {}, {}, {}, true, true, false, false, 0.f, 0.f, 1.f), {}, {}, {}, {}, true, true, false, false, 0.f, 0.f, 1.f),
x5dc_[i], 0)); x5dc_[i], 0));
x610_destroyableRocks.push_back(rockId); x610_destroyableRocks.push_back(rockId);
x6b0_.push_back(false); x6b0_destroyedRocks.push_back(false);
TUniqueId lightId = mgr.AllocateUniqueId(); TUniqueId lightId = mgr.AllocateUniqueId();
auto* gl = new CGameLight(lightId, GetAreaIdAlways(), false, ""sv, {}, GetUniqueId(), auto* gl = new CGameLight(lightId, GetAreaIdAlways(), false, ""sv, {}, GetUniqueId(),
CLight::BuildPoint({}, zeus::skBlue), 0, 0, 0.f); CLight::BuildPoint({}, zeus::skBlue), 0, 0, 0.f);
gl->SetActive(false); gl->SetActive(false);
mgr.AddObject(gl); mgr.AddObject(gl);
x6c0_rockLights.push_back(lightId); x6c0_rockLights.push_back(lightId);
x90c_.push_back(health); x90c_rockHealths.push_back(health);
} }
AddMaterial(EMaterialTypes::ScanPassthrough, mgr); AddMaterial(EMaterialTypes::ScanPassthrough, mgr);
@ -1299,12 +1299,15 @@ void CThardus::sub801dae2c(CStateManager& mgr, u32 rockIndex) {
hInfo = rockCol->HealthInfo(mgr); hInfo = rockCol->HealthInfo(mgr);
hInfo->SetHP(hp); hInfo->SetHP(hp);
hInfo->SetKnockbackResistance(2.f); hInfo->SetKnockbackResistance(2.f);
x6b0_destroyedRocks[rockIndex] = true;
rock->SetThermalMag(1.5f);
auto* light = static_cast<CGameLight*>(mgr.ObjectById(x6c0_rockLights[rockIndex])); auto* light = static_cast<CGameLight*>(mgr.ObjectById(x6c0_rockLights[rockIndex]));
light->SetActive(true); light->SetActive(true);
if (mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Thermal || if (mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Thermal ||
(mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::Thermal && x7c4_ != 3)) { (mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::Thermal && x7c4_ != 3)) {
sub801dc444(mgr, GetTranslation(), x6d4_); sub801dc444(mgr, GetTranslation(), x6d4_);
} }
x90c_rockHealths[rockIndex] = hp;
sub801dbc5c(mgr, rock); sub801dbc5c(mgr, rock);
ProcessSoundEvent(x760_, 1.f, 0, 0.1f, 1000.f, 0.16f, 1.f, zeus::skZero3f, GetTranslation(), mgr.GetNextAreaId(), ProcessSoundEvent(x760_, 1.f, 0, 0.1f, 1000.f, 0.16f, 1.f, zeus::skZero3f, GetTranslation(), mgr.GetNextAreaId(),
mgr, true); mgr, true);

View File

@ -64,7 +64,7 @@ class CThardus : public CPatterned {
float x6a4_; float x6a4_;
float x6a8_; float x6a8_;
float x6ac_; float x6ac_;
std::vector<bool> x6b0_; std::vector<bool> x6b0_destroyedRocks;
std::vector<TUniqueId> x6c0_rockLights; std::vector<TUniqueId> x6c0_rockLights;
CAssetId x6d0_; CAssetId x6d0_;
CAssetId x6d4_; CAssetId x6d4_;
@ -105,7 +105,7 @@ class CThardus : public CPatterned {
CSfxHandle x904_ = 0; CSfxHandle x904_ = 0;
bool x908_ = false; bool x908_ = false;
bool x909_ = false; bool x909_ = false;
std::vector<float> x90c_; std::vector<float> x90c_rockHealths;
TLockedToken<CTexture> x91c_flareTexture; TLockedToken<CTexture> x91c_flareTexture;
TUniqueId x928_currentRockId; TUniqueId x928_currentRockId;
zeus::CVector3f x92c_currentRockPos; zeus::CVector3f x92c_currentRockPos;