#include "CScriptDistanceFog.hpp" #include "CStateManager.hpp" #include "CWorld.hpp" #include "TCastTo.hpp" namespace urde { CScriptDistanceFog::CScriptDistanceFog(TUniqueId uid, std::string_view name, const CEntityInfo& info, ERglFogMode mode, const zeus::CColor& color, const zeus::CVector2f& range, float colorDelta, const zeus::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) { if (zeus::close_enough(rangeDelta, zeus::skZero2f) && zeus::close_enough(colorDelta, 0.f)) x61_nonZero = false; else x61_nonZero = true; } void CScriptDistanceFog::Accept(IVisitor& visitor) { visitor.Visit(this); } void CScriptDistanceFog::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { CEntity::AcceptScriptMsg(msg, objId, stateMgr); if (x4_areaId == kInvalidAreaId || !GetActive()) return; if (msg == EScriptObjectMessage::InitializedInArea) { if (!x60_explicit) return; CGameArea::CAreaFog* fog = stateMgr.GetWorld()->GetArea(x4_areaId)->GetAreaFog(); if (x34_mode == ERglFogMode::None) fog->DisableFog(); else fog->SetFogExplicit(x34_mode, x38_color, x3c_range); } else if (msg == EScriptObjectMessage::Action) { if (!x61_nonZero) return; CGameArea::CAreaFog* fog = stateMgr.GetWorld()->GetArea(x4_areaId)->GetAreaFog(); if (x34_mode == ERglFogMode::None) fog->RollFogOut(x48_rangeDelta.x(), x44_colorDelta, x38_color); else fog->FadeFog(x34_mode, x38_color, x3c_range, x44_colorDelta, x48_rangeDelta); if (zeus::close_enough(x54_thermalSpeed, 0.f) && !zeus::close_enough(x5c_xraySpeed, 0.f)) { CWorld* world = stateMgr.GetWorld(); CGameArea* area = world->GetArea(x4_areaId); area->SetXRaySpeedAndTarget(x5c_xraySpeed, x58_xrayTarget); } else { CWorld* world = stateMgr.GetWorld(); CGameArea* area = world->GetArea(x4_areaId); area->SetThermalSpeedAndTarget(x54_thermalSpeed, x50_thermalTarget); } } } } // namespace urde