mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-08-17 20:11:33 +00:00
70 lines
2.4 KiB
C++
70 lines
2.4 KiB
C++
#include "MetroidPrime/ScriptObjects/CScriptSteam.hpp"
|
|
|
|
#include "MetroidPrime/CEnvFxManager.hpp"
|
|
#include "MetroidPrime/CStateManager.hpp"
|
|
#include "MetroidPrime/Cameras/CCameraManager.hpp"
|
|
#include "MetroidPrime/Player/CPlayer.hpp"
|
|
|
|
#include "Kyoto/Math/CloseEnough.hpp"
|
|
|
|
CScriptSteam::CScriptSteam(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
|
|
const CVector3f& pos, const CAABox& aabb, const CDamageInfo& dInfo,
|
|
const CVector3f& orientedForce, unsigned int flags, bool active,
|
|
CAssetId texture, float f1, float f2, float f3, float f4, bool b1)
|
|
: CScriptTrigger(uid, name, info, pos, aabb, dInfo, orientedForce, flags, active, false, false)
|
|
, x150_(b1)
|
|
, x154_texture(texture)
|
|
, x158_(f1)
|
|
, x15c_alphaInDur(f2 / f1)
|
|
, x160_alphaOutDur(f3 / f1) {
|
|
float r3 = (aabb.GetMaxPoint().GetZ() < aabb.GetMaxPoint().GetY() ? aabb.GetMaxPoint().GetZ()
|
|
: aabb.GetMaxPoint().GetY());
|
|
r3 = (r3 < aabb.GetMaxPoint().GetX() ? r3 : aabb.GetMaxPoint().GetX());
|
|
|
|
if (close_enough(f4, 0.f)) {
|
|
r3 = (r3 < f2 ? r3 : f4);
|
|
}
|
|
|
|
x164_ = r3;
|
|
x168_ = 1.f / x164_;
|
|
}
|
|
|
|
CScriptSteam::~CScriptSteam() {}
|
|
|
|
void CScriptSteam::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) {
|
|
switch (msg) {
|
|
case kSM_Deactivate:
|
|
mgr.Player()->SetVisorSteam(0.f, x15c_alphaInDur, x160_alphaOutDur, kInvalidAssetId, x150_);
|
|
break;
|
|
}
|
|
|
|
CScriptTrigger::AcceptScriptMsg(msg, uid, mgr);
|
|
}
|
|
|
|
void CScriptSteam::Think(float dt, CStateManager& mgr) {
|
|
if (!GetActive()) {
|
|
return;
|
|
}
|
|
|
|
CScriptTrigger::Think(dt, mgr);
|
|
|
|
if (x148_28_playerTriggerProc && mgr.GetCameraManager()->GetFluidCounter() == 0) {
|
|
const CVector3f& eyePos = mgr.GetPlayer()->GetEyePosition();
|
|
const CVector3f& posDiff = (GetTranslation() - eyePos);
|
|
const float mag = posDiff.Magnitude();
|
|
|
|
const float distance =
|
|
(mag >= x164_ ? 0.f : x158_ * CMath::FastCosR((1.5707964f * mag) * x168_));
|
|
mgr.Player()->SetVisorSteam(distance, x15c_alphaInDur, x160_alphaOutDur, x154_texture,
|
|
x150_ == true);
|
|
if (x150_) {
|
|
mgr.EnvFxManager()->SetSplashRate(2.f * distance);
|
|
}
|
|
} else {
|
|
mgr.Player()->SetVisorSteam(0.f, x15c_alphaInDur, x160_alphaOutDur, kInvalidAssetId,
|
|
x150_ == true);
|
|
}
|
|
}
|
|
|
|
void CScriptSteam::Accept(IVisitor& visitor) { visitor.Visit(*this); }
|