]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Decouple GasPrototype IDs from Gas Enum (#41266)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Fri, 21 Nov 2025 20:12:13 +0000 (15:12 -0500)
committerGitHub <noreply@github.com>
Fri, 21 Nov 2025 20:12:13 +0000 (20:12 +0000)
* Remove final enum coupling from gas YAML

* Fix comment

* Fix test

* Apply suggestions from code review

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Content.Client/Atmos/Overlays/GasTileOverlay.cs
Content.IntegrationTests/Tests/Atmos/ConstantsTest.cs
Content.Shared/Atmos/EntitySystems/SharedAtmosphereSystem.cs
Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs
Resources/Prototypes/Atmospherics/gases.yml

index d91cc29e4c3c23d88973bb7b294ab02013429444..eeb10b54d03119ac87551535bf6551f57f019129 100644 (file)
@@ -3,6 +3,7 @@ using Content.Client.Atmos.Components;
 using Content.Client.Atmos.EntitySystems;
 using Content.Shared.Atmos;
 using Content.Shared.Atmos.Components;
+using Content.Shared.Atmos.EntitySystems;
 using Content.Shared.Atmos.Prototypes;
 using Robust.Client.GameObjects;
 using Robust.Client.Graphics;
@@ -23,6 +24,7 @@ namespace Content.Client.Atmos.Overlays
 
         private readonly IEntityManager _entManager;
         private readonly IMapManager _mapManager;
+        private readonly SharedAtmosphereSystem _atmosphereSystem;
         private readonly SharedMapSystem _mapSystem;
         private readonly SharedTransformSystem _xformSys;
 
@@ -54,6 +56,7 @@ namespace Content.Client.Atmos.Overlays
         {
             _entManager = entManager;
             _mapManager = IoCManager.Resolve<IMapManager>();
+            _atmosphereSystem = entManager.System<SharedAtmosphereSystem>();
             _mapSystem = entManager.System<SharedMapSystem>();
             _xformSys = xformSys;
             _shader = protoMan.Index(UnshadedShader).Instance();
@@ -67,7 +70,7 @@ namespace Content.Client.Atmos.Overlays
 
             for (var i = 0; i < _gasCount; i++)
             {
-                var gasPrototype = protoMan.Index<GasPrototype>(system.VisibleGasId[i].ToString());
+                var gasPrototype = _atmosphereSystem.GetGas(system.VisibleGasId[i]);
 
                 SpriteSpecifier overlay;
 
index 2e16be564b7cf15049649d153781fc4d7098d7f4..6481e377c95f3c4cc87869a8f51af1bc3fa0c01f 100644 (file)
@@ -38,12 +38,10 @@ public sealed class ConstantsTest
                 Assert.That(Atmospherics.GasAbbreviations, Has.Count.EqualTo(Atmospherics.TotalNumberOfGases),
                      $"GasAbbreviations size is not equal to TotalNumberOfGases.");
 
-                // the ID for each gas has to be a number from 0 to TotalNumberOfGases-1
+                // the ID for each gas has to correspond to a value in the Gas enum (converted to a string)
                 foreach (var gas in gasProtos)
                 {
-                    var validInteger = int.TryParse(gas.ID, out var number);
-                    Assert.That(validInteger, Is.True, $"GasPrototype {gas.ID} has an invalid ID. It has to be an integer between 0 and TotalNumberOfGases - 1.");
-                    Assert.That(number, Is.InRange(0, Atmospherics.TotalNumberOfGases - 1), $"GasPrototype {gas.ID} has an invalid ID. It has to be an integer between 0 and TotalNumberOfGases - 1.");
+                    Assert.That(Enum.TryParse<Gas>(gas.ID, out _), $"GasPrototype {gas.ID} has an invalid ID. It must correspond to a value in the {nameof(Gas)} enum.");
                 }
             });
         });
index 4a177e62635c60119705c273159f95f872a61906..67d6dec8af572a139d83b4fd1c16a9e367bbbfd6 100644 (file)
@@ -1,4 +1,3 @@
-using Content.Shared.Atmos.Components;
 using Content.Shared.Atmos.Prototypes;
 using Content.Shared.Body.Components;
 using Content.Shared.Body.Systems;
@@ -25,10 +24,17 @@ namespace Content.Shared.Atmos.EntitySystems
 
             InitializeBreathTool();
 
-            for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
+            foreach (var gas in Enum.GetValues<Gas>())
             {
-                GasPrototypes[i] = _prototypeManager.Index<GasPrototype>(i.ToString());
-                GasReagents[i] = GasPrototypes[i].Reagent;
+                var idx = (int)gas;
+                // Log an error if the corresponding prototype isn't found
+                if (!_prototypeManager.TryIndex<GasPrototype>(gas.ToString(), out var gasPrototype))
+                {
+                    Log.Error($"Failed to find corresponding {nameof(GasPrototype)} for gas ID {(int)gas} ({gas}) with expected ID \"{gas.ToString()}\". Is your prototype named correctly?");
+                    continue;
+                }
+                GasPrototypes[idx] = gasPrototype;
+                GasReagents[idx] = gasPrototype.Reagent;
             }
         }
 
index 8e7dfdedaf9076aea16d23e80f1bcf39d3f3aaf4..d831616355bb5c1e06cd1c4ae3b9d4c739f3cdfb 100644 (file)
@@ -13,6 +13,7 @@ namespace Content.Shared.Atmos.EntitySystems
         protected bool PvsEnabled;
 
         [Dependency] protected readonly IPrototypeManager ProtoMan = default!;
+        [Dependency] private readonly SharedAtmosphereSystem _atmosphere = default!;
 
         /// <summary>
         ///     array of the ids of all visible gases.
@@ -28,7 +29,7 @@ namespace Content.Shared.Atmos.EntitySystems
 
             for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
             {
-                var gasPrototype = ProtoMan.Index<GasPrototype>(i.ToString());
+                var gasPrototype = _atmosphere.GetGas(i);
                 if (!string.IsNullOrEmpty(gasPrototype.GasOverlayTexture) || !string.IsNullOrEmpty(gasPrototype.GasOverlaySprite) && !string.IsNullOrEmpty(gasPrototype.GasOverlayState))
                     visibleGases.Add(i);
             }
index 253ee17a447ab303234db0c9edc37ea562615456..813c68555bd760587aa49f17720663368597304c 100644 (file)
@@ -1,5 +1,5 @@
 - type: gas
-  id: 0
+  id: Oxygen
   name: gases-oxygen
   specificHeat: 20
   heatCapacityRatio: 1.4
@@ -9,7 +9,7 @@
   pricePerMole: 0
 
 - type: gas
-  id: 1
+  id: Nitrogen
   name: gases-nitrogen
   specificHeat: 30
   heatCapacityRatio: 1.4
@@ -19,7 +19,7 @@
   pricePerMole: 0
 
 - type: gas
-  id: 2
+  id: CarbonDioxide
   name: gases-co2
   specificHeat: 30
   heatCapacityRatio: 1.3
@@ -29,7 +29,7 @@
   pricePerMole: 0
 
 - type: gas
-  id: 3
+  id: Plasma
   name: gases-plasma
   specificHeat: 200
   heatCapacityRatio: 1.7
@@ -41,7 +41,7 @@
   pricePerMole: 0
 
 - type: gas
-  id: 4
+  id: Tritium
   name: gases-tritium
   specificHeat: 10
   heatCapacityRatio: 1.3
@@ -53,7 +53,7 @@
   pricePerMole: 2.5
 
 - type: gas
-  id: 5
+  id: WaterVapor
   name: gases-water-vapor
   specificHeat: 40
   heatCapacityRatio: 1.33
@@ -65,7 +65,7 @@
   pricePerMole: 0
 
 - type: gas
-  id: 6
+  id: Ammonia
   name: gases-ammonia
   specificHeat: 20
   heatCapacityRatio: 1.4
@@ -79,7 +79,7 @@
   pricePerMole: 0.15
 
 - type: gas
-  id: 7
+  id: NitrousOxide
   name: gases-n2o
   specificHeat: 40
   heatCapacityRatio: 1.3
@@ -89,7 +89,7 @@
   pricePerMole: 0.1
 
 - type: gas
-  id: 8
+  id: Frezon
   name: gases-frezon
   specificHeat: 600 # Strongest by far
   heatCapacityRatio: 1.33