Skip to content

Commit 081cd03

Browse files
committed
1 parent 0080e0c commit 081cd03

5 files changed

Lines changed: 154 additions & 183 deletions

File tree

Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionPart.cs

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,24 @@ public abstract class FusionPart<T> : MyGameLogicComponent, IMyEventProxy
4545
public float PowerConsumption;
4646

4747
public MySync<float, SyncDirection.BothWays> PowerUsageSync;
48-
internal FusionPartSettings Settings;
49-
internal static ModularDefinitionApi ModularApi => Epstein_Fusion_DS.ModularDefinition.ModularApi;
48+
private FusionPartSettings Settings;
49+
protected static ModularDefinitionApi ModularApi => Epstein_Fusion_DS.ModularDefinition.ModularApi;
5050

5151
/// <summary>
5252
/// Block subtypes allowed.
5353
/// </summary>
54-
internal abstract string[] BlockSubtypes { get; }
54+
protected abstract string[] BlockSubtypes { get; }
5555

5656
/// <summary>
5757
/// Human-readable name for this part type.
5858
/// </summary>
59-
internal abstract string ReadableName { get; }
59+
protected abstract string ReadableName { get; }
6060

61-
internal virtual Func<IMyTerminalBlock, float> MinOverrideLimit { get; } = b => 0.01f;
62-
internal virtual Func<IMyTerminalBlock, float> MaxOverrideLimit { get; } = b => 4;
61+
protected virtual Func<IMyTerminalBlock, float> MinOverrideLimit { get; } = b => 0.01f;
62+
protected virtual Func<IMyTerminalBlock, float> MaxOverrideLimit { get; } = b => 4;
63+
protected abstract float ProductionPerFusionPower { get; }
64+
65+
protected int bufferBlockCount = 1;
6366

6467
#region Controls
6568

@@ -182,7 +185,7 @@ private void AppendingCustomInfo(IMyTerminalBlock block, StringBuilder stringBui
182185
stringBuilder.Insert(0, InfoText.ToString());
183186
}
184187

185-
public abstract void UpdatePower(float powerGeneration, float outputPerFusionPower, int numberParts);
188+
public abstract void UpdatePower(float powerGeneration, int numberParts);
186189

187190
#endregion
188191

@@ -191,7 +194,8 @@ private void AppendingCustomInfo(IMyTerminalBlock block, StringBuilder stringBui
191194
public override void Init(MyObjectBuilder_EntityBase objectBuilder)
192195
{
193196
base.Init(objectBuilder);
194-
NeedsUpdate = MyEntityUpdateEnum.BEFORE_NEXT_FRAME;
197+
Block = (T)Entity;
198+
NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME;
195199
}
196200

197201
public override void UpdateOnceBeforeFrame()
@@ -204,13 +208,29 @@ public override void UpdateOnceBeforeFrame()
204208

205209
LoadSettings();
206210
PowerUsageSync.Value = Settings.PowerUsage;
211+
OverridePowerUsageSync.Value = Settings.OverridePowerUsage;
212+
SaveSettings();
213+
214+
// Trigger power update is only needed when OverrideEnabled is false
207215
PowerUsageSync.ValueChanged += value =>
216+
{
208217
Settings.PowerUsage = value.Value;
218+
if (!OverrideEnabled.Value)
219+
UpdatePower(BufferPowerGeneration, bufferBlockCount);
220+
SaveSettings();
221+
};
209222

210-
OverridePowerUsageSync.Value = Settings.OverridePowerUsage;
223+
// Trigger power update is only needed when OverrideEnabled is true
211224
OverridePowerUsageSync.ValueChanged += value =>
225+
{
212226
Settings.OverridePowerUsage = value.Value;
213-
SaveSettings();
227+
if (OverrideEnabled.Value)
228+
UpdatePower(BufferPowerGeneration, bufferBlockCount);
229+
SaveSettings();
230+
};
231+
232+
// Trigger power update if boostEnabled is changed
233+
OverrideEnabled.ValueChanged += value => UpdatePower(BufferPowerGeneration, bufferBlockCount);
214234

215235
if (!HaveControlsInited.Contains(ReadableName))
216236
CreateControls();
@@ -243,14 +263,26 @@ public override void UpdateAfterSimulation()
243263
}
244264
}
245265

266+
protected void SetPowerBoost(bool value)
267+
{
268+
if (OverrideEnabled.Value == value)
269+
return;
270+
271+
OverrideEnabled.Value = value;
272+
UpdatePower(BufferPowerGeneration, bufferBlockCount);
273+
}
274+
246275
#endregion
247276

248277
#region Settings
249278

250279
internal void SaveSettings()
251280
{
252281
if (Block == null || Settings == null)
282+
{
283+
ModularApi.Log($"save block null or settings null for {typeof(T).Name}");
253284
return; // called too soon or after it was already closed, ignore
285+
}
254286

255287
if (MyAPIGateway.Utilities == null)
256288
throw new NullReferenceException(
@@ -270,9 +302,6 @@ internal virtual void LoadDefaultSettings()
270302

271303
Settings.PowerUsage = 1.0f;
272304
Settings.OverridePowerUsage = 1.5f;
273-
274-
PowerUsageSync.Value = Settings.PowerUsage;
275-
OverridePowerUsageSync.Value = Settings.OverridePowerUsage;
276305
}
277306

278307
internal virtual bool LoadSettings()
@@ -303,39 +332,19 @@ internal virtual bool LoadSettings()
303332
Settings.PowerUsage = loadedSettings.PowerUsage;
304333
Settings.OverridePowerUsage = loadedSettings.OverridePowerUsage;
305334

306-
PowerUsageSync.Value = loadedSettings.PowerUsage;
307-
OverridePowerUsageSync.Value = loadedSettings.OverridePowerUsage;
308-
309335
return true;
310336
}
311337
}
312338
catch (Exception e)
313339
{
314340
MyLog.Default.WriteLineAndConsole("Exception in loading FusionPart settings: " + e);
315341
MyAPIGateway.Utilities.ShowMessage("Fusion Systems", "Exception in loading FusionPart settings: " + e);
342+
ModularApi.Log("Exception in loading FusionPart settings: " + e);
316343
}
317344

318345
return false;
319346
}
320347

321-
public override bool IsSerialized()
322-
{
323-
if (Block.CubeGrid?.Physics == null)
324-
return base.IsSerialized();
325-
326-
try
327-
{
328-
SaveSettings();
329-
}
330-
catch (Exception e)
331-
{
332-
MyLog.Default.WriteLineAndConsole("Exception in loading FusionPart settings: " + e);
333-
MyAPIGateway.Utilities.ShowMessage("Fusion Systems", "Exception in loading FusionPart settings: " + e);
334-
}
335-
336-
return base.IsSerialized();
337-
}
338-
339348
#endregion
340349
}
341350

Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionReactor/FusionReactorLogic.cs

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ namespace Epstein_Fusion_DS.FusionParts.FusionReactor
1010
[MyEntityComponentDescriptor(typeof(MyObjectBuilder_Reactor), false, "Caster_Reactor")]
1111
public class FusionReactorLogic : FusionPart<IMyReactor>
1212
{
13-
private int _bufferBlockCount = 1;
1413
private float _bufferReactorOutput;
1514

1615

17-
internal override string[] BlockSubtypes => new[] { "Caster_Reactor" };
18-
internal override string ReadableName => "Reactor";
16+
protected override string[] BlockSubtypes => new[] { "Caster_Reactor" };
17+
protected override string ReadableName => "Reactor";
18+
protected override float ProductionPerFusionPower => SFusionSystem.MegawattsPerFusionPower;
1919

2020

21-
public override void UpdatePower(float powerGeneration, float megawattsPerFusionPower, int numberReactors)
21+
public override void UpdatePower(float powerGeneration, int numberReactors)
2222
{
2323
BufferPowerGeneration = powerGeneration;
24-
_bufferBlockCount = numberReactors;
24+
bufferBlockCount = numberReactors;
2525

2626
var reactorConsumptionMultiplier =
2727
OverrideEnabled.Value
@@ -35,57 +35,23 @@ public override void UpdatePower(float powerGeneration, float megawattsPerFusion
3535
var reactorEfficiencyMultiplier = 1 / (0.489f + reactorConsumptionMultiplier);
3636

3737
// Power generated (per second)
38-
var reactorOutput = reactorEfficiencyMultiplier * powerConsumption * megawattsPerFusionPower;
38+
var reactorOutput = reactorEfficiencyMultiplier * powerConsumption * ProductionPerFusionPower;
3939

4040
_bufferReactorOutput = reactorOutput;
4141
MaxPowerConsumption = powerConsumption / 60;
4242

4343
InfoText.Clear();
4444
InfoText.AppendLine(
45-
$"\nOutput: {Math.Round(reactorOutput, 1)}/{Math.Round(powerGeneration * 60 * megawattsPerFusionPower, 1)}");
45+
$"\nOutput: {Math.Round(reactorOutput, 1)}/{Math.Round(powerGeneration * 60 * ProductionPerFusionPower, 1)}");
4646
InfoText.AppendLine($"Input: {Math.Round(powerConsumption, 1)}/{Math.Round(powerGeneration * 60, 1)}");
4747
InfoText.AppendLine($"Efficiency: {Math.Round(reactorEfficiencyMultiplier * 100)}%");
4848

4949
// Convert back into power per tick
5050
SyncMultipliers.ReactorOutput(Block, _bufferReactorOutput);
5151
}
5252

53-
public void SetPowerBoost(bool value)
54-
{
55-
if (OverrideEnabled.Value == value)
56-
return;
57-
58-
OverrideEnabled.Value = value;
59-
UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount);
60-
}
61-
6253
#region Base Methods
6354

64-
public override void Init(MyObjectBuilder_EntityBase definition)
65-
{
66-
base.Init(definition);
67-
Block = (IMyReactor)Entity;
68-
NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME;
69-
70-
// Trigger power update is only needed when OverrideEnabled is false
71-
PowerUsageSync.ValueChanged += value =>
72-
{
73-
if (!OverrideEnabled.Value)
74-
UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount);
75-
};
76-
77-
// Trigger power update is only needed when OverrideEnabled is true
78-
OverridePowerUsageSync.ValueChanged += value =>
79-
{
80-
if (OverrideEnabled.Value)
81-
UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount);
82-
};
83-
84-
// Trigger power update if boostEnabled is changed
85-
OverrideEnabled.ValueChanged += value =>
86-
UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount);
87-
}
88-
8955
public override void UpdateAfterSimulation()
9056
{
9157
base.UpdateAfterSimulation();

Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,32 @@ namespace Epstein_Fusion_DS.FusionParts.FusionThruster
1313
)]
1414
public class FusionThrusterLogic : FusionPart<IMyThrust>
1515
{
16-
private int _bufferBlockCount = 1;
1716
private float _bufferThrustOutput;
1817

1918

20-
internal override string[] BlockSubtypes => new[]
19+
protected override string[] BlockSubtypes => new[]
2120
{
2221
"Caster_FocusLens",
2322
};
2423

25-
internal override string ReadableName => "Thruster";
24+
protected override string ReadableName => "Thruster";
25+
protected override float ProductionPerFusionPower => SFusionSystem.NewtonsPerFusionPower;
2626

27-
internal override Func<IMyTerminalBlock, float> MinOverrideLimit =>
27+
protected override Func<IMyTerminalBlock, float> MinOverrideLimit =>
2828
b => 1;
29-
internal override Func<IMyTerminalBlock, float> MaxOverrideLimit =>
29+
30+
protected override Func<IMyTerminalBlock, float> MaxOverrideLimit =>
3031
b => DriveSettings[b.BlockDefinition.SubtypeId].MaxOverclock;
3132

3233
internal static readonly Dictionary<string, DriveSetting> DriveSettings = new Dictionary<string, DriveSetting>
3334
{
3435
["Caster_FocusLens"] = new DriveSetting(1.00f, 1.5f, 144000000),
3536
};
3637

37-
public override void UpdatePower(float powerGeneration, float newtonsPerFusionPower, int numberThrusters)
38+
public override void UpdatePower(float powerGeneration, int numberThrusters)
3839
{
3940
BufferPowerGeneration = powerGeneration;
40-
_bufferBlockCount = numberThrusters;
41+
bufferBlockCount = numberThrusters;
4142

4243
var overrideModifier = (OverrideEnabled ? OverridePowerUsageSync : PowerUsageSync).Value;
4344

@@ -49,7 +50,7 @@ public override void UpdatePower(float powerGeneration, float newtonsPerFusionPo
4950
(2 - 1/(DriveSettings[Block.BlockDefinition.SubtypeId].BaseThrust/maxThrustOutput));
5051

5152
// Power generation consumed (per second)
52-
var powerConsumption = thrustOutput / newtonsPerFusionPower / efficiencyMultiplier;
53+
var powerConsumption = thrustOutput / ProductionPerFusionPower / efficiencyMultiplier;
5354

5455
// Power generated (per second)
5556
//var thrustOutput = efficiencyMultiplier * powerConsumption * newtonsPerFusionPower;
@@ -67,42 +68,8 @@ public override void UpdatePower(float powerGeneration, float newtonsPerFusionPo
6768
SyncMultipliers.ThrusterOutput(Block, _bufferThrustOutput);
6869
}
6970

70-
public void SetPowerBoost(bool value)
71-
{
72-
if (OverrideEnabled.Value == value)
73-
return;
74-
75-
OverrideEnabled.Value = value;
76-
UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount);
77-
}
78-
7971
#region Base Methods
8072

81-
public override void Init(MyObjectBuilder_EntityBase definition)
82-
{
83-
base.Init(definition);
84-
Block = (IMyThrust)Entity;
85-
NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME;
86-
87-
// Trigger power update is only needed when OverrideEnabled is false
88-
PowerUsageSync.ValueChanged += value =>
89-
{
90-
if (!OverrideEnabled.Value)
91-
UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount);
92-
};
93-
94-
// Trigger power update is only needed when OverrideEnabled is true
95-
OverridePowerUsageSync.ValueChanged += value =>
96-
{
97-
if (OverrideEnabled.Value)
98-
UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount);
99-
};
100-
101-
// Trigger power update if boostEnabled is changed
102-
OverrideEnabled.ValueChanged += value =>
103-
UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount);
104-
}
105-
10673
public override void UpdateAfterSimulation()
10774
{
10875
base.UpdateAfterSimulation();

Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public void AddPart(IMyCubeBlock newPart)
122122
{
123123
Thrusters.Add(logic);
124124
logic.MemberSystem = this;
125-
logic.UpdatePower(PowerGeneration, NewtonsPerFusionPower, Thrusters.Count);
125+
logic.UpdatePower(PowerGeneration, Thrusters.Count);
126126
}
127127
}
128128

@@ -133,7 +133,7 @@ public void AddPart(IMyCubeBlock newPart)
133133
{
134134
Reactors.Add(logic);
135135
logic.MemberSystem = this;
136-
logic.UpdatePower(PowerGeneration, MegawattsPerFusionPower, Reactors.Count);
136+
logic.UpdatePower(PowerGeneration, Reactors.Count);
137137
}
138138
}
139139

@@ -157,15 +157,15 @@ public void RemovePart(IMyCubeBlock part)
157157
var logic = part.GameLogic.GetAs<FusionThrusterLogic>();
158158
logic.MemberSystem = null;
159159
Thrusters.Remove(logic);
160-
logic.UpdatePower(PowerGeneration, NewtonsPerFusionPower, Thrusters.Count);
160+
logic.UpdatePower(PowerGeneration, Thrusters.Count);
161161
}
162162

163163
if (part is IMyReactor)
164164
{
165165
var logic = part.GameLogic.GetAs<FusionReactorLogic>();
166166
logic.MemberSystem = null;
167167
Reactors.Remove(logic);
168-
logic.UpdatePower(PowerGeneration, NewtonsPerFusionPower, Thrusters.Count);
168+
logic.UpdatePower(PowerGeneration, Reactors.Count);
169169
}
170170

171171
if (part is IMyGasTank)
@@ -188,7 +188,6 @@ public void RemovePart(IMyCubeBlock part)
188188

189189
private void UpdatePower(bool updateReactors = false)
190190
{
191-
var generationModifier = 1;
192191
var powerGeneration = float.Epsilon;
193192
var powerCapacity = float.Epsilon;
194193
var totalPowerUsage = 0f;
@@ -205,15 +204,15 @@ private void UpdatePower(bool updateReactors = false)
205204
totalPowerUsage += reactor?.PowerConsumption ?? 0;
206205

207206
if (updateReactors)
208-
reactor?.UpdatePower(powerGeneration, MegawattsPerFusionPower * generationModifier, Reactors.Count);
207+
reactor?.UpdatePower(powerGeneration, Reactors.Count);
209208
}
210209

211210
foreach (var thruster in Thrusters)
212211
{
213212
totalPowerUsage += thruster?.PowerConsumption ?? 0;
214213

215214
if (updateReactors)
216-
thruster?.UpdatePower(powerGeneration, NewtonsPerFusionPower * generationModifier, Thrusters.Count);
215+
thruster?.UpdatePower(powerGeneration, Thrusters.Count);
217216
}
218217

219218
// Subtract power usage afterwards so that all reactors have the same stats.

0 commit comments

Comments
 (0)