CScriptSpecialFunction: Updates from matching decomp

This commit is contained in:
Luke Street 2022-10-09 13:07:51 -04:00
parent 93eca39a31
commit 5394e92735
2 changed files with 47 additions and 26 deletions

View File

@ -375,19 +375,29 @@ void CScriptSpecialFunction::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId
}
break;
}
case ESpecialFunction::RumbleEffect:
if (msg == EScriptObjectMessage::Action) {
const s32 rumbFx = s32(x100_float2);
// Retro originally did not check the upper bounds, this could potentially cause a crash
// with some runtimes, so let's make sure we're not out of bounds in either direction.
if (rumbFx < 0 || rumbFx >= 6) {
case ESpecialFunction::RumbleEffect: {
if (msg != EScriptObjectMessage::Action) {
break;
}
mgr.GetRumbleManager().Rumble(mgr, fxTranslation[rumbFx], 1.f, ERumblePriority::One);
int rumbFxIdx = int(x100_float2);
if (rumbFxIdx < 0 || rumbFxIdx >= fxTranslation.size()) {
break;
}
ERumbleFxId rumbFx = fxTranslation[rumbFxIdx];
uint param3 = x104_float3;
if ((param3 & 1) != 0) {
mgr.GetRumbleManager().Rumble(mgr, rumbFx, 1.f, ERumblePriority::One);
} else {
zeus::CVector3f pos = GetTranslation();
if ((param3 & 2) != 0) {
if (const CActor* act = TCastToConstPtr<CActor>(mgr.GetObjectById(uid))) {
pos = act->GetTranslation();
}
}
mgr.GetRumbleManager().Rumble(mgr, pos, rumbFx, xfc_float1, ERumblePriority::One);
}
break;
}
case ESpecialFunction::InventoryActivator: {
if (msg == EScriptObjectMessage::Action && mgr.GetPlayerState()->HasPowerUp(x1c4_item)) {
SendScriptMsgs(EScriptObjectState::Zero, mgr, EScriptObjectMessage::None);
@ -506,11 +516,12 @@ void CScriptSpecialFunction::PreRender(CStateManager&, const zeus::CFrustum& fru
if (x1e4_30_ == val) {
return;
}
if (!val) {
x1e4_29_frustumExited = true;
} else {
if (val) {
x1e4_28_frustumEntered = true;
} else {
x1e4_29_frustumExited = true;
}
x1e4_30_ = val;
}
void CScriptSpecialFunction::AddToRenderer(const zeus::CFrustum&, CStateManager& mgr) {
@ -525,7 +536,7 @@ void CScriptSpecialFunction::AddToRenderer(const zeus::CFrustum&, CStateManager&
void CScriptSpecialFunction::Render(CStateManager& mgr) {
if (xe8_function == ESpecialFunction::FogVolume) {
const float z = mgr.IntegrateVisorFog(xfc_float1 * std::sin(CGraphics::GetSecondsMod900()));
const float z = mgr.IntegrateVisorFog(xfc_float1 * std::sin(CGraphics::GetSecondsMod900() * x100_float2));
if (z > 0.f) {
zeus::CVector3f max = GetTranslation() + x10c_vector3f;
max.z() += z;
@ -634,6 +645,10 @@ void CScriptSpecialFunction::ThinkPlayerFollowLocator(float, CStateManager& mgr)
const auto search = mgr.GetIdListForScript(conn.x8_objId);
for (auto it = search.first; it != search.second; ++it) {
if (const TCastToConstPtr<CActor> act = mgr.GetObjectById(it->second)) {
if (!act->GetModelData() || !act->GetModelData()->HasAnimData()) {
continue;
}
const zeus::CTransform xf = act->GetTransform() * act->GetLocatorTransform(xec_locatorName);
CPlayer& pl = mgr.GetPlayer();
pl.SetTransform(xf);
@ -832,10 +847,9 @@ void CScriptSpecialFunction::ThinkObjectFollowObject(float, CStateManager& mgr)
}
void CScriptSpecialFunction::ThinkChaffTarget(float dt, CStateManager& mgr) {
const zeus::CAABox box(5.f - GetTranslation(), 5.f + GetTranslation());
const zeus::CAABox box(GetTranslation() - 5.f, GetTranslation() + 5.f);
EntityList nearList;
mgr.BuildNearList(nearList, box, CMaterialFilter::MakeInclude({EMaterialTypes::Projectile}), nullptr);
auto& filter = mgr.GetCameraFilterPass(7);
for (const auto& uid : nearList) {
if (const TCastToPtr<CEnergyProjectile> proj = mgr.ObjectById(uid)) {
@ -843,6 +857,9 @@ void CScriptSpecialFunction::ThinkChaffTarget(float dt, CStateManager& mgr) {
proj->Set3d0_26(true);
if (mgr.GetPlayer().GetAreaIdAlways() == GetAreaIdAlways()) {
mgr.GetPlayer().SetHudDisable(x100_float2, 0.5f, 2.5f);
x194_ = xfc_float1;
auto& filter = mgr.GetCameraFilterPass(7);
filter.SetFilter(EFilterType::Blend, EFilterShape::Fullscreen, 0.f, zeus::skWhite, CAssetId());
filter.DisableFilter(0.1f);
}
@ -859,7 +876,7 @@ void CScriptSpecialFunction::ThinkChaffTarget(float dt, CStateManager& mgr) {
mgr.GetPlayerState()->GetStaticInterference().AddSource(GetUniqueId(), intfMag, .5f);
if (mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::Scan) {
if (mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::Thermal) {
mgr.GetPlayer().AddOrbitDisableSource(mgr, GetUniqueId());
} else {
mgr.GetPlayer().RemoveOrbitDisableSource(GetUniqueId());
@ -906,7 +923,7 @@ void CScriptSpecialFunction::ThinkSaveStation(float, CStateManager& mgr) {
}
void CScriptSpecialFunction::ThinkRainSimulator(float, CStateManager& mgr) {
if ((float(mgr.GetInputFrameIdx()) / 3600.f) < 0.5f) {
if ((static_cast< float >(mgr.GetInputFrameIdx() % 3600)) / 3600.f < 0.5f) {
SendScriptMsgs(EScriptObjectState::MaxReached, mgr, EScriptObjectMessage::None);
} else {
SendScriptMsgs(EScriptObjectState::Zero, mgr, EScriptObjectMessage::None);
@ -975,23 +992,27 @@ bool CScriptSpecialFunction::ShouldSkipCinematic(CStateManager& stateMgr) const
return g_GameState->SystemOptions().GetCinematicState(stateMgr.GetWorld()->IGetWorldAssetId(), GetEditorId());
}
void CScriptSpecialFunction::DeleteEmitter(const CSfxHandle& handle) {
void CScriptSpecialFunction::DeleteEmitter(CSfxHandle& handle) {
if (!handle) {
return;
}
CSfxManager::RemoveEmitter(handle);
handle = CSfxHandle();
}
u32 CScriptSpecialFunction::GetSpecialEnding(const CStateManager& mgr) const {
const u32 rate = (mgr.GetPlayerState()->CalculateItemCollectionRate() * 100) / mgr.GetPlayerState()->GetPickupTotal();
const int rate = (mgr.GetPlayerState()->CalculateItemCollectionRate() * 100) / mgr.GetPlayerState()->GetPickupTotal();
int result;
if (rate < 75) {
return 0;
}
result = 0;
} else {
result = 2;
if (rate < 100) {
return 1;
result = 1;
}
return 2;
}
return result;
}
void CScriptSpecialFunction::AddOrUpdateEmitter(float pitch, CSfxHandle& handle, u16 id, const zeus::CVector3f& pos,

View File

@ -141,7 +141,7 @@ public:
bool ShouldSkipCinematic(CStateManager& stateMgr) const;
void DeleteEmitter(const CSfxHandle& handle);
void DeleteEmitter(CSfxHandle& handle);
u32 GetSpecialEnding(const CStateManager&) const;
void AddOrUpdateEmitter(float pitch, CSfxHandle& handle, u16 id, const zeus::CVector3f& pos, float vol);
};