From fd973be10ca5039916779ebbf8f0b45fb7b198b7 Mon Sep 17 00:00:00 2001 From: Menshin Date: Sun, 23 Apr 2023 05:05:32 +0200 Subject: [PATCH] Thermomachines code cleaning + some QoL (#14772) --- .../Atmos/UI/GasThermomachineWindow.xaml.cs | 4 +- .../Components/GasThermoMachineComponent.cs | 3 +- .../EntitySystems/GasThermoMachineSystem.cs | 97 ++++++++++-------- .../Atmos/Piping/EnabledAtmosDeviceVisuals.cs | 6 -- .../en-US/atmos/gas-thermomachine-system.ftl | 2 + .../Catalog/Research/technologies.yml | 2 +- .../Structures/Piping/Atmospherics/unary.yml | 53 +++++++--- .../{freezer_off.png => freezerOff.png} | Bin .../{freezer_on.png => freezerOn.png} | Bin .../thermomachine.rsi/freezerPanelOpen.png | Bin 0 -> 280 bytes .../thermomachine.rsi/freezer_open.png | Bin 1671 -> 0 bytes .../{heater_off.png => heaterOff.png} | Bin .../{heater_on.png => heaterOn.png} | Bin .../thermomachine.rsi/heaterPanelOpen.png | Bin 0 -> 227 bytes .../thermomachine.rsi/heater_open.png | Bin 1656 -> 0 bytes .../Atmospherics/thermomachine.rsi/meta.json | 39 ++++++- 16 files changed, 140 insertions(+), 66 deletions(-) create mode 100644 Resources/Locale/en-US/atmos/gas-thermomachine-system.ftl rename Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/{freezer_off.png => freezerOff.png} (100%) rename Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/{freezer_on.png => freezerOn.png} (100%) create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezerPanelOpen.png delete mode 100644 Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/freezer_open.png rename Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/{heater_off.png => heaterOff.png} (100%) rename Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/{heater_on.png => heaterOn.png} (100%) create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heaterPanelOpen.png delete mode 100644 Resources/Textures/Structures/Piping/Atmospherics/thermomachine.rsi/heater_open.png 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 0000000000000000000000000000000000000000..2b12a2d5c0cf13256a5340c0b640e249df1471b1 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7a$D;Kb?2i11Zh|kH}&M z25w;xW@MN(M*=9wUgGKN%Kn_0T};tnJ-=lgP-v;Ai(^Q{;kT1F@*Xk}aIIhDu`Y3< z$h|{72N-f5DDGiAbBH4(@L0pF1jYJUAurZ>%W%FkRiCeW_w!Bm93N%XV6Q2k43DK{ zHu`DFIbAqcoZ0Dj`^9?O3+F=TA1ROst85C}`^sg<-sanu5BA=Z53p|F)cDRMkdRi} z_(|(Tzm2}xivtxh|C4!K&ne{3`_mV?e1VwS09)x6~}+~y*FPT&-fcx@fXH!A`p%%nMSFbMHQtL9mlw^Nv$ZGexxgsMO3;8$O5r| z2xZf>f?e5E?V@TibqbD96m=DB*+ho6n0Szw1@Xst>^EO;-n;L1F`kPD#z0f59%*!E z-h20)-~FF+&$|QvXA`w9o;`b3)w+J{*s+?=|2JmU3Z6(Lc6wetYluexDmM7ZAQ)Rw z3yLpBzIc{#wHZ6zP(?+kIYg)_1m6E7Ht-k)D1yK0g9250P!c=U$J1D?^i=_zK7Cp{ z_Z^?oT50RYgJ+H&J^FRy<2a5we*Ab9ga$Zu>XaH88R6>Hs{ky#xlq$dCX+#_|6Bwi z1V@e>A)C#rGiT0d2n%3xa#GFB&C%D_M;yG9IEWB} zKp=op3Z)d2lap$6bW~`7iq+TGGc`3u!?9m7Gz7D=RE<-7KyPm^Kb1enU3Yjt{XXO4 zm=;$a?N<7cgjsTt8Kp=o+ zSvt=`2rSFObzOYl$M=0)*X5JxXhfh47Z)iO zi&&OLI2_h<BJ}@ZyVX+BPM}(RoKH6riL;`99HTlyCI+bN|jA z-cG$7(g2;Eoow1R-QC?t&(r%>DTU{GIF3Uw7$lWS0q}fJ4`*)N0N}@m4{Q13u^7Z+ zdVZxwOv_?^exAUwuU=9L5l$Os^EhVi8jaR##VP zX>BE)&oeze4Z!m9GH;BJb8}&VUG43<;sqcK1C*kfM_(zO}i1- zu&6VF7{Wjp0$(Z$MiJNZS*uqx1(yi~0_1Wza=Dyd<^5nE!iaAHSO^0U<@xvRFtJ#S zhph_0G);c?gT36ndzU~UpmXl~KBZC#&-1vH{5v!5w^;p0h~0S!e%VDP+s<>|r@S`s zeXT&nq?B}YbnxNaqwTv2KnOwO+^^WZVPi(>5N7$d@+H1g#4i4R$xttwjabH~5qM5eYhM-feV==!67Yv71N=JKNqRL+G!h^XG`1vE6bb>H zlH^P0+dS9Nf!g~LU0q%J4Z5_n#9x*y7H&kgQt$vkN`)EPRb%}%4y7Ny7GiNRODGho zSp$Fka)yhkSNW@q)0r|bL^GMS7%In_EBnx=_qnq;$CJ!Z36pnRaMY}=YC7#kbo z!i5V!xhF&-k#b9xl593hp-`aYI3$xv>g(%STU*m}S5{U4IDh_pd1Z#7UrI_T*4EY- z8ykBh1v*hDPo8}0v-ZmJGNDk2a5zj;QxgE8V32es^HlRsoH+5!|Kxsc`!`J1B~MR| RpD6$U002ovPDHLkV1i+c84mye 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 0000000000000000000000000000000000000000..53905e1e8c70873aba65c695874f59be4e8a3572 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7a$D;Kb?2i1F0FFE{-7) zhm#W|5)O3uZdkqgwY}NLO`D9|vaB0eXFrXLi`#MK|MG3h5e1%qE_Av-ERKovn5>a- zP`7m2L5XvVWD^eN+G^dN<;ItANWD^w^Rg|=n)NY`8`_J_j&P+J{rO*i?8pE5l3DLE z8{`tMFj~kaUFNO#BR}WQ{DTrv3S+oz;Bq^tA;G#hL4?PgfkDc~ WaKomK@613qGI+ZBxvX9)x6@b6{-kU#!TKCVKIaBlf|3<7@&SSCIZttt-4Y32DB84MAs=5v? ze)2s1?hOEQ4CvYaPId*Ddt!cUYrb23Jd4yyUlqW`ix;bm&utqk0H;r%{;K{d7K`fa z*|Sv;8sNf(3+lv)6WqFW3xH#bi~6Nw+Z592G)n#FK@dW4>eMMRnT)!0>5_)90466V z)%^TCy}iA}Vlk$srfM1)85tp!O0lr8umfT@sG~=ZB80%_^P!YNDaGXEq#7O`78;-; z_4V~kO-<2o=I0Cyz}y^F;{+el)6>IG40k%sO zK&e!Esxg4xo*o{y-UmR6>Y5VUuFWk+FZT5zgwT$~6FM3|DMc=q+Y=xV3NiE9XEj5< z-FW5skt0V?N?{lVN~zre0Bqad6X4#xdwl!tx49h*GWY)bJ5u0z9sq`6Af;q>c9y}x zK}^%sY1kDYpU><0z`!7LbF)?B3~%xE-d?OnkN6hwirBp?n@Zt%9*16f3DYz+(31d0 zWg>*2SS$kY&cI;J5g-%}vysiRZrf~bZt7nqlOdbUlFQ}D<#O2hJa#@$I1)ihsiRVf z(0lK`tEwU(gg{D3EEeO#%FVv&ad>zbDJ8D!YD0j|t1mo9u)6=>Z`!TkI@{r&w+Oia+++)QI*BjIqEy1F{* z>gouELil|?GMNnNbefr&8E$_1DMLd;3=Iu2b>jw0OG^|A1uV-V7z}FNXf#SwQxlDi zja<2Mg^`gFoOBu|orcu56okWJJSqA0#~2}51t=*|o<}$w=4*X@Jbv(icapCLG(bm32b;D{S63I( zb@jegO5wUL#bOb^-%m1`1mMN)ZZ6%q1HcbXp48!wMj{Z2X#Gl!n3l!D!U7!~9RU35 z`gJirKJKsDhL&Y<@Zdp~zxUnO-Rhg#xA!tgNii+|t5YF30rrGyu!X%e*x< z#@)q5_P4d^iWh(|3{Z-u=4KL!#CCU#kB^tC0K(xgckM+DCqeZG=2l)k+(~!0Nj6&mARbTAWd4E94y7Nx5nyR4Lm&{SSp&cOVwUU4*ZGr-(vdVU zMA_j+x`WZ+O->x`tQi5rDDcVcrvN0ANeYDm_wV1wah!5k{eEqr(o&UD{P@5F1_l~v zZ;$E-BoayPrj`CiY(Io}p2z0qCdFb=_mPU|O37xkB$G)T$6;-4jg5^BEX%^SZTx;e zwrvxQMoFjB`s7sWTxgmmrfHJNWb~NHWPtL4wz6$&reJh*lxx?n0p*?$3WdroSxPdQ z4EcPXQn5%Pk)Xc5p4HV=t(!`v0JwVfYI$Xbp+8DWDOOik866$nkpi8l^XJb$^I1E! zyi6bvAQ%j?Z{I!u0)9Vh>GU({pF4N%x&O)i%JMJqxEM1QrclWM0000