Files
tbd-station-14/Content.Server/Power/Pow3r/PowerSolverShared.cs
2022-05-13 17:59:03 +10:00

89 lines
3.1 KiB
C#

namespace Content.Server.Power.Pow3r
{
public static class PowerSolverShared
{
public static void UpdateRampPositions(float frameTime, PowerState state)
{
// Update supplies to move their ramp position towards target, if necessary.
foreach (var supply in state.Supplies.Values)
{
if (supply.Paused)
continue;
if (!supply.Enabled)
{
// If disabled, set ramp to 0.
supply.SupplyRampPosition = 0;
continue;
}
var rampDev = supply.SupplyRampTarget - supply.SupplyRampPosition;
if (Math.Abs(rampDev) > 0.001f)
{
float newPos;
if (rampDev > 0)
{
// Position below target, go up.
newPos = Math.Min(
supply.SupplyRampTarget,
supply.SupplyRampPosition + supply.SupplyRampRate * frameTime);
}
else
{
// Other way around, go down
newPos = Math.Max(
supply.SupplyRampTarget,
supply.SupplyRampPosition - supply.SupplyRampRate * frameTime);
}
supply.SupplyRampPosition = Math.Clamp(newPos, 0, supply.MaxSupply);
}
else
{
supply.SupplyRampPosition = supply.SupplyRampTarget;
}
}
// Batteries too.
foreach (var battery in state.Batteries.Values)
{
if (battery.Paused)
continue;
if (!battery.Enabled)
{
// If disabled, set ramp to 0.
battery.SupplyRampPosition = 0;
continue;
}
var rampDev = battery.SupplyRampTarget - battery.SupplyRampPosition;
if (Math.Abs(rampDev) > 0.001f)
{
float newPos;
if (rampDev > 0)
{
// Position below target, go up.
newPos = Math.Min(
battery.SupplyRampTarget,
battery.SupplyRampPosition + battery.SupplyRampRate * frameTime);
}
else
{
// Other way around, go down
newPos = Math.Max(
battery.SupplyRampTarget,
battery.SupplyRampPosition - battery.SupplyRampRate * frameTime);
}
battery.SupplyRampPosition = Math.Clamp(newPos, 0, battery.MaxSupply);
}
else
{
battery.SupplyRampPosition = battery.SupplyRampTarget;
}
}
}
}
}