From 07b2ce138d25479059b213a4169d7e6b6d634b53 Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Fri, 3 Dec 2021 21:19:53 +1100
Subject: [PATCH 01/40] entitystorage fixes (#5660)
---
.../Storage/Components/EntityStorageComponent.cs | 9 +--------
Content.Server/Storage/Components/IStorageComponent.cs | 2 +-
.../Storage/Components/StorageFillComponent.cs | 8 ++++++--
3 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/Content.Server/Storage/Components/EntityStorageComponent.cs b/Content.Server/Storage/Components/EntityStorageComponent.cs
index cd45675f95..edba41b62c 100644
--- a/Content.Server/Storage/Components/EntityStorageComponent.cs
+++ b/Content.Server/Storage/Components/EntityStorageComponent.cs
@@ -373,14 +373,7 @@ namespace Content.Server.Storage.Components
return true;
}
- if (!Contents.Insert(entity)) return false;
-
- entity.Transform.LocalPosition = Vector2.Zero;
- if (entity.TryGetComponent(out IPhysBody? body))
- {
- body.CanCollide = false;
- }
- return true;
+ return Contents.Insert(entity);
}
///
diff --git a/Content.Server/Storage/Components/IStorageComponent.cs b/Content.Server/Storage/Components/IStorageComponent.cs
index 3f7f052d90..c2169695c5 100644
--- a/Content.Server/Storage/Components/IStorageComponent.cs
+++ b/Content.Server/Storage/Components/IStorageComponent.cs
@@ -2,7 +2,7 @@ using Robust.Shared.GameObjects;
namespace Content.Server.Storage.Components
{
- public interface IStorageComponent
+ public interface IStorageComponent : IComponent
{
bool Remove(IEntity entity);
bool Insert(IEntity entity);
diff --git a/Content.Server/Storage/Components/StorageFillComponent.cs b/Content.Server/Storage/Components/StorageFillComponent.cs
index ed56832fb8..2af21ed610 100644
--- a/Content.Server/Storage/Components/StorageFillComponent.cs
+++ b/Content.Server/Storage/Components/StorageFillComponent.cs
@@ -50,8 +50,12 @@ namespace Content.Server.Storage.Components
for (var i = 0; i < storageItem.Amount; i++)
{
- storage.Insert(
- Owner.EntityManager.SpawnEntity(storageItem.PrototypeId, Owner.Transform.Coordinates));
+ var ent = Owner.EntityManager.SpawnEntity(storageItem.PrototypeId, Owner.Transform.Coordinates);
+
+ if (storage.Insert(ent)) continue;
+
+ Logger.ErrorS("storage", $"Tried to StorageFill {storageItem.PrototypeId} inside {Owner} but can't.");
+ Owner.EntityManager.DeleteEntity(ent);
}
if (!string.IsNullOrEmpty(storageItem.GroupId)) alreadySpawnedGroups.Add(storageItem.GroupId);
From 46a63d82b097e993413288d252151a04de59c9ff Mon Sep 17 00:00:00 2001
From: Vera Aguilera Puerto
Date: Fri, 3 Dec 2021 13:07:47 +0100
Subject: [PATCH 02/40] Update Submodule
---
RobustToolbox | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/RobustToolbox b/RobustToolbox
index 5f1feb9bb1..2aa5e8c07f 160000
--- a/RobustToolbox
+++ b/RobustToolbox
@@ -1 +1 @@
-Subproject commit 5f1feb9bb18a00bb99174d9baa7a11b51c9a5528
+Subproject commit 2aa5e8c07fdfc2bad06d2d0189f6f156665eb263
From 219d91c6dae0ff011663c334ffc92ba41fc13a00 Mon Sep 17 00:00:00 2001
From: Paul Ritter
Date: Fri, 3 Dec 2021 15:35:57 +0100
Subject: [PATCH 03/40] decal system & crayons (#5183)
Co-authored-by: Paul
---
.../Crayon/CrayonDecalVisualizer.cs | 29 -
.../Crayon/UI/CrayonBoundUserInterface.cs | 6 +-
Content.Client/Crayon/UI/CrayonWindow.xaml.cs | 9 +-
Content.Client/Decals/DecalOverlay.cs | 60 ++
Content.Client/Decals/DecalSystem.cs | 114 +++
Content.Client/Decals/ToggleDecalCommand.cs | 15 +
.../TileReactions/CleanTileReaction.cs | 10 +-
Content.Server/Crayon/CrayonComponent.cs | 28 +-
.../Decals/Commands/AddDecalCommand.cs | 118 +++
.../Decals/Commands/EditDecalCommand.cs | 162 ++++
.../Decals/Commands/RemoveDecalCommand.cs | 46 +
Content.Server/Decals/DecalSystem.cs | 326 +++++++
.../Crayon/SharedCrayonComponent.cs | 12 -
Content.Shared/Decals/Decal.cs | 38 +
.../Decals/DecalChunkUpdateEvent.cs | 15 +
.../DecalGridChunkCollectionTypeSerializer.cs | 74 ++
Content.Shared/Decals/DecalGridComponent.cs | 23 +
Content.Shared/Decals/DecalPrototype.cs | 15 +
Content.Shared/Decals/SharedDecalSystem.cs | 153 +++
.../Prototypes/Catalog/crayon_decals.yml | 135 ---
Resources/Prototypes/Decals/crayons.yml | 916 ++++++++++++++++++
.../Entities/Effects/crayondecals.yml | 16 -
22 files changed, 2100 insertions(+), 220 deletions(-)
create mode 100644 Content.Client/Decals/DecalOverlay.cs
create mode 100644 Content.Client/Decals/DecalSystem.cs
create mode 100644 Content.Client/Decals/ToggleDecalCommand.cs
create mode 100644 Content.Server/Decals/Commands/AddDecalCommand.cs
create mode 100644 Content.Server/Decals/Commands/EditDecalCommand.cs
create mode 100644 Content.Server/Decals/Commands/RemoveDecalCommand.cs
create mode 100644 Content.Server/Decals/DecalSystem.cs
create mode 100644 Content.Shared/Decals/Decal.cs
create mode 100644 Content.Shared/Decals/DecalChunkUpdateEvent.cs
create mode 100644 Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs
create mode 100644 Content.Shared/Decals/DecalGridComponent.cs
create mode 100644 Content.Shared/Decals/DecalPrototype.cs
create mode 100644 Content.Shared/Decals/SharedDecalSystem.cs
delete mode 100644 Resources/Prototypes/Catalog/crayon_decals.yml
create mode 100644 Resources/Prototypes/Decals/crayons.yml
delete mode 100644 Resources/Prototypes/Entities/Effects/crayondecals.yml
diff --git a/Content.Client/Crayon/CrayonDecalVisualizer.cs b/Content.Client/Crayon/CrayonDecalVisualizer.cs
index 964792a56e..e69de29bb2 100644
--- a/Content.Client/Crayon/CrayonDecalVisualizer.cs
+++ b/Content.Client/Crayon/CrayonDecalVisualizer.cs
@@ -1,29 +0,0 @@
-using Content.Shared.Crayon;
-using JetBrains.Annotations;
-using Robust.Client.GameObjects;
-using Robust.Shared.GameObjects;
-using Robust.Shared.Maths;
-
-namespace Content.Client.Crayon
-{
- [UsedImplicitly]
- public class CrayonDecalVisualizer : AppearanceVisualizer
- {
- public override void OnChangeData(AppearanceComponent component)
- {
- base.OnChangeData(component);
-
- var sprite = component.Owner.GetComponent();
-
- if (component.TryGetData(CrayonVisuals.State, out string state))
- {
- sprite.LayerSetState(0, state);
- }
-
- if (component.TryGetData(CrayonVisuals.Color, out string color))
- {
- sprite.LayerSetColor(0, Color.FromName(color));
- }
- }
- }
-}
diff --git a/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs b/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs
index e6fcf8273c..37439e21f8 100644
--- a/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs
+++ b/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs
@@ -1,5 +1,6 @@
using System.Linq;
using Content.Shared.Crayon;
+using Content.Shared.Decals;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
@@ -22,9 +23,8 @@ namespace Content.Client.Crayon.UI
_menu.OnClose += Close;
var prototypeManager = IoCManager.Resolve();
- var crayonDecals = prototypeManager.EnumeratePrototypes().FirstOrDefault();
- if (crayonDecals != null)
- _menu.Populate(crayonDecals);
+ var crayonDecals = prototypeManager.EnumeratePrototypes().Where(x => x.Tags.Contains("crayon"));
+ _menu.Populate(crayonDecals);
_menu.OpenCentered();
}
diff --git a/Content.Client/Crayon/UI/CrayonWindow.xaml.cs b/Content.Client/Crayon/UI/CrayonWindow.xaml.cs
index 7e676e473b..90ce4b2523 100644
--- a/Content.Client/Crayon/UI/CrayonWindow.xaml.cs
+++ b/Content.Client/Crayon/UI/CrayonWindow.xaml.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using Content.Client.Stylesheets;
using Content.Shared.Crayon;
+using Content.Shared.Decals;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
@@ -89,14 +90,12 @@ namespace Content.Client.Crayon.UI
RefreshList();
}
- public void Populate(CrayonDecalPrototype proto)
+ public void Populate(IEnumerable prototypes)
{
- var path = new ResourcePath(proto.SpritePath);
_decals = new Dictionary();
- foreach (var state in proto.Decals)
+ foreach (var decalPrototype in prototypes)
{
- var rsi = new SpriteSpecifier.Rsi(path, state);
- _decals.Add(state, rsi.Frame0());
+ _decals.Add(decalPrototype.ID, decalPrototype.Sprite.Frame0());
}
RefreshList();
diff --git a/Content.Client/Decals/DecalOverlay.cs b/Content.Client/Decals/DecalOverlay.cs
new file mode 100644
index 0000000000..5a8169b957
--- /dev/null
+++ b/Content.Client/Decals/DecalOverlay.cs
@@ -0,0 +1,60 @@
+using System.Collections.Generic;
+using Content.Shared.Decals;
+using Robust.Client.Graphics;
+using Robust.Client.Utility;
+using Robust.Shared.Enums;
+using Robust.Shared.Map;
+using Robust.Shared.Maths;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+using Robust.Shared.Maths;
+
+namespace Content.Client.Decals
+{
+ public class DecalOverlay : Overlay
+ {
+ private readonly DecalSystem _system;
+ private readonly IMapManager _mapManager;
+ private readonly IPrototypeManager _prototypeManager;
+
+ public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowEntities;
+
+ public DecalOverlay(DecalSystem system, IMapManager mapManager, IPrototypeManager prototypeManager)
+ {
+ _system = system;
+ _mapManager = mapManager;
+ _prototypeManager = prototypeManager;
+ }
+
+ protected override void Draw(in OverlayDrawArgs args)
+ {
+ var handle = args.WorldHandle;
+
+ Dictionary cachedTextures = new();
+
+ SpriteSpecifier GetSpriteSpecifier(string id)
+ {
+ if (cachedTextures.TryGetValue(id, out var spriteSpecifier))
+ return spriteSpecifier;
+
+ spriteSpecifier = _prototypeManager.Index(id).Sprite;
+ cachedTextures.Add(id, spriteSpecifier);
+ return spriteSpecifier;
+ }
+
+ foreach (var (gridId, zIndexDictionary) in _system.DecalRenderIndex)
+ {
+ var grid = _mapManager.GetGrid(gridId);
+ handle.SetTransform(grid.WorldMatrix);
+ foreach (var (_, decals) in zIndexDictionary)
+ {
+ foreach (var (_, decal) in decals)
+ {
+ var spriteSpecifier = GetSpriteSpecifier(decal.Id);
+ handle.DrawTexture(spriteSpecifier.Frame0(), decal.Coordinates, decal.Angle, decal.Color);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Content.Client/Decals/DecalSystem.cs b/Content.Client/Decals/DecalSystem.cs
new file mode 100644
index 0000000000..4f16c4ba5c
--- /dev/null
+++ b/Content.Client/Decals/DecalSystem.cs
@@ -0,0 +1,114 @@
+using System.Collections.Generic;
+using Content.Shared.Decals;
+using Robust.Client.Graphics;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Map;
+
+namespace Content.Client.Decals
+{
+ public class DecalSystem : SharedDecalSystem
+ {
+ [Dependency] private readonly IOverlayManager _overlayManager = default!;
+
+ private DecalOverlay _overlay = default!;
+ public Dictionary>> DecalRenderIndex = new();
+ private Dictionary> DecalZIndexIndex = new();
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ _overlay = new DecalOverlay(this, MapManager, PrototypeManager);
+ _overlayManager.AddOverlay(_overlay);
+
+ SubscribeNetworkEvent(OnChunkUpdate);
+ SubscribeLocalEvent(OnGridInitialize);
+ SubscribeLocalEvent(OnGridRemoval);
+ }
+
+ public void ToggleOverlay()
+ {
+ if (_overlayManager.HasOverlay())
+ {
+ _overlayManager.RemoveOverlay(_overlay);
+ }
+ else
+ {
+ _overlayManager.AddOverlay(_overlay);
+ }
+ }
+
+ private void OnGridRemoval(GridRemovalEvent ev)
+ {
+ DecalRenderIndex.Remove(ev.GridId);
+ DecalZIndexIndex.Remove(ev.GridId);
+ }
+
+ private void OnGridInitialize(GridInitializeEvent ev)
+ {
+ DecalRenderIndex[ev.GridId] = new();
+ DecalZIndexIndex[ev.GridId] = new();
+ }
+
+ public override void Shutdown()
+ {
+ base.Shutdown();
+ _overlayManager.RemoveOverlay(_overlay);
+ }
+
+ protected override bool RemoveDecalHook(GridId gridId, uint uid)
+ {
+ RemoveDecalFromRenderIndex(gridId, uid);
+
+ return base.RemoveDecalHook(gridId, uid);
+ }
+
+ private void RemoveDecalFromRenderIndex(GridId gridId, uint uid)
+ {
+ var zIndex = DecalZIndexIndex[gridId][uid];
+
+ DecalRenderIndex[gridId][zIndex].Remove(uid);
+ if (DecalRenderIndex[gridId][zIndex].Count == 0)
+ DecalRenderIndex[gridId].Remove(zIndex);
+
+ DecalZIndexIndex[gridId].Remove(uid);
+ }
+
+ private void OnChunkUpdate(DecalChunkUpdateEvent ev)
+ {
+ foreach (var (gridId, gridChunks) in ev.Data)
+ {
+ foreach (var (indices, newChunkData) in gridChunks)
+ {
+ var chunkCollection = ChunkCollection(gridId);
+ if (chunkCollection.TryGetValue(indices, out var chunk))
+ {
+ var removedUids = new HashSet(chunk.Keys);
+ removedUids.ExceptWith(newChunkData.Keys);
+ foreach (var removedUid in removedUids)
+ {
+ RemoveDecalFromRenderIndex(gridId, removedUid);
+ }
+ }
+ foreach (var (uid, decal) in newChunkData)
+ {
+ if(!DecalRenderIndex[gridId].ContainsKey(decal.ZIndex))
+ DecalRenderIndex[gridId][decal.ZIndex] = new();
+
+ if (DecalZIndexIndex.TryGetValue(gridId, out var values) && values.TryGetValue(uid, out var zIndex))
+ {
+ DecalRenderIndex[gridId][zIndex].Remove(uid);
+ }
+
+ DecalRenderIndex[gridId][decal.ZIndex][uid] = decal;
+ DecalZIndexIndex[gridId][uid] = decal.ZIndex;
+
+ ChunkIndex[gridId][uid] = indices;
+ }
+ chunkCollection[indices] = newChunkData;
+ }
+ }
+ }
+ }
+}
diff --git a/Content.Client/Decals/ToggleDecalCommand.cs b/Content.Client/Decals/ToggleDecalCommand.cs
new file mode 100644
index 0000000000..37930701f7
--- /dev/null
+++ b/Content.Client/Decals/ToggleDecalCommand.cs
@@ -0,0 +1,15 @@
+using Robust.Shared.Console;
+using Robust.Shared.GameObjects;
+
+namespace Content.Client.Decals;
+
+public class ToggleDecalCommand : IConsoleCommand
+{
+ public string Command => "toggledecals";
+ public string Description => "Toggles decaloverlay";
+ public string Help => $"{Command}";
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ EntitySystem.Get().ToggleOverlay();
+ }
+}
diff --git a/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs b/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs
index 7f0fd17062..a022a9c067 100644
--- a/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs
+++ b/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs
@@ -1,11 +1,13 @@
using System.Linq;
using Content.Server.Cleanable;
using Content.Server.Coordinates.Helpers;
-using Content.Shared.Chemistry;
+using Content.Server.Decals;
using Content.Shared.Chemistry.Reaction;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
+using Robust.Shared.GameObjects;
using Robust.Shared.Map;
+using Robust.Shared.Maths;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Server.Chemistry.TileReactions
@@ -35,6 +37,12 @@ namespace Content.Server.Chemistry.TileReactions
}
}
+ var decalSystem = EntitySystem.Get();
+ foreach (var uid in decalSystem.GetDecalsInRange(tile.GridIndex, tile.GridIndices+new Vector2(0.5f, 0.5f), validDelegate: x => x.Cleanable))
+ {
+ decalSystem.RemoveDecal(tile.GridIndex, uid);
+ }
+
return amount;
}
}
diff --git a/Content.Server/Crayon/CrayonComponent.cs b/Content.Server/Crayon/CrayonComponent.cs
index 5290a391eb..302ad335e2 100644
--- a/Content.Server/Crayon/CrayonComponent.cs
+++ b/Content.Server/Crayon/CrayonComponent.cs
@@ -2,9 +2,10 @@ using System.Linq;
using System.Threading.Tasks;
using Content.Server.Administration.Logs;
using Content.Server.UserInterface;
-using Content.Shared.Administration.Logs;
using Content.Shared.Audio;
using Content.Shared.Crayon;
+using Content.Server.Decals;
+using Content.Shared.Decals;
using Content.Shared.Database;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Helpers;
@@ -60,11 +61,8 @@ namespace Content.Server.Crayon
Charges = Capacity;
// Get the first one from the catalog and set it as default
- var decals = _prototypeManager.EnumeratePrototypes().FirstOrDefault();
- if (decals != null)
- {
- SelectedState = decals.Decals.First();
- }
+ var decal = _prototypeManager.EnumeratePrototypes().FirstOrDefault(x => x.Tags.Contains("crayon"));
+ SelectedState = decal?.ID ?? string.Empty;
Dirty();
}
@@ -74,14 +72,10 @@ namespace Content.Server.Crayon
{
case CrayonSelectMessage msg:
// Check if the selected state is valid
- var crayonDecals = _prototypeManager.EnumeratePrototypes().FirstOrDefault();
- if (crayonDecals != null)
+ if (_prototypeManager.TryIndex(msg.State, out var prototype) && prototype.Tags.Contains("crayon"))
{
- if (crayonDecals.Decals.Contains(msg.State))
- {
- SelectedState = msg.State;
- Dirty();
- }
+ SelectedState = msg.State;
+ Dirty();
}
break;
default:
@@ -131,12 +125,8 @@ namespace Content.Server.Crayon
return true;
}
- var entity = Owner.EntityManager.SpawnEntity("CrayonDecal", eventArgs.ClickLocation);
- if (entity.TryGetComponent(out AppearanceComponent? appearance))
- {
- appearance.SetData(CrayonVisuals.State, SelectedState);
- appearance.SetData(CrayonVisuals.Color, _color);
- }
+ if(!EntitySystem.Get().TryAddDecal(SelectedState, eventArgs.ClickLocation.Offset(new Vector2(-0.5f,-0.5f)), out _, Color.FromName(_color), cleanable: true))
+ return false;
if (_useSound != null)
SoundSystem.Play(Filter.Pvs(Owner), _useSound.GetSound(), Owner, AudioHelpers.WithVariation(0.125f));
diff --git a/Content.Server/Decals/Commands/AddDecalCommand.cs b/Content.Server/Decals/Commands/AddDecalCommand.cs
new file mode 100644
index 0000000000..e9ef52fdea
--- /dev/null
+++ b/Content.Server/Decals/Commands/AddDecalCommand.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using Content.Server.Administration;
+using Content.Shared.Administration;
+using Content.Shared.Decals;
+using Content.Shared.Maps;
+using Robust.Shared.Console;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Map;
+using Robust.Shared.Maths;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.Decals.Commands
+{
+ [AdminCommand(AdminFlags.Mapping)]
+ public sealed class AddDecalCommand : IConsoleCommand
+ {
+ public string Command => "adddecal";
+ public string Description => "Creates a decal on the map";
+ public string Help => $"{Command} [angle= zIndex= color=]";
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (args.Length < 4 || args.Length > 7)
+ {
+ shell.WriteError($"Received invalid amount of arguments arguments. Expected 4 to 7, got {args.Length}.\nUsage: {Help}");
+ return;
+ }
+
+ if (!IoCManager.Resolve().HasIndex(args[0]))
+ {
+ shell.WriteError($"Cannot find decalprototype '{args[0]}'.");
+ }
+
+ if (!float.TryParse(args[1], out var x))
+ {
+ shell.WriteError($"Failed parsing x-coordinate '{args[1]}'.");
+ return;
+ }
+
+ if (!float.TryParse(args[2], out var y))
+ {
+ shell.WriteError($"Failed parsing y-coordinate'{args[2]}'.");
+ return;
+ }
+
+ var mapManager = IoCManager.Resolve();
+ if (!int.TryParse(args[3], out var gridIdRaw) || !mapManager.TryGetGrid(new GridId(gridIdRaw), out var grid))
+ {
+ shell.WriteError($"Failed parsing gridId '{args[3]}'.");
+ return;
+ }
+
+ var coordinates = new EntityCoordinates(grid.GridEntityId, new Vector2(x, y));
+ if (grid.GetTileRef(coordinates).IsSpace())
+ {
+ shell.WriteError($"Cannot create decal on space tile at {coordinates}.");
+ return;
+ }
+
+ Color? color = null;
+ var zIndex = 0;
+ Angle? rotation = null;
+ if (args.Length > 4)
+ {
+ for (int i = 4; i < args.Length; i++)
+ {
+ var rawValue = args[i].Split('=');
+ if (rawValue.Length != 2)
+ {
+ shell.WriteError($"Failed parsing parameter: '{args[i]}'");
+ return;
+ }
+
+ switch (rawValue[0])
+ {
+ case "angle":
+ if (!double.TryParse(rawValue[1], out var degrees))
+ {
+ shell.WriteError($"Failed parsing angle '{rawValue[1]}'.");
+ return;
+ }
+ rotation = Angle.FromDegrees(degrees);
+ break;
+ case "zIndex":
+ if (!int.TryParse(rawValue[1], out zIndex))
+ {
+ shell.WriteError($"Failed parsing zIndex '{rawValue[1]}'.");
+ return;
+ }
+ break;
+ case "color":
+ if (!Color.TryFromName(rawValue[1], out var colorRaw))
+ {
+ shell.WriteError($"Failed parsing color '{rawValue[1]}'.");
+ return;
+ }
+
+ color = colorRaw;
+ break;
+ default:
+ shell.WriteError($"Unknown parameter key '{rawValue[0]}'.");
+ return;
+ }
+ }
+ }
+
+ if(EntitySystem.Get().TryAddDecal(args[0], coordinates, out var uid, color, rotation, zIndex))
+ {
+ shell.WriteLine($"Successfully created decal {uid}.");
+ }
+ else
+ {
+ shell.WriteError($"Failed adding decal.");
+ }
+ }
+ }
+}
diff --git a/Content.Server/Decals/Commands/EditDecalCommand.cs b/Content.Server/Decals/Commands/EditDecalCommand.cs
new file mode 100644
index 0000000000..af01b4d79b
--- /dev/null
+++ b/Content.Server/Decals/Commands/EditDecalCommand.cs
@@ -0,0 +1,162 @@
+using Content.Server.Administration;
+using Content.Shared.Administration;
+using Robust.Shared.Console;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Map;
+using Robust.Shared.Maths;
+
+namespace Content.Server.Decals;
+
+[AdminCommand(AdminFlags.Mapping)]
+public class EditDecalCommand : IConsoleCommand
+{
+ public string Command => "editdecal";
+ public string Description => "Edits a decal.";
+ public string Help => $@"{Command} \n
+Possible modes are:\n
+- position \n
+- color \n
+- id \n
+- rotation \n
+- zindex \n
+- clean
+";
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (args.Length < 4)
+ {
+ shell.WriteError("Expected at least 5 arguments.");
+ return;
+ }
+
+ if (!int.TryParse(args[0], out var gridIdRaw))
+ {
+ shell.WriteError($"Failed parsing gridId '{args[3]}'.");
+ return;
+ }
+
+ if (!uint.TryParse(args[1], out var uid))
+ {
+ shell.WriteError($"Failed parsing uid '{args[1]}'.");
+ return;
+ }
+
+ var gridId = new GridId(gridIdRaw);
+ if (!IoCManager.Resolve().GridExists(gridId))
+ {
+ shell.WriteError($"No grid with gridId {gridId} exists.");
+ return;
+ }
+
+ var decalSystem = EntitySystem.Get();
+ switch (args[2].ToLower())
+ {
+ case "position":
+ if(args.Length != 5)
+ {
+ shell.WriteError("Expected 6 arguments.");
+ return;
+ }
+
+ if (!float.TryParse(args[3], out var x) || !float.TryParse(args[4], out var y))
+ {
+ shell.WriteError("Failed parsing position.");
+ return;
+ }
+
+ if (!decalSystem.SetDecalPosition(gridId, uid, gridId, new Vector2(x, y)))
+ {
+ shell.WriteError("Failed changing decalposition.");
+ }
+ break;
+ case "color":
+ if(args.Length != 4)
+ {
+ shell.WriteError("Expected 5 arguments.");
+ return;
+ }
+
+ if (!Color.TryFromName(args[3], out var color))
+ {
+ shell.WriteError("Failed parsing color.");
+ return;
+ }
+
+ if (!decalSystem.SetDecalColor(gridId, uid, color))
+ {
+ shell.WriteError("Failed changing decal color.");
+ }
+ break;
+ case "id":
+ if(args.Length != 4)
+ {
+ shell.WriteError("Expected 5 arguments.");
+ return;
+ }
+
+ if (!decalSystem.SetDecalId(gridId, uid, args[3]))
+ {
+ shell.WriteError("Failed changing decal id.");
+ }
+ break;
+ case "rotation":
+ if(args.Length != 4)
+ {
+ shell.WriteError("Expected 5 arguments.");
+ return;
+ }
+
+ if (!double.TryParse(args[3], out var degrees))
+ {
+ shell.WriteError("Failed parsing degrees.");
+ return;
+ }
+
+ if (!decalSystem.SetDecalRotation(gridId, uid, Angle.FromDegrees(degrees)))
+ {
+ shell.WriteError("Failed changing decal rotation.");
+ }
+ break;
+ case "zindex":
+ if(args.Length != 4)
+ {
+ shell.WriteError("Expected 5 arguments.");
+ return;
+ }
+
+ if (!int.TryParse(args[3], out var zIndex))
+ {
+ shell.WriteError("Failed parsing zIndex.");
+ return;
+ }
+
+ if (!decalSystem.SetDecalZIndex(gridId, uid, zIndex))
+ {
+ shell.WriteError("Failed changing decal zIndex.");
+ }
+ break;
+ case "clean":
+ if(args.Length != 4)
+ {
+ shell.WriteError("Expected 5 arguments.");
+ return;
+ }
+
+ if (!bool.TryParse(args[3], out var cleanable))
+ {
+ shell.WriteError("Failed parsing cleanable.");
+ return;
+ }
+
+ if (!decalSystem.SetDecalCleanable(gridId, uid, cleanable))
+ {
+ shell.WriteError("Failed changing decal cleanable flag.");
+ }
+ break;
+ default:
+ shell.WriteError("Invalid mode.");
+ return;
+ }
+ }
+}
diff --git a/Content.Server/Decals/Commands/RemoveDecalCommand.cs b/Content.Server/Decals/Commands/RemoveDecalCommand.cs
new file mode 100644
index 0000000000..a2bf370f34
--- /dev/null
+++ b/Content.Server/Decals/Commands/RemoveDecalCommand.cs
@@ -0,0 +1,46 @@
+using Content.Server.Administration;
+using Content.Shared.Administration;
+using Robust.Shared.Console;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Map;
+
+namespace Content.Server.Decals.Commands
+{
+ [AdminCommand(AdminFlags.Mapping)]
+ public class RemoveDecalCommand : IConsoleCommand
+ {
+ public string Command => "rmdecal";
+ public string Description => "removes a decal";
+ public string Help => $"{Command} ";
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (args.Length != 2)
+ {
+ shell.WriteError($"Unexpected number of arguments.\nExpected two: {Help}");
+ return;
+ }
+
+ if (!uint.TryParse(args[0], out var uid))
+ {
+ shell.WriteError($"Failed parsing uid.");
+ return;
+ }
+
+ if (!int.TryParse(args[1], out var rawGridId) ||
+ !IoCManager.Resolve().GridExists(new GridId(rawGridId)))
+ {
+ shell.WriteError("Failed parsing gridId.");
+ }
+
+ var decalSystem = EntitySystem.Get();
+ if (decalSystem.RemoveDecal(new GridId(rawGridId), uid))
+ {
+ shell.WriteLine($"Successfully removed decal {uid}.");
+ return;
+ }
+
+ shell.WriteError($"Failed trying to remove decal {uid}.");
+ }
+ }
+}
diff --git a/Content.Server/Decals/DecalSystem.cs b/Content.Server/Decals/DecalSystem.cs
new file mode 100644
index 0000000000..d35f2c57ad
--- /dev/null
+++ b/Content.Server/Decals/DecalSystem.cs
@@ -0,0 +1,326 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using Content.Shared.Decals;
+using Content.Shared.Maps;
+using Robust.Server.Player;
+using Robust.Shared.Enums;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Map;
+using Robust.Shared.Maths;
+using Robust.Shared.Player;
+
+namespace Content.Server.Decals
+{
+ public class DecalSystem : SharedDecalSystem
+ {
+ [Dependency] private readonly IPlayerManager _playerManager = default!;
+
+ private readonly Dictionary> _dirtyChunks = new();
+ private readonly Dictionary>> _previousSentChunks = new();
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ _playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
+ MapManager.TileChanged += OnTileChanged;
+ }
+
+ public override void Shutdown()
+ {
+ base.Shutdown();
+
+ _playerManager.PlayerStatusChanged -= OnPlayerStatusChanged;
+ MapManager.TileChanged -= OnTileChanged;
+ }
+
+ private void OnTileChanged(object? sender, TileChangedEventArgs e)
+ {
+ if (!e.NewTile.IsSpace())
+ return;
+
+ var chunkCollection = ChunkCollection(e.NewTile.GridIndex);
+ var indices = GetChunkIndices(e.NewTile.GridIndices);
+ var toDelete = new HashSet();
+ if (chunkCollection.TryGetValue(indices, out var chunk))
+ {
+ foreach (var (uid, decal) in chunk)
+ {
+ if (new Vector2((int) Math.Floor(decal.Coordinates.X), (int) Math.Floor(decal.Coordinates.Y)) ==
+ e.NewTile.GridIndices)
+ {
+ toDelete.Add(uid);
+ }
+ }
+ }
+
+ if (toDelete.Count == 0) return;
+
+ foreach (var uid in toDelete)
+ {
+ RemoveDecalInternal(e.NewTile.GridIndex, uid);
+ }
+
+ DirtyChunk(e.NewTile.GridIndex, indices);
+ }
+
+ private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
+ {
+ switch (e.NewStatus)
+ {
+ case SessionStatus.InGame:
+ _previousSentChunks[e.Session] = new();
+ break;
+ case SessionStatus.Disconnected:
+ _previousSentChunks.Remove(e.Session);
+ break;
+ }
+ }
+
+ protected override void DirtyChunk(GridId id, Vector2i chunkIndices)
+ {
+ if(!_dirtyChunks.ContainsKey(id))
+ _dirtyChunks[id] = new HashSet();
+ _dirtyChunks[id].Add(chunkIndices);
+ }
+
+ public bool TryAddDecal(string id, EntityCoordinates coordinates, [NotNullWhen(true)] out uint? uid, Color? color = null, Angle? rotation = null, int zIndex = 0, bool cleanable = false)
+ {
+ uid = 0;
+ if (!PrototypeManager.HasIndex(id))
+ return false;
+
+ var gridId = coordinates.GetGridId(EntityManager);
+ if (MapManager.GetGrid(gridId).GetTileRef(coordinates).IsSpace())
+ return false;
+
+ rotation ??= Angle.Zero;
+ var decal = new Decal(coordinates.Position, id, color, rotation.Value, zIndex, cleanable);
+ var chunkCollection = DecalGridChunkCollection(gridId);
+ uid = chunkCollection.NextUid++;
+ var chunkIndices = GetChunkIndices(decal.Coordinates);
+ if(!chunkCollection.ChunkCollection.ContainsKey(chunkIndices))
+ chunkCollection.ChunkCollection[chunkIndices] = new();
+ chunkCollection.ChunkCollection[chunkIndices][uid.Value] = decal;
+ ChunkIndex[gridId][uid.Value] = chunkIndices;
+ DirtyChunk(gridId, chunkIndices);
+ return true;
+ }
+
+ public bool RemoveDecal(GridId gridId, uint uid) => RemoveDecalInternal(gridId, uid);
+
+ public HashSet GetDecalsInRange(GridId gridId, Vector2 position, float distance = 0.75f, Func? validDelegate = null)
+ {
+ var uids = new HashSet();
+ var chunkCollection = ChunkCollection(gridId);
+ var chunkIndices = GetChunkIndices(position);
+ if (!chunkCollection.TryGetValue(chunkIndices, out var chunk))
+ return uids;
+
+ foreach (var (uid, decal) in chunk)
+ {
+ if ((position - decal.Coordinates-new Vector2(0.5f, 0.5f)).Length > distance)
+ continue;
+
+ if (validDelegate == null || validDelegate(decal))
+ {
+ uids.Add(uid);
+ }
+ }
+
+ return uids;
+ }
+
+ public bool SetDecalPosition(GridId gridId, uint uid, EntityCoordinates coordinates)
+ {
+ return SetDecalPosition(gridId, uid, coordinates.GetGridId(EntityManager), coordinates.Position);
+ }
+
+ public bool SetDecalPosition(GridId gridId, uint uid, GridId newGridId, Vector2 position)
+ {
+ if (!ChunkIndex.TryGetValue(gridId, out var values) || !values.TryGetValue(uid, out var indices))
+ {
+ return false;
+ }
+
+ DirtyChunk(gridId, indices);
+ var chunkCollection = ChunkCollection(gridId);
+ var decal = chunkCollection[indices][uid];
+ if (newGridId == gridId)
+ {
+ chunkCollection[indices][uid] = decal.WithCoordinates(position);
+ return true;
+ }
+
+ RemoveDecalInternal(gridId, uid);
+
+ var newChunkCollection = ChunkCollection(newGridId);
+ var chunkIndices = GetChunkIndices(position);
+ if(!newChunkCollection.ContainsKey(chunkIndices))
+ newChunkCollection[chunkIndices] = new();
+ newChunkCollection[chunkIndices][uid] = decal.WithCoordinates(position);
+ ChunkIndex[newGridId][uid] = chunkIndices;
+ DirtyChunk(newGridId, chunkIndices);
+ return true;
+ }
+
+ public bool SetDecalColor(GridId gridId, uint uid, Color? color)
+ {
+ if (!ChunkIndex.TryGetValue(gridId, out var values) || !values.TryGetValue(uid, out var indices))
+ {
+ return false;
+ }
+
+ var chunkCollection = ChunkCollection(gridId);
+ var decal = chunkCollection[indices][uid];
+ chunkCollection[indices][uid] = decal.WithColor(color);
+ DirtyChunk(gridId, indices);
+ return true;
+ }
+
+ public bool SetDecalId(GridId gridId, uint uid, string id)
+ {
+ if (!ChunkIndex.TryGetValue(gridId, out var values) || !values.TryGetValue(uid, out var indices))
+ {
+ return false;
+ }
+
+ if (!PrototypeManager.HasIndex(id))
+ throw new ArgumentOutOfRangeException($"Tried to set decal id to invalid prototypeid: {id}");
+
+ var chunkCollection = ChunkCollection(gridId);
+ var decal = chunkCollection[indices][uid];
+ chunkCollection[indices][uid] = decal.WithId(id);
+ DirtyChunk(gridId, indices);
+ return true;
+ }
+
+ public bool SetDecalRotation(GridId gridId, uint uid, Angle angle)
+ {
+ if (!ChunkIndex.TryGetValue(gridId, out var values) || !values.TryGetValue(uid, out var indices))
+ {
+ return false;
+ }
+
+ var chunkCollection = ChunkCollection(gridId);
+ var decal = chunkCollection[indices][uid];
+ chunkCollection[indices][uid] = decal.WithRotation(angle);
+ DirtyChunk(gridId, indices);
+ return true;
+ }
+
+ public bool SetDecalZIndex(GridId gridId, uint uid, int zIndex)
+ {
+ if (!ChunkIndex.TryGetValue(gridId, out var values) || !values.TryGetValue(uid, out var indices))
+ {
+ return false;
+ }
+
+ var chunkCollection = ChunkCollection(gridId);
+ var decal = chunkCollection[indices][uid];
+ chunkCollection[indices][uid] = decal.WithZIndex(zIndex);
+ DirtyChunk(gridId, indices);
+ return true;
+ }
+
+ public bool SetDecalCleanable(GridId gridId, uint uid, bool cleanable)
+ {
+ if (!ChunkIndex.TryGetValue(gridId, out var values) || !values.TryGetValue(uid, out var indices))
+ {
+ return false;
+ }
+
+ var chunkCollection = ChunkCollection(gridId);
+ var decal = chunkCollection[indices][uid];
+ chunkCollection[indices][uid] = decal.WithCleanable(cleanable);
+ DirtyChunk(gridId, indices);
+ return true;
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+
+ foreach (var session in Filter.Broadcast().Recipients)
+ {
+ if(session is not IPlayerSession playerSession || playerSession.Status != SessionStatus.InGame)
+ continue;
+
+ var chunks = GetChunksForSession(playerSession);
+ var updatedChunks = new Dictionary>();
+ foreach (var (gridId, gridChunks) in chunks)
+ {
+ var newChunks = new HashSet(gridChunks);
+ if (_previousSentChunks[playerSession].TryGetValue(gridId, out var previousChunks))
+ {
+ newChunks.ExceptWith(previousChunks);
+ }
+
+ if (_dirtyChunks.TryGetValue(gridId, out var dirtyChunks))
+ {
+ gridChunks.IntersectWith(dirtyChunks);
+ newChunks.UnionWith(gridChunks);
+ }
+
+ if (newChunks.Count == 0)
+ continue;
+
+ updatedChunks[gridId] = newChunks;
+ }
+
+ if(updatedChunks.Count == 0)
+ continue;
+
+ _previousSentChunks[playerSession] = chunks;
+
+ //send all gridChunks to client
+ SendChunkUpdates(playerSession, updatedChunks);
+ }
+
+ _dirtyChunks.Clear();
+ }
+
+ private void SendChunkUpdates(IPlayerSession session, Dictionary> updatedChunks)
+ {
+ var updatedDecals = new Dictionary>>();
+ foreach (var (gridId, chunks) in updatedChunks)
+ {
+ var gridChunks = new Dictionary>();
+ foreach (var indices in chunks)
+ {
+ gridChunks.Add(indices,
+ ChunkCollection(gridId).TryGetValue(indices, out var chunk)
+ ? chunk
+ : new Dictionary());
+ }
+ updatedDecals[gridId] = gridChunks;
+ }
+
+ RaiseNetworkEvent(new DecalChunkUpdateEvent{Data = updatedDecals}, Filter.SinglePlayer(session));
+ }
+
+ private HashSet GetSessionViewers(IPlayerSession session)
+ {
+ var viewers = new HashSet();
+ if (session.Status != SessionStatus.InGame || session.AttachedEntityUid is null)
+ return viewers;
+
+ viewers.Add(session.AttachedEntityUid.Value);
+
+ foreach (var uid in session.ViewSubscriptions)
+ {
+ viewers.Add(uid);
+ }
+
+ return viewers;
+ }
+
+ private Dictionary> GetChunksForSession(IPlayerSession session)
+ {
+ return GetChunksForViewers(GetSessionViewers(session));
+ }
+ }
+}
diff --git a/Content.Shared/Crayon/SharedCrayonComponent.cs b/Content.Shared/Crayon/SharedCrayonComponent.cs
index 6019a72300..4fd6cf44d1 100644
--- a/Content.Shared/Crayon/SharedCrayonComponent.cs
+++ b/Content.Shared/Crayon/SharedCrayonComponent.cs
@@ -72,16 +72,4 @@ namespace Content.Shared.Crayon
Color = color;
}
}
-
- [Serializable, NetSerializable, Prototype("crayonDecal")]
- public class CrayonDecalPrototype : IPrototype
- {
- [ViewVariables]
- [DataField("id", required: true)]
- public string ID { get; } = default!;
-
- [DataField("spritePath")] public string SpritePath { get; } = string.Empty;
-
- [DataField("decals")] public List Decals { get; } = new();
- }
}
diff --git a/Content.Shared/Decals/Decal.cs b/Content.Shared/Decals/Decal.cs
new file mode 100644
index 0000000000..edca3da7e4
--- /dev/null
+++ b/Content.Shared/Decals/Decal.cs
@@ -0,0 +1,38 @@
+using System;
+using Robust.Shared.Maths;
+using Robust.Shared.Serialization;
+using Robust.Shared.Serialization.Manager.Attributes;
+
+namespace Content.Shared.Decals
+{
+ [Serializable, NetSerializable]
+ [DataDefinition]
+ public class Decal
+ {
+ [DataField("coordinates")] public readonly Vector2 Coordinates = Vector2.Zero;
+ [DataField("id")] public readonly string Id = string.Empty;
+ [DataField("color")] public readonly Color? Color;
+ [DataField("angle")] public readonly Angle Angle = Angle.Zero;
+ [DataField("zIndex")] public readonly int ZIndex;
+ [DataField("cleanable")] public bool Cleanable;
+
+ public Decal() {}
+
+ public Decal(Vector2 coordinates, string id, Color? color, Angle angle, int zIndex, bool cleanable)
+ {
+ Coordinates = coordinates;
+ Id = id;
+ Color = color;
+ Angle = angle;
+ ZIndex = zIndex;
+ Cleanable = cleanable;
+ }
+
+ public Decal WithCoordinates(Vector2 coordinates) => new(coordinates, Id, Color, Angle, ZIndex, Cleanable);
+ public Decal WithId(string id) => new(Coordinates, id, Color, Angle, ZIndex, Cleanable);
+ public Decal WithColor(Color? color) => new(Coordinates, Id, color, Angle, ZIndex, Cleanable);
+ public Decal WithRotation(Angle angle) => new(Coordinates, Id, Color, angle, ZIndex, Cleanable);
+ public Decal WithZIndex(int zIndex) => new(Coordinates, Id, Color, Angle, zIndex, Cleanable);
+ public Decal WithCleanable(bool cleanable) => new(Coordinates, Id, Color, Angle, ZIndex, cleanable);
+ }
+}
diff --git a/Content.Shared/Decals/DecalChunkUpdateEvent.cs b/Content.Shared/Decals/DecalChunkUpdateEvent.cs
new file mode 100644
index 0000000000..99bbbd5a84
--- /dev/null
+++ b/Content.Shared/Decals/DecalChunkUpdateEvent.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Map;
+using Robust.Shared.Maths;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Decals
+{
+ [Serializable, NetSerializable]
+ public class DecalChunkUpdateEvent : EntityEventArgs
+ {
+ public Dictionary>> Data = new();
+ }
+}
diff --git a/Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs b/Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs
new file mode 100644
index 0000000000..301fb2aaed
--- /dev/null
+++ b/Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs
@@ -0,0 +1,74 @@
+using System.Collections.Generic;
+using Robust.Shared.IoC;
+using Robust.Shared.Maths;
+using Robust.Shared.Serialization.Manager;
+using Robust.Shared.Serialization.Manager.Attributes;
+using Robust.Shared.Serialization.Manager.Result;
+using Robust.Shared.Serialization.Markdown;
+using Robust.Shared.Serialization.Markdown.Mapping;
+using Robust.Shared.Serialization.Markdown.Validation;
+using Robust.Shared.Serialization.TypeSerializers.Interfaces;
+
+namespace Content.Shared.Decals
+{
+ [TypeSerializer]
+ public class DecalGridChunkCollectionTypeSerializer : ITypeSerializer
+ {
+ public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node,
+ IDependencyCollection dependencies, ISerializationContext? context = null)
+ {
+ return serializationManager.ValidateNode>>(node, context);
+ }
+
+ public DeserializationResult Read(ISerializationManager serializationManager, MappingDataNode node,
+ IDependencyCollection dependencies, bool skipHook, ISerializationContext? context = null)
+ {
+ //todo this read method does not support pushing inheritance
+ var dictionary =
+ serializationManager.ReadValueOrThrow>>(node, context, skipHook);
+
+ var uids = new SortedSet();
+ var uidChunkMap = new Dictionary();
+ foreach (var (indices, decals) in dictionary)
+ {
+ foreach (var (uid, _) in decals)
+ {
+ uids.Add(uid);
+ uidChunkMap[uid] = indices;
+ }
+ }
+
+ var uidMap = new Dictionary();
+ uint nextIndex = 0;
+ foreach (var uid in uids)
+ {
+ uidMap[uid] = nextIndex++;
+ }
+
+ var newDict = new Dictionary>();
+ foreach (var (oldUid, newUid) in uidMap)
+ {
+ var indices = uidChunkMap[oldUid];
+ if(!newDict.ContainsKey(indices))
+ newDict[indices] = new();
+ newDict[indices][newUid] = dictionary[indices][oldUid];
+ }
+
+ return new DeserializedValue(
+ new DecalGridComponent.DecalGridChunkCollection(newDict){NextUid = nextIndex});
+ }
+
+ public DataNode Write(ISerializationManager serializationManager, DecalGridComponent.DecalGridChunkCollection value, bool alwaysWrite = false,
+ ISerializationContext? context = null)
+ {
+ return serializationManager.WriteValue(value.ChunkCollection, alwaysWrite, context);
+ }
+
+ public DecalGridComponent.DecalGridChunkCollection Copy(ISerializationManager serializationManager, DecalGridComponent.DecalGridChunkCollection source,
+ DecalGridComponent.DecalGridChunkCollection target, bool skipHook, ISerializationContext? context = null)
+ {
+ var dict = serializationManager.Copy(source.ChunkCollection, target.ChunkCollection, context, skipHook)!;
+ return new DecalGridComponent.DecalGridChunkCollection(dict) {NextUid = source.NextUid};
+ }
+ }
+}
diff --git a/Content.Shared/Decals/DecalGridComponent.cs b/Content.Shared/Decals/DecalGridComponent.cs
new file mode 100644
index 0000000000..205a5baed8
--- /dev/null
+++ b/Content.Shared/Decals/DecalGridComponent.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using Robust.Shared.Analyzers;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Maths;
+using Robust.Shared.Serialization.Manager.Attributes;
+
+namespace Content.Shared.Decals
+{
+ [RegisterComponent]
+ [Friend(typeof(SharedDecalSystem))]
+ public class DecalGridComponent : Component
+ {
+ public override string Name => "DecalGrid";
+
+ [DataField("chunkCollection", serverOnly: true)]
+ public DecalGridChunkCollection ChunkCollection = new(new ());
+
+ public record DecalGridChunkCollection(Dictionary> ChunkCollection)
+ {
+ public uint NextUid;
+ }
+ }
+}
diff --git a/Content.Shared/Decals/DecalPrototype.cs b/Content.Shared/Decals/DecalPrototype.cs
new file mode 100644
index 0000000000..cd648fa162
--- /dev/null
+++ b/Content.Shared/Decals/DecalPrototype.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.Manager.Attributes;
+using Robust.Shared.Utility;
+
+namespace Content.Shared.Decals
+{
+ [Prototype("decal")]
+ public class DecalPrototype : IPrototype
+ {
+ [DataField("id")] public string ID { get; } = null!;
+ [DataField("sprite")] public SpriteSpecifier Sprite { get; } = SpriteSpecifier.Invalid;
+ [DataField("tags")] public List Tags = new();
+ }
+}
diff --git a/Content.Shared/Decals/SharedDecalSystem.cs b/Content.Shared/Decals/SharedDecalSystem.cs
new file mode 100644
index 0000000000..2d2b65640e
--- /dev/null
+++ b/Content.Shared/Decals/SharedDecalSystem.cs
@@ -0,0 +1,153 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using Robust.Shared;
+using Robust.Shared.Configuration;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Map;
+using Robust.Shared.Maths;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Decals
+{
+ public abstract class SharedDecalSystem : EntitySystem
+ {
+ [Dependency] protected readonly IPrototypeManager PrototypeManager = default!;
+ [Dependency] private readonly IConfigurationManager _configurationManager = default!;
+ [Dependency] protected readonly IMapManager MapManager = default!;
+
+ protected readonly Dictionary> ChunkIndex = new();
+
+ public const int ChunkSize = 32;
+ public static Vector2i GetChunkIndices(Vector2 coordinates) => new ((int) Math.Floor(coordinates.X / ChunkSize), (int) Math.Floor(coordinates.Y / ChunkSize));
+
+ private float _viewSize;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnGridInitialize);
+ _configurationManager.OnValueChanged(CVars.NetMaxUpdateRange, OnPvsRangeChanged, true);
+ }
+
+ public override void Shutdown()
+ {
+ base.Shutdown();
+ _configurationManager.UnsubValueChanged(CVars.NetMaxUpdateRange, OnPvsRangeChanged);
+ }
+
+ private void OnPvsRangeChanged(float obj)
+ {
+ _viewSize = obj * 2f;
+ }
+
+ private void OnGridInitialize(GridInitializeEvent msg)
+ {
+ var comp = EntityManager.EnsureComponent(MapManager.GetGrid(msg.GridId).GridEntityId);
+ ChunkIndex[msg.GridId] = new();
+ foreach (var (indices, decals) in comp.ChunkCollection.ChunkCollection)
+ {
+ foreach (var uid in decals.Keys)
+ {
+ ChunkIndex[msg.GridId][uid] = indices;
+ }
+ }
+ }
+
+ protected DecalGridComponent.DecalGridChunkCollection DecalGridChunkCollection(GridId gridId) => EntityManager
+ .GetComponent(MapManager.GetGrid(gridId).GridEntityId).ChunkCollection;
+ protected Dictionary> ChunkCollection(GridId gridId) => DecalGridChunkCollection(gridId).ChunkCollection;
+
+ protected virtual void DirtyChunk(GridId id, Vector2i chunkIndices) {}
+
+ protected bool RemoveDecalInternal(GridId gridId, uint uid)
+ {
+ if (!RemoveDecalHook(gridId, uid)) return false;
+
+ if (!ChunkIndex.TryGetValue(gridId, out var values) || !values.TryGetValue(uid, out var indices))
+ {
+ return false;
+ }
+
+ var chunkCollection = ChunkCollection(gridId);
+ if (!chunkCollection.TryGetValue(indices, out var chunk) || !chunk.Remove(uid))
+ {
+ return false;
+ }
+
+ if (chunkCollection[indices].Count == 0)
+ chunkCollection.Remove(indices);
+
+ ChunkIndex[gridId]?.Remove(uid);
+ DirtyChunk(gridId, indices);
+ return true;
+ }
+
+ protected virtual bool RemoveDecalHook(GridId gridId, uint uid) => true;
+
+ private (Box2 view, MapId mapId) CalcViewBounds(in EntityUid euid)
+ {
+ var xform = EntityManager.GetComponent(euid);
+
+ var view = Box2.UnitCentered.Scale(_viewSize).Translated(xform.WorldPosition);
+ var map = xform.MapID;
+
+ return (view, map);
+ }
+
+ protected Dictionary> GetChunksForViewers(HashSet viewers)
+ {
+ var chunks = new Dictionary>();
+ foreach (var viewerUid in viewers)
+ {
+ var (bounds, mapId) = CalcViewBounds(viewerUid);
+ MapManager.FindGridsIntersectingEnumerator(mapId, bounds, out var gridsEnumerator, true);
+ while(gridsEnumerator.MoveNext(out var grid))
+ {
+ if(!chunks.ContainsKey(grid.Index))
+ chunks[grid.Index] = new();
+ var enumerator = new ChunkIndicesEnumerator(grid.InvWorldMatrix.TransformBox(bounds), ChunkSize);
+ while (enumerator.MoveNext(out var indices))
+ {
+ chunks[grid.Index].Add(indices.Value);
+ }
+ }
+ }
+ return chunks;
+ }
+ }
+
+ internal struct ChunkIndicesEnumerator
+ {
+ private Vector2i _chunkLB;
+ private Vector2i _chunkRT;
+
+ private int _xIndex;
+ private int _yIndex;
+
+ internal ChunkIndicesEnumerator(Box2 localAABB, int chunkSize)
+ {
+ _chunkLB = new Vector2i((int)Math.Floor(localAABB.Left / chunkSize), (int)Math.Floor(localAABB.Bottom / chunkSize));
+ _chunkRT = new Vector2i((int)Math.Floor(localAABB.Right / chunkSize), (int)Math.Floor(localAABB.Top / chunkSize));
+
+ _xIndex = _chunkLB.X;
+ _yIndex = _chunkLB.Y;
+ }
+
+ public bool MoveNext([NotNullWhen(true)] out Vector2i? indices)
+ {
+ if (_yIndex > _chunkRT.Y)
+ {
+ _yIndex = _chunkLB.Y;
+ _xIndex += 1;
+ }
+
+ indices = new Vector2i(_xIndex, _yIndex);
+ _yIndex += 1;
+
+ return _xIndex <= _chunkRT.X;
+ }
+ }
+}
diff --git a/Resources/Prototypes/Catalog/crayon_decals.yml b/Resources/Prototypes/Catalog/crayon_decals.yml
deleted file mode 100644
index f138f966a1..0000000000
--- a/Resources/Prototypes/Catalog/crayon_decals.yml
+++ /dev/null
@@ -1,135 +0,0 @@
-- type: crayonDecal
- id: BaseDecals
- spritePath: Effects/crayondecals.rsi
- decals:
- - 0
- - 1
- - 2
- - 3
- - 4
- - 5
- - 6
- - 7
- - 8
- - 9
- - Blasto
- - Clandestine
- - Cyber
- - Diablo
- - Donk
- - Gene
- - Gib
- - Max
- - Newton
- - North
- - Omni
- - Osiron
- - Prima
- - Psyke
- - Sirius
- - Tunnel
- - Waffle
- - a
- - ampersand
- - amyjon
- - antilizard
- - arrow
- - b
- - beepsky
- - biohazard
- - blueprint
- - body
- - bottle
- - brush
- - c
- - carp
- - cat
- - chevron
- - clawprint
- - clown
- - comma
- - corgi
- - credit
- - cyka
- - d
- - danger
- - disk
- - dot
- - dwarf
- - e
- - electricdanger
- - end
- - engie
- - equals
- - evac
- - exclamationmark
- - f
- - face
- - fireaxe
- - firedanger
- - food
- - footprint
- - g
- - ghost
- - guy
- - h
- - heart
- - i
- - j
- - k
- - l
- - largebrush
- - like
- - line
- - m
- - matt
- - med
- - minus
- - n
- - nay
- - o
- - p
- - pawprint
- - peace
- - percent
- - plus
- - pound
- - prolizard
- - q
- - questionmark
- - r
- - radiation
- - revolution
- - rune1
- - rune2
- - rune3
- - rune4
- - rune5
- - rune6
- - s
- - safe
- - scroll
- - shop
- - shortline
- - shotgun
- - skull
- - slash
- - smallbrush
- - snake
- - space
- - splatter
- - star
- - stickman
- - t
- - taser
- - thinline
- - toilet
- - toolbox
- - trade
- - u
- - uboa
- - v
- - w
- - x
- - y
- - z
diff --git a/Resources/Prototypes/Decals/crayons.yml b/Resources/Prototypes/Decals/crayons.yml
new file mode 100644
index 0000000000..d13bd0e3f3
--- /dev/null
+++ b/Resources/Prototypes/Decals/crayons.yml
@@ -0,0 +1,916 @@
+- type: decal
+ id: 0
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 0
+
+- type: decal
+ id: 1
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 1
+
+- type: decal
+ id: 2
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 2
+
+- type: decal
+ id: 3
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 3
+
+- type: decal
+ id: 4
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 4
+
+- type: decal
+ id: 5
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 5
+
+- type: decal
+ id: 6
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 6
+
+- type: decal
+ id: 7
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 7
+
+- type: decal
+ id: 8
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 8
+
+- type: decal
+ id: 9
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: 9
+
+- type: decal
+ id: Blasto
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Blasto
+
+- type: decal
+ id: Clandestine
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Clandestine
+
+- type: decal
+ id: Cyber
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Cyber
+
+- type: decal
+ id: Diablo
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Diablo
+
+- type: decal
+ id: Donk
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Donk
+
+- type: decal
+ id: Gene
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Gene
+
+- type: decal
+ id: Gib
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Gib
+
+- type: decal
+ id: Max
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Max
+
+- type: decal
+ id: Newton
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Newton
+
+- type: decal
+ id: North
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: North
+
+- type: decal
+ id: Omni
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Omni
+
+- type: decal
+ id: Osiron
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Osiron
+
+- type: decal
+ id: Prima
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Prima
+
+- type: decal
+ id: Psyke
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Psyke
+
+- type: decal
+ id: Sirius
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Sirius
+
+- type: decal
+ id: Tunnel
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Tunnel
+
+- type: decal
+ id: Waffle
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: Waffle
+
+- type: decal
+ id: a
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: a
+
+- type: decal
+ id: ampersand
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: ampersand
+
+- type: decal
+ id: amyjon
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: amyjon
+
+- type: decal
+ id: antilizard
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: antilizard
+
+- type: decal
+ id: arrow
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: arrow
+
+- type: decal
+ id: b
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: b
+
+- type: decal
+ id: beepsky
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: beepsky
+
+- type: decal
+ id: biohazard
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: biohazard
+
+- type: decal
+ id: blueprint
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: blueprint
+
+- type: decal
+ id: body
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: body
+
+- type: decal
+ id: bottle
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: bottle
+
+- type: decal
+ id: brush
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: brush
+
+- type: decal
+ id: c
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: c
+
+- type: decal
+ id: carp
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: carp
+
+- type: decal
+ id: cat
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: cat
+
+- type: decal
+ id: chevron
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: chevron
+
+- type: decal
+ id: clawprint
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: clawprint
+
+- type: decal
+ id: clown
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: clown
+
+- type: decal
+ id: comma
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: comma
+
+- type: decal
+ id: corgi
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: corgi
+
+- type: decal
+ id: credit
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: credit
+
+- type: decal
+ id: cyka
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: cyka
+
+- type: decal
+ id: d
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: d
+
+- type: decal
+ id: danger
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: danger
+
+- type: decal
+ id: disk
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: disk
+
+- type: decal
+ id: dot
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: dot
+
+- type: decal
+ id: dwarf
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: dwarf
+
+- type: decal
+ id: e
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: e
+
+- type: decal
+ id: electricdanger
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: electricdanger
+
+- type: decal
+ id: end
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: end
+
+- type: decal
+ id: engie
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: engie
+
+- type: decal
+ id: equals
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: equals
+
+- type: decal
+ id: evac
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: evac
+
+- type: decal
+ id: exclamationmark
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: exclamationmark
+
+- type: decal
+ id: f
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: f
+
+- type: decal
+ id: face
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: face
+
+- type: decal
+ id: fireaxe
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: fireaxe
+
+- type: decal
+ id: firedanger
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: firedanger
+
+- type: decal
+ id: food
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: food
+
+- type: decal
+ id: footprint
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: footprint
+
+- type: decal
+ id: g
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: g
+
+- type: decal
+ id: ghost
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: ghost
+
+- type: decal
+ id: guy
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: guy
+
+- type: decal
+ id: h
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: h
+
+- type: decal
+ id: heart
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: heart
+
+- type: decal
+ id: i
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: i
+
+- type: decal
+ id: j
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: j
+
+- type: decal
+ id: k
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: k
+
+- type: decal
+ id: l
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: l
+
+- type: decal
+ id: largebrush
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: largebrush
+
+- type: decal
+ id: like
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: like
+
+- type: decal
+ id: line
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: line
+
+- type: decal
+ id: m
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: m
+
+- type: decal
+ id: matt
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: matt
+
+- type: decal
+ id: med
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: med
+
+- type: decal
+ id: minus
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: minus
+
+- type: decal
+ id: n
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: n
+
+- type: decal
+ id: nay
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: nay
+
+- type: decal
+ id: o
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: o
+
+- type: decal
+ id: p
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: p
+
+- type: decal
+ id: pawprint
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: pawprint
+
+- type: decal
+ id: peace
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: peace
+
+- type: decal
+ id: percent
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: percent
+
+- type: decal
+ id: plus
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: plus
+
+- type: decal
+ id: pound
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: pound
+
+- type: decal
+ id: prolizard
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: prolizard
+
+- type: decal
+ id: q
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: q
+
+- type: decal
+ id: questionmark
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: questionmark
+
+- type: decal
+ id: r
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: r
+
+- type: decal
+ id: radiation
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: radiation
+
+- type: decal
+ id: revolution
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: revolution
+
+- type: decal
+ id: rune1
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: rune1
+
+- type: decal
+ id: rune2
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: rune2
+
+- type: decal
+ id: rune3
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: rune3
+
+- type: decal
+ id: rune4
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: rune4
+
+- type: decal
+ id: rune5
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: rune5
+
+- type: decal
+ id: rune6
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: rune6
+
+- type: decal
+ id: s
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: s
+
+- type: decal
+ id: safe
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: safe
+
+- type: decal
+ id: scroll
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: scroll
+
+- type: decal
+ id: shop
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: shop
+
+- type: decal
+ id: shortline
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: shortline
+
+- type: decal
+ id: shotgun
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: shotgun
+
+- type: decal
+ id: skull
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: skull
+
+- type: decal
+ id: slash
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: slash
+
+- type: decal
+ id: smallbrush
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: smallbrush
+
+- type: decal
+ id: snake
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: snake
+
+- type: decal
+ id: space
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: space
+
+- type: decal
+ id: splatter
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: splatter
+
+- type: decal
+ id: star
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: star
+
+- type: decal
+ id: stickman
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: stickman
+
+- type: decal
+ id: t
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: t
+
+- type: decal
+ id: taser
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: taser
+
+- type: decal
+ id: thinline
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: thinline
+
+- type: decal
+ id: toilet
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: toilet
+
+- type: decal
+ id: toolbox
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: toolbox
+
+- type: decal
+ id: trade
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: trade
+
+- type: decal
+ id: u
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: u
+
+- type: decal
+ id: uboa
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: uboa
+
+- type: decal
+ id: v
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: v
+
+- type: decal
+ id: w
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: w
+
+- type: decal
+ id: x
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: x
+
+- type: decal
+ id: y
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: y
+
+- type: decal
+ id: z
+ tags: ["crayon"]
+ sprite:
+ sprite: Effects/crayondecals.rsi
+ state: z
diff --git a/Resources/Prototypes/Entities/Effects/crayondecals.yml b/Resources/Prototypes/Entities/Effects/crayondecals.yml
deleted file mode 100644
index b2ffa3862f..0000000000
--- a/Resources/Prototypes/Entities/Effects/crayondecals.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- type: entity
- abstract: true
- id: CrayonDecal
- name: crayon drawing
- description: "Graffiti. Damn kids."
- components:
- - type: Clickable
- - type: InteractionOutline
- - type: Physics
- - type: Sprite
- sprite: Effects/crayondecals.rsi
- state: corgi
- - type: Cleanable
- - type: Appearance
- visuals:
- - type: CrayonDecalVisualizer
From c91363aa4e014b7702c99565f56dfbfae94ccbc6 Mon Sep 17 00:00:00 2001
From: 20kdc
Date: Fri, 3 Dec 2021 17:11:51 +0000
Subject: [PATCH 04/40] Fix monkey ghost role to be controllable and not say
Unknown (#5682)
---
Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
index 5bc0432185..d00a69ca86 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
@@ -310,6 +310,9 @@
description: New church of neo-darwinists actually believe that EVERY animal evolved from a monkey. Tastes like pork, and killing them is both fun and relaxing.
components:
- type: GhostTakeoverAvailable
+ makeSentient: true
+ name: monkey
+ description: Ook ook!
- type: Sprite
drawdepth: Mobs
layers:
From d8beb402e9b44975a1daf22a21413c97de19c696 Mon Sep 17 00:00:00 2001
From: PJBot
Date: Fri, 3 Dec 2021 12:12:54 -0500
Subject: [PATCH 05/40] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 64145113cb..db36e07644 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,9 +1,4 @@
Entries:
-- author: Hardly
- changes:
- - {message: Reduced Syndicate minibomb's radius, type: Tweak}
- id: 199
- time: '2021-05-21T11:26:10.0000000+00:00'
- author: Swept
changes:
- {message: Removed solution transfer verbs., type: Remove}
@@ -2865,3 +2860,9 @@ Entries:
- {message: Modified gyroscope sprite., type: Tweak}
id: 700
time: '2021-12-03T09:39:18.0000000+00:00'
+- author: 20kdc
+ changes:
+ - {message: 'The metaphysical department has finally learned what a monkey is, and
+ has adjusted soul binding to monkeys accordingly.', type: Fix}
+ id: 701
+ time: '2021-12-03T17:11:51.0000000+00:00'
From 0205846ab21ad194425fb2d2e84b71bda295ceb5 Mon Sep 17 00:00:00 2001
From: 20kdc
Date: Fri, 3 Dec 2021 22:24:19 +0000
Subject: [PATCH 06/40] Salvage 0.1 (#5662)
---
Content.Client/Entry/EntryPoint.cs | 1 +
Content.Client/Entry/IgnoredComponents.cs | 2 +
Content.Server/Atmos/Commands/FixGridAtmos.cs | 7 +-
Content.Server/Salvage/CallSalvageCommand.cs | 70 +
Content.Server/Salvage/SalvageComponent.cs | 33 +
.../Salvage/SalvageMagnetComponent.cs | 30 +
Content.Server/Salvage/SalvageMapPrototype.cs | 38 +
Content.Server/Salvage/SalvageSystem.cs | 310 +++
Content.Shared/CCVar/CCVars.cs | 10 +
.../Locale/en-US/salvage/salvage-system.ftl | 22 +
Resources/Maps/Salvage/medium-1.yml | 1697 +++++++++++++++++
Resources/Maps/Salvage/medium-template.yml | 407 ++++
Resources/Maps/Salvage/small-1.yml | 318 +++
Resources/Maps/Salvage/small-2.yml | 621 ++++++
Resources/Maps/Salvage/small-a-1.yml | 563 ++++++
Resources/Maps/Salvage/small-template.yml | 277 +++
Resources/Maps/knightship.yml | 13 +
Resources/Maps/packedstation.yml | 13 +-
Resources/Maps/saltern.yml | 13 +
.../Catalog/Fills/Crates/salvage.yml | 82 +
.../Catalog/Fills/Paper/salvage_lore.yml | 101 +
.../Markers/Spawners/Random/salvage.yml | 67 +
.../Entities/Markers/atmos_blocker.yml | 17 +
.../Prototypes/Entities/Mobs/NPCs/human.yml | 13 +
.../Entities/Structures/Machines/salvage.yml | 25 +
.../Entities/Structures/Walls/asteroid.yml | 1 +
Resources/Prototypes/Maps/salvage.yml | 33 +
.../Roles/Jobs/Cargo/cargo_technician.yml | 1 +
.../Roles/Jobs/Cargo/quartermaster.yml | 1 +
.../Textures/Markers/arrow.rsi/meta.json | 14 +
Resources/Textures/Markers/arrow.rsi/mono.png | Bin 0 -> 271 bytes
.../Textures/Markers/atmos.rsi/base-hot.png | Bin 0 -> 255 bytes
Resources/Textures/Markers/atmos.rsi/fire.png | Bin 0 -> 227 bytes
.../Textures/Markers/atmos.rsi/meta.json | 6 +
.../Structures/Machines/salvage.rsi/meta.json | 17 +
.../Machines/salvage.rsi/salvage-magnet.png | Bin 0 -> 2268 bytes
36 files changed, 4812 insertions(+), 11 deletions(-)
create mode 100644 Content.Server/Salvage/CallSalvageCommand.cs
create mode 100644 Content.Server/Salvage/SalvageComponent.cs
create mode 100644 Content.Server/Salvage/SalvageMagnetComponent.cs
create mode 100644 Content.Server/Salvage/SalvageMapPrototype.cs
create mode 100644 Content.Server/Salvage/SalvageSystem.cs
create mode 100644 Resources/Locale/en-US/salvage/salvage-system.ftl
create mode 100644 Resources/Maps/Salvage/medium-1.yml
create mode 100644 Resources/Maps/Salvage/medium-template.yml
create mode 100644 Resources/Maps/Salvage/small-1.yml
create mode 100644 Resources/Maps/Salvage/small-2.yml
create mode 100644 Resources/Maps/Salvage/small-a-1.yml
create mode 100644 Resources/Maps/Salvage/small-template.yml
create mode 100644 Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
create mode 100644 Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml
create mode 100644 Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml
create mode 100644 Resources/Prototypes/Entities/Structures/Machines/salvage.yml
create mode 100644 Resources/Prototypes/Maps/salvage.yml
create mode 100644 Resources/Textures/Markers/arrow.rsi/meta.json
create mode 100644 Resources/Textures/Markers/arrow.rsi/mono.png
create mode 100644 Resources/Textures/Markers/atmos.rsi/base-hot.png
create mode 100644 Resources/Textures/Markers/atmos.rsi/fire.png
create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/meta.json
create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet.png
diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs
index 7043970921..6067b2425a 100644
--- a/Content.Client/Entry/EntryPoint.cs
+++ b/Content.Client/Entry/EntryPoint.cs
@@ -94,6 +94,7 @@ namespace Content.Client.Entry
prototypes.RegisterIgnore("advertisementsPack");
prototypes.RegisterIgnore("metabolizerType");
prototypes.RegisterIgnore("metabolismGroup");
+ prototypes.RegisterIgnore("salvageMap");
ClientContentIoC.Register();
diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs
index 48d30e0eea..3322a880d1 100644
--- a/Content.Client/Entry/IgnoredComponents.cs
+++ b/Content.Client/Entry/IgnoredComponents.cs
@@ -126,6 +126,8 @@ namespace Content.Client.Entry
"Toys",
"SurgeryTool",
"EmitSoundOnThrow",
+ "Salvage",
+ "SalvageMagnet",
"Flash",
"Docking",
"Telecrystal",
diff --git a/Content.Server/Atmos/Commands/FixGridAtmos.cs b/Content.Server/Atmos/Commands/FixGridAtmos.cs
index 4dd76ba00c..b0a6fee2ac 100644
--- a/Content.Server/Atmos/Commands/FixGridAtmos.cs
+++ b/Content.Server/Atmos/Commands/FixGridAtmos.cs
@@ -29,7 +29,7 @@ namespace Content.Server.Atmos.Commands
var entityManager = IoCManager.Resolve();
var atmosphereSystem = EntitySystem.Get();
- var mixtures = new GasMixture[5];
+ var mixtures = new GasMixture[6];
for (var i = 0; i < mixtures.Length; i++)
mixtures[i] = new GasMixture(Atmospherics.CellVolume) { Temperature = Atmospherics.T20C };
@@ -48,6 +48,11 @@ namespace Content.Server.Atmos.Commands
// 4: Plasma (GM)
mixtures[4].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);
+ // 5: Instant Plasmafire (r)
+ mixtures[5].AdjustMoles(Gas.Oxygen, Atmospherics.MolesCellGasMiner);
+ mixtures[5].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);
+ mixtures[5].Temperature = 5000f;
+
foreach (var gid in args)
{
// I like offering detailed error messages, that's why I don't use one of the extension methods.
diff --git a/Content.Server/Salvage/CallSalvageCommand.cs b/Content.Server/Salvage/CallSalvageCommand.cs
new file mode 100644
index 0000000000..3a8faf9b56
--- /dev/null
+++ b/Content.Server/Salvage/CallSalvageCommand.cs
@@ -0,0 +1,70 @@
+using Content.Shared.Administration;
+using Content.Server.Administration;
+using Robust.Shared.Console;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Localization;
+
+namespace Content.Server.Salvage
+{
+ [AdminCommand(AdminFlags.Admin)]
+ public class CallSalvageCommand : IConsoleCommand
+ {
+ public string Command => "callsalvage";
+ public string Description => "Starts salvage.";
+ public string Help => "Usage: callsalvage";
+
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (args.Length != 0)
+ {
+ shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
+ return;
+ }
+ shell.WriteLine(EntitySystem.Get().CallSalvage());
+ }
+ }
+
+ [AdminCommand(AdminFlags.Admin)]
+ public class RecallSalvageCommand : IConsoleCommand
+ {
+ public string Command => "recallsalvage";
+ public string Description => "Forcibly recalls salvage.";
+ public string Help => "Usage: recallsalvage";
+
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (args.Length != 0)
+ {
+ shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
+ return;
+ }
+ shell.WriteLine(EntitySystem.Get().ReturnSalvage());
+ }
+ }
+
+ [AdminCommand(AdminFlags.Admin)]
+ public class RecallSalvageNowCommand : IConsoleCommand
+ {
+ public string Command => "recallsalvagefinishnow";
+ public string Description => "Forcibly stops salvage immediately (will delete - good for testing).";
+ public string Help => "Usage: recallsalvagefinishnow";
+
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (args.Length != 0)
+ {
+ shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
+ return;
+ }
+ var salvageSystem = EntitySystem.Get();
+ if ((salvageSystem.State != SalvageSystemState.Active) && (salvageSystem.State != SalvageSystemState.LettingGo))
+ {
+ shell.WriteError("Incorrect state (must be in active or letting-go state)");
+ return;
+ }
+ salvageSystem.DeleteSalvage();
+ }
+ }
+}
+
diff --git a/Content.Server/Salvage/SalvageComponent.cs b/Content.Server/Salvage/SalvageComponent.cs
new file mode 100644
index 0000000000..9d4a58887f
--- /dev/null
+++ b/Content.Server/Salvage/SalvageComponent.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using Content.Server.NodeContainer.NodeGroups;
+using Content.Server.NodeContainer.Nodes;
+using Content.Shared.Examine;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Localization;
+using Robust.Shared.Serialization.Manager.Attributes;
+using Robust.Shared.Utility;
+using Robust.Shared.ViewVariables;
+
+namespace Content.Server.Salvage
+{
+ ///
+ /// Mmmm, salvage
+ /// To be clear, this component is SUPPOSED to later handle magnet attraction.
+ ///
+ [RegisterComponent]
+ [ComponentProtoName("Salvage")]
+ public class SalvageComponent : Component
+ {
+ ///
+ /// Set this when salvage is no longer held by the magnet.
+ /// This starts the countdown to complete destruction.
+ ///
+ [ViewVariables] public bool Killswitch = false;
+
+ ///
+ /// Time killswitch has been active for.
+ ///
+ [ViewVariables] public float KillswitchTime = 0.0f;
+ }
+}
diff --git a/Content.Server/Salvage/SalvageMagnetComponent.cs b/Content.Server/Salvage/SalvageMagnetComponent.cs
new file mode 100644
index 0000000000..cded746d5c
--- /dev/null
+++ b/Content.Server/Salvage/SalvageMagnetComponent.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using Content.Server.NodeContainer.NodeGroups;
+using Content.Server.NodeContainer.Nodes;
+using Content.Shared.Examine;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Localization;
+using Robust.Shared.Serialization.Manager.Attributes;
+using Robust.Shared.Utility;
+using Robust.Shared.ViewVariables;
+using Robust.Shared.Maths;
+
+namespace Content.Server.Salvage
+{
+ ///
+ /// A salvage magnet.
+ ///
+ [RegisterComponent]
+ [ComponentProtoName("SalvageMagnet")]
+ public class SalvageMagnetComponent : Component
+ {
+ ///
+ /// Offset relative to magnet that salvage should spawn.
+ /// Keep in sync with marker sprite (if any???)
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ [DataField("offset")]
+ public Vector2 Offset = Vector2.Zero;
+ }
+}
diff --git a/Content.Server/Salvage/SalvageMapPrototype.cs b/Content.Server/Salvage/SalvageMapPrototype.cs
new file mode 100644
index 0000000000..98122fd903
--- /dev/null
+++ b/Content.Server/Salvage/SalvageMapPrototype.cs
@@ -0,0 +1,38 @@
+using System.Collections.Generic;
+using System.Linq;
+using Content.Server.Objectives.Interfaces;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.Manager.Attributes;
+using Robust.Shared.ViewVariables;
+
+namespace Content.Server.Salvage
+{
+ [Prototype("salvageMap")]
+ public class SalvageMapPrototype : IPrototype
+ {
+ [ViewVariables]
+ [DataField("id", required: true)]
+ public string ID { get; } = default!;
+
+ ///
+ /// Relative directory path to the given map, i.e. `Maps/Salvage/test.yml`
+ ///
+ [ViewVariables]
+ [DataField("mapPath", required: true)]
+ public string MapPath { get; } = default!;
+
+ ///
+ /// Size *from 0,0* in units of the map (used to determine if it fits)
+ ///
+ [ViewVariables]
+ [DataField("size", required: true)]
+ public float Size { get; } = 1.0f;
+
+ ///
+ /// Name for admin use
+ ///
+ [ViewVariables]
+ [DataField("name")]
+ public string Name { get; } = "";
+ }
+}
diff --git a/Content.Server/Salvage/SalvageSystem.cs b/Content.Server/Salvage/SalvageSystem.cs
new file mode 100644
index 0000000000..e051b45b5d
--- /dev/null
+++ b/Content.Server/Salvage/SalvageSystem.cs
@@ -0,0 +1,310 @@
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Threading;
+using Content.Server.Administration.Logs;
+using Content.Server.Chat.Managers;
+using Content.Server.GameTicking;
+using Content.Shared.Administration.Logs;
+using Content.Shared.CCVar;
+using Content.Shared.Database;
+using Content.Shared.Examine;
+using Content.Shared.GameTicking;
+using Content.Shared.Interaction;
+using Content.Shared.Hands.Components;
+using Content.Shared.Popups;
+using Robust.Server.Player;
+using Robust.Server.Maps;
+using Robust.Shared.Audio;
+using Robust.Shared.Configuration;
+using Robust.Shared.Map;
+using Robust.Shared.Log;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
+using Robust.Shared.GameObjects;
+using Robust.Shared.ViewVariables;
+using Robust.Shared.IoC;
+using Robust.Shared.Maths;
+using Robust.Shared.Localization;
+using Robust.Shared.Player;
+using Robust.Shared.Physics;
+using Robust.Shared.Timing;
+
+namespace Content.Server.Salvage
+{
+ public class SalvageSystem : EntitySystem
+ {
+ [Dependency] private readonly IChatManager _chatManager = default!;
+ [Dependency] private readonly IMapLoader _mapLoader = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
+ [Dependency] private readonly IConfigurationManager _configurationManager = default!;
+ [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
+
+ [ViewVariables]
+ public EntityUid PulledObject = EntityUid.Invalid;
+
+ [ViewVariables]
+ public SalvageSystemState State = SalvageSystemState.Inactive;
+
+ [ViewVariables]
+ public float StateTimer = 0.0f;
+
+ public const float PullInTimer = 2.0f;
+ public const float HoldTimer = 240.0f;
+ public const float LeaveTimer = 60.0f;
+ public const float AngularVelocityRangeRadians = 0.25f;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(Reset);
+ SubscribeLocalEvent(OnInteractHand);
+ SubscribeLocalEvent(OnExamined);
+ }
+
+ private void OnExamined(EntityUid uid, SalvageMagnetComponent comp, ExaminedEvent args)
+ {
+ if (!args.IsInDetailsRange)
+ return;
+
+ switch (State)
+ {
+ case SalvageSystemState.Inactive:
+ args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-inactive"));
+ break;
+ case SalvageSystemState.PullingIn:
+ args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-pulling-in"));
+ break;
+ case SalvageSystemState.Active:
+ args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-active", ("timeLeft", Math.Floor(StateTimer))));
+ break;
+ case SalvageSystemState.LettingGo:
+ args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-letting-go"));
+ break;
+ }
+ }
+
+ private void Reset(RoundRestartCleanupEvent ev)
+ {
+ PulledObject = EntityUid.Invalid;
+ State = SalvageSystemState.Inactive;
+ StateTimer = 0.0f;
+ }
+
+ private void OnInteractHand(EntityUid uid, SalvageMagnetComponent sm, InteractHandEvent args)
+ {
+ if (args.Handled)
+ return;
+ args.Handled = true;
+ _popupSystem.PopupEntity(CallSalvage(), uid, Filter.Entities(args.User.Uid));
+ }
+
+ private bool TryGetSalvagePlacementLocation(out MapCoordinates coords, out Angle angle)
+ {
+ coords = MapCoordinates.Nullspace;
+ angle = Angle.Zero;
+ foreach (var (smc, tsc) in EntityManager.EntityQuery(true))
+ {
+ coords = new EntityCoordinates(smc.OwnerUid, smc.Offset).ToMap(EntityManager);
+ var grid = tsc.GridID;
+ if (grid != GridId.Invalid)
+ {
+ // Has a valid grid - synchronize angle so that salvage doesn't have to deal with cross-grid manipulation issues
+ angle = _mapManager.GetGrid(grid).WorldRotation;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private IEnumerable GetAllSalvageMaps()
+ {
+ return _prototypeManager.EnumeratePrototypes();
+ }
+
+ // String is announced
+ private string SpawnSalvage()
+ {
+ // In case of failure
+ State = SalvageSystemState.Inactive;
+
+ if (!TryGetSalvagePlacementLocation(out var spl, out var spAngle))
+ {
+ return Loc.GetString("salvage-system-announcement-spawn-magnet-lost");
+ }
+
+ SalvageMapPrototype? map = null;
+
+ var forcedSalvage = _configurationManager.GetCVar(CCVars.SalvageForced);
+ List allSalvageMaps;
+ if (string.IsNullOrWhiteSpace(forcedSalvage))
+ {
+ allSalvageMaps = GetAllSalvageMaps().ToList();
+ }
+ else
+ {
+ allSalvageMaps = new();
+ if (_prototypeManager.TryIndex(forcedSalvage, out map))
+ {
+ allSalvageMaps.Add(map);
+ }
+ else
+ {
+ Logger.ErrorS("c.s.salvage", $"Unable to get forced salvage map prototype {forcedSalvage}");
+ }
+ }
+ for (var i = 0; i < allSalvageMaps.Count; i++)
+ {
+ map = _random.PickAndTake(allSalvageMaps);
+
+ var box2 = Box2.CenteredAround(spl.Position, new Vector2(map.Size * 2.0f, map.Size * 2.0f));
+ var box2rot = new Box2Rotated(box2, spAngle, spl.Position);
+ if (_physicsSystem.GetCollidingEntities(spl.MapId, in box2rot).Select(x => EntityManager.HasComponent(x.OwnerUid)).Count() > 0)
+ {
+ // collided: set map to null so we don't spawn it
+ map = null;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if (map == null)
+ {
+ return Loc.GetString("salvage-system-announcement-spawn-no-debris-available");
+ }
+
+ var bp = _mapLoader.LoadBlueprint(spl.MapId, map.MapPath);
+ if (bp == null)
+ {
+ return Loc.GetString("salvage-system-announcement-spawn-debris-disintegrated");
+ }
+
+ PulledObject = bp.GridEntityId;
+ EntityManager.AddComponent(PulledObject);
+
+ var pulledTransform = EntityManager.GetComponent(PulledObject);
+ pulledTransform.Coordinates = EntityCoordinates.FromMap(_mapManager, spl);
+ pulledTransform.WorldRotation = spAngle;
+
+ // Alright, salvage magnet is active.
+ State = SalvageSystemState.Active;
+ StateTimer = HoldTimer;
+ return Loc.GetString("salvage-system-announcement-arrived", ("timeLeft", StateTimer));
+ }
+
+ private void PulledObjectDeathOrCaptureMonitor()
+ {
+ // This code runs in Active and LettingGo states.
+ // It catches the situation when the pulled object is deleted by the killswitch,
+ // and the situation when the salvage component is removed by admin intervention (officially a "capture")
+ if (!EntityManager.EntityExists(PulledObject))
+ {
+ State = SalvageSystemState.Inactive;
+ PulledObject = EntityUid.Invalid;
+ _chatManager.DispatchStationAnnouncement(Loc.GetString("salvage-system-announcement-lost"), Loc.GetString("salvage-system-announcement-source"));
+ }
+ else if (!EntityManager.HasComponent(PulledObject))
+ {
+ State = SalvageSystemState.Inactive;
+ PulledObject = EntityUid.Invalid;
+ _chatManager.DispatchStationAnnouncement(Loc.GetString("salvage-system-announcement-captured"), Loc.GetString("salvage-system-announcement-source"));
+ }
+ }
+
+ public override void Update(float frameTime)
+ {
+ switch (State)
+ {
+ case SalvageSystemState.Inactive:
+ break;
+ case SalvageSystemState.PullingIn:
+ StateTimer -= frameTime;
+ if (StateTimer <= 0.0f)
+ {
+ string report = SpawnSalvage();
+ _chatManager.DispatchStationAnnouncement(report, Loc.GetString("salvage-system-announcement-source"));
+ }
+ break;
+ case SalvageSystemState.Active:
+ // magnet power usage = base + (time² * factor)
+ // write base and factor into prototype!!!
+ // also determine if magnet is unpowered and if so auto-lose???
+ // CURRENTLY:
+ StateTimer -= frameTime;
+ if (StateTimer <= 0.0f)
+ {
+ ReturnSalvage();
+ }
+ PulledObjectDeathOrCaptureMonitor();
+ break;
+ case SalvageSystemState.LettingGo:
+ PulledObjectDeathOrCaptureMonitor();
+ break;
+ }
+ foreach (var smc in EntityManager.EntityQuery(true))
+ {
+ if (smc.Killswitch)
+ {
+ smc.KillswitchTime += frameTime;
+ if (smc.KillswitchTime >= LeaveTimer)
+ {
+ EntityManager.QueueDeleteEntity(smc.OwnerUid);
+ }
+ }
+ }
+ }
+
+ public string CallSalvage()
+ {
+ // State error reports
+ if (State == SalvageSystemState.LettingGo)
+ return Loc.GetString("salvage-system-report-cooling-down");
+ if (State != SalvageSystemState.Inactive)
+ return Loc.GetString("salvage-system-report-already-active");
+ // Confirm
+ State = SalvageSystemState.PullingIn;
+ StateTimer = PullInTimer;
+ return Loc.GetString("salvage-system-report-activate-success");
+ }
+
+ public string ReturnSalvage()
+ {
+ if (State != SalvageSystemState.Active)
+ return Loc.GetString("salvage-system-report-not-active");
+ // Confirm
+ State = SalvageSystemState.LettingGo;
+ // Enable killswitch, announce, report success
+ if (EntityManager.TryGetComponent(PulledObject, out var salvage))
+ {
+ // Schedule this to auto-delete (and ideally fly away from the station???)
+ salvage.Killswitch = true;
+ // Note "losing" is only given on killswitch activation.
+ // The capture message will be given instead if the salvage component is missing.
+ _chatManager.DispatchStationAnnouncement(Loc.GetString("salvage-system-announcement-losing", ("timeLeft", LeaveTimer)), Loc.GetString("salvage-system-announcement-source"));
+ }
+ return Loc.GetString("salvage-system-report-deactivate-success");
+ }
+
+ public void DeleteSalvage()
+ {
+ if ((State != SalvageSystemState.Active) && (State != SalvageSystemState.LettingGo))
+ return;
+ EntityManager.QueueDeleteEntity(PulledObject);
+ }
+ }
+
+ public enum SalvageSystemState
+ {
+ Inactive,
+ PullingIn, // Timer: Time left to completion
+ Active, // Timer: Time left to letting go
+ LettingGo
+ }
+}
+
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index 3986dfbfd4..dd22151212 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -575,5 +575,15 @@ namespace Content.Shared.CCVar
///
public static readonly CVarDef RestrictedNames =
CVarDef.Create("ic.restricted_names", true, CVar.SERVER | CVar.REPLICATED);
+
+ /*
+ * Salvage
+ */
+
+ ///
+ /// Forced salvage map prototype name (if empty, randomly selected)
+ ///
+ public static readonly CVarDef
+ SalvageForced = CVarDef.Create("salvage.forced", "", CVar.SERVERONLY);
}
}
diff --git a/Resources/Locale/en-US/salvage/salvage-system.ftl b/Resources/Locale/en-US/salvage/salvage-system.ftl
new file mode 100644
index 0000000000..137fd492d4
--- /dev/null
+++ b/Resources/Locale/en-US/salvage/salvage-system.ftl
@@ -0,0 +1,22 @@
+salvage-system-announcement-source = Salvage Control System
+salvage-system-announcement-arrived = A piece of salvagable debris has been pulled in. Estimate: Can hold for {$timeLeft} seconds.
+salvage-system-announcement-losing = The magnet is no longer able to hold the salvagable debris. Estimate: {$timeLeft} seconds to complete loss.
+salvage-system-announcement-lost = The salvagable debris has been lost.
+salvage-system-announcement-captured = The salvagable debris has been successfully captured.
+
+salvage-system-announcement-spawn-magnet-lost = The salvage magnet has been lost.
+salvage-system-announcement-spawn-no-debris-available = No debris could be recovered by the salvage magnet.
+salvage-system-announcement-spawn-debris-disintegrated = Debris disintegrated during orbital transfer.
+
+salvage-system-report-already-active = The salvage magnet is already active.
+salvage-system-report-cooling-down = The salvage magnet is cooling down.
+salvage-system-report-activate-success = The salvage magnet is pulling in a piece of debris!
+
+salvage-system-report-not-active = No object / not stably pulled in
+salvage-system-report-deactivate-success = The salvage magnet has been deactivated.
+
+salvage-system-magnet-examined-inactive = The salvage magnet is inactive.
+salvage-system-magnet-examined-pulling-in = The salvage magnet is attempting to pull in salvage.
+salvage-system-magnet-examined-active = The salvage magnet is holding salvage in place. Can hold for {$timeLeft} seconds.
+salvage-system-magnet-examined-letting-go = The salvage magnet is cooling down.
+
diff --git a/Resources/Maps/Salvage/medium-1.yml b/Resources/Maps/Salvage/medium-1.yml
new file mode 100644
index 0000000000..bf7082ccc7
--- /dev/null
+++ b/Resources/Maps/Salvage/medium-1.yml
@@ -0,0 +1,1697 @@
+meta:
+ format: 2
+ name: DemoStation
+ author: Space-Wizards
+ postmapinit: false
+tilemap:
+ 0: space
+ 1: floor_asteroid_coarse_sand0
+ 2: floor_asteroid_coarse_sand1
+ 3: floor_asteroid_coarse_sand2
+ 4: floor_asteroid_coarse_sand_dug
+ 5: floor_asteroid_sand
+ 6: floor_asteroid_tile
+ 7: floor_blue
+ 8: floor_blue_circuit
+ 9: floor_dark
+ 10: floor_elevator_shaft
+ 11: floor_freezer
+ 12: floor_glass
+ 13: floor_gold
+ 14: floor_green_circuit
+ 15: floor_hydro
+ 16: floor_lino
+ 17: floor_mono
+ 18: floor_reinforced
+ 19: floor_rglass
+ 20: floor_rock_vault
+ 21: floor_showroom
+ 22: floor_silver
+ 23: floor_snow
+ 24: floor_steel
+ 25: floor_steel_dirty
+ 26: floor_techmaint
+ 27: floor_white
+ 28: floor_wood
+ 29: lattice
+ 30: plating
+ 31: underplating
+grids:
+- settings:
+ chunksize: 16
+ tilesize: 1
+ chunks:
+ - ind: "-1,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAeAAAAHgAAAB4AAAAeAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAYAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAYAAAAGAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAHgAAABgAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAABgAAAAYAAAAGAAAAA==
+ - ind: "0,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAHgAAAB4AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAYAAAAGAAAABgAAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAGAAAAB4AAAAYAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAABgAAAAeAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "-1,0"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAdAAAAHgAAABkAAAAYAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAGQAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAGQAAABkAAAAZAAAAHgAAAB4AAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHgAAAB4AAAAZAAAAGQAAABkAAAAZAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAeAAAAGQAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "0,0"
+ tiles: GAAAABgAAAAeAAAAHgAAAB4AAAAeAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAYAAAAHgAAAB4AAAAeAAAAHgAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAABkAAAAeAAAAHgAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAZAAAAGQAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+entities:
+- uid: 0
+ components:
+ - pos: 0.5,0.5
+ parent: null
+ type: Transform
+ - index: 0
+ type: MapGrid
+ - angularDamping: 0.3
+ fixedRotation: False
+ bodyType: Dynamic
+ type: Physics
+ - fixtures:
+ - shape: !type:PolygonShape
+ vertices:
+ - -1,-8
+ - -1,-7
+ - -6,-7
+ - -6,-8
+ id: grid_chunk--6--8
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 20
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-7
+ - 0,-6
+ - -6,-6
+ - -6,-7
+ id: grid_chunk--6--7
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-6
+ - 0,-5
+ - -5,-5
+ - -5,-6
+ id: grid_chunk--5--6
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 20
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-5
+ - 0,-3
+ - -4,-3
+ - -4,-5
+ id: grid_chunk--4--5
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-3
+ - 0,-2
+ - -5,-2
+ - -5,-3
+ id: grid_chunk--5--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 20
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-2
+ - 0,-1
+ - -6,-1
+ - -6,-2
+ id: grid_chunk--6--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-1
+ - 0,0
+ - -4,0
+ - -4,-1
+ id: grid_chunk--4--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 5,-8
+ - 5,-7
+ - 0,-7
+ - 0,-8
+ id: grid_chunk-0--8
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 20
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,-7
+ - 1,-6
+ - 0,-6
+ - 0,-7
+ id: grid_chunk-0--7
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 5,-7
+ - 5,-6
+ - 4,-6
+ - 4,-7
+ id: grid_chunk-4--7
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 6,-6
+ - 6,-5
+ - 3,-5
+ - 3,-6
+ id: grid_chunk-3--6
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,-5
+ - 7,-4
+ - 1,-4
+ - 1,-5
+ id: grid_chunk-1--5
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 6,-4
+ - 6,0
+ - 0,0
+ - 0,-4
+ id: grid_chunk-0--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 96
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,0
+ - 0,1
+ - -6,1
+ - -6,0
+ id: grid_chunk--6-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,1
+ - 0,2
+ - -8,2
+ - -8,1
+ id: grid_chunk--8-1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,2
+ - 0,3
+ - -7,3
+ - -7,2
+ id: grid_chunk--7-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 28
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,3
+ - 0,4
+ - -8,4
+ - -8,3
+ id: grid_chunk--8-3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,4
+ - 0,5
+ - -6,5
+ - -6,4
+ id: grid_chunk--6-4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,5
+ - 0,6
+ - -4,6
+ - -4,5
+ id: grid_chunk--4-5
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,6
+ - 0,7
+ - -1,7
+ - -1,6
+ id: grid_chunk--1-6
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,0
+ - 7,2
+ - 0,2
+ - 0,0
+ id: grid_chunk-0-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 56
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,2
+ - 3,3
+ - 0,3
+ - 0,2
+ id: grid_chunk-0-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 5,3
+ - 5,4
+ - 0,4
+ - 0,3
+ id: grid_chunk-0-3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 20
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 6,4
+ - 6,5
+ - 0,5
+ - 0,4
+ id: grid_chunk-0-4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,5
+ - 7,6
+ - 0,6
+ - 0,5
+ id: grid_chunk-0-5
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 28
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,6
+ - 1,7
+ - 0,7
+ - 0,6
+ id: grid_chunk-0-6
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 5,6
+ - 5,7
+ - 4,7
+ - 4,6
+ id: grid_chunk-4-6
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ type: Fixtures
+ - gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ type: Gravity
+ - tiles:
+ -8,-8: 0
+ -8,-7: 0
+ -8,-6: 0
+ -8,-5: 0
+ -8,-4: 0
+ -8,-3: 0
+ -8,-2: 0
+ -8,-1: 0
+ -7,-8: 0
+ -7,-1: 0
+ -6,-8: 0
+ -6,-1: 0
+ -5,-8: 0
+ -5,-1: 0
+ -4,-8: 0
+ -4,-4: 0
+ -4,-3: 0
+ -4,-2: 0
+ -4,-1: 0
+ -3,-8: 0
+ -3,-4: 0
+ -3,-1: 0
+ -2,-8: 0
+ -2,-4: 0
+ -2,-2: 0
+ -2,-1: 0
+ -1,-8: 0
+ -1,-7: 0
+ -1,-6: 0
+ -1,-5: 0
+ -1,-4: 0
+ -1,-3: 0
+ -1,-2: 0
+ -1,-1: 0
+ 0,-8: 0
+ 0,-4: 0
+ 0,-2: 0
+ 0,-1: 0
+ 1,-8: 0
+ 1,-4: 0
+ 1,-1: 0
+ 2,-8: 0
+ 2,-4: 0
+ 2,-3: 0
+ 2,-2: 0
+ 2,-1: 0
+ 3,-8: 0
+ 3,-1: 0
+ 4,-8: 0
+ 4,-1: 0
+ 5,-8: 0
+ 5,-1: 0
+ 6,-8: 0
+ 6,-7: 0
+ 6,-6: 0
+ 6,-5: 0
+ 6,-4: 0
+ 6,-3: 0
+ 6,-2: 0
+ 6,-1: 0
+ -8,0: 0
+ -8,1: 0
+ -8,2: 0
+ -8,3: 0
+ -8,4: 0
+ -8,5: 0
+ -8,6: 0
+ -7,6: 0
+ -6,6: 0
+ -5,6: 0
+ -4,0: 0
+ -4,1: 0
+ -4,2: 1
+ -4,6: 0
+ -3,2: 0
+ -3,6: 0
+ -2,0: 0
+ -2,2: 0
+ -2,6: 0
+ -1,0: 0
+ -1,1: 0
+ -1,2: 0
+ -1,3: 1
+ -1,4: 1
+ -1,5: 0
+ -1,6: 0
+ 0,0: 0
+ 0,2: 0
+ 0,6: 0
+ 1,2: 0
+ 1,6: 0
+ 2,0: 0
+ 2,1: 0
+ 2,2: 0
+ 2,6: 0
+ 3,6: 0
+ 4,6: 0
+ 5,6: 0
+ 6,0: 0
+ 6,1: 0
+ 6,2: 0
+ 6,3: 0
+ 6,4: 0
+ 6,5: 0
+ 6,6: 0
+ -6,-7: 0
+ -6,-2: 0
+ -5,-7: 0
+ -5,-6: 0
+ -5,-3: 0
+ -5,-2: 0
+ -4,-7: 0
+ -4,-6: 0
+ -4,-5: 0
+ -3,-7: 0
+ -3,-6: 0
+ -3,-5: 0
+ -3,-3: 0
+ -3,-2: 0
+ -2,-7: 0
+ -2,-6: 0
+ -2,-5: 0
+ -2,-3: 0
+ 0,-7: 0
+ 0,-3: 0
+ 1,-5: 0
+ 1,-3: 0
+ 1,-2: 0
+ 2,-5: 0
+ 3,-6: 0
+ 3,-5: 0
+ 3,-4: 0
+ 3,-3: 0
+ 3,-2: 0
+ 4,-7: 0
+ 4,-6: 0
+ 4,-5: 0
+ 4,-4: 0
+ 4,-3: 0
+ 4,-2: 0
+ 5,-6: 0
+ 5,-5: 0
+ 5,-4: 0
+ 5,-3: 0
+ 5,-2: 0
+ -7,1: 0
+ -7,2: 0
+ -7,3: 0
+ -6,0: 0
+ -6,1: 0
+ -6,2: 1
+ -6,3: 0
+ -6,4: 0
+ -5,0: 0
+ -5,1: 0
+ -5,2: 1
+ -5,3: 1
+ -5,4: 0
+ -4,3: 1
+ -4,4: 0
+ -4,5: 0
+ -3,0: 0
+ -3,1: 0
+ -3,3: 1
+ -3,4: 0
+ -3,5: 0
+ -2,1: 0
+ -2,3: 1
+ -2,4: 1
+ -2,5: 0
+ 0,1: 0
+ 0,3: 1
+ 0,4: 1
+ 0,5: 0
+ 1,0: 0
+ 1,1: 0
+ 1,3: 1
+ 1,4: 1
+ 1,5: 0
+ 2,3: 0
+ 2,4: 1
+ 2,5: 0
+ 3,0: 0
+ 3,1: 0
+ 3,3: 0
+ 3,4: 0
+ 3,5: 0
+ 4,0: 0
+ 4,1: 0
+ 4,3: 0
+ 4,4: 0
+ 4,5: 0
+ 5,0: 0
+ 5,1: 0
+ 5,4: 0
+ 5,5: 0
+ uniqueMixes:
+ - volume: 2500
+ temperature: 293.15
+ moles:
+ - 21.824879
+ - 82.10312
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - volume: 2500
+ temperature: 5000
+ moles:
+ - 6666.982
+ - 0
+ - 0
+ - 6666.982
+ - 0
+ - 0
+ - 0
+ - 0
+ type: GridAtmosphere
+- uid: 1
+ type: WallSolid
+ components:
+ - pos: -4.5,-5.5
+ parent: 0
+ type: Transform
+- uid: 2
+ type: WallSolid
+ components:
+ - pos: -4.5,-6.5
+ parent: 0
+ type: Transform
+- uid: 3
+ type: WallSolid
+ components:
+ - pos: -3.5,-6.5
+ parent: 0
+ type: Transform
+- uid: 4
+ type: WallSolid
+ components:
+ - pos: -2.5,-6.5
+ parent: 0
+ type: Transform
+- uid: 5
+ type: WallSolid
+ components:
+ - pos: -1.5,-6.5
+ parent: 0
+ type: Transform
+- uid: 6
+ type: WallSolid
+ components:
+ - pos: -4.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 7
+ type: Girder
+ components:
+ - pos: -4.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 8
+ type: WallSolid
+ components:
+ - pos: -0.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 9
+ type: WallSolid
+ components:
+ - pos: -0.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 10
+ type: WallSolid
+ components:
+ - pos: -0.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 11
+ type: WallSolid
+ components:
+ - pos: -0.5,-4.5
+ parent: 0
+ type: Transform
+- uid: 12
+ type: WallSolid
+ components:
+ - pos: -3.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 13
+ type: WallSolid
+ components:
+ - pos: -2.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 14
+ type: WallSolid
+ components:
+ - pos: -3.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 15
+ type: WallSolid
+ components:
+ - pos: -3.5,0.5
+ parent: 0
+ type: Transform
+- uid: 16
+ type: WallSolid
+ components:
+ - pos: -3.5,1.5
+ parent: 0
+ type: Transform
+- uid: 17
+ type: WallSolid
+ components:
+ - pos: -2.5,1.5
+ parent: 0
+ type: Transform
+- uid: 18
+ type: WallSolid
+ components:
+ - pos: -2.5,2.5
+ parent: 0
+ type: Transform
+- uid: 19
+ type: WallSolid
+ components:
+ - pos: -1.5,2.5
+ parent: 0
+ type: Transform
+- uid: 20
+ type: Girder
+ components:
+ - pos: -0.5,-5.5
+ parent: 0
+ type: Transform
+- uid: 21
+ type: WallSolid
+ components:
+ - pos: 0.5,2.5
+ parent: 0
+ type: Transform
+- uid: 22
+ type: WallSolid
+ components:
+ - pos: 1.5,2.5
+ parent: 0
+ type: Transform
+- uid: 23
+ type: WallSolid
+ components:
+ - pos: 2.5,2.5
+ parent: 0
+ type: Transform
+- uid: 24
+ type: WallSolid
+ components:
+ - pos: 2.5,1.5
+ parent: 0
+ type: Transform
+- uid: 25
+ type: WallSolid
+ components:
+ - pos: 2.5,0.5
+ parent: 0
+ type: Transform
+- uid: 26
+ type: WallSolid
+ components:
+ - pos: 2.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 27
+ type: WallSolid
+ components:
+ - pos: 2.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 28
+ type: WallSolid
+ components:
+ - pos: 0.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 29
+ type: WallSolid
+ components:
+ - pos: 0.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 30
+ type: WallSolid
+ components:
+ - pos: 1.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 31
+ type: WallSolid
+ components:
+ - pos: 2.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 32
+ type: WallSolid
+ components:
+ - pos: 3.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 33
+ type: WallSolid
+ components:
+ - pos: 4.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 34
+ type: WallSolid
+ components:
+ - pos: 4.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 35
+ type: WallSolid
+ components:
+ - pos: 4.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 36
+ type: WallSolid
+ components:
+ - pos: 4.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 37
+ type: WallSolid
+ components:
+ - pos: 4.5,0.5
+ parent: 0
+ type: Transform
+- uid: 38
+ type: Girder
+ components:
+ - pos: 4.5,1.5
+ parent: 0
+ type: Transform
+- uid: 39
+ type: AirlockGlass
+ components:
+ - pos: 3.5,0.5
+ parent: 0
+ type: Transform
+ - containers:
+ board: !type:Container
+ ents: []
+ type: ContainerContainer
+- uid: 40
+ type: AirlockGlass
+ components:
+ - pos: 1.5,-1.5
+ parent: 0
+ type: Transform
+ - containers:
+ board: !type:Container
+ ents: []
+ type: ContainerContainer
+- uid: 41
+ type: AirlockGlass
+ components:
+ - pos: -1.5,-1.5
+ parent: 0
+ type: Transform
+ - containers:
+ board: !type:Container
+ ents: []
+ type: ContainerContainer
+- uid: 42
+ type: WallSolid
+ components:
+ - pos: -2.5,4.5
+ parent: 0
+ type: Transform
+- uid: 43
+ type: WallSolid
+ components:
+ - pos: -2.5,5.5
+ parent: 0
+ type: Transform
+- uid: 44
+ type: WallSolid
+ components:
+ - pos: -1.5,5.5
+ parent: 0
+ type: Transform
+- uid: 45
+ type: WallSolid
+ components:
+ - pos: -0.5,5.5
+ parent: 0
+ type: Transform
+- uid: 46
+ type: WallSolid
+ components:
+ - pos: 0.5,5.5
+ parent: 0
+ type: Transform
+- uid: 47
+ type: WallSolid
+ components:
+ - pos: 1.5,5.5
+ parent: 0
+ type: Transform
+- uid: 48
+ type: WallSolid
+ components:
+ - pos: 2.5,5.5
+ parent: 0
+ type: Transform
+- uid: 49
+ type: WallSolid
+ components:
+ - pos: 3.5,5.5
+ parent: 0
+ type: Transform
+- uid: 50
+ type: WallSolid
+ components:
+ - pos: 3.5,4.5
+ parent: 0
+ type: Transform
+- uid: 51
+ type: WallSolid
+ components:
+ - pos: 2.5,3.5
+ parent: 0
+ type: Transform
+- uid: 52
+ type: WallSolid
+ components:
+ - pos: 3.5,3.5
+ parent: 0
+ type: Transform
+- uid: 53
+ type: WallSolid
+ components:
+ - pos: -4.5,1.5
+ parent: 0
+ type: Transform
+- uid: 54
+ type: WallSolid
+ components:
+ - pos: -5.5,1.5
+ parent: 0
+ type: Transform
+- uid: 55
+ type: WallSolid
+ components:
+ - pos: -6.5,1.5
+ parent: 0
+ type: Transform
+- uid: 56
+ type: WallSolid
+ components:
+ - pos: -6.5,2.5
+ parent: 0
+ type: Transform
+- uid: 57
+ type: WallSolid
+ components:
+ - pos: -6.5,3.5
+ parent: 0
+ type: Transform
+- uid: 58
+ type: WallSolid
+ components:
+ - pos: -4.5,4.5
+ parent: 0
+ type: Transform
+- uid: 59
+ type: WallSolid
+ components:
+ - pos: -3.5,4.5
+ parent: 0
+ type: Transform
+- uid: 60
+ type: WallSolid
+ components:
+ - pos: -5.5,3.5
+ parent: 0
+ type: Transform
+- uid: 61
+ type: WallSolid
+ components:
+ - pos: -5.5,4.5
+ parent: 0
+ type: Transform
+- uid: 62
+ type: SalvageCanisterSpawner
+ components:
+ - pos: -5.5,2.5
+ parent: 0
+ type: Transform
+- uid: 63
+ type: SalvageCanisterSpawner
+ components:
+ - pos: -4.5,2.5
+ parent: 0
+ type: Transform
+- uid: 64
+ type: StorageCanister
+ components:
+ - pos: -1.5,4.5
+ parent: 0
+ type: Transform
+- uid: 65
+ type: AirlockEngineering
+ components:
+ - pos: -0.5,2.5
+ parent: 0
+ type: Transform
+ - containers:
+ board: !type:Container
+ ents: []
+ type: ContainerContainer
+- uid: 66
+ type: Girder
+ components:
+ - pos: 3.5,-4.5
+ parent: 0
+ type: Transform
+- uid: 67
+ type: Girder
+ components:
+ - pos: 3.5,-5.5
+ parent: 0
+ type: Transform
+- uid: 68
+ type: Girder
+ components:
+ - pos: 5.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 69
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: 2.5,4.5
+ parent: 0
+ type: Transform
+- uid: 70
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: 1.5,4.5
+ parent: 0
+ type: Transform
+- uid: 71
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: 0.5,3.5
+ parent: 0
+ type: Transform
+- uid: 72
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: 1.5,3.5
+ parent: 0
+ type: Transform
+- uid: 73
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: 0.5,4.5
+ parent: 0
+ type: Transform
+- uid: 74
+ type: SalvageMobSpawner
+ components:
+ - pos: 3.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 75
+ type: SalvageMobSpawner
+ components:
+ - pos: 1.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 76
+ type: SalvageMobSpawner
+ components:
+ - pos: 3.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 77
+ type: SalvageMobSpawner
+ components:
+ - pos: -3.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 78
+ type: SalvageMobSpawner
+ components:
+ - pos: -3.5,-5.5
+ parent: 0
+ type: Transform
+- uid: 79
+ type: SalvageMobSpawner
+ components:
+ - pos: -1.5,-5.5
+ parent: 0
+ type: Transform
+- uid: 80
+ type: SalvageMobSpawner
+ components:
+ - pos: -1.5,1.5
+ parent: 0
+ type: Transform
+- uid: 81
+ type: SalvageMobSpawner
+ components:
+ - pos: 1.5,1.5
+ parent: 0
+ type: Transform
+- uid: 82
+ type: SalvageMobSpawner
+ components:
+ - pos: -2.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 83
+ type: Table
+ components:
+ - pos: -0.5,0.5
+ parent: 0
+ type: Transform
+- uid: 84
+ type: Table
+ components:
+ - pos: 0.5,0.5
+ parent: 0
+ type: Transform
+- uid: 85
+ type: PaperWrittenSalvageLoreMedium1PlasmaTrap
+ components:
+ - pos: 0.48327154,0.5698495
+ parent: 0
+ type: Transform
+- uid: 86
+ type: SalvageCanisterSpawner
+ components:
+ - pos: -3.5,3.5
+ parent: 0
+ type: Transform
+- uid: 87
+ type: SalvageCanisterSpawner
+ components:
+ - pos: -3.5,2.5
+ parent: 0
+ type: Transform
+- uid: 88
+ type: SalvageCanisterSpawner
+ components:
+ - pos: -4.5,3.5
+ parent: 0
+ type: Transform
+- uid: 89
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -1.5,3.5
+ parent: 0
+ type: Transform
+- uid: 90
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -1.5,4.5
+ parent: 0
+ type: Transform
+- uid: 91
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -0.5,4.5
+ parent: 0
+ type: Transform
+- uid: 92
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -3.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 93
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -3.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 94
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -0.5,3.5
+ parent: 0
+ type: Transform
+- uid: 95
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: 0.5,4.5
+ parent: 0
+ type: Transform
+- uid: 96
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: 0.5,3.5
+ parent: 0
+ type: Transform
+- uid: 97
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: 1.5,4.5
+ parent: 0
+ type: Transform
+- uid: 98
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: 1.5,3.5
+ parent: 0
+ type: Transform
+- uid: 99
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: 2.5,4.5
+ parent: 0
+ type: Transform
+- uid: 100
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -2.5,3.5
+ parent: 0
+ type: Transform
+- uid: 101
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -3.5,3.5
+ parent: 0
+ type: Transform
+- uid: 102
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -4.5,3.5
+ parent: 0
+ type: Transform
+- uid: 103
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -3.5,2.5
+ parent: 0
+ type: Transform
+- uid: 104
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -4.5,2.5
+ parent: 0
+ type: Transform
+- uid: 105
+ type: AtmosFixInstantPlasmaFireMarker
+ components:
+ - pos: -5.5,2.5
+ parent: 0
+ type: Transform
+- uid: 106
+ type: SalternSubstation
+ components:
+ - pos: 0.5,-2.5
+ parent: 0
+ type: Transform
+ - startingCharge: 3990010
+ type: Battery
+ - supplyRampPosition: 2.3437593
+ type: PowerNetworkBattery
+- uid: 107
+ type: CableMV
+ components:
+ - pos: 0.5,-2.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 108
+ type: CableMV
+ components:
+ - pos: 1.5,-2.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 109
+ type: CableMV
+ components:
+ - pos: 1.5,-1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 110
+ type: CableMV
+ components:
+ - pos: 1.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 111
+ type: CableMV
+ components:
+ - pos: 1.5,0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 112
+ type: CableMV
+ components:
+ - pos: 1.5,1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 113
+ type: CableMV
+ components:
+ - pos: 1.5,2.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 114
+ type: SalternApc
+ components:
+ - pos: 1.5,2.5
+ parent: 0
+ type: Transform
+ - startingCharge: 12000
+ type: Battery
+- uid: 115
+ type: CableApcExtension
+ components:
+ - pos: 1.5,2.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 116
+ type: CableApcExtension
+ components:
+ - pos: 1.5,1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 117
+ type: CableApcExtension
+ components:
+ - pos: 1.5,0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 118
+ type: CableApcExtension
+ components:
+ - pos: 1.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 119
+ type: CableApcExtension
+ components:
+ - pos: 0.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 120
+ type: CableApcExtension
+ components:
+ - pos: -0.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 121
+ type: CableApcExtension
+ components:
+ - pos: -1.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 122
+ type: CableApcExtension
+ components:
+ - pos: -2.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 123
+ type: CableApcExtension
+ components:
+ - pos: -1.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 124
+ type: CableApcExtension
+ components:
+ - pos: -1.5,-1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 125
+ type: CableApcExtension
+ components:
+ - pos: -1.5,-2.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 126
+ type: CableApcExtension
+ components:
+ - pos: -1.5,-3.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 127
+ type: CableApcExtension
+ components:
+ - pos: -1.5,-4.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 128
+ type: CableApcExtension
+ components:
+ - pos: -2.5,-4.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 129
+ type: CableApcExtension
+ components:
+ - pos: -0.5,0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 130
+ type: CableApcExtension
+ components:
+ - pos: -0.5,1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 131
+ type: CableApcExtension
+ components:
+ - pos: 1.5,3.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 132
+ type: CableApcExtension
+ components:
+ - pos: 1.5,4.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 133
+ type: CableApcExtension
+ components:
+ - pos: 0.5,4.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 134
+ type: CableApcExtension
+ components:
+ - pos: -0.5,4.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 135
+ type: CableApcExtension
+ components:
+ - pos: -1.5,4.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 136
+ type: Poweredlight
+ components:
+ - pos: -0.5,4.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 137
+ type: Poweredlight
+ components:
+ - rot: -1.5707963267948966 rad
+ pos: 1.5,0.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 138
+ type: Poweredlight
+ components:
+ - rot: -1.5707963267948966 rad
+ pos: -1.5,-3.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 139
+ type: Poweredlight
+ components:
+ - rot: 1.5707963267948966 rad
+ pos: -2.5,0.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 140
+ type: Poweredlight
+ components:
+ - pos: 2.5,-2.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 141
+ type: Poweredlight
+ components:
+ - rot: 1.5707963267948966 rad
+ pos: 3.5,-1.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 142
+ type: CableApcExtension
+ components:
+ - pos: 1.5,-1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 143
+ type: CableApcExtension
+ components:
+ - pos: 1.5,-2.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 144
+ type: CableApcExtension
+ components:
+ - pos: 2.5,-2.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 145
+ type: CableApcExtension
+ components:
+ - pos: 3.5,-2.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 146
+ type: CableApcExtension
+ components:
+ - pos: 3.5,-1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+...
diff --git a/Resources/Maps/Salvage/medium-template.yml b/Resources/Maps/Salvage/medium-template.yml
new file mode 100644
index 0000000000..d1eca2d68f
--- /dev/null
+++ b/Resources/Maps/Salvage/medium-template.yml
@@ -0,0 +1,407 @@
+meta:
+ format: 2
+ name: DemoStation
+ author: Space-Wizards
+ postmapinit: false
+tilemap:
+ 0: space
+ 1: floor_asteroid_coarse_sand0
+ 2: floor_asteroid_coarse_sand1
+ 3: floor_asteroid_coarse_sand2
+ 4: floor_asteroid_coarse_sand_dug
+ 5: floor_asteroid_sand
+ 6: floor_asteroid_tile
+ 7: floor_blue
+ 8: floor_blue_circuit
+ 9: floor_dark
+ 10: floor_elevator_shaft
+ 11: floor_freezer
+ 12: floor_glass
+ 13: floor_gold
+ 14: floor_green_circuit
+ 15: floor_hydro
+ 16: floor_lino
+ 17: floor_mono
+ 18: floor_reinforced
+ 19: floor_rglass
+ 20: floor_rock_vault
+ 21: floor_showroom
+ 22: floor_silver
+ 23: floor_snow
+ 24: floor_steel
+ 25: floor_steel_dirty
+ 26: floor_techmaint
+ 27: floor_white
+ 28: floor_wood
+ 29: lattice
+ 30: plating
+ 31: underplating
+grids:
+- settings:
+ chunksize: 16
+ tilesize: 1
+ chunks:
+ - ind: "-1,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAADQAAAA==
+ - ind: "0,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "-1,0"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "0,0"
+ tiles: HQAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+entities:
+- uid: 0
+ components:
+ - pos: 0.5,0.5
+ parent: null
+ type: Transform
+ - index: 0
+ type: MapGrid
+ - angularDamping: 0.3
+ fixedRotation: False
+ bodyType: Dynamic
+ type: Physics
+ - fixtures:
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-2
+ - 0,-1
+ - -2,-1
+ - -2,-2
+ id: grid_chunk--2--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -3,-3
+ - -3,-1
+ - -4,-1
+ - -4,-3
+ id: grid_chunk--4--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -7,-7
+ - -7,-1
+ - -8,-1
+ - -8,-7
+ id: grid_chunk--8--7
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-3
+ - 0,-2
+ - -1,-2
+ - -1,-3
+ id: grid_chunk--1--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-4
+ - 0,-3
+ - -4,-3
+ - -4,-4
+ id: grid_chunk--4--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,-7
+ - 7,-1
+ - 6,-1
+ - 6,-7
+ id: grid_chunk-6--7
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-3
+ - 3,-1
+ - 2,-1
+ - 2,-3
+ id: grid_chunk-2--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,-2
+ - 1,-1
+ - 0,-1
+ - 0,-2
+ id: grid_chunk-0--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-4
+ - 3,-3
+ - 0,-3
+ - 0,-4
+ id: grid_chunk-0--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,3
+ - 0,6
+ - -1,6
+ - -1,3
+ id: grid_chunk--1-3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -7,0
+ - -7,6
+ - -8,6
+ - -8,0
+ id: grid_chunk--8-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,2
+ - 0,3
+ - -4,3
+ - -4,2
+ id: grid_chunk--4-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,1
+ - 0,2
+ - -1,2
+ - -1,1
+ id: grid_chunk--1-1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,0
+ - 7,6
+ - 6,6
+ - 6,0
+ id: grid_chunk-6-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,2
+ - 3,3
+ - 0,3
+ - 0,2
+ id: grid_chunk-0-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,0
+ - 3,2
+ - 2,2
+ - 2,0
+ id: grid_chunk-2-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,6
+ - 0,7
+ - -8,7
+ - -8,6
+ id: grid_chunk--8-6
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-1
+ - 0,0
+ - -8,0
+ - -8,-1
+ id: grid_chunk--8--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-7
+ - 0,-4
+ - -1,-4
+ - -1,-7
+ id: grid_chunk--1--7
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-8
+ - 0,-7
+ - -8,-7
+ - -8,-8
+ id: grid_chunk--8--8
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,-1
+ - 7,0
+ - 0,0
+ - 0,-1
+ id: grid_chunk-0--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 28
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,-8
+ - 7,-7
+ - 0,-7
+ - 0,-8
+ id: grid_chunk-0--8
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 28
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 7,6
+ - 7,7
+ - 0,7
+ - 0,6
+ id: grid_chunk-0-6
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 28
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -3,0
+ - -3,2
+ - -4,2
+ - -4,0
+ id: grid_chunk--4-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,0
+ - 0,1
+ - -2,1
+ - -2,0
+ id: grid_chunk--2-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,0
+ - 1,1
+ - 0,1
+ - 0,0
+ id: grid_chunk-0-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ type: Fixtures
+ - gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ type: Gravity
+...
diff --git a/Resources/Maps/Salvage/small-1.yml b/Resources/Maps/Salvage/small-1.yml
new file mode 100644
index 0000000000..f295fa82ec
--- /dev/null
+++ b/Resources/Maps/Salvage/small-1.yml
@@ -0,0 +1,318 @@
+meta:
+ format: 2
+ name: DemoStation
+ author: Space-Wizards
+ postmapinit: false
+tilemap:
+ 0: space
+ 1: floor_asteroid_coarse_sand0
+ 2: floor_asteroid_coarse_sand1
+ 3: floor_asteroid_coarse_sand2
+ 4: floor_asteroid_coarse_sand_dug
+ 5: floor_asteroid_sand
+ 6: floor_asteroid_tile
+ 7: floor_blue
+ 8: floor_blue_circuit
+ 9: floor_dark
+ 10: floor_elevator_shaft
+ 11: floor_freezer
+ 12: floor_glass
+ 13: floor_gold
+ 14: floor_green_circuit
+ 15: floor_hydro
+ 16: floor_lino
+ 17: floor_mono
+ 18: floor_reinforced
+ 19: floor_rglass
+ 20: floor_rock_vault
+ 21: floor_showroom
+ 22: floor_silver
+ 23: floor_snow
+ 24: floor_steel
+ 25: floor_steel_dirty
+ 26: floor_techmaint
+ 27: floor_white
+ 28: floor_wood
+ 29: lattice
+ 30: plating
+ 31: underplating
+grids:
+- settings:
+ chunksize: 16
+ tilesize: 1
+ chunks:
+ - ind: "-1,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAA==
+ - ind: "0,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "0,0"
+ tiles: HgAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "-1,0"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+entities:
+- uid: 0
+ components:
+ - pos: 0.5, 0.5
+ parent: null
+ type: Transform
+ - index: 0
+ type: MapGrid
+ - angularDamping: 0.3
+ fixedRotation: False
+ bodyType: Dynamic
+ type: Physics
+ - fixtures:
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-2
+ - 0,-1
+ - -3,-1
+ - -3,-2
+ id: grid_chunk--3--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,-3
+ - 1,-2
+ - 0,-2
+ - 0,-3
+ id: grid_chunk-0--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,1
+ - 1,3
+ - 0,3
+ - 0,1
+ id: grid_chunk-0-1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,0
+ - 0,1
+ - -3,1
+ - -3,0
+ id: grid_chunk--3-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -1,-4
+ - -1,-2
+ - -2,-2
+ - -2,-4
+ id: grid_chunk--2--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,0
+ - 3,1
+ - 0,1
+ - 0,0
+ id: grid_chunk-0-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,1
+ - 0,2
+ - -2,2
+ - -2,1
+ id: grid_chunk--2-1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-1
+ - 0,0
+ - -2,0
+ - -2,-1
+ id: grid_chunk--2--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 2,-2
+ - 2,-1
+ - 0,-1
+ - 0,-2
+ id: grid_chunk-0--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,-1
+ - 1,0
+ - 0,0
+ - 0,-1
+ id: grid_chunk-0--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ type: Fixtures
+ - gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ type: Gravity
+- uid: 1
+ type: WallSolid
+ components:
+ - pos: -1.5,1.5
+ parent: 0
+ type: Transform
+- uid: 2
+ type: WallSolid
+ components:
+ - pos: 0.5,1.5
+ parent: 0
+ type: Transform
+- uid: 3
+ type: Girder
+ components:
+ - pos: 1.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 4
+ type: AirlockEngineeringLocked
+ components:
+ - pos: -0.5,1.5
+ parent: 0
+ type: Transform
+ - containers:
+ board: !type:Container
+ ents: []
+ type: ContainerContainer
+- uid: 5
+ type: Girder
+ components:
+ - pos: -2.5,0.5
+ parent: 0
+ type: Transform
+- uid: 6
+ type: Girder
+ components:
+ - pos: -1.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 7
+ type: SalvageCanisterSpawner
+ components:
+ - pos: -1.5,0.5
+ parent: 0
+ type: Transform
+- uid: 8
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -1.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 9
+ type: SalvageMobSpawner
+ components:
+ - pos: -1.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 10
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -0.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 11
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -0.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 12
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -0.5,0.5
+ parent: 0
+ type: Transform
+- uid: 13
+ type: SalvageMobSpawner
+ components:
+ - pos: 0.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 14
+ type: PoweredSmallLight
+ components:
+ - pos: 0.5,0.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - enabled: False
+ type: AmbientSound
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 15
+ type: CableApcExtension
+ components:
+ - pos: -0.5,1.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 16
+ type: CableApcExtension
+ components:
+ - pos: -0.5,0.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 17
+ type: CableApcExtension
+ components:
+ - pos: 0.5,0.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+...
diff --git a/Resources/Maps/Salvage/small-2.yml b/Resources/Maps/Salvage/small-2.yml
new file mode 100644
index 0000000000..c10dafd712
--- /dev/null
+++ b/Resources/Maps/Salvage/small-2.yml
@@ -0,0 +1,621 @@
+meta:
+ format: 2
+ name: DemoStation
+ author: Space-Wizards
+ postmapinit: false
+tilemap:
+ 0: space
+ 1: floor_asteroid_coarse_sand0
+ 2: floor_asteroid_coarse_sand1
+ 3: floor_asteroid_coarse_sand2
+ 4: floor_asteroid_coarse_sand_dug
+ 5: floor_asteroid_sand
+ 6: floor_asteroid_tile
+ 7: floor_blue
+ 8: floor_blue_circuit
+ 9: floor_dark
+ 10: floor_elevator_shaft
+ 11: floor_freezer
+ 12: floor_glass
+ 13: floor_gold
+ 14: floor_green_circuit
+ 15: floor_hydro
+ 16: floor_lino
+ 17: floor_mono
+ 18: floor_reinforced
+ 19: floor_rglass
+ 20: floor_rock_vault
+ 21: floor_showroom
+ 22: floor_silver
+ 23: floor_snow
+ 24: floor_steel
+ 25: floor_steel_dirty
+ 26: floor_techmaint
+ 27: floor_white
+ 28: floor_wood
+ 29: lattice
+ 30: plating
+ 31: underplating
+grids:
+- settings:
+ chunksize: 16
+ tilesize: 1
+ chunks:
+ - ind: "-1,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAcAAAAHAAAAA==
+ - ind: "0,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAHAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "-1,0"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAeAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "0,0"
+ tiles: HAAAAB4AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+entities:
+- uid: 0
+ components:
+ - pos: 0.5,0.5
+ parent: null
+ type: Transform
+ - index: 0
+ type: MapGrid
+ - angularDamping: 0.3
+ fixedRotation: False
+ bodyType: Dynamic
+ type: Physics
+ - fixtures:
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-3
+ - 0,-1
+ - -3,-1
+ - -3,-3
+ id: grid_chunk--3--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-1
+ - 0,0
+ - -4,0
+ - -4,-1
+ id: grid_chunk--4--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-4
+ - 3,-3
+ - 2,-3
+ - 2,-4
+ id: grid_chunk-2--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-3
+ - 3,0
+ - 0,0
+ - 0,-3
+ id: grid_chunk-0--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 36
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,0
+ - 0,2
+ - -4,2
+ - -4,0
+ id: grid_chunk--4-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -1,2
+ - -1,3
+ - -4,3
+ - -4,2
+ id: grid_chunk--4-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,0
+ - 3,2
+ - 0,2
+ - 0,0
+ id: grid_chunk-0-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,2
+ - 1,3
+ - 0,3
+ - 0,2
+ id: grid_chunk-0-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -3,-3
+ - -3,-1
+ - -4,-1
+ - -4,-3
+ id: grid_chunk--4--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,-2
+ - 1,-1
+ - 0,-1
+ - 0,-2
+ id: grid_chunk-0--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-3
+ - 0,-2
+ - -1,-2
+ - -1,-3
+ id: grid_chunk--1--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,0
+ - 3,2
+ - 2,2
+ - 2,0
+ id: grid_chunk-2-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-2
+ - 0,-1
+ - -2,-1
+ - -2,-2
+ id: grid_chunk--2--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-4
+ - 0,-3
+ - -4,-3
+ - -4,-4
+ id: grid_chunk--4--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,1
+ - 0,2
+ - -1,2
+ - -1,1
+ id: grid_chunk--1-1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-3
+ - 3,-1
+ - 2,-1
+ - 2,-3
+ id: grid_chunk-2--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-1
+ - 3,0
+ - 0,0
+ - 0,-1
+ id: grid_chunk-0--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-4
+ - 3,-3
+ - 0,-3
+ - 0,-4
+ id: grid_chunk-0--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,0
+ - 0,1
+ - -2,1
+ - -2,0
+ id: grid_chunk--2-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ type: Fixtures
+ - gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ type: Gravity
+- uid: 1
+ type: WallSolid
+ components:
+ - pos: -3.5,1.5
+ parent: 0
+ type: Transform
+- uid: 2
+ type: WallSolid
+ components:
+ - pos: -2.5,1.5
+ parent: 0
+ type: Transform
+- uid: 3
+ type: WallSolid
+ components:
+ - pos: -1.5,1.5
+ parent: 0
+ type: Transform
+- uid: 4
+ type: AirlockMaintEngiLocked
+ components:
+ - name: Entleins Wohnstätte
+ type: MetaData
+ - pos: -0.5,1.5
+ parent: 0
+ type: Transform
+ - containers:
+ board: !type:Container
+ ents: []
+ type: ContainerContainer
+- uid: 5
+ type: WallSolid
+ components:
+ - pos: 0.5,1.5
+ parent: 0
+ type: Transform
+- uid: 6
+ type: WallSolid
+ components:
+ - pos: 1.5,1.5
+ parent: 0
+ type: Transform
+- uid: 7
+ type: WallSolid
+ components:
+ - pos: 2.5,1.5
+ parent: 0
+ type: Transform
+- uid: 8
+ type: ReinforcedWindow
+ components:
+ - pos: 1.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 9
+ type: ReinforcedWindow
+ components:
+ - pos: 0.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 10
+ type: ReinforcedWindow
+ components:
+ - pos: -0.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 11
+ type: ReinforcedWindow
+ components:
+ - pos: -1.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 12
+ type: FigureSpawner
+ components:
+ - pos: 1.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 13
+ type: WallSolid
+ components:
+ - pos: 2.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 14
+ type: ClosetMaintenanceFilledRandom
+ components:
+ - pos: -1.5,0.5
+ parent: 0
+ type: Transform
+ - isPlaceable: False
+ type: PlaceableSurface
+ - containers:
+ EntityStorageComponent: !type:Container
+ ents: []
+ type: ContainerContainer
+- uid: 15
+ type: TableCarpet
+ components:
+ - pos: 0.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 16
+ type: TableCarpet
+ components:
+ - pos: 1.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 17
+ type: d20Dice
+ components:
+ - pos: 0.35689956,-0.2576263
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 18
+ type: SalvageLorePaperGamingSpawner
+ components:
+ - pos: 0.79439956,-0.4295013
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+ - fixtures: []
+ type: Fixtures
+- uid: 19
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: 2.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 20
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -3.5,0.5
+ parent: 0
+ type: Transform
+- uid: 21
+ type: RandomArcade
+ components:
+ - pos: -2.5,0.5
+ parent: 0
+ type: Transform
+- uid: 22
+ type: SalvageMobSpawner
+ components:
+ - pos: -0.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 23
+ type: Grille
+ components:
+ - pos: -2.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 24
+ type: Grille
+ components:
+ - pos: -1.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 25
+ type: Grille
+ components:
+ - pos: -0.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 26
+ type: Grille
+ components:
+ - pos: 0.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 27
+ type: Grille
+ components:
+ - pos: 1.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 28
+ type: CableApcExtension
+ components:
+ - pos: -0.5,1.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 29
+ type: CableApcExtension
+ components:
+ - pos: -0.5,0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 30
+ type: CableApcExtension
+ components:
+ - pos: -0.5,-0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 31
+ type: CableApcExtension
+ components:
+ - pos: -0.5,-1.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 32
+ type: CableApcExtension
+ components:
+ - pos: 0.5,-1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 33
+ type: CableApcExtension
+ components:
+ - pos: -1.5,-1.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 34
+ type: CableApcExtension
+ components:
+ - pos: 1.5,-1.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+- uid: 35
+ type: CableApcExtension
+ components:
+ - pos: 2.5,-1.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 36
+ type: PoweredSmallLight
+ components:
+ - rot: 3.141592653589793 rad
+ pos: 2.5,-1.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - enabled: False
+ type: AmbientSound
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 37
+ type: PoweredSmallLight
+ components:
+ - pos: -2.5,0.5
+ parent: 0
+ type: Transform
+ - powerLoad: 0
+ type: ApcPowerReceiver
+ - enabled: False
+ type: AmbientSound
+ - containers:
+ light_bulb: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 38
+ type: CableApcExtension
+ components:
+ - pos: -1.5,0.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 39
+ type: CableApcExtension
+ components:
+ - pos: -2.5,0.5
+ parent: 0
+ type: Transform
+ - canCollide: False
+ type: Physics
+- uid: 40
+ type: CableApcExtension
+ components:
+ - pos: 0.5,0.5
+ parent: 0
+ type: Transform
+ - visible: False
+ type: Sprite
+ - canCollide: False
+ type: Physics
+...
diff --git a/Resources/Maps/Salvage/small-a-1.yml b/Resources/Maps/Salvage/small-a-1.yml
new file mode 100644
index 0000000000..3b9b9132ac
--- /dev/null
+++ b/Resources/Maps/Salvage/small-a-1.yml
@@ -0,0 +1,563 @@
+meta:
+ format: 2
+ name: DemoStation
+ author: Space-Wizards
+ postmapinit: false
+tilemap:
+ 0: space
+ 1: floor_asteroid_coarse_sand0
+ 2: floor_asteroid_coarse_sand1
+ 3: floor_asteroid_coarse_sand2
+ 4: floor_asteroid_coarse_sand_dug
+ 5: floor_asteroid_sand
+ 6: floor_asteroid_tile
+ 7: floor_blue
+ 8: floor_blue_circuit
+ 9: floor_dark
+ 10: floor_elevator_shaft
+ 11: floor_freezer
+ 12: floor_glass
+ 13: floor_gold
+ 14: floor_green_circuit
+ 15: floor_hydro
+ 16: floor_lino
+ 17: floor_mono
+ 18: floor_reinforced
+ 19: floor_rglass
+ 20: floor_rock_vault
+ 21: floor_showroom
+ 22: floor_silver
+ 23: floor_snow
+ 24: floor_steel
+ 25: floor_steel_dirty
+ 26: floor_techmaint
+ 27: floor_white
+ 28: floor_wood
+ 29: lattice
+ 30: plating
+ 31: underplating
+grids:
+- settings:
+ chunksize: 16
+ tilesize: 1
+ chunks:
+ - ind: "-1,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAABQAAAA==
+ - ind: "0,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "-1,0"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "0,0"
+ tiles: BQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+entities:
+- uid: 0
+ components:
+ - pos: 0.5,0.5
+ parent: null
+ type: Transform
+ - index: 0
+ type: MapGrid
+ - angularDamping: 0.3
+ fixedRotation: False
+ bodyType: Dynamic
+ type: Physics
+ - fixtures:
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,0
+ - 3,1
+ - 0,1
+ - 0,0
+ id: grid_chunk-0-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,-3
+ - 1,-2
+ - 0,-2
+ - 0,-3
+ id: grid_chunk-0--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-2
+ - 3,0
+ - 0,0
+ - 0,-2
+ id: grid_chunk-0--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 2,1
+ - 2,2
+ - 0,2
+ - 0,1
+ id: grid_chunk-0-1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,2
+ - 1,3
+ - 0,3
+ - 0,2
+ id: grid_chunk-0-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,0
+ - 0,2
+ - -4,2
+ - -4,0
+ id: grid_chunk--4-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-4
+ - 0,-2
+ - -3,-2
+ - -3,-4
+ id: grid_chunk--3--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 24
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-2
+ - 0,0
+ - -4,0
+ - -4,-2
+ id: grid_chunk--4--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 32
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,2
+ - 0,3
+ - -3,3
+ - -3,2
+ id: grid_chunk--3-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ type: Fixtures
+ - gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ type: Gravity
+ - tiles:
+ -4,-2: 0
+ -4,-1: 0
+ -3,-4: 0
+ -3,-3: 0
+ -3,-2: 0
+ -3,-1: 0
+ -2,-4: 0
+ -2,-3: 0
+ -2,-2: 0
+ -2,-1: 1
+ -1,-4: 0
+ -1,-3: 0
+ -1,-2: 1
+ -1,-1: 2
+ 0,-3: 0
+ 0,-2: 0
+ 0,-1: 1
+ 1,-2: 0
+ 1,-1: 0
+ 2,-2: 0
+ 2,-1: 0
+ -4,0: 0
+ -4,1: 0
+ -3,0: 0
+ -3,1: 0
+ -3,2: 0
+ -2,0: 3
+ -2,1: 0
+ -2,2: 0
+ -1,0: 1
+ -1,1: 0
+ -1,2: 0
+ 0,0: 0
+ 0,1: 0
+ 0,2: 0
+ 1,0: 0
+ 1,1: 0
+ 2,0: 0
+ uniqueMixes:
+ - volume: 2500
+ temperature: 293.15
+ moles:
+ - 21.824879
+ - 82.10312
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - volume: 2500
+ temperature: 293.15
+ moles:
+ - 0
+ - 0
+ - 0
+ - 6666.982
+ - 0
+ - 0
+ - 0
+ - 0
+ - volume: 2500
+ temperature: 9000
+ moles:
+ - 0
+ - 0
+ - 0
+ - 6666.982
+ - 0
+ - 0
+ - 0
+ - 0
+ - volume: 2500
+ temperature: 293.15
+ moles:
+ - 6666.982
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ type: GridAtmosphere
+- uid: 1
+ type: AsteroidRock
+ components:
+ - pos: -2.5,2.5
+ parent: 0
+ type: Transform
+- uid: 2
+ type: AsteroidRock
+ components:
+ - pos: -2.5,1.5
+ parent: 0
+ type: Transform
+- uid: 3
+ type: AsteroidRock
+ components:
+ - pos: -2.5,0.5
+ parent: 0
+ type: Transform
+- uid: 4
+ type: AsteroidRock
+ components:
+ - pos: -2.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 5
+ type: AsteroidRock
+ components:
+ - pos: -2.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 6
+ type: AsteroidRock
+ components:
+ - pos: -2.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 7
+ type: AsteroidRock
+ components:
+ - pos: -1.5,2.5
+ parent: 0
+ type: Transform
+- uid: 8
+ type: AsteroidRock
+ components:
+ - pos: -1.5,1.5
+ parent: 0
+ type: Transform
+- uid: 9
+ type: SalvageMobSpawner
+ components:
+ - pos: -1.5,0.5
+ parent: 0
+ type: Transform
+- uid: 10
+ type: CrateMaterialPlasteel
+ components:
+ - pos: -1.5,-0.5
+ parent: 0
+ type: Transform
+ - isPlaceable: False
+ type: PlaceableSurface
+ - containers:
+ EntityStorageComponent: !type:Container
+ ents: []
+ PaperLabel: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 11
+ type: AsteroidRock
+ components:
+ - pos: -1.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 12
+ type: AsteroidRock
+ components:
+ - pos: -1.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 13
+ type: AsteroidRock
+ components:
+ - pos: -0.5,2.5
+ parent: 0
+ type: Transform
+- uid: 14
+ type: AsteroidRock
+ components:
+ - pos: -0.5,1.5
+ parent: 0
+ type: Transform
+- uid: 15
+ type: CrateMaterialPlastic
+ components:
+ - pos: -0.5,0.5
+ parent: 0
+ type: Transform
+ - isPlaceable: False
+ type: PlaceableSurface
+ - containers:
+ EntityStorageComponent: !type:Container
+ ents: []
+ PaperLabel: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 16
+ type: CrateMaterialGlass
+ components:
+ - pos: 0.5,-0.5
+ parent: 0
+ type: Transform
+ - isPlaceable: False
+ type: PlaceableSurface
+ - containers:
+ EntityStorageComponent: !type:Container
+ ents: []
+ PaperLabel: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 17
+ type: SalvageMaterialCrateSpawner
+ components:
+ - pos: -0.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 18
+ type: AsteroidRock
+ components:
+ - pos: -0.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 19
+ type: AsteroidRock
+ components:
+ - pos: 0.5,2.5
+ parent: 0
+ type: Transform
+- uid: 20
+ type: AsteroidRock
+ components:
+ - pos: 0.5,1.5
+ parent: 0
+ type: Transform
+- uid: 21
+ type: AsteroidRock
+ components:
+ - pos: 0.5,0.5
+ parent: 0
+ type: Transform
+- uid: 22
+ type: CrateMaterialSteel
+ components:
+ - pos: -0.5,-0.5
+ parent: 0
+ type: Transform
+ - isPlaceable: False
+ type: PlaceableSurface
+ - containers:
+ EntityStorageComponent: !type:Container
+ ents: []
+ PaperLabel: !type:ContainerSlot {}
+ type: ContainerContainer
+- uid: 23
+ type: AsteroidRock
+ components:
+ - pos: 0.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 24
+ type: AsteroidRock
+ components:
+ - pos: 0.5,-2.5
+ parent: 0
+ type: Transform
+- uid: 25
+ type: AsteroidRock
+ components:
+ - pos: -3.5,1.5
+ parent: 0
+ type: Transform
+- uid: 26
+ type: AsteroidRock
+ components:
+ - pos: -3.5,0.5
+ parent: 0
+ type: Transform
+- uid: 27
+ type: AsteroidRock
+ components:
+ - pos: -3.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 28
+ type: AsteroidRock
+ components:
+ - pos: -3.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 29
+ type: AsteroidRock
+ components:
+ - pos: 1.5,1.5
+ parent: 0
+ type: Transform
+- uid: 30
+ type: AsteroidRock
+ components:
+ - pos: 1.5,0.5
+ parent: 0
+ type: Transform
+- uid: 31
+ type: AsteroidRock
+ components:
+ - pos: 1.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 32
+ type: AsteroidRock
+ components:
+ - pos: 1.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 33
+ type: AsteroidRock
+ components:
+ - pos: 2.5,0.5
+ parent: 0
+ type: Transform
+- uid: 34
+ type: AsteroidRock
+ components:
+ - pos: 2.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 35
+ type: AsteroidRock
+ components:
+ - pos: 2.5,-1.5
+ parent: 0
+ type: Transform
+- uid: 36
+ type: AsteroidRock
+ components:
+ - pos: -2.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 37
+ type: AsteroidRock
+ components:
+ - pos: -1.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 38
+ type: AsteroidRock
+ components:
+ - pos: -0.5,-3.5
+ parent: 0
+ type: Transform
+- uid: 39
+ type: AtmosFixOxygenMarker
+ components:
+ - pos: -1.5,0.5
+ parent: 0
+ type: Transform
+- uid: 40
+ type: AtmosFixPlasmaMarker
+ components:
+ - pos: -0.5,0.5
+ parent: 0
+ type: Transform
+- uid: 41
+ type: AtmosFixPlasmaMarker
+ components:
+ - pos: -0.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 42
+ type: AtmosFixPlasmaMarker
+ components:
+ - pos: -1.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 43
+ type: AtmosFixPlasmaMarker
+ components:
+ - pos: 0.5,-0.5
+ parent: 0
+ type: Transform
+- uid: 44
+ type: AtmosFixPlasmaMarker
+ components:
+ - pos: -0.5,-1.5
+ parent: 0
+ type: Transform
+...
diff --git a/Resources/Maps/Salvage/small-template.yml b/Resources/Maps/Salvage/small-template.yml
new file mode 100644
index 0000000000..962c2d7742
--- /dev/null
+++ b/Resources/Maps/Salvage/small-template.yml
@@ -0,0 +1,277 @@
+meta:
+ format: 2
+ name: DemoStation
+ author: Space-Wizards
+ postmapinit: false
+tilemap:
+ 0: space
+ 1: floor_asteroid_coarse_sand0
+ 2: floor_asteroid_coarse_sand1
+ 3: floor_asteroid_coarse_sand2
+ 4: floor_asteroid_coarse_sand_dug
+ 5: floor_asteroid_sand
+ 6: floor_asteroid_tile
+ 7: floor_blue
+ 8: floor_blue_circuit
+ 9: floor_dark
+ 10: floor_elevator_shaft
+ 11: floor_freezer
+ 12: floor_glass
+ 13: floor_gold
+ 14: floor_green_circuit
+ 15: floor_hydro
+ 16: floor_lino
+ 17: floor_mono
+ 18: floor_reinforced
+ 19: floor_rglass
+ 20: floor_rock_vault
+ 21: floor_showroom
+ 22: floor_silver
+ 23: floor_snow
+ 24: floor_steel
+ 25: floor_steel_dirty
+ 26: floor_techmaint
+ 27: floor_white
+ 28: floor_wood
+ 29: lattice
+ 30: plating
+ 31: underplating
+grids:
+- settings:
+ chunksize: 16
+ tilesize: 1
+ chunks:
+ - ind: "-1,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAADQAAAA==
+ - ind: "0,-1"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "-1,0"
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ - ind: "0,0"
+ tiles: HQAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+entities:
+- uid: 0
+ components:
+ - pos: 0.5, 0.5
+ parent: null
+ type: Transform
+ - index: 0
+ type: MapGrid
+ - angularDamping: 0.3
+ fixedRotation: False
+ bodyType: Dynamic
+ type: Physics
+ - fixtures:
+ - shape: !type:PolygonShape
+ vertices:
+ - -3,-3
+ - -3,-1
+ - -4,-1
+ - -4,-3
+ id: grid_chunk--4--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,-2
+ - 1,-1
+ - 0,-1
+ - 0,-2
+ id: grid_chunk-0--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-3
+ - 0,-2
+ - -1,-2
+ - -1,-3
+ id: grid_chunk--1--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - -3,0
+ - -3,2
+ - -4,2
+ - -4,0
+ id: grid_chunk--4-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,0
+ - 3,2
+ - 2,2
+ - 2,0
+ id: grid_chunk-2-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-2
+ - 0,-1
+ - -2,-1
+ - -2,-2
+ id: grid_chunk--2--2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-4
+ - 0,-3
+ - -4,-3
+ - -4,-4
+ id: grid_chunk--4--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,-1
+ - 0,0
+ - -4,0
+ - -4,-1
+ id: grid_chunk--4--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,1
+ - 0,2
+ - -1,2
+ - -1,1
+ id: grid_chunk--1-1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,2
+ - 3,3
+ - 0,3
+ - 0,2
+ id: grid_chunk-0-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 1,0
+ - 1,1
+ - 0,1
+ - 0,0
+ id: grid_chunk-0-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 4
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-3
+ - 3,-1
+ - 2,-1
+ - 2,-3
+ id: grid_chunk-2--3
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-1
+ - 3,0
+ - 0,0
+ - 0,-1
+ id: grid_chunk-0--1
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 3,-4
+ - 3,-3
+ - 0,-3
+ - 0,-4
+ id: grid_chunk-0--4
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 12
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,2
+ - 0,3
+ - -4,3
+ - -4,2
+ id: grid_chunk--4-2
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 16
+ restitution: 0.1
+ - shape: !type:PolygonShape
+ vertices:
+ - 0,0
+ - 0,1
+ - -2,1
+ - -2,0
+ id: grid_chunk--2-0
+ mask:
+ - MapGrid
+ layer:
+ - MapGrid
+ mass: 8
+ restitution: 0.1
+ type: Fixtures
+ - gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ type: Gravity
+...
diff --git a/Resources/Maps/knightship.yml b/Resources/Maps/knightship.yml
index 3da4a0e982..687bac4db4 100644
--- a/Resources/Maps/knightship.yml
+++ b/Resources/Maps/knightship.yml
@@ -5625,4 +5625,17 @@ entities:
- pos: 0.5,-9.5
parent: 0
type: Transform
+- uid: 559
+ type: SalvageLocator
+ components:
+ - pos: 0.5,5.5
+ rot: 3.141592653589793 rad
+ parent: 0
+ type: Transform
+- uid: 560
+ type: CrateSalvageEquipment
+ components:
+ - pos: 2.5,5.5
+ parent: 0
+ type: Transform
...
diff --git a/Resources/Maps/packedstation.yml b/Resources/Maps/packedstation.yml
index eebdac31b5..55584d17e9 100644
--- a/Resources/Maps/packedstation.yml
+++ b/Resources/Maps/packedstation.yml
@@ -26998,21 +26998,14 @@ entities:
parent: 0
type: Transform
- uid: 2090
- type: CrateGenericonimo
+ type: SalvageMagnet
components:
- pos: 6.5,32.5
+ rot: -1.5707963267948966 rad
parent: 0
type: Transform
- - isPlaceable: False
- type: PlaceableSurface
- - containers:
- EntityStorageComponent: !type:Container
- ents: []
- labelSlot: !type:ContainerSlot {}
- PaperLabel: !type:ContainerSlot {}
- type: ContainerContainer
- uid: 2091
- type: CrateGenericonimo
+ type: CrateSalvageEquipment
components:
- pos: 7.5,31.5
parent: 0
diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml
index 5267c40d53..dfffcbd797 100644
--- a/Resources/Maps/saltern.yml
+++ b/Resources/Maps/saltern.yml
@@ -72553,4 +72553,17 @@ entities:
- pos: 14.5,-0.5
parent: 853
type: Transform
+- uid: 7116
+ type: SalvageMagnet
+ components:
+ - rot: 3.141592697301183 rad
+ pos: 23.5,11.5
+ parent: 853
+ type: Transform
+- uid: 7117
+ type: CrateSalvageEquipment
+ components:
+ - pos: 23.5,13.5
+ parent: 853
+ type: Transform
...
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
new file mode 100644
index 0000000000..2c93d934e8
--- /dev/null
+++ b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
@@ -0,0 +1,82 @@
+- type: entity
+ id: CrateSalvageEquipment
+ name: "salvage equipment crate"
+ description: For the daring.
+ suffix: Filled
+ parent: CrateGenericonimo
+ components:
+ - type: StorageFill
+ contents:
+ - id: ClothingHeadHelmetHardsuitSalvage
+ - id: ClothingOuterHardsuitSalvage
+ - id: ClothingMaskBreath
+ - id: OxygenTankFilled
+ - id: FireExtinguisher
+ - id: ClothingShoesBootsMag
+ - id: Pickaxe
+ # bare-minimum for cutting apart walls
+ # not giving them wirecutters/etc. for balance reasons
+ - id: Welder
+ - id: Wrench
+ - id: Screwdriver
+ - id: Crowbar
+
+- type: entity
+ id: CrateSalvageAssortedGoodies
+ suffix: Filled, Salvage Random
+ abstract: true # You should use SalvageMaterialCrateSpawner instead
+ parent: CrateGenericonimo
+ components:
+ - type: StorageFill
+ contents:
+ # Normal (10%)
+ - id: ToolboxEmergencyFilled
+ prob: 0.1
+ - id: ClothingMaskBreath
+ prob: 0.1
+ - id: OxygenTankFilled
+ prob: 0.1
+ - id: SheetPlasma
+ prob: 0.1
+ # - Service
+ - id: CrayonBox
+ prob: 0.1
+ # - Medical
+ - id: MedkitFilled
+ prob: 0.1
+ - id: BoxSyringe
+ prob: 0.1
+ - id: BoxBeaker
+ prob: 0.1
+ # - Scaf
+ - id: ClothingHeadHelmetScaf
+ prob: 0.1
+ - id: ClothingOuterArmorScaf
+ prob: 0.1
+ # - Heh
+ - id: SalvageHumanCorpse
+ prob: 0.1
+ # Interesting (1%)
+ # - Ammo
+ - id: BoxMagnum
+ prob: 0.01
+ # - #shinies
+ - id: PowerCellLargeHyper
+ prob: 0.01
+ # Just no (0.1%)
+ # - Working guns
+ - id: RevolverDeckard
+ prob: 0.001
+ - id: RevolverInspector
+ prob: 0.001
+ # - Skub
+ - id: Skub
+ prob: 0.001
+ # TRAITOR EQUIPMENT (0.01%)
+ - id: Telecrystal10
+ prob: 0.0001
+ - id: RevolverPredator
+ prob: 0.0001
+ - id: RevolverMateba
+ prob: 0.0001
+
diff --git a/Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml b/Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml
new file mode 100644
index 0000000000..ec09546423
--- /dev/null
+++ b/Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml
@@ -0,0 +1,101 @@
+# ---- SPECIFICS ----
+
+- type: entity
+ id: PaperWrittenSalvageLoreMedium1PlasmaTrap
+ abstract: true # keep this from spamming spawn sheet
+ suffix: "Salvage: Lore: Medium 1: Plasma Trap"
+ parent: PaperWritten
+ components:
+ - type: Paper
+ content: |
+ Heheheheh, no way in hell they're going to get at our stash NOW, is there?
+ I rigged the area where our stuff's at to be a toasty thousand K.
+ You know how to drain it when we need it out.
+ - J.
+
+# ---- GAMING ----
+
+- type: entity
+ name: Salvage Lore Paper Gaming Spawner
+ id: SalvageLorePaperGamingSpawner
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: red
+ - texture: Objects/Misc/bureaucracy.rsi/paper_words.png
+ - type: RandomSpawner
+ prototypes:
+ - PaperWrittenSalvageLoreGaming1
+ - PaperWrittenSalvageLoreGaming2
+ - PaperWrittenSalvageLoreGaming3
+ - PaperWrittenSalvageLoreGaming4
+ offset: 0.1
+
+- type: entity
+ id: PaperWrittenSalvageLoreGaming1
+ abstract: true # keep this from spamming spawn sheet
+ suffix: "Salvage: Lore: Gaming 1"
+ parent: PaperWritten
+ components:
+ - type: Paper
+ content: |
+ Can't stay for the game.
+ Engineering want me to keep a close eye on the singularity SMESes.
+ Leaving this so you know what's up.
+ Sorry.
+ - Alexander
+
+- type: entity
+ id: PaperWrittenSalvageLoreGaming2
+ abstract: true # keep this from spamming spawn sheet
+ suffix: "Salvage: Lore: Gaming 2"
+ parent: PaperWritten
+ components:
+ - type: Paper
+ content: |
+ Johny Clowe
+ Class: Druid
+ Alignment: Neutral Good
+ Str: 1,294,139
+ Dex: 4,102,103
+ Con: 9,522,913
+ Int: 528,491
+ Wis: 1
+ Cha: 1
+
+ Where's the age?
+ Why are those ability scores so ridiculous?
+ What even are you trying to do here, Leah? - Your Friendly DM
+
+- type: entity
+ id: PaperWrittenSalvageLoreGaming3
+ abstract: true # keep this from spamming spawn sheet
+ suffix: "Salvage: Lore: Gaming 3"
+ parent: PaperWritten
+ components:
+ - type: Paper
+ content: |
+ THE GIANT SPACE FLY FROM SPACE
+ Session 1: They should have just learned what's going on with the world and the Giant Space Fly.
+ Session 2: They should know to ask the Wizard's Court about seismic distortions.
+ Session 3: On their way to underground lair.
+ Session 4: Just ran into the Architect Of Flies.
+ Oh dear goodness they just started randomly killing everybody
+
+- type: entity
+ id: PaperWrittenSalvageLoreGaming4
+ abstract: true # keep this from spamming spawn sheet
+ suffix: "Salvage: Lore: Gaming 4"
+ parent: PaperWritten
+ components:
+ - type: Paper
+ content: |
+ Won't be able to come to the meet, chemist blew up the hospital again.
+ Fifth time this shift.
+ It's amazing.
+ But not in a good way.
+ Cheers, - Arielle
+
+# ----
+
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml
new file mode 100644
index 0000000000..45a1a96d1c
--- /dev/null
+++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml
@@ -0,0 +1,67 @@
+- type: entity
+ name: Salvage Material Crate Spawner
+ id: SalvageMaterialCrateSpawner
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: red
+ - texture: Structures/Storage/Crates/generic.rsi/crate_icon.png
+ - type: RandomSpawner
+ rarePrototypes:
+ - SalvageHumanCorpse
+ - CrateMaterialPlasteel
+ - CrateMaterialWood
+ - CrateMaterialPlastic
+ - CrateSalvageEquipment
+ - CrateMaterialSteel
+ - CrateMaterialGlass
+ rareChance: 0.4
+ prototypes:
+ - CrateSalvageAssortedGoodies
+ chance: 0.9
+ offset: 0.0
+
+- type: entity
+ name: Salvage Canister Spawner
+ id: SalvageCanisterSpawner
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: red
+ - texture: Structures/Storage/canister.rsi/blue.png
+ - type: RandomSpawner
+ rarePrototypes:
+ - PlasmaCanister
+ rareChance: 0.03
+ prototypes:
+ - AirCanister
+ - NitrogenCanister
+ - OxygenCanister
+ - CarbonDioxideCanister
+ - WaterVaporCanister
+ chance: 0.9
+ offset: 0.0
+
+- type: entity
+ name: Salvage Mob Spawner
+ id: SalvageMobSpawner
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: red
+ - texture: Mobs/Aliens/Carps/space.rsi/icon.png
+ - type: RandomSpawner
+ prototypes:
+ - MobCarp
+ - MobCarp
+ - MobCarp
+ - MobCarp
+ - MobCarp
+ - PlushieCarp
+ - DehydratedSpaceCarp
+ chance: 0.25
+ offset: 0.2
+
diff --git a/Resources/Prototypes/Entities/Markers/atmos_blocker.yml b/Resources/Prototypes/Entities/Markers/atmos_blocker.yml
index 18973d03c8..51f9f56a49 100644
--- a/Resources/Prototypes/Entities/Markers/atmos_blocker.yml
+++ b/Resources/Prototypes/Entities/Markers/atmos_blocker.yml
@@ -66,3 +66,20 @@
- type: AtmosFixMarker
mode: 4
+- type: entity
+ name: Atmos Fix Instant Plasmafire Marker
+ id: AtmosFixInstantPlasmaFireMarker
+ description: "INSTANT PLASMAFIRE"
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - sprite: Markers/atmos.rsi # {
+ state: base-hot
+ shader: unshaded
+ - sprite: Markers/atmos.rsi
+ shader: unshaded # }
+ state: fire
+ - type: AtmosFixMarker
+ mode: 5
+
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
index e2840a1c5d..d5a4c85027 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
@@ -28,3 +28,16 @@
- Thirst
- Idle
- Spirate
+
+- type: entity
+ parent: MobHumanBase
+ suffix: Dead
+ id: SalvageHumanCorpse
+ name: unidentified human
+ description: We barely knew ye.
+ components:
+ - type: Damageable
+ damage:
+ types:
+ Blunt: 200
+
diff --git a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml
new file mode 100644
index 0000000000..5440bb243b
--- /dev/null
+++ b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml
@@ -0,0 +1,25 @@
+- type: entity
+ id: SalvageMagnet
+ parent: BaseMachine
+ name: salvage magnet
+ description: "Pulls in salvage."
+ components:
+ - type: Sprite
+ layers:
+ - sprite: Structures/Machines/salvage.rsi
+ state: salvage-magnet
+ # Ideally, there'd be lights indicating power usage and a big red lamp indicating loss
+ - type: Rotatable
+ - type: SalvageMagnet
+ offset: 0, -32
+
+# For Knightship
+- type: entity
+ id: SalvageLocator
+ parent: SalvageMagnet
+ name: salvage locator
+ description: "Locates salvage."
+ components:
+ - type: SalvageMagnet
+ offset: 0, -12
+
diff --git a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml
index c1f4c221f4..235a302e1a 100644
--- a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml
+++ b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml
@@ -23,6 +23,7 @@
- type: Occluder
sizeX: 32
sizeY: 32
+ - type: Airtight
- type: Appearance
visuals:
- type: AsteroidRockVisualizer
diff --git a/Resources/Prototypes/Maps/salvage.yml b/Resources/Prototypes/Maps/salvage.yml
new file mode 100644
index 0000000000..6035777731
--- /dev/null
+++ b/Resources/Prototypes/Maps/salvage.yml
@@ -0,0 +1,33 @@
+# ALL SALVAGE MAPS SHOULD BE SETUP SUCH THAT TILE REF -1,-1 IS THEIR OFFICIAL CENTRE,
+# AND FOR EASE OF UNDERSTANDING, USE - pos: 0.5, 0.5 FOR SAVED POSITION.
+
+# "Small"-class maps - Max size square: 7x7, indicated size: 3.5
+
+- type: salvageMap
+ id: small1
+ name: "Small / Engineering Storage 1"
+ mapPath: Maps/Salvage/small-1.yml
+ size: 3.5
+
+- type: salvageMap
+ id: small2
+ name: "Small / Gaming Nook 1"
+ mapPath: Maps/Salvage/small-2.yml
+ size: 3.5
+
+# Small - Asteroids
+
+- type: salvageMap
+ id: smallA1
+ name: "Small / Asteroid 1 Plasmafire"
+ mapPath: Maps/Salvage/small-a-1.yml
+ size: 3.5
+
+# "Medium"-class maps - Max size square: 15x15, indicated size: 7.5
+
+- type: salvageMap
+ id: medium1
+ name: "Medium / Plasma-Trapped Cache 1"
+ mapPath: Maps/Salvage/medium-1.yml
+ size: 7.5
+
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
index ac15a7960c..67073f0f9a 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
@@ -9,6 +9,7 @@
access:
- Cargo
- Maintenance
+ - External
- type: startingGear
id: CargoTechGear
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
index 06390dce09..b77e4d90dd 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
@@ -10,6 +10,7 @@
- Cargo
# - Quartermaster
- Maintenance
+ - External
- type: startingGear
id: QuartermasterGear
diff --git a/Resources/Textures/Markers/arrow.rsi/meta.json b/Resources/Textures/Markers/arrow.rsi/meta.json
new file mode 100644
index 0000000000..158be37a96
--- /dev/null
+++ b/Resources/Textures/Markers/arrow.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Space Wizards Federation",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "mono"
+ }
+ ]
+}
diff --git a/Resources/Textures/Markers/arrow.rsi/mono.png b/Resources/Textures/Markers/arrow.rsi/mono.png
new file mode 100644
index 0000000000000000000000000000000000000000..59de0257f6ef57a338646dc90edbad096994d5d6
GIT binary patch
literal 271
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI
z1_o|n5N2eUHAey{$X?><>&pI=hlyK}C+EgyBcRY6PZ!6Kh{JEEALMIM5O9v({J&nl
zZrePcYoSgW0?B31xMp1Eb7K6rH)Gx9HScR^sEXRQJbD5HCj@=4a5!JO=A7l6
zcMdKNmsGiBemV##J&M&$$mf1{C4ADwFJb}=UYb`qv?e^WR2x?d05Pd;o~UH2r>iQ(5x?wDG>Eq!T9r&q{+K4g;p^KZWn(47pPu6{1-
HoD!M<2Nh=N
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Markers/atmos.rsi/base-hot.png b/Resources/Textures/Markers/atmos.rsi/base-hot.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0d68f8b9e52b47e75c9a8f158e1eece39c501f9
GIT binary patch
literal 255
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI
z1_nK45N51cYF`EvWH0gbb!C6b!z3WdDIK@{I#5Wm#5JPCIX^cyHLrxhxhOTUBsE2$
zJhLQ2!QIn0AiR-J9H=PW)5S3);_%z+8+jWHcvvrTpYqUg;7k%NJHfZ6Nh5JffC8I?
zWU=bsSd5KwSv
rU|?io;Sl)nHtOGVvXec@E;|WhNyQ)xHHM}l88MbDA(IrL
zL?oeMqN3iAEMrOD=@0mw-?{g5Kj(a&=ehTu=RD^*_qwgMg^&PT0000X9M;s1%S0|P
z{CwOv@;)VnOMJd~3sZpd*E~&~Qn?EBBGxqu08YsN1yB5a!&t5eiN+DkAYTM|VQO;j
zzIF~=Nh;dRCE6rBH1vE}G++{W-Y5FJpKM%Ubbzb{j$rGYDl7>A{H8clBZv6OMUU_R
z>3NxCzx@-IU*1LDgCBq0A~3FW_oXpCRB4nHo4snZaW%tOtw}~|LiBK4#>nqLs1Wj8
zllnJ<5cw1}sSwamP4nI2@9lRdX44FGS7g=kf?~0V98|&KH*`l_ZlR~4?gMN)$9fru
zew8vkpY7FonzbAkH?(6gw9`=-qMPzZ@6dZyr4NeUVDJCsE)X>aM{Ia}9PL)?3Rgu4*77>OX4TBje=ogE9ix2#Ztf`Te|W+G>)CmjOInjRk>79l}|54((m1H!{0
zz>B$v*`1>^TgrfUEGo@&Ji4)ZiyBrEGUyf~&j+7w;qxnM{KPpCGW&
z@ROrPB8{Ff7_7X#{q*jo`8Q>^%JOYE_8uOeDRPIv43G59wNbT?PgN6Xh}OZu!IEFG
zD`<8|Q{T2%05y#m^^Kk~Rs$-bQlG8rHNQQbw5`R^*6OpMDa^(_lg&M%Zy9`8={md+?KWnl2i2M-z+H$v4ZR`6s`ue`m95IM37q~WbTYM3FV84#}
zjJ{rUxZR**PDU8#!Q;(!X@Kap*Ihn&;>FG|15|~?3=P;F>m_u1xt&%2zMgg4mS3O6
zI<$VNXUi6(GlVQGdHSabe-x5}#!Db?$1)@j
z`yVByNXbja(hR6U?
zUbafpVop8{1i))T`Ar$NtqHd+WJUT0=#L)R7o%||V+hQ!%b309otHm$jz~)c6mau-
zEU%5=G5%xM!1MwwJw26w655i2(6PugEdgAnB>{B0ef<@B96Vx)342o!eE&NSx!Sz#
z#z)4Wf1-xapNpD!6QoX^#0y{b$E+|?Ufx4^wdFj))$0mdwGC=8s?5+
zOpLahn;Uy|%huk$oCb~VU;#H`8h=SuH4|YSm3^au!|v~r0|l!n^FD!OST((+g``c)
zyj7uiTY@6V{BR&e0lrUHn5|1#T>O|sGK29Pt}o+_q1K@#y@G;*)O2(z1F8VF-%~NF
zXrkZl%<+tdx%Cv=`82>mNTDC>`EyIn&Jmfd|JcXGjr-K{^75YhKRQ-qNf*Nms(l_^
z_idW~bdj9oH(G)L;s>{wHL8fsPZvMl(RoHek;SQgpqY>WVs?FywBQx-sA4B^2Th`%
ztOg-tI!UXjHSz_TrGunkw4r^h+d2mQ!~!eX9I$vO2v=#bY;e4&^$W>HqpOYPTnI#2
zd|HY6+tCOX=m#gS2Z@-^bRsEds65#1yKyx5fDBE-QuOCZpNfi=Km-N~V^N9udZL(;
zduvPfCT(-0B3J_GQmc%rZZd<1TM`acSct7(yEbgueII|*FNy9TP*zsvx{OO|GOO{0
z(osB%<4;u-3~Hej`NXs^$XR(vMB@y_|8en#gR^Am?rzEC{P%z9qU3>c(O8n+mOCE5
zAMne8Ps&LgCx_K4;kruW@88k=W0TwGbPgegmFKA_z5gZQtEfGShkMf_5c8=cF`m4@
z4;*6TBsO63iiD-@N(Nv+Q`L_t7HvaW6F|l%1+qWYhg%mqZ|c+pfCBd$QBDQB@i7n;
zcJ!J9w1gFVI{8O;u%holUTr8_={Yio&>^7kSoCqh9VZvL&IgV&NbbjO22zw#LPFV`
zKUU*WH-bTd2x2eT@@2^D%MGP{q(BWyF)QQikth!jnMp%k<*B8Ro#pdMc=B6&OcdH+{wk7dxvFLO+La=VMylJn&)GvvnI~_a@z
zDx=QZs9Z1@a~G(u%Pf*g#Q=Ik={tk;=%bv?WyPh%AHwFuW=L&s#Gr^Qjn^}DrFqF_
z($mJ?8T&h{t*x!mBO|i+gxTfVowLxF;b7uLT@p>J=mNCmJyt~cDt=q4b5;ApVr;%*
z19RS?aJ8;>?9!Q@Mr4P(0w-KTg){Uugw=kqHH_sO1MryxnP1*3Z>XO8AlTK#|9`wb
bc18ZgoAVP_-rE*%hYkQ|W^Kwa_D=f`kwzE=
literal 0
HcmV?d00001
From ae4d47401c87081d9b86272cf9656cf7b104c3cc Mon Sep 17 00:00:00 2001
From: PJBot
Date: Fri, 3 Dec 2021 17:25:22 -0500
Subject: [PATCH 07/40] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index db36e07644..4fc562e1ef 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,9 +1,4 @@
Entries:
-- author: Swept
- changes:
- - {message: Removed solution transfer verbs., type: Remove}
- id: 200
- time: '2021-05-21T21:36:16.0000000+00:00'
- author: Zumorica
changes:
- {message: Fixes lathes not printing any recipe., type: Fix}
@@ -2866,3 +2861,8 @@ Entries:
has adjusted soul binding to monkeys accordingly.', type: Fix}
id: 701
time: '2021-12-03T17:11:51.0000000+00:00'
+- author: 20kdc
+ changes:
+ - {message: The Salvage department is now partially there., type: Add}
+ id: 702
+ time: '2021-12-03T22:24:19.0000000+00:00'
From e4defccd33b9ba6ac7e5b0b2ab3f16a50a665727 Mon Sep 17 00:00:00 2001
From: Paul Ritter
Date: Fri, 3 Dec 2021 23:42:38 +0100
Subject: [PATCH 08/40] Revert "Salvage 0.1" (#5684)
---
Content.Client/Entry/EntryPoint.cs | 1 -
Content.Client/Entry/IgnoredComponents.cs | 2 -
Content.Server/Atmos/Commands/FixGridAtmos.cs | 7 +-
Content.Server/Salvage/CallSalvageCommand.cs | 70 -
Content.Server/Salvage/SalvageComponent.cs | 33 -
.../Salvage/SalvageMagnetComponent.cs | 30 -
Content.Server/Salvage/SalvageMapPrototype.cs | 38 -
Content.Server/Salvage/SalvageSystem.cs | 310 ---
Content.Shared/CCVar/CCVars.cs | 10 -
.../Locale/en-US/salvage/salvage-system.ftl | 22 -
Resources/Maps/Salvage/medium-1.yml | 1697 -----------------
Resources/Maps/Salvage/medium-template.yml | 407 ----
Resources/Maps/Salvage/small-1.yml | 318 ---
Resources/Maps/Salvage/small-2.yml | 621 ------
Resources/Maps/Salvage/small-a-1.yml | 563 ------
Resources/Maps/Salvage/small-template.yml | 277 ---
Resources/Maps/knightship.yml | 13 -
Resources/Maps/packedstation.yml | 13 +-
Resources/Maps/saltern.yml | 13 -
.../Catalog/Fills/Crates/salvage.yml | 82 -
.../Catalog/Fills/Paper/salvage_lore.yml | 101 -
.../Markers/Spawners/Random/salvage.yml | 67 -
.../Entities/Markers/atmos_blocker.yml | 17 -
.../Prototypes/Entities/Mobs/NPCs/human.yml | 13 -
.../Entities/Structures/Machines/salvage.yml | 25 -
.../Entities/Structures/Walls/asteroid.yml | 1 -
Resources/Prototypes/Maps/salvage.yml | 33 -
.../Roles/Jobs/Cargo/cargo_technician.yml | 1 -
.../Roles/Jobs/Cargo/quartermaster.yml | 1 -
.../Textures/Markers/arrow.rsi/meta.json | 14 -
Resources/Textures/Markers/arrow.rsi/mono.png | Bin 271 -> 0 bytes
.../Textures/Markers/atmos.rsi/base-hot.png | Bin 255 -> 0 bytes
Resources/Textures/Markers/atmos.rsi/fire.png | Bin 227 -> 0 bytes
.../Textures/Markers/atmos.rsi/meta.json | 6 -
.../Structures/Machines/salvage.rsi/meta.json | 17 -
.../Machines/salvage.rsi/salvage-magnet.png | Bin 2268 -> 0 bytes
36 files changed, 11 insertions(+), 4812 deletions(-)
delete mode 100644 Content.Server/Salvage/CallSalvageCommand.cs
delete mode 100644 Content.Server/Salvage/SalvageComponent.cs
delete mode 100644 Content.Server/Salvage/SalvageMagnetComponent.cs
delete mode 100644 Content.Server/Salvage/SalvageMapPrototype.cs
delete mode 100644 Content.Server/Salvage/SalvageSystem.cs
delete mode 100644 Resources/Locale/en-US/salvage/salvage-system.ftl
delete mode 100644 Resources/Maps/Salvage/medium-1.yml
delete mode 100644 Resources/Maps/Salvage/medium-template.yml
delete mode 100644 Resources/Maps/Salvage/small-1.yml
delete mode 100644 Resources/Maps/Salvage/small-2.yml
delete mode 100644 Resources/Maps/Salvage/small-a-1.yml
delete mode 100644 Resources/Maps/Salvage/small-template.yml
delete mode 100644 Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
delete mode 100644 Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml
delete mode 100644 Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml
delete mode 100644 Resources/Prototypes/Entities/Structures/Machines/salvage.yml
delete mode 100644 Resources/Prototypes/Maps/salvage.yml
delete mode 100644 Resources/Textures/Markers/arrow.rsi/meta.json
delete mode 100644 Resources/Textures/Markers/arrow.rsi/mono.png
delete mode 100644 Resources/Textures/Markers/atmos.rsi/base-hot.png
delete mode 100644 Resources/Textures/Markers/atmos.rsi/fire.png
delete mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/meta.json
delete mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet.png
diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs
index 6067b2425a..7043970921 100644
--- a/Content.Client/Entry/EntryPoint.cs
+++ b/Content.Client/Entry/EntryPoint.cs
@@ -94,7 +94,6 @@ namespace Content.Client.Entry
prototypes.RegisterIgnore("advertisementsPack");
prototypes.RegisterIgnore("metabolizerType");
prototypes.RegisterIgnore("metabolismGroup");
- prototypes.RegisterIgnore("salvageMap");
ClientContentIoC.Register();
diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs
index 3322a880d1..48d30e0eea 100644
--- a/Content.Client/Entry/IgnoredComponents.cs
+++ b/Content.Client/Entry/IgnoredComponents.cs
@@ -126,8 +126,6 @@ namespace Content.Client.Entry
"Toys",
"SurgeryTool",
"EmitSoundOnThrow",
- "Salvage",
- "SalvageMagnet",
"Flash",
"Docking",
"Telecrystal",
diff --git a/Content.Server/Atmos/Commands/FixGridAtmos.cs b/Content.Server/Atmos/Commands/FixGridAtmos.cs
index b0a6fee2ac..4dd76ba00c 100644
--- a/Content.Server/Atmos/Commands/FixGridAtmos.cs
+++ b/Content.Server/Atmos/Commands/FixGridAtmos.cs
@@ -29,7 +29,7 @@ namespace Content.Server.Atmos.Commands
var entityManager = IoCManager.Resolve();
var atmosphereSystem = EntitySystem.Get();
- var mixtures = new GasMixture[6];
+ var mixtures = new GasMixture[5];
for (var i = 0; i < mixtures.Length; i++)
mixtures[i] = new GasMixture(Atmospherics.CellVolume) { Temperature = Atmospherics.T20C };
@@ -48,11 +48,6 @@ namespace Content.Server.Atmos.Commands
// 4: Plasma (GM)
mixtures[4].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);
- // 5: Instant Plasmafire (r)
- mixtures[5].AdjustMoles(Gas.Oxygen, Atmospherics.MolesCellGasMiner);
- mixtures[5].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);
- mixtures[5].Temperature = 5000f;
-
foreach (var gid in args)
{
// I like offering detailed error messages, that's why I don't use one of the extension methods.
diff --git a/Content.Server/Salvage/CallSalvageCommand.cs b/Content.Server/Salvage/CallSalvageCommand.cs
deleted file mode 100644
index 3a8faf9b56..0000000000
--- a/Content.Server/Salvage/CallSalvageCommand.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using Content.Shared.Administration;
-using Content.Server.Administration;
-using Robust.Shared.Console;
-using Robust.Shared.GameObjects;
-using Robust.Shared.IoC;
-using Robust.Shared.Localization;
-
-namespace Content.Server.Salvage
-{
- [AdminCommand(AdminFlags.Admin)]
- public class CallSalvageCommand : IConsoleCommand
- {
- public string Command => "callsalvage";
- public string Description => "Starts salvage.";
- public string Help => "Usage: callsalvage";
-
- public void Execute(IConsoleShell shell, string argStr, string[] args)
- {
- if (args.Length != 0)
- {
- shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
- return;
- }
- shell.WriteLine(EntitySystem.Get().CallSalvage());
- }
- }
-
- [AdminCommand(AdminFlags.Admin)]
- public class RecallSalvageCommand : IConsoleCommand
- {
- public string Command => "recallsalvage";
- public string Description => "Forcibly recalls salvage.";
- public string Help => "Usage: recallsalvage";
-
- public void Execute(IConsoleShell shell, string argStr, string[] args)
- {
- if (args.Length != 0)
- {
- shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
- return;
- }
- shell.WriteLine(EntitySystem.Get().ReturnSalvage());
- }
- }
-
- [AdminCommand(AdminFlags.Admin)]
- public class RecallSalvageNowCommand : IConsoleCommand
- {
- public string Command => "recallsalvagefinishnow";
- public string Description => "Forcibly stops salvage immediately (will delete - good for testing).";
- public string Help => "Usage: recallsalvagefinishnow";
-
- public void Execute(IConsoleShell shell, string argStr, string[] args)
- {
- if (args.Length != 0)
- {
- shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
- return;
- }
- var salvageSystem = EntitySystem.Get();
- if ((salvageSystem.State != SalvageSystemState.Active) && (salvageSystem.State != SalvageSystemState.LettingGo))
- {
- shell.WriteError("Incorrect state (must be in active or letting-go state)");
- return;
- }
- salvageSystem.DeleteSalvage();
- }
- }
-}
-
diff --git a/Content.Server/Salvage/SalvageComponent.cs b/Content.Server/Salvage/SalvageComponent.cs
deleted file mode 100644
index 9d4a58887f..0000000000
--- a/Content.Server/Salvage/SalvageComponent.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-using Content.Server.NodeContainer.NodeGroups;
-using Content.Server.NodeContainer.Nodes;
-using Content.Shared.Examine;
-using Robust.Shared.GameObjects;
-using Robust.Shared.Localization;
-using Robust.Shared.Serialization.Manager.Attributes;
-using Robust.Shared.Utility;
-using Robust.Shared.ViewVariables;
-
-namespace Content.Server.Salvage
-{
- ///
- /// Mmmm, salvage
- /// To be clear, this component is SUPPOSED to later handle magnet attraction.
- ///
- [RegisterComponent]
- [ComponentProtoName("Salvage")]
- public class SalvageComponent : Component
- {
- ///
- /// Set this when salvage is no longer held by the magnet.
- /// This starts the countdown to complete destruction.
- ///
- [ViewVariables] public bool Killswitch = false;
-
- ///
- /// Time killswitch has been active for.
- ///
- [ViewVariables] public float KillswitchTime = 0.0f;
- }
-}
diff --git a/Content.Server/Salvage/SalvageMagnetComponent.cs b/Content.Server/Salvage/SalvageMagnetComponent.cs
deleted file mode 100644
index cded746d5c..0000000000
--- a/Content.Server/Salvage/SalvageMagnetComponent.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-using Content.Server.NodeContainer.NodeGroups;
-using Content.Server.NodeContainer.Nodes;
-using Content.Shared.Examine;
-using Robust.Shared.GameObjects;
-using Robust.Shared.Localization;
-using Robust.Shared.Serialization.Manager.Attributes;
-using Robust.Shared.Utility;
-using Robust.Shared.ViewVariables;
-using Robust.Shared.Maths;
-
-namespace Content.Server.Salvage
-{
- ///
- /// A salvage magnet.
- ///
- [RegisterComponent]
- [ComponentProtoName("SalvageMagnet")]
- public class SalvageMagnetComponent : Component
- {
- ///
- /// Offset relative to magnet that salvage should spawn.
- /// Keep in sync with marker sprite (if any???)
- ///
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("offset")]
- public Vector2 Offset = Vector2.Zero;
- }
-}
diff --git a/Content.Server/Salvage/SalvageMapPrototype.cs b/Content.Server/Salvage/SalvageMapPrototype.cs
deleted file mode 100644
index 98122fd903..0000000000
--- a/Content.Server/Salvage/SalvageMapPrototype.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using Content.Server.Objectives.Interfaces;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.Manager.Attributes;
-using Robust.Shared.ViewVariables;
-
-namespace Content.Server.Salvage
-{
- [Prototype("salvageMap")]
- public class SalvageMapPrototype : IPrototype
- {
- [ViewVariables]
- [DataField("id", required: true)]
- public string ID { get; } = default!;
-
- ///
- /// Relative directory path to the given map, i.e. `Maps/Salvage/test.yml`
- ///
- [ViewVariables]
- [DataField("mapPath", required: true)]
- public string MapPath { get; } = default!;
-
- ///
- /// Size *from 0,0* in units of the map (used to determine if it fits)
- ///
- [ViewVariables]
- [DataField("size", required: true)]
- public float Size { get; } = 1.0f;
-
- ///
- /// Name for admin use
- ///
- [ViewVariables]
- [DataField("name")]
- public string Name { get; } = "";
- }
-}
diff --git a/Content.Server/Salvage/SalvageSystem.cs b/Content.Server/Salvage/SalvageSystem.cs
deleted file mode 100644
index e051b45b5d..0000000000
--- a/Content.Server/Salvage/SalvageSystem.cs
+++ /dev/null
@@ -1,310 +0,0 @@
-using System;
-using System.Linq;
-using System.Collections.Generic;
-using System.Threading;
-using Content.Server.Administration.Logs;
-using Content.Server.Chat.Managers;
-using Content.Server.GameTicking;
-using Content.Shared.Administration.Logs;
-using Content.Shared.CCVar;
-using Content.Shared.Database;
-using Content.Shared.Examine;
-using Content.Shared.GameTicking;
-using Content.Shared.Interaction;
-using Content.Shared.Hands.Components;
-using Content.Shared.Popups;
-using Robust.Server.Player;
-using Robust.Server.Maps;
-using Robust.Shared.Audio;
-using Robust.Shared.Configuration;
-using Robust.Shared.Map;
-using Robust.Shared.Log;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Random;
-using Robust.Shared.GameObjects;
-using Robust.Shared.ViewVariables;
-using Robust.Shared.IoC;
-using Robust.Shared.Maths;
-using Robust.Shared.Localization;
-using Robust.Shared.Player;
-using Robust.Shared.Physics;
-using Robust.Shared.Timing;
-
-namespace Content.Server.Salvage
-{
- public class SalvageSystem : EntitySystem
- {
- [Dependency] private readonly IChatManager _chatManager = default!;
- [Dependency] private readonly IMapLoader _mapLoader = default!;
- [Dependency] private readonly IMapManager _mapManager = default!;
- [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
- [Dependency] private readonly IConfigurationManager _configurationManager = default!;
- [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
- [Dependency] private readonly IRobustRandom _random = default!;
- [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
-
- [ViewVariables]
- public EntityUid PulledObject = EntityUid.Invalid;
-
- [ViewVariables]
- public SalvageSystemState State = SalvageSystemState.Inactive;
-
- [ViewVariables]
- public float StateTimer = 0.0f;
-
- public const float PullInTimer = 2.0f;
- public const float HoldTimer = 240.0f;
- public const float LeaveTimer = 60.0f;
- public const float AngularVelocityRangeRadians = 0.25f;
-
- public override void Initialize()
- {
- base.Initialize();
-
- SubscribeLocalEvent(Reset);
- SubscribeLocalEvent(OnInteractHand);
- SubscribeLocalEvent(OnExamined);
- }
-
- private void OnExamined(EntityUid uid, SalvageMagnetComponent comp, ExaminedEvent args)
- {
- if (!args.IsInDetailsRange)
- return;
-
- switch (State)
- {
- case SalvageSystemState.Inactive:
- args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-inactive"));
- break;
- case SalvageSystemState.PullingIn:
- args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-pulling-in"));
- break;
- case SalvageSystemState.Active:
- args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-active", ("timeLeft", Math.Floor(StateTimer))));
- break;
- case SalvageSystemState.LettingGo:
- args.PushMarkup(Loc.GetString("salvage-system-magnet-examined-letting-go"));
- break;
- }
- }
-
- private void Reset(RoundRestartCleanupEvent ev)
- {
- PulledObject = EntityUid.Invalid;
- State = SalvageSystemState.Inactive;
- StateTimer = 0.0f;
- }
-
- private void OnInteractHand(EntityUid uid, SalvageMagnetComponent sm, InteractHandEvent args)
- {
- if (args.Handled)
- return;
- args.Handled = true;
- _popupSystem.PopupEntity(CallSalvage(), uid, Filter.Entities(args.User.Uid));
- }
-
- private bool TryGetSalvagePlacementLocation(out MapCoordinates coords, out Angle angle)
- {
- coords = MapCoordinates.Nullspace;
- angle = Angle.Zero;
- foreach (var (smc, tsc) in EntityManager.EntityQuery(true))
- {
- coords = new EntityCoordinates(smc.OwnerUid, smc.Offset).ToMap(EntityManager);
- var grid = tsc.GridID;
- if (grid != GridId.Invalid)
- {
- // Has a valid grid - synchronize angle so that salvage doesn't have to deal with cross-grid manipulation issues
- angle = _mapManager.GetGrid(grid).WorldRotation;
- }
- return true;
- }
- return false;
- }
-
- private IEnumerable GetAllSalvageMaps()
- {
- return _prototypeManager.EnumeratePrototypes();
- }
-
- // String is announced
- private string SpawnSalvage()
- {
- // In case of failure
- State = SalvageSystemState.Inactive;
-
- if (!TryGetSalvagePlacementLocation(out var spl, out var spAngle))
- {
- return Loc.GetString("salvage-system-announcement-spawn-magnet-lost");
- }
-
- SalvageMapPrototype? map = null;
-
- var forcedSalvage = _configurationManager.GetCVar(CCVars.SalvageForced);
- List allSalvageMaps;
- if (string.IsNullOrWhiteSpace(forcedSalvage))
- {
- allSalvageMaps = GetAllSalvageMaps().ToList();
- }
- else
- {
- allSalvageMaps = new();
- if (_prototypeManager.TryIndex(forcedSalvage, out map))
- {
- allSalvageMaps.Add(map);
- }
- else
- {
- Logger.ErrorS("c.s.salvage", $"Unable to get forced salvage map prototype {forcedSalvage}");
- }
- }
- for (var i = 0; i < allSalvageMaps.Count; i++)
- {
- map = _random.PickAndTake(allSalvageMaps);
-
- var box2 = Box2.CenteredAround(spl.Position, new Vector2(map.Size * 2.0f, map.Size * 2.0f));
- var box2rot = new Box2Rotated(box2, spAngle, spl.Position);
- if (_physicsSystem.GetCollidingEntities(spl.MapId, in box2rot).Select(x => EntityManager.HasComponent(x.OwnerUid)).Count() > 0)
- {
- // collided: set map to null so we don't spawn it
- map = null;
- }
- else
- {
- break;
- }
- }
-
- if (map == null)
- {
- return Loc.GetString("salvage-system-announcement-spawn-no-debris-available");
- }
-
- var bp = _mapLoader.LoadBlueprint(spl.MapId, map.MapPath);
- if (bp == null)
- {
- return Loc.GetString("salvage-system-announcement-spawn-debris-disintegrated");
- }
-
- PulledObject = bp.GridEntityId;
- EntityManager.AddComponent(PulledObject);
-
- var pulledTransform = EntityManager.GetComponent(PulledObject);
- pulledTransform.Coordinates = EntityCoordinates.FromMap(_mapManager, spl);
- pulledTransform.WorldRotation = spAngle;
-
- // Alright, salvage magnet is active.
- State = SalvageSystemState.Active;
- StateTimer = HoldTimer;
- return Loc.GetString("salvage-system-announcement-arrived", ("timeLeft", StateTimer));
- }
-
- private void PulledObjectDeathOrCaptureMonitor()
- {
- // This code runs in Active and LettingGo states.
- // It catches the situation when the pulled object is deleted by the killswitch,
- // and the situation when the salvage component is removed by admin intervention (officially a "capture")
- if (!EntityManager.EntityExists(PulledObject))
- {
- State = SalvageSystemState.Inactive;
- PulledObject = EntityUid.Invalid;
- _chatManager.DispatchStationAnnouncement(Loc.GetString("salvage-system-announcement-lost"), Loc.GetString("salvage-system-announcement-source"));
- }
- else if (!EntityManager.HasComponent(PulledObject))
- {
- State = SalvageSystemState.Inactive;
- PulledObject = EntityUid.Invalid;
- _chatManager.DispatchStationAnnouncement(Loc.GetString("salvage-system-announcement-captured"), Loc.GetString("salvage-system-announcement-source"));
- }
- }
-
- public override void Update(float frameTime)
- {
- switch (State)
- {
- case SalvageSystemState.Inactive:
- break;
- case SalvageSystemState.PullingIn:
- StateTimer -= frameTime;
- if (StateTimer <= 0.0f)
- {
- string report = SpawnSalvage();
- _chatManager.DispatchStationAnnouncement(report, Loc.GetString("salvage-system-announcement-source"));
- }
- break;
- case SalvageSystemState.Active:
- // magnet power usage = base + (time² * factor)
- // write base and factor into prototype!!!
- // also determine if magnet is unpowered and if so auto-lose???
- // CURRENTLY:
- StateTimer -= frameTime;
- if (StateTimer <= 0.0f)
- {
- ReturnSalvage();
- }
- PulledObjectDeathOrCaptureMonitor();
- break;
- case SalvageSystemState.LettingGo:
- PulledObjectDeathOrCaptureMonitor();
- break;
- }
- foreach (var smc in EntityManager.EntityQuery(true))
- {
- if (smc.Killswitch)
- {
- smc.KillswitchTime += frameTime;
- if (smc.KillswitchTime >= LeaveTimer)
- {
- EntityManager.QueueDeleteEntity(smc.OwnerUid);
- }
- }
- }
- }
-
- public string CallSalvage()
- {
- // State error reports
- if (State == SalvageSystemState.LettingGo)
- return Loc.GetString("salvage-system-report-cooling-down");
- if (State != SalvageSystemState.Inactive)
- return Loc.GetString("salvage-system-report-already-active");
- // Confirm
- State = SalvageSystemState.PullingIn;
- StateTimer = PullInTimer;
- return Loc.GetString("salvage-system-report-activate-success");
- }
-
- public string ReturnSalvage()
- {
- if (State != SalvageSystemState.Active)
- return Loc.GetString("salvage-system-report-not-active");
- // Confirm
- State = SalvageSystemState.LettingGo;
- // Enable killswitch, announce, report success
- if (EntityManager.TryGetComponent(PulledObject, out var salvage))
- {
- // Schedule this to auto-delete (and ideally fly away from the station???)
- salvage.Killswitch = true;
- // Note "losing" is only given on killswitch activation.
- // The capture message will be given instead if the salvage component is missing.
- _chatManager.DispatchStationAnnouncement(Loc.GetString("salvage-system-announcement-losing", ("timeLeft", LeaveTimer)), Loc.GetString("salvage-system-announcement-source"));
- }
- return Loc.GetString("salvage-system-report-deactivate-success");
- }
-
- public void DeleteSalvage()
- {
- if ((State != SalvageSystemState.Active) && (State != SalvageSystemState.LettingGo))
- return;
- EntityManager.QueueDeleteEntity(PulledObject);
- }
- }
-
- public enum SalvageSystemState
- {
- Inactive,
- PullingIn, // Timer: Time left to completion
- Active, // Timer: Time left to letting go
- LettingGo
- }
-}
-
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index dd22151212..3986dfbfd4 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -575,15 +575,5 @@ namespace Content.Shared.CCVar
///
public static readonly CVarDef RestrictedNames =
CVarDef.Create("ic.restricted_names", true, CVar.SERVER | CVar.REPLICATED);
-
- /*
- * Salvage
- */
-
- ///
- /// Forced salvage map prototype name (if empty, randomly selected)
- ///
- public static readonly CVarDef
- SalvageForced = CVarDef.Create("salvage.forced", "", CVar.SERVERONLY);
}
}
diff --git a/Resources/Locale/en-US/salvage/salvage-system.ftl b/Resources/Locale/en-US/salvage/salvage-system.ftl
deleted file mode 100644
index 137fd492d4..0000000000
--- a/Resources/Locale/en-US/salvage/salvage-system.ftl
+++ /dev/null
@@ -1,22 +0,0 @@
-salvage-system-announcement-source = Salvage Control System
-salvage-system-announcement-arrived = A piece of salvagable debris has been pulled in. Estimate: Can hold for {$timeLeft} seconds.
-salvage-system-announcement-losing = The magnet is no longer able to hold the salvagable debris. Estimate: {$timeLeft} seconds to complete loss.
-salvage-system-announcement-lost = The salvagable debris has been lost.
-salvage-system-announcement-captured = The salvagable debris has been successfully captured.
-
-salvage-system-announcement-spawn-magnet-lost = The salvage magnet has been lost.
-salvage-system-announcement-spawn-no-debris-available = No debris could be recovered by the salvage magnet.
-salvage-system-announcement-spawn-debris-disintegrated = Debris disintegrated during orbital transfer.
-
-salvage-system-report-already-active = The salvage magnet is already active.
-salvage-system-report-cooling-down = The salvage magnet is cooling down.
-salvage-system-report-activate-success = The salvage magnet is pulling in a piece of debris!
-
-salvage-system-report-not-active = No object / not stably pulled in
-salvage-system-report-deactivate-success = The salvage magnet has been deactivated.
-
-salvage-system-magnet-examined-inactive = The salvage magnet is inactive.
-salvage-system-magnet-examined-pulling-in = The salvage magnet is attempting to pull in salvage.
-salvage-system-magnet-examined-active = The salvage magnet is holding salvage in place. Can hold for {$timeLeft} seconds.
-salvage-system-magnet-examined-letting-go = The salvage magnet is cooling down.
-
diff --git a/Resources/Maps/Salvage/medium-1.yml b/Resources/Maps/Salvage/medium-1.yml
deleted file mode 100644
index bf7082ccc7..0000000000
--- a/Resources/Maps/Salvage/medium-1.yml
+++ /dev/null
@@ -1,1697 +0,0 @@
-meta:
- format: 2
- name: DemoStation
- author: Space-Wizards
- postmapinit: false
-tilemap:
- 0: space
- 1: floor_asteroid_coarse_sand0
- 2: floor_asteroid_coarse_sand1
- 3: floor_asteroid_coarse_sand2
- 4: floor_asteroid_coarse_sand_dug
- 5: floor_asteroid_sand
- 6: floor_asteroid_tile
- 7: floor_blue
- 8: floor_blue_circuit
- 9: floor_dark
- 10: floor_elevator_shaft
- 11: floor_freezer
- 12: floor_glass
- 13: floor_gold
- 14: floor_green_circuit
- 15: floor_hydro
- 16: floor_lino
- 17: floor_mono
- 18: floor_reinforced
- 19: floor_rglass
- 20: floor_rock_vault
- 21: floor_showroom
- 22: floor_silver
- 23: floor_snow
- 24: floor_steel
- 25: floor_steel_dirty
- 26: floor_techmaint
- 27: floor_white
- 28: floor_wood
- 29: lattice
- 30: plating
- 31: underplating
-grids:
-- settings:
- chunksize: 16
- tilesize: 1
- chunks:
- - ind: "-1,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAeAAAAHgAAAB4AAAAeAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAYAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAYAAAAGAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAHgAAABgAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAABgAAAAYAAAAGAAAAA==
- - ind: "0,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAHgAAAB4AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAYAAAAGAAAABgAAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAGAAAAB4AAAAYAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAABgAAAAeAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "-1,0"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAdAAAAHgAAABkAAAAYAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAGQAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAGQAAABkAAAAZAAAAHgAAAB4AAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHgAAAB4AAAAZAAAAGQAAABkAAAAZAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAeAAAAGQAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHgAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "0,0"
- tiles: GAAAABgAAAAeAAAAHgAAAB4AAAAeAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAYAAAAHgAAAB4AAAAeAAAAHgAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAABkAAAAeAAAAHgAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAZAAAAGQAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-entities:
-- uid: 0
- components:
- - pos: 0.5,0.5
- parent: null
- type: Transform
- - index: 0
- type: MapGrid
- - angularDamping: 0.3
- fixedRotation: False
- bodyType: Dynamic
- type: Physics
- - fixtures:
- - shape: !type:PolygonShape
- vertices:
- - -1,-8
- - -1,-7
- - -6,-7
- - -6,-8
- id: grid_chunk--6--8
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 20
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-7
- - 0,-6
- - -6,-6
- - -6,-7
- id: grid_chunk--6--7
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-6
- - 0,-5
- - -5,-5
- - -5,-6
- id: grid_chunk--5--6
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 20
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-5
- - 0,-3
- - -4,-3
- - -4,-5
- id: grid_chunk--4--5
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-3
- - 0,-2
- - -5,-2
- - -5,-3
- id: grid_chunk--5--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 20
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-2
- - 0,-1
- - -6,-1
- - -6,-2
- id: grid_chunk--6--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-1
- - 0,0
- - -4,0
- - -4,-1
- id: grid_chunk--4--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 5,-8
- - 5,-7
- - 0,-7
- - 0,-8
- id: grid_chunk-0--8
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 20
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,-7
- - 1,-6
- - 0,-6
- - 0,-7
- id: grid_chunk-0--7
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 5,-7
- - 5,-6
- - 4,-6
- - 4,-7
- id: grid_chunk-4--7
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 6,-6
- - 6,-5
- - 3,-5
- - 3,-6
- id: grid_chunk-3--6
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,-5
- - 7,-4
- - 1,-4
- - 1,-5
- id: grid_chunk-1--5
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 6,-4
- - 6,0
- - 0,0
- - 0,-4
- id: grid_chunk-0--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 96
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,0
- - 0,1
- - -6,1
- - -6,0
- id: grid_chunk--6-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,1
- - 0,2
- - -8,2
- - -8,1
- id: grid_chunk--8-1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,2
- - 0,3
- - -7,3
- - -7,2
- id: grid_chunk--7-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 28
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,3
- - 0,4
- - -8,4
- - -8,3
- id: grid_chunk--8-3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,4
- - 0,5
- - -6,5
- - -6,4
- id: grid_chunk--6-4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,5
- - 0,6
- - -4,6
- - -4,5
- id: grid_chunk--4-5
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,6
- - 0,7
- - -1,7
- - -1,6
- id: grid_chunk--1-6
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,0
- - 7,2
- - 0,2
- - 0,0
- id: grid_chunk-0-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 56
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,2
- - 3,3
- - 0,3
- - 0,2
- id: grid_chunk-0-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 5,3
- - 5,4
- - 0,4
- - 0,3
- id: grid_chunk-0-3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 20
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 6,4
- - 6,5
- - 0,5
- - 0,4
- id: grid_chunk-0-4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,5
- - 7,6
- - 0,6
- - 0,5
- id: grid_chunk-0-5
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 28
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,6
- - 1,7
- - 0,7
- - 0,6
- id: grid_chunk-0-6
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 5,6
- - 5,7
- - 4,7
- - 4,6
- id: grid_chunk-4-6
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- type: Fixtures
- - gravityShakeSound: !type:SoundPathSpecifier
- path: /Audio/Effects/alert.ogg
- type: Gravity
- - tiles:
- -8,-8: 0
- -8,-7: 0
- -8,-6: 0
- -8,-5: 0
- -8,-4: 0
- -8,-3: 0
- -8,-2: 0
- -8,-1: 0
- -7,-8: 0
- -7,-1: 0
- -6,-8: 0
- -6,-1: 0
- -5,-8: 0
- -5,-1: 0
- -4,-8: 0
- -4,-4: 0
- -4,-3: 0
- -4,-2: 0
- -4,-1: 0
- -3,-8: 0
- -3,-4: 0
- -3,-1: 0
- -2,-8: 0
- -2,-4: 0
- -2,-2: 0
- -2,-1: 0
- -1,-8: 0
- -1,-7: 0
- -1,-6: 0
- -1,-5: 0
- -1,-4: 0
- -1,-3: 0
- -1,-2: 0
- -1,-1: 0
- 0,-8: 0
- 0,-4: 0
- 0,-2: 0
- 0,-1: 0
- 1,-8: 0
- 1,-4: 0
- 1,-1: 0
- 2,-8: 0
- 2,-4: 0
- 2,-3: 0
- 2,-2: 0
- 2,-1: 0
- 3,-8: 0
- 3,-1: 0
- 4,-8: 0
- 4,-1: 0
- 5,-8: 0
- 5,-1: 0
- 6,-8: 0
- 6,-7: 0
- 6,-6: 0
- 6,-5: 0
- 6,-4: 0
- 6,-3: 0
- 6,-2: 0
- 6,-1: 0
- -8,0: 0
- -8,1: 0
- -8,2: 0
- -8,3: 0
- -8,4: 0
- -8,5: 0
- -8,6: 0
- -7,6: 0
- -6,6: 0
- -5,6: 0
- -4,0: 0
- -4,1: 0
- -4,2: 1
- -4,6: 0
- -3,2: 0
- -3,6: 0
- -2,0: 0
- -2,2: 0
- -2,6: 0
- -1,0: 0
- -1,1: 0
- -1,2: 0
- -1,3: 1
- -1,4: 1
- -1,5: 0
- -1,6: 0
- 0,0: 0
- 0,2: 0
- 0,6: 0
- 1,2: 0
- 1,6: 0
- 2,0: 0
- 2,1: 0
- 2,2: 0
- 2,6: 0
- 3,6: 0
- 4,6: 0
- 5,6: 0
- 6,0: 0
- 6,1: 0
- 6,2: 0
- 6,3: 0
- 6,4: 0
- 6,5: 0
- 6,6: 0
- -6,-7: 0
- -6,-2: 0
- -5,-7: 0
- -5,-6: 0
- -5,-3: 0
- -5,-2: 0
- -4,-7: 0
- -4,-6: 0
- -4,-5: 0
- -3,-7: 0
- -3,-6: 0
- -3,-5: 0
- -3,-3: 0
- -3,-2: 0
- -2,-7: 0
- -2,-6: 0
- -2,-5: 0
- -2,-3: 0
- 0,-7: 0
- 0,-3: 0
- 1,-5: 0
- 1,-3: 0
- 1,-2: 0
- 2,-5: 0
- 3,-6: 0
- 3,-5: 0
- 3,-4: 0
- 3,-3: 0
- 3,-2: 0
- 4,-7: 0
- 4,-6: 0
- 4,-5: 0
- 4,-4: 0
- 4,-3: 0
- 4,-2: 0
- 5,-6: 0
- 5,-5: 0
- 5,-4: 0
- 5,-3: 0
- 5,-2: 0
- -7,1: 0
- -7,2: 0
- -7,3: 0
- -6,0: 0
- -6,1: 0
- -6,2: 1
- -6,3: 0
- -6,4: 0
- -5,0: 0
- -5,1: 0
- -5,2: 1
- -5,3: 1
- -5,4: 0
- -4,3: 1
- -4,4: 0
- -4,5: 0
- -3,0: 0
- -3,1: 0
- -3,3: 1
- -3,4: 0
- -3,5: 0
- -2,1: 0
- -2,3: 1
- -2,4: 1
- -2,5: 0
- 0,1: 0
- 0,3: 1
- 0,4: 1
- 0,5: 0
- 1,0: 0
- 1,1: 0
- 1,3: 1
- 1,4: 1
- 1,5: 0
- 2,3: 0
- 2,4: 1
- 2,5: 0
- 3,0: 0
- 3,1: 0
- 3,3: 0
- 3,4: 0
- 3,5: 0
- 4,0: 0
- 4,1: 0
- 4,3: 0
- 4,4: 0
- 4,5: 0
- 5,0: 0
- 5,1: 0
- 5,4: 0
- 5,5: 0
- uniqueMixes:
- - volume: 2500
- temperature: 293.15
- moles:
- - 21.824879
- - 82.10312
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 5000
- moles:
- - 6666.982
- - 0
- - 0
- - 6666.982
- - 0
- - 0
- - 0
- - 0
- type: GridAtmosphere
-- uid: 1
- type: WallSolid
- components:
- - pos: -4.5,-5.5
- parent: 0
- type: Transform
-- uid: 2
- type: WallSolid
- components:
- - pos: -4.5,-6.5
- parent: 0
- type: Transform
-- uid: 3
- type: WallSolid
- components:
- - pos: -3.5,-6.5
- parent: 0
- type: Transform
-- uid: 4
- type: WallSolid
- components:
- - pos: -2.5,-6.5
- parent: 0
- type: Transform
-- uid: 5
- type: WallSolid
- components:
- - pos: -1.5,-6.5
- parent: 0
- type: Transform
-- uid: 6
- type: WallSolid
- components:
- - pos: -4.5,-1.5
- parent: 0
- type: Transform
-- uid: 7
- type: Girder
- components:
- - pos: -4.5,-2.5
- parent: 0
- type: Transform
-- uid: 8
- type: WallSolid
- components:
- - pos: -0.5,-1.5
- parent: 0
- type: Transform
-- uid: 9
- type: WallSolid
- components:
- - pos: -0.5,-2.5
- parent: 0
- type: Transform
-- uid: 10
- type: WallSolid
- components:
- - pos: -0.5,-3.5
- parent: 0
- type: Transform
-- uid: 11
- type: WallSolid
- components:
- - pos: -0.5,-4.5
- parent: 0
- type: Transform
-- uid: 12
- type: WallSolid
- components:
- - pos: -3.5,-1.5
- parent: 0
- type: Transform
-- uid: 13
- type: WallSolid
- components:
- - pos: -2.5,-1.5
- parent: 0
- type: Transform
-- uid: 14
- type: WallSolid
- components:
- - pos: -3.5,-0.5
- parent: 0
- type: Transform
-- uid: 15
- type: WallSolid
- components:
- - pos: -3.5,0.5
- parent: 0
- type: Transform
-- uid: 16
- type: WallSolid
- components:
- - pos: -3.5,1.5
- parent: 0
- type: Transform
-- uid: 17
- type: WallSolid
- components:
- - pos: -2.5,1.5
- parent: 0
- type: Transform
-- uid: 18
- type: WallSolid
- components:
- - pos: -2.5,2.5
- parent: 0
- type: Transform
-- uid: 19
- type: WallSolid
- components:
- - pos: -1.5,2.5
- parent: 0
- type: Transform
-- uid: 20
- type: Girder
- components:
- - pos: -0.5,-5.5
- parent: 0
- type: Transform
-- uid: 21
- type: WallSolid
- components:
- - pos: 0.5,2.5
- parent: 0
- type: Transform
-- uid: 22
- type: WallSolid
- components:
- - pos: 1.5,2.5
- parent: 0
- type: Transform
-- uid: 23
- type: WallSolid
- components:
- - pos: 2.5,2.5
- parent: 0
- type: Transform
-- uid: 24
- type: WallSolid
- components:
- - pos: 2.5,1.5
- parent: 0
- type: Transform
-- uid: 25
- type: WallSolid
- components:
- - pos: 2.5,0.5
- parent: 0
- type: Transform
-- uid: 26
- type: WallSolid
- components:
- - pos: 2.5,-0.5
- parent: 0
- type: Transform
-- uid: 27
- type: WallSolid
- components:
- - pos: 2.5,-1.5
- parent: 0
- type: Transform
-- uid: 28
- type: WallSolid
- components:
- - pos: 0.5,-1.5
- parent: 0
- type: Transform
-- uid: 29
- type: WallSolid
- components:
- - pos: 0.5,-3.5
- parent: 0
- type: Transform
-- uid: 30
- type: WallSolid
- components:
- - pos: 1.5,-3.5
- parent: 0
- type: Transform
-- uid: 31
- type: WallSolid
- components:
- - pos: 2.5,-3.5
- parent: 0
- type: Transform
-- uid: 32
- type: WallSolid
- components:
- - pos: 3.5,-3.5
- parent: 0
- type: Transform
-- uid: 33
- type: WallSolid
- components:
- - pos: 4.5,-3.5
- parent: 0
- type: Transform
-- uid: 34
- type: WallSolid
- components:
- - pos: 4.5,-2.5
- parent: 0
- type: Transform
-- uid: 35
- type: WallSolid
- components:
- - pos: 4.5,-1.5
- parent: 0
- type: Transform
-- uid: 36
- type: WallSolid
- components:
- - pos: 4.5,-0.5
- parent: 0
- type: Transform
-- uid: 37
- type: WallSolid
- components:
- - pos: 4.5,0.5
- parent: 0
- type: Transform
-- uid: 38
- type: Girder
- components:
- - pos: 4.5,1.5
- parent: 0
- type: Transform
-- uid: 39
- type: AirlockGlass
- components:
- - pos: 3.5,0.5
- parent: 0
- type: Transform
- - containers:
- board: !type:Container
- ents: []
- type: ContainerContainer
-- uid: 40
- type: AirlockGlass
- components:
- - pos: 1.5,-1.5
- parent: 0
- type: Transform
- - containers:
- board: !type:Container
- ents: []
- type: ContainerContainer
-- uid: 41
- type: AirlockGlass
- components:
- - pos: -1.5,-1.5
- parent: 0
- type: Transform
- - containers:
- board: !type:Container
- ents: []
- type: ContainerContainer
-- uid: 42
- type: WallSolid
- components:
- - pos: -2.5,4.5
- parent: 0
- type: Transform
-- uid: 43
- type: WallSolid
- components:
- - pos: -2.5,5.5
- parent: 0
- type: Transform
-- uid: 44
- type: WallSolid
- components:
- - pos: -1.5,5.5
- parent: 0
- type: Transform
-- uid: 45
- type: WallSolid
- components:
- - pos: -0.5,5.5
- parent: 0
- type: Transform
-- uid: 46
- type: WallSolid
- components:
- - pos: 0.5,5.5
- parent: 0
- type: Transform
-- uid: 47
- type: WallSolid
- components:
- - pos: 1.5,5.5
- parent: 0
- type: Transform
-- uid: 48
- type: WallSolid
- components:
- - pos: 2.5,5.5
- parent: 0
- type: Transform
-- uid: 49
- type: WallSolid
- components:
- - pos: 3.5,5.5
- parent: 0
- type: Transform
-- uid: 50
- type: WallSolid
- components:
- - pos: 3.5,4.5
- parent: 0
- type: Transform
-- uid: 51
- type: WallSolid
- components:
- - pos: 2.5,3.5
- parent: 0
- type: Transform
-- uid: 52
- type: WallSolid
- components:
- - pos: 3.5,3.5
- parent: 0
- type: Transform
-- uid: 53
- type: WallSolid
- components:
- - pos: -4.5,1.5
- parent: 0
- type: Transform
-- uid: 54
- type: WallSolid
- components:
- - pos: -5.5,1.5
- parent: 0
- type: Transform
-- uid: 55
- type: WallSolid
- components:
- - pos: -6.5,1.5
- parent: 0
- type: Transform
-- uid: 56
- type: WallSolid
- components:
- - pos: -6.5,2.5
- parent: 0
- type: Transform
-- uid: 57
- type: WallSolid
- components:
- - pos: -6.5,3.5
- parent: 0
- type: Transform
-- uid: 58
- type: WallSolid
- components:
- - pos: -4.5,4.5
- parent: 0
- type: Transform
-- uid: 59
- type: WallSolid
- components:
- - pos: -3.5,4.5
- parent: 0
- type: Transform
-- uid: 60
- type: WallSolid
- components:
- - pos: -5.5,3.5
- parent: 0
- type: Transform
-- uid: 61
- type: WallSolid
- components:
- - pos: -5.5,4.5
- parent: 0
- type: Transform
-- uid: 62
- type: SalvageCanisterSpawner
- components:
- - pos: -5.5,2.5
- parent: 0
- type: Transform
-- uid: 63
- type: SalvageCanisterSpawner
- components:
- - pos: -4.5,2.5
- parent: 0
- type: Transform
-- uid: 64
- type: StorageCanister
- components:
- - pos: -1.5,4.5
- parent: 0
- type: Transform
-- uid: 65
- type: AirlockEngineering
- components:
- - pos: -0.5,2.5
- parent: 0
- type: Transform
- - containers:
- board: !type:Container
- ents: []
- type: ContainerContainer
-- uid: 66
- type: Girder
- components:
- - pos: 3.5,-4.5
- parent: 0
- type: Transform
-- uid: 67
- type: Girder
- components:
- - pos: 3.5,-5.5
- parent: 0
- type: Transform
-- uid: 68
- type: Girder
- components:
- - pos: 5.5,-1.5
- parent: 0
- type: Transform
-- uid: 69
- type: SalvageMaterialCrateSpawner
- components:
- - pos: 2.5,4.5
- parent: 0
- type: Transform
-- uid: 70
- type: SalvageMaterialCrateSpawner
- components:
- - pos: 1.5,4.5
- parent: 0
- type: Transform
-- uid: 71
- type: SalvageMaterialCrateSpawner
- components:
- - pos: 0.5,3.5
- parent: 0
- type: Transform
-- uid: 72
- type: SalvageMaterialCrateSpawner
- components:
- - pos: 1.5,3.5
- parent: 0
- type: Transform
-- uid: 73
- type: SalvageMaterialCrateSpawner
- components:
- - pos: 0.5,4.5
- parent: 0
- type: Transform
-- uid: 74
- type: SalvageMobSpawner
- components:
- - pos: 3.5,-2.5
- parent: 0
- type: Transform
-- uid: 75
- type: SalvageMobSpawner
- components:
- - pos: 1.5,-2.5
- parent: 0
- type: Transform
-- uid: 76
- type: SalvageMobSpawner
- components:
- - pos: 3.5,-0.5
- parent: 0
- type: Transform
-- uid: 77
- type: SalvageMobSpawner
- components:
- - pos: -3.5,-2.5
- parent: 0
- type: Transform
-- uid: 78
- type: SalvageMobSpawner
- components:
- - pos: -3.5,-5.5
- parent: 0
- type: Transform
-- uid: 79
- type: SalvageMobSpawner
- components:
- - pos: -1.5,-5.5
- parent: 0
- type: Transform
-- uid: 80
- type: SalvageMobSpawner
- components:
- - pos: -1.5,1.5
- parent: 0
- type: Transform
-- uid: 81
- type: SalvageMobSpawner
- components:
- - pos: 1.5,1.5
- parent: 0
- type: Transform
-- uid: 82
- type: SalvageMobSpawner
- components:
- - pos: -2.5,-0.5
- parent: 0
- type: Transform
-- uid: 83
- type: Table
- components:
- - pos: -0.5,0.5
- parent: 0
- type: Transform
-- uid: 84
- type: Table
- components:
- - pos: 0.5,0.5
- parent: 0
- type: Transform
-- uid: 85
- type: PaperWrittenSalvageLoreMedium1PlasmaTrap
- components:
- - pos: 0.48327154,0.5698495
- parent: 0
- type: Transform
-- uid: 86
- type: SalvageCanisterSpawner
- components:
- - pos: -3.5,3.5
- parent: 0
- type: Transform
-- uid: 87
- type: SalvageCanisterSpawner
- components:
- - pos: -3.5,2.5
- parent: 0
- type: Transform
-- uid: 88
- type: SalvageCanisterSpawner
- components:
- - pos: -4.5,3.5
- parent: 0
- type: Transform
-- uid: 89
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -1.5,3.5
- parent: 0
- type: Transform
-- uid: 90
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -1.5,4.5
- parent: 0
- type: Transform
-- uid: 91
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -0.5,4.5
- parent: 0
- type: Transform
-- uid: 92
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -3.5,-2.5
- parent: 0
- type: Transform
-- uid: 93
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -3.5,-3.5
- parent: 0
- type: Transform
-- uid: 94
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -0.5,3.5
- parent: 0
- type: Transform
-- uid: 95
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: 0.5,4.5
- parent: 0
- type: Transform
-- uid: 96
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: 0.5,3.5
- parent: 0
- type: Transform
-- uid: 97
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: 1.5,4.5
- parent: 0
- type: Transform
-- uid: 98
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: 1.5,3.5
- parent: 0
- type: Transform
-- uid: 99
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: 2.5,4.5
- parent: 0
- type: Transform
-- uid: 100
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -2.5,3.5
- parent: 0
- type: Transform
-- uid: 101
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -3.5,3.5
- parent: 0
- type: Transform
-- uid: 102
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -4.5,3.5
- parent: 0
- type: Transform
-- uid: 103
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -3.5,2.5
- parent: 0
- type: Transform
-- uid: 104
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -4.5,2.5
- parent: 0
- type: Transform
-- uid: 105
- type: AtmosFixInstantPlasmaFireMarker
- components:
- - pos: -5.5,2.5
- parent: 0
- type: Transform
-- uid: 106
- type: SalternSubstation
- components:
- - pos: 0.5,-2.5
- parent: 0
- type: Transform
- - startingCharge: 3990010
- type: Battery
- - supplyRampPosition: 2.3437593
- type: PowerNetworkBattery
-- uid: 107
- type: CableMV
- components:
- - pos: 0.5,-2.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 108
- type: CableMV
- components:
- - pos: 1.5,-2.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 109
- type: CableMV
- components:
- - pos: 1.5,-1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 110
- type: CableMV
- components:
- - pos: 1.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 111
- type: CableMV
- components:
- - pos: 1.5,0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 112
- type: CableMV
- components:
- - pos: 1.5,1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 113
- type: CableMV
- components:
- - pos: 1.5,2.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 114
- type: SalternApc
- components:
- - pos: 1.5,2.5
- parent: 0
- type: Transform
- - startingCharge: 12000
- type: Battery
-- uid: 115
- type: CableApcExtension
- components:
- - pos: 1.5,2.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 116
- type: CableApcExtension
- components:
- - pos: 1.5,1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 117
- type: CableApcExtension
- components:
- - pos: 1.5,0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 118
- type: CableApcExtension
- components:
- - pos: 1.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 119
- type: CableApcExtension
- components:
- - pos: 0.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 120
- type: CableApcExtension
- components:
- - pos: -0.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 121
- type: CableApcExtension
- components:
- - pos: -1.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 122
- type: CableApcExtension
- components:
- - pos: -2.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 123
- type: CableApcExtension
- components:
- - pos: -1.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 124
- type: CableApcExtension
- components:
- - pos: -1.5,-1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 125
- type: CableApcExtension
- components:
- - pos: -1.5,-2.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 126
- type: CableApcExtension
- components:
- - pos: -1.5,-3.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 127
- type: CableApcExtension
- components:
- - pos: -1.5,-4.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 128
- type: CableApcExtension
- components:
- - pos: -2.5,-4.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 129
- type: CableApcExtension
- components:
- - pos: -0.5,0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 130
- type: CableApcExtension
- components:
- - pos: -0.5,1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 131
- type: CableApcExtension
- components:
- - pos: 1.5,3.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 132
- type: CableApcExtension
- components:
- - pos: 1.5,4.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 133
- type: CableApcExtension
- components:
- - pos: 0.5,4.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 134
- type: CableApcExtension
- components:
- - pos: -0.5,4.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 135
- type: CableApcExtension
- components:
- - pos: -1.5,4.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 136
- type: Poweredlight
- components:
- - pos: -0.5,4.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 137
- type: Poweredlight
- components:
- - rot: -1.5707963267948966 rad
- pos: 1.5,0.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 138
- type: Poweredlight
- components:
- - rot: -1.5707963267948966 rad
- pos: -1.5,-3.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 139
- type: Poweredlight
- components:
- - rot: 1.5707963267948966 rad
- pos: -2.5,0.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 140
- type: Poweredlight
- components:
- - pos: 2.5,-2.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 141
- type: Poweredlight
- components:
- - rot: 1.5707963267948966 rad
- pos: 3.5,-1.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 142
- type: CableApcExtension
- components:
- - pos: 1.5,-1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 143
- type: CableApcExtension
- components:
- - pos: 1.5,-2.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 144
- type: CableApcExtension
- components:
- - pos: 2.5,-2.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 145
- type: CableApcExtension
- components:
- - pos: 3.5,-2.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 146
- type: CableApcExtension
- components:
- - pos: 3.5,-1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-...
diff --git a/Resources/Maps/Salvage/medium-template.yml b/Resources/Maps/Salvage/medium-template.yml
deleted file mode 100644
index d1eca2d68f..0000000000
--- a/Resources/Maps/Salvage/medium-template.yml
+++ /dev/null
@@ -1,407 +0,0 @@
-meta:
- format: 2
- name: DemoStation
- author: Space-Wizards
- postmapinit: false
-tilemap:
- 0: space
- 1: floor_asteroid_coarse_sand0
- 2: floor_asteroid_coarse_sand1
- 3: floor_asteroid_coarse_sand2
- 4: floor_asteroid_coarse_sand_dug
- 5: floor_asteroid_sand
- 6: floor_asteroid_tile
- 7: floor_blue
- 8: floor_blue_circuit
- 9: floor_dark
- 10: floor_elevator_shaft
- 11: floor_freezer
- 12: floor_glass
- 13: floor_gold
- 14: floor_green_circuit
- 15: floor_hydro
- 16: floor_lino
- 17: floor_mono
- 18: floor_reinforced
- 19: floor_rglass
- 20: floor_rock_vault
- 21: floor_showroom
- 22: floor_silver
- 23: floor_snow
- 24: floor_steel
- 25: floor_steel_dirty
- 26: floor_techmaint
- 27: floor_white
- 28: floor_wood
- 29: lattice
- 30: plating
- 31: underplating
-grids:
-- settings:
- chunksize: 16
- tilesize: 1
- chunks:
- - ind: "-1,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAADQAAAA==
- - ind: "0,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "-1,0"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "0,0"
- tiles: HQAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-entities:
-- uid: 0
- components:
- - pos: 0.5,0.5
- parent: null
- type: Transform
- - index: 0
- type: MapGrid
- - angularDamping: 0.3
- fixedRotation: False
- bodyType: Dynamic
- type: Physics
- - fixtures:
- - shape: !type:PolygonShape
- vertices:
- - 0,-2
- - 0,-1
- - -2,-1
- - -2,-2
- id: grid_chunk--2--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -3,-3
- - -3,-1
- - -4,-1
- - -4,-3
- id: grid_chunk--4--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -7,-7
- - -7,-1
- - -8,-1
- - -8,-7
- id: grid_chunk--8--7
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-3
- - 0,-2
- - -1,-2
- - -1,-3
- id: grid_chunk--1--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-4
- - 0,-3
- - -4,-3
- - -4,-4
- id: grid_chunk--4--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,-7
- - 7,-1
- - 6,-1
- - 6,-7
- id: grid_chunk-6--7
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-3
- - 3,-1
- - 2,-1
- - 2,-3
- id: grid_chunk-2--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,-2
- - 1,-1
- - 0,-1
- - 0,-2
- id: grid_chunk-0--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-4
- - 3,-3
- - 0,-3
- - 0,-4
- id: grid_chunk-0--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,3
- - 0,6
- - -1,6
- - -1,3
- id: grid_chunk--1-3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -7,0
- - -7,6
- - -8,6
- - -8,0
- id: grid_chunk--8-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,2
- - 0,3
- - -4,3
- - -4,2
- id: grid_chunk--4-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,1
- - 0,2
- - -1,2
- - -1,1
- id: grid_chunk--1-1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,0
- - 7,6
- - 6,6
- - 6,0
- id: grid_chunk-6-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,2
- - 3,3
- - 0,3
- - 0,2
- id: grid_chunk-0-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,0
- - 3,2
- - 2,2
- - 2,0
- id: grid_chunk-2-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,6
- - 0,7
- - -8,7
- - -8,6
- id: grid_chunk--8-6
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-1
- - 0,0
- - -8,0
- - -8,-1
- id: grid_chunk--8--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-7
- - 0,-4
- - -1,-4
- - -1,-7
- id: grid_chunk--1--7
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-8
- - 0,-7
- - -8,-7
- - -8,-8
- id: grid_chunk--8--8
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,-1
- - 7,0
- - 0,0
- - 0,-1
- id: grid_chunk-0--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 28
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,-8
- - 7,-7
- - 0,-7
- - 0,-8
- id: grid_chunk-0--8
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 28
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 7,6
- - 7,7
- - 0,7
- - 0,6
- id: grid_chunk-0-6
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 28
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -3,0
- - -3,2
- - -4,2
- - -4,0
- id: grid_chunk--4-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,0
- - 0,1
- - -2,1
- - -2,0
- id: grid_chunk--2-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,0
- - 1,1
- - 0,1
- - 0,0
- id: grid_chunk-0-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- type: Fixtures
- - gravityShakeSound: !type:SoundPathSpecifier
- path: /Audio/Effects/alert.ogg
- type: Gravity
-...
diff --git a/Resources/Maps/Salvage/small-1.yml b/Resources/Maps/Salvage/small-1.yml
deleted file mode 100644
index f295fa82ec..0000000000
--- a/Resources/Maps/Salvage/small-1.yml
+++ /dev/null
@@ -1,318 +0,0 @@
-meta:
- format: 2
- name: DemoStation
- author: Space-Wizards
- postmapinit: false
-tilemap:
- 0: space
- 1: floor_asteroid_coarse_sand0
- 2: floor_asteroid_coarse_sand1
- 3: floor_asteroid_coarse_sand2
- 4: floor_asteroid_coarse_sand_dug
- 5: floor_asteroid_sand
- 6: floor_asteroid_tile
- 7: floor_blue
- 8: floor_blue_circuit
- 9: floor_dark
- 10: floor_elevator_shaft
- 11: floor_freezer
- 12: floor_glass
- 13: floor_gold
- 14: floor_green_circuit
- 15: floor_hydro
- 16: floor_lino
- 17: floor_mono
- 18: floor_reinforced
- 19: floor_rglass
- 20: floor_rock_vault
- 21: floor_showroom
- 22: floor_silver
- 23: floor_snow
- 24: floor_steel
- 25: floor_steel_dirty
- 26: floor_techmaint
- 27: floor_white
- 28: floor_wood
- 29: lattice
- 30: plating
- 31: underplating
-grids:
-- settings:
- chunksize: 16
- tilesize: 1
- chunks:
- - ind: "-1,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAA==
- - ind: "0,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "0,0"
- tiles: HgAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "-1,0"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-entities:
-- uid: 0
- components:
- - pos: 0.5, 0.5
- parent: null
- type: Transform
- - index: 0
- type: MapGrid
- - angularDamping: 0.3
- fixedRotation: False
- bodyType: Dynamic
- type: Physics
- - fixtures:
- - shape: !type:PolygonShape
- vertices:
- - 0,-2
- - 0,-1
- - -3,-1
- - -3,-2
- id: grid_chunk--3--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,-3
- - 1,-2
- - 0,-2
- - 0,-3
- id: grid_chunk-0--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,1
- - 1,3
- - 0,3
- - 0,1
- id: grid_chunk-0-1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,0
- - 0,1
- - -3,1
- - -3,0
- id: grid_chunk--3-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -1,-4
- - -1,-2
- - -2,-2
- - -2,-4
- id: grid_chunk--2--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,0
- - 3,1
- - 0,1
- - 0,0
- id: grid_chunk-0-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,1
- - 0,2
- - -2,2
- - -2,1
- id: grid_chunk--2-1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-1
- - 0,0
- - -2,0
- - -2,-1
- id: grid_chunk--2--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 2,-2
- - 2,-1
- - 0,-1
- - 0,-2
- id: grid_chunk-0--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,-1
- - 1,0
- - 0,0
- - 0,-1
- id: grid_chunk-0--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- type: Fixtures
- - gravityShakeSound: !type:SoundPathSpecifier
- path: /Audio/Effects/alert.ogg
- type: Gravity
-- uid: 1
- type: WallSolid
- components:
- - pos: -1.5,1.5
- parent: 0
- type: Transform
-- uid: 2
- type: WallSolid
- components:
- - pos: 0.5,1.5
- parent: 0
- type: Transform
-- uid: 3
- type: Girder
- components:
- - pos: 1.5,-1.5
- parent: 0
- type: Transform
-- uid: 4
- type: AirlockEngineeringLocked
- components:
- - pos: -0.5,1.5
- parent: 0
- type: Transform
- - containers:
- board: !type:Container
- ents: []
- type: ContainerContainer
-- uid: 5
- type: Girder
- components:
- - pos: -2.5,0.5
- parent: 0
- type: Transform
-- uid: 6
- type: Girder
- components:
- - pos: -1.5,-2.5
- parent: 0
- type: Transform
-- uid: 7
- type: SalvageCanisterSpawner
- components:
- - pos: -1.5,0.5
- parent: 0
- type: Transform
-- uid: 8
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -1.5,-0.5
- parent: 0
- type: Transform
-- uid: 9
- type: SalvageMobSpawner
- components:
- - pos: -1.5,-1.5
- parent: 0
- type: Transform
-- uid: 10
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -0.5,-0.5
- parent: 0
- type: Transform
-- uid: 11
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -0.5,-1.5
- parent: 0
- type: Transform
-- uid: 12
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -0.5,0.5
- parent: 0
- type: Transform
-- uid: 13
- type: SalvageMobSpawner
- components:
- - pos: 0.5,-1.5
- parent: 0
- type: Transform
-- uid: 14
- type: PoweredSmallLight
- components:
- - pos: 0.5,0.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - enabled: False
- type: AmbientSound
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 15
- type: CableApcExtension
- components:
- - pos: -0.5,1.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 16
- type: CableApcExtension
- components:
- - pos: -0.5,0.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 17
- type: CableApcExtension
- components:
- - pos: 0.5,0.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-...
diff --git a/Resources/Maps/Salvage/small-2.yml b/Resources/Maps/Salvage/small-2.yml
deleted file mode 100644
index c10dafd712..0000000000
--- a/Resources/Maps/Salvage/small-2.yml
+++ /dev/null
@@ -1,621 +0,0 @@
-meta:
- format: 2
- name: DemoStation
- author: Space-Wizards
- postmapinit: false
-tilemap:
- 0: space
- 1: floor_asteroid_coarse_sand0
- 2: floor_asteroid_coarse_sand1
- 3: floor_asteroid_coarse_sand2
- 4: floor_asteroid_coarse_sand_dug
- 5: floor_asteroid_sand
- 6: floor_asteroid_tile
- 7: floor_blue
- 8: floor_blue_circuit
- 9: floor_dark
- 10: floor_elevator_shaft
- 11: floor_freezer
- 12: floor_glass
- 13: floor_gold
- 14: floor_green_circuit
- 15: floor_hydro
- 16: floor_lino
- 17: floor_mono
- 18: floor_reinforced
- 19: floor_rglass
- 20: floor_rock_vault
- 21: floor_showroom
- 22: floor_silver
- 23: floor_snow
- 24: floor_steel
- 25: floor_steel_dirty
- 26: floor_techmaint
- 27: floor_white
- 28: floor_wood
- 29: lattice
- 30: plating
- 31: underplating
-grids:
-- settings:
- chunksize: 16
- tilesize: 1
- chunks:
- - ind: "-1,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB4AAAAcAAAAHAAAAA==
- - ind: "0,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAHAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "-1,0"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAeAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "0,0"
- tiles: HAAAAB4AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAeAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-entities:
-- uid: 0
- components:
- - pos: 0.5,0.5
- parent: null
- type: Transform
- - index: 0
- type: MapGrid
- - angularDamping: 0.3
- fixedRotation: False
- bodyType: Dynamic
- type: Physics
- - fixtures:
- - shape: !type:PolygonShape
- vertices:
- - 0,-3
- - 0,-1
- - -3,-1
- - -3,-3
- id: grid_chunk--3--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-1
- - 0,0
- - -4,0
- - -4,-1
- id: grid_chunk--4--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-4
- - 3,-3
- - 2,-3
- - 2,-4
- id: grid_chunk-2--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-3
- - 3,0
- - 0,0
- - 0,-3
- id: grid_chunk-0--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 36
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,0
- - 0,2
- - -4,2
- - -4,0
- id: grid_chunk--4-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -1,2
- - -1,3
- - -4,3
- - -4,2
- id: grid_chunk--4-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,0
- - 3,2
- - 0,2
- - 0,0
- id: grid_chunk-0-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,2
- - 1,3
- - 0,3
- - 0,2
- id: grid_chunk-0-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -3,-3
- - -3,-1
- - -4,-1
- - -4,-3
- id: grid_chunk--4--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,-2
- - 1,-1
- - 0,-1
- - 0,-2
- id: grid_chunk-0--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-3
- - 0,-2
- - -1,-2
- - -1,-3
- id: grid_chunk--1--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,0
- - 3,2
- - 2,2
- - 2,0
- id: grid_chunk-2-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-2
- - 0,-1
- - -2,-1
- - -2,-2
- id: grid_chunk--2--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-4
- - 0,-3
- - -4,-3
- - -4,-4
- id: grid_chunk--4--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,1
- - 0,2
- - -1,2
- - -1,1
- id: grid_chunk--1-1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-3
- - 3,-1
- - 2,-1
- - 2,-3
- id: grid_chunk-2--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-1
- - 3,0
- - 0,0
- - 0,-1
- id: grid_chunk-0--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-4
- - 3,-3
- - 0,-3
- - 0,-4
- id: grid_chunk-0--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,0
- - 0,1
- - -2,1
- - -2,0
- id: grid_chunk--2-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- type: Fixtures
- - gravityShakeSound: !type:SoundPathSpecifier
- path: /Audio/Effects/alert.ogg
- type: Gravity
-- uid: 1
- type: WallSolid
- components:
- - pos: -3.5,1.5
- parent: 0
- type: Transform
-- uid: 2
- type: WallSolid
- components:
- - pos: -2.5,1.5
- parent: 0
- type: Transform
-- uid: 3
- type: WallSolid
- components:
- - pos: -1.5,1.5
- parent: 0
- type: Transform
-- uid: 4
- type: AirlockMaintEngiLocked
- components:
- - name: Entleins Wohnstätte
- type: MetaData
- - pos: -0.5,1.5
- parent: 0
- type: Transform
- - containers:
- board: !type:Container
- ents: []
- type: ContainerContainer
-- uid: 5
- type: WallSolid
- components:
- - pos: 0.5,1.5
- parent: 0
- type: Transform
-- uid: 6
- type: WallSolid
- components:
- - pos: 1.5,1.5
- parent: 0
- type: Transform
-- uid: 7
- type: WallSolid
- components:
- - pos: 2.5,1.5
- parent: 0
- type: Transform
-- uid: 8
- type: ReinforcedWindow
- components:
- - pos: 1.5,-2.5
- parent: 0
- type: Transform
-- uid: 9
- type: ReinforcedWindow
- components:
- - pos: 0.5,-2.5
- parent: 0
- type: Transform
-- uid: 10
- type: ReinforcedWindow
- components:
- - pos: -0.5,-2.5
- parent: 0
- type: Transform
-- uid: 11
- type: ReinforcedWindow
- components:
- - pos: -1.5,-2.5
- parent: 0
- type: Transform
-- uid: 12
- type: FigureSpawner
- components:
- - pos: 1.5,-0.5
- parent: 0
- type: Transform
-- uid: 13
- type: WallSolid
- components:
- - pos: 2.5,-2.5
- parent: 0
- type: Transform
-- uid: 14
- type: ClosetMaintenanceFilledRandom
- components:
- - pos: -1.5,0.5
- parent: 0
- type: Transform
- - isPlaceable: False
- type: PlaceableSurface
- - containers:
- EntityStorageComponent: !type:Container
- ents: []
- type: ContainerContainer
-- uid: 15
- type: TableCarpet
- components:
- - pos: 0.5,-0.5
- parent: 0
- type: Transform
-- uid: 16
- type: TableCarpet
- components:
- - pos: 1.5,-0.5
- parent: 0
- type: Transform
-- uid: 17
- type: d20Dice
- components:
- - pos: 0.35689956,-0.2576263
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 18
- type: SalvageLorePaperGamingSpawner
- components:
- - pos: 0.79439956,-0.4295013
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
- - fixtures: []
- type: Fixtures
-- uid: 19
- type: SalvageMaterialCrateSpawner
- components:
- - pos: 2.5,-1.5
- parent: 0
- type: Transform
-- uid: 20
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -3.5,0.5
- parent: 0
- type: Transform
-- uid: 21
- type: RandomArcade
- components:
- - pos: -2.5,0.5
- parent: 0
- type: Transform
-- uid: 22
- type: SalvageMobSpawner
- components:
- - pos: -0.5,-1.5
- parent: 0
- type: Transform
-- uid: 23
- type: Grille
- components:
- - pos: -2.5,-2.5
- parent: 0
- type: Transform
-- uid: 24
- type: Grille
- components:
- - pos: -1.5,-2.5
- parent: 0
- type: Transform
-- uid: 25
- type: Grille
- components:
- - pos: -0.5,-2.5
- parent: 0
- type: Transform
-- uid: 26
- type: Grille
- components:
- - pos: 0.5,-2.5
- parent: 0
- type: Transform
-- uid: 27
- type: Grille
- components:
- - pos: 1.5,-2.5
- parent: 0
- type: Transform
-- uid: 28
- type: CableApcExtension
- components:
- - pos: -0.5,1.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 29
- type: CableApcExtension
- components:
- - pos: -0.5,0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 30
- type: CableApcExtension
- components:
- - pos: -0.5,-0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 31
- type: CableApcExtension
- components:
- - pos: -0.5,-1.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 32
- type: CableApcExtension
- components:
- - pos: 0.5,-1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 33
- type: CableApcExtension
- components:
- - pos: -1.5,-1.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 34
- type: CableApcExtension
- components:
- - pos: 1.5,-1.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-- uid: 35
- type: CableApcExtension
- components:
- - pos: 2.5,-1.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 36
- type: PoweredSmallLight
- components:
- - rot: 3.141592653589793 rad
- pos: 2.5,-1.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - enabled: False
- type: AmbientSound
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 37
- type: PoweredSmallLight
- components:
- - pos: -2.5,0.5
- parent: 0
- type: Transform
- - powerLoad: 0
- type: ApcPowerReceiver
- - enabled: False
- type: AmbientSound
- - containers:
- light_bulb: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 38
- type: CableApcExtension
- components:
- - pos: -1.5,0.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 39
- type: CableApcExtension
- components:
- - pos: -2.5,0.5
- parent: 0
- type: Transform
- - canCollide: False
- type: Physics
-- uid: 40
- type: CableApcExtension
- components:
- - pos: 0.5,0.5
- parent: 0
- type: Transform
- - visible: False
- type: Sprite
- - canCollide: False
- type: Physics
-...
diff --git a/Resources/Maps/Salvage/small-a-1.yml b/Resources/Maps/Salvage/small-a-1.yml
deleted file mode 100644
index 3b9b9132ac..0000000000
--- a/Resources/Maps/Salvage/small-a-1.yml
+++ /dev/null
@@ -1,563 +0,0 @@
-meta:
- format: 2
- name: DemoStation
- author: Space-Wizards
- postmapinit: false
-tilemap:
- 0: space
- 1: floor_asteroid_coarse_sand0
- 2: floor_asteroid_coarse_sand1
- 3: floor_asteroid_coarse_sand2
- 4: floor_asteroid_coarse_sand_dug
- 5: floor_asteroid_sand
- 6: floor_asteroid_tile
- 7: floor_blue
- 8: floor_blue_circuit
- 9: floor_dark
- 10: floor_elevator_shaft
- 11: floor_freezer
- 12: floor_glass
- 13: floor_gold
- 14: floor_green_circuit
- 15: floor_hydro
- 16: floor_lino
- 17: floor_mono
- 18: floor_reinforced
- 19: floor_rglass
- 20: floor_rock_vault
- 21: floor_showroom
- 22: floor_silver
- 23: floor_snow
- 24: floor_steel
- 25: floor_steel_dirty
- 26: floor_techmaint
- 27: floor_white
- 28: floor_wood
- 29: lattice
- 30: plating
- 31: underplating
-grids:
-- settings:
- chunksize: 16
- tilesize: 1
- chunks:
- - ind: "-1,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAABQAAAA==
- - ind: "0,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "-1,0"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "0,0"
- tiles: BQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-entities:
-- uid: 0
- components:
- - pos: 0.5,0.5
- parent: null
- type: Transform
- - index: 0
- type: MapGrid
- - angularDamping: 0.3
- fixedRotation: False
- bodyType: Dynamic
- type: Physics
- - fixtures:
- - shape: !type:PolygonShape
- vertices:
- - 3,0
- - 3,1
- - 0,1
- - 0,0
- id: grid_chunk-0-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,-3
- - 1,-2
- - 0,-2
- - 0,-3
- id: grid_chunk-0--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-2
- - 3,0
- - 0,0
- - 0,-2
- id: grid_chunk-0--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 2,1
- - 2,2
- - 0,2
- - 0,1
- id: grid_chunk-0-1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,2
- - 1,3
- - 0,3
- - 0,2
- id: grid_chunk-0-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,0
- - 0,2
- - -4,2
- - -4,0
- id: grid_chunk--4-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-4
- - 0,-2
- - -3,-2
- - -3,-4
- id: grid_chunk--3--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 24
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-2
- - 0,0
- - -4,0
- - -4,-2
- id: grid_chunk--4--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 32
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,2
- - 0,3
- - -3,3
- - -3,2
- id: grid_chunk--3-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- type: Fixtures
- - gravityShakeSound: !type:SoundPathSpecifier
- path: /Audio/Effects/alert.ogg
- type: Gravity
- - tiles:
- -4,-2: 0
- -4,-1: 0
- -3,-4: 0
- -3,-3: 0
- -3,-2: 0
- -3,-1: 0
- -2,-4: 0
- -2,-3: 0
- -2,-2: 0
- -2,-1: 1
- -1,-4: 0
- -1,-3: 0
- -1,-2: 1
- -1,-1: 2
- 0,-3: 0
- 0,-2: 0
- 0,-1: 1
- 1,-2: 0
- 1,-1: 0
- 2,-2: 0
- 2,-1: 0
- -4,0: 0
- -4,1: 0
- -3,0: 0
- -3,1: 0
- -3,2: 0
- -2,0: 3
- -2,1: 0
- -2,2: 0
- -1,0: 1
- -1,1: 0
- -1,2: 0
- 0,0: 0
- 0,1: 0
- 0,2: 0
- 1,0: 0
- 1,1: 0
- 2,0: 0
- uniqueMixes:
- - volume: 2500
- temperature: 293.15
- moles:
- - 21.824879
- - 82.10312
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 293.15
- moles:
- - 0
- - 0
- - 0
- - 6666.982
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 9000
- moles:
- - 0
- - 0
- - 0
- - 6666.982
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 293.15
- moles:
- - 6666.982
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- type: GridAtmosphere
-- uid: 1
- type: AsteroidRock
- components:
- - pos: -2.5,2.5
- parent: 0
- type: Transform
-- uid: 2
- type: AsteroidRock
- components:
- - pos: -2.5,1.5
- parent: 0
- type: Transform
-- uid: 3
- type: AsteroidRock
- components:
- - pos: -2.5,0.5
- parent: 0
- type: Transform
-- uid: 4
- type: AsteroidRock
- components:
- - pos: -2.5,-0.5
- parent: 0
- type: Transform
-- uid: 5
- type: AsteroidRock
- components:
- - pos: -2.5,-1.5
- parent: 0
- type: Transform
-- uid: 6
- type: AsteroidRock
- components:
- - pos: -2.5,-2.5
- parent: 0
- type: Transform
-- uid: 7
- type: AsteroidRock
- components:
- - pos: -1.5,2.5
- parent: 0
- type: Transform
-- uid: 8
- type: AsteroidRock
- components:
- - pos: -1.5,1.5
- parent: 0
- type: Transform
-- uid: 9
- type: SalvageMobSpawner
- components:
- - pos: -1.5,0.5
- parent: 0
- type: Transform
-- uid: 10
- type: CrateMaterialPlasteel
- components:
- - pos: -1.5,-0.5
- parent: 0
- type: Transform
- - isPlaceable: False
- type: PlaceableSurface
- - containers:
- EntityStorageComponent: !type:Container
- ents: []
- PaperLabel: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 11
- type: AsteroidRock
- components:
- - pos: -1.5,-1.5
- parent: 0
- type: Transform
-- uid: 12
- type: AsteroidRock
- components:
- - pos: -1.5,-2.5
- parent: 0
- type: Transform
-- uid: 13
- type: AsteroidRock
- components:
- - pos: -0.5,2.5
- parent: 0
- type: Transform
-- uid: 14
- type: AsteroidRock
- components:
- - pos: -0.5,1.5
- parent: 0
- type: Transform
-- uid: 15
- type: CrateMaterialPlastic
- components:
- - pos: -0.5,0.5
- parent: 0
- type: Transform
- - isPlaceable: False
- type: PlaceableSurface
- - containers:
- EntityStorageComponent: !type:Container
- ents: []
- PaperLabel: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 16
- type: CrateMaterialGlass
- components:
- - pos: 0.5,-0.5
- parent: 0
- type: Transform
- - isPlaceable: False
- type: PlaceableSurface
- - containers:
- EntityStorageComponent: !type:Container
- ents: []
- PaperLabel: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 17
- type: SalvageMaterialCrateSpawner
- components:
- - pos: -0.5,-1.5
- parent: 0
- type: Transform
-- uid: 18
- type: AsteroidRock
- components:
- - pos: -0.5,-2.5
- parent: 0
- type: Transform
-- uid: 19
- type: AsteroidRock
- components:
- - pos: 0.5,2.5
- parent: 0
- type: Transform
-- uid: 20
- type: AsteroidRock
- components:
- - pos: 0.5,1.5
- parent: 0
- type: Transform
-- uid: 21
- type: AsteroidRock
- components:
- - pos: 0.5,0.5
- parent: 0
- type: Transform
-- uid: 22
- type: CrateMaterialSteel
- components:
- - pos: -0.5,-0.5
- parent: 0
- type: Transform
- - isPlaceable: False
- type: PlaceableSurface
- - containers:
- EntityStorageComponent: !type:Container
- ents: []
- PaperLabel: !type:ContainerSlot {}
- type: ContainerContainer
-- uid: 23
- type: AsteroidRock
- components:
- - pos: 0.5,-1.5
- parent: 0
- type: Transform
-- uid: 24
- type: AsteroidRock
- components:
- - pos: 0.5,-2.5
- parent: 0
- type: Transform
-- uid: 25
- type: AsteroidRock
- components:
- - pos: -3.5,1.5
- parent: 0
- type: Transform
-- uid: 26
- type: AsteroidRock
- components:
- - pos: -3.5,0.5
- parent: 0
- type: Transform
-- uid: 27
- type: AsteroidRock
- components:
- - pos: -3.5,-0.5
- parent: 0
- type: Transform
-- uid: 28
- type: AsteroidRock
- components:
- - pos: -3.5,-1.5
- parent: 0
- type: Transform
-- uid: 29
- type: AsteroidRock
- components:
- - pos: 1.5,1.5
- parent: 0
- type: Transform
-- uid: 30
- type: AsteroidRock
- components:
- - pos: 1.5,0.5
- parent: 0
- type: Transform
-- uid: 31
- type: AsteroidRock
- components:
- - pos: 1.5,-0.5
- parent: 0
- type: Transform
-- uid: 32
- type: AsteroidRock
- components:
- - pos: 1.5,-1.5
- parent: 0
- type: Transform
-- uid: 33
- type: AsteroidRock
- components:
- - pos: 2.5,0.5
- parent: 0
- type: Transform
-- uid: 34
- type: AsteroidRock
- components:
- - pos: 2.5,-0.5
- parent: 0
- type: Transform
-- uid: 35
- type: AsteroidRock
- components:
- - pos: 2.5,-1.5
- parent: 0
- type: Transform
-- uid: 36
- type: AsteroidRock
- components:
- - pos: -2.5,-3.5
- parent: 0
- type: Transform
-- uid: 37
- type: AsteroidRock
- components:
- - pos: -1.5,-3.5
- parent: 0
- type: Transform
-- uid: 38
- type: AsteroidRock
- components:
- - pos: -0.5,-3.5
- parent: 0
- type: Transform
-- uid: 39
- type: AtmosFixOxygenMarker
- components:
- - pos: -1.5,0.5
- parent: 0
- type: Transform
-- uid: 40
- type: AtmosFixPlasmaMarker
- components:
- - pos: -0.5,0.5
- parent: 0
- type: Transform
-- uid: 41
- type: AtmosFixPlasmaMarker
- components:
- - pos: -0.5,-0.5
- parent: 0
- type: Transform
-- uid: 42
- type: AtmosFixPlasmaMarker
- components:
- - pos: -1.5,-0.5
- parent: 0
- type: Transform
-- uid: 43
- type: AtmosFixPlasmaMarker
- components:
- - pos: 0.5,-0.5
- parent: 0
- type: Transform
-- uid: 44
- type: AtmosFixPlasmaMarker
- components:
- - pos: -0.5,-1.5
- parent: 0
- type: Transform
-...
diff --git a/Resources/Maps/Salvage/small-template.yml b/Resources/Maps/Salvage/small-template.yml
deleted file mode 100644
index 962c2d7742..0000000000
--- a/Resources/Maps/Salvage/small-template.yml
+++ /dev/null
@@ -1,277 +0,0 @@
-meta:
- format: 2
- name: DemoStation
- author: Space-Wizards
- postmapinit: false
-tilemap:
- 0: space
- 1: floor_asteroid_coarse_sand0
- 2: floor_asteroid_coarse_sand1
- 3: floor_asteroid_coarse_sand2
- 4: floor_asteroid_coarse_sand_dug
- 5: floor_asteroid_sand
- 6: floor_asteroid_tile
- 7: floor_blue
- 8: floor_blue_circuit
- 9: floor_dark
- 10: floor_elevator_shaft
- 11: floor_freezer
- 12: floor_glass
- 13: floor_gold
- 14: floor_green_circuit
- 15: floor_hydro
- 16: floor_lino
- 17: floor_mono
- 18: floor_reinforced
- 19: floor_rglass
- 20: floor_rock_vault
- 21: floor_showroom
- 22: floor_silver
- 23: floor_snow
- 24: floor_steel
- 25: floor_steel_dirty
- 26: floor_techmaint
- 27: floor_white
- 28: floor_wood
- 29: lattice
- 30: plating
- 31: underplating
-grids:
-- settings:
- chunksize: 16
- tilesize: 1
- chunks:
- - ind: "-1,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAADQAAAA==
- - ind: "0,-1"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "-1,0"
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAdAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- - ind: "0,0"
- tiles: HQAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAHQAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-entities:
-- uid: 0
- components:
- - pos: 0.5, 0.5
- parent: null
- type: Transform
- - index: 0
- type: MapGrid
- - angularDamping: 0.3
- fixedRotation: False
- bodyType: Dynamic
- type: Physics
- - fixtures:
- - shape: !type:PolygonShape
- vertices:
- - -3,-3
- - -3,-1
- - -4,-1
- - -4,-3
- id: grid_chunk--4--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,-2
- - 1,-1
- - 0,-1
- - 0,-2
- id: grid_chunk-0--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-3
- - 0,-2
- - -1,-2
- - -1,-3
- id: grid_chunk--1--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - -3,0
- - -3,2
- - -4,2
- - -4,0
- id: grid_chunk--4-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,0
- - 3,2
- - 2,2
- - 2,0
- id: grid_chunk-2-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-2
- - 0,-1
- - -2,-1
- - -2,-2
- id: grid_chunk--2--2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-4
- - 0,-3
- - -4,-3
- - -4,-4
- id: grid_chunk--4--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,-1
- - 0,0
- - -4,0
- - -4,-1
- id: grid_chunk--4--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,1
- - 0,2
- - -1,2
- - -1,1
- id: grid_chunk--1-1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,2
- - 3,3
- - 0,3
- - 0,2
- id: grid_chunk-0-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 1,0
- - 1,1
- - 0,1
- - 0,0
- id: grid_chunk-0-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 4
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-3
- - 3,-1
- - 2,-1
- - 2,-3
- id: grid_chunk-2--3
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-1
- - 3,0
- - 0,0
- - 0,-1
- id: grid_chunk-0--1
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 3,-4
- - 3,-3
- - 0,-3
- - 0,-4
- id: grid_chunk-0--4
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 12
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,2
- - 0,3
- - -4,3
- - -4,2
- id: grid_chunk--4-2
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 16
- restitution: 0.1
- - shape: !type:PolygonShape
- vertices:
- - 0,0
- - 0,1
- - -2,1
- - -2,0
- id: grid_chunk--2-0
- mask:
- - MapGrid
- layer:
- - MapGrid
- mass: 8
- restitution: 0.1
- type: Fixtures
- - gravityShakeSound: !type:SoundPathSpecifier
- path: /Audio/Effects/alert.ogg
- type: Gravity
-...
diff --git a/Resources/Maps/knightship.yml b/Resources/Maps/knightship.yml
index 687bac4db4..3da4a0e982 100644
--- a/Resources/Maps/knightship.yml
+++ b/Resources/Maps/knightship.yml
@@ -5625,17 +5625,4 @@ entities:
- pos: 0.5,-9.5
parent: 0
type: Transform
-- uid: 559
- type: SalvageLocator
- components:
- - pos: 0.5,5.5
- rot: 3.141592653589793 rad
- parent: 0
- type: Transform
-- uid: 560
- type: CrateSalvageEquipment
- components:
- - pos: 2.5,5.5
- parent: 0
- type: Transform
...
diff --git a/Resources/Maps/packedstation.yml b/Resources/Maps/packedstation.yml
index 55584d17e9..eebdac31b5 100644
--- a/Resources/Maps/packedstation.yml
+++ b/Resources/Maps/packedstation.yml
@@ -26998,14 +26998,21 @@ entities:
parent: 0
type: Transform
- uid: 2090
- type: SalvageMagnet
+ type: CrateGenericonimo
components:
- pos: 6.5,32.5
- rot: -1.5707963267948966 rad
parent: 0
type: Transform
+ - isPlaceable: False
+ type: PlaceableSurface
+ - containers:
+ EntityStorageComponent: !type:Container
+ ents: []
+ labelSlot: !type:ContainerSlot {}
+ PaperLabel: !type:ContainerSlot {}
+ type: ContainerContainer
- uid: 2091
- type: CrateSalvageEquipment
+ type: CrateGenericonimo
components:
- pos: 7.5,31.5
parent: 0
diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml
index dfffcbd797..5267c40d53 100644
--- a/Resources/Maps/saltern.yml
+++ b/Resources/Maps/saltern.yml
@@ -72553,17 +72553,4 @@ entities:
- pos: 14.5,-0.5
parent: 853
type: Transform
-- uid: 7116
- type: SalvageMagnet
- components:
- - rot: 3.141592697301183 rad
- pos: 23.5,11.5
- parent: 853
- type: Transform
-- uid: 7117
- type: CrateSalvageEquipment
- components:
- - pos: 23.5,13.5
- parent: 853
- type: Transform
...
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
deleted file mode 100644
index 2c93d934e8..0000000000
--- a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
+++ /dev/null
@@ -1,82 +0,0 @@
-- type: entity
- id: CrateSalvageEquipment
- name: "salvage equipment crate"
- description: For the daring.
- suffix: Filled
- parent: CrateGenericonimo
- components:
- - type: StorageFill
- contents:
- - id: ClothingHeadHelmetHardsuitSalvage
- - id: ClothingOuterHardsuitSalvage
- - id: ClothingMaskBreath
- - id: OxygenTankFilled
- - id: FireExtinguisher
- - id: ClothingShoesBootsMag
- - id: Pickaxe
- # bare-minimum for cutting apart walls
- # not giving them wirecutters/etc. for balance reasons
- - id: Welder
- - id: Wrench
- - id: Screwdriver
- - id: Crowbar
-
-- type: entity
- id: CrateSalvageAssortedGoodies
- suffix: Filled, Salvage Random
- abstract: true # You should use SalvageMaterialCrateSpawner instead
- parent: CrateGenericonimo
- components:
- - type: StorageFill
- contents:
- # Normal (10%)
- - id: ToolboxEmergencyFilled
- prob: 0.1
- - id: ClothingMaskBreath
- prob: 0.1
- - id: OxygenTankFilled
- prob: 0.1
- - id: SheetPlasma
- prob: 0.1
- # - Service
- - id: CrayonBox
- prob: 0.1
- # - Medical
- - id: MedkitFilled
- prob: 0.1
- - id: BoxSyringe
- prob: 0.1
- - id: BoxBeaker
- prob: 0.1
- # - Scaf
- - id: ClothingHeadHelmetScaf
- prob: 0.1
- - id: ClothingOuterArmorScaf
- prob: 0.1
- # - Heh
- - id: SalvageHumanCorpse
- prob: 0.1
- # Interesting (1%)
- # - Ammo
- - id: BoxMagnum
- prob: 0.01
- # - #shinies
- - id: PowerCellLargeHyper
- prob: 0.01
- # Just no (0.1%)
- # - Working guns
- - id: RevolverDeckard
- prob: 0.001
- - id: RevolverInspector
- prob: 0.001
- # - Skub
- - id: Skub
- prob: 0.001
- # TRAITOR EQUIPMENT (0.01%)
- - id: Telecrystal10
- prob: 0.0001
- - id: RevolverPredator
- prob: 0.0001
- - id: RevolverMateba
- prob: 0.0001
-
diff --git a/Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml b/Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml
deleted file mode 100644
index ec09546423..0000000000
--- a/Resources/Prototypes/Catalog/Fills/Paper/salvage_lore.yml
+++ /dev/null
@@ -1,101 +0,0 @@
-# ---- SPECIFICS ----
-
-- type: entity
- id: PaperWrittenSalvageLoreMedium1PlasmaTrap
- abstract: true # keep this from spamming spawn sheet
- suffix: "Salvage: Lore: Medium 1: Plasma Trap"
- parent: PaperWritten
- components:
- - type: Paper
- content: |
- Heheheheh, no way in hell they're going to get at our stash NOW, is there?
- I rigged the area where our stuff's at to be a toasty thousand K.
- You know how to drain it when we need it out.
- - J.
-
-# ---- GAMING ----
-
-- type: entity
- name: Salvage Lore Paper Gaming Spawner
- id: SalvageLorePaperGamingSpawner
- parent: MarkerBase
- components:
- - type: Sprite
- layers:
- - state: red
- - texture: Objects/Misc/bureaucracy.rsi/paper_words.png
- - type: RandomSpawner
- prototypes:
- - PaperWrittenSalvageLoreGaming1
- - PaperWrittenSalvageLoreGaming2
- - PaperWrittenSalvageLoreGaming3
- - PaperWrittenSalvageLoreGaming4
- offset: 0.1
-
-- type: entity
- id: PaperWrittenSalvageLoreGaming1
- abstract: true # keep this from spamming spawn sheet
- suffix: "Salvage: Lore: Gaming 1"
- parent: PaperWritten
- components:
- - type: Paper
- content: |
- Can't stay for the game.
- Engineering want me to keep a close eye on the singularity SMESes.
- Leaving this so you know what's up.
- Sorry.
- - Alexander
-
-- type: entity
- id: PaperWrittenSalvageLoreGaming2
- abstract: true # keep this from spamming spawn sheet
- suffix: "Salvage: Lore: Gaming 2"
- parent: PaperWritten
- components:
- - type: Paper
- content: |
- Johny Clowe
- Class: Druid
- Alignment: Neutral Good
- Str: 1,294,139
- Dex: 4,102,103
- Con: 9,522,913
- Int: 528,491
- Wis: 1
- Cha: 1
-
- Where's the age?
- Why are those ability scores so ridiculous?
- What even are you trying to do here, Leah? - Your Friendly DM
-
-- type: entity
- id: PaperWrittenSalvageLoreGaming3
- abstract: true # keep this from spamming spawn sheet
- suffix: "Salvage: Lore: Gaming 3"
- parent: PaperWritten
- components:
- - type: Paper
- content: |
- THE GIANT SPACE FLY FROM SPACE
- Session 1: They should have just learned what's going on with the world and the Giant Space Fly.
- Session 2: They should know to ask the Wizard's Court about seismic distortions.
- Session 3: On their way to underground lair.
- Session 4: Just ran into the Architect Of Flies.
- Oh dear goodness they just started randomly killing everybody
-
-- type: entity
- id: PaperWrittenSalvageLoreGaming4
- abstract: true # keep this from spamming spawn sheet
- suffix: "Salvage: Lore: Gaming 4"
- parent: PaperWritten
- components:
- - type: Paper
- content: |
- Won't be able to come to the meet, chemist blew up the hospital again.
- Fifth time this shift.
- It's amazing.
- But not in a good way.
- Cheers, - Arielle
-
-# ----
-
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml
deleted file mode 100644
index 45a1a96d1c..0000000000
--- a/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml
+++ /dev/null
@@ -1,67 +0,0 @@
-- type: entity
- name: Salvage Material Crate Spawner
- id: SalvageMaterialCrateSpawner
- parent: MarkerBase
- components:
- - type: Sprite
- layers:
- - state: red
- - texture: Structures/Storage/Crates/generic.rsi/crate_icon.png
- - type: RandomSpawner
- rarePrototypes:
- - SalvageHumanCorpse
- - CrateMaterialPlasteel
- - CrateMaterialWood
- - CrateMaterialPlastic
- - CrateSalvageEquipment
- - CrateMaterialSteel
- - CrateMaterialGlass
- rareChance: 0.4
- prototypes:
- - CrateSalvageAssortedGoodies
- chance: 0.9
- offset: 0.0
-
-- type: entity
- name: Salvage Canister Spawner
- id: SalvageCanisterSpawner
- parent: MarkerBase
- components:
- - type: Sprite
- layers:
- - state: red
- - texture: Structures/Storage/canister.rsi/blue.png
- - type: RandomSpawner
- rarePrototypes:
- - PlasmaCanister
- rareChance: 0.03
- prototypes:
- - AirCanister
- - NitrogenCanister
- - OxygenCanister
- - CarbonDioxideCanister
- - WaterVaporCanister
- chance: 0.9
- offset: 0.0
-
-- type: entity
- name: Salvage Mob Spawner
- id: SalvageMobSpawner
- parent: MarkerBase
- components:
- - type: Sprite
- layers:
- - state: red
- - texture: Mobs/Aliens/Carps/space.rsi/icon.png
- - type: RandomSpawner
- prototypes:
- - MobCarp
- - MobCarp
- - MobCarp
- - MobCarp
- - MobCarp
- - PlushieCarp
- - DehydratedSpaceCarp
- chance: 0.25
- offset: 0.2
-
diff --git a/Resources/Prototypes/Entities/Markers/atmos_blocker.yml b/Resources/Prototypes/Entities/Markers/atmos_blocker.yml
index 51f9f56a49..18973d03c8 100644
--- a/Resources/Prototypes/Entities/Markers/atmos_blocker.yml
+++ b/Resources/Prototypes/Entities/Markers/atmos_blocker.yml
@@ -66,20 +66,3 @@
- type: AtmosFixMarker
mode: 4
-- type: entity
- name: Atmos Fix Instant Plasmafire Marker
- id: AtmosFixInstantPlasmaFireMarker
- description: "INSTANT PLASMAFIRE"
- parent: MarkerBase
- components:
- - type: Sprite
- layers:
- - sprite: Markers/atmos.rsi # {
- state: base-hot
- shader: unshaded
- - sprite: Markers/atmos.rsi
- shader: unshaded # }
- state: fire
- - type: AtmosFixMarker
- mode: 5
-
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
index d5a4c85027..e2840a1c5d 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
@@ -28,16 +28,3 @@
- Thirst
- Idle
- Spirate
-
-- type: entity
- parent: MobHumanBase
- suffix: Dead
- id: SalvageHumanCorpse
- name: unidentified human
- description: We barely knew ye.
- components:
- - type: Damageable
- damage:
- types:
- Blunt: 200
-
diff --git a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml
deleted file mode 100644
index 5440bb243b..0000000000
--- a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-- type: entity
- id: SalvageMagnet
- parent: BaseMachine
- name: salvage magnet
- description: "Pulls in salvage."
- components:
- - type: Sprite
- layers:
- - sprite: Structures/Machines/salvage.rsi
- state: salvage-magnet
- # Ideally, there'd be lights indicating power usage and a big red lamp indicating loss
- - type: Rotatable
- - type: SalvageMagnet
- offset: 0, -32
-
-# For Knightship
-- type: entity
- id: SalvageLocator
- parent: SalvageMagnet
- name: salvage locator
- description: "Locates salvage."
- components:
- - type: SalvageMagnet
- offset: 0, -12
-
diff --git a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml
index 235a302e1a..c1f4c221f4 100644
--- a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml
+++ b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml
@@ -23,7 +23,6 @@
- type: Occluder
sizeX: 32
sizeY: 32
- - type: Airtight
- type: Appearance
visuals:
- type: AsteroidRockVisualizer
diff --git a/Resources/Prototypes/Maps/salvage.yml b/Resources/Prototypes/Maps/salvage.yml
deleted file mode 100644
index 6035777731..0000000000
--- a/Resources/Prototypes/Maps/salvage.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-# ALL SALVAGE MAPS SHOULD BE SETUP SUCH THAT TILE REF -1,-1 IS THEIR OFFICIAL CENTRE,
-# AND FOR EASE OF UNDERSTANDING, USE - pos: 0.5, 0.5 FOR SAVED POSITION.
-
-# "Small"-class maps - Max size square: 7x7, indicated size: 3.5
-
-- type: salvageMap
- id: small1
- name: "Small / Engineering Storage 1"
- mapPath: Maps/Salvage/small-1.yml
- size: 3.5
-
-- type: salvageMap
- id: small2
- name: "Small / Gaming Nook 1"
- mapPath: Maps/Salvage/small-2.yml
- size: 3.5
-
-# Small - Asteroids
-
-- type: salvageMap
- id: smallA1
- name: "Small / Asteroid 1 Plasmafire"
- mapPath: Maps/Salvage/small-a-1.yml
- size: 3.5
-
-# "Medium"-class maps - Max size square: 15x15, indicated size: 7.5
-
-- type: salvageMap
- id: medium1
- name: "Medium / Plasma-Trapped Cache 1"
- mapPath: Maps/Salvage/medium-1.yml
- size: 7.5
-
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
index 67073f0f9a..ac15a7960c 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
@@ -9,7 +9,6 @@
access:
- Cargo
- Maintenance
- - External
- type: startingGear
id: CargoTechGear
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
index b77e4d90dd..06390dce09 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
@@ -10,7 +10,6 @@
- Cargo
# - Quartermaster
- Maintenance
- - External
- type: startingGear
id: QuartermasterGear
diff --git a/Resources/Textures/Markers/arrow.rsi/meta.json b/Resources/Textures/Markers/arrow.rsi/meta.json
deleted file mode 100644
index 158be37a96..0000000000
--- a/Resources/Textures/Markers/arrow.rsi/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "version": 1,
- "license": "CC-BY-SA-3.0",
- "copyright": "Space Wizards Federation",
- "size": {
- "x": 32,
- "y": 32
- },
- "states": [
- {
- "name": "mono"
- }
- ]
-}
diff --git a/Resources/Textures/Markers/arrow.rsi/mono.png b/Resources/Textures/Markers/arrow.rsi/mono.png
deleted file mode 100644
index 59de0257f6ef57a338646dc90edbad096994d5d6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 271
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI
z1_o|n5N2eUHAey{$X?><>&pI=hlyK}C+EgyBcRY6PZ!6Kh{JEEALMIM5O9v({J&nl
zZrePcYoSgW0?B31xMp1Eb7K6rH)Gx9HScR^sEXRQJbD5HCj@=4a5!JO=A7l6
zcMdKNmsGiBemV##J&M&$$mf1{C4ADwFJb}=UYb`qv?e^WR2x?d05Pd;o~UH2r>iQ(5x?wDG>Eq!T9r&q{+K4g;p^KZWn(47pPu6{1-
HoD!M<2Nh=N
diff --git a/Resources/Textures/Markers/atmos.rsi/base-hot.png b/Resources/Textures/Markers/atmos.rsi/base-hot.png
deleted file mode 100644
index e0d68f8b9e52b47e75c9a8f158e1eece39c501f9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 255
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI
z1_nK45N51cYF`EvWH0gbb!C6b!z3WdDIK@{I#5Wm#5JPCIX^cyHLrxhxhOTUBsE2$
zJhLQ2!QIn0AiR-J9H=PW)5S3);_%z+8+jWHcvvrTpYqUg;7k%NJHfZ6Nh5JffC8I?
zWU=bsSd5KwSv
rU|?io;Sl)nHtOGVvXec@E;|WhNyQ)xHHM}l88MbDA(IrL
zL?oeMqN3iAEMrOD=@0mw-?{g5Kj(a&=ehTu=RD^*_qwgMg^&PT0000X9M;s1%S0|P
z{CwOv@;)VnOMJd~3sZpd*E~&~Qn?EBBGxqu08YsN1yB5a!&t5eiN+DkAYTM|VQO;j
zzIF~=Nh;dRCE6rBH1vE}G++{W-Y5FJpKM%Ubbzb{j$rGYDl7>A{H8clBZv6OMUU_R
z>3NxCzx@-IU*1LDgCBq0A~3FW_oXpCRB4nHo4snZaW%tOtw}~|LiBK4#>nqLs1Wj8
zllnJ<5cw1}sSwamP4nI2@9lRdX44FGS7g=kf?~0V98|&KH*`l_ZlR~4?gMN)$9fru
zew8vkpY7FonzbAkH?(6gw9`=-qMPzZ@6dZyr4NeUVDJCsE)X>aM{Ia}9PL)?3Rgu4*77>OX4TBje=ogE9ix2#Ztf`Te|W+G>)CmjOInjRk>79l}|54((m1H!{0
zz>B$v*`1>^TgrfUEGo@&Ji4)ZiyBrEGUyf~&j+7w;qxnM{KPpCGW&
z@ROrPB8{Ff7_7X#{q*jo`8Q>^%JOYE_8uOeDRPIv43G59wNbT?PgN6Xh}OZu!IEFG
zD`<8|Q{T2%05y#m^^Kk~Rs$-bQlG8rHNQQbw5`R^*6OpMDa^(_lg&M%Zy9`8={md+?KWnl2i2M-z+H$v4ZR`6s`ue`m95IM37q~WbTYM3FV84#}
zjJ{rUxZR**PDU8#!Q;(!X@Kap*Ihn&;>FG|15|~?3=P;F>m_u1xt&%2zMgg4mS3O6
zI<$VNXUi6(GlVQGdHSabe-x5}#!Db?$1)@j
z`yVByNXbja(hR6U?
zUbafpVop8{1i))T`Ar$NtqHd+WJUT0=#L)R7o%||V+hQ!%b309otHm$jz~)c6mau-
zEU%5=G5%xM!1MwwJw26w655i2(6PugEdgAnB>{B0ef<@B96Vx)342o!eE&NSx!Sz#
z#z)4Wf1-xapNpD!6QoX^#0y{b$E+|?Ufx4^wdFj))$0mdwGC=8s?5+
zOpLahn;Uy|%huk$oCb~VU;#H`8h=SuH4|YSm3^au!|v~r0|l!n^FD!OST((+g``c)
zyj7uiTY@6V{BR&e0lrUHn5|1#T>O|sGK29Pt}o+_q1K@#y@G;*)O2(z1F8VF-%~NF
zXrkZl%<+tdx%Cv=`82>mNTDC>`EyIn&Jmfd|JcXGjr-K{^75YhKRQ-qNf*Nms(l_^
z_idW~bdj9oH(G)L;s>{wHL8fsPZvMl(RoHek;SQgpqY>WVs?FywBQx-sA4B^2Th`%
ztOg-tI!UXjHSz_TrGunkw4r^h+d2mQ!~!eX9I$vO2v=#bY;e4&^$W>HqpOYPTnI#2
zd|HY6+tCOX=m#gS2Z@-^bRsEds65#1yKyx5fDBE-QuOCZpNfi=Km-N~V^N9udZL(;
zduvPfCT(-0B3J_GQmc%rZZd<1TM`acSct7(yEbgueII|*FNy9TP*zsvx{OO|GOO{0
z(osB%<4;u-3~Hej`NXs^$XR(vMB@y_|8en#gR^Am?rzEC{P%z9qU3>c(O8n+mOCE5
zAMne8Ps&LgCx_K4;kruW@88k=W0TwGbPgegmFKA_z5gZQtEfGShkMf_5c8=cF`m4@
z4;*6TBsO63iiD-@N(Nv+Q`L_t7HvaW6F|l%1+qWYhg%mqZ|c+pfCBd$QBDQB@i7n;
zcJ!J9w1gFVI{8O;u%holUTr8_={Yio&>^7kSoCqh9VZvL&IgV&NbbjO22zw#LPFV`
zKUU*WH-bTd2x2eT@@2^D%MGP{q(BWyF)QQikth!jnMp%k<*B8Ro#pdMc=B6&OcdH+{wk7dxvFLO+La=VMylJn&)GvvnI~_a@z
zDx=QZs9Z1@a~G(u%Pf*g#Q=Ik={tk;=%bv?WyPh%AHwFuW=L&s#Gr^Qjn^}DrFqF_
z($mJ?8T&h{t*x!mBO|i+gxTfVowLxF;b7uLT@p>J=mNCmJyt~cDt=q4b5;ApVr;%*
z19RS?aJ8;>?9!Q@Mr4P(0w-KTg){Uugw=kqHH_sO1MryxnP1*3Z>XO8AlTK#|9`wb
bc18ZgoAVP_-rE*%hYkQ|W^Kwa_D=f`kwzE=
From 076910eb04ae827e924bdbdb498793c561fba9de Mon Sep 17 00:00:00 2001
From: wrexbe <81056464+wrexbe@users.noreply.github.com>
Date: Fri, 3 Dec 2021 16:26:51 -0800
Subject: [PATCH 09/40] Multiply pushback ratio by 10 for better recovery from
being spaced (#5687)
Co-authored-by: 20kdc
---
Content.Server/Throwing/ThrowHelper.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Content.Server/Throwing/ThrowHelper.cs b/Content.Server/Throwing/ThrowHelper.cs
index 2c5af74fd6..46035fd304 100644
--- a/Content.Server/Throwing/ThrowHelper.cs
+++ b/Content.Server/Throwing/ThrowHelper.cs
@@ -29,8 +29,8 @@ namespace Content.Server.Throwing
/// A vector pointing from the entity to its destination.
/// How much the direction vector should be multiplied for velocity.
///
- /// The ratio of impulse applied to the thrower
- internal static void TryThrow(this IEntity entity, Vector2 direction, float strength = 1.0f, IEntity? user = null, float pushbackRatio = 1.0f)
+ /// The ratio of impulse applied to the thrower - defaults to 10 because otherwise it's not enough to properly recover from getting spaced
+ internal static void TryThrow(this IEntity entity, Vector2 direction, float strength = 1.0f, IEntity? user = null, float pushbackRatio = 10.0f)
{
if (entity.Deleted ||
strength <= 0f ||
From 436c5da78d1c83f768faba345d4bbddf2f388ad6 Mon Sep 17 00:00:00 2001
From: PJBot
Date: Fri, 3 Dec 2021 19:27:55 -0500
Subject: [PATCH 10/40] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 4fc562e1ef..6158e2f5f6 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,9 +1,4 @@
Entries:
-- author: Zumorica
- changes:
- - {message: Fixes lathes not printing any recipe., type: Fix}
- id: 201
- time: '2021-05-22T09:31:38.140827+00:00'
- author: Ygg01
changes:
- {message: StackVisualizer now correctly displays levels, type: Fix}
@@ -2866,3 +2861,8 @@ Entries:
- {message: The Salvage department is now partially there., type: Add}
id: 702
time: '2021-12-03T22:24:19.0000000+00:00'
+- author: 20kdc
+ changes:
+ - {message: Throw pushback ratio multiplied by 10., type: Tweak}
+ id: 703
+ time: '2021-12-04T00:26:52.0000000+00:00'
From 55cad57f967b71d046e5f668e19e23b972c25f23 Mon Sep 17 00:00:00 2001
From: Pieter-Jan Briers
Date: Sat, 4 Dec 2021 01:28:16 +0100
Subject: [PATCH 11/40] Change build URL to be off-cloudflare
---
Tools/gen_build_info.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Tools/gen_build_info.py b/Tools/gen_build_info.py
index 6c3878ba55..551605eb53 100755
--- a/Tools/gen_build_info.py
+++ b/Tools/gen_build_info.py
@@ -19,7 +19,7 @@ SERVER_FILES = [
VERSION = os.environ['GITHUB_SHA']
FORK_ID = "wizards"
-BUILD_URL = f"https://central.spacestation14.io/builds/wizards/builds/{VERSION}/{FILE}"
+BUILD_URL = f"http://centcomm.spacestation14.io/builds/wizards/builds/{VERSION}/{FILE}"
def main() -> None:
manifest = generate_manifest("release")
From c33d06c5440f524035c2dbfdaf46fffd57aee578 Mon Sep 17 00:00:00 2001
From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Date: Sat, 4 Dec 2021 21:11:48 +1300
Subject: [PATCH 12/40] lung fix (#5697)
---
Content.Server/Body/Systems/LungSystem.cs | 6 +++---
.../Body/Systems/RespiratorSystem.cs | 19 +++++++++----------
2 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/Content.Server/Body/Systems/LungSystem.cs b/Content.Server/Body/Systems/LungSystem.cs
index 9e77149c06..5893c10c15 100644
--- a/Content.Server/Body/Systems/LungSystem.cs
+++ b/Content.Server/Body/Systems/LungSystem.cs
@@ -50,7 +50,7 @@ public class LungSystem : EntitySystem
Inhale(uid, lung.CycleDelay);
}
- public void UpdateLung(EntityUid uid, float frameTime,
+ public void UpdateLung(EntityUid uid,
LungComponent? lung=null,
SharedMechanismComponent? mech=null)
{
@@ -69,8 +69,8 @@ public class LungSystem : EntitySystem
lung.AccumulatedFrametime += lung.Status switch
{
- LungStatus.Inhaling => frameTime,
- LungStatus.Exhaling => -frameTime,
+ LungStatus.Inhaling => 1,
+ LungStatus.Exhaling => -1,
_ => throw new ArgumentOutOfRangeException()
};
diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs
index 6f3cc8023f..fe257f316c 100644
--- a/Content.Server/Body/Systems/RespiratorSystem.cs
+++ b/Content.Server/Body/Systems/RespiratorSystem.cs
@@ -36,37 +36,36 @@ namespace Content.Server.Body.Systems
if (!EntityManager.TryGetComponent(uid, out var state) ||
state.IsDead())
{
- return;
+ continue;
}
respirator.AccumulatedFrametime += frameTime;
if (respirator.AccumulatedFrametime < 1)
{
- return;
+ continue;
}
- ProcessGases(uid, respirator, frameTime, blood, body);
+ ProcessGases(uid, respirator, blood, body);
respirator.AccumulatedFrametime -= 1;
if (SuffocatingPercentage(respirator) > 0)
{
TakeSuffocationDamage(uid, respirator);
- return;
+ continue;
}
StopSuffocation(uid, respirator);
}
}
-
- private Dictionary NeedsAndDeficit(RespiratorComponent respirator, float frameTime)
+ private Dictionary NeedsAndDeficit(RespiratorComponent respirator)
{
var needs = new Dictionary(respirator.NeedsGases);
foreach (var (gas, amount) in respirator.DeficitGases)
{
- var newAmount = (needs.GetValueOrDefault(gas) + amount) * frameTime;
+ var newAmount = (needs.GetValueOrDefault(gas) + amount);
needs[gas] = newAmount;
}
@@ -130,7 +129,7 @@ namespace Content.Server.Body.Systems
return respirator.ProducesGases.ToDictionary(pair => pair.Key, pair => GasProducedMultiplier(respirator, pair.Key, usedAverage));
}
- private void ProcessGases(EntityUid uid, RespiratorComponent respirator, float frameTime,
+ private void ProcessGases(EntityUid uid, RespiratorComponent respirator,
BloodstreamComponent? bloodstream,
SharedBodyComponent? body)
{
@@ -139,12 +138,12 @@ namespace Content.Server.Body.Systems
var lungs = _bodySystem.GetComponentsOnMechanisms(uid, body).ToArray();
- var needs = NeedsAndDeficit(respirator, frameTime);
+ var needs = NeedsAndDeficit(respirator);
var used = 0f;
foreach (var (lung, mech) in lungs)
{
- _lungSystem.UpdateLung(lung.OwnerUid, frameTime, lung, mech);
+ _lungSystem.UpdateLung(lung.OwnerUid, lung, mech);
}
foreach (var (gas, amountNeeded) in needs)
From 787c82b4126d4962a994c6dcb5548024348804e4 Mon Sep 17 00:00:00 2001
From: PJBot
Date: Sat, 4 Dec 2021 03:12:51 -0500
Subject: [PATCH 13/40] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 6158e2f5f6..7dc00afe8f 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,9 +1,4 @@
Entries:
-- author: Ygg01
- changes:
- - {message: StackVisualizer now correctly displays levels, type: Fix}
- id: 202
- time: '2021-05-23T04:05:55.0000000+00:00'
- author: 20kdc
changes:
- {message: Hopefully fix power equipment disappearing., type: Fix}
@@ -2866,3 +2861,9 @@ Entries:
- {message: Throw pushback ratio multiplied by 10., type: Tweak}
id: 703
time: '2021-12-04T00:26:52.0000000+00:00'
+- author: ElectroJr
+ changes:
+ - {message: Fixed some issues preventing mobs from taking proper suffocation damage.,
+ type: Fix}
+ id: 704
+ time: '2021-12-04T08:11:48.0000000+00:00'
From 863a85cef6b4a8ba6cc6127de31b84f88c170335 Mon Sep 17 00:00:00 2001
From: Flipp Syder <76629141+vulppine@users.noreply.github.com>
Date: Sat, 4 Dec 2021 01:01:37 -0800
Subject: [PATCH 14/40] adds toggles for accessreaders (#5696)
---
Content.Server/Access/Components/AccessReaderComponent.cs | 7 +++++++
Content.Server/Access/Systems/AccessReaderSystem.cs | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/Content.Server/Access/Components/AccessReaderComponent.cs b/Content.Server/Access/Components/AccessReaderComponent.cs
index e71e71460e..dbcfa39999 100644
--- a/Content.Server/Access/Components/AccessReaderComponent.cs
+++ b/Content.Server/Access/Components/AccessReaderComponent.cs
@@ -25,6 +25,13 @@ namespace Content.Server.Access.Components
{
public override string Name => "AccessReader";
+ ///
+ /// Whether this reader is enabled or not. If disabled, all access
+ /// checks will pass.
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ public bool Enabled = true;
+
///
/// The set of tags that will automatically deny an allowed check, if any of them are present.
///
diff --git a/Content.Server/Access/Systems/AccessReaderSystem.cs b/Content.Server/Access/Systems/AccessReaderSystem.cs
index e1d3b16e76..0e090eca6c 100644
--- a/Content.Server/Access/Systems/AccessReaderSystem.cs
+++ b/Content.Server/Access/Systems/AccessReaderSystem.cs
@@ -60,7 +60,7 @@ namespace Content.Server.Access.Systems
return false;
}
- return reader.AccessLists.Count == 0 || reader.AccessLists.Any(a => a.IsSubsetOf(accessTags));
+ return !reader.Enabled || reader.AccessLists.Count == 0 || reader.AccessLists.Any(a => a.IsSubsetOf(accessTags));
}
public ICollection FindAccessTags(EntityUid uid)
From 4a161325f5a33739a9f9a3bd20b29d834b6199c7 Mon Sep 17 00:00:00 2001
From: Flipp Syder <76629141+vulppine@users.noreply.github.com>
Date: Sat, 4 Dec 2021 01:59:09 -0800
Subject: [PATCH 15/40] adds interactusing to electrocution (#5693)
---
.../Electrocution/Components/ElectrifiedComponent.cs | 3 +++
Content.Server/Electrocution/ElectrocutionSystem.cs | 9 +++++++++
2 files changed, 12 insertions(+)
diff --git a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs b/Content.Server/Electrocution/Components/ElectrifiedComponent.cs
index 1c10308613..9e0da6d030 100644
--- a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs
+++ b/Content.Server/Electrocution/Components/ElectrifiedComponent.cs
@@ -26,6 +26,9 @@ namespace Content.Server.Electrocution
[DataField("onHandInteract")]
public bool OnHandInteract { get; set; } = true;
+ [DataField("onInteractUsing")]
+ public bool OnInteractUsing { get; set; } = true;
+
[DataField("requirePower")]
public bool RequirePower { get; } = true;
diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs
index 8abce7202a..4e02c239f0 100644
--- a/Content.Server/Electrocution/ElectrocutionSystem.cs
+++ b/Content.Server/Electrocution/ElectrocutionSystem.cs
@@ -75,6 +75,7 @@ namespace Content.Server.Electrocution
SubscribeLocalEvent(OnElectrifiedStartCollide);
SubscribeLocalEvent(OnElectrifiedAttacked);
SubscribeLocalEvent(OnElectrifiedHandInteract);
+ SubscribeLocalEvent(OnElectrifiedInteractUsing);
SubscribeLocalEvent(OnRandomInsulationMapInit);
UpdatesAfter.Add(typeof(PowerNetSystem));
@@ -142,6 +143,14 @@ namespace Content.Server.Electrocution
TryDoElectrifiedAct(uid, args.User.Uid, electrified);
}
+ private void OnElectrifiedInteractUsing(EntityUid uid, ElectrifiedComponent electrified, InteractUsingEvent args)
+ {
+ if (!electrified.OnInteractUsing)
+ return;
+
+ TryDoElectrifiedAct(uid, args.User.Uid, electrified);
+ }
+
public bool TryDoElectrifiedAct(EntityUid uid, EntityUid targetUid,
ElectrifiedComponent? electrified = null,
NodeContainerComponent? nodeContainer = null,
From 08c2aeec1bd06a860ea3878a1b35e39a17363455 Mon Sep 17 00:00:00 2001
From: PJBot
Date: Sat, 4 Dec 2021 05:00:12 -0500
Subject: [PATCH 16/40] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 7dc00afe8f..61e13519f5 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,9 +1,4 @@
Entries:
-- author: 20kdc
- changes:
- - {message: Hopefully fix power equipment disappearing., type: Fix}
- id: 203
- time: '2021-05-23T18:18:36.0000000+00:00'
- author: Seth
changes:
- {message: Added new technologies and recipes to the lathe., type: Add}
@@ -2867,3 +2862,9 @@ Entries:
type: Fix}
id: 704
time: '2021-12-04T08:11:48.0000000+00:00'
+- author: vulppine
+ changes:
+ - {message: Tools (along with many other objects) have been stripped of their insulated
+ property. Go get some real insulated gloves!, type: Fix}
+ id: 705
+ time: '2021-12-04T09:59:09.0000000+00:00'
From 49a5696fd64826afec3c0fadb7dafbef4d90e29d Mon Sep 17 00:00:00 2001
From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Date: Sun, 5 Dec 2021 00:33:21 +1300
Subject: [PATCH 17/40] Add Syringe DoAfter (#5658)
* syringe do after
* fix spacing
* delay and log tweaks
* Apply suggestions from code review
Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
* clean up comments
Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
---
.../Chemistry/Components/InjectorComponent.cs | 110 +++++++++++++++++-
Content.Shared.Database/LogType.cs | 5 +-
.../components/injector-component.ftl | 5 +
3 files changed, 113 insertions(+), 7 deletions(-)
diff --git a/Content.Server/Chemistry/Components/InjectorComponent.cs b/Content.Server/Chemistry/Components/InjectorComponent.cs
index b922aabd5c..aab8a633d5 100644
--- a/Content.Server/Chemistry/Components/InjectorComponent.cs
+++ b/Content.Server/Chemistry/Components/InjectorComponent.cs
@@ -1,18 +1,25 @@
using System;
using System.Threading.Tasks;
+using Content.Server.Administration.Logs;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Server.Chemistry.Components.SolutionManager;
using Content.Server.Chemistry.EntitySystems;
+using Content.Server.CombatMode;
+using Content.Server.DoAfter;
+using Content.Shared.ActionBlocker;
using Content.Shared.Body.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
+using Content.Shared.Database;
using Content.Shared.FixedPoint;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Helpers;
+using Content.Shared.MobState.Components;
using Content.Shared.Popups;
using Robust.Shared.GameObjects;
using Robust.Shared.Localization;
+using Robust.Shared.Player;
using Robust.Shared.Players;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
@@ -41,16 +48,25 @@ namespace Content.Server.Chemistry.Components
/// Amount to inject or draw on each usage. If the injector is inject only, it will
/// attempt to inject it's entire contents upon use.
///
- [ViewVariables]
+ [ViewVariables(VVAccess.ReadWrite)]
[DataField("transferAmount")]
private FixedPoint2 _transferAmount = FixedPoint2.New(5);
///
- /// Initial storage volume of the injector
+ /// Injection delay (seconds) when the target is a mob.
///
- [ViewVariables]
- [DataField("initialMaxVolume")]
- private FixedPoint2 _initialMaxVolume = FixedPoint2.New(15);
+ ///
+ /// The base delay has a minimum of 1 second, but this will still be modified if the target is incapacitated or
+ /// in combat mode.
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ [DataField("delay")]
+ public float Delay = 5;
+
+ ///
+ /// Is this component currently being used in a DoAfter?
+ ///
+ public bool InUse = false;
private InjectorToggleMode _toggleState;
@@ -111,9 +127,15 @@ namespace Content.Server.Chemistry.Components
///
async Task IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs)
{
+ if (InUse)
+ return false;
+
if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true))
return false;
+ if (!EntitySystem.Get().CanInteract(eventArgs.User.Uid))
+ return false;
+
var solutionsSys = EntitySystem.Get();
//Make sure we have the attacking entity
if (eventArgs.Target == null || !Owner.HasComponent())
@@ -123,6 +145,13 @@ namespace Content.Server.Chemistry.Components
var targetEntity = eventArgs.Target;
+ // Is the target a mob? If yes, use a do-after to give them time to respond.
+ if (Owner.EntityManager.HasComponent(targetEntity.Uid) ||
+ Owner.EntityManager.HasComponent(targetEntity.Uid))
+ {
+ if (!await TryInjectDoAfter(eventArgs.User.Uid, eventArgs.Target.Uid))
+ return true;
+ }
// Handle injecting/drawing for solutions
if (ToggleState == InjectorToggleMode.Inject)
@@ -163,6 +192,77 @@ namespace Content.Server.Chemistry.Components
return true;
}
+ ///
+ /// Send informative pop-up messages and wait for a do-after to complete.
+ ///
+ public async Task TryInjectDoAfter(EntityUid user, EntityUid target)
+ {
+ InUse = true;
+ var popupSys = EntitySystem.Get();
+
+ // Create a pop-up for the user
+ popupSys.PopupEntity(Loc.GetString("injector-component-injecting-user"), target, Filter.Entities(user));
+
+ // Get entity for logging. Log with EntityUids when?
+ var userEntity = Owner.EntityManager.GetEntity(user);
+ var logSys = EntitySystem.Get();
+
+ var actualDelay = MathF.Max(Delay, 1f);
+ if (user != target)
+ {
+ // Create a pop-up for the target
+ var userName = Owner.EntityManager.GetComponent(user).EntityName;
+ popupSys.PopupEntity(Loc.GetString("injector-component-injecting-target",
+ ("user", userName)), user, Filter.Entities(target));
+
+ // Check if the target is incapacitated or in combat mode and modify time accordingly.
+ if (Owner.EntityManager.TryGetComponent(target, out var mobState) &&
+ mobState.IsIncapacitated())
+ {
+ actualDelay /= 2;
+ }
+ else if (Owner.EntityManager.TryGetComponent(target, out var combat) &&
+ combat.IsInCombatMode)
+ {
+ // Slightly increase the delay when the target is in combat mode. Helps prevents cheese injections in
+ // combat with fast syringes & lag.
+ actualDelay += 1;
+ }
+
+ // Add an admin log, using the "force feed" log type. It's not quite feeding, but the effect is the same.
+ var targetEntity = Owner.EntityManager.GetEntity(target);
+ if (ToggleState == InjectorToggleMode.Inject)
+ {
+ logSys.Add(LogType.ForceFeed,
+ $"{userEntity} is attempting to inject a solution into {targetEntity}");
+ // TODO solution pretty string.
+ }
+ }
+ else
+ {
+ // Self-injections take half as long.
+ actualDelay /= 2;
+
+ if (ToggleState == InjectorToggleMode.Inject)
+ logSys.Add(LogType.Ingestion,
+ $"{userEntity} is attempting to inject themselves with a solution.");
+ //TODO solution pretty string.
+ }
+
+ var status = await EntitySystem.Get().WaitDoAfter(
+ new DoAfterEventArgs(user, actualDelay, target: target)
+ {
+ BreakOnUserMove = true,
+ BreakOnDamage = true,
+ BreakOnStun = true,
+ BreakOnTargetMove = true,
+ MovementThreshold = 1.0f
+ });
+ InUse = false;
+
+ return status == DoAfterStatus.Finished;
+ }
+
///
/// Called when use key is pressed when held in active hand
///
diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs
index e6a5fe9bed..154c0ea3d6 100644
--- a/Content.Shared.Database/LogType.cs
+++ b/Content.Shared.Database/LogType.cs
@@ -1,4 +1,4 @@
-namespace Content.Shared.Database;
+namespace Content.Shared.Database;
// DO NOT CHANGE THE NUMERIC VALUES OF THESE
public enum LogType
@@ -40,7 +40,8 @@ public enum LogType
Pickup = 36,
Drop = 37,
BulletHit = 38,
- ForceFeed = 40,
+ ForceFeed = 40, // involuntary
+ Ingestion = 53, // voluntary
MeleeHit = 41,
HitScanHit = 42,
Suicide = 43,
diff --git a/Resources/Locale/en-US/chemistry/components/injector-component.ftl b/Resources/Locale/en-US/chemistry/components/injector-component.ftl
index 84e58824a6..4249c14e87 100644
--- a/Resources/Locale/en-US/chemistry/components/injector-component.ftl
+++ b/Resources/Locale/en-US/chemistry/components/injector-component.ftl
@@ -17,3 +17,8 @@ injector-component-transfer-success-message = You transfer {$amount}u into {$tar
injector-component-draw-success-message = You draw {$amount}u from {$target}.
injector-component-target-already-full-message = {$target} is already full!
injector-component-target-is-empty-message = {$target} is empty!
+
+## mob-inject doafter messages
+
+injector-component-injecting-user = You start inserting the needle.
+injector-component-injecting-target = {$user} is trying to stick a needle into you!
From 89330f519fde1370fb75452eb65b503076e81b39 Mon Sep 17 00:00:00 2001
From: Peptide90 <78795277+Peptide90@users.noreply.github.com>
Date: Sat, 4 Dec 2021 18:50:24 +0000
Subject: [PATCH 18/40] Fixes flare duration and burn out (#5700)
---
.../Prototypes/Entities/Objects/Tools/flare.yml | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/Resources/Prototypes/Entities/Objects/Tools/flare.yml b/Resources/Prototypes/Entities/Objects/Tools/flare.yml
index 06d0a57b55..10175d6a08 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/flare.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/flare.yml
@@ -10,8 +10,8 @@
- type: ExpendableLight
spentName: spent flare
spentDesc: It looks like this flare has burnt out. What a bummer.
- glowDuration: 150
- fadeOutDuration: 4
+ glowDuration: 45
+ fadeOutDuration: 15
iconStateOn: flare_unlit
iconStateSpent: flare_spent
turnOnBehaviourID: turn_on
@@ -52,15 +52,15 @@
minDuration: 0.02
maxDuration: 0.06
startValue: 6.0
- endValue: 9.0
+ endValue: 15.0
property: Energy
isLooped: true
- !type:FadeBehaviour # have the radius start small and get larger as it starts to burn
id: turn_on
interpolate: Linear
- maxDuration: 8.0
- startValue: 1.0
- endValue: 6.0
+ maxDuration: 45.0 #duration of light
+ startValue: 2.5
+ endValue: 10.0
property: Radius
- !type:RandomizeBehaviour # weaker flicker as it fades out
id: fade_out
@@ -74,7 +74,7 @@
- !type:FadeBehaviour # fade out radius as it burns out
id: fade_out
interpolate: Linear
- maxDuration: 4.0
- startValue: 6.0
+ maxDuration: 15.0
+ startValue: 8.0
endValue: 1.0
property: Radius
From 09d32e4734dbd5a9815382317a30f54e76f8415a Mon Sep 17 00:00:00 2001
From: PJBot
Date: Sat, 4 Dec 2021 13:51:27 -0500
Subject: [PATCH 19/40] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 61e13519f5..f09388216b 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,9 +1,4 @@
Entries:
-- author: Seth
- changes:
- - {message: Added new technologies and recipes to the lathe., type: Add}
- id: 204
- time: '2021-05-24T00:38:26.0000000+00:00'
- author: 20kdc
changes:
- {message: Particle Accelerator particles actually affect singularity & singularity
@@ -2868,3 +2863,8 @@ Entries:
property. Go get some real insulated gloves!, type: Fix}
id: 705
time: '2021-12-04T09:59:09.0000000+00:00'
+- author: Peptide90
+ changes:
+ - {message: Fixed flares so they now burn longer and burn out slower., type: Fix}
+ id: 706
+ time: '2021-12-04T18:50:25.0000000+00:00'
From 07c52694ed6172c1888783aef06833b7eac32048 Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Sun, 5 Dec 2021 05:52:14 +1100
Subject: [PATCH 20/40] Standardise seat bounds (#5676)
---
.../Entities/Structures/Furniture/chairs.yml | 80 +------------------
.../Entities/Structures/Furniture/toilet.yml | 6 --
.../Entities/Structures/Walls/grille.yml | 11 ---
3 files changed, 3 insertions(+), 94 deletions(-)
diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
index f5aa2f58a6..1ea3b3c08e 100644
--- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
+++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
@@ -13,12 +13,12 @@
- type: Fixtures
fixtures:
- shape:
- !type:PhysShapeAabb
- bounds: "-0.25,-0.5,0.25,0.5"
+ !type:PhysShapeCircle
+ radius: 0.2
mask:
- Impassable
- - VaultImpassable
- SmallImpassable
+ mass: 10
- type: Sprite
sprite: Structures/Furniture/chairs.rsi
noRot: true
@@ -51,16 +51,6 @@
- type: Rotatable
- type: Sprite
state: chair
- - type: Physics
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.45,-0.45,0.45,0.05"
- mask:
- - Impassable
- - VaultImpassable
- - SmallImpassable
- type: Construction
graph: seat
node: chair
@@ -74,17 +64,6 @@
- type: Anchorable
- type: Sprite
state: stool
- - type: Physics
- bodyType: Static
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.25,-0.5,0.25,0.05"
- mask:
- - Impassable
- - VaultImpassable
- - SmallImpassable
- type: Construction
graph: seat
node: stool
@@ -101,17 +80,6 @@
- type: Anchorable
- type: Sprite
state: bar
- - type: Physics
- bodyType: Static
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.2,-0.5,0.25,0.2"
- mask:
- - Impassable
- - VaultImpassable
- - SmallImpassable
- type: Construction
graph: seat
node: stoolBar
@@ -125,16 +93,6 @@
rotateWhileAnchored: true
- type: Sprite
state: office-white
- - type: Physics
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.25,-0.49,0.25,0.37"
- mask:
- - Impassable
- - VaultImpassable
- - SmallImpassable
- type: Construction
graph: seat
node: chairOffice
@@ -161,17 +119,6 @@
- type: Anchorable
- type: Sprite
state: comfy
- - type: Physics
- bodyType: Static
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.3,-0.45,0.3,0.35"
- mask:
- - Impassable
- - VaultImpassable
- - SmallImpassable
- type: Construction
graph: seat
node: chairComfy
@@ -184,16 +131,6 @@
- type: Sprite
state: wooden
- type: Rotatable
- - type: Physics
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.25,-0.37,0.24,0.49"
- mask:
- - Impassable
- - VaultImpassable
- - SmallImpassable
- type: Construction
graph: seat
node: chairWood
@@ -232,14 +169,3 @@
- type: Sprite
state: shuttle
netsync: false
- - type: Physics
- bodyType: Static
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.45,-0.45,0.45,0.05"
- mask:
- - Impassable
- - VaultImpassable
- - SmallImpassable
diff --git a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml
index 11a620b6f5..ad961c353b 100644
--- a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml
+++ b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml
@@ -17,12 +17,6 @@
solutions:
toilet:
maxVol: 250
- - type: Physics
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb {}
- layer: [ Passable ]
- type: Construction
graph: toilet
node: toilet
diff --git a/Resources/Prototypes/Entities/Structures/Walls/grille.yml b/Resources/Prototypes/Entities/Structures/Walls/grille.yml
index 02e8ec7b9d..5e6b6a9650 100644
--- a/Resources/Prototypes/Entities/Structures/Walls/grille.yml
+++ b/Resources/Prototypes/Entities/Structures/Walls/grille.yml
@@ -85,17 +85,6 @@
graph: grille
node: grilleBroken
deconstructionTarget: start
- - type: Physics
- - type: Fixtures
- fixtures:
- - shape:
- !type:PhysShapeAabb
- bounds: "-0.5,-0.5,0.5,0.5"
- mass: 50
- layer:
- - Passable
- mask:
- - Passable
- type: Damageable
damageContainer: Inorganic
damageModifierSet: FlimsyMetallic
From 2f130e55863a42be58ad4ecb51d002a060182909 Mon Sep 17 00:00:00 2001
From: Elijahrane <60792108+Elijahrane@users.noreply.github.com>
Date: Sun, 5 Dec 2021 02:55:04 +0800
Subject: [PATCH 21/40] Nettles (#5641)
---
.../Catalog/Fills/Crates/botany.yml | 4 +-
.../Objects/Consumable/Food/produce.yml | 31 ++++++++++++
.../Objects/Specific/Hydroponics/seeds.yml | 11 +++++
Resources/Prototypes/Hydroponics/seeds.yml | 23 +++++++++
.../Specific/Hydroponics/nettle.rsi/dead.png | Bin 0 -> 1742 bytes
.../Hydroponics/nettle.rsi/harvest.png | Bin 0 -> 2338 bytes
.../Hydroponics/nettle.rsi/inhand-left.png | Bin 0 -> 672 bytes
.../Hydroponics/nettle.rsi/inhand-right.png | Bin 0 -> 758 bytes
.../Specific/Hydroponics/nettle.rsi/meta.json | 46 ++++++++++++++++++
.../Hydroponics/nettle.rsi/produce.png | Bin 0 -> 1385 bytes
.../Specific/Hydroponics/nettle.rsi/seed.png | Bin 0 -> 835 bytes
.../Hydroponics/nettle.rsi/stage-1.png | Bin 0 -> 792 bytes
.../Hydroponics/nettle.rsi/stage-2.png | Bin 0 -> 996 bytes
.../Hydroponics/nettle.rsi/stage-3.png | Bin 0 -> 1326 bytes
.../Hydroponics/nettle.rsi/stage-4.png | Bin 0 -> 1664 bytes
.../Hydroponics/nettle.rsi/stage-5.png | Bin 0 -> 2145 bytes
16 files changed, 113 insertions(+), 2 deletions(-)
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/dead.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/harvest.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/inhand-left.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/inhand-right.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/meta.json
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/produce.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/seed.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/stage-1.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/stage-2.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/stage-3.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/stage-4.png
create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/stage-5.png
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/botany.yml b/Resources/Prototypes/Catalog/Fills/Crates/botany.yml
index 1073a53069..b1f4ba9713 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/botany.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/botany.yml
@@ -16,8 +16,8 @@
amount: 2
- id: CannabisSeeds
amount: 2
-# - id: NettleSeeds
-# amount: 2
+ - id: NettleSeeds
+ amount: 2
# - id: RainbowBunchSeeds
# amount: 2
# - id: StrangeSeeds
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml
index 538049024d..503ba2497e 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml
@@ -102,6 +102,37 @@
seed: towercap
- type: Log
+- type: entity
+ name: nettle
+ description: Stingy little prick.
+ id: Nettle
+ parent: ProduceBase
+ components:
+ - type: Sprite
+ sprite: Objects/Specific/Hydroponics/nettle.rsi
+ - type: Item
+ size: 10
+ sprite: Objects/Specific/Hydroponics/nettle.rsi
+ prefix: inhand
+ - type: MeleeWeapon
+ damage:
+ types:
+ Heat: 10
+ - type: SolutionContainerManager
+ solutions:
+ food:
+ reagents:
+ - ReagentId: Histamine
+ Quantity: 25
+ - type: Produce
+ seed: nettle
+ - type: MeleeChemicalInjector
+ transferAmount: 6 #To OD someone you would need 2 nettles and about 6-7 hits, the DOT is likely to crit them if they are running away with almost no health
+ - type: Extractable
+ grindableSolutionName: food
+ - type: InjectableSolution
+ solution: food
+
- type: entity
name: banana
parent: FoodProduceBase
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml
index 2efe6a83b4..4d8ad1d51b 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml
@@ -181,3 +181,14 @@
seed: cannabis
- type: Sprite
sprite: Objects/Specific/Hydroponics/cannabis.rsi
+
+- type: entity
+ parent: SeedBase
+ name: packet of nettle seeds
+ description: "Handle with gloves."
+ id: NettleSeeds
+ components:
+ - type: Seed
+ seed: nettle
+ - type: Sprite
+ sprite: Objects/Specific/Hydroponics/nettle.rsi
diff --git a/Resources/Prototypes/Hydroponics/seeds.yml b/Resources/Prototypes/Hydroponics/seeds.yml
index 6a748b5dbf..02d9b2c056 100644
--- a/Resources/Prototypes/Hydroponics/seeds.yml
+++ b/Resources/Prototypes/Hydroponics/seeds.yml
@@ -424,3 +424,26 @@
Min: 1
Max: 10
PotencyDivisor: 10
+
+- type: seed
+ id: nettle
+ name: nettle
+ seedName: nettle
+ displayName: nettles
+ plantRsi: Objects/Specific/Hydroponics/nettle.rsi
+ productPrototypes:
+ - Nettle
+ lifespan: 25
+ maturation: 8
+ production: 6
+ yield: 3
+ potency: 20
+ growthStages: 5
+ idealLight: 8
+ waterConsumption: 6
+ idealHeat: 298
+ chemicals:
+ Histamine:
+ Min: 1
+ Max: 25
+ PotencyDivisor: 4
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/dead.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9d49d6a6f7763619cb513dd093ba5ae036a557c
GIT binary patch
literal 1742
zcmV;<1~K`GP)EX>4Tx04R}tkv&MmKpe$iQ;VV%5i5!~WT;LSL`5963Pq?8YK2xEOfLO`CJjl7
zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2ziIPS;0dyl(!fKV+m&1xG5G~G56
zv8b3zuZr!j=)wSc5kSApEMrcR;%GU(?&0I>U4&<~KKJM7Rx=g@d?N8IGfbO!gLrz=
zHaPDShge=#iO-40Ou8WPBi9v=-#F)77IteDHam6A8p|ua{Usy6mk{7
z$gzMDG{~+W{11M2Yh@=Vyrf_h2)sDX#|Y5A3)Cu(^L^|%wG+Vq3|#3Af2j)0e3D*i
zXyGHEXB)VeSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00gEOaOzl3LKDFtATi8Qy0A%IkS3jmZYC~Ryu~zO*GXy8(AcD*$$KHDF;by)3_5@9)QpjAXpv*fg+d;DsAV
zSx@Zj>{I~=0D5C%qxzo`&@@erMx!Esca);hsCb^_nx?6mruj8ZQ=gfDX_{hsCP=#r
z_rNsGHF`%!M~n^t=qFE}RO96+DoLSV?wX>bqXY5gBqU%MhMu05E0><*>0){&NJS+n
zWEh4>kOKfPJrhhgC!v8;r%tJ{%1zTmdwaXTy}eysR-JC!=9G!_*f;>#wmGF~n)
zTppJIbdSfQZm1D4vq(z^DT)JjyA8{U0Koi0n3!3_ewkUnba6~p9NGisMYC?VTV-Y}
z8vbX@?RNX!Zuc4^Ny~3U&CSg!0I_>d7Uk~Dz_o#ZT&h%L=cH3XVGc$EAppRip;=3-
zZz!SO?z=LUr}0Dub!x+wzG^HMy4UMfR}k=ez1BY1mA?boIq6oV_kvRr0PJ>~MTeQi
z;i^LFI(JJlGm=xI#LT!CoU-)f)F{dQ;=
zU|F7($d!1%)}Z
zlmqkgPcRw?!ST{|I$BeT3thvKne{Vg&Zuinfe=CkAojmjKo2Lwa4wCPl@ra+KY=4{
zI}Hx`aj3EwgF_OIG#iTdX2EW^p{$&!cyAU)ZjK{7JCCevg_g|V+_zUH0DSi8cmH|}
z#gXcRbmj7hY!q+O?Vp1f4TP}pWRXDWzI*_{;E*2x5Se?7NZ7>mR0O5_@~xNif&piy
zg3&+-4=2NT@BM006bH_py$%5Qee8kNm{y#E95Vuz}T4S68P35Do7fq3#P;q|fIo-sl
k-*ev=lQ#bw{_hR^4IhoKB2YimkpKVy07*qoM6N<$g5c{Rj{pDw
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/harvest.png
new file mode 100644
index 0000000000000000000000000000000000000000..701cd8868f21703d8eac298257ddc7149a27f155
GIT binary patch
literal 2338
zcmV+-3ElRIP)EX>4Tx04R}tkv&MmKpe$iQ$^8=hy_JDWT;LS{6ZYH3Pq?8YK2xEOfLO`CJjl7
zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2ziIPS;0dyl(!fKV+m&1xG1G~G56
zv8b3zuZkV7=*9s05W=|3EMrcR;%GU(?&0I>U4&<~KKJM7Q8N|;d?N8IGfbO!gLrz=
zHaPDS2U%WLiO-2gO}ZfQBi9v=-#F)77Ib3)Cu(^L^|%wG+Vq3|#3Af2j)0e3D*i
zXyGHEcN@64ZfMFLaJd5vJ{htpyON)#kj(<`XY@^Jp#K)=TJw6V@8k3VNK#kv8{ps&
z7|BugdW&~=Huv`LnReSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00#O=L_t(o!=;y9Y?J2|$A6DQYy*xNv18}U2~i?QhU)gB
zBAYsq_JVac*(8WaAW<}`ZHZE?w38O0L16_nWw`-1HHBStA0;bn*`~@@`;Z#cO&UxS
zACreiVWbHSNo>cf<0Q^&;cj1x&H9_v32(V_+5kR>e`@x^qqc1
z^ntp1AHh~X9ldvW|KiiMG$U88HsyIXb>kF~aERwSub~Y<>ly%c^*;QrLCNjA1|R_1
zQB~epC6~?*tM;BYX$S_mduxKJ8>ax!M*XfqY24Xrez!E=mPk0nz9SFVy0wVAwjV;{b`ovgz3u_x%_h-WR%V5($S)g;viKiDdxp-IE20tCV*r#MqRxR
zO~&UtuMr7{)_~B)FJBl@$!IJOgjK%O{S%WXnoAAA0PQ_(a_IP&$tj!8Q(e7}`}byO
z2nI}IX%JT9^-qim
z)c{|6^(oT}ZQQ!9LG11hU=6E|O5t9u-xH`bQ?|j%+J<0&nTLzq`Qu@;4kWr?6RYv~
z#3V{N^OXMiohY3jEHQjK1T>i`^#m%{C2f3S(!3EieNV04N5Ub>pLrdC58jEciOi+*
z7ga}Zmvr=W%7GP5JRD0ho$6QrtC#3>74pS)`ND{bPfVH!wf9yfrPZZtLMb9t)@?yV
zcy>=YKA%1B{;x+)D{)N#d%O2bX3=JbZTp^cX5OueGHD|(bQ+xi(R&L_O(&_UE6Y1)
zEj|E;kG~{SH%>7+ylb@?*_5KOxrz^OPLo;85FekVc%#GOX&P{0MSh^CO9c4)@4ihW
z9O8wpTL7dV73UH7VAF}bRNVOecUSh`1ahT#Lso>@#4?^5Z!X+hi}>eXAJE>@DV~7G
z^u(GLL72L6j7T`dH-7jKW5J+eN0n*lm$%=LLgNQ|yCf?@Rh^si8aGC^n4x1oQfhQ`
zl)c^i#Z$AIXU8TdvGFLnQI*wJvt^4io5_LRE^&EWAYk9@AU+;59f*y8%;@kg8h5th
zZ9D;z16;AA3cGCy5irEg(9v_bRO*RnZ})yd1p8(?0LDTF$0j?I*N;;E%!zaC&F8;RO;#kY5`OZD&=3q@-)tv39!1#{D0u(k)7<&fVM}Lp;0bsrt@V)2X33_h=AnKDy4{h6h&B~thSn^h4cz19N3gX
zL@*XJ{N=aL(zvsgovm*%I}t~%td)36a#zI$bFn!b&K$vAz7kT?bJ&WU%S6HcG$X3;ZTM-#
z+Vk6c+C-;9N3ZY&rA0q%bRyfqW&Rc&HdUeRvLVW+{;C}P*~
zWr{6_mmN=)h6dN0gYKOl79P^b;Wy6syHH^HhB@BHjx0PJZ$0^-(AviDbEZE3-dMQv
z`@G`1=ihgJx8vDomchr}@N5GEDs`1L*4@|YMUleC+KU=7)Lfy7g$
zUruXxT>iRl(~l^tsVn!C?k}zVaB0b_w=0AntT0=-ae{mX@Jo(w|F3#@k5aPVVGDF>F%A9WL
z<>yQ%-H!fv{8_i)W4&*46b;|szP%za!u^`vQqBS^euYf?D>84^AKxpT7*fd>Y_;#t
zb+;osW}a02!uQ*-pmL$*e!eG)z7B7a&uo~TH>-AU)0I=Rew_2J>T(J)%YOF!X6&|(
z2zH@~Y7d?*_N%HX7t^0tqqp-XQ<y+*O&+4_>`smD*+Y?|&^*_1!P$Bkr8|TlCsR
zQP`XH#;WWS;pH+93vPT;fA;;i=BHA*n^z_+&5l-EP_5$dNMe_r?$c7ypzT>#CQmih
z5ms1Tc+>R9c>$Al)+viKZcm-o74CmO|6SR-Nt-xs+{@WHOZGu)GF>G
zyN1t&bsGvJJbm=ivp3IiY;#*b5-)e(*w>K?y(;
n_Ngtnr-rpJD`q$#e0Ph-|sQ+l@@XB*)gTe~DWM4fy7@5u
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/inhand-right.png b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/inhand-right.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd346bdfed8a38ddb335cedecea7d17942ca0663
GIT binary patch
literal 758
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V0v
zPZ!6KiaBp**=GnRN*tR%<;IaEVntERVS-1KSfy3Gjy82$SYBPIbYo%j1xH5#mqLw4
zDY9H$e2na@t_%5OyF0pr0<+pe4E{L^1}kpsRo!Be@xk=|NzV+uD$erzPe1LoKjC<2
zV)gv{wdE&2?yJ+_<8FAgfdQ4;cymLp@LC=54S#f>J5LtAx8mZh0)fx-_q~cNW%T~(
z^tv^Auf3k^T$jzodKbI3)#JBGy)R{KZM}1TWoPA^*Y6i!_rIj^WOlwP%WczJwJW5R
zmY>M3`S)G!!;5oU#f>KrApGRFg-mP8B
z(0JqL$G_!QHd=NGU+2I4;=zvRDs%Q*JA7YvZo!nrSrv{~?Vau$N5;Qwy?D@MPsi2C
zX+P&D*vKuv(yp)Z?738#>5tpi8rzb&C!JjKR7#gyAl|BGZGVHF*PNMI7M%52+JAel
zM@0LcXX=%>v*6yXABh}YhnbE%d+>3uuD|@AU#zYg=T~zFXzp2HqaV){AS1?bG?5X5
zQuy7l`uAtHyt5h};v06^=RdgC(`3SU^%q1)@Wc9lHI{j2G%VB(WYyp6x!Jy3;AIWJ
zq%l_?=Z0JJ&69Nsg%@sHFh!E}I7`Ia^RpF;-3}TuhW-A0b%N>Q2QwI~xuzK|PFUSg
z_3QK22S<9Ea+zMeJ%7DP*qCb@=LA#hgztqASKqN%anq(L+L&t{hXMDiYduUL2R~)~
a!!}DiCrVoF*G*tTX7F_Nb6Mw<&;$UngjaR|
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/meta.json
new file mode 100644
index 0000000000..361c777a97
--- /dev/null
+++ b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/meta.json
@@ -0,0 +1,46 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "dead"
+ },
+ {
+ "name": "harvest"
+ },
+ {
+ "name": "produce"
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "seed"
+ },
+ {
+ "name": "stage-1"
+ },
+ {
+ "name": "stage-2"
+ },
+ {
+ "name": "stage-3"
+ },
+ {
+ "name": "stage-4"
+ },
+ {
+ "name": "stage-5"
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/produce.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b50100cd0f67a5fdd70962caacaaf26803a1ad1
GIT binary patch
literal 1385
zcmV-v1(y1WP)EX>4Tx04R}tkv&MmKpe$iQ;VV%5i5!~WT;LSL`5963Pq?8YK2xEOfLO`CJjl7
zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2ziIPS;0dyl(!fKV+m&1xG5G~G56
zv8b3zuZr!j=)wSc5kSApEMrcR;%GU(?&0I>U4&<~KKJM7Rx=g@d?N8IGfbO!gLrz=
zHaPDShge=#iO-40Ou8WPBi9v=-#F)77IteDHam6A8p|ua{Usy6mk{7
z$gzMDG{~+W{11M2Yh@=Vyrf_h2)sDX#|Y5A3)Cu(^L^|%wG+Vq3|#3Af2j)0e3D*i
zXyGHEXB)VeSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00TiuL_t(o!|j$!Y!g=)h0mRFobfZBIJU>*i87wV*l`1C
z1SBA$s=Trcs=9zm1ql!m>n{(A9}8gn5VN7vG9Pk6i1O&_m$RlxJ2y0eh4D0*e44p5^>PtG(S5mE
z)IWLz7l4VHvR5;N_iYZ4aFQ08gv)W?iSgHGe23MlA&p
z;?nnP=QG3CNl;|U4v!0Zz5YmuOAjMmKByJ#F#rS=(QtZQ*DVDg1UEvPB8FcMQ@h81
zH#c4NbZ>Q_Rxy{gn(<6mRU`+5IRNPBX=C!U`D>OeqBYIEoc#v?t89zXo*m*YZB@tE
zNCnRDdI#J8Tq&&@
z={H3bmyKex+g{^b6uuDum8A*1tK#g!DFCP5y$dKJ-TzID`Qz$nGcg%7b9Mx}L~UU#
zV_&y6^vl9#xlg82QlgqpP+qEyL_hP}o;^r|b8+xT_@+=yq?Q8+ap`EFQ@pojuze)a
zA3-D*gtwK$$h{(xgKfXB7nf
zG0T5Mn|F89#DIjvfP{J-n0c{?r9}?B;D)@ZMLBZz%PRn|^XoneAZ1wsemP72^ofI@Z=EJLuW>ch$H;rkxHV=6ygW*aQ#Sz?
rU>SmJDns7)_6>D+JiakH1psdWZ8JYKr>bRW00000NkvXXu0mjf$8%`Q
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/seed.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c2e747b7c86091e0b1bb21ea2b60abe2a4dc997
GIT binary patch
literal 835
zcmV-J1HAl+P)EX>4Tx04R}tkv&MmP!xqvQ>7vm5j%)DWT;LSL`58J6^c+H)C#RSn7s54nlvOS
zE{=k0!NH%!s)LKOt`4q(Aov5~=H{g6A|>9J6k5c1;UypE-E(;FK0s(xm}YfN0Ge)_
z>10C8=2pefE5Zn1fWCsvEF&&SDfrgcJ@r!E#dwx~-=Ec|<}C&UMB+JSm^SeS@yw=e
zaNZ}5u#&72pA(OpbU@-qt}7nDaW1+n@XUyrNzW5Uh{a+DD;>;ArbawX991=)@`bF&
zD(5ZETBXKX=j1mG=k=9kuG1Pp5{p=Z1Q7~qD5C-!G5YJISV+@;!pA@C`XzEHeSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00A3GL_t(o!(%*f-~huw0w#t52BQubb-<_tScp{^o*w=G
z_xIlntemV2gy@wsmoic{1cKti{tL?rGpOl^Fa)F<;-!UUg&Bh4!v0g$0c>2X418>V
z81!9~7%uL)hnMDK`@_J-#Y($0pzorDm!@kX+%WURz~q9}6HYNOFfcIiiHe}`X_^a=
zfu^}M+|tz(PBCbjOVcj|R!=y^pkpb`AS@@uz`(%3AS@@upkpabb|{b?1x`UK3=9km
z3{F8R6h#5kkc)!Q0yBo|C!eB3!S$0*8A1!p=$8m#mLW$4-7BNj6HYON7MM{K|0Fx$
z;+}gLp@1Cp$nwMjMq*pV5gE}$S1>DP5MLWIjyB6j9Wd&EQ3njP0{|<3YtY0a=0N}e
N002ovPDHLkV1oTFX8QmD
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/nettle.rsi/stage-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8306090d6dcce6b0679ed9ee737065a0ba586b1
GIT binary patch
literal 792
zcmV+z1LypSP)EX>4Tx04R}tkv&MmKpe$iQ;VV%5i5!~WT;LSL`5963Pq?8YK2xEOfLO`CJjl7
zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2ziIPS;0dyl(!fKV+m&1xG5G~G56
zv8b3zuZr!j=)wSc5kSApEMrcR;%GU(?&0I>U4&<~KKJM7Rx=g@d?N8IGfbO!gLrz=
zHaPDShge=#iO-40Ou8WPBi9v=-#F)77IteDHam6A8p|ua{Usy6mk{7
z$gzMDG{~+W{11M2Yh@=Vyrf_h2)sDX#|Y5A3)Cu(^L^|%wG+Vq3|#3Af2j)0e3D*i
zXyGHEXB)VeSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{008hwL_t(o!(%*f-~huw0w#t52BQubb-<_tMjbHffKdmG
zI$+cRBsrjWZOMOfELm{4^*>b{P#oODIQ3}Ze|&~xbL93V=gA8JY=-@K!HmNH%Jc@#
zo_e(Ke{paRBf1$YXRcu+%K?urzQYiEefJv!0|Ns?MOW5;WC!)GE%~2q-H&2XMOW5;
zY-SMcfQe1>81w6r{v%uX;2y-s_wT+zaS)8gW(Gbx7>Q|?XO_hLfA{$Z0|NsCgAgwV
z1B}hUz`(%9$;!aP!p!jQ^A83IaXyB3pT0Bv`u>|iLY$AFX_9z^DU;wF3an
WBVZtowI8zp0000EX>4Tx04R}tkv&MmKpe$iQ$^8=hy_JDWT;LS{6ZYH3Pq?8YK2xEOfLO`CJjl7
zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2ziIPS;0dyl(!fKV+m&1xG1G~G56
zv8b3zuZkV7=*9s05W=|3EMrcR;%GU(?&0I>U4&<~KKJM7Q8N|;d?N8IGfbO!gLrz=
zHaPDS2U%WLiO-2gO}ZfQBi9v=-#F)77Ib3)Cu(^L^|%wG+Vq3|#3Af2j)0e3D*i
zXyGHEcN@64ZfMFLaJd5vJ{htpyON)#kj(<`XY@^Jp#K)=TJw6V@8k3VNK#kv8{ps&
z7|BugdW&~=Huv`LnReSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00F#7L_t(o!|j)`YQj(yhW}ezjba@HF^evCcP@Dh3tgOC
ziaLlGB$Log5+dTD-JD80`3^2p`U36J)OM;=v893ri`-5(L=rS
zBxE=o;*dJRf#n1E06u^Z-~;#ot^n?yujxSnKAsl;251Y=9aXnBtmRbF8i+fSe9gc2
z2C@Yx3vI`QX0-+)EemY|0F_38x^c`?3D~A)7g!7cIDTURs^!!zASXw50&x5Wl}3Sf
z63twh{f4`IvYoKRHcvi@7^6K3vH6l#w~8>lK`6a9@PPOG$$y@=n1|sdq
zeUcJF#=|V(+v^NPF;BC3|e!AKD6
zg|P1j8qY9tSXA=-`tv%zsu`uYSQNV@6MyOXeDYmBEg_DCX&ndQ04n
znxvFyA`=0d4p%)ODJ8ngy0dfM)7x&WeHs(w$pI&IM^#JH?IYsEX>4Tx04R}tkv&MmKpe$iQ;VV%5i5!~WT;LSL`5963Pq?8YK2xEOfLO`CJjl7
zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2ziIPS;0dyl(!fKV+m&1xG5G~G56
zv8b3zuZr!j=)wSc5kSApEMrcR;%GU(?&0I>U4&<~KKJM7Rx=g@d?N8IGfbO!gLrz=
zHaPDShge=#iO-40Ou8WPBi9v=-#F)77IteDHam6A8p|ua{Usy6mk{7
z$gzMDG{~+W{11M2Yh@=Vyrf_h2)sDX#|Y5A3)Cu(^L^|%wG+Vq3|#3Af2j)0e3D*i
zXyGHEXB)VeSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00Ra|L_t(o!|hiwOcPNU{$7ivZOTELK+gfhU`%k34P(0F
z12|Gh_cc6QK9^PtCe1;7@-=H4>x8GuYa;W~LHpP&~3YY8Bi
zE)ll@x>@_*G%!E8L^k)9sTFf)vEy+HDoO(FrW|%`IK}Wd)iE3yx-i9OmC17%b-Yv!
z%q`4Pa~aMGB1!_CpIjp5I97gJ09rCO%5;>$$>tVjsnr@b%0QL9;Io`N5%O7%h9g4=
zg#2(~#VXOkuF{ccZDoU0D-EozY!Gu-7~^@2KYVz3h~bG~TY|SQzF>N0+;%5+i9|`D
zW^M6VjvnkP*jnEvmKw;VOXT{UfsO>DIp4`ARb`T|FtE5;?QM>vZeZ_K$CS$9_=s(z1Tz5mCRd6=SU~DRaOg^D^
z#bUfbiscloRvOTJe3qlP9}Hq{VU}*KZxc4kpjb{(jb=W}(VG(^P-U