From 8edd5257c4b83957e52c56233df0523a8b110c87 Mon Sep 17 00:00:00 2001
From: daerSeebaer <61566539+daerSeebaer@users.noreply.github.com>
Date: Wed, 18 Oct 2023 19:46:32 +0200
Subject: [PATCH] Display current load and maximum capacity (#20181)
---
Content.Client/Ame/UI/AmeWindow.xaml | 20 +++++++++++---
Content.Client/Ame/UI/AmeWindow.xaml.cs | 3 +++
Content.Server/Ame/AmeNodeGroup.cs | 17 ++++++++----
.../Ame/Components/AmeControllerComponent.cs | 11 ++++++++
.../Ame/EntitySystems/AmeControllerSystem.cs | 27 ++++++++++++++++---
.../Ame/SharedAmeControllerComponent.cs | 8 ++++--
.../components/ame-controller-component.ftl | 2 ++
7 files changed, 75 insertions(+), 13 deletions(-)
diff --git a/Content.Client/Ame/UI/AmeWindow.xaml b/Content.Client/Ame/UI/AmeWindow.xaml
index 8769e3124e..14835f85c7 100644
--- a/Content.Client/Ame/UI/AmeWindow.xaml
+++ b/Content.Client/Ame/UI/AmeWindow.xaml
@@ -1,7 +1,7 @@
-
-
+
@@ -42,5 +42,19 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Ame/UI/AmeWindow.xaml.cs b/Content.Client/Ame/UI/AmeWindow.xaml.cs
index 0ad8880bec..8f5103e6cf 100644
--- a/Content.Client/Ame/UI/AmeWindow.xaml.cs
+++ b/Content.Client/Ame/UI/AmeWindow.xaml.cs
@@ -64,6 +64,9 @@ namespace Content.Client.Ame.UI
CoreCount.Text = $"{castState.CoreCount}";
InjectionAmount.Text = $"{castState.InjectionAmount}";
+ // format power statistics to pretty numbers
+ CurrentPowerSupply.Text = $"{castState.CurrentPowerSupply.ToString("N1")}";
+ TargetedPowerSupply.Text = $"{castState.TargetedPowerSupply.ToString("N1")}";
}
}
}
diff --git a/Content.Server/Ame/AmeNodeGroup.cs b/Content.Server/Ame/AmeNodeGroup.cs
index d0e854469f..d970f43d8b 100644
--- a/Content.Server/Ame/AmeNodeGroup.cs
+++ b/Content.Server/Ame/AmeNodeGroup.cs
@@ -126,11 +126,7 @@ public sealed class AmeNodeGroup : BaseNodeGroup
var safeFuelLimit = CoreCount * 2;
- // Note the float conversions. The maths will completely fail if not done using floats.
- // Oh, and don't ever stuff the result of this in an int. Seriously.
- var floatFuel = (float) fuel;
- var floatCores = (float) CoreCount;
- var powerOutput = 20000f * floatFuel * floatFuel / floatCores;
+ var powerOutput = CalculatePower(fuel, CoreCount);
if (fuel <= safeFuelLimit)
return powerOutput;
@@ -177,6 +173,17 @@ public sealed class AmeNodeGroup : BaseNodeGroup
return powerOutput;
}
+ ///
+ /// Calculates the amount of power the AME can produce with the given settings
+ ///
+ public float CalculatePower(int fuel, int cores)
+ {
+ // Fuel is squared so more fuel vastly increases power and efficiency
+ // We divide by the number of cores so a larger AME is less efficient at the same fuel settings
+ // this results in all AMEs having the same efficiency at the same fuel-per-core setting
+ return 20000f * fuel * fuel / cores;
+ }
+
public int GetTotalStability()
{
if (CoreCount < 1)
diff --git a/Content.Server/Ame/Components/AmeControllerComponent.cs b/Content.Server/Ame/Components/AmeControllerComponent.cs
index 42bfa5303d..1bf1ac2c92 100644
--- a/Content.Server/Ame/Components/AmeControllerComponent.cs
+++ b/Content.Server/Ame/Components/AmeControllerComponent.cs
@@ -72,10 +72,21 @@ public sealed partial class AmeControllerComponent : SharedAmeControllerComponen
[DataField("nextUpdate")]
public TimeSpan NextUpdate = default!;
+ ///
+ /// The next time this will try to update the controller UI.
+ ///
+ public TimeSpan NextUIUpdate = default!;
+
///
/// The the amount of time that passes between injection attempts.
///
[DataField("updatePeriod")]
[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan UpdatePeriod = TimeSpan.FromSeconds(10.0);
+
+ ///
+ /// The maximum amount of time that passes between UI updates.
+ ///
+ [ViewVariables]
+ public TimeSpan UpdateUIPeriod = TimeSpan.FromSeconds(3.0);
}
diff --git a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs
index 7b9ea7146e..44140193d2 100644
--- a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs
+++ b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs
@@ -50,6 +50,8 @@ public sealed class AmeControllerSystem : EntitySystem
{
if (controller.NextUpdate <= curTime)
UpdateController(uid, curTime, controller, nodes);
+ else if (controller.NextUIUpdate <= curTime)
+ UpdateUi(uid, controller);
}
}
@@ -60,6 +62,8 @@ public sealed class AmeControllerSystem : EntitySystem
controller.LastUpdate = curTime;
controller.NextUpdate = curTime + controller.UpdatePeriod;
+ // update the UI regardless of other factors to update the power readings
+ UpdateUi(uid, controller);
if (!controller.Injecting)
return;
@@ -106,18 +110,35 @@ public sealed class AmeControllerSystem : EntitySystem
var state = GetUiState(uid, controller);
_userInterfaceSystem.SetUiState(bui, state);
+
+ controller.NextUIUpdate = _gameTiming.CurTime + controller.UpdateUIPeriod;
}
private AmeControllerBoundUserInterfaceState GetUiState(EntityUid uid, AmeControllerComponent controller)
{
var powered = !TryComp(uid, out var powerSource) || powerSource.Powered;
- var coreCount = TryGetAMENodeGroup(uid, out var group) ? group.CoreCount : 0;
+ var coreCount = 0;
+ // how much power can be produced at the current settings, in kW
+ // we don't use max. here since this is what is set in the Controller, not what the AME is actually producing
+ float targetedPowerSupply = 0;
+ if (TryGetAMENodeGroup(uid, out var group))
+ {
+ coreCount = group.CoreCount;
+ targetedPowerSupply = group.CalculatePower(controller.InjectionAmount, group.CoreCount) / 1000;
+ }
+
+ // set current power statistics in kW
+ float currentPowerSupply = 0;
+ if (TryComp(uid, out var powerOutlet) && coreCount > 0)
+ {
+ currentPowerSupply = powerOutlet.CurrentSupply / 1000;
+ }
var hasJar = Exists(controller.JarSlot.ContainedEntity);
if (!hasJar || !TryComp(controller.JarSlot.ContainedEntity, out var jar))
- return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), false, hasJar, 0, controller.InjectionAmount, coreCount);
+ return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), false, hasJar, 0, controller.InjectionAmount, coreCount, currentPowerSupply, targetedPowerSupply);
- return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), controller.Injecting, hasJar, jar.FuelAmount, controller.InjectionAmount, coreCount);
+ return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), controller.Injecting, hasJar, jar.FuelAmount, controller.InjectionAmount, coreCount, currentPowerSupply, targetedPowerSupply);
}
private bool IsMasterController(EntityUid uid)
diff --git a/Content.Shared/Ame/SharedAmeControllerComponent.cs b/Content.Shared/Ame/SharedAmeControllerComponent.cs
index 386d577ef3..8dde66724d 100644
--- a/Content.Shared/Ame/SharedAmeControllerComponent.cs
+++ b/Content.Shared/Ame/SharedAmeControllerComponent.cs
@@ -1,4 +1,4 @@
-using Robust.Shared.Serialization;
+using Robust.Shared.Serialization;
namespace Content.Shared.Ame;
@@ -17,8 +17,10 @@ public sealed class AmeControllerBoundUserInterfaceState : BoundUserInterfaceSta
public readonly int FuelAmount;
public readonly int InjectionAmount;
public readonly int CoreCount;
+ public readonly float CurrentPowerSupply;
+ public readonly float TargetedPowerSupply;
- public AmeControllerBoundUserInterfaceState(bool hasPower, bool isMaster, bool injecting, bool hasFuelJar, int fuelAmount, int injectionAmount, int coreCount)
+ public AmeControllerBoundUserInterfaceState(bool hasPower, bool isMaster, bool injecting, bool hasFuelJar, int fuelAmount, int injectionAmount, int coreCount, float currentPowerSupply, float targetedPowerSupply)
{
HasPower = hasPower;
IsMaster = isMaster;
@@ -27,6 +29,8 @@ public sealed class AmeControllerBoundUserInterfaceState : BoundUserInterfaceSta
FuelAmount = fuelAmount;
InjectionAmount = injectionAmount;
CoreCount = coreCount;
+ CurrentPowerSupply = currentPowerSupply;
+ TargetedPowerSupply = targetedPowerSupply;
}
}
diff --git a/Resources/Locale/en-US/ame/components/ame-controller-component.ftl b/Resources/Locale/en-US/ame/components/ame-controller-component.ftl
index f55fa8755f..cd5e6b4661 100644
--- a/Resources/Locale/en-US/ame/components/ame-controller-component.ftl
+++ b/Resources/Locale/en-US/ame/components/ame-controller-component.ftl
@@ -16,6 +16,8 @@ ame-window-fuel-not-inserted-text = No fuel inserted
ame-window-injection-amount-label = Injection amount:
ame-window-refresh-parts-button = Refresh Parts
ame-window-core-count-label = Core count:
+ame-window-power-currentsupply-label = Current power supply:
+ame-window-power-targetsupply-label = Targeted power supply:
ame-window-toggle-injection-button = Toggle Injection
ame-window-eject-button = Eject
ame-window-increase-fuel-button = Increase
--
2.51.2