forked from new-frontiers-14/frontier-station-14
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.Simulation.cs
133 lines (108 loc) · 4.12 KB
/
Program.Simulation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System.Collections.Generic;
using System.Diagnostics;
using Content.Server.Power.Pow3r;
using Robust.Shared.Threading;
using Robust.UnitTesting;
using static Content.Server.Power.Pow3r.PowerState;
namespace Pow3r
{
internal sealed partial class Program
{
private const int MaxTickData = 180;
private PowerState _state = new();
private Network _linking;
private int _tickDataIdx;
private bool _paused;
private readonly string[] _solverNames =
{
nameof(BatteryRampPegSolver),
nameof(NoOpSolver)
};
private readonly IPowerSolver[] _solvers = {
new BatteryRampPegSolver(),
new NoOpSolver()
};
private int _currentSolver;
private readonly float[] _simTickTimes = new float[MaxTickData];
private readonly Queue<object> _remQueue = new();
private readonly Stopwatch _simStopwatch = new Stopwatch();
private IParallelManager _parallel = new TestingParallelManager();
private void Tick(float frameTime)
{
if (_paused)
return;
RunSingleStep(frameTime);
}
private void RunSingleStep(float frameTime)
{
_simStopwatch.Restart();
_tickDataIdx = (_tickDataIdx + 1) % MaxTickData;
_solvers[_currentSolver].Tick(frameTime, _state, _parallel);
// Update tick history.
foreach (var load in _state.Loads.Values)
{
var displayLoad = _displayLoads[load.Id];
displayLoad.ReceivedPowerData[_tickDataIdx] = load.ReceivingPower;
}
foreach (var supply in _state.Supplies.Values)
{
var displaySupply = _displaySupplies[supply.Id];
displaySupply.SuppliedPowerData[_tickDataIdx] = supply.CurrentSupply;
}
foreach (var battery in _state.Batteries.Values)
{
var displayBattery = _displayBatteries[battery.Id];
displayBattery.StoredPowerData[_tickDataIdx] = battery.CurrentStorage;
displayBattery.ReceivingPowerData[_tickDataIdx] = battery.CurrentReceiving;
displayBattery.SuppliedPowerData[_tickDataIdx] = battery.CurrentSupply;
}
_simTickTimes[_tickDataIdx] = (float) _simStopwatch.Elapsed.TotalMilliseconds;
}
private void RunSingleStep()
{
RunSingleStep(1f/_tps);
}
// Link data is stored authoritatively on networks,
// but for easy access it is replicated into the linked components.
// This is updated here.
private void RefreshLinks()
{
foreach (var battery in _state.Batteries.Values)
{
battery.LinkedNetworkCharging = default;
battery.LinkedNetworkDischarging = default;
}
foreach (var load in _state.Loads.Values)
{
load.LinkedNetwork = default;
}
foreach (var supply in _state.Supplies.Values)
{
supply.LinkedNetwork = default;
}
foreach (var network in _state.Networks.Values)
{
foreach (var loadId in network.Loads)
{
var load = _state.Loads[loadId];
load.LinkedNetwork = network.Id;
}
foreach (var supplyId in network.Supplies)
{
var supply = _state.Supplies[supplyId];
supply.LinkedNetwork = network.Id;
}
foreach (var batteryId in network.BatteryLoads)
{
var battery = _state.Batteries[batteryId];
battery.LinkedNetworkCharging = network.Id;
}
foreach (var batteryId in network.BatterySupplies)
{
var battery = _state.Batteries[batteryId];
battery.LinkedNetworkDischarging = network.Id;
}
}
}
}
}