mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-10-23 16:55:47 +00:00
69 lines
2.6 KiB
C++
69 lines
2.6 KiB
C++
#include "MetroidPrime/ScriptObjects/CScriptDistanceFog.hpp"
|
|
|
|
#include "MetroidPrime/CAreaFog.hpp"
|
|
#include "MetroidPrime/CGameArea.hpp"
|
|
#include "MetroidPrime/CStateManager.hpp"
|
|
#include "MetroidPrime/CWorld.hpp"
|
|
|
|
#include "Kyoto/Math/CloseEnough.hpp"
|
|
|
|
CScriptDistanceFog::CScriptDistanceFog(TUniqueId uid, const rstl::string& name,
|
|
const CEntityInfo& info, ERglFogMode mode,
|
|
const CColor& color, const CVector2f& range,
|
|
float colorDelta, const CVector2f& rangeDelta, bool expl,
|
|
bool active, float thermalTarget, float thermalSpeed,
|
|
float xrayTarget, float xraySpeed)
|
|
: CEntity(uid, info, active, name)
|
|
, x34_mode(mode)
|
|
, x38_color(color)
|
|
, x3c_range(range)
|
|
, x44_colorDelta(colorDelta)
|
|
, x48_rangeDelta(rangeDelta)
|
|
, x50_thermalTarget(thermalTarget)
|
|
, x54_thermalSpeed(thermalSpeed)
|
|
, x58_xrayTarget(xrayTarget)
|
|
, x5c_xraySpeed(xraySpeed)
|
|
, x60_explicit(expl)
|
|
, x61_nonZero(!close_enough(rangeDelta, CVector2f(0.f, 0.f)) || !close_enough(colorDelta, 0.f)) {}
|
|
|
|
CScriptDistanceFog::~CScriptDistanceFog() {}
|
|
|
|
void CScriptDistanceFog::Accept(IVisitor& visitor) { visitor.Visit(*this); }
|
|
|
|
void CScriptDistanceFog::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId,
|
|
CStateManager& stateMgr) {
|
|
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
|
|
|
|
if (GetCurrentAreaId() != kInvalidAreaId && GetActive()) {
|
|
switch (msg) {
|
|
case kSM_InitializedInArea:
|
|
if (x60_explicit) {
|
|
CGameArea::CAreaFog* fog = stateMgr.World()->Area(GetCurrentAreaId())->AreaFog();
|
|
if (x34_mode == kRFM_None) {
|
|
fog->DisableFog();
|
|
} else {
|
|
fog->SetFogExplicit(x34_mode, x38_color, x3c_range);
|
|
}
|
|
}
|
|
break;
|
|
case kSM_Action:
|
|
if (x61_nonZero) {
|
|
CGameArea::CAreaFog* fog = stateMgr.World()->Area(GetCurrentAreaId())->AreaFog();
|
|
if (x34_mode != kRFM_None) {
|
|
fog->FadeFog(x34_mode, x38_color, x3c_range, x44_colorDelta, x48_rangeDelta);
|
|
} else {
|
|
fog->RollFogOut(x48_rangeDelta.GetX(), x44_colorDelta, x38_color);
|
|
}
|
|
}
|
|
|
|
if (!close_enough(x54_thermalSpeed, 0.f)) {
|
|
stateMgr.World()->Area(GetCurrentAreaId())->SetThermalSpeedAndTarget(x54_thermalSpeed, x50_thermalTarget);
|
|
}
|
|
if (!close_enough(x5c_xraySpeed, 0.f)) {
|
|
stateMgr.World()->Area(GetCurrentAreaId())->SetXRaySpeedAndTarget(x5c_xraySpeed, x58_xrayTarget);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|