prime/src/MetroidPrime/ScriptObjects/CScriptDistanceFog.cpp
Henrique Gemignani Passos Lima ea5e1d66ce
Fix build
2022-11-07 14:39:00 +02:00

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