Display current load and maximum capacity (#20181)

This commit is contained in:
daerSeebaer
2023-10-18 19:46:32 +02:00
committed by GitHub
parent badb601dd1
commit 8edd5257c4
7 changed files with 75 additions and 13 deletions

View File

@@ -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;
}
/// <summary>
/// Calculates the amount of power the AME can produce with the given settings
/// </summary>
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)

View File

@@ -72,10 +72,21 @@ public sealed partial class AmeControllerComponent : SharedAmeControllerComponen
[DataField("nextUpdate")]
public TimeSpan NextUpdate = default!;
/// <summary>
/// The next time this will try to update the controller UI.
/// </summary>
public TimeSpan NextUIUpdate = default!;
/// <summary>
/// The the amount of time that passes between injection attempts.
/// </summary>
[DataField("updatePeriod")]
[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan UpdatePeriod = TimeSpan.FromSeconds(10.0);
/// <summary>
/// The maximum amount of time that passes between UI updates.
/// </summary>
[ViewVariables]
public TimeSpan UpdateUIPeriod = TimeSpan.FromSeconds(3.0);
}

View File

@@ -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<ApcPowerReceiverComponent>(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<PowerSupplierComponent>(uid, out var powerOutlet) && coreCount > 0)
{
currentPowerSupply = powerOutlet.CurrentSupply / 1000;
}
var hasJar = Exists(controller.JarSlot.ContainedEntity);
if (!hasJar || !TryComp<AmeFuelContainerComponent>(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)