]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Hellfire Thermomachines (#23543)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Sun, 7 Jan 2024 13:55:22 +0000 (08:55 -0500)
committerGitHub <noreply@github.com>
Sun, 7 Jan 2024 13:55:22 +0000 (08:55 -0500)
* hellfire thermomachines

* slight nerf? idk

* ilya review

* Improve clarity

* Update Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs

Co-authored-by: Kevin Zheng <kevinz5000@gmail.com>
---------

Co-authored-by: Kevin Zheng <kevinz5000@gmail.com>
17 files changed:
Content.Client/Atmos/UI/GasThermomachineWindow.xaml.cs
Content.Server/Atmos/Piping/Unary/Components/GasThermoMachineComponent.cs
Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs
Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml
Resources/Prototypes/Entities/Structures/Machines/lathe.yml
Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml
Resources/Prototypes/Recipes/Construction/Graphs/utilities/thermomachine-board.yml
Resources/Prototypes/Recipes/Lathes/electronics.yml
Resources/Prototypes/Research/industrial.yml
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOff.png [new file with mode: 0644]
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOn.png [new file with mode: 0644]
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerPanelOpen.png [new file with mode: 0644]
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOff.png [new file with mode: 0644]
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOn.png [new file with mode: 0644]
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterPanelOpen.png [new file with mode: 0644]
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/pipe.png [new file with mode: 0644]

index 12e0617a5542cf5335cc5b23a3b20cc7a8959fc7..bc8cb143364fe521db408941486b38cf4630bd55 100644 (file)
@@ -17,7 +17,7 @@ public sealed partial class GasThermomachineWindow : DefaultWindow
         RobustXamlLoader.Load(this);
 
         SpinboxHBox.AddChild(
-            TemperatureSpinbox = new FloatSpinBox(.1f, 2) { MaxWidth = 150, HorizontalExpand = true }
+            TemperatureSpinbox = new FloatSpinBox(.1f, 2) { MinWidth = 150, HorizontalExpand = true }
             );
     }
 
index e8d0f0f30fab5d167033b62d17c9ad1cefd181dd..93d973d12310966f2468b1895b7e4bbcaef43608 100644 (file)
@@ -1,7 +1,4 @@
 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
 {
@@ -15,24 +12,16 @@ 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>
@@ -40,7 +29,7 @@ namespace Content.Server.Atmos.Piping.Unary.Components
         ///     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.
@@ -51,68 +40,29 @@ namespace Content.Server.Atmos.Piping.Unary.Components
         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;
     }
 }
index 46e3b3c1721da05cd731e7cb1c7175a2587793d8..eec610ffa6140f72262142d39306b2e63815ae29 100644 (file)
@@ -2,7 +2,6 @@ using Content.Server.Atmos.EntitySystems;
 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;
@@ -15,6 +14,7 @@ using Content.Shared.Atmos.Piping.Unary.Components;
 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
@@ -28,17 +28,15 @@ 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);
 
@@ -46,6 +44,11 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
             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))
@@ -90,7 +93,13 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
                 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
         }
 
@@ -99,41 +108,6 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
             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);
index d683195f2f62f196642c605270d306909c44dc14..a16a69ee216711cf973995a1ba8b2829d9b8e597 100644 (file)
     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
index 07d5f3f854cfa85d34606f82c8934e6406df72fa..80ed1f11365e043f96c46e6ffce751a602c8ffd8 100644 (file)
     - FloorBlueCircuit
     dynamicRecipes:
       - ThermomachineFreezerMachineCircuitBoard
+      - HellfireFreezerMachineCircuitBoard
       - PortableScrubberMachineCircuitBoard
       - CloningPodMachineCircuitboard
       - MedicalScannerMachineCircuitboard
index 12514f03fe3490edec641b9ef6d2c8989556c4dd..45030bd28bd7573ebd356ec129fd2f04c5861cfb 100644 (file)
   - 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
index 8818e5d1ba2c77f79de56cb68370812fd3358fe9..e9c7a3c9a37b4372516d7d5661927f8427a20fec 100644 (file)
       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
index 3b5c04f4fe9a3933e7034ca7335653af7b109971..55337702b5a0f9f4d7dc42ce0c34272555cefc76 100644 (file)
     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
index d991645be0f0a6f90b8b7cd90611a390812e3eab..f47d5a6398570b82062481e313a74eb8db9da56c 100644 (file)
     state: icon
   discipline: Industrial
   tier: 2
-  cost: 5000
+  cost: 7500
   recipeUnlocks:
-  - HolofanProjector
+  - HellfireFreezerMachineCircuitBoard
   - PortableScrubberMachineCircuitBoard
+  - HolofanProjector
 
 - type: technology
   id: AdvancedToolsTechnology
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOff.png b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOff.png
new file mode 100644 (file)
index 0000000..0327135
Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOff.png differ
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOn.png b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOn.png
new file mode 100644 (file)
index 0000000..17e68ca
Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerOn.png differ
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerPanelOpen.png b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerPanelOpen.png
new file mode 100644 (file)
index 0000000..9955f7d
Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/freezerPanelOpen.png differ
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOff.png b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOff.png
new file mode 100644 (file)
index 0000000..7059708
Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOff.png differ
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOn.png b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOn.png
new file mode 100644 (file)
index 0000000..565052b
Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterOn.png differ
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterPanelOpen.png b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterPanelOpen.png
new file mode 100644 (file)
index 0000000..f1b2a9d
Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/heaterPanelOpen.png differ
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/meta.json b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/meta.json
new file mode 100644 (file)
index 0000000..979d804
--- /dev/null
@@ -0,0 +1,38 @@
+{
+    "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
+        }
+    ]
+}
diff --git a/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/pipe.png b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/pipe.png
new file mode 100644 (file)
index 0000000..620ba90
Binary files /dev/null and b/Resources/Textures/Structures/Piping/Atmospherics/hellfirethermomachine.rsi/pipe.png differ