Fix GasThermoMachine upgrading (#8313)
This commit is contained in:
@@ -1,43 +1,82 @@
|
|||||||
using Content.Shared.Atmos;
|
using Content.Shared.Atmos;
|
||||||
using Content.Shared.Atmos.Piping.Unary.Components;
|
using Content.Shared.Atmos.Piping.Unary.Components;
|
||||||
using Robust.Shared.Serialization;
|
|
||||||
|
|
||||||
namespace Content.Server.Atmos.Piping.Unary.Components
|
namespace Content.Server.Atmos.Piping.Unary.Components
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
public sealed class GasThermoMachineComponent : Component, ISerializationHooks
|
public sealed class GasThermoMachineComponent : Component
|
||||||
{
|
{
|
||||||
[DataField("inlet")]
|
[DataField("inlet")]
|
||||||
public string InletName { get; set; } = "pipe";
|
public string InletName = "pipe";
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
public bool Enabled { get; set; } = true;
|
[DataField("enabled")]
|
||||||
|
public bool Enabled = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current maximum temperature, calculated from <see cref="BaseHeatCapacity"/> and the quality of matter
|
||||||
|
/// bins. The heat capacity effectively determines the rate at which the thermo machine can add or remove
|
||||||
|
/// heat from a pipenet.
|
||||||
|
/// </summary>
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
public float HeatCapacity { get; set; } = 0;
|
public float HeatCapacity = 10000;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Base heat capacity of the device. Actual heat capacity is calculated by taking this number and doubling
|
||||||
|
/// it for every matter bin quality tier above one.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("baseHeatCapacity")]
|
||||||
|
public float BaseHeatCapacity = 5000;
|
||||||
|
|
||||||
|
[DataField("targetTemperature")]
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
public float TargetTemperature { get; set; } = Atmospherics.T20C;
|
public float TargetTemperature = Atmospherics.T20C;
|
||||||
|
|
||||||
[DataField("mode")]
|
[DataField("mode")]
|
||||||
|
public ThermoMachineMode Mode = ThermoMachineMode.Freezer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current minimum temperature, calculated from <see cref="InitialMinTemperature"/> and <see
|
||||||
|
/// cref="MinTemperatureDelta"/>.
|
||||||
|
/// </summary>
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
public ThermoMachineMode Mode { get; set; } = ThermoMachineMode.Freezer;
|
public float MinTemperature;
|
||||||
|
|
||||||
[DataField("minTemperature")]
|
/// <summary>
|
||||||
|
/// Current maximum temperature, calculated from <see cref="InitialMaxTemperature"/> and <see
|
||||||
|
/// cref="MaxTemperatureDelta"/>.
|
||||||
|
/// </summary>
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
public float MinTemperature { get; set; } = Atmospherics.T20C;
|
public float MaxTemperature;
|
||||||
|
|
||||||
[DataField("maxTemperature")]
|
/// <summary>
|
||||||
|
/// Minimum temperature the device can reach with a 0 total laser quality. Usually the quality will be at
|
||||||
|
/// least 1.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("baseMinTemperature")]
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
public float MaxTemperature { get; set; } = Atmospherics.T20C;
|
public float BaseMinTemperature = 96.625f; // Selected so that tier-1 parts can reach 73.15k
|
||||||
|
|
||||||
public float InitialMinTemperature { get; private set; }
|
/// <summary>
|
||||||
public float InitialMaxTemperature { get; private set; }
|
/// Maximum temperature the device can reach with a 0 total laser quality. Usually the quality will be at
|
||||||
|
/// least 1.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("baseMaxTemperature")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public float BaseMaxTemperature = Atmospherics.T20C;
|
||||||
|
|
||||||
void ISerializationHooks.AfterDeserialization()
|
/// <summary>
|
||||||
{
|
/// Decrease in minimum temperature, per unit machine part quality.
|
||||||
InitialMinTemperature = MinTemperature;
|
/// </summary>
|
||||||
InitialMaxTemperature = MaxTemperature;
|
[DataField("minTemperatureDelta")]
|
||||||
}
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public float MinTemperatureDelta = 23.475f; // selected so that tier-4 parts can reach TCMB
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Change in maximum temperature, per unit machine part quality.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("maxTemperatureDelta")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public float MaxTemperatureDelta = 300;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
|
|||||||
|
|
||||||
var airHeatCapacity = _atmosphereSystem.GetHeatCapacity(inlet.Air);
|
var airHeatCapacity = _atmosphereSystem.GetHeatCapacity(inlet.Air);
|
||||||
var combinedHeatCapacity = airHeatCapacity + thermoMachine.HeatCapacity;
|
var combinedHeatCapacity = airHeatCapacity + thermoMachine.HeatCapacity;
|
||||||
var oldTemperature = inlet.Air.Temperature;
|
|
||||||
|
|
||||||
if (!MathHelper.CloseTo(combinedHeatCapacity, 0, 0.001f))
|
if (!MathHelper.CloseTo(combinedHeatCapacity, 0, 0.001f))
|
||||||
{
|
{
|
||||||
@@ -70,6 +69,9 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
|
|||||||
|
|
||||||
private void OnGasThermoRefreshParts(EntityUid uid, GasThermoMachineComponent component, RefreshPartsEvent args)
|
private void OnGasThermoRefreshParts(EntityUid uid, GasThermoMachineComponent component, RefreshPartsEvent args)
|
||||||
{
|
{
|
||||||
|
// Here we evaluate the average quality of relevant machine parts.
|
||||||
|
var nLasers = 0;
|
||||||
|
var nBins= 0;
|
||||||
var matterBinRating = 0;
|
var matterBinRating = 0;
|
||||||
var laserRating = 0;
|
var laserRating = 0;
|
||||||
|
|
||||||
@@ -78,25 +80,32 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
|
|||||||
switch (part.PartType)
|
switch (part.PartType)
|
||||||
{
|
{
|
||||||
case MachinePart.MatterBin:
|
case MachinePart.MatterBin:
|
||||||
|
nBins += 1;
|
||||||
matterBinRating += part.Rating;
|
matterBinRating += part.Rating;
|
||||||
break;
|
break;
|
||||||
case MachinePart.Laser:
|
case MachinePart.Laser:
|
||||||
|
nLasers += 1;
|
||||||
laserRating += part.Rating;
|
laserRating += part.Rating;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
laserRating /= nLasers;
|
||||||
|
matterBinRating /= nBins;
|
||||||
|
|
||||||
component.HeatCapacity = 5000 * MathF.Pow((matterBinRating - 1), 2);
|
component.HeatCapacity = 5000 * MathF.Pow(matterBinRating, 2);
|
||||||
|
|
||||||
switch (component.Mode)
|
switch (component.Mode)
|
||||||
{
|
{
|
||||||
// 573.15K with stock parts.
|
// 593.15K with stock parts.
|
||||||
case ThermoMachineMode.Heater:
|
case ThermoMachineMode.Heater:
|
||||||
component.MaxTemperature = Atmospherics.T20C + (component.InitialMaxTemperature * laserRating);
|
component.MaxTemperature = component.BaseMaxTemperature + component.MaxTemperatureDelta * laserRating;
|
||||||
|
component.MinTemperature = Atmospherics.T20C;
|
||||||
break;
|
break;
|
||||||
// 73.15K with stock parts.
|
// 73.15K with stock parts.
|
||||||
case ThermoMachineMode.Freezer:
|
case ThermoMachineMode.Freezer:
|
||||||
component.MinTemperature = MathF.Max(Atmospherics.T0C - component.InitialMinTemperature + laserRating * 15f, Atmospherics.TCMB);
|
component.MinTemperature = MathF.Max(
|
||||||
|
component.BaseMinTemperature - component.MinTemperatureDelta * laserRating, Atmospherics.TCMB);
|
||||||
|
component.MaxTemperature = Atmospherics.T20C;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -218,7 +218,6 @@
|
|||||||
enabledState: freezer_on
|
enabledState: freezer_on
|
||||||
- type: GasThermoMachine
|
- type: GasThermoMachine
|
||||||
mode: Freezer
|
mode: Freezer
|
||||||
minTemperature: 73.15
|
|
||||||
- type: Machine
|
- type: Machine
|
||||||
board: ThermomachineFreezerMachineCircuitBoard
|
board: ThermomachineFreezerMachineCircuitBoard
|
||||||
|
|
||||||
@@ -244,6 +243,5 @@
|
|||||||
enabledState: heater_on
|
enabledState: heater_on
|
||||||
- type: GasThermoMachine
|
- type: GasThermoMachine
|
||||||
mode: Heater
|
mode: Heater
|
||||||
maxTemperature: 573.15 # This is changed when parts are refreshed.
|
|
||||||
- type: Machine
|
- type: Machine
|
||||||
board: ThermomachineHeaterMachineCircuitBoard
|
board: ThermomachineHeaterMachineCircuitBoard
|
||||||
|
|||||||
Reference in New Issue
Block a user