prime/src/MetroidPrime/ScriptObjects/CScriptSteam.cpp
Henrique Gemignani Passos Lima e36d4654dc Add CScriptSteam
Former-commit-id: 92348990970f6ca7feb7ef0b3b627a91767a9b85
2022-10-21 15:01:25 +03:00

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); }