diff --git a/Content.Client/Atmos/UI/GasThermomachineWindow.xaml.cs b/Content.Client/Atmos/UI/GasThermomachineWindow.xaml.cs index 691d5ea910..12e0617a55 100644 --- a/Content.Client/Atmos/UI/GasThermomachineWindow.xaml.cs +++ b/Content.Client/Atmos/UI/GasThermomachineWindow.xaml.cs @@ -1,4 +1,4 @@ -using Robust.Client.AutoGenerated; +using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; @@ -27,10 +27,12 @@ public sealed partial class GasThermomachineWindow : DefaultWindow if (active) { ToggleStatusButton.Text = Loc.GetString("comp-gas-thermomachine-ui-status-enabled"); + ToggleStatusButton.Pressed = true; } else { ToggleStatusButton.Text = Loc.GetString("comp-gas-thermomachine-ui-status-disabled"); + ToggleStatusButton.Pressed = false; } } diff --git a/Content.Server/Atmos/Piping/Unary/Components/GasThermoMachineComponent.cs b/Content.Server/Atmos/Piping/Unary/Components/GasThermoMachineComponent.cs index b165c8785e..fcfffd2fec 100644 --- a/Content.Server/Atmos/Piping/Unary/Components/GasThermoMachineComponent.cs +++ b/Content.Server/Atmos/Piping/Unary/Components/GasThermoMachineComponent.cs @@ -13,7 +13,7 @@ namespace Content.Server.Atmos.Piping.Unary.Components [ViewVariables(VVAccess.ReadWrite)] [DataField("enabled")] - public bool Enabled = true; + public bool Enabled = false; /// /// Current maximum temperature, calculated from and the quality of matter @@ -92,5 +92,6 @@ namespace Content.Server.Atmos.Piping.Unary.Components /// [DataField("machinePartTemperature", customTypeSerializer: typeof(PrototypeIdSerializer))] public string MachinePartTemperature = "Laser"; + } } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 7592b3abc6..9f841bef26 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -5,28 +5,30 @@ using Content.Server.Construction; using Content.Server.NodeContainer; using Content.Server.NodeContainer.Nodes; using Content.Shared.Atmos; -using Content.Shared.Atmos.Piping; using Content.Shared.Atmos.Piping.Unary.Components; using JetBrains.Annotations; using Robust.Server.GameObjects; +using Content.Server.Power.EntitySystems; +using Content.Shared.Examine; namespace Content.Server.Atmos.Piping.Unary.EntitySystems { [UsedImplicitly] public sealed class GasThermoMachineSystem : EntitySystem { - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly PowerReceiverSystem _power = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnThermoMachineUpdated); - SubscribeLocalEvent(OnThermoMachineLeaveAtmosphere); SubscribeLocalEvent(OnGasThermoRefreshParts); SubscribeLocalEvent(OnGasThermoUpgradeExamine); + SubscribeLocalEvent(OnExamined); // UI events SubscribeLocalEvent(OnToggleMessage); @@ -35,12 +37,11 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems private void OnThermoMachineUpdated(EntityUid uid, GasThermoMachineComponent thermoMachine, AtmosDeviceUpdateEvent args) { - if (!thermoMachine.Enabled - || !EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) + + if (!(thermoMachine.Enabled && _power.IsPowered(uid)) + || !TryComp(uid, out NodeContainerComponent? nodeContainer) || !nodeContainer.TryGetNode(thermoMachine.InletName, out PipeNode? inlet)) { - DirtyUI(uid, thermoMachine); - _appearance.SetData(uid, ThermoMachineVisuals.Enabled, false); return; } @@ -49,82 +50,90 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems if (!MathHelper.CloseTo(combinedHeatCapacity, 0, 0.001f)) { - _appearance.SetData(uid, ThermoMachineVisuals.Enabled, true); var combinedEnergy = thermoMachine.HeatCapacity * thermoMachine.TargetTemperature + airHeatCapacity * inlet.Air.Temperature; inlet.Air.Temperature = combinedEnergy / combinedHeatCapacity; } - - // TODO ATMOS: Active power usage. } - private void OnThermoMachineLeaveAtmosphere(EntityUid uid, GasThermoMachineComponent component, AtmosDeviceDisabledEvent args) + private void OnGasThermoRefreshParts(EntityUid uid, GasThermoMachineComponent thermoMachine, RefreshPartsEvent args) { - _appearance.SetData(uid, ThermoMachineVisuals.Enabled, false); + var matterBinRating = args.PartRatings[thermoMachine.MachinePartHeatCapacity]; + var laserRating = args.PartRatings[thermoMachine.MachinePartTemperature]; - DirtyUI(uid, component); - } + thermoMachine.HeatCapacity = thermoMachine.BaseHeatCapacity * MathF.Pow(matterBinRating, 2); - private void OnGasThermoRefreshParts(EntityUid uid, GasThermoMachineComponent component, RefreshPartsEvent args) - { - var matterBinRating = args.PartRatings[component.MachinePartHeatCapacity]; - var laserRating = args.PartRatings[component.MachinePartTemperature]; - - component.HeatCapacity = component.BaseHeatCapacity * MathF.Pow(matterBinRating, 2); - - switch (component.Mode) + switch (thermoMachine.Mode) { // 593.15K with stock parts. case ThermoMachineMode.Heater: - component.MaxTemperature = component.BaseMaxTemperature + component.MaxTemperatureDelta * laserRating; - component.MinTemperature = Atmospherics.T20C; + thermoMachine.MaxTemperature = thermoMachine.BaseMaxTemperature + thermoMachine.MaxTemperatureDelta * laserRating; + thermoMachine.MinTemperature = Atmospherics.T20C; break; // 73.15K with stock parts. case ThermoMachineMode.Freezer: - component.MinTemperature = MathF.Max( - component.BaseMinTemperature - component.MinTemperatureDelta * laserRating, Atmospherics.TCMB); - component.MaxTemperature = Atmospherics.T20C; + thermoMachine.MinTemperature = MathF.Max( + thermoMachine.BaseMinTemperature - thermoMachine.MinTemperatureDelta * laserRating, Atmospherics.TCMB); + thermoMachine.MaxTemperature = Atmospherics.T20C; break; } - DirtyUI(uid, component); + DirtyUI(uid, thermoMachine); } - private void OnGasThermoUpgradeExamine(EntityUid uid, GasThermoMachineComponent component, UpgradeExamineEvent args) + private void OnGasThermoUpgradeExamine(EntityUid uid, GasThermoMachineComponent thermoMachine, UpgradeExamineEvent args) { - switch (component.Mode) + switch (thermoMachine.Mode) { case ThermoMachineMode.Heater: - args.AddPercentageUpgrade("gas-thermo-component-upgrade-heating", component.MaxTemperature / (component.BaseMaxTemperature + component.MaxTemperatureDelta)); + args.AddPercentageUpgrade("gas-thermo-component-upgrade-heating", thermoMachine.MaxTemperature / (thermoMachine.BaseMaxTemperature + thermoMachine.MaxTemperatureDelta)); break; case ThermoMachineMode.Freezer: - args.AddPercentageUpgrade("gas-thermo-component-upgrade-cooling", component.MinTemperature / (component.BaseMinTemperature - component.MinTemperatureDelta)); + args.AddPercentageUpgrade("gas-thermo-component-upgrade-cooling", thermoMachine.MinTemperature / (thermoMachine.BaseMinTemperature - thermoMachine.MinTemperatureDelta)); break; } - args.AddPercentageUpgrade("gas-thermo-component-upgrade-heat-capacity", component.HeatCapacity / component.BaseHeatCapacity); + args.AddPercentageUpgrade("gas-thermo-component-upgrade-heat-capacity", thermoMachine.HeatCapacity / thermoMachine.BaseHeatCapacity); } - private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent component, GasThermomachineToggleMessage args) + private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args) { - component.Enabled = !component.Enabled; - - DirtyUI(uid, component); + SetEnabled(uid, thermoMachine, _power.TogglePower(uid)); + DirtyUI(uid, thermoMachine); } - private void OnChangeTemperature(EntityUid uid, GasThermoMachineComponent component, GasThermomachineChangeTemperatureMessage args) + private void OnChangeTemperature(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineChangeTemperatureMessage args) { - component.TargetTemperature = - Math.Clamp(args.Temperature, component.MinTemperature, component.MaxTemperature); + thermoMachine.TargetTemperature = + Math.Clamp(args.Temperature, thermoMachine.MinTemperature, thermoMachine.MaxTemperature); - DirtyUI(uid, component); + DirtyUI(uid, thermoMachine); } - private void DirtyUI(EntityUid uid, GasThermoMachineComponent? thermo, ServerUserInterfaceComponent? ui=null) + private void DirtyUI(EntityUid uid, GasThermoMachineComponent? thermoMachine, ServerUserInterfaceComponent? ui=null) { - if (!Resolve(uid, ref thermo, ref ui, false)) + if (!Resolve(uid, ref thermoMachine, ref ui, false)) return; _userInterfaceSystem.TrySetUiState(uid, ThermomachineUiKey.Key, - new GasThermomachineBoundUserInterfaceState(thermo.MinTemperature, thermo.MaxTemperature, thermo.TargetTemperature, thermo.Enabled, thermo.Mode), null, ui); + new GasThermomachineBoundUserInterfaceState(thermoMachine.MinTemperature, thermoMachine.MaxTemperature, thermoMachine.TargetTemperature, thermoMachine.Enabled, thermoMachine.Mode), null, ui); + } + + private void SetEnabled(EntityUid uid, GasThermoMachineComponent thermoMachine, bool enabled) + { + thermoMachine.Enabled = enabled; + } + + private void OnExamined(EntityUid uid, GasThermoMachineComponent thermoMachine, ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + if (Loc.TryGetString("gas-thermomachine-system-examined", out var str, + ("machineName", thermoMachine.Mode == ThermoMachineMode.Freezer ? "freezer" : "heater"), + ("tempColor", thermoMachine.Mode == ThermoMachineMode.Freezer ? "deepskyblue" : "red"), + ("temp", Math.Round(thermoMachine.TargetTemperature,2)) + )) + + args.PushMarkup(str); } } } diff --git a/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs b/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs index 1ffbc31f35..dfc7b7a386 100644 --- a/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs +++ b/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs @@ -20,12 +20,6 @@ namespace Content.Shared.Atmos.Piping Enabled, } - [Serializable, NetSerializable] - public enum ThermoMachineVisuals : byte - { - Enabled, - } - [Serializable, NetSerializable] public enum PumpVisuals : byte { diff --git a/Resources/Locale/en-US/atmos/gas-thermomachine-system.ftl b/Resources/Locale/en-US/atmos/gas-thermomachine-system.ftl new file mode 100644 index 0000000000..b5a44a268c --- /dev/null +++ b/Resources/Locale/en-US/atmos/gas-thermomachine-system.ftl @@ -0,0 +1,2 @@ +# Examine Text +gas-thermomachine-system-examined = The {$machineName} thermostat is set to [color={$tempColor}]{$temp} °C[/color]. diff --git a/Resources/Prototypes/Catalog/Research/technologies.yml b/Resources/Prototypes/Catalog/Research/technologies.yml index 8641bc892e..1ad09c82ba 100644 --- a/Resources/Prototypes/Catalog/Research/technologies.yml +++ b/Resources/Prototypes/Catalog/Research/technologies.yml @@ -405,7 +405,7 @@ description: technologies-advanced-atmospherics-technology-description icon: sprite: Structures/Piping/Atmospherics/thermomachine.rsi - state: freezer_off + state: freezerOff requiredPoints: 7500 requiredTechnologies: - ElectricalEngineering diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index 648221c1bd..11d2b9a1f8 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -247,6 +247,7 @@ - type: Wires BoardName: "Thermomachine" LayoutId: Thermomachine + - type: WiresVisuals - type: NodeContainer nodes: pipe: @@ -268,21 +269,35 @@ components: - type: Sprite layers: - - state: freezer_off - map: [ "enabled" ] + - state: freezerOff + map: [ "enum.PowerDeviceVisualLayers.Powered" ] + - state: freezerPanelOpen + map: [ "enum.WiresVisualLayers.MaintenancePanel" ] - state: pipe map: [ "enum.PipeVisualLayers.Pipe" ] - type: GenericVisualizer visuals: - enum.ThermoMachineVisuals.Enabled: - enabled: - True: { state: freezer_on } - False: { state: freezer_off } + enum.PowerDeviceVisuals.Powered: + enum.PowerDeviceVisualLayers.Powered: + True: { state: freezerOn } + False: { state: freezerOff } - type: GasThermoMachine mode: Freezer + - type: ApcPowerReceiver + powerDisabled: true #starts off - type: Machine board: ThermomachineFreezerMachineCircuitBoard +- type: entity + parent: GasThermoMachineFreezer + id: GasThermoMachineFreezerEnabled + suffix: Enabled + components: + - type: GasThermoMachine + enabled: true + - type: ApcPowerReceiver + powerDisabled: false + - type: entity parent: BaseGasThermoMachine id: GasThermoMachineHeater @@ -293,17 +308,31 @@ components: - type: Sprite layers: - - state: heater_off - map: [ "enabled" ] + - state: heaterOff + map: [ "enum.PowerDeviceVisualLayers.Powered" ] + - state: heaterPanelOpen + map: ["enum.WiresVisualLayers.MaintenancePanel"] - state: pipe map: [ "enum.PipeVisualLayers.Pipe" ] - type: GenericVisualizer visuals: - enum.ThermoMachineVisuals.Enabled: - enabled: - True: { state: heater_on } - False: { state: heater_off } + enum.PowerDeviceVisuals.Powered: + enum.PowerDeviceVisualLayers.Powered: + True: { state: heaterOn } + False: { state: heaterOff } - type: GasThermoMachine mode: Heater + - type: ApcPowerReceiver + powerDisabled: true #starts off - type: Machine board: ThermomachineHeaterMachineCircuitBoard + +- type: entity + parent: GasThermoMachineHeater + id: GasThermoMachineHeaterEnabled + suffix: Enabled + components: + - type: GasThermoMachine + enabled: true + - type: ApcPowerReceiver + powerDisabled: false diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_off.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerOff.png similarity index 100% rename from Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_off.png rename to Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerOff.png diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_on.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerOn.png similarity index 100% rename from Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_on.png rename to Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerOn.png diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerPanelOpen.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerPanelOpen.png new file mode 100644 index 0000000000..2b12a2d5c0 Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerPanelOpen.png differ diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_open.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_open.png deleted file mode 100644 index 87e8042e84..0000000000 Binary files a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_open.png and /dev/null differ diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_off.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterOff.png similarity index 100% rename from Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_off.png rename to Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterOff.png diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_on.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterOn.png similarity index 100% rename from Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_on.png rename to Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterOn.png diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterPanelOpen.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterPanelOpen.png new file mode 100644 index 0000000000..53905e1e8c Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterPanelOpen.png differ diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_open.png b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_open.png deleted file mode 100644 index 9cbe10c974..0000000000 Binary files a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_open.png and /dev/null differ diff --git a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/meta.json b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/meta.json index 5b63ec0e20..4cbb72e1ac 100644 --- a/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/meta.json @@ -1 +1,38 @@ -{"version":1,"size":{"x":32,"y":32},"copyright":"Taken from tgstation","license":"CC-BY-SA-3.0","states":[{"name":"freezer_off"},{"name":"freezer_open"},{"name":"freezer_on","directions":1,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]]},{"name":"heater_off"},{"name":"heater_open"},{"name":"heater_on","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}]} \ No newline at end of file +{ + "version":1, + "size":{"x":32,"y":32}, + "copyright":"Base sprites taken from tgstation, splitted to display on two layers (machinebody/panel) by Menshin, for SS14", + "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 + } + ] +} \ No newline at end of file