metaforce/Runtime/World/CScriptDistanceFog.cpp

80 lines
2.7 KiB
C++
Raw Normal View History

2016-08-08 20:55:58 +00:00
#include "CScriptDistanceFog.hpp"
2016-08-09 03:58:19 +00:00
#include "CStateManager.hpp"
#include "CWorld.hpp"
2017-01-15 03:07:01 +00:00
#include "TCastTo.hpp"
2016-08-08 20:55:58 +00:00
namespace urde
{
2017-11-13 06:19:18 +00:00
CScriptDistanceFog::CScriptDistanceFog(TUniqueId uid, std::string_view name, const CEntityInfo& info,
2018-10-11 22:57:05 +00:00
ERglFogMode mode, const zeus::CColor& color,
2016-08-09 03:58:19 +00:00
const zeus::CVector2f& range, float colorDelta,
const zeus::CVector2f& rangeDelta, bool expl, bool active,
float thermalTarget, float thermalSpeed, float xrayTarget, float xraySpeed)
2016-08-08 20:55:58 +00:00
: CEntity(uid, info, active, name),
x34_mode(mode),
2016-08-09 03:58:19 +00:00
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)
2016-08-08 20:55:58 +00:00
{
2016-09-01 04:10:08 +00:00
if (zeus::close_enough(rangeDelta, zeus::CVector2f::skZero) && zeus::close_enough(colorDelta, 0.f))
2016-08-09 03:58:19 +00:00
x61_nonZero = false;
else
x61_nonZero = true;
}
2017-01-15 03:07:01 +00:00
void CScriptDistanceFog::Accept(IVisitor& visitor)
{
visitor.Visit(this);
}
2016-08-09 03:58:19 +00:00
void CScriptDistanceFog::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
{
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
2016-12-22 02:48:22 +00:00
if (x4_areaId == kInvalidAreaId || !GetActive())
2016-08-09 03:58:19 +00:00
return;
2017-03-24 05:30:16 +00:00
if (msg == EScriptObjectMessage::InitializedInArea)
2016-08-09 03:58:19 +00:00
{
if (!x60_explicit)
return;
CGameArea::CAreaFog* fog = stateMgr.WorldNC()->GetArea(x4_areaId)->AreaFog();
2016-08-09 03:58:19 +00:00
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.WorldNC()->GetArea(x4_areaId)->AreaFog();
2016-08-09 03:58:19 +00:00
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);
2016-09-01 04:10:08 +00:00
if (zeus::close_enough(x54_thermalSpeed, 0.f) && !zeus::close_enough(x5c_xraySpeed, 0.f))
2016-08-09 03:58:19 +00:00
{
CWorld* world = stateMgr.WorldNC();
2016-12-22 02:48:22 +00:00
CGameArea* area = world->GetArea(x4_areaId);
2016-08-09 03:58:19 +00:00
area->SetXRaySpeedAndTarget(x5c_xraySpeed, x58_xrayTarget);
}
else
{
CWorld* world = stateMgr.WorldNC();
2016-12-22 02:48:22 +00:00
CGameArea* area = world->GetArea(x4_areaId);
2016-08-09 03:58:19 +00:00
area->SetThermalSpeedAndTarget(x54_thermalSpeed, x50_thermalTarget);
}
}
2016-08-08 20:55:58 +00:00
}
}