From: psykana <36602558+psykana@users.noreply.github.com>
Date: Mon, 15 Dec 2025 23:18:10 +0000 (+0000)
Subject: Add tile atmosphere tests (#41228)
X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=2619bc47ef3849bd7c87bcea847ecc528994bf51;p=space-station-14.git
Add tile atmosphere tests (#41228)
* Tile atmosphere tests
* master markers
* TryLoadMap
* whoopsie
* Dirty
* Add new abstract class, room spacing tests
* review
---
diff --git a/Content.IntegrationTests/Tests/Atmos/AtmosTest.cs b/Content.IntegrationTests/Tests/Atmos/AtmosTest.cs
new file mode 100644
index 0000000000..d50c4a200b
--- /dev/null
+++ b/Content.IntegrationTests/Tests/Atmos/AtmosTest.cs
@@ -0,0 +1,102 @@
+using Content.IntegrationTests.Tests.Interaction;
+using Content.Server.Atmos.Components;
+using Content.Server.Atmos.EntitySystems;
+using Content.Shared.Atmos;
+using Content.Shared.Atmos.Components;
+using Content.Shared.Tests;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Maths;
+
+namespace Content.IntegrationTests.Tests.Atmos;
+
+///
+/// Helper class for atmospherics tests.
+/// See on how to add new tests with custom maps.
+///
+[TestFixture]
+public abstract class AtmosTest : InteractionTest
+{
+ protected AtmosphereSystem SAtmos = default!;
+ protected EntityLookupSystem LookupSystem = default!;
+
+ protected Entity RelevantAtmos = default!;
+
+ ///
+ /// Used in . Resolved during test setup.
+ ///
+ protected Entity ProcessEnt = default;
+
+ protected virtual float Moles => 1000.0f;
+
+ // 5% is a lot, but it can get this bad ATM...
+ protected virtual float Tolerance => 0.05f;
+
+ [SetUp]
+ public override async Task Setup()
+ {
+ await base.Setup();
+
+ SAtmos = SEntMan.System();
+ LookupSystem = SEntMan.System();
+
+ RelevantAtmos = (MapData.Grid, SEntMan.GetComponent(MapData.Grid));
+
+ ProcessEnt = new Entity(
+ MapData.Grid.Owner,
+ SEntMan.GetComponent(MapData.Grid.Owner),
+ SEntMan.GetComponent(MapData.Grid.Owner),
+ SEntMan.GetComponent(MapData.Grid.Owner),
+ SEntMan.GetComponent(MapData.Grid.Owner));
+ }
+
+ ///
+ /// Tries to get a mapped marker with a given name.
+ ///
+ /// Marker entities to look through
+ /// Marker name to look up (set during mapping)
+ /// Found marker EntityUid or Invalid
+ /// True if found
+ protected static bool GetMarker(Entity[] markers, string id, out EntityUid marker)
+ {
+ foreach (var ent in markers)
+ {
+ if (ent.Comp.Id == id)
+ {
+ marker = ent;
+ return true;
+ }
+ }
+ marker = EntityUid.Invalid;
+ return false;
+ }
+
+ protected static float GetGridMoles(Entity grid)
+ {
+ var moles = 0.0f;
+ foreach (var tile in grid.Comp.Tiles.Values)
+ {
+ moles += tile.Air?.TotalMoles ?? 0.0f;
+ }
+
+ return moles;
+ }
+
+ ///
+ /// Asserts that test grid has this many moles, within tolerance percentage.
+ ///
+ protected void AssertGridMoles(float moles, float tolerance)
+ {
+ var gridMoles = GetGridMoles(RelevantAtmos);
+ Assert.That(MathHelper.CloseToPercent(moles, gridMoles, tolerance), $"Grid has {gridMoles} moles, but {moles} was expected");
+ }
+
+ ///
+ /// Asserts that provided GasMixtures have same total moles, within tolerance percentage.
+ ///
+ protected void AssertMixMoles(GasMixture mix1, GasMixture mix2, float tolerance)
+ {
+ Assert.That(MathHelper.CloseToPercent(mix1.TotalMoles, mix2.TotalMoles, tolerance),
+ $"GasMixtures do not match. Got {mix1.TotalMoles} and {mix2.TotalMoles} moles");
+ }
+}
diff --git a/Content.IntegrationTests/Tests/Atmos/RoomSpacingTest.cs b/Content.IntegrationTests/Tests/Atmos/RoomSpacingTest.cs
new file mode 100644
index 0000000000..4cdc0894ca
--- /dev/null
+++ b/Content.IntegrationTests/Tests/Atmos/RoomSpacingTest.cs
@@ -0,0 +1,127 @@
+using Content.Shared.Atmos;
+using Content.Shared.Coordinates;
+using Content.Shared.Tests;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Utility;
+
+namespace Content.IntegrationTests.Tests.Atmos;
+
+public sealed class RoomSpacingTest : AtmosTest
+{
+ protected override ResPath? TestMapPath => new("Maps/Test/Atmospherics/tile_atmosphere_test_room.yml");
+
+ ///
+ /// Checks that deleting an outer wall spaces the room.
+ ///
+ [Test]
+ public async Task DeleteWall()
+ {
+ var markers = SEntMan.AllEntities();
+
+ EntityUid source, floor, wallPos;
+ source = floor = wallPos = EntityUid.Invalid;
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(GetMarker(markers, "source", out source));
+ Assert.That(GetMarker(markers, "floor", out floor));
+ Assert.That(GetMarker(markers, "wall", out wallPos));
+ });
+
+ var lookup = LookupSystem.GetEntitiesIntersecting(wallPos);
+ var wall = lookup.FirstOrNull();
+ Assert.That(wall, Is.Not.Null);
+
+ Assert.That(GetGridMoles(RelevantAtmos), Is.EqualTo(0));
+
+ var sourceMix = SAtmos.GetTileMixture(source, true);
+ Assert.That(sourceMix, Is.Not.EqualTo(null));
+ sourceMix.AdjustMoles(Gas.Frezon, Moles);
+
+ await Server.WaitRunTicks(500);
+
+ var mix1 = SAtmos.GetTileMixture(floor);
+ Assert.That(mix1, Is.Not.EqualTo(null));
+
+ AssertMixMoles(sourceMix, mix1, Tolerance);
+ AssertGridMoles(Moles, Tolerance);
+
+ // Space the room
+ await Server.WaitAssertion(() =>
+ {
+ SEntMan.DeleteEntity(wall);
+ });
+
+ await Server.WaitRunTicks(10);
+
+ await Server.WaitPost(() =>
+ {
+ for (var i = 0; i < 50; i++)
+ {
+ SAtmos.RunProcessingFull(ProcessEnt, MapData.Grid.Owner, SAtmos.AtmosTickRate);
+ }
+ });
+
+ AssertMixMoles(sourceMix, mix1, Tolerance);
+ AssertGridMoles(0, Tolerance);
+ }
+
+ ///
+ /// Checks that exposing tile lattice spaces the room.
+ ///
+ [Test]
+ public async Task PryLattice()
+ {
+ var markers = SEntMan.AllEntities();
+
+ EntityUid source, floor, wallPos;
+ source = floor = wallPos = EntityUid.Invalid;
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(GetMarker(markers, "source", out source));
+ Assert.That(GetMarker(markers, "floor", out floor));
+ Assert.That(GetMarker(markers, "wall", out wallPos));
+ });
+
+ var lookup = LookupSystem.GetEntitiesIntersecting(wallPos);
+ var wall = lookup.FirstOrNull();
+ Assert.That(wall, Is.Not.Null);
+
+ Assert.That(GetGridMoles(RelevantAtmos), Is.EqualTo(0));
+
+ var sourceMix = SAtmos.GetTileMixture(source, true);
+ Assert.That(sourceMix, Is.Not.EqualTo(null));
+ sourceMix.AdjustMoles(Gas.Frezon, Moles);
+
+ await Server.WaitPost(() =>
+ {
+ SAtmos.RunProcessingFull(ProcessEnt, MapData.Grid.Owner, SAtmos.AtmosTickRate);
+ });
+
+ var mix1 = SAtmos.GetTileMixture(floor);
+ Assert.That(mix1, Is.Not.EqualTo(null));
+
+ AssertMixMoles(sourceMix, mix1, Tolerance);
+ AssertGridMoles(Moles, Tolerance);
+
+ // Space the room
+ await SetTile(Lattice, SEntMan.GetNetCoordinates(floor.ToCoordinates()), MapData.Grid);
+
+ await Server.WaitRunTicks(10);
+
+ await Server.WaitPost(() =>
+ {
+ for (var i = 0; i < 50; i++)
+ {
+ SAtmos.RunProcessingFull(ProcessEnt, MapData.Grid.Owner, SAtmos.AtmosTickRate);
+ }
+ });
+
+ mix1 = SAtmos.GetTileMixture(floor);
+ Assert.That(mix1, Is.Not.EqualTo(null));
+
+ AssertMixMoles(sourceMix, mix1, Tolerance);
+ AssertGridMoles(0, Tolerance);
+ }
+}
diff --git a/Content.IntegrationTests/Tests/Atmos/TileAtmosphereTest.cs b/Content.IntegrationTests/Tests/Atmos/TileAtmosphereTest.cs
new file mode 100644
index 0000000000..368bb63c1d
--- /dev/null
+++ b/Content.IntegrationTests/Tests/Atmos/TileAtmosphereTest.cs
@@ -0,0 +1,159 @@
+using Content.Shared.Atmos;
+using Content.Shared.CCVar;
+using Content.Shared.Coordinates;
+using Content.Shared.Tests;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Maths;
+using Robust.Shared.Utility;
+
+namespace Content.IntegrationTests.Tests.Atmos;
+
+[TestOf(typeof(Atmospherics))]
+public abstract class TileAtmosphereTest : AtmosTest
+{
+ ///
+ /// Spawns gas in an enclosed space and checks that pressure equalizes within reasonable time.
+ /// Checks that mole count stays the same.
+ ///
+ [Test]
+ public async Task GasSpreading()
+ {
+ var markers = SEntMan.AllEntities();
+
+ EntityUid source, point1, point2;
+ source = point1 = point2 = EntityUid.Invalid;
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(GetMarker(markers, "source", out source));
+ Assert.That(GetMarker(markers, "point1", out point1));
+ Assert.That(GetMarker(markers, "point2", out point2));
+ });
+
+ Assert.That(GetGridMoles(RelevantAtmos), Is.EqualTo(0.0f));
+
+ var sourceMix = SAtmos.GetTileMixture(source, true);
+ Assert.That(sourceMix, Is.Not.EqualTo(null));
+ sourceMix.AdjustMoles(Gas.Frezon, Moles);
+
+ await Pair.Server.WaitPost(() =>
+ {
+ SAtmos.RunProcessingFull(ProcessEnt, MapData.Grid.Owner, SAtmos.AtmosTickRate);
+ });
+
+ var mix1 = SAtmos.GetTileMixture(point1);
+ var mix2 = SAtmos.GetTileMixture(point2);
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(mix1, Is.Not.EqualTo(null));
+ Assert.That(mix2, Is.Not.EqualTo(null));
+ });
+
+ AssertMixMoles(mix1, mix2, Tolerance);
+ AssertGridMoles(Moles, Tolerance);
+ }
+
+ ///
+ /// Spawns a combustible mixture and sets it ablaze.
+ /// Checks that fire propages through the entire grid.
+ ///
+ [Test]
+ public async Task FireSpreading()
+ {
+ var markers = SEntMan.AllEntities();
+
+ EntityUid source, point1, point2;
+ source = point1 = point2 = EntityUid.Invalid;
+
+ Vector2i sourceXY, point1XY, point2XY;
+ sourceXY = point1XY = point2XY = Vector2i.Zero;
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(GetMarker(markers, "source", out source));
+ Assert.That(GetMarker(markers, "point1", out point1));
+ Assert.That(GetMarker(markers, "point2", out point2));
+
+ Assert.That(Transform.TryGetGridTilePosition(source, out sourceXY, MapData.Grid));
+ Assert.That(Transform.TryGetGridTilePosition(source, out point1XY, MapData.Grid));
+ Assert.That(Transform.TryGetGridTilePosition(source, out point2XY, MapData.Grid));
+ });
+
+ Assert.That(GetGridMoles(RelevantAtmos), Is.EqualTo(0));
+
+ var sourceMix = SAtmos.GetTileMixture(source, true);
+ Assert.That(sourceMix, Is.Not.EqualTo(null));
+
+ sourceMix.AdjustMoles(Gas.Plasma, Moles / 10);
+ sourceMix.AdjustMoles(Gas.Oxygen, Moles - Moles / 10);
+ sourceMix.Temperature = Atmospherics.FireMinimumTemperatureToExist - 10;
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(SAtmos.IsHotspotActive(MapData.Grid, sourceXY), Is.False);
+ Assert.That(SAtmos.IsHotspotActive(MapData.Grid, point1XY), Is.False);
+ Assert.That(SAtmos.IsHotspotActive(MapData.Grid, point2XY), Is.False);
+ });
+
+ await Server.WaitAssertion(() =>
+ {
+ var welder = SEntMan.SpawnEntity("Welder", source.ToCoordinates());
+ Assert.That(ItemToggleSys.TryActivate(welder));
+ });
+
+ await Server.WaitRunTicks(500);
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(SAtmos.IsHotspotActive(MapData.Grid, sourceXY), Is.True);
+ Assert.That(SAtmos.IsHotspotActive(MapData.Grid, point1XY), Is.True);
+ Assert.That(SAtmos.IsHotspotActive(MapData.Grid, point2XY), Is.True);
+ });
+
+ var mix1 = SAtmos.GetTileMixture(point1);
+ var mix2 = SAtmos.GetTileMixture(point2);
+
+ Assert.Multiple(() =>
+ {
+ Assert.That(mix1, Is.Not.EqualTo(null));
+ Assert.That(mix2, Is.Not.EqualTo(null));
+ });
+
+ AssertMixMoles(mix1, mix2, Tolerance);
+ AssertGridMoles(Moles, Tolerance);
+ }
+}
+
+// Declare separate fixtures to override the TestMap and configure CVars
+public sealed class TileAtmosphereTest_X : TileAtmosphereTest
+{
+ protected override ResPath? TestMapPath => new("Maps/Test/Atmospherics/tile_atmosphere_test_x.yml");
+}
+
+public sealed class TileAtmosphereTest_Snake : TileAtmosphereTest
+{
+ protected override ResPath? TestMapPath => new("Maps/Test/Atmospherics/tile_atmosphere_test_snake.yml");
+}
+
+public sealed class TileAtmosphereTest_LINDA_X : TileAtmosphereTest
+{
+ protected override ResPath? TestMapPath => new("Maps/Test/Atmospherics/tile_atmosphere_test_x.yml");
+ public override async Task Setup()
+ {
+ await base.Setup();
+ Assert.That(Server.CfgMan.GetCVar(CCVars.MonstermosEqualization));
+ Server.CfgMan.SetCVar(CCVars.MonstermosEqualization, false);
+ }
+}
+
+public sealed class TileAtmosphereTest_LINDA_Snake : TileAtmosphereTest
+{
+ protected override ResPath? TestMapPath => new("Maps/Test/Atmospherics/tile_atmosphere_test_snake.yml");
+ public override async Task Setup()
+ {
+ await base.Setup();
+ Assert.That(Server.CfgMan.GetCVar(CCVars.MonstermosEqualization));
+ Server.CfgMan.SetCVar(CCVars.MonstermosEqualization, false);
+ }
+}
diff --git a/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_room.yml b/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_room.yml
new file mode 100644
index 0000000000..63033a1953
--- /dev/null
+++ b/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_room.yml
@@ -0,0 +1,231 @@
+meta:
+ format: 7
+ category: Map
+ engineVersion: 267.3.0
+ forkId: ""
+ forkVersion: ""
+ time: 11/02/2025 16:46:21
+ entityCount: 31
+maps:
+- 1
+grids:
+- 2
+orphans: []
+nullspace: []
+tilemap:
+ 1: Space
+ 0: Plating
+entities:
+- proto: ""
+ entities:
+ - uid: 1
+ components:
+ - type: MetaData
+ name: Map Entity
+ - type: Transform
+ - type: Map
+ mapPaused: True
+ - type: GridTree
+ - type: Broadphase
+ - type: OccluderTree
+ - uid: 2
+ components:
+ - type: MetaData
+ name: grid
+ - type: Transform
+ pos: -0.47916666,-0.49478912
+ parent: 1
+ - type: MapGrid
+ chunks:
+ 0,0:
+ ind: 0,0
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA==
+ version: 7
+ 0,-1:
+ ind: 0,-1
+ tiles: AQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA==
+ version: 7
+ - type: Broadphase
+ - type: Physics
+ bodyStatus: InAir
+ fixedRotation: False
+ bodyType: Dynamic
+ - type: Fixtures
+ fixtures: {}
+ - type: OccluderTree
+ - type: SpreaderGrid
+ - type: Shuttle
+ dampingModifier: 0.25
+ - type: ImplicitRoof
+ - type: GridPathfinding
+ - type: Gravity
+ gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ - type: DecalGrid
+ chunkCollection:
+ version: 2
+ nodes: []
+ - type: GridAtmosphere
+ version: 2
+ data:
+ chunkSize: 4
+ - type: GasTileOverlay
+ - type: RadiationGridResistance
+- proto: IntegrationTestMarker
+ entities:
+ - uid: 29
+ components:
+ - type: Transform
+ pos: 0.5,-1.5
+ parent: 2
+ - type: TestMarker
+ id: wall
+ - uid: 30
+ components:
+ - type: Transform
+ pos: 5.5,-1.5
+ parent: 2
+ - type: TestMarker
+ id: source
+ - uid: 31
+ components:
+ - type: Transform
+ pos: 2.5,-0.5
+ parent: 2
+ - type: TestMarker
+ id: floor
+- proto: WallClown
+ entities:
+ - uid: 28
+ components:
+ - type: Transform
+ pos: 0.5,-1.5
+ parent: 2
+- proto: WallSolid
+ entities:
+ - uid: 3
+ components:
+ - type: Transform
+ pos: 4.5,0.5
+ parent: 2
+ - uid: 4
+ components:
+ - type: Transform
+ pos: 0.5,0.5
+ parent: 2
+ - uid: 5
+ components:
+ - type: Transform
+ pos: 1.5,0.5
+ parent: 2
+ - uid: 6
+ components:
+ - type: Transform
+ pos: 1.5,-0.5
+ parent: 2
+ - uid: 7
+ components:
+ - type: Transform
+ pos: 0.5,-0.5
+ parent: 2
+ - uid: 8
+ components:
+ - type: Transform
+ pos: 0.5,-2.5
+ parent: 2
+ - uid: 9
+ components:
+ - type: Transform
+ pos: 1.5,-2.5
+ parent: 2
+ - uid: 10
+ components:
+ - type: Transform
+ pos: 1.5,-3.5
+ parent: 2
+ - uid: 11
+ components:
+ - type: Transform
+ pos: 0.5,-3.5
+ parent: 2
+ - uid: 12
+ components:
+ - type: Transform
+ pos: 2.5,-3.5
+ parent: 2
+ - uid: 13
+ components:
+ - type: Transform
+ pos: 3.5,-3.5
+ parent: 2
+ - uid: 14
+ components:
+ - type: Transform
+ pos: 3.5,-2.5
+ parent: 2
+ - uid: 15
+ components:
+ - type: Transform
+ pos: 2.5,0.5
+ parent: 2
+ - uid: 16
+ components:
+ - type: Transform
+ pos: 3.5,0.5
+ parent: 2
+ - uid: 17
+ components:
+ - type: Transform
+ pos: 3.5,-0.5
+ parent: 2
+ - uid: 18
+ components:
+ - type: Transform
+ pos: 5.5,0.5
+ parent: 2
+ - uid: 19
+ components:
+ - type: Transform
+ pos: 4.5,-3.5
+ parent: 2
+ - uid: 20
+ components:
+ - type: Transform
+ pos: 5.5,-3.5
+ parent: 2
+ - uid: 21
+ components:
+ - type: Transform
+ pos: 6.5,0.5
+ parent: 2
+ - uid: 22
+ components:
+ - type: Transform
+ pos: 7.5,0.5
+ parent: 2
+ - uid: 23
+ components:
+ - type: Transform
+ pos: 7.5,-0.5
+ parent: 2
+ - uid: 24
+ components:
+ - type: Transform
+ pos: 7.5,-1.5
+ parent: 2
+ - uid: 25
+ components:
+ - type: Transform
+ pos: 7.5,-2.5
+ parent: 2
+ - uid: 26
+ components:
+ - type: Transform
+ pos: 7.5,-3.5
+ parent: 2
+ - uid: 27
+ components:
+ - type: Transform
+ pos: 6.5,-3.5
+ parent: 2
+...
diff --git a/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_snake.yml b/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_snake.yml
new file mode 100644
index 0000000000..c55426d070
--- /dev/null
+++ b/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_snake.yml
@@ -0,0 +1,299 @@
+meta:
+ format: 7
+ category: Map
+ engineVersion: 267.3.0
+ forkId: ""
+ forkVersion: ""
+ time: 11/01/2025 12:21:19
+ entityCount: 45
+maps:
+- 1
+grids:
+- 2
+orphans: []
+nullspace: []
+tilemap:
+ 1: Space
+ 0: Plating
+entities:
+- proto: ""
+ entities:
+ - uid: 1
+ components:
+ - type: MetaData
+ name: Map Entity
+ - type: Transform
+ - type: Map
+ mapPaused: True
+ - type: GridTree
+ - type: Broadphase
+ - type: OccluderTree
+ - uid: 2
+ components:
+ - type: MetaData
+ name: grid
+ - type: Transform
+ pos: -0.48958334,-0.51563644
+ parent: 1
+ - type: MapGrid
+ chunks:
+ 0,0:
+ ind: 0,0
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA==
+ version: 7
+ 0,-1:
+ ind: 0,-1
+ tiles: AQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA==
+ version: 7
+ - type: Broadphase
+ - type: Physics
+ bodyStatus: InAir
+ fixedRotation: False
+ bodyType: Dynamic
+ - type: Fixtures
+ fixtures: {}
+ - type: OccluderTree
+ - type: SpreaderGrid
+ - type: Shuttle
+ dampingModifier: 0.25
+ - type: ImplicitRoof
+ - type: GridPathfinding
+ - type: Gravity
+ gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ - type: DecalGrid
+ chunkCollection:
+ version: 2
+ nodes: []
+ - type: GridAtmosphere
+ version: 2
+ data:
+ chunkSize: 4
+ - type: GasTileOverlay
+ - type: RadiationGridResistance
+- proto: IntegrationTestMarker
+ entities:
+ - uid: 29
+ components:
+ - type: Transform
+ pos: 1.5,-0.5
+ parent: 2
+ - type: TestMarker
+ id: point1
+ - uid: 44
+ components:
+ - type: Transform
+ pos: 4.5,-0.5
+ parent: 2
+ - type: TestMarker
+ id: source
+ - uid: 45
+ components:
+ - type: Transform
+ pos: 7.5,-0.5
+ parent: 2
+ - type: TestMarker
+ id: point2
+- proto: WallSolid
+ entities:
+ - uid: 3
+ components:
+ - type: Transform
+ pos: 1.5,-5.5
+ parent: 2
+ - uid: 4
+ components:
+ - type: Transform
+ pos: 0.5,-5.5
+ parent: 2
+ - uid: 5
+ components:
+ - type: Transform
+ pos: 0.5,-4.5
+ parent: 2
+ - uid: 6
+ components:
+ - type: Transform
+ pos: 0.5,-3.5
+ parent: 2
+ - uid: 7
+ components:
+ - type: Transform
+ pos: 0.5,-2.5
+ parent: 2
+ - uid: 8
+ components:
+ - type: Transform
+ pos: 0.5,-1.5
+ parent: 2
+ - uid: 9
+ components:
+ - type: Transform
+ pos: 0.5,-0.5
+ parent: 2
+ - uid: 10
+ components:
+ - type: Transform
+ pos: 0.5,0.5
+ parent: 2
+ - uid: 11
+ components:
+ - type: Transform
+ pos: 1.5,0.5
+ parent: 2
+ - uid: 12
+ components:
+ - type: Transform
+ pos: 2.5,0.5
+ parent: 2
+ - uid: 13
+ components:
+ - type: Transform
+ pos: 2.5,-0.5
+ parent: 2
+ - uid: 14
+ components:
+ - type: Transform
+ pos: 2.5,-1.5
+ parent: 2
+ - uid: 15
+ components:
+ - type: Transform
+ pos: 2.5,-2.5
+ parent: 2
+ - uid: 16
+ components:
+ - type: Transform
+ pos: 2.5,-3.5
+ parent: 2
+ - uid: 17
+ components:
+ - type: Transform
+ pos: 2.5,-5.5
+ parent: 2
+ - uid: 18
+ components:
+ - type: Transform
+ pos: 3.5,-5.5
+ parent: 2
+ - uid: 19
+ components:
+ - type: Transform
+ pos: 4.5,-5.5
+ parent: 2
+ - uid: 20
+ components:
+ - type: Transform
+ pos: 4.5,-4.5
+ parent: 2
+ - uid: 21
+ components:
+ - type: Transform
+ pos: 4.5,-3.5
+ parent: 2
+ - uid: 22
+ components:
+ - type: Transform
+ pos: 4.5,-2.5
+ parent: 2
+ - uid: 23
+ components:
+ - type: Transform
+ pos: 4.5,-1.5
+ parent: 2
+ - uid: 24
+ components:
+ - type: Transform
+ pos: 3.5,0.5
+ parent: 2
+ - uid: 25
+ components:
+ - type: Transform
+ pos: 4.5,0.5
+ parent: 2
+ - uid: 26
+ components:
+ - type: Transform
+ pos: 5.5,0.5
+ parent: 2
+ - uid: 27
+ components:
+ - type: Transform
+ pos: 6.5,0.5
+ parent: 2
+ - uid: 28
+ components:
+ - type: Transform
+ pos: 6.5,-0.5
+ parent: 2
+ - uid: 30
+ components:
+ - type: Transform
+ pos: 7.5,0.5
+ parent: 2
+ - uid: 31
+ components:
+ - type: Transform
+ pos: 8.5,-5.5
+ parent: 2
+ - uid: 32
+ components:
+ - type: Transform
+ pos: 7.5,-5.5
+ parent: 2
+ - uid: 33
+ components:
+ - type: Transform
+ pos: 5.5,-5.5
+ parent: 2
+ - uid: 34
+ components:
+ - type: Transform
+ pos: 6.5,-5.5
+ parent: 2
+ - uid: 35
+ components:
+ - type: Transform
+ pos: 6.5,-1.5
+ parent: 2
+ - uid: 36
+ components:
+ - type: Transform
+ pos: 6.5,-2.5
+ parent: 2
+ - uid: 37
+ components:
+ - type: Transform
+ pos: 6.5,-3.5
+ parent: 2
+ - uid: 38
+ components:
+ - type: Transform
+ pos: 8.5,-3.5
+ parent: 2
+ - uid: 39
+ components:
+ - type: Transform
+ pos: 8.5,-2.5
+ parent: 2
+ - uid: 40
+ components:
+ - type: Transform
+ pos: 8.5,-1.5
+ parent: 2
+ - uid: 41
+ components:
+ - type: Transform
+ pos: 8.5,-0.5
+ parent: 2
+ - uid: 42
+ components:
+ - type: Transform
+ pos: 8.5,0.5
+ parent: 2
+ - uid: 43
+ components:
+ - type: Transform
+ pos: 8.5,-4.5
+ parent: 2
+...
diff --git a/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_x.yml b/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_x.yml
new file mode 100644
index 0000000000..9e48c9e5d7
--- /dev/null
+++ b/Resources/Maps/Test/Atmospherics/tile_atmosphere_test_x.yml
@@ -0,0 +1,219 @@
+meta:
+ format: 7
+ category: Map
+ engineVersion: 267.3.0
+ forkId: ""
+ forkVersion: ""
+ time: 11/01/2025 12:20:35
+ entityCount: 29
+maps:
+- 1
+grids:
+- 2
+orphans: []
+nullspace: []
+tilemap:
+ 1: Space
+ 0: Plating
+entities:
+- proto: ""
+ entities:
+ - uid: 1
+ components:
+ - type: MetaData
+ name: Map Entity
+ - type: Transform
+ - type: Map
+ mapPaused: True
+ - type: GridTree
+ - type: Broadphase
+ - type: OccluderTree
+ - uid: 2
+ components:
+ - type: MetaData
+ name: grid
+ - type: Transform
+ pos: -0.5520833,-0.44266954
+ parent: 1
+ - type: MapGrid
+ chunks:
+ 0,0:
+ ind: 0,0
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA==
+ version: 7
+ 0,-1:
+ ind: 0,-1
+ tiles: AQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA==
+ version: 7
+ - type: Broadphase
+ - type: Physics
+ bodyStatus: InAir
+ fixedRotation: False
+ bodyType: Dynamic
+ - type: Fixtures
+ fixtures: {}
+ - type: OccluderTree
+ - type: SpreaderGrid
+ - type: Shuttle
+ dampingModifier: 0.25
+ - type: ImplicitRoof
+ - type: GridPathfinding
+ - type: Gravity
+ gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ - type: DecalGrid
+ chunkCollection:
+ version: 2
+ nodes: []
+ - type: GridAtmosphere
+ version: 2
+ data:
+ chunkSize: 4
+ - type: GasTileOverlay
+ - type: RadiationGridResistance
+- proto: IntegrationTestMarker
+ entities:
+ - uid: 36
+ components:
+ - type: Transform
+ pos: 3.5,-2.5
+ parent: 2
+ - type: TestMarker
+ id: source
+ - uid: 37
+ components:
+ - type: Transform
+ pos: 1.5,-2.5
+ parent: 2
+ - type: TestMarker
+ id: point1
+ - uid: 38
+ components:
+ - type: Transform
+ pos: 3.5,-0.5
+ parent: 2
+ - type: TestMarker
+ id: point2
+- proto: WallSolid
+ entities:
+ - uid: 3
+ components:
+ - type: Transform
+ pos: 0.5,-1.5
+ parent: 2
+ - uid: 4
+ components:
+ - type: Transform
+ pos: 1.5,-1.5
+ parent: 2
+ - uid: 5
+ components:
+ - type: Transform
+ pos: 2.5,-1.5
+ parent: 2
+ - uid: 6
+ components:
+ - type: Transform
+ pos: 2.5,-0.5
+ parent: 2
+ - uid: 7
+ components:
+ - type: Transform
+ pos: 2.5,0.5
+ parent: 2
+ - uid: 8
+ components:
+ - type: Transform
+ pos: 3.5,0.5
+ parent: 2
+ - uid: 9
+ components:
+ - type: Transform
+ pos: 4.5,0.5
+ parent: 2
+ - uid: 10
+ components:
+ - type: Transform
+ pos: 4.5,-0.5
+ parent: 2
+ - uid: 11
+ components:
+ - type: Transform
+ pos: 4.5,-1.5
+ parent: 2
+ - uid: 12
+ components:
+ - type: Transform
+ pos: 5.5,-1.5
+ parent: 2
+ - uid: 13
+ components:
+ - type: Transform
+ pos: 6.5,-1.5
+ parent: 2
+ - uid: 14
+ components:
+ - type: Transform
+ pos: 4.5,-3.5
+ parent: 2
+ - uid: 15
+ components:
+ - type: Transform
+ pos: 5.5,-3.5
+ parent: 2
+ - uid: 16
+ components:
+ - type: Transform
+ pos: 6.5,-3.5
+ parent: 2
+ - uid: 17
+ components:
+ - type: Transform
+ pos: 6.5,-2.5
+ parent: 2
+ - uid: 18
+ components:
+ - type: Transform
+ pos: 0.5,-2.5
+ parent: 2
+ - uid: 19
+ components:
+ - type: Transform
+ pos: 0.5,-3.5
+ parent: 2
+ - uid: 20
+ components:
+ - type: Transform
+ pos: 1.5,-3.5
+ parent: 2
+ - uid: 21
+ components:
+ - type: Transform
+ pos: 2.5,-3.5
+ parent: 2
+ - uid: 22
+ components:
+ - type: Transform
+ pos: 2.5,-4.5
+ parent: 2
+ - uid: 23
+ components:
+ - type: Transform
+ pos: 2.5,-5.5
+ parent: 2
+ - uid: 27
+ components:
+ - type: Transform
+ pos: 4.5,-5.5
+ parent: 2
+ - uid: 28
+ components:
+ - type: Transform
+ pos: 4.5,-4.5
+ parent: 2
+ - uid: 29
+ components:
+ - type: Transform
+ pos: 3.5,-5.5
+ parent: 2
+...