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 @@ - - + - + + + + + + + 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