RobustXamlLoader.Load(this);
SpinboxHBox.AddChild(
- TemperatureSpinbox = new FloatSpinBox(.1f, 2) { MaxWidth = 150, HorizontalExpand = true }
+ TemperatureSpinbox = new FloatSpinBox(.1f, 2) { MinWidth = 150, HorizontalExpand = true }
);
}
using Content.Shared.Atmos;
-using Content.Shared.Atmos.Piping.Unary.Components;
-using Content.Shared.Construction.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Atmos.Piping.Unary.Components
{
/// Current electrical power consumption, in watts. Increasing power increases the ability of the
/// thermomachine to heat or cool air.
/// </summary>
- [ViewVariables(VVAccess.ReadWrite)]
- 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, ViewVariables(VVAccess.ReadWrite)]
+ public float HeatCapacity = 5000;
- [DataField("targetTemperature")]
- [ViewVariables(VVAccess.ReadWrite)]
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
public float TargetTemperature = Atmospherics.T20C;
/// <summary>
/// Tolerance for temperature setpoint hysteresis.
/// </summary>
- [ViewVariables(VVAccess.ReadOnly)]
+ [DataField, ViewVariables(VVAccess.ReadOnly)]
public float TemperatureTolerance = 2f;
/// <summary>
/// If true, add Sign(Cp)*TemperatureTolerance to the temperature setpoint.
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
- public bool HysteresisState = false;
+ public bool HysteresisState;
/// <summary>
/// Coefficient of performance. Output power / input power.
public float Cp = 0.9f; // output power / input power, positive is heat
/// <summary>
- /// Current minimum temperature, calculated from <see cref="InitialMinTemperature"/> and <see
- /// cref="MinTemperatureDelta"/>.
+ /// Current minimum temperature
/// Ignored if heater.
/// </summary>
- [ViewVariables(VVAccess.ReadWrite)]
- public float MinTemperature;
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public float MinTemperature = 73.15f;
/// <summary>
- /// Current maximum temperature, calculated from <see cref="InitialMaxTemperature"/> and <see
- /// cref="MaxTemperatureDelta"/>.
+ /// Current maximum temperature
/// Ignored if freezer.
/// </summary>
- [ViewVariables(VVAccess.ReadWrite)]
- public float MaxTemperature;
-
- /// <summary>
- /// Minimum temperature the device can reach with a 0 total capacitor quality. Usually the quality will be at
- /// least 1.
- /// </summary>
- [DataField("baseMinTemperature")]
- [ViewVariables(VVAccess.ReadWrite)]
- public float BaseMinTemperature = 96.625f; // Selected so that tier-1 parts can reach 73.15k
-
- /// <summary>
- /// Maximum temperature the device can reach with a 0 total capacitor quality. Usually the quality will be at
- /// least 1.
- /// </summary>
- [DataField("baseMaxTemperature")]
- [ViewVariables(VVAccess.ReadWrite)]
- public float BaseMaxTemperature = Atmospherics.T20C;
-
- /// <summary>
- /// Decrease in minimum temperature, per unit machine part quality.
- /// </summary>
- [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;
-
- /// <summary>
- /// The machine part that affects the heat capacity.
- /// </summary>
- [DataField("machinePartHeatCapacity", customTypeSerializer: typeof(PrototypeIdSerializer<MachinePartPrototype>))]
- public string MachinePartHeatCapacity = "MatterBin";
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public float MaxTemperature = 593.15f;
/// <summary>
- /// The machine part that affects the temperature range.
+ /// Last amount of energy added/removed from the attached pipe network
/// </summary>
- [DataField("machinePartTemperature", customTypeSerializer: typeof(PrototypeIdSerializer<MachinePartPrototype>))]
- public string MachinePartTemperature = "Capacitor";
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public float LastEnergyDelta;
/// <summary>
- /// Last amount of energy added/removed from the attached pipe network
+ /// An percentage of the energy change that is leaked into the surrounding environment rather than the inlet pipe.
/// </summary>
- [DataField("lastEnergyDelta")]
- [ViewVariables(VVAccess.ReadWrite)]
- public float LastEnergyDelta;
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public float EnergyLeakPercentage;
}
}
using Content.Server.Atmos.Monitor.Systems;
using Content.Server.Atmos.Piping.Components;
using Content.Server.Atmos.Piping.Unary.Components;
-using Content.Server.Construction;
using Content.Server.DeviceNetwork;
using Content.Server.DeviceNetwork.Components;
using Content.Server.DeviceNetwork.Systems;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Content.Server.Power.EntitySystems;
+using Content.Server.UserInterface;
using Content.Shared.Examine;
namespace Content.Server.Atmos.Piping.Unary.EntitySystems
[Dependency] private readonly NodeContainerSystem _nodeContainer = default!;
[Dependency] private readonly DeviceNetworkSystem _deviceNetwork = default!;
-
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GasThermoMachineComponent, AtmosDeviceUpdateEvent>(OnThermoMachineUpdated);
- SubscribeLocalEvent<GasThermoMachineComponent, RefreshPartsEvent>(OnGasThermoRefreshParts);
- SubscribeLocalEvent<GasThermoMachineComponent, UpgradeExamineEvent>(OnGasThermoUpgradeExamine);
SubscribeLocalEvent<GasThermoMachineComponent, ExaminedEvent>(OnExamined);
// UI events
+ SubscribeLocalEvent<GasThermoMachineComponent, BeforeActivatableUIOpenEvent>(OnBeforeOpened);
SubscribeLocalEvent<GasThermoMachineComponent, GasThermomachineToggleMessage>(OnToggleMessage);
SubscribeLocalEvent<GasThermoMachineComponent, GasThermomachineChangeTemperatureMessage>(OnChangeTemperature);
SubscribeLocalEvent<GasThermoMachineComponent, DeviceNetworkPacketEvent>(OnPacketRecv);
}
+ private void OnBeforeOpened(Entity<GasThermoMachineComponent> ent, ref BeforeActivatableUIOpenEvent args)
+ {
+ DirtyUI(ent, ent.Comp);
+ }
+
private void OnThermoMachineUpdated(EntityUid uid, GasThermoMachineComponent thermoMachine, ref AtmosDeviceUpdateEvent args)
{
if (!(_power.IsPowered(uid) && TryComp<ApcPowerReceiverComponent>(uid, out var receiver))
thermoMachine.HysteresisState = false; // turn off
}
float dQActual = dQ * scale;
- _atmosphereSystem.AddHeat(inlet.Air, dQActual);
+ float dQLeak = dQActual * thermoMachine.EnergyLeakPercentage;
+ float dQPipe = dQActual - dQLeak;
+ _atmosphereSystem.AddHeat(inlet.Air, dQPipe);
+
+ if (_atmosphereSystem.GetContainingMixture(uid) is { } containingMixture)
+ _atmosphereSystem.AddHeat(containingMixture, dQLeak);
+
receiver.Load = thermoMachine.HeatCapacity;// * scale; // we're not ready for dynamic load yet, see note above
}
return comp.Cp >= 0;
}
- private void OnGasThermoRefreshParts(EntityUid uid, GasThermoMachineComponent thermoMachine, RefreshPartsEvent args)
- {
- var heatCapacityPartRating = args.PartRatings[thermoMachine.MachinePartHeatCapacity];
- thermoMachine.HeatCapacity = thermoMachine.BaseHeatCapacity * MathF.Pow(heatCapacityPartRating, 2);
-
- var temperatureRangePartRating = args.PartRatings[thermoMachine.MachinePartTemperature];
- if (IsHeater(thermoMachine))
- {
- // 593.15K with stock parts.
- thermoMachine.MaxTemperature = thermoMachine.BaseMaxTemperature + thermoMachine.MaxTemperatureDelta * temperatureRangePartRating;
- thermoMachine.MinTemperature = Atmospherics.T20C;
- }
- else {
- // 73.15K with stock parts.
- thermoMachine.MinTemperature = MathF.Max(
- thermoMachine.BaseMinTemperature - thermoMachine.MinTemperatureDelta * temperatureRangePartRating, Atmospherics.TCMB);
- thermoMachine.MaxTemperature = Atmospherics.T20C;
- }
-
- DirtyUI(uid, thermoMachine);
- }
-
- private void OnGasThermoUpgradeExamine(EntityUid uid, GasThermoMachineComponent thermoMachine, UpgradeExamineEvent args)
- {
- if (IsHeater(thermoMachine))
- {
- args.AddPercentageUpgrade("gas-thermo-component-upgrade-heating", thermoMachine.MaxTemperature / (thermoMachine.BaseMaxTemperature + thermoMachine.MaxTemperatureDelta));
- }
- else
- {
- args.AddPercentageUpgrade("gas-thermo-component-upgrade-cooling", thermoMachine.MinTemperature / (thermoMachine.BaseMinTemperature - thermoMachine.MinTemperatureDelta));
- }
- args.AddPercentageUpgrade("gas-thermo-component-upgrade-heat-capacity", thermoMachine.HeatCapacity / thermoMachine.BaseHeatCapacity);
- }
-
private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args)
{
_power.TogglePower(uid);
deconstructionTarget: null
node: heater
+- type: entity
+ parent: BaseMachineCircuitboard
+ id: HellfireFreezerMachineCircuitBoard
+ name: hellfire freezer machine board
+ description: Looks like you could use a screwdriver to change the board type.
+ components:
+ - type: Sprite
+ state: engineering
+ - type: MachineBoard
+ prototype: GasThermoMachineHellfireFreezer
+ requirements:
+ MatterBin: 2
+ Capacitor: 2
+ materialRequirements:
+ Plasma: 1
+ - type: Construction
+ deconstructionTarget: null
+ graph: ThermomachineBoard
+ node: hellfirefreezer
+
+- type: entity
+ parent: BaseMachineCircuitboard
+ id: HellfireHeaterMachineCircuitBoard
+ name: hellfire heater machine board
+ description: Looks like you could use a screwdriver to change the board type.
+ components:
+ - type: Sprite
+ state: engineering
+ - type: MachineBoard
+ prototype: GasThermoMachineHellfireHeater
+ requirements:
+ MatterBin: 2
+ Capacitor: 2
+ materialRequirements:
+ Plasma: 1
+ - type: Construction
+ graph: ThermomachineBoard
+ deconstructionTarget: null
+ node: hellfireheater
+
- type: entity
id: CondenserMachineCircuitBoard
parent: BaseMachineCircuitboard
- FloorBlueCircuit
dynamicRecipes:
- ThermomachineFreezerMachineCircuitBoard
+ - HellfireFreezerMachineCircuitBoard
- PortableScrubberMachineCircuitBoard
- CloningPodMachineCircuitboard
- MedicalScannerMachineCircuitboard
- type: ApcPowerReceiver
powerDisabled: false
+- type: entity
+ parent: GasThermoMachineFreezer
+ id: GasThermoMachineHellfireFreezer
+ name: hellfire freezer
+ description: An advanced machine that cools gas in connected pipes. Has the side effect of chilling the surrounding area. Cold as Hell!
+ components:
+ - type: Sprite
+ sprite: Structures/Piping/Atmospherics/hellfirethermomachine.rsi
+ - type: GasThermoMachine
+ minTemperature: 23.15
+ heatCapacity: 40000
+ energyLeakPercentage: 0.15
+ - type: Machine
+ board: HellfireFreezerMachineCircuitBoard
+
+- type: entity
+ parent: GasThermoMachineHeater
+ id: GasThermoMachineHellfireHeater
+ name: hellfire heater
+ description: An advanced machine that heats gas in connected pipes. Has the side effect of leaking heat into the surrounding area. Hot as Hell!
+ components:
+ - type: Sprite
+ sprite: Structures/Piping/Atmospherics/hellfirethermomachine.rsi
+ - type: GasThermoMachine
+ maxTemperature: 1193.15
+ heatCapacity: 40000
+ energyLeakPercentage: 0.15
+ - type: Machine
+ board: HellfireHeaterMachineCircuitBoard
+
- type: entity
parent: [ BaseMachinePowered, ConstructibleMachine ]
id: BaseGasCondenser
steps:
- tool: Screwing
doAfter: 2
+ - node: hellfirefreezer
+ entity: HellfireFreezerMachineCircuitBoard
+ edges:
+ - to: hellfireheater
+ steps:
+ - tool: Screwing
+ doAfter: 2
+ - node: hellfireheater
+ entity: HellfireHeaterMachineCircuitBoard
+ edges:
+ - to: hellfirefreezer
+ steps:
+ - tool: Screwing
+ doAfter: 2
Glass: 900
Gold: 50
+- type: latheRecipe
+ id: HellfireFreezerMachineCircuitBoard
+ result: HellfireFreezerMachineCircuitBoard
+ completetime: 4
+ materials:
+ Steel: 150
+ Glass: 900
+ Gold: 50
+
- type: latheRecipe
id: CondenserMachineCircuitBoard
result: CondenserMachineCircuitBoard
state: icon
discipline: Industrial
tier: 2
- cost: 5000
+ cost: 7500
recipeUnlocks:
- - HolofanProjector
+ - HellfireFreezerMachineCircuitBoard
- PortableScrubberMachineCircuitBoard
+ - HolofanProjector
- type: technology
id: AdvancedToolsTechnology
--- /dev/null
+{
+ "version":1,
+ "size":{"x":32,"y":32},
+ "copyright":"Base sprites taken from tgstation, split to display on two layers (machinebody/panel) by Menshin, and recolored and edited by EmoGarbage404 (github)",
+ "license":"CC-BY-SA-3.0",
+ "states":[
+ {
+ "name":"freezerOff",
+ "directions":1
+ },
+ {
+ "name":"freezerPanelOpen",
+ "directions":1
+ },
+ {
+ "name":"freezerOn",
+ "directions":1,
+ "delays":[ [ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] ]
+ },
+ {
+ "name":"heaterOff",
+ "directions":1
+ },
+ {
+ "name":"heaterPanelOpen",
+ "directions":1
+ },
+ {
+ "name":"heaterOn",
+ "directions":1,
+ "delays":[ [ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] ]
+ },
+ {
+ "name":"pipe",
+ "directions":4
+ }
+ ]
+}